OmniAICreator/Qiita-1.07M huggingface dataset:
Rで条件付き分布の計算とベイジアンネットワークの描画

PRML演習8.3の通り、与えられた2値変数a,b,cの同時分布から、aとbが独立でなく、cのもとで条件付き独立であることを確認し、p(a,b,c)=p(a,b|c)p(c)=p(a|c)p(b|c)p(c)に対応するベイジアンネットワークを描画します。また、演習8.4の通り、同時分布がp(a,b,c)=p(a)p(c|a)p(b|c)とも因数分解できることを確認し、対応するベイジアンネットワークを描画します。

```
  a b p(a,b) p(a)p(b) p(a,b|c=0) p(a|c=0)p(b|c=0) p(a,b|c=1) p(a|c=1)p(b|c=1)
1 0 0  0.336   0.3552        0.4              0.4  0.2769231        0.2769231
2 0 1  0.264   0.2448        0.1              0.1  0.4153846        0.4153846
3 1 0  0.256   0.2368        0.4              0.4  0.1230769        0.1230769
4 1 1  0.144   0.1632        0.1              0.1  0.1846154        0.1846154
  a b c     p p(a|c)p(b|c)p(c) p(a)p(c|a)p(b|c)
1 0 0 0 0.192            0.192            0.192
2 0 0 1 0.144            0.144            0.144
3 0 1 0 0.048            0.048            0.048
4 0 1 1 0.216            0.216            0.216
5 1 0 0 0.192            0.192            0.192
6 1 0 1 0.064            0.064            0.064
7 1 1 0 0.048            0.048            0.048
8 1 1 1 0.096            0.096            0.096
```

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/uB2pspE7I6/17.ConditionalIndependence.png)

```r
library(igraph)
frame()
set.seed(0)
par(mfcol=c(1, 2))
par(mar=c(0, 0, 1, 0))

d <- data.frame(matrix(c(
	0, 0, 0, 192,
	0, 0, 1, 144,
	0, 1, 0, 48,
	0, 1, 1, 216,
	1, 0, 0, 192,
	1, 0, 1, 64,
	1, 1, 0, 48,
	1, 1, 1, 96
	), ncol=4, byrow=T))
names(d) <- c("a", "b", "c", "p")
d$p <- d$p / 1000

# p(a,b)
dab <- data.frame()
for (a in 0:1) {
	for (b in 0:1) {
		pa <- sum(d[d$a == a,]$p) # p(a)
		pb <- sum(d[d$b == b,]$p) # p(b)
		dab <- rbind(dab, c(
			a, 
			b, 
			sum(d[d$a == a & d$b == b,]$p), 
			pa * pb
			))
	}
}
names(dab) <- c("a", "b", "p(a,b)", "p(a)p(b)")

# p(a,b|c)
for (a in 0:1) {
	for (b in 0:1) {
		for (c in 0:1) {
			pc <- sum(d[d$c == c,]$p) # p(c)
			pabc <- sum(d[d$a == a & d$b == b & d$c == c,]$p) / pc
			dab[dab$a == a & dab$b == b, paste0("p(a,b|c=", c, ")")] <- pabc
			pac <- sum(d[d$a == a & d$c == c,]$p) / pc # p(a|c)
			pbc <- sum(d[d$b == b & d$c == c,]$p) / pc # p(b|c)
			dab[dab$a == a & dab$b == b, paste0("p(a|c=", c, ")p(b|c=", c, ")")] <- pac * pbc
		}
	}
}
print(dab)

# p(a,b,c)=p(a|c)p(b|c)p(c)
for (i in 1:nrow(d)) {
	pc <- sum(d[d$c == d[i,]$c,]$p) # p(c)
	pac <- sum(d[d$a == d[i,]$a & d$c == d[i,]$c,]$p) / pc # p(a|c)
	pbc <- sum(d[d$b == d[i,]$b & d$c == d[i,]$c,]$p) / pc # p(b|c)
	d[i,"p(a|c)p(b|c)p(c)"] <- pac * pbc * pc
}
g1 <- graph(c(3, 1, 3, 2))
V(g1)$size <- 100
V(g1)$label.cex <- 2
V(g1)$label <- letters[1:3]
plot(g1, layout=layout.circle)
title("p(a|c)p(b|c)p(c)")

# p(a,b,c)=p(a)p(c|a)p(b|c)
for (i in 1:nrow(d)) {
	pa <- sum(d[d$a == d[i,]$a,]$p) # p(a)
	pc <- sum(d[d$c == d[i,]$c,]$p) # p(c)
	pca <- sum(d[d$c == d[i,]$c & d$a == d[i,]$a,]$p) / pa # p(c|a)
	pbc <- sum(d[d$b == d[i,]$b & d$c == d[i,]$c,]$p) / pc # p(b|c)
	d[i,"p(a)p(c|a)p(b|c)"] <- pa * pca * pbc
}
g2 <- graph(c(1, 3, 3, 2))
V(g2)$size <- 100
V(g2)$label.cex <- 2
V(g2)$label <- letters[1:3]
plot(g2, layout=layout.circle)
title("p(a)p(c|a)p(b|c)")

print(d)
```
【OSC2013 Spring】今さら聞けないHTML5とwebplatform.org


## すまん！！

日本HPの中の人と盛り上がりすぎちゃって最初の5〜10分くらい聞けなかった

## 実装状況

各ブラウザの実装状況
http://caniuse.com

まだ未実装な機能もたくさんある

## HTML5の使用例

### DTDが廃止され<!doctype html>と書けば良くなった

#### 対応されてない場合

html5shivとかで対応

###  video

* youtubeなどで使用されている
* Codec
 * h.264/webm/ogg 現実的にはh.264
 * firefoxでもcodecが入っていたら動作する
* subtitleをいれる事ができる

## CSS3

### box-shadow

値は横のずれ、たてのズレ、ぼかし具合、影の拡張具合、色

### text-shadow

値は横のずれ、たてのズレ、ぼかし具合、色

### border-radius

borderの過度を丸めるプロパティ

http://docs.webplatform.org/wiki/css/properties/border-radius

### Gradients

線形に変化する (linear-gradient)
始点と終点を指定する

### CSS Selectors

新しいcssセレクタが追加された

* Selector:E:nth-child(n)
 * 親要素のn板目の子要素

* Selector:E:enabled/disabled
 * 有効無効
* Selector:E:not(s)
 * sでない要素

### New Input Types

* HTML5で導入された新しいinputタイプ

### FullScreen API

* 指定した要素を全画面表示にするAPI

### HTML5で廃止

* acronym
* applet
* basefont
* big
* center
* dir
* font
* frame
* frameset
* isindex
* noframes
* s
* strike
* tt
* u

etc…

## HTML5.1

* 勧告候補となったHTML5と比べるとと機能が少ない
* 勧告候補と同時にHTML5.1の策定が開始
* AppCache v2, < template >, < main >' などなど

## Validator

w3c validator

## 最新情報参照先

W3C + 関連企業・団体(Google, Mozilla, Opera etc) = webplatform.org

http://webplatform.org

## ご協力を

* コンテンツ
* 翻訳
* フィードバック
 * 日本語MLあるって
【OSC2013 Spring】超入門！OSSでシステム統合監視~Hinemos,Zabbixの機能と選択のポイント~

OSC2013 Springで受講した時のメモです。

## 監視ツールのまとめ

http://it.impressbm.co.jp/e/2012/05/15/4331
(記事削除されてるみたいです。2014/05確認)

当日の資料見つけました(｀･ω･´)ゞ (2014/05追記)
http://www.sraoss.co.jp/event_seminar/2012/20121120_Zabbix-Hinemos_seminar_sraoss.pdf

## Hinemos

* 開発：NTTデータ -> データの視覚化
* 監視画面：専用GUIクライアント
* サーバ：JBOSS
* 設定：専用GUI
* データ保存：PostgreSQL
* ジョブ管理機能があるのが特色 -> エージェント
* 国産
* 有償オプション・パートナーが充実

### Hinemosエージェント

* ジョブ実行
* ログ監視
* コマンド監視

### 設定の流れ

+ リポジトリにホストを設定
+ 情報の通知先を設定
+ ジョブ管理

設定はGUIから選択
選択の一括インポートはUtilityオプション利用で可能

### 導入にあたって
* 設定がシンプル
* すべて日本語
* 設定項目が単純だと楽
* マネージャと監視対象機器のネットワーク疎通は必須
* マネージャが監視項目を直接取りに行く
* グラフ機能の加工ができない
* Web上での情報が少ない

## Zabbix

* Webブラウザで操作
* データ保存はRDBS
* 軽量
* 対応プラットフォームが多い
* Zabbixプロキシを設置すると拠点を分散しててもOK
* APIを標準搭載
* テンプレートの一括import/export

### Zabbix HA化

Pacemaker/HeartbeatでActive-Standby構成とか

### Zabbix エージェント

* パッシブチェック
* アクティブチェック

### 設定の流れ

+ ホストを監視サーバに登録
+ 監視項目を設定。DBに指定のデータが蓄積
+ テンプレートの設定

設定はCUI
監視はGUI

### 導入にあたって

* httpd,php,DBを個別にセットアップ
* インターフェイスは直感的。ホスト-アイテム-トリガー
* プロキシによる分散管理、障害発生時の実行内容をスクリプト作成で対応できる
* WEBで多くの情報を取得可能
* キー、トリガーの書き方を覚える必要がある

### どっちを使う？

どっちかって決めなくてもいいかも
合わせて使うのも可
ハッシュ関数

文字列、数字などからある16進数の値（ハッシュ値）を導く関数のこと。

* MD5で導くハッシュ値

```Shell
% echo hello | openssl md5
b1946ac92492d2347c6235b4d2611184
```
	
* SHA-1で導くハッシュ値

```Shell
% echo hello | openssl sha1
f572d396fae9206628714fb2ce00f72e94f2258f
```
##MD5とSHA-1の違い

* MD5:ハッシュ値が128bit
* SHA-1:ハッシュ値が160bit
		
## その他のハッシュ関数

* md4
* md5 
* mdc2
* md160
* sha             
* sha1
ポップアップメニュー


```objectivec:
IBOutlet NSMenuItem* item1;
IBOutlet NSMenuItem* item2;
IBOutlet NSMenuItem* item3;
IBOutlet NSMenuItem* item4;

if ([item1 state]) {                        // item1を選択済み
        str3 = [str1 stringByAppendingString:str2];
        [textView3 setString:str3];
    } else if ([item2 state]) {                 // item2を選択済み
        
    } else if ([item3 state]) {                 // item3を選択済み
        str3 = [str1 stringByReplacingOccurrencesOfString:@"入力" withString:@"出力"];
        [textView3 setString:str3];
    } else {                                    // item4を選択済み
        str3 = [str1 stringByAppendingFormat:@"に含まれる文字数は%ld文字です。\n", [str1 length]];
        str3 = [str3 stringByAppendingString:[str2 stringByAppendingFormat:@"に含まれる文字数は%ld文字です。", [str2 length]]];
        [textView3 setString:str3];
    }
```
[Vuforia AR] Adding self made target

iOS用のVuforiaのAR SDKを使っていて自分で作ったターゲットが全然機能せずはまったのでメモ。

当初こんな感じで書いていた

```ImageTargetsAppDelegate.mm
    // Provide a list of targets we're expecting - the first in the list is the default
    [qUtils addTargetName:@"Stones & Chips" atPath:@"StonesAndChips.xml"];
    [qUtils addTargetName:@"Tarmac" atPath:@"Tarmac.xml"];
    [qUtils addTargetName:@"MyTarget" atPath:@"MyTarget.xml"];
```

でもこれだと最初の２つしか認識してくれない。
ところが以下で試してみると、うまくできた。

```ImageTagetsAppDeleagate.mm
    // Provide a list of targets we're expecting - the first in the list is the default
    [qUtils addTargetName:@"MyTarget" atPath:@"MyTarget.xml"];
//    [qUtils addTargetName:@"Stones & Chips" atPath:@"StonesAndChips.xml"];
 //   [qUtils addTargetName:@"Tarmac" atPath:@"Tarmac.xml"];
```

Targetの追加できる数とか限られていて、もしTargetを追加たければxmlに追記しろということなのかと思っている。ここら辺の数の制限とかも調べたい。
でもとりあえず、

僕はTargetを一つしか使うつもりはないので、これでも特に困らない。
（８） EC2にnginx経由のunicorn｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins 


##その８｜nginx経由でunicorn


###１．これまでの目次

1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/items/14afe3712ff43a01da69)
3. [（３）EC2にrvm+rubyインストール](http://qiita.com/items/35ab6c6e6750110dc621)
4. [（４）EC2にrailsインストール](http://qiita.com/items/296aa3af986b4bffe7d8)
5. [（５）EC2にrails起動テスト](http://qiita.com/items/978bc6e2a53450be90f1)
6. [（６）EC2にunicorn準備](http://qiita.com/items/7ee7fa53b0066dd274a6)
7. [（７） EC2にnginx準備](http://qiita.com/items/12325db56282a6e3a79d)

※[参考サイト｜プログラミングノート](http://d.hatena.ne.jp/ntaku/20111112/1321093327)

###２．nginx設定
とりあえず、いろいろと環境ややりたい事によって分割したりすると思いますが、動作の仕組みとして、こんな感じになる。

* upstream  
  今回はunicornでunixソケットを使う事にしている（httpソケットも選択出来る）。このソケットがunicorn入り口になるので、それを定数unicorn_appとして定義

* server/locationディレクティブでserver_name _;としているところは、とりあえず全てのFQDNに対応する意味。httpプロトコル80番ポートで上記したunicornソケットへプロキシさせる。

```/etc/nginx/nginx.conf

user nginx;
worker_processes 1;

pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log;

events {
  worker_connections 1024;
}

http {

  include mime.types;
  default_type  application/octet-stream;

  access_log /var/log/nginx/access.log;
  sendfile on;
  keepalive_timeout  65;

  upstream unicorn_app {
   server unix:/tmp/unicorn.sock;
  }

  server {
    listen 80;
    server_name _;
    location / {
      proxy_pass  http://unicorn_app;    
    }
  }
}
```

###3．動作確認
rails project rootにcdし、unicornを実行後、nginxを起動し、
ブラウザで確認。railsアプリの画面が出ればOK

```
cd /work/sample/
unicorn -c config/unicorn.rb -D
/etc/rc.d/init.d/nginx start
```
XcodeをEmacs風に操作する

##Xcodeは不便
普段EmacsやVimを使っているiOSプログラマは、Xcodeのエディタとしての機能の貧弱さに不便を感じると思います。

[Emacs で iPhone アプリ開発を快適にするための設定](http://sakito.jp/emacs/emacsobjectivec.html)のように外部エディタとしてEmacsを使う手もありますが、
Xcodeとウィンドウを行ったり来たりしなければならず、イマイチです。
あと、EmacsにObjective-Cのための設定をするの、正直面倒ですよね。

##XcodeをEmacs風に操作したい
そこで、XcodeをなんとかしてEmacs風に操作する道を考えます。
XcodeもCocoaアプリなのでEmacsのキーバインドが一部デフォルトで使え、
なおかつ、設定をすれば単語単位の移動や削除も行えます。

ここまでは、素のXcodeでできることですので、すでにやっている前提で話を進めます。
私がこの記事を書くほど改善したかったのは、以下の２点でした。

・XcodeのSet Markによりリージョン選択をするとどこを選択してるのかわかりにくい
・行移動にC-uによる繰り返しを使いたい

Xcodeにもマークを置く機能が付いているのですが、選択領域が反転されないので、
どこを選択しているのかよくわからなくて不便です。

また、キーボードのみで16行カーソルを上に動かしたいとき、素のXcodeだとC-pを16回連打するか、行指定移動をすることになります。
行数を読むのは直感的でないので、私は大幅に行移動をするときはマウスを使っていました。
EmacsだとC-u, C-u, C-pでできますね。

##どうすればいいの？
[KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html.ja)を使いましょう。
KeyRemap4MacBookは大変便利なユーティリティで、多くのMacユーザーはすでに使っていることかと思います。
Emacs Modeの設定はEmacsやTerminal以外でのみ有効になるキーバインドで、重宝します。

上で上げた２つを実現するための設定は、

・[ex] User Control+Space as MarkSet
・[このprivate.xml](https://github.com/tekezo/Files/blob/master/KeyRemap4MacBook/private.emacsmode_control_u/private.xml)を追加した後、Enable Control-u

Enable Control-uは開発者のtekezoさんに教えて頂きました。
私がよく使うC-u,C-p(n)とC-u,C-u,C-p(n)だけリクエストしたためここにはその4種類しかありません。
また、Xcodeで使う分には問題ないので、私はKeyCode::VK_WAIT_10MSを取り除いて使っています。
そのうちアップデートによりデフォルトで使えるようになると思います。

他にEmacsで使える機能だと矩形選択が心残りですが、たまに使う程度なのでよしという感じです。
MeCab解析済みの結果を読み取るcorpus readerを書いた


勉強のためにmhagiwaraさんが書かれていた[chasen.py](https://github.com/nltk/nltk/blob/master/nltk/corpus/reader/chasen.py)を真似して[mecab.py](https://github.com/tma15/text/blob/master/src/mecab.py)を書いた。

## mecab.py

NLTKとnltk_dataがインストール、ダウンロード済みであることが前提。
データは``nltk_data/corpora``以下へ置いておくか、シンボリックリンクを作成する。

``` python
import nltk
corpora_path = nltk.data.find('corpora/test')
"""
your data must be stored or linked in nltk/corpora
"""

fileids = r'.*\.mecab'
"""
:param corpus name: regular expression or list of corpus name.
:type corpus: list or strings
"""

reader = MeCabCorpusReader(corpora_path, fileids, encoding='utf8')
print reader.raw()
print ', '.join(reader.words())
for w, t in reader.tagged_words():
    print w, t
for para in reader.paras():
    for sent in para:
        for word in sent:
            print word
for para in reader.tagged_paras():
    for sent in para:
        for (word, pos) in sent:
            print word, pos   
```

``corpora/test``はMeCab解析済みのファイルを含むディレクトリで、拡張子がmecabとなっている。
ファイルの中身はこんな感じ。

```
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

出力は

```
raw()
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

words()
すもも, も, もも, も, もも, の, うち

tagged_words()
すもも info: 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も info: 助詞,係助詞,*,*,*,*,も,モ,モ
もも info: 名詞,一般,*,*,*,*,もも,モモ,モモ
も info: 助詞,係助詞,*,*,*,*,も,モ,モ
もも info: 名詞,一般,*,*,*,*,もも,モモ,モモ
の info: 助詞,連体化,*,*,*,*,の,ノ,ノ
うち info: 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

paras()
すもも
も
もも
も
もも
の
うち

tagged_paras()
すもも info: 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も info: 助詞,係助詞,*,*,*,*,も,モ,モ
もも info: 名詞,一般,*,*,*,*,もも,モモ,モモ
も info: 助詞,係助詞,*,*,*,*,も,モ,モ
もも info: 名詞,一般,*,*,*,*,もも,モモ,モモ
の info: 助詞,連体化,*,*,*,*,の,ノ,ノ
うち info: 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
```
Russian乗算のプログラム


```c:russian.c
#include <stdio.h>

int Russian (int x, int y){
    int m;
    
    if (x % 2 != 0) {
        m = y;
    } else {
        m = 0;
    }
    
    while (x != 1) {
        x = x / 2;
        y = 2 * y;
        if (x % 2 != 0) {
            m = m + y;
        }
    }
    
    return m;
}

int main(int argc, const char * argv[])
{
    int a = 36, b = 17, result = Russian(a,b);
    printf("%d × %d = %d\n",a, b, result);
    return 0;
}
最大公約数の計算を行うプログラム


```c:euclid.c
#include <stdio.h>

int Euclid (int m, int n) {
    int r = m % n;
    while (r != 0) {
        m = n;
        n = r;
        r = m % n;
    }
    return n;
}

int main(int argc, const char * argv[]) {
    int a = 544, b = 119, result = Euclid (a, b);
    printf("Euclid (%d, %d) = %d\n",a, b, result);
    return 0;
}
```
（７） EC2にnginx準備｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins 


##これまでの目次
1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/items/14afe3712ff43a01da69)
3. [（３）EC2にrvm+rubyインストール](http://qiita.com/items/35ab6c6e6750110dc621)
4. [（４）EC2にrailsインストール](http://qiita.com/items/296aa3af986b4bffe7d8)
5. [（５）EC2にrails起動テスト](http://qiita.com/items/978bc6e2a53450be90f1)
6. [（６）EC2にunicorn準備](http://qiita.com/items/7ee7fa53b0066dd274a6)

##その７｜nginx準備

###１．インストール

```
yum -y install nginx
```

###２．動作確認

```
sudo /etc/rc.d/init.d/nginx start
```

ブラウザでアクセスしてnginxの画面が出る事を確認したら、
ストップ

```
sudo /etc/rc.d/init.d/nginx stop
```
（６）EC2にunicorn準備｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins


##これまでの目次
1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/items/14afe3712ff43a01da69)
3. [（３）EC2にrvm+rubyインストール](http://qiita.com/items/35ab6c6e6750110dc621)
4. [（４）EC2にrailsインストール](http://qiita.com/items/296aa3af986b4bffe7d8)
5. [（５）EC2にrails起動テスト](http://qiita.com/items/978bc6e2a53450be90f1)


##その６｜unicorn準備

###１．インストール

```
gem install unicorn
```

###２．設定ファイル

動作確認程度なので、railsRoot/config/にunicorn.rbとして、

```unicorn.rb
listen '/tmp/unicorn.sock'
pid '/tmp/unicorn.pid'
```

###３．動作確認

```
unicorn -c config/unicorn.rb -p 80
```
cocos2d-xでsqlite3を使う方法


初投稿です。cocos2d-xでsqlite3を使えないか調べていたら
ブログで発見したので自分で試したらうまく動いてくれたので忘却防止の為、投稿します。

##準備
sqlite3.hヘッダーファイルをインクルードします。

```c++:HelloWorldScene.cpp
#include "sqlite3.h" 
```

##テーブルの作成
```c++:HelloWorldScene.cpp

    // SQLITE3
    sqlite3 *pDB = NULL;
    char* errMsg = NULL;
    std::string sqlstr;
    int result;
    std::string dbPath = CCFileUtils::sharedFileUtils()->getWriteablePath();
    dbPath.append("Test.db");
    result = sqlite3_open(dbPath.c_str(),&pDB);
    if (result != SQLITE_OK){
        CCLOG("OPENING WRONG, %d, MSG:%s",result,errMsg);
    }else{
        CCLOG("OK! %d, %s",result,errMsg);
    }
    
    // 読み書きファイルパスの表示
    CCLog("%s",dbPath.c_str());
    
    result=sqlite3_exec( pDB, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) ) " , NULL, NULL, &errMsg );
    if( result != SQLITE_OK )
        CCLog( "失敗　:%d ，原因:%s\n" , result, errMsg );
    
    //insert
    sqlstr=" insert into MyTable_1( name ) values ( 'いちご' ) ";
    result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg );
    if(result != SQLITE_OK )
        CCLog( "失敗　:%d ，原因:%s\n" , result, errMsg );
    
    //insert
    sqlstr=" insert into MyTable_1( name ) values ( 'ぶどう' ) ";
    result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg );
    if(result != SQLITE_OK )
        CCLog( "失敗　:%d ，原因:%s\n" , result, errMsg );
    
    //insert
    sqlstr=" insert into MyTable_1( name ) values ( 'ばなな' ) ";
    result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg );
    if(result != SQLITE_OK )
        CCLog( "失敗　:%d ，原因:%s\n" , result, errMsg );
    
    sqlite3_close(pDB);
```
pjaxしたくていろいろ試したけどダメだった…



[pjaxとflagmentの使い方（静的サイトでも手軽にpjax！）](http://chibinowa.net/notebook/js/pjax-fragment.html)

これ読んだけどよくわからん…


# sinatra で pjax

この説明がよさげ
[Sinatra をインストールし，使ってみる](http://www.kkaneko.com/rinkou/rubydb/sinatra.html)

これによるとpjax公式がherokuのサンプルがあるとのこと
[pjax！そういうのもあるのか！](http://blog.udzura.jp/2011/08/30/pjax-sinatra-sample/)
[defunkt/jquery-pjax at heroku · GitHub](https://github.com/defunkt/jquery-pjax/tree/heroku)

こちらはjquery-pjaxではない模様
[sinatraとbackbonejsでpjax(pushState + Ajax)してみた](http://kazu69.net/blog/tec/1129)


# express で pjax
[Express + jQueryでpjaxを使う](http://firn.jp/2011/11/25/express-pjax)


# php で pjax

[history.pushStateの話](http://d.hatena.ne.jp/slowbirds/20120222)

```
#mod rewrite
RewriteEngine on
RewriteBase /
RewriteRule ^([a-zA-Z_0-9]+)/?$ /?page=$1
```

[PHPでpjaxる](http://blog.5v-gnd.net/archives/904)

[[PHP & CoffeeScript] Pjaxでロード](http://make-audio.blogspot.jp/2012/12/php-coffeescript-pjax.html)

[Backbone.jsのpjaxを試してみた](http://blog.sus-happy.net/201212/backbone-js-pjax/)


# JSのみ

これだ！

…だめだうごかない、、、、

[ノンサーバーサイドでpjaxを使う](http://loftimg.hateblo.jp/entry/2012/10/05/131136)


あ、これだ！！！
これもダメだ…

> pjax - jquery.pjax.js
> HTML5による高速なページ移動機能をウェブサイトに実装するプラグインです。
> 
> ドキュメント：http://sa-kusaku.sakura.ne.jp/output/pjax/> ァイル：https://raw.github.com/falsandtru/> jquery.pjax.js/master/jquery.pjax.js
GitHub：https://github.com/falsandtru/jquery.pjax.js


# 結論

やりたいことが複雑だったようで、頭しゃきっとしてる時にちゃんとやり直す、、、

やりたいこと：**外部サイトをあたかも自サイトかのように読み込んで表示したい**
- プロキシかます（スクレイピング）
- ajaxでプロキシにリクエスト（pjax）

とにかくサーバーサイドの言語を何にするかってことだ。
たぶんテンプレートエンジンいれるのが一番近道なのかもしれない。でも入れないでやるミニマルな方法も試したい。
CocoaPods環境下でJenkinsを利用する


CocoaPodsを利用しているプロジェクトでJenkinsを使ったテストを行いたかったのでメモ
前提としてXcodeのバージョンは4.5.2を使用、テストフレームワークは`SenTestingKit`を利用する場合になります。（Kiwi等含む）

1.テスト用のスキーマの追加
---
`xcodebuild`はworkspaceが対象の場合、targetオプションを同時に指定できないためスキーマを指定する必要がある

+ `Product -> New Scheme`からテスト用のターゲットを指定してスキーマを追加
![スクリーンショット](https://raw.github.com/sora0077/SampleProduct/master/ScreenShot/s-shot0.png)

+ `Product -> Edit Scheme`から追加したスキーマを実行できるように変更
![スクリーンショット](https://raw.github.com/sora0077/SampleProduct/master/ScreenShot/s-shot1.png)

+ `Product -> Manage Schemes`から`Shared`オプションをオンにする。（スキーマ設定をxcuserdataからxcshareddataへ移動）
スキーマをgit管理に加える
`git add SampleProduct.xcodeproj/xcshareddata/xcschemes/SampleProductTests.xcscheme`


2.Jenkinsのジョブの設定
---
以下のプラグインを予めインストールしておく

* CocoaPods Jenkins Integration
* Jenkins GIT plugin
* XCode integration

Xcodeのビルド設定は以下のように指定
![スクリーンショット](https://raw.github.com/sora0077/SampleProduct/master/ScreenShot/s-shot3.png)

----------
ここまででJenkinsのビルド実行を行うとビルドが出来るようになっているはずです。
ただテストはスキップされてしまっているので続けて以下の設定を行います。

*Jenkinsでの初回ビルドはworkspace内のschemeを認識できないので必ず失敗します。
そのため一度は手動で`SampleProduct.xcworkspace`を立ち上げる必要があります。（一度開いたらもう閉じても問題ありません。）*


3.テストを実行するためのセットアップ
---
* ios-simのインストール


```
brew install ios-sim
```
でインストール可能
 
次に、Xcodeプロジェクトのテストターゲットの`Build Phases`の`Run Script`を以下の通り変更

```diff
 # Run the unit tests in this test bundle.
-"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"
+"${PROJECT_DIR}/Scripts/run_tests.sh"
```
[run_tests.sh](https://github.com/urbanairship/ios-library/blob/master/run_sim_app_tests.sh)をダウンロードし、${PROJECT_DIR}/Scripts/に保存

Kiwiを利用している場合は、run_test.shを以下の通り変更

```diff
 # Test the log output for test case failure. If this line is present, exit 1
-if egrep "Test Case '-\[[[:alnum:]]+[[:space:]][[:alnum:]]+\]' failed" ${test_logfile}
+if egrep "\[FAILED\]" ${test_logfile}
```

これで再度ビルド実行を行うとテストまで含めて実行されると思います。


参考
---

> http://axeman.in/blog/2012/12/02/setting-up-jenkins-ci-for-ios-development/
> https://github.com/urbanairship/ios-library/blob/master/run_sim_app_tests.sh
（５）EC2にrails起動テスト｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins


##これまでの目次
1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/items/14afe3712ff43a01da69)
3. [（３）EC2にrvm+rubyインストール](http://qiita.com/items/35ab6c6e6750110dc621)
4. [（４）EC2にrailsインストール](http://qiita.com/items/296aa3af986b4bffe7d8)


##その５｜railsアプリ起動テスト

###１．railsプロジェクト作成

```
sudo su -
mkdir /work
cd /work
rails new sample
```

**エラーその１**
openSSLがないと。
`You must recompile Ruby with OpenSSL support or change the sources in your Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL using RVM are available at rvm.io/packages/openssl.`

もう慣れましたね。

```
cd /usr/local/rvm/src/ruby-1.9.3-p385/ext/openssl
ruby extconf.rb
make
make install
```

**エラーその２**
sqlite3がないと。
`An error occurred while installing sqlite3 (1.3.7), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.7'` succeeds before bundling.`

**sqlite3ではないところがミソ**

```
yum install sqlite-devel
gem install sqlite3 -v '1.3.7'
```

###２．railsアプリ起動

```
cd sample
rails s
```

**エラー３**
JavascriptRuntimeがない。

execjsとtherubyracer

Gemfileをviで開いて、下記を追記

```
gem 'execjs'
gem 'therubyracer'

rails s
```

起動しました。3000ポートでブラウザから閲覧できれば良しです。

`http://address:3000`
UIRefreshControl tableHeaderViewを無視して配置する方法


UIRefreshControlをtableViewHeaderがあるUITableViewに追加すると上から
UIRefreshControl→tableViewHeader→tableView
の順番に配置されます。
(※ 別にcontentInsetのtopを設定した場合の値は、UIRefreshControlとtableViewHeaderの間になります。)
![ss1](http://f.cl.ly/items/1c1j321p2k2y0v0h0F1K/ss1.png)

これをtableHeaderViewを無視してUIRefreshControlを配置する方法です。
![ss2](http://f.cl.ly/items/3q1C2x3K1K2x39400520/ss2.png)

tableViewのスクロールに追尾する広告を表示したい時に使えると思います。(広告をUINavigationControllerのViewに配置して、talbeViewにダミーのtableViewHeaderを置き最上部のマージンをかせぐ)
![ss3](http://f.cl.ly/items/263q0O3t1I0q0T1j3m2P/ss3.png)
by [Falcon](http://bit.ly/FalconTwitter)

## 実装
サブクラスのlayoutSubviewdsで調整します。

```objectivec:YSRefreshControl.h
@interface YSRefreshControl : UIRefreshControl

- (id)initWithIgnoreTableHeaderView:(BOOL)ignore;
@property (nonatomic, getter = isIgnoreTableHeaderView) BOOL ignoreTableHeaderView;

@end
```
```objectivec:YSRefreshControl.m
@implementation YSRefreshControl

- (id)initWithIgnoreTableHeaderView:(BOOL)ignore
{
    if (self = [super init]) {
        self.ignoreTableHeaderView = ignore;
    }
    return self;
}

- (void)layoutSubviews
{
    // 有効かを確認
    if (self.ignoreTableHeaderView && [self.superview isKindOfClass:[UITableView class]]) {
        // UIRefreshControlの位置をtableHeadViewの最下部に合わせる
        UITableView *tableView = (id)self.superview;
        CGRect frame = self.frame;
        frame.origin.y = frame.origin.y + tableView.tableHeaderView.bounds.size.height;
        self.frame = frame;
    }
}

- (void)didMoveToSuperview
{
    /* UIRefreshControlは -didMoveTotSuperviewをOverrideしている
        [super didMoveToSuperview]を呼ばないとUIRefreshControlは有効にならない*/
    [super didMoveToSuperview];
    
    /* tableViewのcontentOffsetを初期位置を調整 */
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        UITableView *tb = (id)self.superview;
        if (self.ignoreTableHeaderView && [tb isKindOfClass:[UITableView class]]) {
            CGPoint offset = CGPointMake(
                                         0.f,
                                         tb.tableHeaderView.bounds.size.height);
            [tb setContentOffset:offset animated:NO];
        }
    });
}
```
## 使用方法
```objectivec:Sample.h
UIRefreshControl *refCon = [[YSRefreshControl alloc] initWithIgnoreTableHeaderView:YES];
[refCon addTarget:self action:@selector(refreshControlDidChange:) forControlEvents:UIControlEventValueChanged];
self.refreshControl = refCon;
```
UITableViewを行単位で更新する

UITableViewController等で「reloadRowsAtIndexPaths」を使う
withRowAnimationで更新時のアニメーションを設定

```objc:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}
```
Cassandra 12.xのaptリポジトリ追加

```sh
sudo sh -c 'echo "deb http://www.apache.org/dist/cassandra/debian 12x main" >> /etc/apt/sources.list.d/google.list'
gpg --keyserver pgp.mit.edu --recv-keys 4BD736A82B5C1B00
gpg --export --armor 4BD736A82B5C1B00 | sudo apt-key add -
```
（４）EC2にrailsインストール｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins


##これまでの目次
1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/items/14afe3712ff43a01da69)
3. [（３）EC2にrvm+rubyインストール](http://qiita.com/items/35ab6c6e6750110dc621)
<hr />


##その４｜railsのインストール

※[#3](http://qiita.com/items/35ab6c6e6750110dc621)までの環境設定が終了している前提です。

###１．railsのインストール
rails 3.2.11をインストールしてみます。

```
sudo su -
gem install rails -v 3.2.11
```

**エラー**

> It seems your ruby installation is missing psych (for YAML output).

###２．YAMLライブラリのインストール
[ここ](http://nacika.com/entry/2013/01/02/181311/)を参考に。

```
cd /usr/local/src
wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
tar xzvf yaml-0.1.4.tar.gz
cd yaml-0.1.4
./configure --prefix=/usr/local/
make
make install
```

ruby-1.9.3のソースディレクトリをfindで見つける。

```
find / -name ruby-1.9.3* -print
```

/usr/local/rvm/src/ruby-1.9.3-p385にあるようなので…

```
cd /usr/local/rvm/src/ruby-1.9.3-p385
cd ext/psych
ruby extconf.rb
make
make install
```

再度、railsのインストールに挑戦

```
gem install rails -v 3.2.11
```

**エラー**

> cannot load such file -- zlib

結論としてはAmazonLinuxでruby1.9.3環境を構築するには、以下のパッケージを予めインストールする。

```
yum -y install gcc
yum -y install make
yum -y install gcc-c++
yum -y install zlib-devel
yum -y install httpd-devel
yum -y install openssl-devel
yum -y install curl-devel
```

そして、YAMLの時と同様に、

```
cd /usr/local/rvm/src/ruby-1.9.3-p385/ext/zlib
ruby extconf.rb
make
make install
```

再度…

```
gem install rails -v 3.2.11
rails -v
```
できた！
シェルスクリプトでの排他処理


業務系のシステムでシェルスクリプトを使用している場合など、 多重起動の防止などで排他制御が必要な場合が多々あると思いますが、その様な場合に役に立つシンボリックリンクを利用したシェルスクリプトでの排他制御方法です。

ただし、あくまでもシェルスクリプトによる処理ですので、厳密な意味での排他制御にはなり得ないために タイミングによってはどうしても多重起動してしまう危険性がある事は考慮しておく必要があります。

この処理では自分自身のプロセス ID をロックファイルとしてシンボリックリンクして利用しているので、排他制御を実施したプロセス ID が簡単に確認できる様にするとともに、何らかの理由で不正にロックファイルが残ってしまった場合にプロセス ID を確認する事で簡単にリカバリ可能としています。

~~なお、プロセス確認のために /proc を参照しているので、 Linux など /proc が存在するシステムのみで利用可能となっていますが、 *ps* (1) などを利用してプロセスを特定すれば /proc が無いシステムでも利用可能だと思います。~~
指摘によりプロセス確認の方法を汎用的な方法に変更しました。

```sh:sample
# ロックファイル
lockfile=${TMP:-/tmp}/${0##*/}

# 多重起動防止のために symbolic link を作成する
# link が作成できたら trap を設定し終了時に link を自動削除する
# synbolic link が存在しても /proc/${PID} がない場合は
# ロックファイルが不正に残っていると判断し削除して処理を続行する
while true
do
    if ln -s $$ ${lockfile} 2> /dev/null
    then
        # ロック取得できた
        break
    else
        # ロックファイルが既に存在している場合
        # ロックファイルから作成元の PID を取得する
        if kill -0 `ls -l ${lockfile} | sed 's!.* !!g'` > /dev/null 2>&1
        then
            # プロセスが存在する場合
            echo "${0##*/}: exist another instance" 1>&2
            exit 1
        else
            # プロセスが存在しない場合はロックファイルを削除してリトライ
            rm -f ${lockfile}
        fi
    fi
done

# 終わる時は必ず lockfile を削除する
trap 'rm -f ${lockfile}; exit' 0 1 2 3 11 15

# 実際の処理
    :
```
gistをブログに貼付ける


例えば自分用の、[仕事中、一瞬の隙も見逃さずに情報収集するスクリプト](https://gist.github.com/ongaeshi/5071694)を貼付けたい時は。

(1) 左のサイドバーにある **Embed this gist** をコピー

```
<script src="https://gist.github.com/ongaeshi/5071694.js"></script>
```

(2) ブログ(はてなブログは上手くいった)に貼付け

こんな感じになります。

![](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130303/20130303011315_original.jpg?1362240803)

Qiitaでもgistを貼付けられるようにして欲しいなあ(Kobitoだと貼付けられる)
bitbucketからの自動デプロイ


gitでの話ですが、bitbucketにpushして自動でサーバにデプロイするまでの一連の流れをメモ
ネットで探すと見つかるのですが、ちょっとわかりにくかったので

開発初心者なのでいろいろよろしくないやり方も多いと思います
もしご指摘あれば頂けるとうれぴーです
こんなんでも誰かの役に立てばいいなと思いました

全体の流れとしては、
1. bitbucketにpush
2. (自動的に)bitbucketからサーバにPOST
3. PHPでPOST受けて、(自動的に)git pullする
って感じ

## 環境とか

下記の環境やら想定でやってます

* bitbucketでgitでコード管理している
* サーバ:さくらVPS 1Gプランのやつ
* サーバでgit,PHPが動く

## bitbucketの設定

1. ログインしたら、右上の方にある歯車アイコンをクリック
2. 左メニューの`Services`をクリック
3. 下のような画面になるので、プルダウンメニューから`POST`を選択し、`Add servise`ボタンをクリック
![](https://www.evernote.com/shard/s81/sh/d26a8580-baf2-4cc5-a4fc-966e065ae6ed/ef8b5d4e9d8033598a82869621a4c795/deep/0/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202013-03-02%2022.06.44.jpg)
4. すると画像のようにPOSTという項目が追加される
5. URLに`デプロイ先サーバのURL+deploy.php`を入力し`Save`

    例:http://yourdomain.com/deploy.php
    URLについては後で解説
    都合の良いものに変えちゃって下さい

この設定をすると、bitbucketにpushする度に指定したURLにPOSTしてくれます
ちなみに、今回は使っておりませんがPOSTの際に[こんな感じ](https://confluence.atlassian.com/display/BITBUCKET/POST+hook+management)のデータもやりとりしているので、もっといろいろやれそう

## サーバ側の準備

これが結構めんどかった
開発初心者なので、いい勉強になりました
ちょいちょい sudo -u apache というのを使っておりますが、
これは権限の管理をapacheユーザやるためですねー

>ここからはサーバコマンドライン
>sudo -u apache ssh-keygen

作成先は /var/www/.ssh/
pass phraseはなし
作成したid_rsa.pubをbitbucketの`Deployment keys`に追加
さっきの歯車アイコンのとこにあります

>サーバコマンドライン
>sudo -u apache git clone [自動デプロイしたいbitbucketのリポジトリ]

## サーバ側のプログラム

サーバ側にはPOSTを受け取り処理するPHPファイルを置きます

```php:deploy.php
<?php

if($_SERVER["REQUEST_METHOD"] != "POST"){
    // GETによるアクセス
}else{
    // POSTによるアクセス
    $cmd = '. /var/www/html/update.sh';
    $retstr = system($cmd, $res);
    $fp = fopen("deploy.log", "a");
    fwrite($fp, date('c')."\n");
    if ($retstr === FALSE || 0 !== $res) {
        fwrite($fp, "cmd false\n");
    } else {
        fwrite($fp, $res."\n");
    }
    fclose($fp);
}
?>
```

このPHPファイルでは下記の`/var/www/html/update.sh`を読み込んでます
git pullしてるだけです
現状だとどんなbranchがpushされてもgit pullします
特に触らなければbranchはmasterのままなので、masterが更新されたときだけWebには反映されます

```Bash:update.sh
#!/bin/sh
cd /var/www/html/[rep-name]
/usr/bin/git --git-dir=/var/www/html/[rep-name]/.git pull
```

## まとめ

とりあえずこれで、bitbucketにpushして自動的にサーバに更新を反映できます
超重要な注意点ですが、このまま使うと誰でもこのPHPにPOSTアクセスすると無条件にgit pullしちゃうという超危険な状態です
POST元がbitbucketのときだけgit pullするみたいな書き方しないとですね
(初心者なのでよくわからない)

デプロイって書いちゃいましたが、これはgitの更新だけですね^^;
アプリケーションだったら、app restart的な処理をupdate.shに書き加える必要があります
(現在nodeアプリ開発中ですが、うまくできない)

参考:[gitにpushしたwebサイトを自動的に同期させる](http://transrain.net/blog/2011/04/05/211200)
Mac上のrvmでruby 2.0.0を入れたらbundle installでOpenSSLのエラーが出る


`SSL_connect returned=1 errno=0 state=SSLv3 read server key exchange B: bad ecpoint (OpenSSL::SSL::SSLError)`

というエラーが出る。

Gemfileの

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

を

`source "http://rubygems.org"`

にすれば動くけどなんかすっきりしない…。

最終的には、

- 最新版のbrewにする
- opensslをbrewで入れる
- curl-ca-bundleをbrewで入れる
- RVMを消す

とやったらエラーが消えた。

以下、その時の手順。

```console:console
$ rvm implode
```

ターミナルを一旦落として再び起動

```console:console
$ CC=clang
$ brew update
$ brew -v
Homebrew 0.9.4

$ brew install openssl
$ brew link openssl --force
$ brew install curl-ca-bundle

$ curl -L https://get.rvm.io | bash
$ rvm -v

rvm 1.18.15 () by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]
```

必要なライブラリを確認してbrewで入れる

```
$ CC=clang rvm requirements
```

2.0.0のインストール

```
$ CC=clang rvm install 2.0.0 --with-openssl-dir=`brew --prefix openssl` --verify-downloads 1
```

とするとインストール環境。

そして、OpenSSLのエラーが消えた！
（３）EC2にrvm+rubyインストール｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins


##その３｜rvmとruby1.9.3のインストール

EC2-Userで行った。

##これまでの目次
1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/
<hr />

###１．rvmインストール

```
sudo bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
```

###２．ruby1.9.3のインストール
list knownでどんなものがあるかを確認してみる。
今回は、1.9.3-p385をインストールしてみる。

```
sudo su -
rvm list known
rvm install ruby-1.9.3-p385
```

> エラー｜
There has been an error while running configure. Halting the installation.  

  
エラーログを見ると
no acceptable C compiler found in $PATH

Cコンパイラが入っていないみたいなので、

```
sudo yum -y install gcc
```

再度rubyのインストール。

```
rvm install ruby-1.9.3-p385
```

…**再度エラー**。今度はmakeコマンドが入っていないと。

```
sudo yum -y install make
```

インストールコンプリート！
**Install of ruby-1.9.3-p385 - #complete**

```
ruby -v
rvm use 1.9.3-p385
```
> ruby 1.9.3p385 (2013-02-06 revision 39114) [x86_64-linux]
Xamarin.Android で PERMISSION を設定する


Xamarin.Android でプロジェクト作ると AndroidManifest.xml が見当たらない。
GPS使いたいんだけど権限設定どうしよう、と思ったらこうできました。

プロジェクトのオプションから、
!["option"](https://dl.dropbox.com/u/264530/qiita/xamarin_android_project_option.png)

ビルド→Android Application と来て、
!["add"](https://dl.dropbox.com/u/264530/qiita/xamarin_android_application_add.png)

Add すると権限などが設定できるようになります。
!["added"](https://dl.dropbox.com/u/264530/qiita/xamarin_android_application_created.png)

その後、おなじみ AndroidManifest.xml ができてました。
!["source"](https://dl.dropbox.com/u/264530/qiita/xamarin_android_androidmanifestxml.png)

Activity の設定はオートでやってくれるみたいなのでありません。
これでオレオレ Applocation クラスも動かせるのかなあ。。。
善用 `define_method`


`define_method` 可以帮助我们动态的，快速的定义多个方法；比如有这样一个类：

```ruby
class Post
  attr_accessor :title, :content, :state

  def initialize(title, content, state = :draft)
    @title, @content, @state = title, content, state
  end

  def draft
    @state = :draft
  end

  def posted
    @state = :posted
  end

  def deleted
    @state = :deleted
  end
end
```

`draft` `posted` `deleted` 分别用来把文章的状态设置为：_草稿_ _发表_ 和 _删除_ ，但是这三个方法看起来太类似了，而 `define_method` 就可以帮助我们优化这部分代码：

```ruby
class Post
  attr_accessor :title, :content, :state

  def initialize(title, content, state = :draft)
    @title, @content, @state = title, content, state
  end

  states = [:draft, :posted, :deleted]

  states.each do |state|
    define_method state do
      @state = state
    end
  end
```

这下就轻松多了吧！再来一个稍微复杂一点的例子，可以体现其灵活性：

```ruby
class Game
  attr_accessor :name, :year, :system

  SYSTEMS = ['SNES', 'PS1', 'Genesis']

  SYSTEMS.each do |system|
    define_method "runs_on_#{system.downcase}?" do
      self.system = system.downcase
    end
  end
end
```

那么，如何在目标方法之后传递参数呢？比如说代理一个 block？

```ruby
class Book
# 省略不相关代码

  [:each, :map, :select].each do |method|
    define_method method do |&block|
      books.send(method, &block)
    end
  end
end
```

方法体中之所以使用 `send` 方法，是因为在我们要重新定义的 `each` 方法里，books 需要委托数组方法 `each` 来处理 &block，而不是由 books 直接处理 &block；当然，其它两个方法也是这样的道理。最终 Ruby 帮我们生成的方法就是类似这样的：

```ruby
def each # 这是我们为 Book 类定义的 each 方法
  books.each(&block) # 这是委托数组的 each 方法来帮 books 处理传入的 &block
end
Alias Method


有时候我们需要两个不同名字的方法，但是其内部实现却是可能一样的。为了不重复我们的代码，我们可以用 `alias_method` 来复制方法以实现这一目的：

```ruby
Class Timeline
  def initialize(tweets = [])
    @tweets = tweets
  end

  def tweets
	@tweets
  end

  alias_method :get_timeline, :tweets
end
```

就像这样，我们“免费”获得了一个叫做 `get_timeline` 的新方法，其作用和 `tweets` 方法是一模一样的！

另外，上例还可以做一个小的优化：我们发现 `tweets` 方法实际上就是一个属性读取动作，所以我们可以把它简化成一个读取器：

```ruby
Class Timeline
  def initialize(tweets = [])
    @tweets = tweets
  end

  attr_reader :tweets

  alias_method :get_timeline, :tweets
end
```

这样的情形下，`alias_method` 一样可以发挥它的作用。

再看一个实用的例子，假设在上面的类中我们还有如下一个方法：

```ruby
# 省略上文相同代码

  def print
    puts @tweets.join('\n')
  end
end
```

后来我们觉得在输出之前最好能做一个验证，于是我们可以这样做：

```ruby
# 重新打开这个类

  alias_method :old_print, :print

  def print
    authenticate!
    old_print
  end

  def authenticate!
    # 这里是验证的逻辑
  end
end
```

于是，我们改写了 `print` 方法，为它增加了验证的步骤，并且我们还保留了老的，没有验证的那个 `print` 方法，只不过现在它被重新命名为 `old_print` 了。

## 但是……

记住，重新打开类定义并改写其中的代码是相对危险的一件事情，像上面那个例子，我们完全可以用更优雅的方法来实现，那就是继承：

```ruby
class AuthenticatedTimeline < Timeline # 因为此类继承自上面的 Timeline...
  def print
    authenticate!
    super # 所以我们可以这样去重写之前的 print 方法！
  end

  def authenticate!
    # 这里还是一样的验证逻辑
  end
end
```

这样做，更 Ruby！
プロセスの多重起動をアドバイザリロックで防止する

プロセスの多重起動の防止にアドバイザリロックを使えば面倒な後処理を行わなくてもカーネルがよきに計らってくれるのでは？ と思って試してみた。

```bash
#!/bin/bash

lockfile=/tmp/lockfile 

touch $lockfile

exec 9>$lockfile

flock -w 0 -x 9 || {
  echo "duplicate process"
  exit 1
}

# process...

echo -n "[$$] "

for i in {1..10}; do
  echo -n .
  sleep 1
done

echo
```

- touch で lockfile を作る、既にあっても inode は変わらない
- lockfile をディスクリプタ番号 9 で開く
- ディスクリプタ番号を指定して排他ロックする
- ロック失敗したら多重起動
- プロセスが死ねば lockfile  のアドバイザリロックは勝手に解放される

上手く動いているように見えるけど・・・

---

続編

 - [Bash - プロセスの多重起動をアドバイザリロックで防止する・改 - Qiita [キータ]](http://qiita.com/ngyuki/items/cc4f6aeaa9b53baa3b68 "Bash - プロセスの多重起動をアドバイザリロックで防止する・改 - Qiita [キータ]")
DTを蝕む「Ruby脳」の恐怖

まへがき
--------

> 無意識だったわー このコード無意識で書いてたわー
> *——Zonu.EXE (24歳・中二病)*

本文
----

このコードの `==` メソッドの定義を読んで違和感がなければRuby脳。

```ruby:hoge_equals.rb
class Hoge
  attr_accessor :foo, :bar
  def initialize (arg)
    @foo = arg[:foo]
    @bar = arg[:bar]
  end
  def == (other)
    [self.foo, self.bar] == [other.foo, other.bar]
  end
end

fizz = Hoge.new(foo: "Foo", bar: "Bar")
bazz = Hoge.new(foo: "Foo", bar: "Bar")

p fizz == bazz
# => true
```

補足
----

 * タイトルで煽ってますが、このコードが問題視されることは、おそらく多くありません
   *  **Rubyの世界では** 実行時に多少のオーバーヘッドがあったとしても、コードの書きやすさ、可読性が重視される文化だからです
   * 僕はさう思ってますが、Rubyistの間でも見解の差があるかもしれません (きっとある)
 * 他人の書いたPythonをあまり読んだことがないのですが、Pyの文化ではどうなのでせう…? *(ちゃんと動きます)*

解答に代へて
-----------

これをPHPに直訳すると、こんな *(気持ち悪い)* ことになります ヾ(＃＞＜)ﾉﾞ

```php:hoge_equals.php
<?php

class Hoge {
  public function __construct (array $arg) {
    $this->foo = $arg['foo'];
    $this->bar = $arg['bar'];
  }
  public function equals ($other) {
    return array($this->foo, $this->bar) == array($other->foo, $other->bar);
  }
}

$fizz = new Hoge(array('foo' => "Foo", 'bar' => "Bar"));
$bazz = new Hoge(array('foo' => "Foo", 'bar' => "Bar"));

var_dump($fizz->equals($bazz));
# => true
```

個人的な見解
-----------

> 言語デザインの力ってすごいよね
> *——tadsan (24歳・自称エンジニア)*

一般的な模範解答
--------------

 * `(self.foo == other.foo) && (self.bar == other.bar)`
最近Macを使い出した俺がインストールしたアプリや設定

##アプリ
### 汎用
alfred
BetterTouchTool
Dropbox
Gmail Notifr
KeyRemap4MacBook（主にviキーバインド用）
Memory Clean
Microsoft Office（ファミリーパックで買ったので3つまで可能）
ShortCat
Skype
The Unarchiver
Timey
XtraFinde
### 開発用
Dash
Divvy
GIMP
GitHub
Gitにdotfiles
Go2Shell
Google Chrome（拡張機能だけ同期）
Growl
homebrew
(やめた)Janetter
LibreOffice
MacVim（これは要らないかも）
Sequel Prlo
Sonora
Sophos Anti-Virurs
SourceTree
Sublime Text2
WindowFlow
Xcode
zsh
夜フクロウ

##設定
Dockは左（でもalfredで起動するので中はほぼ空）
Spotlightは使わずalfredで。
PHP5.2とPHP5.3に対応したライブラリを作る

[統計](http://w3techs.com/technologies/details/pl-php/5/all)を見ると今でもPHP5.2系統で運用されているWebsiteは多数あるらしい。

なので「PHP5.2でも使えるように作れ」と依頼されることがある。正直、あまり楽しい作業ではないのだが、多少マシになる方法を考えてみた。

## 基本はPHP5.2に合わせて作ること

5.2では5.3の機能は当然ながら使えない。

- 無名関数/クロージャ
- 名前空間
- constキーワードによるグローバル定数定義
- 静的遅延束縛
- SPLの一部

こういったものは使わないようにする。基本的に、5.2で動くコードは(グローバル関数が重なったりしない限りは)5.3でも動くはずである。

### 無名関数/クロージャ
名前ありの関数かメソッドを作って対処する。

### 名前空間
モダンなPHPフレームワークでは[PSR-0](http://www.infiniteloop.co.jp/docs/psr/psr-0.html)に従ったクラス名を付けることが常識になっている。ざっくり要約すると↓のようなルールになる。

```
\Vendor\Hoge\Fuga_Hoo\Klass_Hoo
みたいなクラス名なら、ディレクトリ上は
Vendor/Hoge/Fuga_Hoo/Klass/Hoo.php
として配置する
```

PHP5.2ではそもそも名前空間が使えないため、厳密にこれを守ることはできない。PEARなどと同じく、アンダースコア区切りを利用して疑似的に名前空間を作る。

```
Vendor_Hoge_Fuga_Klass
というクラス名ならば、ディレクトリ上は
Vendor/Hoge/Fuga/Klass.php
として配置する
```

## class_alias()を使ってPHP5.3でも使いやすく
以上を守ると、ものすごく長いクラス名を付けなければならなくなる。
Zend Framework1やPEARを見るとげんなりすると思う。

名前がやたら長いのはライブラリの使い勝手の悪さに直結する。

5.3なら、通常は何か名前空間を設定してコードを書くと思うのだけれど、名前空間に対応していないライブラリはインポートするのが面倒になるという弊害もある。

```php
<?php
//ライブラリが用意しているクラス名がこんなのだったとする
class Vendor_Super_Ultra_Hyper_Klass {}
class Vendor_Super_Ultra_Hyper_Hoge {}
```

```php
<?php
//利用する側はこんなコードになる
namespace Acme\MyApp;

use Vendor_Super_Ultra_Hyper_Klass as Klass;
use Vendor_Super_Ultra_Hyper_Hoge as Hoge;
//use ... //クラスが他にもあればひたすらuse文が続く


class Foo {
//...
// useを書かないのであれば、\Vendor_Super_Ultra_Hyper_Klass と毎回書くことに。。
//...
}
```

もともと名前空間付きでクラス名が設定してあれば、適当なところまでインポートすればよい。こういうのが理想だと思う。

```php
<?php
//ライブラリがこんなクラス名で作ってあれば…
namespace Vendor\Super\Ultra\Hyper;

class Klass {}
class Hoge {}
```

```php
<?php
//使う方
namespace Acme\MyLibrary;

use Vendor\Super\Ultra\Hyper;

class Foo {
  function hoge() {
    $klass = new Hyper\Klass;
    $hoge = new Hyper\Hoge;
  }
}

//use文も少なくて済むし、名前の長さも許容範囲ですね！
```

ここで、PHP5.3から導入された[class_alias](http://jp2.php.net/manual/ja/function.class-alias.php)という関数に注目する。これを使うとクラスに別名を付けることができる。

まず、polyfillをしておく。

```php
<?php
if (! function_exists('class_alias')) {
  function class_alias(){}
}
```

この状態で、クラス定義を以下のように書けば、PHP5.3では名前空間を活用したクラス名が使えて、PHP5.2でも長いクラス名だけは動くようになる。

```php
<?php
class Vendor_Super_Ultra_Hyper_Klass {
//...
}
class_alias('Vendor_Super_Ultra_Hyper_Klass', 'Vendor\Super\Ultra\Hyper\Klass');
```
Struct.new


Ruby 的类定义有两种方式，多数情况下人们较为熟悉这一种：

```ruby
class Person
  attr_accessor :first_name, :last_name
  
  def initialize(first_name, last_name)
    @first_name, @last_name = first_name, last_name
  end
end
```

有的时候，使用 `Struct.new` 会更加方便：

```ruby
  Person = Struct.new(:first_name, :last_name)
```

这和第一种方式是完全等价的。如果类中还有实例方法，我们也可以通过在 block 中定义来实现：

```ruby
Person = Struct.new(:first_name, :last_name) do
  def to_s
    "#{first_name} #{last_name}"
  end
end
```

不过，当你的类是以描述对象行为为主要目的的时候（通常，拥有多个实例方法的类就代表这种情形），还是用第一种方式比较合适。第二种方式多用于构造一个以组织数据为主要目的的类。
enchant.jsを使ってみた

javascriptでゲーム開発する場合に結構利用されている見たいですね。本屋でも結構見かけます。ちょっとサンプルゲームを作ってみた。やったことのメモです。

まずは、環境構築方法ですが、下記サイトから最新版をダウンロードした。
[enchantjs](http://enchantjs.com/ja/ "enchantjs")

ダウンロードしたzipファイルを展開して必要なファイルを作業ディレクトリにコピーしてindex.htmlからenchant.js,main.jsを呼べるようにした。このあたりは、展開したディレクトリにあったexamples/beginnerにあったものを持ってきてパスのみ修正した。

```:sh
[hogehoge@localhost enchant]$ ll
合計 192
-rw-rw-r--. 1 hogehoge hogehoge   2621  3月 19 22:38 chara1.png
-rw-rw-r--. 1 hogehoge hogehoge 183517  3月 19 22:38 enchant.js
-rw-rw-r--. 1 hogehoge hogehoge    460  3月 20 10:46 index.html
-rw-rw-r--. 1 hogehoge hogehoge   1949  3月 22 22:10 main.js
[hogehoge@localhost enchant]$ 
```

あとは、main.jsを変更していくだけです。enchant.jsを使ったアプリ開発では、
基本的なフォーマットは、下記のようになるようです。

```js
enchant();
window.onload() = function() {
  var core = new Core(320, 320);
  core.onload = function() {
    /* 必要な処理 */
  };
  
  core.start()
};
```

今回勉強してできたサンプルゲームです。画像を読み込んで複数個の熊を表示し、適当に動かし、クリックされると画像を消します。また、play時間が0になるとゲームオーバになるようにして見ました。

```js:main.js
enchant();

window.onload = function(){
	var core = new Core(320, 320);
	core.preload('chara1.png');
	core.fps  = 25;
	var gameEndTime = 100;
	var timeLable = new Label();
	var gameOverScene = new Scene();
	var score = 0;
	
	timeLable.x = 0;
	timeLable.y = 5;
	timeLable.text = 'Times: ' + gameEndTime;
	core.rootScene.addChild(timeLable);

	core.onload = function() {
		var Bear = Class.create(Sprite, {
			initialize: function(x, y) {
				Sprite.call(this, 32, 32);
				this.x = x;
				this.y = y;

				this.frame =rand(5);
				this.image = core.assets['chara1.png'];

				this.addEventListener('enterframe', function() {
					var x = Math.random()*(core.width  - this.width);
					var y = Math.random()*(core.height - this.height);
					this.tl.moveTo(x, y, 30);
					this.frame = this.age % 3;
					if( this.x - this.width  > 320  ) this.x = 0;
					if( this.y + this.height > 320 ) this.y = 0;
				});

				this.addEventListener('touchstart', function() {
					score++;
					scoreLable.text = 'Score: ' + score;

					core.rootScene.removeChild(this);
				});
				core.rootScene.addChild(this);
			}
		});

		var bears = [];
		for (var i = 0; i < 10; i++) {
			bears[i] = new Bear(rand(320), rand(320));
		}

		var scoreLable = new Label('score: 0');
		scoreLable.x = 200;
		scoreLable.y = 5;
		core.rootScene.addChild(scoreLable);

	}

	core.addEventListener('enterframe', function() {
		timeLable.Text = '';
		gameEndTime--;
		timeLable.text = 'Times: ' + gameEndTime;
		if( gameEndTime <= 0 ) {
			/* game over */
			var label = new Label();
			label.x = 100;
			label.y = 100;
			label.color = 'red';
			label.font = '14px "Arial"';
			
			var msg = 'Game Over !!! <br/>' + 'Score: ' + score;
			label.text = msg;
		 	
			gameOverScene.backgroundColor = 'black';
		 	gameOverScene.addChild(label);
			this.pushScene(gameOverScene);
			this.stop();
		}
	});
	core.start();
};

function rand(n) {
	return Math.floor(Math.random() * (n+1));
}
```
Rakeタスク作成

## 参考

* [Rakeタスクをつくる #Rails - Qiita](http://qiita.com/items/9a9b0703ac4c76ebfd4e)
* [Change to Rake tasks and argument structure in Rails 3.2? - Stack Overflow](http://stackoverflow.com/questions/9909064/change-to-rake-tasks-and-argument-structure-in-rails-3-2)

----

## タスク作成

```
rails g task send_mail
----------
      create  lib/tasks/send_mail.rake
----------
```

* lib/tasks/send_mail.rake

```rb
namespace :send_mail do
  desc "メール送信"

  task :mail_magazine, [:target, :id] => :environment do |task, args|
    target = args[:target]
    id     = args[:id]

    mail_maga = MailMagazine.where( id: id ).first
    raise "MailMagazine Not Found" if mail_maga.blank?

    if target == "all"
      users = User.all

      users.each_with_index(1) { |user, i|
        begin
          UserMailer.mail_magazine( user.email, mail_maga ).deliver
          puts "[ #{i} : #{user.email} ]"
        rescue Exception => e
          puts "[ ---------- Exception ---------- ]" ; e.tapp ;
        end
      }

      mail_maga.update_attributes!( target: target, last_sent_at: Time.now )
    else
      begin
        UserMailer.mail_magazine( target, mail_maga ).deliver
        result = mail_maga.update_attributes!( target: target, last_sent_at: Time.now )
        puts "[ ---------- result ---------- ]" ; result.tapp ;
      rescue Exception => e
        puts "[ ---------- Exception ---------- ]" ; e.tapp ;
      end
    end
  end
end
```

* タスク確認

```
rake -T | grep send_mail:mail_magazine
----------
rake send_mail:mail_magazine[target,id]  # メール送信
----------
```

* ローカル実行

```
rake send_mail:mail_magazine["aaa@gmail.com",1]
```

※カンマの後にスペースを入れるとエラー

```
rake send_mail:mail_magazine["aaa@gmail.com",1]   # => OK
rake send_mail:mail_magazine['aaa@gmail.com',1]   # => OK
rake send_mail:mail_magazine['aaa@gmail.com', 1]  # => NG
rake send_mail:mail_magazine["aaa@gmail.com", 1]  # => NG
```

## Heroku

* Heroku用設定

※この設定が無いとモデルが読み込めない「uninitialized constant MailMagazine」エラー

config/environments/production.rb

```rb
  # Enable threaded mode => For Heroku
  config.threadsafe!
  config.dependency_loading = true if $rails_rake_task
```

* Heroku実行

```
heroku run rake send_mail:mail_magazine["aaa@gmail.com",1]
```
OAuth2のImplicit grant flowでのセキュリティ

故あって改めて調べたので備忘録。
セキュリティの専門家ではない為、〜らしい的な書き方が多いのはご勘弁を。自分の中では下記のように理解しています。間違っていたら誰かにツッコミ入れて欲しいところ。

http://www.sakimura.org/2012/02/1487/
どこかでトークンを取得すれば、別のサービスの認証で差し替えて使えるということを書いてくれている。カット＆ペーストアタックと言うらしい。

このアタックが可能になる条件は、
「別のシステムで取得したアクセストークンであるかどうかをサーバがチェックしていない事」
なので、サーバがトークンを受け取った際に、そのトークンが本当に提供中のアプリ用に作成されたものかを調べれば良いということだ。

例えばPHPでFacebookアプリを作成しているなら下記が参考になるだろう。
http://itosho.parallel.jp/blog/blog/2012/07/26/facebook%E3%81%AEoauth%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E7%99%BA%E8%A1%8C%E5%85%83%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E5%8F%96%E5%BE%97/
第9回オフラインリアルタイムどう書く参考問題をRubyで解く

```rb
def solve(i, n)
  num6 = n.count("6")
  a = n.chars.map{|m| m == "6" ? ["6", "9"] : m}.
      flatten.
      permutation(4).
      select{|s| ((s.count("6") + s.count("9") <= num6) and s[0] != "0")}.
      uniq.
      sort
  a.size < i ? "-" : a[i-1].join("")
end

DATA.each do |line|
  i, n = line.split(":")
  d, e = n.split
  puts e == solve(i.to_i, d) ? "ok" : "ng"
end

__END__
13:01167  1109
1:1234  1234
2:1234  1243
```