OmniAICreator/Qiita-1.07M huggingface dataset:
PowerVR Graphics SDKを使ったOpenGL ESシェーダプログラミング 2


## 法線マッピング(Normal mapping)

オブジェクトの法線情報をビットマップに書き込んだものを法線マップ(Normal map)といい、それを使って凹凸感を出した描画をします。法線マップは、XYZをそれぞれRGBに対応させ、値を0〜255として、それぞれ128を引いた値にして向きを表現しています。
また、法線マップを扱うためには、頂点の位置XYZとテクスチャのUV座標のうち、UVZを使った接空間 (Tangent Space)が必要になります。座標系のもう１つの軸である従法線(Binormal)ベクトルは、通常はシェーダー内で、法線ベクトルと接ベクトルから外積を使って計算します。

- 頂点シェーダーのプログラムは次のようになります。

```normal.vsh
// 頂点座標
attribute highp vec3 inVertex;
// 法線ベクトル
attribute mediump vec3  inNormal;
// テクスチャ座標
attribute mediump vec2 inTexCoord;
// 接ベクトル
attribute mediump vec3  inTangent;

// モデル−ビュー行列
uniform highp mat4 ModelViewMatrix;
// 射影行列
uniform highp mat4 ProjectionMatrix;
// ライトの向きベクトル
uniform mediump vec3 LightDirection;

// 法線ベクトル(フラグメントシェーダーに渡す値)
varying mediump vec3 Normal;
// テクスチャ座標(フラグメントシェーダーに渡す値)
varying mediump vec2 TexCoord;
// ライトのベクトル(フラグメントシェーダーに渡す値)
varying mediump vec3 LightVec;

// マテリアル

void main()
{
	// 頂点座標を座標変換する。
	gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(inVertex, 1.0);
    
	// フラグメントシェーダーにテクスチャ座標を渡す
	TexCoord = inTexCoord;

	// ライトの向きベクトルを逆にして、念の為に正規化する
	highp vec3 lightDirection = normalize(-LightDirection);
	// 従法線ベクトルを計算する
	highp vec3 bitangent = cross(inNormal, inTangent);
	// 接空間でのライトの向きを変換する行列を作成する
	highp mat3 tangentSpaceXform = mat3(inTangent, bitangent, inNormal);
	// ライトの向きベクトルを計算する
	LightVec = lightDirection * tangentSpaceXform;
}
```

- フラグメントシェーダーのプログラムは次のようになります。

```normal.fsh
// 拡散反射光用テクスチャ
uniform sampler2D  DiffuseTexture;
// 法線マップ
uniform sampler2D  NormalTexture;
// ライトの向き
uniform mediump vec3  LightDirection;
// 視点に向かうベクトル
uniform mediump vec3 Eye;
// 鏡面反射光の強度
uniform mediump float Power;

// 法線ベクトル(頂点シェーダーから渡された値)
varying mediump vec3 Normal;
// テクスチャ座標(頂点シェーダーから渡された値)
varying mediump vec2 TexCoord;
// 接空間でのライトの向き(フラグメントシェーダーから渡された値)
varying mediump vec3 LightVec;

// 拡散反射光に対する反射率
const mediump vec3 Diffuse = vec3(0.7, 0.7, 0.7);
// 鏡面反射光に対する反射率
const mediump vec4 Specular = vec4(1.0, 1.0, 1.0, 1.0);
// 環境光
const mediump vec3 Ambient = vec3(0.2, 0.2, 0.2);

void main()
{
	// 法線マップから法線を取得する
	mediump vec3 N = texture2D(NormalTexture, TexCoord).rgb * 2.0 - 1.0;
	// ライトの向きベクトルを逆にして、念の為に正規化する
	mediump vec3 L = normalize(-LightDirection);
	// 視点に向かうベクトル
	mediump vec3 E = Eye;
	// ハーフベクトル
	mediump vec3 H = normalize(L + E);

	// 拡散反射光を計算する
	mediump float df = max(0.0, dot(N, L));
	// 鏡面反射光を計算する
	mediump float sf = max(0.0, dot(N, H));
	sf = pow(sf, Power);

	// 最終的な色を光の明るさとテクスチャの色から決める。
	gl_FragColor = Ambient + df * texture2D(DiffuseTexture, TexCoord) * Diffuse + sf * Specular;
}
```
Go言語の記事は`Go`タグを付け欲しい件 #golang

QiitaのGo言語の記事には、`golang`や`Go言語`、`Go`が付けられています。
個人的には`golang`が好きですが、どうやらQiita上では`Go`のタグが付けられた記事が一番多いようです。
これからGo言語の記事を書く方は、`Go`を付けてもらえるとまとまってて探しやすいかと！

2016/12/20 追記
この記事もそうなんですが、`golang`タグや`Go言語`タグを並列でつけておけばいいのかなーと思ってましたが、2016年現在、`golang`タグが`1200`件ほどあり、もはやこれだけ見るとあたかもメインのタグのように見えます。
そのため、`Go`タグの方が多いと分かっている方は、ぜひ`Go`だけをつけて欲しいです。そうすることで、初めてGoに関する記事を書く方が`golang`タグをつける頻度が下がるのではないかと思います。
もちろん、個人の自由なので、どのタグを付けても構いませんが、投稿者としても`Go`タグの方が閲覧数増えるのでおすすめです。
ローカルから簡単にdokkuコマンドを叩けるdocklandをリリースしました

ローカルからheroku-toolbeltライクにdokkuコマンドを叩くdockland gemをリリースしました。

Github: [uetchy/dockland](https://github.com/uetchy/dockland)

## インストール方法

```
gem install dockland
```

## 使い方

### 普通のやり方

まずは普通にdokkuコマンドを叩く。

`ssh -t dokku@example.com <command> <app-name> <options>`でリモートのdokkuコマンドを直接叩ける。

```zsh
$ ssh -t dokku@example.com config:set sushi-app KEY1=VALUE
-----> Setting config vars and restarting sushi-app
KEY1: VALUE
-----> Releasing sushi-app ...
-----> Release complete!
-----> Deploying sushi-app ...
-----> Deploy complete!
```

しかしこれではホスト名やアプリ名を毎回打ち込む羽目になって大変すぎる。

### docklandのやり方

docklandで同じことをやる。

```zsh
$ cd sushi-app # ローカルのプロジェクトリポジトリに移動

$ git config remote.dokku.url # プッシュ先を確認しておく
dokku@example.com:sushi-app

$ dockland config:set KEY1=VALUE # 叩く時はコマンドとオプションだけ
-----> Setting config vars and restarting sushi-app
KEY1: VALUE
-----> Releasing sushi-app ...
-----> Release complete!
-----> Deploying sushi-app ...
-----> Deploy complete!

$ dockland config
=== sushi-app config vars ===
KEY1: VALUE
```

このように dockland が git config をパースして必要な情報を自動で収集してくれるので、コマンドがシンプルになった。タイプする文字数も減ってとても嬉しい。

ついでに、

```zsh:.zshrc
alias dokku='dockland'
```

という具合にaliasを張っておけば、まるでリモートで`dokku`を実行している感覚でローカルから`dokku`コマンドを触ることが出来る。

```zsh
$ cd rails-app
$ dokku logs
[2014-05-29 15:38:56] INFO  WEBrick 1.3.1
[2014-05-29 15:38:56] INFO  ruby 2.1.2 (2014-05-08) [x86_64-linux]
[2014-05-29 15:38:56] INFO  WEBrick::HTTPServer#start: pid=10 port=5000
〜〜〜
```

## 結論
### 良い所

- リモートのdokkuコマンドを叩きたい時はプロジェクトのGitリポジトリに入ってdocklandコマンドを叩くだけで良い

### 悪いところ

- 実装が綺麗じゃないすぎる

[Pull=request](https://github.com/uetchy/dockland)などお待ちしております。
LESS/Sass/CSSのごった煮コンパイル (gulp版)


[gulp.js](http://gulpjs.com/)では、複数のソースから別々の処理をさせた上で、途中で合流させて1ファイルにコンパイルすることも可能です。

例えば、こんなふたつ↓をコンパイルすることを考えます。

- 軽量化してLessの変数をカスタマイズしたbootstrap
- Smacssで書かれたピュアCSSのプロジェクト

ここでは[公式のレシピ](https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-multiple-sources-in-one-task.md)を参考に、`streamqueue`でストリームを合流させてみました。`streamqueue`は順序を保持するので、結合順は常に bootstrap > smacss になります。

```coffeescript
gulp         = require 'gulp'
less         = require 'gulp-less'
cssimport    = require 'gulp-cssimport'
autoprefixer = require 'gulp-autoprefixer'
concat       = require 'gulp-concat'
minifyCss    = require 'gulp-minify-css'
streamqueue  = require 'streamqueue'

gulp.task 'css', ->
  streamqueue objectMode: true,
    gulp.src ['css/src/bootstrap.less'] # 独自設定のbootstrap
    .pipe less paths: ['bower_components/bootstrap/less/'] # 検索パスにbowerを追加
    gulp.src ['css/src/smacss.css'] # ピュアCSSのプロジェクト
    .pipe cssimport() # @importの読み込み
    .pipe autoprefixer 'last 2 versions' # プリフィクサ
  .pipe concat 'style.css' # 2つのCSSを結合
  .pipe minifyCss keepSpecialComments: 0 # ミニファイ、コメントも除去
  .pipe gulp.dest 'css/' # CSSディレクトリに出力
```

上記は、LESS+CSSですが、Sassの組み合わせだろうと全然OKです。

Node.jsの知識が若干必要になりますが、ストリームの分岐・合流のある場合でも中間ファイルを生成する必要がないのは、gulp.jsの利点です。
the silver searcherのファイル指定オプション

# the silver searcher とは
grepをより高速かつ今時のファイル検索にむいたUIにしたackを
使い勝手はそのままに、更に高速に！と欲張ってみた文字列検索コマンドです。

Macだと

```console
$ brew update
$ brew install the_silver_searcher
```

でさくっと入ります。

[the_silver_searcher - Github](https://github.com/ggreer/the_silver_searcher)

# 特徴

* ```ack```の3〜5倍は速いらしい
* ```.gitignore``` ```.hgignore``` で指定されたファイルは検索対象にしない
* silverサーチ……銀……Ag。というわけで、コマンドは```ag```です。タイプしやすい！


## 使い方

```console
$ ag regexp app  # appディレクトリ以下のファイルからregexpに一致する文字列検索
$ ag -i regexp   # 大文字小文字を無視
$ ag rails Gemfile*  # Gemfile Gemfile.lock などのファイルからrailsを検索
```

## ファイル指定

いままでずっと

```console
$ ag foo -G \.rb$$
```

とやっていたんですが

```console
$ ag --ruby foo  # .rb .rhtml .rjs .rxml .erb .rake .specのみ検索
$ ag --list-file-types # 指定できるファイル一覧
```

と指定できると知りました。
自分用によく使うファイル種類と対象拡張子をメモ。

| option | extension |
| --- | --- |
| --cc | .c .h .xs |
| --cpp | .cpp .cc .cxx .m .hpp .hh .h .hxx |
| --go | .go |
| --rake | Rakefiles |
| --ruby | .rb .rhtml .rjs .rxml .erb .rake .spec |
| --shell | .sh .bash .csh .tcsh .ksh .zsh |
| --smalltalk | .st |
|--sql | .sql .ctl |
| **Asset系** ||
|--css | .css |
|--sass | .sass .scss |
|--coffee | .coffee |
|--js | .js |
| **データ系** ||
|--haml | .haml |
|--html | .htm .html .shtml .xhtml |
|--json | .json |
|--xml | .xml .dtd .xsl .xslt .ent |
|--yaml | .yaml .yml |

# おともだち

silver searchはutf-8前提で文字列検索をします。
なのでShift-JIS等の検索をしたい場合は
[the platinum searcher - Github](https://github.com/monochromegane/the_platinum_searcher)
を使わせてもらいましょう。

the mithril searcherはまだありません。
世界で戦うプログラミング~5-1

```py3:bit.py
#-*- coding:utf-8 -*-

class Bitutils():

    
    def getBit(self,num,i):
        return(num & (1 << i) !=0 )
    
    def setBit(self,num1,i):
        return (num | (1 << i))
    
    def clearBit(self,num,i):
        mask = ~(1 << i)
        return num & mask
    
    def clearBitsMSBthroughI(self,num,i):
        mask = (1 << i) -1
        return num & mask
    
    def clearBitsIthrough(self,num,i):
        mask = ~((1 << (i+1)) -1)
    
    def updateBit(self,n,m,i,j):
        allOnes = ~0
        
        left = allOnes << (j + 1)
        
        right = ((1<<i) - 1)
        
        mask = left|right
        
        n_cleared = n & mask
        m_shifted = m << i
        
        return n_cleared | m_shifted
    

if __name__ == '__main__':
    N = 1024
    M = 19
    i = 2
    j = 6
    b = Bitutils()
    c = b.updateBit(N,M,i,j)
    print(bin(c))
```
bitシフトしてor演算は楽勝だったんですけど、
挿入はいったん挿入部分を0にしなきゃいけないんですね。
CentOSにGo言語をインストールしてみた。


CentOSのバージョンは、

```
# cat /etc/system-release
CentOS release 6.5 (Final)
```

Go言語はGoogleが開発したプログラミング言語である。
公式ページ：http://golang.org/


```
Goのオフィシャルサイトの記述によれば、シンプルで高速、安全、そして並列処理が可能な点が特徴として挙げられている。C言語風の記述形式ながら異なる文法体系を持ち、ポインタが利用可能なものの、バッファオーバーフローの遠因となる複雑なポインタ演算を排除。

文法体系はシンプルで、ガベージコレクションが用意されているほか、並列実行を考慮して軽量なプロセス間通信を行う手段が提供され、簡易なプログラミングで大規模処理が可能なシステムが構築できるという。
```

とのことらしいです。
めちゃんこ、おもしろそうなので
一度試してみようと思います。

実は今バックエンド側のお仕事をしていますが、
おもにPHPを使用しています。
これをGoに置き換えてみたいなーとか密かに思っていますw

それではスタート。

```ダウンロード
cd /usr/local/src
wget https://storage.googleapis.com/golang/go1.2.2.linux-amd64.tar.gz
```

```解凍とインストール
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
```

```パスの追加
export PATH=$PATH:/usr/local/go/bin
```


##ソースを書いてみる。
公式のチュートリアルの通りです。


```hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

実行は`go run`らしい。コンパイルはどうやってするんだろう。

```
# go run hello.go
hello, world
```

とりあえず、恒例のHello worldまではクリアできましたw
Pythonのshallow copyとdeep copy


全く理解してなかったのでメモ

shallow copyでも直近の要素（？）は値がコピーされる

```
>>> import copy
>>> a = {1:[1,2,3],2:0}
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> a
{1: [1, 2, 3], 2: 0}
>>> b
{1: [1, 2, 3], 2: 0}
>>> c
{1: [1, 2, 3], 2: 0}
>>> a[1].append(100)
>>> a[2] = 200
>>> a
{1: [1, 2, 3, 100], 2: 200}
>>> b
{1: [1, 2, 3, 100], 2: 0}
>>> c
{1: [1, 2, 3], 2: 0}
>>>
```
Lazy constructorって何だっけ？

♪Please don't say "You are lazy"
だって本当はCrazy
能あるクラスはそう
最初のメソッドが呼ばれた時に初期化されるんです♪

＼JASRACの者ですが！／

---
Lazy construtorって単語が頭から離れないんですけどこれ何なんでしたっけ？
Lazy initializationとは何か違うんでしたっけ？
とはいってもググってもあまり出てこないので多分僕の頭の中で勝手に出来た造語なのであろう…。

---

Lazy initialization(遅延初期化)とは、最初にメソッドが呼ばれた時初めて初期化されるクラスである。
実装としては多分こんな感じ。
他にもっといい方法があるのかもしれませんが使ったことが無いので知りません…

```cpp
class Lazy{
	double value;
	public:
	Lazy():value(0.0){
	}
	double getValue(){
		if (value == 0.0) {
			value = 4.0 * atan(1.0);
		}
		return value;
	}
};

int main(int argc,char **argv){
	Lazy test;
	printf("%e\n", test.getValue());
	return 0;
}
```

さて、まずはメンバ変数の宣言から。
今回は倍精度型のvalueという名前にしました。
で、コンストラクタで値を初期化する。
今回はダミー値として0.0にしてみました。
で、メンバ関数としてgetValue();を用意しておきませう。
この人はこのスコープの中でvalue == 0.0なら値を突っ込みます。
今回は円周率で。
で、valueをリターン。当然円周率が帰ってくると。

さて、メインルーチンへ。
この人はまず最初にLazyクラスのインスタンスを作ります。
この時点ではコンストラクタが叩かれただけなのでvalueの値は0です！
しかしながら実際にvalueの値を使おうとしてgetValue();を叩くと…あら不思議！円周率が！
つまりこのオブジェクトはインスタンスが作成された時点では仮値が入っていますが、
使う時に正しい値が放り込まれて円周率になったわけです。
インスタンス作成時では初期化せず、使われる時に初めて初期化される、遅延初期化っぽい感じですね！
((微妙にvalue(0.0)が初期化に見えん事も無いけど…))
((あとこれだとgetValue()する度に条件分岐が生まれてヤだからstatic何かで何とか出来ないかしらとかね！))
((あと初期値が0.0ってのもちょっとヤですよね！undef的な何かがいいですよね！))

---

で、これどういうところに使うのって話ですが。
要は

```cpp
class Lazy{
	type 使うか使わんかよくわからんけどとても初期化に時間のかかる何か1;
	type 使うか使わんかよくわからんけどとても初期化に時間のかかる何か2;
}
```

みたいなのがあるときいいわけです。
この時、いくら使うか使わんかわからんからと言って、両方の変数を時間かけて初期化するのはリソースの無駄なわけです。
こういう時こそ、インスタンスは作っておくが、使うとき初めて初期化を行う事で、使わない時は初期化のコスト無しにコードを動かす事ができるわけです。

---
しかしまぁ、使ったことが無い上に使う予定もあまりないから、合っているのかよくわからない文章である。
あんまり信用しないほうがいいかも？
深さ優先探索

　今年はアルゴリズムを勉強し始めています。まだまだ初心者で目を瞑りたくなるようなミスばかり出てきていますが、頑張って行こうと思ってます！！（≧▽≦）b
今日は深さ優先探索の復習をしていました。

```cpp:
//ある１０進数を二進数と見なし、そのビット数をカウントする
#include <iostream>
#define DEFAULT_BIT 31
using namespace std;

void print_bits(int num) {
    for(int r = 31; r >= 0; r--) {
        cout << (((num >> r) & 1) ? '1' : '0');
    }
}


int countOneValue(int num, int bit) { //Default bit is 31.
    int count = 0;
    if(bit < 0) return(0);
    
    count += countOneValue(num, bit - 1);
    int now = num >> bit;
    //print_bits(now);
    //cout << endl;
    if(now & 1) {
        count++;
    }
    
    return(count);
}

int main(void) {
    cin.tie();
    ios::sync_with_stdio(false);
    int num;
    
    cout << "Please input number which will be bit sequence.:";
    cin >> num;
    
    print_bits(num);
    cout << "\n";
    cout << countOneValue(num, DEFAULT_BIT) << endl;
    
    return(0);
}
```

```cpp:
//二次元配列を深さ優先探索で足し合わせる。
#include <iostream>
#include <ctime>
#define WIDTH 5
#define HEIGHT 4
using namespace std;

int sumOfTwoDimentionSequence(int ary[][WIDTH], int depth, int sum) {
    int ret = 0;
    if(depth < 0) return(0);
    
    for(int r = 0; r < WIDTH; r++) {
        ret += ary[depth][r];
        cout << ary[depth][r] << " ";
    }
    cout << endl;
    ret += sumOfTwoDimentionSequence(ary, depth - 1, sum);
    
    return(ret);
}


int main(void) {
    cin.tie();
    ios::sync_with_stdio(false);
    
    int ary[HEIGHT][WIDTH];
    
    srand((unsigned)time(NULL));
    
    for(int r = 0; r < HEIGHT; r++) {
        for(int c = 0; c < WIDTH; c++) {
            //srand((unsigned)time(NULL));
            ary[r][c] = rand() % 1000;
        }
    }
    
    cout << sumOfTwoDimentionSequence(ary, HEIGHT - 1, 0) << endl;
    
    return(0);
}
```

　まぁ、深さ優先探索使う意味なくね？って言われたらそれまでですが、とにかく練習したかったんです！！とだけ主張しておきます（笑）
私の投稿がQiitaを利用なさってるすごい方々の参考になるか不安ですが、一応投稿します！後で自分でも確認したいですしね（笑）
間違っている箇所があったら歓迎しますので、コメント欄に宜しく御願い致します！
cocos2d-x 3.1 では Android のバックキーのキーコードは `KEY_ESCAPE` を使う。


3.0 までは `KEY_BACKSPACE` が使われていましたが、 3.1 からは `KEY_ESCAPE` を使うようです。

こんな感じ。

```cpp
auto listener = EventListenerKeyboard::create();
listener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event* unused_event) {
    if (keyCode == EventKeyboard::KeyCode::KEY_ESCAPE) {
        CCLOG("Back!");
    }
};
```

理由は、

> Because desktop and mobile phones share the same key code, and escape is used as back menu on desktop.
https://github.com/cocos2d/cocos2d-x/pull/6853#issuecomment-43706077

だそうです。

https://github.com/cocos2d/cocos2d-x/commit/33f7a500f363479eb6acf9c0cd09cd8631b19cba
BundlerでMavericksにNokogiriをインストールする

(2016/07/16追記) エラーが出る場合

```bash
brew link --force libxml2
```

（2014/11/12更新） Mavericksかつ1.6.4.1の場合に修正。手順が変わっています。

#### Command Line Toolsをインストール

XCodeをアップデートした場合はCommand Line Toolsを再度インストールする必要があるかもしれません。"Xcode" - "Open Developer Tool"よりdmgをダウンロードしてインストール。

#### 必要なライブラリを入れる
```bash
brew tap homebrew/dupes
brew install libiconv
brew install libxml2
````

#### システムのライブラリを使うよう指定してインストール
```bash
bundle config build.nokogiri --use-system-libraries
bundle install
```
嫌われてる今だからのJava -JPAでEntity（Schema）の変更に追従する-

先日、[毛嫌いされる今だからこそ、Java！ --- JPA編 ---](http://qiita.com/ukiuni@github/items/f3e68e7f8fdcc0830e06)でJPAの簡単な動作について説明しました。が、システムが育ってくれば、Entityの形、すなわちDBのSphemaは変更があるのが当たり前。
JPAではEntityからDBのテーブルを自動的につくる機能があるのですが、Entityに変更が必要になった時にどのようにするかを調べてみました。

# Entityの変更にも簡単に追従するぜ！JPA!
今回もEclipseLinkで検証しました。検証コードはGithubで[公開](https://github.com/ukiuni/EclipseLinkInspect)してあります。
検証とはいっても、設定は[persistence.xml](https://github.com/ukiuni/EclipseLinkInspect/blob/master/src/META-INF/persistence.xml)に１行設定を入れるだけでした。超簡単。

```xml:persistence.xml(抜粋)
<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
```

これだけでEntityに変更をいれると、EclipseLinkが勝手にDB Schemaを変更してくれます。
この追従が割と優秀です。ぜひ、試してみてください。
esprima, estraverse, escodegen使ってjavascriptの関数すべてにトレースログを仕込んでみる


関数のトレースをとる必要があったのですが、
esprimaを使えばいけるじゃないかと思って試してみました。

ASTをたどるのは面倒いなーと思っていたら、
estraverseでさくっといけました。
関数がオブジェクトのメンバのときの名前がまだうまくとれていないですが、素の関数定義のときは関数名をとってきてます。


未知のソースの解析とかに利用しようと思います。
サーバー側でコードを注入して各関数の実行時間をとれば
chrome developer toolとか使えない環境向けのプロファイラも作れそうだなっとも思っています。

あと、アスペクト指向的にコード注入できると嬉しいだろうかとも思ってみたり。


```coffeescript:logger_injection.coffee
esprima    = require 'esprima'
escodegen  = require 'escodegen'
estraverse = require 'estraverse'
fs         = require 'fs'

_funcID = 0

logger = (funcID, fileName, node, parent, loc) ->
  name = 'anonymous'
  if node.id?
    name = node.id.name
  else if parent.id
    name = parent.id.name
  logItem = {
    id: funcID,
    file: fileName,
    func: name,
    line: node.loc[loc].line
    phase: loc
  }
  esprima.parse('logger.trace(' + JSON.stringify(logItem) + ' );').body

injectLogger = (source, fileName) ->
  ast = esprima.parse source, {
    loc: true
  }
  estraverse.traverse ast, {
    enter: (node, parent) ->
      if (node.type == 'FunctionExpression' ||
          node.type == 'FunctionDeclaration')
        _funcID++
        node.body.body = logger(_funcID,
                               fileName,
                                   node,
                                 parent,
                                 'start').concat node.body.body
        node.body.body = node.body.body.concat logger(_funcID,
                                                     fileName,
                                                         node,
                                                       parent,
                                                        'end')
  }
  escodegen.generate ast

fs.readFile process.argv[2], (err, source) ->
  console.log injectLogger source

```


追記：
esprimaの作者の方のesmorphというのを使えばもっと簡単にできるようでした。
ただし、npmにあがっているのは少しバージョン古いようなので、
https://github.com/ariya/esmorph
からとってきて使いました。

```coffeescript:logger_injection.coffee　esmorph版
esprima    = require 'esprima'
escodegen  = require 'escodegen'
esmorph    = require 'esmorph'
fs         = require 'fs'

logger = (fileName, fn, phase) ->
  logItem = {
    file: fileName,
    func: fn.name,
    line: fn.line,
    range: fn.range,
    phase: phase,
    return: fn.return ? false
  }
  'logger.trace(' + JSON.stringify(logItem) + ' );'

injectLogger = (source, fileName) ->
  tracers = [
    (esmorph.Tracer.FunctionEntrance (fn) -> logger(fileName, fn, 'start')),
    (esmorph.Tracer.FunctionExit (fn) -> logger(fileName, fn, 'end'))
  ]
  code = esmorph.modify(source, tracers)

fs.readFile process.argv[2], (err, source) ->
  console.log injectLogger source.toString()
MovableTypeのレスポンシブテーマ「Rainier」でmicroformatエラーを消す

## 前置き

MovableTypeの4系を使っていたのだが、いい加減サポートは切れるし、レスポンシブデザインに変更するのもかなりめんどくさそうだったので、標準でレスポンシブデザイン **「Rainier」** が入っているMT5以降に移行しようと決意。で、一気にMT6にしてしまいました。で、今までのブログもレスポンシブのRainierに変更したのですが・・・・

## Google Webmaster Toolsでエラーが出ていた

Google Webmaster Toolsで、なにやらmicroformatのエラーが大量に・・・

`hentry（マークアップ: microformats.org）エラー`だの、
`updatedがありません`だの。。。

正直、microformatsはまったく理解できていないわたくし。

素直に調べることに。

## 2パターン対策方法がある？

どうやら、
1. class指定の中にある **hentry** を消せばよい
2. 正確に？microformatsを記述する？

といったところなのだろうか。

## で？

以下を参考にそのままコピペしました（＾＾；）

## 参考URL

http://communities.movabletype.jp/2014/03/googleupdated.html

## 変更部分

「記事」と「記事の概要」の中にある、

```
<li class="asset-meta-list-item">投稿日:<time datetime="<$mt:EntryDate format_name="iso8601"$>" itemprop="datePublished"><$mt:EntryDate format="%x"$></time></li>
```

という部分を、

```
<li class="asset-meta-list-item">投稿日:<time datetime="<$mt:EntryDate format_name="iso8601"$>" class="updated published" itemprop="datePublished"><$mt:EntryDate format="%x"$></time></li>
```

に変更。

## これでしばらく様子を見てみます

直らなかったら、また書きます（＾＾；）
XAMLデザイナがDLLを見つけてくれない時の対処法

原因はよくわかりませんが、Visual StudioのXAMLデザイナがDLLを見つけてくれない時があります。どうもVisual Studio自身とは別のプロセスで動いているらしく、そのせいでデザイナがDLLを見つけられないという（正直良く分からない）説明を見つけました。

https://groups.google.com/forum/#!topic/cefsharp/rGGXh6wAkCU

具体的な対処法としては、参照したいDLLがあるディレクトリをパスに追加してVisual Studioを再起動します。
スタートメニューの「コンピュータ」を右クリックから「プロパティ」、「システムの詳細設定」、「環境変数」の順に辿り、「（ユーザ名）の環境変数」にPATHというキーで、先ほどのディレクトリを登録すればOKです。
LabVIEW Tips: URL文字列をデフォルトブラウザで開く

# 「URL文字列をデフォルトブラウザで開く(Open URL in Default Browser)」
この関数も、あまり知られていないようです。

関数パレット >> ダイアログ&ユーザインターフェース >> ヘルプにあります。

![OpenURLFunc_inPallte.jpeg](https://qiita-image-store.s3.amazonaws.com/0/43526/7a61f85c-e875-23a4-a903-db623b0c8c6e.jpeg)

例えば、「MissingSystemControls 2.0」に含まれているリンクボタンを使って、リンクボタンを押した時にボタンに表示しているURLをブラウザに表示させるようにすると、それらしい感じになる。

[MissingSystemControls 2.0](https://decibel.ni.com/content/docs/DOC-9921)

以下、サンプル用VIスニペット
注意! 本当は、SystemLinkTextボタンのプロパティ「BoolText.Text」からボタンのテキストを取得するように作ったのですが、
VIスニペットに変換する段階でなぜかプロパティノードがリファレンスノードに変換されてしまっています。
このままだと動かないので、SystemLinkTextボタンのプロパティ「BoolText.Text」に変更してください。

![ExampleOpenUrlFunc_Snipet.png](https://qiita-image-store.s3.amazonaws.com/0/43526/c6631f2c-5b96-a717-4ac1-fd1f90311d6b.png)

また、URL文字列のかわりにpathをつなぐと、 入力されたパスのファイル拡張子に関連づけされたアプリケーションが起動します。たとえば、csvだとExcel、pdfだとAcrobatReader。またファイルではなくフォルダだとエクスプローラが開きます。
AngularJSで動的生成したselectタグに初期値を設定する

#ダメパターン
```html:
<html ng-app="mine">
  <head>
    <script src="angular.min.js"></script>
    <script src="sample.js"></script>
  </head>
  <body>
    <select ng-model="point">
      <!-- ng-repeat を使って option タグを動的に生成している -->
      <option ng-repeat="value in values" value="{{value}}">{{value | number:1}} pt</option>
    </select>
  </body>
</html>
```

```js:sample.js
angular
.module('mine', [])
.run(function($rootScope) {
    
    var values = [];
    
    for (var i=0; i<=1; i+=0.1) {
        values.push(i);
    }
  
    $rootScope.values = values;
  
    $rootScope.point = 0.5; // 0.5 を初期選択状態にしているつもり
});
```

__表示結果__

![angularjs.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/d8f4ba3d-b5d8-2350-adad-477a3e813721.jpeg)

`0.5` が初期選択されない。

#OKパターン
```html:
<html ng-app="mine">
  <head>
    <script src="angular.min.js"></script>
    <script src="sample.js"></script>
  </head>
  <body>
    <select ng-model="point"
            ng-options="value as (value | number:1) + ' pt' for value in values"></select>
  </body>
</html>
```

`sample.js` は変更なし。

__表示結果__

![angularjs.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/c03d2fe6-ec1d-0007-f3e1-23fc4e2a3b0f.jpeg)

`0.5` が初期選択されている。

#つまり
`select` タグを動的に生成する場合は、 `ng-options` を使う。

やや独特の記法なので、 [API ドキュメント](http://js.studio-kingdom.com/angularjs/ng_directive/select) をしっかり読む必要がある。
GhostScriptでPDFの最初のページのみ画像(jpg,png)化する

## Ghostscriptのインストール

```:Ubuntu/debian
sudo apt-get install ghostscript
```

```:osx
$brew install  ghostscript
```

## ページの指定方法
`-dFirstPage=` `-dLastPage=` で対象ページを指定する。

```
$gs  -dFirstPage=1 \
     -dLastPage=1 \
     -sDEVICE=jpeg \
     -o cover.jpg \
     iPhone101.pdf
```

## Rubygemsの`rghost`を使うと
```
RGhost::Convert.new("./iPhone101.pdf").to :jpeg, :filename => "cover.jpg" 
```

## imagemagicをつかうと

PDFをまるごと、メモリーにのせるのか、とても思い処理になる。Ghostscriptで行ったほうが早かった。
ビットコインのウォレット(wallet.dat)を小さくする方法

以下に移行しました<br><a href="http://block-chain.jp/tech/shrink-wallet-dat/" title="ビットコインのウォレット(wallet.dat)を小さくする方法">ビットコインのウォレット(wallet.dat)を小さくする方法</a>
xibでカスタムセルを作成し、UIGestureRecognizerを利用したら躓いた

簡単に解決できそうで、中々手間取ったので回避策を残します。

# 環境

- xcode 5.1.1
- iOS SDK 7.1

# つまづいたこと

xibでUITableViewCellのカスタムセルを作成し、その中で
UIGestureRecognizerを利用したら、[tableView dequeueReusableCellWithIdentifier:@"MyCell"];の呼び出しで、下記の例外が発生した。

> Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier (MyCell) - nib must contain exactly one top level object which must be a UITableViewCell instance'

```objc

-(void)initCustomCell {
    UINib* nib = [UINib nibWithNibName:@"MyCell" bundle:[NSBundle mainBundle]];
    [self.tableView registerNib:nib forCellReuseIdentifier:@"MyCell"];
}


-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCell* cell = (MyCell*)
    [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; // ここで例外発生
    return cell;
}
```

# 原因?

　エラーメッセージによると、nibのトップレベルオブジェクトはUITableViewCellである必要があるらしい。UIGestureRecognizerをxibに登録した事により、トップレベルオブジェクトがUIGestureRecognizerになってしまったため、例外が発生するようになったっぽい。
(実際にnibをロードして先頭オブジェクトを確認したら、UIGestureRecognizerオブジェクトになっていた）

![スクリーンショット 2014-05-29 20.14.52.png](https://qiita-image-store.s3.amazonaws.com/0/37443/6b19b1cc-9866-d021-f250-e2ef24f87547.png)

# 回避策

セルのロード方式を旧式にして、さらにnib内のオブジェクトにカスタムセルが出るまで探索する。。。。

```objc
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCell* cell = (MyCell*)
    [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
    if( cell == nil ) {
        NSArray* nibArray = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil];
        for(id obj in nibArray) {
            if( [obj isMemberOfClass:[MyCell class]] ) {
                cell = (MyCell*)obj;
                break;
            }
        }
    }
    return cell;
}
```


# 参考

http://stackoverflow.com/questions/9996695/invalid-nib-registered-for-identifier-null-nib-must-contain-exactly-one-to
[Ruby] 途中にArrayが入っても辿れるdeep_symbolize_keys


Railsの実装だと、ハッシュ構造の途中に配列が挟まった場合に、それ以下の階層が処理されないことに気づく。

~~~ruby
{'a'=>[{'b'=>100}, {'c'=>999}]}.deep_symbolize_keys
#=> {:a=>[{"b"=>100}, {"c"=>999}]}
~~~

これも辿れるものを。

~~~ruby
class Hash
  def deep_symbolize_keys
    self.each_with_object({}) do |(key, val), memo|
      if val.is_a?(Array)
        val = val.map{|v| v.deep_symbolize_keys}
      elsif val.is_a?(Hash)
        val = val.deep_symbolize_keys
      end
      memo[key.to_s.to_sym] = val
    end
  end
end
~~~

~~~ruby
{'a'=>[{'b'=>100}, {'c'=>999}]}.deep_symbolize_keys
#=> {:a=>[{:b=>100}, {:c=>999}]}
~~~

今回はRailsの外でオレオレ実装したい場合だったので、これで。Rails上でやりたい場合は大胆に `deep_transform_keys` から上書きしちゃうか、別名をつけてやるのが良いかと。
Nginx での 413 Request Entity Too Large エラーの対処法


アップロードしようとしたデータサイズが大きいと怒られているので上限値を上げます。

client_max_body_size を下記のように配置します。

```nginx.conf
 http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        client_max_body_size 20M;
        listen       80;
        server_name  localhost;

        # Main location
        location / {
            proxy_pass         http://127.0.0.1:8000/;
        }
    }
}
```

配置後reloadします。

```
service nginx reload
```
RZCellSizeManagerを使ってカスタムセルの高さを簡単に扱う


セルの高さを可変にした場合、`heightForRowAtIndexPath:`を書いていくのが大変だったのでライブラリを探してみました。[RZCellSizeManager](https://github.com/Raizlabs/RZCellSizeManager)というセルの高さ計算を専門で取り扱うライブラリを使ってみたのでメモ。

# 前提

* iOS 7.0 or later
* AutoLayout


# RZCellSizeManagerのインストール

CocoaPodsから入れます。

```text:Podfile
pod "RZCellSizeManager"
```


# 実装

## プロパティの追加

ビュークラス / ビューコントローラクラスにRZCellSizeManagerのプロパティを生やします。

```objectivec
@interface SomeViewController

@property (strong, nonatomic) NSArray *objects;  // Cellで使用するデータ
@property (strong, nonatomic) RZCellSizeManager *sizeManager;  // RZCellSizeManagerのインスタンス

@end
```

## 初期化と設定

適当なタイミングでRZCellSizeManagerを初期化します。ViewControllerなら`viewDidLoad`, Viewならカスタムイニシャライザで初期化すると良いんじゃないかと思います。

```objectivec
- (void)initCellSizeManager
{
    // RZCellSizeManagerの初期化
    _sizeManager = [[RZCellSizeManager alloc] init];

    // RZCellSizeManagerにカスタムセルの登録
    [_sizeManager registerCellClassName:NSStringFromClass([CustomCell class])
                           withNibNamed:nil
                     forReuseIdentifier:@"CustomCell"
                 withConfigurationBlock:^(CustomCell *cell, SomeObject *object) {
                     // カスタムセルに値をセットしてレイアウト変更する
                     cell.someObject = object;
                 }];
}
```

## セルの取得

tableViewにセルを返すときはいつもどおりでOK。

```objectivec
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"
                                                       forIndexPath:indexPath];
    cell.someObject = [_objects objectAtIndex:(NSUInteger) indexPath.row];

    return cell;
}
```

## セルの高さを取得

RZCellSizeManagerからセルの高さを取得します。

```objectivec
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // セル表示用のオブジェクトを取得
    id object = [_objects objectAtIndex:(NSUInteger) indexPath.row];

    // RZCellSizeManagerから表示用オブジェクトに対応したセルの高さを取得する
    CGFloat height = [_sizeManager cellHeightForObject:object
                                             indexPath:indexPath
                                   cellReuseIdentifier:@"CustomCell"];
    return height;
}
```

----

参考

* [RZCellSizeManager](https://github.com/Raizlabs/RZCellSizeManager)
* [LEVERAGING AUTO LAYOUT FOR DYNAMIC CELL HEIGHTS](http://www.raizlabs.com/dev/2014/02/leveraging-auto-layout-for-dynamic-cell-heights/)
ArangoDB でランダムにドキュメントを1つ取り出す方法

ドキュメントをランダムに取り出すには「ドキュメントの件数を取得して、適当にオフセットして1件取得する」という方法でもできますが、これだとクエリーを2回発行することになります。

ArangoDB は 2d geo インデックスに対応してるようなので、これを利用してサクッと1回で取り出してみましょう。

最初に `users` コレクションを作ります。

```
arangosh [example]> db._create('users')
```

次にランダムで検索するドキュメントを作ります。
作るのはこんなドキュメント。

```
{
  name: 'name1',
  rand: [0.12345, 0]
}
```

`rand` フィールドが、今回ランダムに取り出すために利用する値になります。
`0.12345` の部分は `Math.random()` でランダムな値になります。

では、これをサクッと 10万件作ります。

```
arangosh [example]> for (var i=0;i<100000;i++) db.users.save({name:'name'+i, rand:[Math.random(),0]});
```

ちゃんとできたか確認します。

```
arangosh [example]> db.users.count()
100000
```

できてますね。

では、geo インデックスを張りましょう。

```
arangosh [example]> db.users.ensureGeoIndex('rand')
```

これでドキュメントの準備は完了です。
では、ランダムに取り出してみましょう。 `near()` を使います。

```
arangosh [example]> db.users.near(Math.random(),0).limit(1).toArray()
[ 
  { 
    "_id" : "user/147357647271", 
    "_rev" : "147357647271", 
    "_key" : "147357647271", 
    "name" : "name15436", 
    "rand" : [ 
      0.7600883925333619, 
      0 
    ] 
  } 
]
```

やったー。
実行するたびに違うドキュメントが取り出せます。

ちなみに MongoDB の $near でも同じように取り出せます。

こちらからは以上です。

## 追記 2014年5月29日

中の人に教えてもらいましたが `db.users.any()` ってやるだけでランダムにひとつ取り出せるようです。 ArangoDB すばらしい！
うまくいったruby2.1.1とrails4.1.1へアップグレードする手順


## ruby 2.1.1 にする

````
$ cd /usr/local/
$ git checkout 0181c8a Library/Formula/readline.rb
$ brew install readline
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.1.1
````
http://qiita.com/manuluu/items/85c42e2ddd03c4832c28
http://qiita.com/shu_0115/items/9efb4b060f465cde0ff2

## Rails 4.1.1 にする

- GemfileのRailsのバージョンを4.1.1にする 
- ````sudo gem update````
- ````bundle update````
- ````bundle exec rake rails:update````

http://akasata.com/articles/309
OpenVPNで拠点間L2接続

OpenVPNで拠点間L2接続を行う方法

拠点間をVPNで繋げたいけど、DHCPサーバを別途作りたくない&リレーサーバとか面倒、ルータ越えが面倒なアプリがある等、別セグメントにしたくないあなたへ。

## ネットワーク図と解説 ##

Server側は固定IP16プラン、Client側はアドレス不定接続とした環境において、拠点間をL2VPNした時の構成を想定しています。

OpenVPN機はDebianです

![OpenVPN.png](https://qiita-image-store.s3.amazonaws.com/0/22754/13903f3e-c2e2-0ffb-5f07-2e28ffe0b37b.png)

上記の通り`192.168.0.0/24`が拠点をまたがってあたかもひとつのスイッチにつながっているように見えます。
(`10.0.0.239/28`はグローバルアドレスだと思ってください)

* OpenVPN機の物理ポート数  
今回の構成は、Client側は1ポート、Server側は2ポートを使用しています。  
**TIPS:** Server側で1ポートのみ、逆にClientで2ポート使う構成も可能ですので、機器や既存のネットワーク制限回避が比較的簡単です。  
1ポート構成ならば、既存のネットワークへ「ポン付け」するのも簡単でしょう。
* `192.168.0.201`に設定するdefault gateway  
冒頭でも説明したとおり単一のセグメントとなります。  
例えば`192.168.0.201`の機器に設定するdefault gatewayは`192.168.0.109`... **ではありません**  
`192.168.0.200`と通信するだけなら`192.168.0.201`のdefault gatewayは **空** (=設定する必要なし)が正解です。

その他、アイデア

* Client機にPPPoE接続接続させるようにすれば、Routerが不要になります。
* Server機のtapデバイスを増やせば、接続拠点を増やすことができます。

### 設定 ###

#### > Server側 ####

```console
$ sudo apt-get install bridge-utils openvpn easy-rsa
```

注: Debianは`easy-rsa`がありません。openvpnの中に入っています。



証明書作成

```console
$ sudo su -
# cp -r /usr/share/easy-rsa/ /etc/openvpn/
# cd /etc/openvpn/easy-rsa
# cat << EOT >> vars 
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Chiyoda-ku"
export KEY_ORG="CorpName"
export KEY_EMAIL="root@example.co.jp"
export KEY_OU="OUName"
EOT
# source ./vars
# ./clean-all
# ./build-ca  >>ダイアログはEnterで進める
# ./build-key-server server  >>ダイアログはEnterもしくはYで進める
# ./build-dh  >>数分かかります
# ./build-key client  >>ダイアログはEnterもしくはYで進める
# exit
```

注: Debianでは
`# cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/`としてください

```console
$ sudo mkdir /etc/openvpn/ccd
```

```:/etc/openvpn/ccd/client
iroute 192.168.0.0 255.255.255.0
```

```:/etc/openvpn/tap0.conf
dev tap0

port 1194
tun-mtu 1400
mssfix 1280
fragment 1280

server-bridge
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

keepalive 10 60
comp-lzo
persist-key
persist-tun

client-config-dir ccd
route 192.168.0.0 255.255.255.0

verb 3
```

#### > Client側 ####

```console
$ sudo apt-get install bridge-utils openvpn
$ sudo mkdir -p /etc/openvpn/keys
$ sudo chmod 700 /etc/openvpn/keys
```

Server側で生成した`/etc/openvpn/easy-rsa/keys/{ca.crt,client.crt,client.key}`をClient側の`/etc/openvpn/keys/`にコピー

```:/etc/openvpn/tap0.conf
dev tap0

tun-mtu 1400
mssfix 1280
fragment 1280

client

remote 10.0.0.234 1194
nobind

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client.crt
key /etc/openvpn/keys/client.key

comp-lzo
persist-key
persist-tun
keepalive 10 60

verb 3
```

## 起動/再接続等の運用 ##

### 起動など ###

```console
$ sudo service openvpn start|stop|reload|restart
```

注意: OpenVPNの接続越しにOpenVPN自体の設定変更をするときは、接続が切れたりすることがあるので原則として行わないのが吉です。
この辺、いい方法が無いのでしょうか。。。nohupとかでなんとかなるのかな？

### ログ ###

`/var/log/daemon.log`

### 再接続 ###

OpenVPNの`/etc/openvpn/*.conf`内のkeepaliveで設定
再接続に要する時間は、概ねkeepaliveの設定時間通りです。

### 転ばぬ先の杖 ###

br0にアドレスを割り当てている関係上、`brctl`コマンドの使い方によってはssh接続等ができなくなり、いわゆる詰んだ状態となります。
→ 対策: シリアル接続できるようにしておきましょう

## パフォーマンス ##

TODO(レイテンシ、スループット)

## あとがき ##

疲れた。
抽出した標本から統計量などを求める

以前 [Hadoop で母集団から全数走査して標本を抽出する話](http://qiita.com/ynakayama/items/1494cf4fdf988e1c7c7c)をしました。データに関する事前の情報が少なく手探りで分析していく場合、抽出した標本をまず様々な角度からアドホックに分析してデータの特徴や傾向をつかんでいくことになります。

## pandas の関数を駆使する

[Hadoop](http://hadoop.apache.org/) による[標本抽出](http://qiita.com/ynakayama/items/d7f6989a4e17ed8a05ec)と [pandas](http://pandas.pydata.org/) の相性は抜群です。[以前にも紹介した](http://qiita.com/ynakayama/items/68eff3cb146181329b48)ように pandas + matplotlib の組み合わせは Series (シリーズ) と DataFrame (データフレーム) という 2 つのデータ構造を利用して分析結果を可視化することができます。

### Hadoop で抽出された標本の読み込み

Hadoop の出力はタブ区切りの定型的なデータ構造を持ちますから pd.read_table() 関数を利用してそのまま読み込むことができます。

```py3
import pandas as pd
df = pd.read_table('hadoop-out.txt')
df.describe() # 複数の要約統計量を求める

#=> count              38156219 # のべ総個体数  
#   unique              6536847 # ユニークな個体数
#   top      0024D69XXXXX,Area9 # 1 件目のインデックス
```

また辞書オブジェクトをデータフレームに強制的に変換するには次のような方法があります。

```py3
df = pd.DataFrame(list(self.dic.values()), index=list(self.dic.keys()))
```

そもそも [Fluentd](http://fluentd.org/) などを利用して Hadoop で処理するまでの時点でデータが構造化されているのが常ですから、構造化されたデータを扱う pandas と相性が良いのは納得のいくところです。

### シリーズとデータフレームの便利な関数

ワードカウント等の結果をさらに集約するのに便利なのが value_counts() 関数です。シリーズをはじめ配列やシーケンスなど一次元のデータ構造からその値の観測頻度を求めます。

また pandas には欠損値を埋める関数 fillna() も用意されており、これを使うと抽出工程で穴ができた場所を何らかの値で埋めるといったことが可能になります。

| 引数 | 説明 |
|:--|:--|
|value|穴埋めをおこなうスカラー値。 (辞書でも可)|
|axis|0 なら行、 1 なら列|
|limit|連続穴埋めの最大回数|
|method|平均値や中央値で穴埋めをするときに指定する|

データフレームの duplicated() 関数はシリーズを返します。これはそのデータフレームですでに登場した値なら True を返しますので重複のチェックに使えます。

replace() 関数は値の置換をします。たとえば 99999 は欠損値であると見なして NaN に置き換えるには次のようにします。

```py3
series.replace('99999', np.nan)
```

基準値以外の外れ値を除去したり丸めることも容易です。

```py3
# 絶対値が 3 を超える (-3 から 3　の間以外) 値を NaN に
data[np.abs(data) > 3] = np.nan
```

## まとめ

pandas の関数を利用すると抽出した標本から分析対象のターゲットを絞り込むのに役立ちます。分析の PDCA サイクルを素早く回すのに Hadoop と親和性の高い pandas は欠かせません。
Resque覚書

概要
------

- Resque [https://github.com/resque/resque](https://github.com/resque/resque)
- Rubyで動作するキュー制御のライブラリ。バックエンドはRedis
- `Resque.enqueue()`でジョブをキューとして投入、`Resque::Worker`が投入されているジョブを拾い上げる→forkしたプロセス上でジョブを実行する
- rakeから使うのが基本のようだが、rubyコードからも呼び出し可能
- [pluginが充実](https://github.com/resque/resque/wiki/Plugins)しているが、かなり内部構造をいじるpluginもあるため、pluginによっては競合する可能性がある。例えば[resque-stat](https://github.com/quirkey/resque-status)と[resque-workers-lock](https://github.com/bartolsthoorn/resque-workers-lock)は同時に使うのが困難な模様
- 非常にシンプルな作りで、実行後のジョブがどのように終了したかなどは関知しない。基本ジョブ自身に丸投げ。

基本的な使い方
--------

### インストール

事前にredis serverが必要。Ubuntuなら`aptitude install redis-server`とかで。resque自身のインストールは以下のコマンド。

    % gem install resque

### ジョブクラス

    require "resque"

    class OreJob
      @queue = :ore_job_test

      def self.perform(*args)
        puts args[0]
        # working

      rescue Resque::TermException
        puts 'Interrupted'
      end
    end

### キュー作成

    require "resque"
    Resque.enqueue(OreJob, "hoge")

### ワーカー

    require "resque"
    # ジョブクラスの@queueに指定した内容と同じものを引数で渡す
    wk = Resque::Worker.new(:ore_job_test)
    # wk.workを実行すると延々とキューを探し続ける
    wk.work
foo.barのようなクッキー名を使うときは、$encryptはtrueで


## 環境

PHP: 5.3.3(CentOS)
CakePHP: 2.4.10


## ドット記法
クッキー名にドット記法が使えますが、クッキーをwriteするとき、$encrypt = falseで書き込むと、readができなくなります。

```cookie.php
$this->Cookie->write('foo.bar', 'hoge', false);

$hoge = $this->Cookie->read('foo.bar');

```
```stacktrace
: Argument 1 passed to Hash::insert() must be an array, string given, called in /cakephp/lib/Cake/Controller/Component/CookieComponent.php on line 247 and defined [
Hash::get() - CORE/Cake/Utility/Hash.php, line 43
CookieComponent::read() - CORE/Cake/Controller/Component/CookieComponent.php, line 286
```

Cookie::readメソッドをみると、encryptされていることが必須か、_decryptメソッドでencryptされていないときの考慮がないように見えます。

ドット記法を使わなければ、問題はありませんし、とりあえず、$encrypt=trueで書き込んでおけば、問題はなさそうです。
【プログラミング入門 - Ruby を使って - 】 練習問題 7 (配列・ソートアルゴリズム)

[プログラミング入門　- Rubyを使って -](http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/Chapter=Contents.html)


練習問題7: 

- では、この章の最初で述べたプログラムを書いてみましょう。
- 上のプログラムをsortメソッドなしで 書けますか。プログラミングの大部分は、問題解決にあります。 これはいい練習になります。
- 以前、メソッドの章で書いた 目次を表示するプログラムを修正してみましょう。その際、プログラムの最初で 目次の情報(つまり、章の名前やページ番号など)をすべてひとつの配列にしまいます。 その後、その配列から情報を取り出して美しくフォーマットされた目次を出力します。

```lang:7-1.rb
#好きな数だけ単語の入力をしてもらい(1行に1単語、最後はEnterだけの空行)
#アルファベット順に並べ変えて出力するようなプログラムを書いてみましょう

#解答1
words = []

puts '好きな数だけ単語を入力してください'
puts '最後はEnterだけの空行にしてください'

while word = gets.chomp
	break if word.empty?
	words << word
end

puts '単語をアルファベット順に並べます'
puts words.sort

#解答2
words = []
word =

puts '好きな数だけ単語を入力してください'
puts '最後はEnterだけの空行にしてください'

while word != ""
  word = gets.chomp
  word << newWord
end
 
puts '単語をアルファベット順に並べます'
puts words.sort

```
```lang:7-2.rb

#ソートアルゴリズムをバブルソートでやってみるテスト
words = []

puts '好きな数だけ単語を入力してください'
puts '最後はEnterだけの空行にしてください'

while word = gets.chomp
	break if word.empty?
	words << word
end

#ソートメソッド代わり
repeat = words.length
while repeat != 0
#配列の上と下を比べて交換
num1 = words.length - 1
num2 = num1 - 1
while num1 != 0
	#ひっくり返す
	if words[num2] > words[num1]
		words[num2], words[num1] = words[num1], words[num2]
	end
	num1 -= 1
	num2 -= 1
end
repeat -= 1
end

puts words
```

```lang:7-3.rb
#目次を配列使って並べる
lineWidth = 40
mokuji = ["目  次".center(lineWidth), "1章:  数".ljust(lineWidth/2) + "p. 1".rjust(lineWidth/2), "2章:  文字".ljust(lineWidth/2) + "p. 72".rjust(lineWidth/2), "3章:  変数".ljust(lineWidth/2) + "p. 118".rjust(lineWidth/2)]
puts mokuji
```
VIMのコメントの色の変更

vimのコメントの色が見づらくて変更したいと思ったので、やり方をまとめてみました。ctermfgに整数を設定してあげる方法もありますが、それだと何色なのかいまいちわかりづらいと思ったので、色の名前で設定する方法を私のブログにまとめてみたので、よかったら読んでみてください！↓
http://infotech776.blog.fc2.com/blog-entry-54.html
期間とコミットした人でファイルリストを作成する

ユースケースとしては、「最近自分がコミットしたファイルの一覧欲しいなぁ」という時に、さくっと表示する

```shell-session
 git show --pretty="format:" --name-only $(git log --author=toyama --after="2014-05-01" --pretty=format:%H) | sort | uniq
```
これで、2014年5月1日以降にtoyamaがコミットしたファイルの一覧が取得できる

サブシェルの`git log `のオプションを変更すれば、期間やコミットした人を変えられる。

git はオプションがわかりやすくて助かるなぁ
Facebook風プレビュー付き画像アップロードエリアの実装

##概要
Facebook風に「ファイルを選択」ボタンではなく、エリアを選択してファイルを選択。
ファイルを選択するとそこにプレビュー画像を出します。

##実装

HTML

```test.html
<div class="file-div">
  <div>
    <img src="">
  </div>
  <input type="file">
</div>
```

CSS

```test.css
.file-div div {
  width: 200px;
  height: 200px;
  padding: 0;
  margin: 0 10px;
  border: dashed 4px #eee;
}
.file-div img {
  width: 100%;
  height: 100%;
}
.file-div input {
  display: none;
}
```

javascript

```test.js
// divをクリックでinputのクリックイベントを発火させる
$(".file-div > div").click(function() {
  var evt;
  evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  $(this).siblings("input").get(0).dispatchEvent(evt);
});

//ファイルを選択したらプレビュー用のimgに反映させる
$(".file-div > input").change(function() {
  var file, fr, input;
  input = this;
  file = $(this).prop('files')[0];
  fr = new FileReader();
  fr.onload = function() {
    return $(input).siblings("div").find("img").attr('src', fr.result);
  };
  return fr.readAsDataURL(file);
});
```
LessでFizzBuzz

For文なんてなくたってMixinを使えばFizzBuzzだって書ける。

```less:fizzbuzz.less
.fizzbuzz(@i:1){
	& when (@i >= 1) and (@i <= 100){
		@fizz: ceil(@i / 3) - floor(@i / 3);
		@buzz: ceil(@i / 5) - floor(@i / 5);
		@fizzbuzz: @fizz + @buzz;
		
		& when not (@fizz = 0) and not (@buzz = 0){
			@{i}: @i;
		}
		& when (@fizz = 0) and not (@fizzbuzz = 0){
			@{i}: Fizz;
		}
		& when (@buzz = 0) and not (@fizzbuzz = 0){
			@{i}: Buzz;
		}
		& when (@fizzbuzz = 0){
			@{i}: FizzBuzz;
		}
		
		.fizzbuzz(@i + 1);
	}
}

.output{
	.fizzbuzz();
}
```

```css:output.css
.output {
  1: 1;
  2: 2;
  3: Fizz;
  4: 4;
  5: Buzz;
  6: Fizz;
  7: 7;
  8: 8;
  9: Fizz;
  10: Buzz;
  11: 11;
  12: Fizz;
  13: 13;
  14: 14;
  15: FizzBuzz;
  16: 16;
  17: 17;
  18: Fizz;
  19: 19;
  20: Buzz;
  21: Fizz;
  22: 22;
  23: 23;
  24: Fizz;
  25: Buzz;
  26: 26;
  27: Fizz;
  28: 28;
  29: 29;
  30: FizzBuzz;
  31: 31;
  32: 32;
  33: Fizz;
  34: 34;
  35: Buzz;
  36: Fizz;
  37: 37;
  38: 38;
  39: Fizz;
  40: Buzz;
  41: 41;
  42: Fizz;
  43: 43;
  44: 44;
  45: FizzBuzz;
  46: 46;
  47: 47;
  48: Fizz;
  49: 49;
  50: Buzz;
  51: Fizz;
  52: 52;
  53: 53;
  54: Fizz;
  55: Buzz;
  56: 56;
  57: Fizz;
  58: 58;
  59: 59;
  60: FizzBuzz;
  61: 61;
  62: 62;
  63: Fizz;
  64: 64;
  65: Buzz;
  66: Fizz;
  67: 67;
  68: 68;
  69: Fizz;
  70: Buzz;
  71: 71;
  72: Fizz;
  73: 73;
  74: 74;
  75: FizzBuzz;
  76: 76;
  77: 77;
  78: Fizz;
  79: 79;
  80: Buzz;
  81: Fizz;
  82: 82;
  83: 83;
  84: Fizz;
  85: Buzz;
  86: 86;
  87: Fizz;
  88: 88;
  89: 89;
  90: FizzBuzz;
  91: 91;
  92: 92;
  93: Fizz;
  94: 94;
  95: Buzz;
  96: Fizz;
  97: 97;
  98: 98;
  99: Fizz;
  100: Buzz;
}

```
Macの隠しフォルダを表示、非常時にする方法

<h3>非常時の方法</h3>

ターミナル起動する。

1.`defaults write com.apple.finder AppleShowAllFiles false`と入力してエンターキーを押す。
2.`killall Finder`と入力してエンターキーを押す。
3.隠しフォルダが非表示になってる！




<h3>表示の方法</h3>

1.`defaults write com.apple.finder AppleShowAllFiles -boolean true`
と入力してエンターキーを押す。

2.`killall Finder`と入力してエンターキーを押す。

3.隠しフォルダが表示されている。
提言: コミットメッセージの一行目には要求仕様を書け

これは Git (や Subversion などのバージョン管理システム) にコミットする時により良いコミットメッセージを書くための提言です。この提言は特にメッセージの一行目だけを対象とします。せめて最も重要な一行目だけでも良いメッセージを書いて欲しいからです。提言をズバリ一言で表すと **一行目には要求仕様を書け** です。

# 背景

プロジェクトによっていろいろ慣習の差はあるものの、一般的には「コミットメッセージの一行目は変更内容の要約を簡潔に書け」とされます。特に Git は、各コミットメッセージの一行目だけを取り出してそれを一覧表示するなど、一行目を特別に処理する機能が多いので、一行目にできるだけ多くの情報を凝縮させることは重要です。またメッセージを一行しか書かない不届きな慣習のプロジェクトでは、十分な情報を持たないメッセージは無用の長物と化します。

# 良くないコミットメッセージ

しかし私は、情報量が少なすぎて分かりにくいコミットメッセージの実例をたくさん見てきました。

あまり良くないコミットメッセージの例:

- Fixed a bug where users can't log in correctly (ユーザが正しくログインできないバグを修正した)
- Changed how to show thumbnail images (サムネイル画像の表示法を変更した)

どちらも割と抽象的なメッセージで、もっと詳しく書ける様に見えます。特に「Fixed a bug where (バグを修正した)」「Changed (変更した)」の部分にはほとんど情報がありません。バグ修正や変更を目的としないコミットが一体どれほどありますか? その様な情報の薄い単語のために貴重なメッセージ文字数を消費してはいけません。しかもこの類の語句は (英語では) 大概メッセージの最初に出て来るので、メッセージを読んで理解する際に読み飛ばす手間を増やします。

この様な情報の薄い語句が出てくるのは、プログラマを主語にしてメッセージを書くからです。「プログラマがバグを修正した」「プログラマが表示法を変更した」云々。しかしプログラマが普段やることはせいぜい機能の追加・変更・削除・バグ修正程度でバリエーションがありません。だからいつも「Fixed (修正した)」とか「Changed (変更した)」とか同じ語句がメッセージに出てくるのです。

しかも fix や change といった動詞は目的語として「X を A から B に変更した」の X の部分を要求します。ところが X の部分は、プログラムのどの辺りに変化があったのか、大雑把な範囲の情報しか表しません。結果として、より具体的な変化の内容である「A から B に」の部分が書かれなくなります。

# 良いコミットメッセージ

さて、私たちプログラマはただ何となくプログラムを変更したりバグ修正したりするわけではないはずです。機能が未実装だったりバグが有ったりしてプログラムが満たすべき要件・仕様を満たさないから、プログラムを変更して満たす様にし、それをコミットするのですよね。
であれば、コミットメッセージであなたが伝達すべきことは、 **そのコミットによってプログラムはどんな要件を満たすのか** です。そしてプログラムの要件について述べる以上、メッセージは **プログラムを主語とする動詞句** で書くべきです。(そして主語はいつもプログラムなので省略します)

良い例:

- Allow login passwords longer than 20 characters (20 文字より長いログインパスワードを認める)
- Recache password database after changing password (パスワード変更後データベースをキャッシュし直す)
- Animate thumbnail images when they appear (サムネイル画像が現れる時アニメーションさせる)
- Trim thumbnail images larger than 200x200 px (200x200 px より大きいサムネイル画像を切り落とす)

これで fixed とか changed などの定番な単語が出てくることは少なくなります。ほとんどのメッセージが異なる単語で始まる様になるので、より早くメッセージの内容を読み取ることができる様になります。

これらのメッセージは全て「プログラムの動作を『P しない』から『P する』に変更した」の形に解釈できます。そして実際にメッセージに書かれるのは P の部分だけです。つまり、大雑把な変更範囲ではなく、具体的な変更内容がメッセージに書かれることになります。

またこの書き方は一部の人が主張する「コミットメッセージは過去形や三単現ではなく原形・命令形で書くべき」とも符合します。むしろ「要求仕様を書け」は「プログラムに命令する口調で書け」と同義と言ってもいいです。

# 例外

リファクタリングや不要コードの削除はプログラムが要件を満たす様にすることを目的とするコミットではありません。この様なコミットはこの提言の対象外です。
MavericksにrbenvでRubyをインストールする

Homebrewを入れるところまでは特に代わり映えしないので省略。

#### 必要なライブラリをインストール
```bash
brew install openssl
brew install readline
```

#### rbenvとruby-buildをインストール
```bash
brew install rbenv ruby-build
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
rbenv install -l
```

#### rbenv rehashを自動化
```bash
git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
```

#### Bundlerはどのバージョンでもインストール
```bash
git clone https://github.com/sstephenson/rbenv-default-gems.git ~/.rbenv/plugins/rbenv-default-gems
echo "bundler" >> ~/.rbenv/default-gems
```

#### ドキュメントはダウンロードしない
```bash
echo "install: --no-ri --no-rdoc" >> ~/.gemrc
echo "update: --no-ri --no-rdoc" >> ~/.gemrc
```

#### Rubyをインストール
```bash
CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline`" rbenv install 2.0.0-p481
rbenv global 2.0.0-p481
ruby -v
bundle
```

以前はbrew link --forceとか他にも何かした記憶があるけど、今回は少し手順が減ってた。
公式のプラグインも使ってみた。
【プログラミング入門 - Ruby を使って - 】 練習問題 6 (制御構造)

[プログラミング入門　- Rubyを使って -](http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/Chapter=Contents.html)


練習問題6:

- "99本のビールが壁に..." 遠足などでよく歌われる古典的な童謡の歌詞、"99 Bottles of Beer on the Wall" を 出力するプログラムを書いてみましょう。 

- 耳の遠いおばあちゃんのプログラムを書いてみましょう。 おばあちゃんに何を言っても(何をタイプしても)、叫ばない限り (つまり、全部大文字でタイプしない限り)、 は?! もっと大きな声で話しておくれ、坊や! と返事をします。もし叫んだときは、彼女はあなたの言葉を聞いて (少なくとも聞いた気がして)、 いやー、1938年以来ないねー! と大声で返事をします。 プログラムにちょっと真実味 を持たせるため、 1930年から1950年のランダムな数字で毎回違う年を叫ぶようにしましょう。あなたはBYEと叫ぶまでおばあちゃんとの会話から逃れられません。上で作った、「耳の遠いおばあちゃんのプログラム」を拡張しましょう。 おばあちゃんはあなたに行って欲しくないのです。 あなたがBYEと叫んでもおばあちゃんは聞こえないふりをします。 BYEを3回連続で 叫ばないといけないように変更してみてください。 BYEと3回叫んでも 連続していない限り、おばあちゃんとの会話は続くようになっているか プログラムをテストして確認してみましょう。


- うるう年。 開始の年と終わりの年を聞いて、その間にあるすべてのうるう年を (もし開始や終了の年がうるう年だったらそれも含めて)表示するプログラムを書きましょう。 うるう年は(1984年とか2004年のように)4で割り切れる数の年です。ただし、100で割り切れる年は うるう年ではなくて (たとえば1800年や1900年)、さらに、それは 400で割り切れない限り です。

```lang:filename
#songs
bottles = 99

while bottles != 0
	puts bottles.to_s + 'Bottles of Beer on the Wall'
	puts bottles.to_s + 'Bottles of beer'
	puts 'Take one down and pass it around'
	bottles -= 1
	puts bottles.to_s + 'Bottles of beer on the wall'
	puts ''
end

#耳の遠いおばあちゃんのプログラム
tweet = gets.chomp
while tweet != 'BYE'
	if tweet != tweet.upcase
		puts 'もっと大きな声で話しておくれよ、坊や!'
		tweet = gets.chomp
	else
		year = 1930 + (rand(21))
		puts 'いやー ' + year.to_s + ' 年以来ないねー'
		tweet = gets.chomp
	end
end
puts 'あんだって？？'

tweet2 = gets.chomp
while tweet2 != 'BYE' 

	if tweet2 != tweet2.upcase
		puts 'もっと大きな声で話しておくれよ、坊や!'
		tweet2 = gets.chomp
	else
		year = 1930 + (rand(21))
		puts 'いやー ' + year.to_s + ' 年以来ないねー'
		tweet2 = gets.chomp
	end
end
puts 'えぇ？？'

tweet3 = gets.chomp
while tweet3 != 'BYE' 
	if tweet3 != tweet3.upcase
		puts 'もっと大きな声で話しておくれよ、坊や!'
		tweet3 = gets.chomp
	else
		year = 1930 + (rand(21))
		puts 'いやー ' + year.to_s + ' 年以来ないねー'
		tweet3 = gets.chomp
	end
end
puts 'はい、バイバイ'

#うるう年
puts 'はじまりの年を教えて下さい'
beginYear = gets.chomp.to_i
puts '終わりの年を教えて下さい'
endYear = gets.chomp.to_i
finishYear = endYear + 1

while beginYear != finishYear
	a = beginYear % 4
	b = beginYear % 100
	c = beginYear % 400

	if a == 0 and b != 0
		puts beginYear
	end
	if c == 0
		puts beginYear
	end
	beginYear += 1
end
```
vagrant仮想開発環境をFinderで表示させる為のあれこれ【mac】

vagrant
virtualbox
centos64
mac

Rubyの環境構築が終わり、ドットインストールで勉強をしていたら、、、
なんていうことでしょう。。。
vagrant上のディレクトリをfinder的なもので表示しているではありませんか！！

ってことで、
vagrant使用中にディレクトリがFinderで見れたら便利なのでやってみました。
HomeBrew入ってる状態なら簡単です。
入ってない人は入れてください、便利ですw
http://brew.sh/

<h2>Mac上の作業</h2>
Mac上でターミナルから次のコマンドを打つ
#brew install sshfs
しばらく待つ。しばらく待つ。長い。

その間にマウントさせるフォルダをhome直下に作成する。
ここではtaskappとした。

するとsshfsコマンドが使えるようになっているので…
#sshfs vagrant@192.168.33.56:/home/vagrant/taskapp ~/taskapp

sshfs ユーザー＠ホスト(ドメインかipアドレス):ディレクトリ(vagrant上のディレクトリ)　~/ディレクトリ(さっき作成したMac上のディレクトリ【マウントさせたいディレクトリ】)てな感じ。

エラーでるかも…
出た。the OSXFUSE file system is not availableとかなんとか…。
その時はコレを打ってくんろ。
#sudo /bin/cp -RfX /usr/local/Cellar/osxfuse/2.6.4/Library/Filesystems/osxfusefs.fs /Library/Filesystems

#sudo chmod +s /Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs

んで、もう一度
#sshfs vagrant@192.168.33.56:/home/vagrant/taskapp ~/taskapp
って打ったら
#　vagrant@192.168.33.56's password: 
パスを入れてあげて…
※vagrantは初期のパスワードはvagrantですよ♪

これで成功だよ、おわたよ。
便利になたよ。

finderからディレクトリも見れるしファイルもドラッグアンドドロップでいけるようになりました。はず。。。

<h2>vagrant上の作業</h2>
おっと！！！
vagrant起動してコレやらないとダメです！！
# sudo chmod -R 777 /home/vagrant/taskapp
パーミッション、これ重要。これやらないとMac上から色々変更できない、それポポ困る。。。

参考にしたサイトはここです。
http://harapeko.wktk.so/blog/ruby/2013-09-16/1334