OmniAICreator/Qiita-1.07M huggingface dataset:
Angular.js入門 (1)導入とデータバインディング

https://egghead.io/ 
のAngular.jsのビデオを見ながら, 分からないことは調べるといった感じでAngularと戯れてきました。

ビデオチュートリアルは好きなんですが、終わった後分からない箇所なんかをもう一回探すのが煩わしかったりするので、理解の確認を兼ねてここに書いていこうと思います。
全部を書きくだしてるわけではないですし, 有料コンテンツは当然ここには写経しませんので, 腰を据えて勉強したい方はご自身で上の動画を見ていった方が良いと思います〜(^_^;)

次回: [Angular.js入門 (2)コントローラ](http://qiita.com/_rdtr/items/715a3d13e637e5daaa0b)

## 導入

最初のhtmlは下記のようになります。

```index.html
<!doctype html>
<html lang="en" ng-app>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{hello}}</h1>
    <input type="text" ng-model="hello"/>
</body>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.6/angular.js"></script>
</html>

```

scriptタグでAngular.jsを指定しています。今回は1.3.0のベータ版を入れていますが, 好きなバージョンを公式サイトのDownloadからCDNのリンクから入手可能です。
https://angularjs.org/


上のhtmlにおけるポイントは以下の3つです。

* htmlタグにng-app属性を記述
* inputタグにng-model="hello"を記述
* h1タグ内に{{hello}}を記述

これだけで, htmlを開いてフォームに何か入力してみると, その内容が動的にh1タグ内に表示されるのが分かると思います。

![フォームの内容を表示](https://qiita-image-store.s3.amazonaws.com/0/20470/036b95d9-9a7a-0fb9-e54a-f2455a79121a.png)

フォームの内容をAngularでいうmodelとして定義し, その内容を{{hello}}という記述で動的に紐付けて内容を展開できる, ということが分かるかと思います。(注1)

## バインディング

上でhtmlタグにng-app属性を記述しましたが, これはこのタグ内でAngularアプリ使いますよーという宣言だと思っておけば良さそう。

上とほとんど同じですが, 今度は下のようにコードを変更してみます。

```index.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Angular.jsのテスト</title>
    <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/foundation/5.2.2/css/foundation.css">
</head>
<body>

<div ng-app="">
    <input type="text" ng-model="hello">
    <div class="{{hello}}">ここが装飾される</div>
</div>

</body>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.6/angular.js"></script>
</html>
```

ng-app属性をdivタグに書くように変更しています（とりあえず値は空にしています）。また説明のためにfoundation(注2)のCSSをロードしてます。

今度はh1タグ内ではなく, divのclass属性のところに{{hello}}が挿入されているのに注目してください。

フォームに panel と入力してみると, {{hello}} にpanelが入力されるので, foundationのpanelクラスの装飾があたることがわかります。

![panelの装飾](https://qiita-image-store.s3.amazonaws.com/0/20470/2ff67add-0fd7-6b40-1190-37901e66c06c.png)

alert-boxに変えてみましょう。

![alert-boxの装飾](https://qiita-image-store.s3.amazonaws.com/0/20470/7b6371d6-43b2-909c-27a1-b9d914b01d1b.png)

なんとなくjQueryでのDOM操作による装飾に近いことが, かなり少ない記述量で実現できる予感がしてくるかと思います。

このようにデータソース(model)とビュー(view)とを動的に同期を取って連携させることをデータバインディングと言います。

## 注釈
(注1)modelって何？って人は: [AngularJSのMVWパターンを理解する](http://qiita.com/zoetro/items/a45dbc18bb2b22e944b2)
(注2)[foundation](http://foundation.zurb.com/)はTwitter Bootstrapなんかと同じCSSフレームワークの1つ. class名を付けるだけで装飾が変わるのが分かりやすいのでCSSだけ使用しています。簡単な導入なんかは: [レスポンシブWebデザインの現状と、CSSフレームワーク「Foundation 4」によるサイト制作手法](http://www.buildinsider.net/web/rwdcssfw/01)
Genymotionで立ち上げたエミュレータからローカルホストにアクセスしたい

開発中のWebアプリの挙動や見た目を様々なAndroid端末から確認したいときがあると思う。
Genymotionで立ち上げたエミュレータからローカルホストにアクセスする方法が分からなかったのでメモ。

エミュレータのブラウザから「192.168.56.1」でローカルホストにアクセスできる。
tmxで作った木の裏とかにキャラが回り込めるようにする

![領域のキャプチャ 123.png](https://qiita-image-store.s3.amazonaws.com/0/6612/29858ac3-5389-6a38-cc0c-d4f219574b57.png)
こういうやつ。

まずはTiled Mapなどのtmx編集ツールを使って、backgroundレイヤーとforegroundレイヤーを作る。
foregroundレイヤーには裏に回りこませたいものを置く。この場合だと木の上部（黒い部分は透過色）。
![領域のキャプチャ 125.png](https://qiita-image-store.s3.amazonaws.com/0/6612/9b52af51-6af6-16a9-4dba-734f568145df.png)

backgroundレイヤーは木の幹を。
![領域のキャプチャ 124.png](https://qiita-image-store.s3.amazonaws.com/0/6612/66d7d345-7195-351b-a107-4389ab81e08f.png)


あとはjs側で各レイヤーのzOrderがforeground > キャラクター > backgroundになるように設定してやればOK.

```js
var character = cc.Sptire.create('path/to/chara.png');
var tileMap = cc.TMXTiledMap.create('path/to/map.tmx');
tileMap.getLayer('foreground').setZOrder(100);
tileMap.getLayer('background').setZOrder(50);
tileMap.addChild(character, 70);
```

キャラクターがtileMap上にaddChildされていないとうまく重なり順が表現されないので注意。
Mac (Mavericks) で Apache+PHP をホームディレクトリで動かす


## 前提条件
ApacheおよびPHPはOS標準でインストールされています。
ユーザ名： obama

## Apacheの設定ファイルを編集

```bash
$ sudo vi /etc/apache2/httpd.conf

#LoadModule php5_module libexec/apache2/libphp5.so
↓ コメントを外す
LoadModule php5_module libexec/apache2/libphp5.so

```

## ユーザ固有の設定ファイルを作成

```bash
$ sudo vi /etc/apache2/users/obama.conf

<Directory "/Users/obama/Sites/">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
```

## ディレクトリを作成

```bash
$ mkdir ~/Sites
```

## 動作確認用スクリプトを作成
```bash
$ vi ~/Sites/index.php

<?php
    phpinfo();
?>
```

## Apacheを起動
```bash
$ sudo apachectl start
```

## ブラウザで確認

http://localhost/~obama/index.php
Ubuntu14.04にrbenvを使ってrubyをインストールする

##rbnevのインストール

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

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

```
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

##必要パッケージのインストール

```
sudo apt-get install libssl-dev
```

##rubyのインストールと有効化

```
rbenv install 2.1.2
rbenv rehash
rbenv gloval 2.1.1
```

##rubyのバージョン確認

```
rbenv version
ruby -v
```


以上です。
不足や間違いがありましたら指摘していただけると嬉しいです。


参考
https://github.com/sstephenson/rbenv
http://krakenbeal.blogspot.jp/2012/03/ubunturbenvruby-buildruby.html
https://github.com/sstephenson/ruby-build/issues/526#issuecomment-37933242
http://qiita.com/kazoo04/items/7056704efee66f323ddb
なぜCoqが重要か

%なぜCoqが重要か
%@yoshihiro503
%平成26年4月29日

# なぜCoqが重要か

結論

* 最強のプログラム検証器
* 最強の関数型言語

# 最強のプログラム検証器

Coqは最強の表現力を持つ仕様記述言語を使う

* **仕様記述言語**は*検証したいこと* を記述するための言語
* 表現力は検証器によって全然違う
* 表現できる範囲が、検証器の限界
* Coqのそれは高階述語論理 ← 最強

# 最強のプログラム検証器
Coqを使うためにはPhDが必要?

* 高校生でも練習すればできる (c.f. プログラミングCoq)

# 最強のプログラム検証器
証明を人間が与えるのが大変？

* タクティックによる自動化はOCamlでいくらでも可能
* 型チェッカはタクティックと独立なので安全
* 既にomegaなどの自動証明アルゴリズムを実装したタクティックあり

# 最強の関数型言語

Coqは(型の表現力が)最強の関数型言語

* 型の表現力が最強
* 型推論は完全ではない
* 停止性は保証しなければならない

注意: ここでの関数型言語とは<br/>
   (ラムダ計算を基礎とした)(静的型付き)関数型(プログラミング)言語

# Coqのインストール
## Unix系 ソースからインストール
* OCaml, camlp5必要
* ./configure; make world; make install

## Debian系
* apt-get install coq

## opamユーザー
* opam install coq

# Coqのインストール
## Windows, Mac OS X
* バイナリ(CoqIDE付属)
* Linux VMを入れる



# Coqを使う
* 拡張子は.v
* 大文字で始まるのがCoqコマンド(Vernacular)<br />
(例: Definition, Theorem, Require Import)
* 小文字で始まるのがタクティック<br />
(例: intros, omega, destruct, rewrite)

一覧: <http://coq.inria.fr/distrib/current/refman/>

# Coqの基本
Coqではいろんなモノが式

* 数値、文字列、if式、match式
* 関数
* 型
* 論理式(仕様)
* 証明

# Coqで証明するという事
「ある論理式PをCoqで証明する」 ≡ 「(a : P)となる式aを見つける」

☆ a をPの証明と呼ぶ

# Coqで証明するという事

例えば、

「任意のf, xsについて、(map f xs)の長さとxsの長さは同じ」

を証明するためには

??? : forall f xs, length (map f xs) = length xs

となる式を見つければよい。

<sub><pre><code>
fun (A B : Type) (f : A -> B) (xs : list A) =>
list_ind (fun xs0 : list A => length (map f xs0) = length xs0) eq_refl
  (fun (_ : A) (xs0 : list A) (IHxs : length (map f xs0) = length xs0) =>
   eq_ind_r (fun n : nat => S n = S (length xs0)) eq_refl IHxs) xs
</code></pre></sub>

# Coqで証明するという事
実際はタクティックを試しながら、対話的にゴールを変形していく。

```coq
Theorem map_length: forall A B:Type f xs,
  length (map f xs) = length xs.
Proof.
 intros A B f xs. induction xs.
  reflexivity.

  simpl. rewrite IHxs. reflexivity.
Qed.
```
plenv + mysqlenv が入っている Dockerfile を書いた。

軽く手元で試したい時に作ってみた。
sshのログインとかだいぶ手抜きです。
VIRTUAL SIZEが予想外大きく4GB超えてた。

```Dockerfile
# DOCKER-VERSION 0.10.0
# VERSION 0.0.1

FROM centos

MAINTAINER python_spameggs

# sys network
RUN echo 'NETWORKING=yes' > /etc/sysconfig/network

RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# yum
RUN yum update -y
RUN yum install -y passwd
RUN yum install -y sudo
RUN yum install -y gcc
RUN yum install -y gcc-c++
RUN yum install -y make
RUN yum install -y vim
RUN yum install -y git
RUN yum install --enablerepo=epel -y mosh
RUN yum install -y openssl-devel
RUN yum install -y zlib-devel
RUN yum install -y readline-devel
RUN yum install -y bzip2-devel
RUN yum install -y libevent-devel
RUN yum install -y openssh
RUN yum install -y openssh-server
RUN yum install -y openssh-clients
RUN yum install -y cmake

# ssh
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config

# user
RUN useradd python_spameggs
RUN echo 'foobar' | passwd --stdin python_spameggs

# sudo
RUN echo 'python_spameggs ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/python_spameggs

# timezone
RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime

# perl(plenv)
USER python_spameggs
WORKDIR /home/python_spameggs
RUN mkdir .plenv && chmod 700 .plenv
RUN git clone git://github.com/tokuhirom/plenv.git .plenv/
RUN git clone git://github.com/tokuhirom/Perl-Build.git .plenv/plugins/perl-build/
RUN echo 'export PLENV_ROOT="${HOME}/.plenv"' >> .bash_profile
RUN echo 'export PATH="${PLENV_ROOT}/bin:${PATH}"' >> .bash_profile
RUN echo 'eval "$(plenv init -)"' >> .bash_profile
ENV PLENV_ROOT /home/python_spameggs/.plenv
ENV PATH ${PLENV_ROOT}/bin:${PATH}
RUN plenv install 5.18.2

# mysql(mysqlenv)
ENV HOME /home/python_spameggs
RUN curl -kL http://bit.ly/mysqlenv | bash
RUN echo 'source ~/.mysqlenv/etc/bashrc' >> .bash_profile
ENV MYSQLENV_ROOT /home/python_spameggs/.mysqlenv
ENV PATH ${MYSQLENV_ROOT}/bin:${MYSQLENV_ROOT}/shims:${MYSQLENV_ROOT}/mysql-build/bin:${PATH}
RUN mysqlenv install 5.6.15

USER root
RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]
```
[Objective-C] Swizzlingをデバッグに活用する


[Swizzlingについては前に書いている](http://qiita.com/edo_m18/items/9c57f4714d5c14a990c4)のでそちらを参照ください。

## デバッグに活用する

Swizzlingの強力なところは、既存の処理にあとから処理を追加できる点です。
これを応用すれば、特定のプロパティに対してどこからアクセスされているかといったこともチェックできます。
（KVOなどで予期しないところからアクセスされていたり、ということがあるので）

そして今回書くのは、`CALayer`クラスのレンダリング処理に差し込んで、すべてのCALayer経由でレンダリングされる要素に対してborderを表示する、というものです。

ざっくりとレイアウトが今どうなっているのか、見えるはずの要素が見えないのはなぜか、といったことを視覚的に確認することができます。

### UIViewの範囲をborderで示す

```objc
// 差し込み処理の定義部分。カテゴリで実装。

#import <objc/runtime.h>

@interface CALayer (Debugger)

@end

@implementation CALayer (Debugger)

- (void) prefix_swapDrawInContext:(CGContextRef)ctx
{
	// 既存処理の前にborderの幅と色を設定する
    self.borderWidth = 1.0;
    self.borderColor = [UIColor redColor].CGColor;

	// 元の処理を実行する。この時点ではすでに処理自体が差し替わっているため、メソッド名は同一。（再帰呼び出しではなくなる）
    [self prefix_swapDrawInContext:ctx];
}

@end

/////////////////////////////////////////////////////////////////////

// 実装をスワップする関数
void swap() {
    Method method1 = class_getInstanceMethod(CALayer.class, @selector(drawInContext:));
    Method method2 = class_getInstanceMethod(CALayer.class, @selector(prefix_swapDrawInContext:));
    
    method_exchangeImplementations(method1, method2);
}
```

```objc
// スワップ処理を実行。複数回実行しないようにしておく。
// 実行する場所はデバッグを始めたい箇所で。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    swap();
});
```


### UIViewの`setFrame`を差し替える

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

@interface UIView(debug)

- (void)swapSetFrame:(CGRect)frame;

@end

@implementation UIView(debug)

- (void)swapSetFrame:(CGRect)frame
{
    NSLog(@"Called setFrame: %@", NSStringFromCGRect(frame));
    [self swapSetFrame:frame];
}

@end

void swapSetFrame() {
    Method setFrame = class_getInstanceMethod(UIView.class, @selector(setFrame:));
    Method swapSetFrame = class_getInstanceMethod(UIView.class, @selector(swapSetFrame:));
    method_exchangeImplementations(setFrame, swapSetFrame);
}
```
VimGolfに挑戦 - No.2　～  Words in parens

VimGolfとは、Vimのキーストロークの少なさを競えるサイトです。
http://vimgolf.com/challenges/5192f96ad8df110002000002

たとえば、初期状態でこうなっている文字列を

```
one two
three   
```

Vimで以下のように編集する場合のキーストロークの少なさを競い合います。

```
(one) (two)
(three)  
```

まだまだ、わたしのVim知識では、スコア21が限界。。。(おい..またか・泣）
```
 :%s/\(\w*\)/(\1)/g<CR>ZZ 
```

最少のキーストロークが14みたいだけど、どーやってやんのさ？
上級Vimmerの皆様、お知恵をお貸しください！！
iOS switch ON/OFFでメニューの表示/非表示を切り替えるにはどうしたらいいですか？

アプリ作成もプログラミングも初心者です。
先日から勉強を開始しました。
UI何たらのそれぞれの説明は理解できるのですが、それを合わせて利用したい時などの処理がわかりません。本にも書いてなくて困っています。

iPhoneの無線設定のような、on/offの切り替えに伴って表示/非表示が切り替わるようにしたいんですが、どうしたら良いのでしょうか？
例えばonにしたら、それまで非表示だったスライダーが表示されるような感じにしたいです。

現状は以下のようになっています。※色々試しているのでめちゃくちゃですが…。

『ViewController.h』
@interface ViewController : UIViewController
- (IBAction)mybtn:(id)sender;
@property (weak, nonatomic) IBOutlet UISwitch *myswh;
- (IBAction)myswhchg:(id)sender;
@property (weak, nonatomic) IBOutlet UISlider *slid;
- (IBAction)chgslid:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *mylabel;

@end

『ViewController.m』
@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)mybtn:(id)sender {
    NSString *mysld = self.mylabel.text;
    NSLog(@"たっぷした%@",mysld);
}
- (IBAction)myswhchg:(id)sender {
    if (self.myswh.on == YES){
        NSLog(@"おん");
    }else{
        NSLog(@"おふ");
    }
}
- (IBAction)chgslid:(id)sender {
    self.mylabel.text = [NSString stringWithFormat:@"%.0f", self.slid.value];
}
@end


.mファイルでif文を使ってon/offの切り替え時にそれぞれ違った処理を書くところまではわかりました。
if文の中にUIsliderなどは入れられないのでしょうか？？

教えてください。
x軸を共有した複数のプロットを並べる


gnuplotでx軸を共有した二つのプロットを縦に並べる方法。

- multiplotを使う。layoutオプションを使う事でいくつのプロットを並べるか指定できる。
    - 縦に二つ並べる場合、layout 2,1と指定
- 一つ目のプロット時に `set bmargin 0` を指定し、二つ目のときに `set tmargin 0` を指定する。これで二つのグラフが接する。
- 一つ目のときはxtics, xlabelを非表示にする
- また `set lmargin 5` などのように適切なlmarginも指定する必要がある。（二つのグラフでlmarginを共有すること）
    - 指定しないと自動でマージンが決められるので、y軸の数字の桁数によってグラフの大きさが変わりx軸のスケールがずれる。

サンプル

```
set multiplot layout 2,1

set lmargin 5

set bmargin 0
unset xlabel
unset xtics
plot x

set tmargin 0
set bmargin 3
set xlabel "X"
set xtics
plot x*x

unset multiplot
```

出力例
![multiplot_sample.png](https://qiita-image-store.s3.amazonaws.com/0/28792/bee6901f-bf5e-79cb-f3d8-02105b882551.png "multiplot_sample.png")
phpで定義済み変数の一覧をtableで出力

# phpで定義済み変数の一覧をtableで出力

変数の一覧見たい時とかに。

```php:php
function hoge($var) {
    if(is_array($var)) {
        echo "<table border='1'>";
        foreach($var as $key => $value) {
            echo "<tr>";
            echo "<td>";
            echo htmlspecialchars($key);
            echo "</td>";
            echo "<td>";
            hoge($value);
            echo "</td>";
            echo "</tr>";
        }
        echo "</table>";
    } else {
        echo "<div>";
        echo htmlspecialchars($var);
        echo "</div>";
    }
}

$vars = get_defined_vars();
unset($vars["GLOBALS"]);
hoge($vars);
```

## 注意

`$GLOBALS` は値に自身の参照を持ってるので、
除外しておかないと無限再帰に陥って残念な事になるので注意。


## javascriptで空の新規ウインドウに書き出してみたり

ちょっと改変。

```php:php
<?php
function hoge2($var) {
    if(is_array($var)) {
        echo "<table border='1'>";
        foreach($var as $key => $value) {
            echo "<tr>";
            echo "<td>";
            echo htmlspecialchars($key, ENT_QUOTES);
            echo "</td>";
            echo "<td>";
            hoge2($value);
            echo "</td>";
            echo "</tr>";
        }
        echo "</table>";
    } else {
        echo "<div>";
        echo htmlspecialchars(
                str_replace(array("\r\n", "\r", "\n"), "", var_export($var, true)),
                ENT_QUOTES);
        echo "</div>";
    }
}
?>
```

```html:php
<div>
    <script type="text/javascript">
    function vars() {
        try {
            var page = window.open("", "", "width=720,height=800,resizable=yes,scrollbars=yes,status=yes,location=no");
            page.document.open();
            page.document.write("<?php $vars = get_defined_vars(); unset($vars["GLOBALS"]); hoge2($vars); ?>");
            page.document.close();
        } catch(e) {
            console.log(e);
        } finally {
            return false;
        }
    }
    </script>
    <a href="#" onclick='return vars();'>vars</a>
</div>
```
dyld: lazy symbol binding failed: Symbol not found:




node-opencvモジュールを使ったときにでるdynamic loader周りのエラー対処法

http://d.hatena.ne.jp/teru_kusu/20100329/1269849713

http://ewa4618.vjck.com/?page_id=2520



http://blog.enjoitech.jp/article/216
rsyncケーススタディ

# rsyncケーススタディ

rsyncはやたらハマりやすいので、とりあえず基本的なとこだけ押さえたサンプル。

このへんが詳しくて参考になる。
http://koseki.hatenablog.com/entry/20090424/rsync
http://x68000.q-e-d.net/~68user/unix/pickup?rsync

## たとえば

自分でrsync使ったなんちゃってデプロイシェル書いててハマって、
調べるのにけっこう手こずったパターンの詰め合わせ。

```
app/
├── docs
│   ├── baz.pdf
│   ├── foo.doc
│   └── settings.xls
├── img
│   ├── card_128x128
│   │   ├── 100001.jpg
│   │   ├── 100002.jpg
│   │   └── 100003.jpg
│   ├── card_48x48
│   │   ├── 100001.jpg
│   │   ├── 100002.jpg
│   │   └── 100003.jpg
│   ├── card_original
│   │   ├── 100001.jpg
│   │   ├── 100002.jpg
│   │   └── 100003.jpg
│   └── item
│       ├── 400401.jpg
│       ├── 400402.jpg
│       └── 400403.jpg
├── logs
│   ├── log-2014-04-18.php
│   ├── log-2014-04-21.php
│   └── log-2014-04-22.php
└── src
    ├── deploy.php
    ├── index.php
    └── lib
        ├── item.php
        └── payment.php
```

こんな構成のディレクトリから、以下のような条件で同期したい場合。

* `src/` の下は全部必要
* `docs/` はいらない
 * けど `docs/settings.xls` は必要
* `img/` の下は全部必要
 * けど `img/card_original/` はいらない
* `logs/` は必要
 * けど中身は要らない
* それ以外は全部いらない

加えて、

* `--delete` オプションが付いていても **同期先にのみ存在する** `src/conf/` 以下は消さないでほしい

まとめると、同期先はこうなってほしい。

```
deploy/
├── docs
│   └── settings.xls
├── img
│   ├── card_128x128
│   │   ├── 100001.jpg
│   │   ├── 100002.jpg
│   │   └── 100003.jpg
│   ├── card_48x48
│   │   ├── 100001.jpg
│   │   ├── 100002.jpg
│   │   └── 100003.jpg
│   └── item
│       ├── 400401.jpg
│       ├── 400402.jpg
│       └── 400403.jpg
├── logs
└── src
    ├── conf
    │   └── hoge.conf
    ├── deploy.php
    ├── index.php
    └── lib
        ├── item.php
        └── payment.php
```

## どう指定するか

```bash:bash
rsync -av --delete app/ deploy \
    --exclude="src/conf/"   \
    --include="src/***"   \
    --include="docs/"   \
    --include="docs/settings.xls"   \
    --exclude="docs/"  \
    --exclude="img/card_original/"  \
    --include="img/***"   \
    --include="logs/"  \
    --exclude="*"
```

### 要点

apacheの`allow/deny` とかの順番と同じで、
ホワイトリストかブラックリストかで条件書く順番が変わる。

オプションは前から順に辿っていくので、
基本は列挙した条件をそのまま書き下すだけ。
先に条件を箇条書きしておくと混乱せずに済むと思う。

#### `src/` 以下は全て含めるが、`src/conf/` 以下には触れない
`   --exclude="src/conf/"    --include="src/***"`

同期元に `src/conf/` が無くても明示的に除外指定しておかないと、
`--delete` オプション付けた時に消されてしまうので注意。

#### `docs/` 以下は要らないが、`docs/settings.xls` は必要

`   --include="docs/" --include="docs/settings.xls" --exclude="docs/" `

階層を辿って単体ファイルを`--include`する場合、そこまでのパスも`--include`する必要がある。
`--exclude="docs/"` してるので、いきなり`--include="docs/settings.xls"`とは書けない。

#### `img/` 以下は全て含めるが、`img/card_original/` は要らない

`   --exclude="img/card_original/"  --include="img/***"`

`src/conf/`の場合の設定と同じ。
この項目要らなかったな。まぁいいや。

#### `logs/`は含めるが、中身は要らない

`    --include="logs/"  `

最後に全て除外してるので、ここでは`--include`指定するだけでおｋ。

#### 他は全部要らない

`    --exclude="*"`

先頭から条件辿ってきて引っ掛からなかったものは全部除外。

こんな感じ。

### 余談

同期元が変わると、たとえ全く同じファイル構成だったとしても、再度同期し直しになるので注意が必要。

上記の例だと、

```bash:bash
cp -r app app2/
rsync -av --delete app2/ deploy
```

とかすると、再度全てのファイルを同期する。
つまり、差分転送できなくなる。

シンボリックリンクの場合は大丈夫。
Goでファイル名から拡張子を取りだす


stringでも`"hoge"[0:]` みたいな記法ができて便利
(他にいい方法があるかもしれない)

```go
package main

import "strings"

func main(){
	filename := "hoge.piyo.moge.js"
	pos := strings.LastIndex(filename, ".")
	
	println(filename[pos:])	// .js
}
```
【画像を保存]UIViewを画像で保存する。

UIView を見た目そのまま画像として保存したい。

```objective-C:saveImage.m
//Core Graphicsを使います
#import <QuartzCore/QuartzCore.h>
//保存したい UIView のインスタンス view があるとして、それを保存する方法は次の通り。
UIGraphicsBeginImageContext(view.frame.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    // PNGの場合（view.alphaで指定した透明度も維持されるみたい）
    NSData *dataSaveImage = UIImagePNGRepresentation(image);

    // JPEGの場合
    //NSData *dataSaveImage = UIImageJPEGRepresentation(image, 1.0);    

    // Documentsディレクトリに保存
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    [dataSaveImage writeToFile:[path stringByAppendingPathComponent:@"test.png"] atomically:YES];

````
AngularJSで未定義の任意の値をController間で渡す


こういう風に実現できたんだけど、本当は良くないのかな.. 自信なし。意見求む。

利用する値をいちいちFactoryで定義しなくていいので、楽ではあるんだけど。
やりたいことは、ページを切り替え(Controllerを切り替え)たりする際に引数を渡したい。

- 値の受け渡し用の空の(ダミー？)のFactoryを定義

```javascript:Factory
angular.module('hogeApp')
    // Controller間で引数をやりとりするためのFactory
    .factory('ShareData', function () {

        // 何も書かないとエラーになったので記載
        return {
        };
    })
;

```

- 受け渡し「元」のController
	- この `hoge` は、どこにも定義していない任意の変数

```javascript:Controller①
angular.module('hogeApp')
	// 先ほどの ShareData をDIしておく
    .controller('MainCtrl', ['$scope', 'ShareData', function ($scope, ShareData) {

        // これはng-clickで定義した関数
        $scope.showItem = function(){
            ShareData.hoge = "ほげほげ";

            // 〜ここに遷移的な何か
		
        };

    }])
;
```

- 受け渡し「先」のController

```javascript:Controller②
angular.module('hogeApp')
	// こちらも ShareData をDIしておく
    .controller('SubCtrl', ['$scope', 'ShareData', function ($scope, ShareData) {

        $scope.hogetext = ShareData.hoge;
    }])
;
```

それともグローバルな変数で受け渡すのが正解なのかしら。
メールでパッチをやり取りする

いにしえの、、というか古き良き開発手法のメモ。

# Mercurialの場合

`hg email`でパッチを送信し、`hg import`でパッチを取り込む。

## 設定

まず、共通の設定から。`~/.hgrc` に次の設定を行う。

```ini:~/.hgrc
[extensions]
patchbomb =

[email]
method = smtp
from = Takumi IINO <trot.thunder@gmail.com>

[smtp]
host = smtp.gmail.com
port = 587
tls = starttls
username = trot.thunder@gmail.com
```

送信先の設定はリポジトリ毎の `.hg/hgrc` で行う。例えばmercurialにパッチを送るのであれば次の様になる。

```ini:.hg/hgrc
[email]
to = mercurial-devel@selenic.com
```

## パッチを送る

`hg email` コマンドでパッチを送る。

```shell-session
$ hg email .                       # 最後のコミットをメールで送信する。
```

`--test` オプションを利用すると送信内容の確認が行える。事前に見直すとよい。

```shell-session
$ hg email --test .                # 変更をメールで送信するテストを行う。プレビューが表示される。
```

`--flag` を利用すると件名に特定の文字列を含めることが出来る。

```shell-session

$ hg email --flag RFC .            # 件名にRFCという文字列を含める
$ hg email --flag RFC --flag WIP . # 件名にRFC、WIPという文字列を含める
```

mercurialの開発では次のようなフラグがよく利用されている

```
WIP RFC STABLE V2 V3 .. VN <新機能名>
```

## パッチを取り込む
`hg import` コマンドでパッチを取り込む。メールをなんとかしてmbox形式（gmailの元のメッセージで表示される形式と同じやつだ）に変換する必要が有る。

```shell-session
$ hg import patch.mbox
```

mbox形式のメールがwebから参照出来る場合はそのURLを指定することも出来る。

```shell-session
$ hg import http://patchwork.serpentine.com/patch/4147/mbox/
```

# Gitの場合

`git format-patch`でパッチを作成し、`git send-email`でパッチを送信し、`git am`でパッチを取り込む。

## 設定
まず共通の設定から。 `~/.gitconfig` に次の設定を行う。

```ini:~/.gitconfig
	[sendemail]
		smtpencryption = tls
		smtpserver = smtp.gmail.com
		smtpuser = trot.thunder@gmail.com
		smtpserverport = 587
```

送信先の設定はリポジトリ毎の `.git/config` で行う。 `git send-email`のオプションでも指定出来る。

```ini:.git/config
	[sendemail]
		to = bug-tar@gnu.org
```

## パッチを作成する
`git format-patch`でパッチを作成する。mbox形式のファイルが作成される。

```shell-session
$ git format-patch <revision range> # 指定した範囲のパッチを作成する
```

`--output-directory` で出力先を指定できる。複数パッチが有る場合に便利

```shell-session
$ git format-patch --output-directory outgoing <revision range> # outgoingにパッチを作成
```

`--subject-prefix` で件名に文字列を追加できる。

```shell-session
$ git format-patch --subject-prefix WIP <revsion range> # 件名にWIPという文字列を含める
```

## パッチを送る
`git send-email`でパッチを送る。

```shell-session
$ git send-email outgoing/*
```

`--dry-run` オプションで送信内容の確認が行える。事前に見直すとよい。

```shell-session
git send-email --dry-run outgoing/*
```

## パッチを取り込む
`git am`でパッチを取り込む。mbox形式のパッチを取り込む

```shell-session
$ git am patch.mbox
```

# Patchwork

メールベースでパッチのレビューや取り込みを行う立場になった場合、パッチの状態（accept, rejectなど）やパッチの見落としが発生したり、いろいろ難しい。gmailでMLを購読しているけど、どうやってmboxでダウンロードするの。。とか、使い勝手の問題もある。

で、そういう状態をなんとかするためのツールに[Patchwork](http://jk.ozlabs.org/projects/patchwork/)というものがある。

## 出来ること
Patchwork では次のようなことが行える。

- パッチの状態(under review, accept, rejectなど)
- メールでのやり取りの一覧
- 担当
- mbox、unified diff形式でのパッチのダウンロード

Mercurialの開発の例をあげると、Patchworkが導入されてから、一ヶ月前の未レビューのパッチが処理される様になったりと、パッチの見落としが減った。便利！

# 参考

- http://mercurial.selenic.com/wiki/ContributingChanges
- http://git-scm.com/docs/git-send-email.html
- http://git-scm.com/docs/git-format-patch.html
- http://git-scm.com/docs/git-am.html
- http://jk.ozlabs.org/projects/patchwork/
  - http://patchwork.serpentine.com/project/hg/list/ mercurialのpatchwork
  - http://patchwork.ozlabs.org/project/linuxppc-dev/list/ linux-ppc-developmentのpatchwork
latex: revtex4-1 スタイルのインストール (MacOS X)


revtex4-1は，American Instituite of Physics (AIP)関連の論文用のLaTeXスタイルファイル．JAPやPRBなどに投稿する際はこれを使う．

以下では，TexLiveがインストールされているMacOS X (10.9.2)を想定している．

## ダウンロード
* [APS journal - REVTex Home](http://journals.aps.org/revtex/)


## インストール
`revtex4-1.zip`をダウンロードしたら，それを解凍する．
解凍後に`revtex4-1/`ディレクトリ内に`revtex4-1-tds.zip`があるので，それを解凍する．そうしてできる`revtex4-1-tds/`ディレクトリ内にインストールすべきもののセットがある．
これを以下のようにして`texmf-local/`ディレクトリにインストールする．

```bash
$ cd revtex4-1-tds/
$ sudo cp -r * /usr/local/texlive/texmf-local/
$ sudo mktexlsr
```


## 使用法

### プリアンブル

```latex
\documentclass[aps,twocolumn,a4paper,showkeys,showpacs]{revtex4-1}
```

などとして使用する．

### RefTex

RefTexを使用する場合は，

```latex
 \bibliographystyle{apsrev4-1}
 \bibliography{/Users/kobayashi/Dropbox/library}
```

のように，`\bibliographystyle{apsrev4-1}`を指定する．
他のスタイルを指定したい場合は，`/usr/local/texlive/texmf-local/bibtex/bst/revtex/`内を探してみるとよい．
grailsで処理するテーブルを動的に変更する

grailsで処理するテーブルを動的に変更する際にちょっとハマったのでメモ。

解決策はgrailsに限った方法ではないのですが、ドメインクラスなどGrailsがアーチファクトとして特別な処理を施しているクラスはClass.forName()などで呼ばないほうが無難、という結果に至りました。

https://gist.github.com/anonymous/11236298
getIntent と Activity のライフサイクルの関係

# getIntent 内の Extra の内容を変更 => Activity が破棄 => Activity が復旧 したときに、getIntent はどうなるのかという話

Activity がバックグラウンドに行った時に、破棄される（ことがある）というのは良く聞く話。 onSaveInstanceState や onRestoreInstanceState で上手にActivityを復旧する必要がある。ところで、Activityが呼び出されたときに Intent で渡された値と、それを上書きした場合はどうなるのだろうか？

## ぜんてい

- Activity が復旧した時に Intent 内の値を使う
- Activity が起動した後、Intent の中身を書き換える（普通やらない）

## けつろん

- 起動時の Intent の値が得られます
- 書き換えた後のものは復旧後に反映されません onSaveInstanceState 使って自分で管理

## あとがき

- グロースハッカー消えてください
Webエンジニア準備(内輪版)トピック集


ある程度は社外一般でも有用だとは思っていますが、この文書の目的は第一義的には社内向けです。

* 開発用マシン
  * 家に持ち帰ったりするならMacbook Airが無難
  * オフィスにおいておくならMacbook Pro Retina
  * Windowsでもいいっちゃいいけど勧めないし、何を買えばいいかわからない。
* 身につけていきたい知識
  * プログラミング言語 / マークアップ言語
     * PHP / Ruby
         * まずはどちらかでスタート
         * Rubyはrbenv + gemset を扱えるようにしたい
     * HTML
     * JavaScript + JQuery
         * 最初のうちはあまり深入りしない
     * CSS
         * 最初のうちはあまり深入りしない
   * データベース
      * MySQL
  * その他
     * バージョン管理
         * Git
             * 最初のうちはあまり深入りしない
             * clone/commit/pushできるようになる
     * ドキュメンテーション / Wiki
         * Qiita::Team
     * コミュニケーション
         * Google Apps (メール / カレンダー / ドライブ)
         * slack
  * プラットフォーム
     * Linux (UNIX)
     * Mac OS X
         * Command Line Toolsをインストールしておく
         * homebrew
     * AWS
         * EC2
     * bash
         * vim
         * less
     * 開発環境は次のどれか
         * Eclipse
         * IntelliJ IDEA (PHPStorm / RubyMine)
         * Vim
         * (Emacs)
     * VirtualBox
     * Vagrant
  * ネットワーク
      * HTTP
      * SSH
      * TCP/IP
      * SMTP
	  * TLS
  * 慣れてきたら追加
     * アジャイル開発
     * テスト / TDD
VirtualBox 上の Ubuntu がもっさりする件を解消するメモ

# 概要

VirtualBox 上に Ubuntu の GUI 環境を構築すると、Windows でいうところのスタートメニュー的なものの表示であったり、ウィンドウのアニメーションがもっさりしてストレスを感じることがあるかと思います。

そんな場合は、以下のページにあるとおりの操作をすれば解消されることでしょう。

- [Ubuntu 13をVirtualboxにインストールすると遅い！！を直す方法](http://maxima.hatenablog.jp/entry/2013/08/05/223331)
- [Virtualbox上のUbuntu13.04が遅く感じる時](http://kanakatsu.cocolog-nifty.com/blog/2013/06/virtualboxubunt.html)
- [3D Acceleration with Ubuntu guests](https://blogs.oracle.com/fatbloke/entry/3d_acceleration_with_ubuntu_guests)

以降に、将来の自分のためにメモを残しておきます。

# VirtualBox 側での操作

VM の設定画面にて、「ディスプレイ」の項目を選択します。続いて、その項目の右側の領域に表示されている「ビデオ」タブを選択します。
同タブ内にある以下の項目をそれぞれ設定します。

- ビデオメモリー
    - 最大値になるように、スライダーを操作する
- 拡張機能
    - 「3D アクセラレーションを有効化」チェックボックスを ON にする

# Ubuntu 側での操作

ターミナルを立ち上げ、以下を入力することで、 `/etc/modules` ファイルの末尾に `vboxvideo` を追記します。

    $ sudo bash -c 'echo vboxvideo >> /etc/modules'

以上。
一元配置分散分析

[昨日](http://qiita.com/ynakayama/items/dae1f5bf5688b7ce8e77)は回帰分析について触れましたが、問題に応じて最適な手法を選択し適用することはデータ分析においてとても大切です。そのためには各種の分析手法について理解を深めなくてはなりません。

データを入手したとき、分布を仮定するためにいくつか分析したいことがあります。たとえばデータの変動を水準間変動と残差変動に分解し水準間で有意差があるかどうか検定する。変量間の関係から回帰式を導く。計数データを水準毎に分割する。それらが有意であるかどうか検定する。観測値の順位を用いて、母集団分布に依らないノンパラメトリック検定をする。といったものです。

## 分散分析

[分散分析](http://ja.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E5%88%86%E6%9E%90)は言うなれば検定の一種で、一元配置分散分析では 1 つの要因 A の複数の水準 A_1, A_2, ... A_a に関して各水準の母平均に差があるか検定します。

次のようなデータを考えてみます。一元配置のデータです。

|水準|観測値|標本平均|
|:--|:--|:--|
|A_1|x_11 ... x1r| \overline{x}_1 |
| ... | ... | ... |
| A_a | x_a1 ... x_ar | \overline{x}_a |

各水準 A_i の平均は i = 1, ... , a としたとき

```math
\overline{x}_i = \frac 1 r \sum_{j=1}^rx_{ij}
```

となります。また総平均は

```math
\frac 1 {ar} \sum_{i=1}^a \sum_{j=1}^r x_{ij}
```

です。

各水準の観測値の個数は等しく r としても良いですが一元配置の場合は水準ごとに異なることも許されます。

ここでひとつの仮説検定が必要になります。

|仮説|内容|
|:--|:--|
|帰無仮説|水準間の相違は無関係なランダム変動にすぎず有意性は無い|
|対立仮説|標本平均の相違が母平均はすべて等しいと言えないほど大きい|

データの構造式を次式の通りとします。

```math
x_{ij} = \mu + \alpha_i + \epsilon_{ij} \\
ただし \\
\sum_{i=1}^a \alpha_i = 0 \\
\epsilon_{ij} は互いに正規分布 N(0, \sigma^2) に従う
```

水準間平方和を S_A 、残差平方和を S_e としたとき、 S_A と S_e の確率分布を考えます。不偏分散と同様の考え方により総平方和 S_r の自由度は次式で得られます。

```math
\phi_c = \phi_r - \phi_A = ar - a
```
F 間が自由度 (\phi_A ・ \phi_e) の F 分布の上側 α 点より大きいならば帰無仮説は有意水準 α で棄却されます。

```py3
import numpy as np

data = np.array([[  5.,   7.,  12.],
                 [  6.,   5.,  10.],
                 [  3.,   4.,   8.],
                 [  2.,   4.,   6.]])

s_mean = np.zeros(data.shape)

for i in range(data.shape[1]):
    s_mean[:,i] = data[:,i].mean()

print( "水準平均 " + str(s_mean) )

kouka = s_mean - np.ones(data.shape)*data.mean()

print( "水準間偏差（因子の効果） := 水準平均 - 全体平均 " + str(kouka) )

Q1 = (kouka * kouka).sum()
print( "水準間変動（効果の偏差平方和（SS）） " + str(Q1) )

f1 = data.shape[1] - 1
print( "自由度 " + str(f1) )

V1 = Q1 / f1
print ("水準間偏差（効果）の平均平方（MS）（不変分散） " + str(V1) )

error = data - s_mean
print( "水準内偏差（統計誤差） " + str(error) )

Q2 = (error * error).sum()
print( "誤差の偏差平方和（SS） " + str(Q2) )

f2 = ( data.shape[0] - 1 ) * data.shape[1]
print( "自由度（DF） " + str(f2) )

V2 = Q2 / f2
print( "水準内偏差（誤差）の平均平方（MS）（不変分散） " + str(V2) )

F = V1 / V2
print( "分散比（F値） " + str(F) )

# =>
#水準平均 [[ 4.  5.  9.]
# [ 4.  5.  9.]
# [ 4.  5.  9.]
# [ 4.  5.  9.]]
#水準間偏差（因子の効果） := 水準平均 - 全体平均 [[-2. -1.  3.]
# [-2. -1.  3.]
# [-2. -1.  3.]
# [-2. -1.  3.]]
#水準間変動（効果の偏差平方和（SS）） 56.0
#自由度 2
#水準間偏差（効果）の平均平方（MS）（不変分散） 28.0
#水準内偏差（統計誤差） [[ 1.  2.  3.]
# [ 2.  0.  1.]
# [-1. -1. -1.]
# [-2. -1. -3.]]
#誤差の偏差平方和（SS） 36.0
#自由度（DF） 9
#水準内偏差（誤差）の平均平方（MS）（不変分散） 4.0
#分散比（F値） 7.0
```

## 参考

分散分析（analysis of variance 略称 ANOVA）
http://www.agri.tohoku.ac.jp/iden/toukei7.html

Numpy で分散分析
http://mkacky.wordpress.com/2013/05/22/numpy%E3%81%A7%E5%88%86%E6%95%A3%E5%88%86%E6%9E%90/

日本統計学会公式認定 統計検定1級対応 統計学
http://www.amazon.co.jp/dp/448902150X
一行野郎：sshで踏台経由でログイン

###効果
sshのnetcatモードで、多段一発ログイン。

###一行野郎
`ssh -o 'ProxyCommand ssh hoge_pc -W %h:%p' page_pc`
まぁ、netcatモードなくとも、socksでもいいし、踏台にnetcat入れてもいいんだけど。

###必要な物
* ssh (5.4以降)

###追加
./ssh/config とかに設定入れとくと便利。

     Host *.jp
         ProxyCommand ssh user_ho@remote_hoge -W %h:%p

これで、
`ssh user_pa@page.jp`
で、remote_hoge経由でpage.jpに接続でける。
CentOSにepel,remi,IUSリポジトリをお手軽に追加

# 概要

いつも入れるリポジトリは決まっているけど、マシン環境が変わると微妙に追従が面倒。

それならいっそ手順を決めてしまえ!

## epel追加

```bash
curl -sL http://sharl.hauN.org/centos/epel | sudo bash -x
```

## remi追加

```bash
curl -sL http://sharl.hauN.org/centos/remi | sudo bash -x
```

## IUS追加

```bash
curl -sL http://sharl.hauN.org/centos/ius | sudo bash -x
```

## 実際は

https://github.com/sharl/centos に置いてあるスクリプトに転送しているだけです。
Objective-C で変数を取り違えないためのTips


以下のコードのおかしいところって、パッと気付かないと思うんです。

```SomeView.m
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 2.0, 280, 26.0)];
titleLabel.adjustsFontSizeToFitWidth = YES;
titleLabel.minimumScaleFactor = 0.5;
snippetLabel.text = snippet;
[self addSubview:titleLabel];
self.titleLabel = titleLabel;

UILabel *snippetLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 28.0, 280, 13.0)];
snippetLabel.text = snippet;
snippetLabel.adjustsFontSizeToFitWidth = YES;
snippetLabel.minimumScaleFactor = 0.5;
[self addSubview:snippetLabel];
self.snippetLabel = snippetLabel;
```

おかしいところは、titleLabelのtextへ代入してそうな部分で、snippetLabelのtextへ代入している部分です。

メソッドを切り分けでば解決するけど、メソッドを切り分けるほど一般的な処理ではない。...というケースは往々にしてあるわけですよね。 じゃあ(Cの)ブロックで囲むことでスコープを切ったら良いんじゃないか、ということで以下。

```SomeView.m
{
	UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 2.0, 280, 26.0)];
	titleLabel.adjustsFontSizeToFitWidth = YES;
	titleLabel.minimumScaleFactor = 0.5;
	snippetLabel.text = snippet;
	[self addSubview:titleLabel];
	self.titleLabel = titleLabel;
}
{
	UILabel *snippetLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 28.0, 280, 13.0)];
	snippetLabel.text = snippet;
	snippetLabel.adjustsFontSizeToFitWidth = YES;
	snippetLabel.minimumScaleFactor = 0.5;
	[self addSubview:snippetLabel];
	self.snippetLabel = snippetLabel;
}
```

こうすると、`snippetLabel.text = snippet;`の所でエラーが出るので、見つけやすくなります。

いつでも使えるわけじゃないですが、Tipsとして。
Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと

#Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと

##環境
ホスト側
Mac OS X 10.9.2
Vagrant 1.5.1
VirtualBox 4.3.10

ゲスト側
CentOS 6.5

##対象者

* VirtualBoxを使っている
* CentOSを使っている
* アプリが何か重いなーおかしいなーと思っている人

## 状況
1. VirtualBox上でFacebookアプリを作っていた。
2. なんかしらんがアプリ動かすとめっちゃ重い
3. 調べるとどうやらfacebookSDKでgraphAPI叩いた時にめっちゃ時間かかってる
4. 内部ネットワークへのアクセスは軽い、外部ネットワークへのアクセスが重い

という感じで、調べてみると外部ネットワークへのアクセスに時間かかってた事を発見
VagrantをNATモードで動かしているんだが、NAT変換するときの名前解決にはちゃめちゃに時間がかかっているご様子

追記：CentOS固有の問題だったことがわかりました。
http://www.kunitake.org/chalow/2012-11-02-1.html

## じゃあどうしたらいいの
方法としてはそもそも仮想環境をブリッジ接続にしちゃって、静的IP割り振ってあげれば良いってのがあった。
http://www.h-fj.com/blog/archives/2013/10/31-103556.php

静的IP振って良いんだったら上記でもOKだったんだけど、今回はNAT変換モードのままうまくやる方法を書く。

## VagrantFileの設定

```rb
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ...
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  end
  ...
end
```

http://vboxmania.net/content/vboxmanage-modifyvm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
によると

```

--natdnsproxy<1-N> on|off:
このオプションは、NATエンジンのプロキシがすべてのゲストマシンのDNS要求をホストマシンのDNSサーバーに要求します。
--natdnshostresolver<1-N> on|off:
このオプションは、NATエンジンがDNS要求を処理する際にホストのリゾルバ機構を使うようになります。
- See more at: http://vboxmania.net/content/vboxmanage-modifyvm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89#sthash.MYEzzmBh.dpuf

```

とのことで、
ゲストOSからのネットワーク接続の際にホストマシンのDNSサーバーを使って名前解決をする様になり、これで速度改善しました。

## バグ（メール送れない）
--natdnshostresolverをonにしている場合にmxレコードが引けずにaレコードが返ってくるというバグが
virtualboxにあるらしく、実際この設定をonにすると仮想マシンからメールが送れなくなります。
https://www.virtualbox.org/ticket/11540

なので、メールを送るシステムの場合はnatdnshostresolverはoffにした方が良いです。
（VagrantFileで一度onにした場合は一度明示的にoffにしてreloadなりしないと直らないので注意）

ちなみに、これやると再びネットワークが遅くなります。

## バグ対応

```
vagrant $ sudo vim /etc/resolv.conf
```

で、以下を追記する

```
options single-request-reopen
```

これでようやく解決しました。
RailsあるあるがRailsあるあるじゃない件

http://www.slideshare.net/tricknotes/rails-possiblestory
ここに記載されているのはRailsどうのでなく設計の問題なので、これを「Railsのあるある」という人は、他の言語やwebアプリのFWでもまた同じ間違いを犯ちゃうのでは疑惑。

###1.社員レコードは論路削除で…
問題の原因は、モデルの状態遷移・各状態で機能がどう振る舞うかを検討せず（設計をせず）に実装にとりかかってることでは。

やるべきだった手順

1. 現実世界での対象モデルの状態を整理する
  - 内定、有効、休職傷病、産休、退職、一時退職（役員とかになる場合の）とか？ 
1. アプリケーション内で定義すべき状態を整理する
  - （社員だと、権限に関わるのでそれに関係しそうな状態を整理する）
  - {準備, 有効, 休職, 退職, 無効, ロック}とか？
1. 最適な実装方法を考える
  - 状態を管理する属性をモデルに持たせる。
  - AASMみたいな状態管理用プラグインもある
1. 実装する


###2.ブログ記事にタグをつけたい。
これはマジで検索できない上にタグのデータが正規化されないので普通にテーブルつくるべき

###3.一時保存のときは入力チェックをしたくない
「会員」というモデルが

- 仮登録状態ではメアドがあればvalid
- 本登録状態ではメアド+名前+etc,があればvalid

と考えると状態でvalidationをわけるのが妥当というか第三者がコードをみたときにわかりやすいのかもしれない。モデルをわけるのもあるかも知れないけど、めんどくさそう

「他のシステムと連携するためのJSONのAPIを提供したい」
連携の要件がわからんので割愛（発表の場にいたわけではないので）
curator で Kibana 用の elasticsearch のインデックスを定期的に削除する

**2015/3/15 curator v3.0 から、コマンドオプションが変わったので改定しました。** 正確には v2.0 から変わってましたけど。

Kibana でダッシュボード作っていると、基本的に日時でインデックスファイルができて、ある程度溜まってくると、

- elasticsearch が悲鳴をあげます（CPU的にも、メモリ的にも）
- ディスク容量が枯渇します

ということで無限にサーバリソースが確保できない場合、Kibana の運用では定期的にインデックスファイルを削除する必要がでてきます。

この Index の削除を便利にしてくれるツールが [curator](https://github.com/elasticsearch/curator) です。

## 事前準備

Python と pip が必要なので、入れておきましょう。

```
$ sudo apt-get install python
$ cd /tmp
$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ sudo python get-pip.py
```

## インストール

pip でインストールできます。`curator --version` と打って、バージョンが表示されればインストール完了です。

```
$ sudo pip install elasticsearch-curator
$ curator --version
curator, version 3.0.0
```

## インデックスの削除

curator では様々なインデックス削除の方法を提供していますが、基本的には、最新の n日分のインデックスを残し、古いものは削除、という方法で十分です。

例えば、最新の30日分の Kibanaの logstash という名前のインデックスだけ残しておきたい場合は、

```
$ curator --host my-elasticsearch delete indices --prefix logstash --older-than 30 --time-unit days --timestring %Y.%m.%d
```

というコマンドを打てば良いです。`my-elasticsearch` は elasticsearch のホスト名かIPアドレスを指定してください。

なお、保持期間は要件によるので、適当に決めてください。個人的には１か月とか２か月くらいが妥当かなーと思っています。

## 実運用で知っておくと便利かもしれない Tips

インデックスファイルを削除した直後に、「あー、あの時のデータ見たかったのに！」と言われるのはよくあることなので、いきなり削除するのではなく Close と併用すると良いと思います。Close したインデックスは検索対象からは外れますが、後で Open することですぐに復活させることができます。

30日たったら Close して、60日たったら削除するというのは以下のコマンドでできます。

```
$ curator --host my-elasticsearch close indices --prefix logstash --older-than 30 --time-unit days --timestring %Y.%m.%d
$ curator --host my-elasticsearch delete indices --prefix logstash --older-than 60 --time-unit days --timestring %Y.%m.%d
```

ついでに、パフォーマンス関連のオプションを指定しましょう。

```
$ curator --host my-elasticsearch bloom indices --prefix logstash --older-than 2 --time-unit days --timestring %Y.%m.%d
```

このコマンドで直近2日以前のインデックスの bloom filter を無効化しています。bloom filter はインデックス処理を高速化する [Codec モジュール](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-codec.html)ですが、Kibana の場合、当日のインデックス以外は書き込まれない Cold Index です。なので、bloom filter の意味はなく、無効化しておくとメモリ使用量などが減少します。
なお、bloom filter の無効化は elasticsearch 0.90.9 以降でしか使えないので注意してください。

## 日次バッチに組み込む

オプションが固まったら、Daily の cron か Jenkins Job を仕込んでおきましょう。elasticsearch のログが AM 0:00 に切り替わるので、それ以降で負荷が少ない時間（AM 2:00とか）に起動しておくのが良いんじゃないかと。

## 参考

v3.0 になって、機能追加とともにCLIのオプションが変わったので、公式マニュアルをまず読んでください。コマンド体系は整理されて使いやすくはなったと思います。

- [Elasticsearch Curator CLI](https://github.com/elastic/curator/blob/master/docs/asciidoc/index.asciidoc)

以下の２つは少し古めだけど、知識としては知っていても良いので残しておきます。

- [curator: tending your time-series indices ](http://www.elasticsearch.org/blog/curator-tending-your-time-series-indices/)
- [Curator: Managing your Logstash and other time-series indices in Elasticsearch — beyond delete and optimize](http://untergeek.com/2014/02/18/curator-managing-your-logstash-and-other-time-series-indices-in-elasticsearch-beyond-delete-and-optimize/)
（メモ）Aviraのall-in-one updateでUnknown Update Error Detailsとか言われた時の対処法

アップデート出来るというのでやろうとしたらこんなエラーメッセージが出た。

>Unknown Update Error Details: could not initialize updater plugin

ググっても分からなかったので自分なりに対処法を見つけた。

どうやらDockリストにあるAviraアイコンそのままクリックして開くのでなく、ディスプレイ最上部にあるバーの傘マークをクリックして'Update Detection'から開いて実行すると出来るみたいだ（理由は知らない）。

![Bar](http://i.gyazo.com/cffe92b132f50fd7399fb6e2c210d164.png "Bar")
WPF XAMLで別アセンブリのCLR名前空間を宣言する。

ちょっと戸惑ったのでメモ

MyLib.dll内で宣言された`MyLib`というCLR名前空間をXAML名前空間として宣言しようと、MyLib.dllをプロジェクトの参照設定に追加した後、同一アセンブリ内のCLR名前空間と同じように以下のようにXAMLに記述した。

```xml
xmlns:mylib="clr-namespace:MyLib"
```

で、mylib.dll中で定義されたクラス`MyClass`をスタティックリソースとして使用しようと

```xml
<Window.Resources>
  <mylib:MyClass x:Key="MyClass"/>
</Window.Resources>
```

などとしたら、名前空間`MyLib`には`MyClass`が存在しないと怒られた。

MyLib.dllには間違いなく`public`なクラスとして`MyClass`は存在するのでおかしいと思ったら、XAML名前空間の宣言に問題があった。

参照設定に追加してるから違いはないだろうと思い込んでいたら、キチンとアセンブリを明示してやる必要があるとのこと。具体的には`xmlns`で名前空間を宣言するさいに、`assembly`を用いてアセンブリ名を指定すればよい。

```xml
<!-- MyLib.dll 内で宣言された名前空間MyLibを宣言する。 -->
xmlns:mylib="clr-namespace:MyLib;assembly=MyLib"
```

これで別アセンブリに定義されたクラスをXAML内で参照できるようになった。
cabal installで依存関係を自動で解決させる

cabal install --reorder-goals --max-backjumps=-1
これで問題のないバージョンの組み合わせが見つかるまで試行してくれる。

--max-backjumpsに指定する値が-1だと組み合わせが見つかるまで試してしまうので、それが問題な場合は-1以外の値を指定することでやり直しの上限回数を設定する。
UIScrollViewDelegateメモ


```objc:scroolDelegate.h

// オフセットが変換した(スクロールした)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;                                               

//　ズームした
- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2); 

//　ドラッグがはじまっった。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

//　ある速度(point/ミリ秒)を持っている状況でドラッグが終りそう。最終的な落ち着き先をtargetContentOffsetで指定できる。
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);

//　ドラッグが終わって指が離れた。減速しつつも慣性でその後もスクロールがある場合はdecelerateがYESになっている。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

//　減速が始まった。動かしている最中に指先が離れた際に呼ばれる。
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView; 

//　スクロールが急停止した際に呼ばれる。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

//　setContentOffset/scrollRectVisible:animated:で指定したスクロールが終わった場合に呼ばれる。スクロールアニメーションなしの場合には呼ばれない。
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

// ズーム(拡大縮小)される際のビューを返す。nilならなにも起きない。
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

//　ズームが開始される。
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view NS_AVAILABLE_IOS(3_2);

//　ズームが終わった。scaleには許される最小値から最大値の範囲で結果のスケールが入っている。バウンスアニメーション後に呼ばれる。
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale; 

// もしトップへのスクロールをしてほしい場合はYESを返すようにする。デフォルトはYES。
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

//　トップへのスクロールが終わった。最初からトップにいる場合は直ちに呼ばれる場合がある。
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;

```
一行野郎：ネットワーク越しの大量ファイルコピー(rsyncじゃないよ)

###効果
大量のファイルを、サーバ間のディレクトリ構造付きコピー。
あと、固めてから送るのが困難な時に重宝する。ちょっと速い。

###一行野郎
`tar -c /var/www/hoge | ssh page_pc 'tar -xvf - -C /home/page`
ssh経由で、単純コピー。元で固めて、先で展開。

`tar -c /var/www/hoge | gzip -1 | ssh page_pc 'cat > /home/page/hoge.tar.gz'`
gzipかましながら、先で固める。まぁ、tarじゃなくてcpioでもいいし、sshのnetcatモードでもいいっす。

###必要な物
* tar
* ssh
* gzip
* cat
Google Cloud Platformのプロモーションコードの有効化

# 初めに
Google Cloud Platformの500$プロモーションコードの有効化までの記録

# コードの入手

プロモーションの申込用コード、イベント参加特典として配布されているようです。

2014/4/22開催 gcp ja night #27
http://connpass.com/event/5769/


# Starter Pack 申込

Starter Pack に申込を行います。

Google Cloud Platform Starter Pack — Google Cloud Platform
https://cloud.google.com/developers/starterpack/

# クレジットコード受取

クーポンコードと登録用URLが記載されたメール、Starter Pack 申込の翌日位にGoogleから届きます。

![0423-1.png](https://qiita-image-store.s3.amazonaws.com/0/39112/3b571b61-cee5-17d7-57a4-082a0d4f45fc.png)



# コード登録
## Googleアカウントでログイン

Googleアカウントで、Developers Console へログインします。
プロジェクトは課金を有効とし、クレジットカード登録を実施しておきます。

https://console.developers.google.com/project

## コード登録

Googleアカウントにログイン済みのブラウザで、到着したメールの「Redeeam now」、もしくはURLのコピー&ペーストでリンク先を開きます。

```
Redeem Now 
https://console.developer.google.com/billing/redeem#**********
```

コードが有効である場合、試用条件を満たすプロジェクトを指定し、適用を行います。

![0423-2.png](https://qiita-image-store.s3.amazonaws.com/0/39112/229e5182-4698-f7cb-6bd1-fd02e148806c.png)


# 確認

数時間後、Developers Console の課金→アカウント→クレジットにて、プロモーションコードが反映され、GCPの課金に利用されます。

![0423-4.png](https://qiita-image-store.s3.amazonaws.com/0/39112/96911c1e-5b8b-9c15-9718-4a0a8f440fbb.png)


# 感想

他社と比較しても太っ腹な試用枠、ありがたく試用させて頂きたいと思います。

* Microsoft Azure: 200$利用権、1ヶ月
* AWS: t1.micro 1年分 (17.5$×12+α)
* IBM SoftLayer: スモール相当サーバ1台を1ヶ月(29$相当)

ただ、コード登録完了までに戸惑う点もありました。プロモーションコードが2種類、申請用と、課金相殺用となっている点や、トップページからは辿れないページでの手続き等、何らかの案内があればより敷居が下がるように思えました。
outlook.comのキーバインド選択

デフォルトのキーバインドだと、`j`で迷惑メールに登録になる。

![スクリーンショット 2014-04-24 12.10.28.png](https://qiita-image-store.s3.amazonaws.com/0/25728/69fbe458-3bd2-65bc-3ee0-93dcc52064e3.png)

gmailに変更すれば`j`,`k`で移動できる。

![スクリーンショット 2014-04-24 12.10.13.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ebc78d92-a272-61b4-a8a7-dfb3aedb9cc1.png)
MacOS X の Mavericks (10.9)  で Sites ディレクトリを使って localhost をアカウント別に利用する方法

MacOSはMavericksだとWeb共有が環境設定に表示されなくなったり、 Sites ディレクトリがなくなったりします。

![Screen Shot 2014-04-24 at 12.07.35.png](https://qiita-image-store.s3.amazonaws.com/0/18705/3e2183a7-d256-3e38-e841-abb2e3b193d8.png)


localhostを使って開発したいときは、とりあえず、ターミナルから apache を立ち上げたら大丈夫です。

```shell-session
$ sudo apachectl start
```

### 問題点

Apacheを起動すると、http://localhost/をブラウザで開けるようになる。
http://localhost/ で閲覧できる中身は /Library/WebServer/Documents/ に配置されています。これをシステムルートと呼びます。
でも、このディレクトリのownerはrootになっているので、なにかと使い勝手が悪い。
複数ユーザが一つのPCを使っているときには、confの影響が他のユーザに及ぶのも好ましくない。
できれば ユーザーディレクトリのSitesを使いたい。

## アカウント別に設定する

**個々のユーザー毎にSitesディレクトリを作って、設定ファイルをを作成し、apacheに反映させて、 http://localhost/~USERNAME/ で、~/Sites/ 以下のファイルを閲覧できるようにします。**

### ユーザーディレクトリを有効にする

/etc/apache2/httpd.conf の以下の2箇所の行のコメントアウトを外します。先頭に#が入っていると思うので、その#を削除します。

```rb
$ sudo vi /etc/apache2/httpd.conf
```

1.

```html+myghty
# 以下の行のコメントアウトを外します。
LoadModule userdir_module libexec/apache2/mod_userdir.so
```

2.

```html+myghty
# 以下の行のコメントアウトを外します。
# User home directories
Include /private/etc/apache2/extra/httpd-userdir.conf
```

### ユーザー名の確認

```rb
$ whoami
```

このコマンドで表示されるはずです。


### ユーザーごとの設定ファイルを作成

```shell-session
$ sudo vim /etc/apache2/users/username.conf
```

```apache
<Directory "/Users/username/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
```

### ユーザー毎のSitesディレクトリを作成してapacheを再起動

```shell-session
$ mkdir ~/Sites
$ sudo apachectl configtest
$ sudo apachectl restart
```

この流れで大丈夫だと思います。
以下にアクセスしたら、表示されるはず。

![Screen Shot 2014-04-24 at 12.06.36.png](https://qiita-image-store.s3.amazonaws.com/0/18705/7443218e-a446-8e4f-c9cf-740fb28684c2.png)


```http
http://localhost/~username
```

あとは、Sites/ 以下にファイルを置いていって、そのURLにアクセスすれば見れるはずです。



## 全体を変更したい場合

[この記事](http://qiita.com/tsumekoara/items/2c467b85e7f5730478ab)がある程度参考になるかもしれません。
ロードバランサーKeepalivedで覚えておいたほうが良いコマンド

Keepalivedについては、ここ
http://www.keepalived.org/
を見ていただければわかるかと、まあ、L4 レベルのロードバランサーですね。

構築設定も大変めんどくさいのですが、運用もちょっとめんどくさいです。
突然の対応に困らないよう、設定ファイルをいじって再起動とかするよりコマンドで覚えたほうがちょっとかっこよく運用できます。

## 対象ノードの重みを変更する

たとえば1つのVIPに複数のノードがぶら下がっている構成だった場合、その内、一台の重みづけを変更するなんていうケースの場合は
いきなり、切り離すことはしないで少しづつ重みつけを減らしていって最終的に重みづけを0にして「実質切り離し完了」状態にしたほうが確実に切り離せます。

### コマンド

```
ipvsadm -e -t [VIPアドレス]:[ポート] -r [リアルアドレス] -g -w [重み]
``` 

#### 例 (MySQLの負荷分散を例に説明しております）

```
ipvsadm -e -t 192.168.0.231:3306 -r 192.168.0.2  -g -w 10
          ↓ 時間をおいて
ipvsadm -e -t 192.168.0.231:3306 -r 192.168.0.2  -g -w 5 
          ↓ 時間をおいて
ipvsadm -e -t 192.168.0.231:3306 -r 192.168.0.2  -g -w 1
          ↓ 時間をおいて
ipvsadm -e -t 192.168.0.231:3306 -r 192.168.0.2  -g -w 0

```

## 対象ノードを切り離す

上記で重みづけを0にして、かつ完全に切り離しの状態にしたい場合は、以下のコマンドを発行します

### コマンド

```
ipvsadm -d -t [VIPアドレス]:[ポート] -r [リアルアドレス]
```

#### 例

```
ipvsadm -d -t 192.168.0.231:3306 -r 291.168.0.2
```

## 設定を元に戻す

ノード追加のコマンドはあるにはあるのですが、設定後、上記も含めて、再起動もしくはリロードしてしまうと、一生懸命打ったコマンドが全部きえちゃうので、単純に設定を元にもどす際は、/etc/init.d/keepalived reload とかしたほうがいいと思う

### コマンドでノードを新規追加する方法

```
ipvsadm -a -t [VIPアドレス]:[ポート] -r [リアルアドレス] -g -w [重み]  
```

#### 例

```
ipvsadm -a -t 192.168.0.231:3306 -r 192.168.0.2  -g -w 100
```

### 設定ファイルを再読み込みして元に状態に戻す方法

```
/etc/init.d/keepalived reload
```

#### 例

```
/etc/init.d/keepalived reload
```

こんな感じで（なんか、GUIツールないのかな・・・）
【質問】データ型が「主従関係」の項目にコントローラで値を代入する

閲覧ありがとうございます。

データ型が「主従関係」である項目に
コントローラで値を代入するのは不可能でしょうか。

【名前リスト(NameList__c)】
・名前ID(自動採番) Name
・名前 UserName__c

【個人情報リスト(InfoList__c)】
・個人情報ID(自動採番) Name
・名前ID(主従関係：データ型はID) UserNameId__c
・年齢
・職業

こんなイメージです。
この個人情報リストの名前IDに値を自動で代入したいです。

それで

<code>InfoList__c.UserNameId__c = 代入したい値;</code>

といった式で「代入したい値」を色々変えて試しています。
今のところ、代入したい値を15桁のIDにすると
名前ID項目に正しく自動で値が代入されることだけは判明したのですが
その15桁のIDを呼び出す方法が分かりません。
（名前リストでの名前IDを頼りにして、個人情報リストの個人情報IDを自動入力したい）

説明が分かりづらくて申し訳ないのですが一応例です。

①　ページ１で名前リストの名前IDを選択する
（例えば、名前IDが"A000"の人を選択すると、String型で"A000"というパラメータが生成される）
②　ページ２に画面遷移し、個人情報リストの項目を入力する
（このときに名前IDにデフォルトで"A000"と入力されているようにしたい）
※上方にある「代入したい値」を、URL等に使われている「15桁のID」にするとそれが実現されることが確認済み。だが、この15桁のIDを名前IDを頼りに動的に取得したい。（単純に"A000"と代入して上手くいけば、ページ１で取得したパラメータを使うだけで良かったのだが・・・）

説明が下手で申し訳ありませんが、よろしくお願い申し上げます。
D3.jsを使って地図をcanvasに描画する


TopoJSONデータを読み込んで、地図をcanvasに描画します。

```js
//topojson（地理）データ読み込み
d3.json("ken.topojson", function(json) {
	draw(json);
});


function draw(json){
	//geoデータ
	var topo = json.objects.ken;


	//プロジェクション設定
	var projection = d3.geo
		.mercator()		//投影法の指定
		.scale(2000)	//スケール（ズーム）の指定
		.translate([500,450]) //表示位置調整
		.center([139.0032936, 36.3219088]); //中心の座標を指定

	
	//コンテキストを取得
	var context = d3.select("canvas")
		.attr({
			width:"900px",
			height:"900px",
		})
		.node().getContext("2d");
	
	//パスジェネレーターの生成	
	var path = d3.geo.path()
		.projection(projection)
		.context(context) //コンテキストを指定
		
		
	//canvasに地図を描画する
	path(topojson.feature(json, topo));
	context.stroke();
		
		
}
```


[example](http://shimz.me/example/d3js/geo_template/canvas/)