OmniAICreator/Qiita-1.07M huggingface dataset:
FactoryGirlでユニーク制約のあるデータを扱う

FactoryGirlでユニーク制約のあるデータを扱った場合、データのクリアなどの挙動の変化によりテストが成功したり失敗したりすることがある。

Userモデルが validate_uniqueness_of :email だったり
データベースにemailのunique制約がある時など

initialize_withを使う

```ruby:spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    sequence(:email) {|n| "person#{n}@example.com" }

    initialize_with { User.find_or_create_by_email(email)}
  end
end
```

[参考:Stackoverflow(Using factory_girl in Rails with associations that have unique constraints)](http://stackoverflow.com/questions/2015473/using-factory-girl-in-rails-with-associations-that-have-unique-constraints-gett)
FactoryGirlでhas_and_belongs_to_manyのfactoryを作成する

FactoryGirlのhas_and_belongs_to_manyのデータ作成は、いろいろ調べたりいろいろな書き方を試したが意外とすんなりいかなかった。
比較的読みやすくうまくいった書き方。

```ruby:spec/factories/foo.rb
FactoryGirl.define do
  factory :foo do

    after(:create) do |foo|
      2.times { foo.bars << FactoryGirl.create(:bar) }
    end
  end
end
```
Stuart Herbertさんの紹介しているPHP用Sublime Text 2プラグイン

[Stuart Herbert On PHP - >> Setting Up Sublime Text 2 For PHP Development](http://blog.stuartherbert.com/php/2012/02/28/setting-up-sublime-text-2-for-php-development/)で紹介されているPHP用Sublime Text 2プラグインをインストールしてみた際のメモ。
## Sublime Package Control
パッケージ管理。以降のパッケージをインストールするのに必要なので、とりあえず入れる。

* [インストールガイド](http://wbond.net/sublime_packages/package_control/installation)
* [Package一覧](http://wbond.net/sublime_packages/community)

##Theme - Soda
パッケージのインストールは、'Preferences' -> 'Package Control' -> 'Install Packages'で利用可能なものが表示されるのでクリックするだけ。

Sodaはテーマ(カラースキーマとは違い、ファイルのタブとかの見た目まで変わる)なので特に入れる必要はない。

導入する場合は、'Preferences' -> 'Settings - User'に以下も必要。

```
"theme": "Soda Dark.sublime-theme"
```

##Phix
カラースキーマ。パッケージでインストール後、有効にするために、'Preferences' -> 'Settings - User'に以下を追加。

```
"color_scheme": "Packages/Phix Color Scheme/Phix Dark.tmTheme"
```

##Additional PHP Snippets
PHP用スニペット集。Package Controlでインストールするだけ。

##SublimeLinter
ファイルをセーブしたタイミングで、使ってシンタックスエラーを表示する。PHPの場合はphp -lを使うので、別途必要。

Windowsの場合は、パッケージをインストールした後、'Preferences' -> 'Package Settings' -> 'SublimeLinter' -> 'Settings - User'に以下の例のような形で形式でphp.exeの場所を記述する。

```
{
   "sublimelinter_executable_map": { "php": "C:\\php\\php.exe" }
}
```

##Goto Documentation
関数等にカーソルを当てて、ショートカットキーでphp.netの該当ページを表示できる。パッケージでインストール後、使用するキーを'Preferences' -> 'Key Bindings - User'に設定する。以下はF1の場合。

```
{ "keys": ["f1"], "command": "goto_documentation" }
```

##TrailingSpaces
行末の余分なスペースをハイライトしてくれる。パッケージでインストールするだけ。Sublime Text 2にもファイル保存時に余分なスペースを削除する設定があるので要らないかな？

##その他
PHPUnit, Alignment Plugin, CTagsは今回は試さず。

CTagsは使ってみたいが、環境的にどうなのか。先に環境の方をどうにかすべきだが……。
「A Tour of Go」でGo言語を学ぶ(~#28)

今回は構造体について。今回はコードが2つ。感想は最後にまとめて書く。
＃24は型の紹介だったので飛ばす。

```go:struct.go
package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
	v := Vertex{1, 2}
	v.X = 4
	fmt.Println(v.X)
}
```

結果
* * *

```
4
```

次、ポインタとか。

```go:struct2.go
package main

import "fmt"

type Vertex struct {
	X, Y int
}

var (
	p = Vertex{1, 2}  // has type Vertex
	q = &Vertex{1, 2} // has type *Vertex
	r = Vertex{X: 1}  // Y:0 is implicit
	s = Vertex{}      // X:0 and Y:0
)

func main() {
	fmt.Println(p, q, r, s)
}
```

結果
* * *

```
{1 2} &{1 2} {1 0} {0 0}
```

感想
* * *
まず1つ目のやつ。
C言語とかで見たことのあるような感じ。typeキーワードはC言語のtypedefと多分同じ。

2つ目。
Goでもポインタは使えるけど、俺は使うかわからない。実際に使うと、あとで見返した時に忘れそう。var (~~)はまとめて初期化出来るようにするためかな。
MonadMemo　で フィボナッチ数列

λカ娘（算）の田中さんの記事を読んで，練習のために書いてみました．

```hs:fib.hs
{-# LANGUAGE FlexibleContexts #-}
import Control.Applicative
import Control.Monad.Memo

-- cabal install monad-memo

fib :: (MonadMemo Int Integer m, Applicative m) => Int -> m Integer
fib 0 = return 1
fib 1 = return 1
fib n = (+) <$> memo fib (n-1) <*> memo fib (n-2)
```
GHCi での使用例

```console:
Prelude> :l fib.hs
[1 of 1] Compiling Main             ( fib.hs, interpreted )
Ok, modules loaded: Main.

*Main> startEvalMemo . fib $ 0
1
*Main> startEvalMemo . fib $ 1
1
*Main> startEvalMemo . fib $ 10
89
*Main> startEvalMemo . fib $ 100
573147844013817084101
*Main> startEvalMemo . fib $ 1000
70330367711422815821835254877183549770181269836358732742604905087154537118196933
57974224949456261173348775044924176599108818636326545022364710601205337412127386
7339111198139373125598767690091902245245323403501
*Main> startEvalMemo . fib $ 10000
54438373113565281338734260993750380135389184554695967026247715841208582865622349
01708305154793896054117382267597802631738435958475111624143917470264295916992558
63341179060630480897935314761084662590727593678991506779600883065979666419658249
37721800381441158841042480997984696487375337180028163763317781927941101369262750
97950980071359671802381471066991264421477525447858767456896380800296226513311135
99297627266794414001015758000435107774659358053625024617079180592264146790056907
52321895868142367849593880756423483754386342639635970733756260098962462668746112
04173981940487506244370986865431562684718619562014612664223271181504036701882520
53148458758171935335298278378003519025292395178366894676619179538847124410284639
35449484614450778762529520961887597272889220768537396475869543159172434537193611
26374392633731300589616724805173798630636811500308839674958710261952463135244749
95052041983051871683216232838597946272459197714546282183996957892237989121994317
75469705216131081096559950638297261253848242007897109054754028438149611930465061
86617012298328896435273375079278606944476185352514442107792804597990456129812942
38091560550330323389196091622366987599227829231918966880177185755555209946533201
28446502371153715141749290913104897203455577507196645425232862022019506091483585
22388271101670843305116994211577515125551025165593188816404834412955703882547752
11115773957801158683970726025656148249564605387002803313118614853998053970315557
27529693399586079850381581446276433858828529535803424850845426446471681531001533
18047956743639681565332615250957112748041192819602214884914828438912417852017450
73055389287178579235094177433833315068982393544219888054293324403711948672155435
76548565499134519271098919802665184564927827827212957649240235507595558205647569
36539487331765900020637312657064350970948264971003873351747771340331902810557566
79317894700241188030946040343629534719974613922747915497303564126330742308240519
99996101549784667340458326852960388301120765629245998136251652347093963049734046
44510636530416363082366924225776146828846179184322479343440607991788336067684671
1185597501
*Main>

```

すべて一瞬で計算できました．
IE対応のためのおすすめテクニック

マークアップでもJavaScript書くときも、
スタイリッシュにIE用の処理を切り替える方法を紹介します。

まずHTML側のbodyタグを以下のようにします。

```
<!--[if IE 6]><body class="ie6 lteie7 lteie8 ie"><![endif]-->
<!--[if IE 7]><body class="ie7 lteie7 lteie8 ie"><![endif]-->
<!--[if IE 8]><body class="ie8 lteie8 ie"><![endif]-->
<!--[if IE 9]><body class="ie9 ie"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><body><!--<![endif]-->
```

IE用分岐タグでbodyタグをIEバージョン別につくります。
この方法はhtmlタグで行っているものもよく見ますが、個人的にはbodyタグが好きです。

こうすることで、CSS的には

```
/* IE全部 */
body.ie #element {
  color: white;
}

/* IE8以下 */
body.lteie8 #element {
  color: yellow;
}

/* IE6だけ */
body.ie6 #element {
  color: red;
}
```

といったような感じでスタイルを分けられるわけです。

JSの場合は、

```
if($("body").hasClass("lteie8")) {

  // IE8以下の処理

} else {

  // IE8以下以外の処理

}
```
（jQuery使用想定）

といった感じで処理を分けられます！
Playframeworkをhomebrew経由でアップデートする方法と、リンクに失敗した場合の対処法


```
brew update
brew play install

中略*

play run

       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 
             
play! 2.0.2, http://www.playframework.org
```

あれ？もう一度

```
brew play install
Error: play-2.0.4 already installed, it's just not linked
```

linkってなんぞ？とりあえずこんな感じか？

```
brew link play
Linking /usr/local/Cellar/play/2.0.4... Warning: Could not link play. Unlinking...

Error: Could not symlink file: /usr/local/Cellar/play/2.0.4/bin/play
Target /usr/local/bin/play already exists. You may need to delete it.
To force the link and delete this file, do:
  brew link -f formula_name

To list all files that would be deleted:
  brew link -n formula_name
```

違った！-fで前のバージョンを消す必要がある？

```
brew link -f play
Linking /usr/local/Cellar/play/2.0.4... 1 symlinks created
```

よし!

```
play -help
Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-sbt#boot-app
	confs: [default]
	1 artifacts copied, 0 already retrieved (838kB/39ms)
Getting Scala 2.9.1 (for console)...
:: retrieving :: org.scala-sbt#boot-scala
	confs: [default]
	4 artifacts copied, 0 already retrieved (19939kB/377ms)
Getting play console_2.9.1 2.0.4 ...
:: retrieving :: org.scala-sbt#boot-app
	confs: [default]
	5 artifacts copied, 0 already retrieved (3667kB/132ms)
       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 
             
play! 2.0.4, http://www.playframework.org
```

updateできた！

しかし、このままだとプロジェクトを起動すると下記のようなメッセージがでます。

>
This project uses Play 2.0.2!
Update the Play sbt-plugin version to 2.0.4 (usually in project/plugins.sbt)
>

どうやら、project下にあるplugins.sbtを編集する必要があるみたいです。

```Scala
// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.0.4")
```

```
[info] Loading project definition from /Users/...
[info] Set current project to xxx (in build file:/Users/...)
       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 
             
play! 2.0.4, http://www.playframework.org

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[xxx] $ 
```
これで最新版が使えるようになりました！

*あとで調べたら"Error: The linking step did not complete successfully"みたいなことが書かれているらしいけどログが残ってない...
第四回オフラインリアルタイムどう書くの解答(Ruby)

第四回オフラインリアルタイムどう書くの解答(Ruby)。
問題は
http://nabetani.sakura.ne.jp/hena/ord4tetroid/

```ruby
PAT = [
['L',[[0,0],[1,0],[2,0],[0,1]]],
['I',[[0,0],[1,0],[2,0],[3,0]]],
['T',[[0,0],[1,0],[2,0],[1,1]]],
['O',[[0,0],[1,0],[0,1],[1,1]]],
['S',[[0,0],[0,1],[1,1],[1,2]]],
]

def adjust(pat)
  ox = oy = 10
  pat.each do |x,y|
    ox = x if x < ox
    oy = y if y < oy
  end
  pat.map{|x,y| [x - ox, y - oy]}.sort
end

def solve(q)
  make_map[adjust(q.split(',').map{|e| e.split('').map(&:to_i)})]
end

def map_ext(pat)
  yield adjust(pat)
  3.times do
    pat = pat.map{|x,y| [y,-x]}
    yield adjust(pat)
  end
  pat = pat.map{|x,y| [x,-y]}
  yield adjust(pat)
  3.times do
    pat = pat.map{|x,y| [y,-x]}
    yield adjust(pat)
  end
end

def make_map
  map = Hash.new('-')
  PAT.each do |sym, pat|
    map_ext(pat) do |pp|
      map[pp.sort] = sym
    end
  end
  map
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print ans
  puts ans == a ? ' o' : ' x'
end
__END__
#1	55,55,55,55	-
#2	07,17,06,05	L
#3	21,41,31,40	L
#4	62,74,73,72	L
#5	84,94,74,75	L
#6	48,49,57,47	L
#7	69,89,79,68	L
#8	90,82,91,92	L
#9	13,23,03,24	L
#10	24,22,25,23	I
#11	51,41,21,31	I
#12	64,63,62,65	I
#13	49,69,59,79	I
#14	12,10,21,11	T
#15	89,99,79,88	T
#16	32,41,43,42	T
#17	27,16,36,26	T
#18	68,57,58,67	O
#19	72,62,61,71	O
#20	25,24,15,14	O
#21	43,54,53,42	S
#22	95,86,76,85	S
#23	72,73,84,83	S
#24	42,33,32,23	S
#25	66,57,67,58	S
#26	63,73,52,62	S
#27	76,68,77,67	S
#28	12,11,22,01	S
#29	05,26,06,25	-
#30	03,11,13,01	-
#31	11,20,00,21	-
#32	84,95,94,86	-
#33	36,56,45,35	-
#34	41,33,32,43	-
#35	75,94,84,95	-
#36	27,39,28,37	-
#37	45,34,54,35	-
#38	24,36,35,26	-
#39	27,27,27,27	-
#40	55,44,44,45	-
#41	70,73,71,71	-
#42	67,37,47,47	-
#43	43,45,41,42	-
#44	87,57,97,67	-
#45	49,45,46,48	-
#46	63,63,52,72	-
#47	84,86,84,95	-
#48	61,60,62,73	-
#49	59,79,69,48	-
#50	55,57,77,75	-
```
第四回オフラインリアルタイムどう書くの解答例(C++で)

第四回オフラインリアルタイムどう書くの解答例。
問題は
http://nabetani.sakura.ne.jp/hena/ord4tetroid/

```C++
#include <iostream>
#include <string>
#include <set>
#include <utility>
#include <algorithm>
using namespace std;

struct pt_t{ int x, y; };

bool operator<( pt_t const & a, pt_t const & b)
{
    return make_pair( a.x, a.y ) < make_pair( b.x, b.y );
}
typedef set<pt_t> pts_t;

pts_t points_from_string( std::string const & input )
{
    pts_t r;
    for( int i=0 ; i<4 ; ++i ){
        pt_t pt = { input[i*3], input[i*3+1] };
        r.insert( pt );
    }
    return r;
}
int count( pts_t const & pts, int pt_t::*m )
{
    std::set<int> c;
    for( pts_t::const_iterator it = pts.begin() ; it != pts.end() ; ++it ){
        c.insert( (*it).*m );
    }
    return c.size();
}
int diff( pts_t const & pts, int pt_t::*m )
{
    std::set<int> c;
    for( pts_t::const_iterator it = pts.begin() ; it != pts.end() ; ++it ){
        c.insert( (*it).*m );
    }
    return *c.rbegin() - *c.begin();
}
char solve_lts( pts_t const & pts )
{
    int xmin=INT_MAX, ymin=INT_MAX;
    for( pts_t::const_iterator it = pts.begin() ; it != pts.end() ; ++it ){
        xmin = it->x < xmin ? it->x : xmin;
        ymin = it->y < ymin ? it->y : ymin;
    }
    int r=0;
    for( int b=0 ; b<6 ; ++b ){
        pt_t pt={ b/3+xmin, b%3+ymin };
        if ( pts.find( pt ) != pts.end() ){
            r |= (1<<b);
        }
    }
    switch( r ){
    case 0x3c:
    case 0xf:
    case 0x39:
    case 0x27:
        return 'L';
    case 0x3a:
    case 0x17:
        return 'T';
    case 0x1e:
    case 0x33:
        return 'S';
    }
    return '-';
}

char solve( std::string const & input )
{
    pts_t points = points_from_string( input );
    if ( points.size() != 4 ){
        return '-';
    }
    int xcount = count( points, &pt_t::x );
    int ycount = count( points, &pt_t::y );
    int dx = diff( points, &pt_t::x );
    int dy = diff( points, &pt_t::y );
    if ( xcount==2 && ycount==2 ){
        if ( dx==1 && dy==1 ){
            return 'O';
        }
    }
    if ( xcount==4 && ycount==1 || xcount==1 && ycount==4 ){
        if ( dx==3 && dy==0 || dx==0 && dy==3 ){
            return 'I';
        }
    }
    if ( dx < dy ){
        return solve_lts( points );
    } else {
        pts_t pts_xy;
        for( pts_t::const_iterator it = points.begin() ; it != points.end() ; ++it ){
            pt_t pt = { it->y, it->x };
            pts_xy.insert( pt );
        }
        return solve_lts( pts_xy );
    }
}

void test( std::string const & input, char expected )
{
    char actual = solve( input );
    if ( actual == expected ){
        cout << input << " -> " << actual << "\n";
    } else {
        cout << input << " -> " << actual << " / expected : " << expected << "\n";

    }
}
int main()
{
  /*#1*/ test("55,55,55,55", '-');
// 中略
  /*#50*/ test("55,57,77,75", '-');
}
```

当日の制限時間内で書いたもの。
一般化をあまりせずに個別対応で行く方向で、と思っていたものの、時間切れになりそうになったので最後はちょっとビット演算で一般化、という流れ。

boost・C++11・STL のすべてを封印して、と思ったけど辛すぎるので STL だけは使ってしまった。

solve 関数が長く、醜悪な感じがする。
mcompleteとhelmがバッティングして使いづらいことこの上なかったのでmcomplete消した

タイトル通り。
もうちょっと経緯を書くと

    M-x customize-group

してgroupを選ぶ時、helmとmcompleteがどっちも動いて、helmの候補が表示されるのにC-n,pするとmcompleteが反応してhelmの候補を選べなかったので、mcompleteを消した。

mcompleteなんかいらんかったんや！

mcompleteに知らない人用 → http://www.bookshelf.jp/soft/meadow_27.html#SEC339
Install Cucumber on Mac


### Problem
Fail to install Cucumber

```bash
% sudo gem install cucumber
Building native extensions.  This could take a while...
ERROR:  Error installing cucumber:
	ERROR: Failed to build gem native extension.

        /Users/XXXX/.rbenv/versions/1.9.3-p194/bin/ruby extconf.rb
checking for main() in -lc... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
```

### Solution
Install gcc
1. Download Xcode from App Store
2. Xcode -> Preferences -> Downloads -> Command Line Tools
ビューの拡大と回転のジェスチャを同時に可能にする


拡大はUIPinchGestureRecognizer、回転はUIRotationGestureRecognizerを使います。

ポイントは、ビューにUIGestureRecognizerDelegateを実装するようにして、shouldRecognizeSimultaneouslyWithGestureRecognizerで拡大（ピンチ）と回転の同時処理を受け付けるようにする点です。


```Objective-C:ビュー宣言
@interface HogeView <UIGestureRecognizerDelegate> {
	CGAffineTransform _currentTransform;
	float _scale;
	float _angle;
	BOOL _isMoving;
}
@end
```

```Objective-C:ジェスチャの同時処理を許可
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
	return YES;
}
```

ジェスチャ登録時にはtargetとは別に、delegateを設定する必要があります。

```Objective-C:初期化
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
		// 回転ジェスチャをビューに登録
		UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGesture:)];
		rotation.delegate = self;
		[self addGestureRecognizer:rotation];
		
		// ピンチジェスチャをビューに登録
		UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGesture:)];
		pinch.delegate = self;
		[self addGestureRecognizer:pinch];
		
		_isMoving = NO;
		_scale = 1.0f;
		_angle = 0.0f;
    }
    return self;
}
```

回転ジェスチャと拡大ジェスチャのハンドラはほぼ同じです。
ジェスチャ実行中の状態（回転角度＋拡大率）をフィールドで保持するようにしておき、どちらのジェスチャハンドラでも回転＋拡大の両方のアフィン変換を適用します。

```Objective-C:回転ジェスチャ
- (void)rotationGesture:(UIRotationGestureRecognizer*)gesture {
	// ジェスチャ開始時
	if (!_isMoving && gesture.state == UIGestureRecognizerStateBegan) {
		_isMoving = YES;
		_currentTransform = self.transform;
	}
	// ジェスチャ終了時
	else if (_isMoving && gesture.state == UIGestureRecognizerStateEnded) {
		_isMoving = NO;
		_scale = 1.0f;
		_angle = 0.0f;
	}

	// 回転角度取得
	_angle = gesture.rotation;
	
	// アフィン変換を適用
	CGAffineTransform transform = CGAffineTransformConcat(CGAffineTransformConcat(_currentTransform, CGAffineTransformMakeRotation(_angle)), CGAffineTransformMakeScale(_scale, _scale));
	gesture.view.transform = transform;
}
```

```Objective-C:拡大ジェスチャ
- (void)pinchGesture: (UIPinchGestureRecognizer *)gesture {
	// ジェスチャ開始時
	if (!_isMoving && gesture.state == UIGestureRecognizerStateBegan) {
		_isMoving = YES;
		_currentTransform = self.transform;
	}
	// ジェスチャ終了時
	else if (_isMoving && gesture.state == UIGestureRecognizerStateEnded) {
		_isMoving = NO;
		_scale = 1.0f;
		_angle = 0.0f;
	}
	
	// 拡大率取得
	_scale = gesture.scale;
	
	// アフィン変換を適用
	CGAffineTransform transform = CGAffineTransformConcat(CGAffineTransformConcat(_currentTransform, CGAffineTransformMakeRotation(_angle)), CGAffineTransformMakeScale(_scale, _scale));
	gesture.view.transform = transform;
}
```
縁の下の力持ち -- クエスチョン演算子

投稿テストをしてみる．．．このサイトのフォーマット規則が分からん

``` 
 ##### ?のヘルプ
> ?`?` 
```

> Question                 package:utils                 R Documentation
>   
>  Documentation Shortcuts
>  
>  Description:
>  
> These functions provide access to documentation.  Documentation on
>     a topic with name ‘name’ (typically, an R object or a data set)
>      can be displayed by either ‘help("name")’ or ‘?name’...

```
 ##### たとえば パッケージそのもののヘルプを見る
> library(lattice)
> package?lattice # `?` (package, lattice)
```

 > A_01_Lattice              package:lattice              R Documentation
 > 
 > Lattice Graphics
 >
 > Description:
 > 
 >    The ‘lattice’ add-on package is an implementation of Trellis
 >    graphics for R.  It is a powerful and elegant high-level data
 >    visualization system with an emphasis on multivariate data.  It is
 >    designed to meet most typical graphics needs with minimal tuning,
 >    but can also be easily extended to handle most nonstandard
 >    requirements.
 >
 > Details:
 >
 > Trellis Graphics, originally developed for S and S-PLUS at  ...

```
 ##### パッケージの提供する関数などの情報は
 > library (help = lattice)
```

>  パッケージ '‘lattice’' の情報 
> 
> 記述： 
> 
> Package:       lattice
> Version:       0.20-6
> Date:          2012/03/10
> Priority:      recommended
> Title:         Lattice Graphics
> ...
> 
>  索引： 
> 
> Lattice                 Lattice Graphics
> Rows                    Extract rows from a list
> axis.default            Default axis annotation utilities
> ... 

という訳で，いつもお世話になっております ＞ ? 
（記事，なげぇよ．．．）
指定範囲内にタブ移動の範囲を制限するjQuery拡張

##指定範囲内にタブ移動の範囲を制限するjQuery拡張
#カスタムダイアログの範囲にフォーカスを制御したいときとかに
よくあるダイアログ範囲外にタブフォーカスが回りこんじゃう奴の防止。
jQuery.ui.dialogの手法がいいなーって思ったのでそこだけ使えるようにしてみた。
セレクタの範囲を広げれば自由に制御可能。
でも最初と最後をつないでいるだけなので、範囲内での遷移順位はDOM生成順番に依存するはず。

```js
(function($) {
	$.fn.tabChain = function(option) {
		option = $.extend({},{onReadyFocus:false},option);
		
		var chains = [];
		
		var init = function(){
			var first = chains[0];
			var last = chains[chains.length-1];
			
			for(el in chains){
				$(chains[el]).keydown(function(event){
					if (event.keyCode !== 9) {
						return;
					}
					if (event.target === last && !event.shiftKey) {
						first.focus(1);
						return false;
					}
					else if (event.target === first && event.shiftKey) {
						last.focus(1);
						return false;
					}
				})
			}
			if(option.onReadyFocus == true){
				first.focus();
			}
			
		}
    	
		this.each(function(){
			chains.push(this);
		})
		
		init();
    };
})(jQuery);

```

#使い方
範囲をjQueryセレクタで指定してください。
異なる要素や子要素纏めてとか1発でとってこられるjQueryセレクタはほんと優秀ですね！(´∀｀*)


```html
(function($){
    $('input:text').tabChain({onReadyFocus:true});
})(jQuery);
```


##オプションについて
* onReadyFocus　trueを指定するとこの拡張が有効になったタイミングで、指定した範囲内の先頭に当たる項目に自動フォーカスします。
Gebでページ操作を定義する

Gebそのものについてはいろいろ知っている前提。

Pageオブジェクトのcontentを利用すると、ページ内のinput要素とか、エラーメッセージ表示のためのspanへのインタフェースを自分で定義することができる。

```
class ExamplePage extends Page {
  static content = {
    userId { $("form").find("input", name: "userId") }
    userIdErr { $("span#userIdErr").text() }
  }
}
```

これのおかげで、仮にinput要素のname属性が変わったり、idやclassの指定が変わっても、基本的には対応するcontentの定義を修正するだけでよくなる。
テストコードへの影響を抑えることができるし、"Page内のcontent"というマッピングが直感的で非常にわかりやすい。

で、ここからは動かしてみてそうだろうと当たりをつけた、という内容なので、正確でない情報もあるかもしれないという前置きをつけた上でのお話。

このcontentは、単にページ内の要素を定義するだけの代物ではなく、ページ内での操作も定義できる。例えば、"検索画面でxxxというクエリで検索する"といった操作を、

```
class SearchPage extends Page {
  static content = {
    searchUser { key -> 
      $("#searchForm").find("input", name: "keyword").value(key)
      $("#searchButton").click()
    }
  }
}
```

という感じで書くことができる。contentはブロック呼び出しなので、一連の処理を書いても問題ない。ただ、ブロック呼び出しの結果がnullだとエラーになるっぽいので、最後の行の結果がnullの時は注意が必要。
「A Tour of Go」でGo言語を学ぶ(~#23)

今回はif文です。
最近はコピペが続いてる...。

```go:if.go
package main

import (
	"fmt"
	"math"
)

func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	} else {
		fmt.Printf("%g >= %g\n", v, lim)
	}
	// can't use v here, though
	return lim
}

func main() {
	fmt.Println(
		pow(3, 2, 10),
		pow(3, 3, 20),
	)
}
```

結果
* * *

```
27 >= 20
9 20
```

感想
* * *
if文も括弧記号がないこと以外は一緒。
見たことない機能として条件の前にちょっとした文が書ける機能があること。
vはifの中でしか使えないようになってるから、バグが減るようになってるのかな?
git reset -p で git add -p をリセットする


<blockquote class="twitter-tweet"><p>git 助けて 間違ってaddしてしまったのを取り消して前のインデックスの状態を手に入れたい</p>&mdash; トデス子 (@todesking) <a href="https://twitter.com/todesking/status/254250836602019840" data-datetime="2012-10-05T16:04:57+00:00">October 5, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p>私がやりたいのはですね、 git add a; git add b; した状態からgit add a;した状態に戻したい</p>&mdash; トデス子 (@todesking) <a href="https://twitter.com/todesking/status/254251734489251840" data-datetime="2012-10-05T16:08:31+00:00">October 5, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p>例えが悪かった、git add a; edit a; git add a;した状態から二度目のgit add aの影響を巻き戻したい</p>&mdash; トデス子 (@todesking) <a href="https://twitter.com/todesking/status/254252181656567808" data-datetime="2012-10-05T16:10:18+00:00">October 5, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

それ `git reset --patch` でできるよ。

       git reset (--patch | -p) [<commit>] [--] [<paths>...]
           Interactively select hunks in the difference between the index and <commit> (defaults to
           HEAD). The chosen hunks are applied in reverse to the index.

           This means that git reset -p is the opposite of git add -p, i.e. you can use it to
           selectively reset hunks. See the `Interactive Mode'' section of linkgit:git-add[1] to
           learn how to operate the `--patch mode.

----

`git add` しすぎた状態。下の方の差分はまだコミットしたくないのでインデックスから取り除きたい。

<img src="http://30d.jp/img/kyanny/public/a169917e-0f0b-11e2-bfe1-00262d0af68e_original.jpg" />

そこでおもむろに `git reset -p` とすると、 `git add -p` と同じ感じになるので同じ感じに操作するとインデックスから取り除ける。要するに `git add -p` の真逆のことができる。

<img src="http://30d.jp/img/kyanny/public/a1c9ef88-0f0b-11e2-9886-00262d09affa_original.jpg" />

便利ですね!!
PHP で対話シェル


ちょっとした操作を試したい時に便利な方法


```shell
$ php -a
Interactive shell

php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
```


via: http://php.net/manual/ja/features.commandline.interactive.php
git-svn のレポジトリからsvnを抜く

git-svn を使って svnを使ってたけど svnからgitへ移行してsvnがいらなくなった

というかGUIフロントエンドのSourceTreeが使えないgit-svnを実行してCPUとか使いまくるのでsvnを外すことにした

## 手順

### git-svnなレポジトリにgitのレポジトリを追加する

```sh
% git remote add -m master origin <git リモートレポジトリ> 
```

`-m master`はリモートのmasterブランチをHEADに設定するオプション
master ブランチが既にある場合、一度masterブランチを削除してから
git リモートレポジトリのmasterをcheckoutする

### ローカルのgit-svnブランチを削除

```sh
% git branch -l
% git log --all --graph --name-status
% git branch -D <branch name>
```

1. git branch でブランチ名を確認
1. ログを確認して消して問題なければ
1. ブランチの削除

### リモートのgit-svnブランチを削除
ローカルのブランチを削除してもgit-svnのリモートブランチが残る
ログとかにも出てくるので削除する

```.git/config
...
[svn-remote "svn"]
        url = <svnレポジトリurl>
        fetch = trunk:refs/remotes/trunk
        branches = branches/*:refs/remotes/*
        tags = tags/*:refs/remotes/tags/*
...
```

git-svnのsvnレポジトリの設定(↑)を削除

```sh
% git branch -r -d trunk
% for b in $(git branch -r|grep tags); do git branch -r -d $b; done 
```
svnのtrunkはremotes/trunkブランチになるので削除
svnのtagsはtagsのプレフィックスを付けたブランチになるのでそいつを削除
svnのbranchesは使ってなかったけど その場合も`git branch -r`で確認して削除

### ガベージコレクトしておく
git-svnのオブジェクトへの参照が消えたはずなので

```sh
% git gc
```

で不要領域を回収しておく

### git-svnのmetadataを削除

.git/svn にgit-svnのメタデータ(.git/svn/.metadata)が残っているので.git/svnごと削除

```sh
rm -rf .git/svn
```
Objective-Cでトグルボタンを作る

1. BOOL型のフラグを用意
2. フラグにtrueをセット
3. ボタンを押した時にフラグがtrueかfalseかチェック
4. -trueであれば何かしらの動作をしてフラグをfalseに
    -falseであれば何かしらの動作をしてフラグをtrueに

以上を簡単にまとめました。
http://nigohiroki.hatenablog.com/entry/2012/10/05/233906
Githubで空白を無視してdiffを見る


インデントを変えた時のDiffってめっちゃ見にくいですよね。インデントを変えただけなのか、実は内容も変わっているのかGithub上で判断したい！

そんな時はURLパラメーターに

```
?w=
```

をつければ、githubが空白を無視した上でdiffのある部分だけを表示してくれます。

例
https://github.com/sixthsense/sixthsense/pull/16/files

https://github.com/sixthsense/sixthsense/pull/16/files?w=
さくらインターネットの共有 SSL で Contact Form 7 などのテスト環境を構築する


あくまでも本番ではなく、テスト環境です。WordPress HTTPS と Contact Form 7 を使って、問い合わせフォームのところだけ HTTPS という感じです。

さくらのレンタルサーバで共有 SSL を使うと、なぜか WordPress の `is_ssl()` が `FALSE` を返します。PHP が動いてるサーバにはポート 80 でアクセスされるのが原因の模様。`$_SERVER` からは判断できないようでした。

これでは JS や CSS の URL も http:// がついてしまい、エラーの嵐。`is_ssl()` に依存しているプラグインのテストもできません。

とりあえずテストするため、テーマの functions.php でフォームを置く URL だけ `$_SERVER['HTTPS']` を on にすることにしました。

```functions.php
if (stripos($_SERVER['REQUEST_URI'], '/contact') === 0) {
  $_SERVER['HTTPS'] = 'on';
}
```

それでもまだ Contact Form 7 のローディング画像の URL に http:// がついていました。テンプレートの functions.php が読み込まれる前にプラグインのコードが plugins_url() の結果を変数に持ってしまってたためです。

これはしょうがないので、フィルターで http を https に書き換えることに。

```functions.php
if (stripos($_SERVER['REQUEST_URI'], '/contact') === 0) {
  $_SERVER['HTTPS'] = 'on';

  function make_https($url) {
    return preg_replace('/^http:/', 'https:', $url);
  }
  add_filter('wpcf7_ajax_loader', 'make_https');
}
```

これでなんとか SSL のエラーが消えました。

ただ、これだと本番環境にテーマのファイルをそのままコピーできないので、テーマに入れずにプラグインか何かにしておくとよいかもしれません。

```
<?php
/*
Plugin Name: SSL Test
Plugin URI: http://somewhere.el.se
Description: Test your WordPress site with shared SSL
Version: 1.0
Author: Shuhei Kagawa
*/

if (stripos($_SERVER['REQUEST_URI'], '/contact') === 0) {
  $_SERVER['HTTPS'] = 'on';

  function make_https($url) {
    return preg_replace('/^http:/', 'https:', $url);
  }
  add_filter('wpcf7_ajax_loader', 'make_https');
}

?>
```
StoryboardではNavigationControllerのツールバーの色が変更できない？

っぽいので直接コードで指定した。なんか方法あるんかな〜。

```objc
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.toolbar.tintColor
        = [UIColor colorWithRed:0 green:0 blue:0.50196081399917603 alpha:1];
    ...
}
```
UIScrollViewで画像のクリッピング

意外とこういうことをやりたい場合があるんじゃないだろうか。

しかもRetinaの場合ちょっと癖がある。

例えば、[UIImage imageWithCGImage:sourceImage.CGImage scale:[UIScreen mainScreen].scale orientation:sourceImage.imageOrientation];
のように画像を用意して、UIImageViewにセット、UIScrollViewにaddSubViewし、これをクリップする場合を考える。

実際のピクセル座標系のクリップする矩形はこう計算できる。
    CGRect cropRect =
    {
        scrollView.contentOffset.x * scale * [UIScreen mainScreen].scale,
        scrollView.contentOffset.y * scale * [UIScreen mainScreen].scale,
        scrollView.bounds.size.width * scale * [UIScreen mainScreen].scale,
        scrollView.bounds.size.height * scale * [UIScreen mainScreen].scale
    };
で、そのあと
    CGImageRef imageRef = CGImageCreateWithImageInRect([_sourceImage CGImage], cropRect);
    self.editedImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
とCGImageの関数でクリップするのが手っ取り早い

ここで注意したいのはUIImageがimageOrientationにUIImageOrientationLeft等で回転している場合だ。この場合、CGImageの関数を適用するときにはその向きを考慮しないことになるので、注意が必要だ。
しかしながら、あらかじめ回転がないことが保証できるならば、素直にやるだけで問題ないだろう。
会社に新しいMBAが届いたので開発環境構築メモ

### xcodeインストール

### xquartzインストール
http://xquartz.macosforge.org/landing/

### xcodeを起動して Command Line Toolsをインストール

### brewインストール
https://github.com/mxcl/homebrew/wiki/Installation

```
sudo mkdir /usr/local
sudo chown -R (ログインユーザー) /usr/local
cd /usr/local
mkdir homebrew && curl -L https://github.com/mxcl/homebrew/tarball/master | tar xz --strip 1 -C homebrew
mkdir /usr/local/bin
ln -s /usr/local/homebrew/bin/brew /usr/local/bin/brew
```

### ターミナルの設定

```
cd .
vi .bash_profile
export PATH=/usr/local/bin:$PATH
export PS1="\u \W $ "
source .bash_profile
```

### brewからインストール

```
brew update
brew doctor
brew install imagemagick
brew install qt
brew install postgresql
```

### postgresqlの設定

#### DB初期化

```
initdb --encoding=UTF8 --no-locale /usr/local/var/postgres
```

#### pathの追加
/usr/local/binにパスを通す

```(例)
vi ~/.bash_profile
PATH=$HOME/.rvm/bin:/usr/local/bin:$PATH
```

#### 手動起動と停止

```
pg_ctl -D /usr/local/var/postgres -l logfile start
pg_ctl -D /usr/local/var/postgres -l logfile stop
```

### rvm経由でrubyのインストール

```
rvm install-1.9.2-p290
```

#### bundle installなどして開発再開したらいいやん
PHPばっか投稿していたので今日はPerlの書き捨てプログラムを

"."から始まるファイルやディレクトリ以外を再帰的にコピーしたい!
というので書き捨てのPerlを。

なんか、たまにそういうの有るよね、
主にsvnでなんかしちゃった時ね、
みたいなのね。

毎度、書いているような気がするので上げておこうと思って。
やったねQiitaでDRY原則を守れたぞ!

```
#!/usr/bin/perl -w
use strict;
use warnings;
my $PATH_FROM = 'FROM';
my $PATH_TO     = 'TO';
foreach my $from ( FileManager::getPath ( $PATH_FROM ) ) { 
  my $to = $from;
  $to =~ s#$PATH_FROM#$PATH_TO#;
  if    ( FileManager::isDirectory ( $from ) ) { FileManager::mkdir ( $to ) } 
  elsif ( FileManager::isFile ( $from ) )      { FileManager::copy ( $from, $to ) } 
}


package FileManager;
sub isFile      { return -f shift }
sub isDirectory { return -d shift }
sub mkdir       { mkdir shift }
sub copy {
  my $from = shift;
  my $to   = shift;
  open my $F, $from    or die "can't open file - $from"; 
  open my $T, " > $to" or die "can't open file - $to";
  binmode $T; 
  print $T $_ while <$F>;
  close $F; 
  close $T; 
}

sub getPath {
  my $path = shift ;
  my @result = (); 
  if    ( -f $path ) { push @result, $path; }
  elsif ( -d $path ) { 
    my $dir;
    push @result, $path;
    opendir $dir, $path;
    while ( my $fn = readdir $dir ) { 
      $fn =~ /^\./ and next;
      $fn =~ /^\.+$/ and next;
      push @result, $_ for FileManager::getPath ( "$path/$fn" );
    }   
  }
  return @result; 
}
```
OS X 10.8 でFlashのデバッグ

VizzyがOS X 10.8で使えなくなったので
flashlog.txtをConsole又はshellのtail等で開けば今まで通りデバッグできます。

ターミナルを開いて、次のコマンドを実行してConsoleで開きます。
```open "~/Library/Preferences/Macromedia/Flash Player/Logs/flashlog.txt" -a Console
```

shellのtail
```tail -f "~/Library/Preferences/Macromedia/Flash Player/Logs/flashlog.txt"
```

※ デバッグ版のFlash Playerが必要です。
※ OS X 10.8 以前でももちろん使えます。
mini_recordを使ったら日付が入ってなかった


Padrinoでmini_recordを使って、ActiveRecord用のサンプルをポチポチしてたら、日付がないよと怒られた。

ActiveRecordはデフォでcreated_at, updated_atが入るけどmini_recordでは明示しないとだめぽい

created_at, updated_atをそれぞれ書いてもいいけど、timestampsを書けば両方定義してくれるので楽

~~~ruby:sample_model.rb
class SampleModel < ActiveRecord::Base
  timestamps
end
~~~
目的のバイナリを読んでくれないとき。

macでwhichとwhereは違うらしい。

http://d.hatena.ne.jp/kanonji/20100210/1265828299

whichで見るのが正しいのだけど、どうしてもwhereisで指定されているアドレスしか読んでくれない場合は、

hash -r

してみると、whichで指定されている側を読んでくれる。。。かもしれない。
How'd you test padrino's helpers

Padrino framework で helper のテストを書く。

デフォルトの状態ではヘルパーのテストをジェネレートしてくれないっぽい。

```shell
$ padrino g controller welcome get:index get:hello
      create  app/controllers/welcome.rb
      create  app/helpers/welcome_helper.rb
      create  app/views/welcome
       apply  tests/rspec
      create  spec/app/controllers/welcome_controller_spec.rb
```

なので適当に `spec/app/helpers` というディレクトリを掘る。

ヘルパーをモジュールにする。

```diff:app_helper.rb
-App.helpers do
+module AppHelper
#...
 end
+App.helpers AppHelper
```

RSpecのほうの `spec_helper.rb` に色々設定する。

```diff:spec_helper.rb
# helpers の配下を読み込ませる
+Dir[File.expand_path(File.dirname(__FILE__) + "/../app/helpers/**/*.rb")].each(&method(:require))

# Padrino の組み込みヘルパーメソッドを全部呼び出せる
# オブジェクトを生成し、
# Rails ばりに「helper」で呼び出せるようにする。
 RSpec.configure do |conf|
   conf.before :suite do
+    helpers = Object.new
+    helpers.extend Padrino::Helpers::TagHelpers
+    helpers.extend Padrino::Helpers::AssetTagHelpers
+    helpers.extend Padrino::Helpers::NumberHelpers
+    #......
+    Object.send(:define_method, :helpers) do
+      helpers
+    end
   end
 end
```

```ruby:app_helper_spec.rb
describe AppHelper do
  before { helper.extend AppHelper }
  subject { helper.some_helper_method }
  it { should == ... }
# ...
end
```

## 参考資料

[Padrinoコミッタskade氏のありがたいコメント](https://github.com/padrino/padrino-framework/issues/930#issuecomment-8449269)

## `request, response, env` とかは呼び出せないのでは？

stubすればいいんじゃないかと思う。どっちにしろどういうリクエストで呼ばれるヘルパーなの？　とかはspecに書くことになるのではないだろうか〜

## その他思ったこと

「`--module-helper`」みたいなジェネレータのオプションを渡すとmoduleでヘルパーを生成してほしいと思った。

同じようなことを思った方は、まずは[リポジトリ](https://github.com/padrino/padrino-framework)に行って「Fork」というボタンを押してみましょう。

## 謝辞

ぼくの割と適当なモックコードを形にした同僚のIさん。

## 蛇足::TODO::自分へ

* もっとイケてる感じにして rspec-padrino に組み込む。
* 「Padrino 開発のしおり」みたいなのが比較的必要な感じになってきたので公開する。
chown と chmod の少し便利な技

chown で `hoge:` や `hoge.` のようにグループを空にするとユーザのプライマリグループが設定される。

```console
# ll
-rw-r--r-- 1 root root 0 10月  5 12:41 2012 file1
-rw-r--r-- 1 root root 0 10月  5 12:41 2012 file2
-rw-r--r-- 1 root root 0 10月  5 12:41 2012 file3

# chown hoge file1
# chown hoge. file2
# chown hoge.hoge file3

# ll
-rw-r--r-- 1 hoge root 0 10月  5 12:41 2012 file1
-rw-r--r-- 1 hoge hoge 0 10月  5 12:41 2012 file2
-rw-r--r-- 1 hoge hoge 0 10月  5 12:41 2012 file3
```

chmod で `X` を指定すると、ディレクトリまたは既にユーザーに実行アクセス権がある場合のみ実行アクセス権が付与される。
`-R` や グロブ で一括設定する場合に便利！

```console
$ ll
合計 4
drwx------ 2 hoge hoge 4096 10月  5 12:45 2012 dir
-rwx------ 1 hoge hoge    0 10月  5 12:45 2012 file.sh
-rw------- 1 hoge hoge    0 10月  5 12:45 2012 file.txt

$ chmod g+rX *
drwxr-x--- 2 hoge hoge 4096 10月  5 12:45 2012 dir
-rwxr-x--- 1 hoge hoge    0 10月  5 12:45 2012 file.sh
-rw-r----- 1 hoge hoge    0 10月  5 12:45 2012 file.txt
```
MacOS10.7.4でpython3.2.2環境にsip-4.14導入


恐らくはeasy_installやpip、brewのいずれもパッケージからはエラーになるのではないかと。。。


自前でビルドが必要になるようなので
とりあえずの手順

[http://www.riverbankcomputing.co.uk/software/sip/download](http://www.riverbankcomputing.co.uk/software/sip/download)
からtar.gzで圧縮の最新版(この時点では4.14)をダウンロード。

```bash:シェル画面で
tar zxvf sip-4.14.tar.gz
cd ./sip-4.14
python3.2 ./configure.py --arch=x86_64
make
make install
```
多分configure.pyがエラーになります。ウチはそうでした。
`Error: SIP requires Python to be built as a framework`
色々検索した結果で解決方法は
[http://meme.biology.tohoku.ac.jp/students/iwasaki/python/pyqt.html](http://meme.biology.tohoku.ac.jp/students/iwasaki/python/pyqt.html)
より。
./sip-4.14下にあるsiputils.pyの1490行目くらいとsipconfig.pyの1600行目くらいにある

```python:ex
            if "Python.framework" not in dl:
                error("SIP requires Python to be built as a framework")
```

を行頭に#つけてコメントアウトすると通るようになります、多分。
twitter-bootstrap-rails ことはじめ

### twitter-bootstrap-railsをさらっと触って社内メンバーに説明したときのメモ

####・プロジェクト作成

```
rails new tbsample -T

cd tbsampl  
```

https://github.com/seyhunak/twitter-bootstrap-rails

####・インストール
>Gemfile編集

```ruby:Gemfile
  gem "twitter-bootstrap-rails"
```

```
bundle install

rails g bootstrap:install
```

####・sample

```
rails g bootstrap:layout application fixed
```

```
rails g scaffold Post title:string description:text
rake db:migrate
rails g bootstrap:themed Posts
```


####・注意点
layoutにtwitter-bootstrapを反映するとfavicon_link_tagが挿入されます。
このままdeployするとfavicon_link_tagがないのでassets_precompileで落ちます。
faviconを用意するかlayoutから削除しましょう。

####・デザインの変更について
http://bootswatch.com/ から適当に
variables.lessをダウンロードし、中身をbootstrap_and_overrides.css.lessにコピペ。
UIScrollViewの外側をスライドさせてもScrollViewに反映させたい

@interface MyScrollView : UIScrollView
@end
@implementation MyScrollView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    return self;
}
@end
のようにhitTestを適宜オーバーライドしてしまうと出来るようだ
コマンドプロンプトでgruntが実行できない時の対処法

コマンドプロンプト上で、grunt.jsがあるフォルダでgruntと入力しても実行されません。

```bat
C:\path\to\project>dir
...
-a---        2012/10/05      0:18       3004 grunt.js
...

C:\path\to\project>grunt

C:\path\to\project>
```
環境変数PATHEXTに、拡張子を省略したコマンドが入力された場合に補完(探索)する拡張子が指定されています。

```bat
>set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW
```

コマンドプロンプトはbashと違い、頭に./を付けなくてもカレントフォルダのファイル・フォルダを叩きに行けるので
PATH(→npm)内のgrunt実行ファイルを見に行く前にカレントフォルダのgrunt.jsを見つけてしまいます。

対処法は拡張子を省略せずに打ち込む

```bat
>grunt.cmd
```

か、またはPATHEXTから.JS;を取り除きます。
grunt 0.4.0からはgrunt.jsがGruntfile.jsに変わるようなので心配なくなるのですが。
macでトラックポイント付きのキーボード(Windows用)をスクロール可能にして使う方法


USB接続のWindowsキーボードって、macでもUSBに挿せば普通に使えるんでしょ？って思っていたら大間違いでしたw

せっかく調べたので、まとめておくエントリ。

１．アプリを導入する
=

mac用のキーバインドを良い感じに変更してくれる**Keyremap4macbook(無料)**[URL: http://pqrs.org/macosx/keyremap4macbook/index.html.ja]をインストールする。

２．キーバインドを設定する
=

2-1 センターキー + トラックポイントでスクロール可能にする

		- MiddleClick+CursorMove to ScrollWheelで検索
		- チェックを入れる

2-2 Ctrl + Cでのコピペなどを可能にする

		- control+cで検索
		- USE PC Style Copy/Pasteにチェックを入れる
		(数種類の組み合わせがあるので好みで選んで！)

2-3 Ctrl + Zでの戻るを使えるように！

		- control+zで検索
		- USE PC Style Undoにチェックを入れる

2-4 Alt+Tabでアプリの切り替えができるように！

		- Option+Tabで検索
		- Option+Tab to Command+Tabにチェックを入れる

2-5 半角／全角キーで日本語入力のON/OFFができるように！

		- Backquote(`)keyで検索
		- Backquote(`)key to KANA/EISUU(toggle)にチェックを入れる


参考までに、私が設定したのはこの5ヶ所です。
取り急ぎはこれくらいでWindowsライクに使えると思います。
https://www.dropbox.com/s/uhetzd017pjwrqi/KeyRemapMacBook_Sample.png


参考URL:
http://cureblack.com/a/173
http://pqrs.org/macosx/keyremap4macbook/index.html.ja
http://naousami.cocolog-nifty.com/hetare/2010/06/windowsmac-4842.html
MacのRubyインタプリタで日本語を扱う

## 概要
irb やpryを知って感激したけど、入力した日本語がUnicodeに変換されて正しく扱えず(´・ω・`) だったので、正しく扱えるようにする。

![irbで日本語を扱う](http://gyazo.com/7cc5a870d5ad2489b6d919cfca0f0aaa.png
)

## おおまかな手順

* rvmコマンドでreadlineをインストール
* インストールされているRubyとGemの再インストール


### 注意事項
※ RubyやGemの再インストール(=コンパイル)が待っているので、実施は時間のあるときにおながいします。

---

## やってみる

どうやらMac標準のreadline がダメな子らしいので、rvmコマンドを叩いて べつのreadlineパッケージをインストールしてもらう。

```
rvm pkg install readline
```

![コンソールメッセージ](http://gyazo.com/8b8f169e11704c77bef5468aa6ead13c.png?1349351286)
コマンドを叩いて 流れてくる文字を見てると 上のメッセージが表示されると思うので、言われたとおりにコマンドを叩きます。

```
rvm reinstall $(rvm list strings | tr "\n" ',')
```

```
rvm all-gemsets do rvm gemset pristine
```

やることは以上です。
あとは気長に処理が終了するのを待って、完了したら、irb を起動して確認してみましょう。

## リンク

* [tricknotesのぼうけんのしょ - Macのirbで日本語入力をできるようにする](http://d.hatena.ne.jp/tricknotes/20110405/p1)


## 蛇足
* コマンドがrvm package だったりrvm pkg だったりするけど、そこはrvm usage で確認を

* Mountain Lion(v.10.8.2)で確認してます。

* pry だとなんだか大変なことになるけれど、構わず入力すれば ちゃんと動くので、多分大丈夫です。(もしかして[pry-coolline](https://github.com/pry/pry-coolline "GitHub")の影響？？？)
![pryで日本語を扱う](http://gyazo.com/44e080d076ba71fdccdd773f9cf09948.png?1349357028)
UTF-8で作ってたら、サーバに置いてあるファイルがShift_JIS, EUC-JPだった

`Blob` で読み込んで、 `FileReader#readAsText` を使おう！[対応状況](http://caniuse.com/#feat=filereader)

```js
var xhr = new XMLHttpRequest;

xhr.responseType = 'blob';
xhr.open(method, url);
xhr.onloadend = function() {
  var fr = new FileReader;
  fr.onloadend = callback.bind(fr, fr.result);
  fr.readAsText(xhr.response, encoding);
};
xhr.send(params);
```

iOS6, Android3.0以上だけの案件に使える。
UIScrollView zoom by tap

```objc:tapToZoom.m

#define DEFAULT_ZOOM_SCALE 5.0
#define SCALE_RATE 2.0

- (IBAction)onDoubleTapOnMap:(UITapGestureRecognizer *)sender {
    
    float zoom = self.scrollView.zoom;
    
    CGPoint tapPoint = [sender locationInView:self.scrollView];

    // Zoom=self.scrollView.zoom → Zoom=1.0 
    tapPoint.x /= zoom;
    tapPoint.y /= zoom;

    if (zoom >= self.scrollView.maximumZoomScale) {
        // already max zoom : set zoom to default
        [self.scrollView setZoomScale:DEFAULT_ZOOM_SCALE animated:YES];
    } else {
        // zoom up

        float newZoom = zoom * SCALE_RATE;
        if (newZoom >= self.scrollView.maximumZoomScale) {
            newZoom = self.scrollView.maximumZoomScale;
        }

        CGRect newRect = [self zoomRectForScrollView:self.scrollView withScale:newZoom withCenter:tapPoint];
        [self.scrollView zoomToRect:newRect animated:YES];
    }
}

// http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/UIScrollView_pg/ZoomZoom/ZoomZoom.html#//apple_ref/doc/uid/TP40008179-CH102-SW7
- (CGRect)zoomRectForScrollView:(UIView *)scrollView withScale:(float)scale withCenter:(CGPoint)center {
    
    CGRect zoomRect;
    
    // The zoom rect is in the content view's coordinates.
    // At a zoom scale of 1.0, it would be the size of the
    // imageScrollView's bounds.
    // As the zoom scale decreases, so more content is visible,
    // the size of the rect grows.
    zoomRect.size.height = scrollView.frame.size.height / scale;
    zoomRect.size.width  = scrollView.frame.size.width  / scale;
    
    // choose an origin so as to get the right center.
    zoomRect.origin.x = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0);
    
    return zoomRect;
}
```
平行投影法での描画順

OpenGLなどで素直にアルファブレンディングして透過処理をしている場合、自力で描画順を直さないとうまく動かないことが知られている。

で、その描画順はどうやって求めたら良いかについて。
調べても出て来なかったけど、単に、表示したい物体の座標Xと視線（カメラ）の方向Cとの内積つまり、X・Cの値でソートしてやればよかっただけだった。
XFF

HTTP `X-Forwarded-For:` ヘッダー (`$ENV{HTTP_X_FORWARDED_FOR}`) のよくある話のまとめ

- reverse proxy よりも外側で付けられることがあるので、無条件で信頼しても良いわけではない
- reverse proxy より外で付けられた XFF は reverse proxy で落としても良いかもしれないが、
  - 落とす設定を忘れたり、いつのまにか無効になってたりすると困るので、値を信頼したいなら相応の予防措置が必要
  - XFF にはそれなりに有用な情報が詰まってるので最低でも reverse proxy のログには残したいし、アプリケーションサーバーで取りたくなることもあるかもしれない (しないかもしれない)
- reverse proxy よりも内側で付けられることがあるので (多段になっている場合)、ヘッダーや値が1つだけとは限らない
  - 最初は1つだけだと思っていたのに、後からキャッシュサーバーを挟む必要がでてきたら・・・?
- XFF が既にあるときに、前につける串と後につける串がある
  - なので最初とか最後とかを拾うだけではだめ
- データセンター内のプライベートIPアドレスを除去するという対策が提案されてる
  - なお、アプリケーションサーバー → キャッシュサーバー → reverse proxy → アプリケーションサーバーみたいな内部から内部への経路だと、グローバルアドレスの前にも後にも内部IPアドレスが付いた XFF になったりする
  - アプリケーションサーバー → proxy → アプリケーションサーバーのような経路を使うとグローバルIPアドレスが無い XFF になるので、それがあり得るならそれなりにケアが必要
- 最外 reverse proxy で相手のアドレスを独自ヘッダーに入れて XFF じゃなくてそちらを使う、という対策が提案されている
  - 独自ヘッダーが既に付けられている場合は落とす必要はやはりある
- ちなみに XFF が最も広く使われているが、他にも同目的のヘッダーがある
  - `X-Client-IP:`、`X-Sakura-Forwarded-For:`、`CF-Connecting-IP:` など
  - IETF は `Forwarded:` ヘッダーを新たに開発したが、本稿にまとめた問題を解決するものではない
  - 混在するとどれを採用するべきか問題がますます複雑になるので、 reverse proxy の類を作るなら、できるだけ XFF を採用したい
jQuery.extend で値を上書きする。


$.extend(●初期値, ●新しい値);
にすると・・・●新しい値が●初期値を上書き、または値を追加してくれる。

便利。

```javascript:conbeef.js

console.log('■初期値 //////////////////');

var obj = {
  a: 'aaa',
  b: 'bbb',
  c: 'ccc'
};

console.log(obj.a); // -> aaa
console.log(obj.b); // -> bbb
console.log(obj.c); // -> ccc
console.log(obj.d); // -> undefined

console.log('■値の更新2 //////////////////');

obj.a = 'aaa1';
obj.c = 'ccc1';

console.log(obj.a); // -> aaa1
console.log(obj.b); // -> bbb
console.log(obj.c); // -> ccc1
console.log(obj.d); // -> undefined

console.log('■値の更新2 //////////////////');

var objX = {
  c: 'ccc2',
  d: 'ddd2'
};

obj = objX;

console.log(obj.a); // -> undefined
console.log(obj.b); // -> undefined
console.log(obj.c); // -> ccc2
console.log(obj.d); // -> ddd2

console.log('■値の更新3 //////////////////');

var objY = {
  a: 'aaa9',
  b: 'bbb9',
  d: 'ddd9'
};

$.extend(obj, objY);

console.log(obj.a); // -> aaa9
console.log(obj.b); // -> bbb9
console.log(obj.c); // -> ccc2
console.log(obj.d); // -> ddd9

```
Facebookへの投稿で「#200 The user hasn't authorized the application to perform this action.  」エラーが出たら

### Gem

```ruby:Gemfile
gem "devise"
gem "omniauth-facebook"
gem "fb_graph"
```

### Deviseの場合

* OmniAuthの設定に「status_update」と「publish_stream」を追加
  * Facebook側の設定ページには権限の設定は無い、アプリ側で設定する(ハマった。。)

```ruby:config/initializers/devise.rb
config.omniauth :facebook, Settings.facebook_id, Settings.facebook_secret, { scope: 'email, status_update, publish_stream' }
```

* permissionsに「status_update」「publish_stream」が存在する事を確認

```
FbGraph::User.me(  current_user.facebook_token ).permissions.tapp
 # =>
[
    [0] :installed,
    [1] :read_stream,
    [2] :status_update,
    [3] :photo_upload,
    [4] :video_upload,
    [5] :email,
    [6] :create_note,
    [7] :share_item,
    [8] :publish_stream,
    [9] :publish_actions
]
```

* ウォール投稿が成功する事を確認

```ruby
    me = FbGraph::User.me( current_user.facebook_token )
    me.feed!(
      message:     'Updating via FbGraph',
      picture:     'https://graph.facebook.com/matake/picture',
      link:        'https://github.com/nov/fb_graph',
      name:        'FbGraph',
      description: 'A Ruby wrapper for Facebook Graph API'
    )
```
packageをupdateしたあとに古いパッケージを見に行ってエラーになる問題の対処

Emacsで

    M-x list-packages

して、`U`押したらパッケージの更新があったか確認してくれます。で、更新があったら`x`で更新を実行してくれます。
このあと、更新されたパッケージに関連したfunctionを使おうとすると古いパッケージを見に行ってエラーが出ることがあるみたいです。
こういう時は

    M-x package-initialize

したら直る。
Rubyの三項演算子の話

JavaScript や C ではちょっとした場面にぴりりと役に立つ三項演算子(条件演算子)だけれど、実は Ruby ではかなり存在感の微妙な要らない子だったりします。

```javascript:ternary_sample.rb.js
a = 1
b = 2
x = "hi"
y = "bye"

v = a<b?x:y
```

こんなコードの場合を考へてみます。このコードは JavaScript 処理系では問題なく実行できるけど、 Ruby では `Syntax Error` であり、まったく動きません。

Ruby では、`b?` のようなメソッド名が許されて、 `:y` はシンボルです。また、  `?x` は文字列の `"x"` と等価です。はてには、次のようなコードを書くこともできます。

```ruby:arg_label.rb
def d (*arg)
  arg
end

d 1, 2, 3, foo:"bar", fizz: :buzz, "hoge" => :fuga
# => [1, 2, 3, {:foo=>"bar", :fizz=>:buzz, "hoge"=>:fuga}]
```

そのような言語仕様のために、 Ruby の字句解析器・構文解析器は `a<b?x:y` を正しいコードとしてパースできません。正しく意図通りに解釈させるには、 `?` と `:` の前後にはきっちり空白を入れて、 `a<b ? x : y` と書かなければいけないのです。

では Ruby の処理系は実際にどのように解釈してるのか、確認してみませう。

```ruby:check_syntax_ternary.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'ripper'
require 'pp'

a = 1
b = 2
x = "hi"
y = "bye"

wrong = 'v = a<b?x:y'
puts "まちがひ: #{wrong}"
pp Ripper.tokenize wrong
pp Ripper.lex wrong

puts

correct = 'v = a<b ? x : y'
puts "せいかい: #{correct}"
pp Ripper.tokenize correct
pp Ripper.lex correct

puts

puts "eval: #{correct} #=> #{eval(correct).inspect}"
```

おのおのの手元で実行してみて欲しいのですが( `irb` や `pry` でも動く)、[実行結果は ideone にも置いておきます](http://ideone.com/bP4r7)。

さて、空白のない `a<b?x:y` の部分を抜萃してみませう。

```
[[[1, 4], :on_ident, "a"],
 [[1, 5], :on_op, "<"],
 [[1, 6], :on_ident, "b?"],
 [[1, 8], :on_label, "x:"],
 [[1, 10], :on_ident, "y"]]
```

`:on_ident` は識別子(メソッド名、変数名など)で、 `:on_op` は演算子。ここで注目すべきは、 `b?` と `x:` がそれぞれひとつの塊として認識されてゐることです。 `:on_label` は引数のラベルです。

つまり、この `b?x:y` の部分は別の書き方をすると `a < b?(:x => y)` と同じとして解釈されてることがわかります。それを証拠に、 `def b? (*args); args; end` のようなコードを追加してみれば、エラーなく動作はすることがわかると思ひます。 (しかしそれでも `a<b?x:y` は動かない)

さてここで、三項演算子がどうして C や JavaScript で役に立つのか考へてみませう。

```javasript:sample-use-if.c.js
if (foo()) {
    tmp = "fuga";
} else {
    tmp = "hoge";
}

bar(tmp);
```

このように `foo()` によって渡す引数を分岐したいときに、 `tmp = ` を二回書くのは、激しく **ださい** ですね。そんなとき、三項演算子では `if` なしに次のやうに簡潔に書くことができます。

```javascript:sample-use-ternary.c.js
tmp = foo()?"fuga":"hoge";
bar(tmp);
```

または直接このように書いて引数に渡すこともできます。

```javascript:sample-use-ternary2.c.js
bar(foo()?"fuga":"hoge");
```

もし Ruby でも、たかだか2種類の分岐程度ならば三項演算子を使っても簡潔に書けます。しかし三項演算子では、それ以上の分岐が必要になったときには、ネスト地獄が待ってゐることを、みなさまは知ってゐることでせう……。

さて、 Ruby では以下のやうなコードが許されます。 (是非論はすこし脇においておいて)

```ruby
tmp = if foo(); "fuga" else "hoge" end
bar tmp

# もちろんインデントしてもおｋ
tmp = if foo()
        "fuga"
      else
        "hoge"
      end
bar tmp
```

そして、この書きかたは `case-when` でも使用することができます。

```ruby
tmp = case foo
      when :fizz
        "fugafuga"
      when :buzz
        "piyopiyo"
      else
        "gudaguda"
      end
bar tmp
```

分岐し放題ヤッター！ (ちなみに公平のために、この記法は有名な [前田修吾さんのコーディング規約](http://shugo.net/ruby-codeconv/codeconv.html#label-16) では制限されてゐるものであることを紹介しておきます )

なほ、もしどうしても三項演算子を使用したいときは `(a < b) ? x : y` のように条件式を `()` で括り、条件式中にもきちんと空白を入れ、きっちりと `?` と `:` の前後を空けることをおすすめします。 (C や JavaScript でも条件式は `()` で括った方が読みやすいですね)

ちなみになのですが、 Ruby の三項演算子と `if` は、見ためこそ異なりますが、インタプリタの内部的には **まったく同じもの** です。 [parse.y をご覧ください](https://github.com/ruby/ruby/blob/ruby_1_9_3/parse.y#L2364) 。