OmniAICreator/Qiita-1.07M huggingface dataset:
GCCの最適化がインテルコンパイラより賢くて驚いた話

# はじめに

コンパイラの最適化機能が、どこまで何を見抜くかに興味がある。特に、あるコンパイラができて、他のコンパイラができなかったりすることが見つかると楽しい。そういうのを見つけたのでメモ。

# ソース

コンパイラに食わせるコードはこんなの。

```c:test.c
int func(int index){
  int a[1000] = {};
  return a[index];
}
```

配列に空のリストを渡すと、全てゼロクリアされる。なので、`index`がどのような値であっても(配列の範囲内であるかぎり)この関数`func`の返り値はゼロ。これをコンパイラが見抜けるか、という話。

# コンパイラ

試したコンパイラ一覧。

 * gcc 5.1.0, 4.9.3, 4.8.5, 4.4.7
 * icc 16.0.1
 * clang Apple LLVM version 7.0.2

gccだけ無駄にいろいろバージョンがあったので全部試した。

# 結果

試したコンパイラの中で、gccだけが`func`の返り値が常にゼロであることを見ぬいた。gccは、最適化オプション`-O1`からこの関数がゼロであることを見抜く。吐くコードは、-O1の場合は

```
        movl    $0, %eax
        ret
```

-O2以上の場合は

```
        xorl    %eax, %eax
        ret
```

となる。ただし、古いバージョン(4.4.7)は見抜けず、ゼロクリアのための`memset`をcallする。他のコンパイラ(インテルコンパイラとclang)は最適化オプションをいろいろ試したが、この関数の返り値が常にゼロであることを見抜けなかった。iccは`__intel_avx_rep_memset`を、clangは`___bzero`をcallする。

# もうちょっと試す

どこまで教えたら他のコンパイラが見抜くかも調べてみる。

```c:test2.c
int func(){
  int a[1000] = {}; // gcc, clangで実行されない
  return a[0];
}
```

これだと、`func`に引数が無いので、常に定数を返すことがわかる。インテルコンパイラはこれでも配列のゼロクリアをやめなかったが、clangは常に定数であることを見ぬいてゼロクリアをやめ、ただ0を返す関数にしてしまった。

逆に、GCCがどこまで頑張るか試した。初期化を空リストじゃなくて、for文で回してみる。

```cpp:test3.c
int func(){
  int a[1000];
  int i;
  for(i=0;i<1000;i++)a[i] = 0; // 実行されない
  return a[0];
}
```

GCCはこれも見ぬく。しかし、初期化を0で無い値にするとダメだった。

```c:test4.c
int func(){
  int a[1000];
  int i;
  for(i=0;i<1000;i++)a[i] = 1; // 実行される
  return a[0];
}
```

また、同じゼロクリアでも、C++のautoを使ったループや、std::fillでも無理だった。

# まとめ

どのコンパイラも、配列のゼロクリアとそれ以外の値での初期化は区別している。しかしGCCはさらに配列がゼロクリアされたことを認識し、その後の最適化に利用しているっぽい。

# おまけ

intじゃなくてcharだとどうなるだろ、と思ってこんなコードを食わせた。

```c:test5.c
char func(){
  char a[1000];
  char i;
  for(i=0;i<1000;i++)a[i] = 1;
  return a[0];
}
```

gccはちゃんとこれが無限ループになることを見ぬいて(笑)こんなコードを吐いた。

```
.L2:
        jmp     .L2
```

clangもこれが無限ループになることを見ぬいた上、警告もしてくれたが、インテルコンパイラは無限ループを見抜けなかったようだ。
flumpt 用 connect()

# 概要

[Flumpt](https://github.com/mizchi/flumpt) で使用できるように、 [react-redux](https://github.com/reactjs/react-redux) の ```connect``` を移植しました。


# 動機

[Flumpt で React-Router を使用した場合](http://qiita.com/yasuhiro-okada-aktsk/items/3c21fb0eff8ce2e6753e)や、コンポーネントの階層が深く ```props``` のリレーをしたくない場合に、 ```context.emitter.state```から状態を取得できます。

しかし、```propTypes``` による props のバリデーションができず、コンポーネントがどの props を使用する / 必要とするのか把握しずらいという問題があります。

この問題を解決するため ```react-redux``` の ```connect``` を移植しました。

# コード

- [yasuhiro-okada-aktsk/react-flumpt: react-redux porting for flumpt](https://github.com/yasuhiro-okada-aktsk/react-flumpt)

# 仕様

`connect([mapStateToProps], [mergeProps], [options])`

`react-redux` の `connect` の第２引数の `mapDispatchToProps` はありません。
それ以外のパラメータは `react-redux` と同じです。

# 使用方法

```js
import React from 'react';
import {Link} from 'react-router';
import {connect} from 'react-flumpt';

class MyComponentPage extends React.Component {
  componentDidMount() {
  }
  
  render() {
    const {dispatch, count} = this.props;
    
    return (
      <div>
        <Link to="/">Home</Link>
        <hr />
        {count}
        <br />
        <button onClick={() => dispatch("increment")}>increment</button>
      </div>
    );
  }
}

function mapStateToProps(state) {
  return {
    count: state.count
  };
}

export default connect(
  mapStateToProps,
  null,
  {withRef: true}
)(MyComponentPage);
```

- `mapStateToProps` の書き方は、`react-redux` と同じです。
- `dispatch` は `props` にあります。
#iOS 一度は使ってみたい！ツール・技術・ライブラリまとめ

個人的に**一度は使ってみたい iOS開発 で使えるツールや技術** をまとめていきます
随時更新予定です:tada:

# [**C4**](http://c4ios.com/)
* OSSのフレームワーク
* Swiftで**クリエイティブコーディング**を行う
* [Demoビデオ](https://vimeo.com/158074307)がありました

　インスタレーション的なアート作品とかつくってみたいです
 
:tada: TIPS: _クリエイティブコーディング_とは： デジタルアート作品など、プログラミングでビジュアルを生成したり、データを可視化したりする技法

# [**SwiftのEnumでログイン処理を簡略化**](https://realm.io/jp/news/david-east-simplifying-login-swift-enums/)
* SNS連携ログインの簡略化を**Enumを用いて**実装する方法
* Realmさんの[記事](https://realm.io/jp/news/)に記載（他にもためになるポストがいっぱい）


# [**AWS Mobile Hub**](https://aws.amazon.com/jp/mobile/) 
* **Amazon Web Service**を使ったアプリの構築、サンプルプロジェクトを生成してくれる
* 選べるAWSの機能は、以下の6つ
 * ユーザー認証（Cognito）
 * アプリ分析（Mobile Analytics）
 * ストレージ（S3）
 * プッシュ通知（SNS）
 * クラウドロジック（Lambda）
 * コンテンツ配信（CloudFront）
 
:bowtie: TIPS: [**Mobile Hub 使ってみた発表**をしました](http://www.slideshare.net/SaikaYamamoto/mobile-hub-61447068)

# [**Todayウィジェット機能**](https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/Today.html)
* **TodayView**に表示されるコンテンツ
 * iPhone上部からドラッグして表示するコンテンツ（通知エリアの左部）

### これ :point_down: 
<img width="200" alt="IMG_6616.PNG 2016-01-08 0.01.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/98613/89a349c9-e7e1-c21a-9790-cbd1ac350dc6.png">

# [**PaintCode**](http://www.paintcodeapp.com/)
* ベクターイメージを元にソースコードをリアルタイムに生成するツール
* 対応言語は、Objective-C、 Swift、C#、 Xamarin
* 有料ですが、無料お試し版もあります

 <img width="700" alt="スクリーンショット 2016-04-28 18.00.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/98613/e6354640-60e7-8695-2f06-cdfe4bdc1d6c.png">

:tada: TIPS: PSDやSVGフォーマットの素材を元に生成することもできるようです

# まとめ
qiitaやはてブを見ていると、使ってみたい技術はいろいろ見かけるのですが、
なかなか手をつけられません・・・ので、備忘を兼ねてまとめてみました

以上です :tada: 
ありがとうございました
java-design-patternsをWindowsでEclipseで実行できるようになるまでの手順

# 環境設定手順

非常に私的な内容なので、色々決め打ちだったり酷いですが、この通りにやれば動く。はず。

1. msysgitをインストール
1. tortoisegitをインストール
→ デスクトップで右クリックして、Git clone, Git Create repository...というメニューが追加されていたら成功

1. mavenをインストール(zipファイルを解答、PATHを通す)
→ コマンドプロンプトを開き、「mvn --help」と入力してコマンドを認識していたら成功

1. プロジェクトのチェックアウト
  1. c:\home\gitフォルダを作る
  1. 上記フォルダで、右クリック→Git cloneを選択
  1. URLにペースト https://github.com/iluwatar/java-design-patterns.git
  1. OK押す。
  1. java-design-patternsというフォルダができる

1. 上記フォルダを開きShiftを押しながら右クリック→コマンドウインドウをここで開く
コマンドプロンプトが開いたら、mvn testと実行する
→しばらく、ガシャガシャ文字列が流れて BUILD SUCCESSと表示されれば成功

1. eclipseへのインポート
  1. Eclipseでworkspaceを開く
  1. ワークスペースは、「C:\home\workspaces\java-design-patterns」とする。
  1. File→Import→Maven→Existing Maven Projectsを選択
  1. c:\home\git\java-design-patternsを選択
  1. すべてのプロジェクトにチェックが入っていることを確認してFinish
  1. これでEclipseで編集・実行可能に
  1. 対象のプロジェクト(例えばabstract-factory)を選び、右クリックでRun As..→Java Application→App

以上。
fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=2 "Unable to open a realm at path 

```swift
let config = Realm.Configuration(
    fileURL: NSBundle.mainBundle().URLForResource("MyBundledData", withExtension: "realm"),
    readOnly: true)

let realm = try! Realm(configuration: config)
```

こんな感じで、readonlyのファイルをバンドルしている場合に、
realmをアップデート後に以下のエラー

```
fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=2 "Unable to open a realm at path 
```

MyBundledData.realmのファイルを新しいバージョン上で再生成し、バンドルに組み直すことで解決しました。
Wiresharkのユーザーインターフェイス

> ワイヤシャークの公式ホームページのマニュアルを基にして重要だと思った部分だけ書きました。
> 新人として勉強のために書いたものなので足りない部分、不正確な部分がある可能性があります。
> 間違った部分はコメントで教えてください。

# メインウィンドウ

![ws_main](https://goo.gl/YhmUrU)

上の図は`ワイヤシャークのUI`を表します。

上の方から説明すると、

1.　メニュー

    アクションの実行

2.　メインツールバー

    主に使われる機能の実行
    
3.　フィルターツールバー

    最近使用された`ディスプレイフィルター`の選択
    
    `ディスプレイフィルター`の適用

4.　パケットのリスト

    キャプチャされたパケットのサマリー
    リストを選択すると`5と6`のUIで表示される。

5.　パケットの説明
    
    4番のリストから選択されたパケットのディテール

6.　Byteで表したパケット

    4番のリストから選択されたパケットをByteデータで表す。

7.　ステータスバー

    プログラムの状態、キャプチャされたデータの詳しい情報を表す。


> 各種キーボードボタンの情報を確認したい時には`「Help」 ー「About Wireshark」 ー 「Keyboard Shortcuts」`

---

# メニュー

![ws_menu](https://goo.gl/XjPQQs)

### 1. ファイル（File）

![ws_menu_file](https://goo.gl/abNQrv)

|アイテム|説明|
|:---|:---|
|結合|最近ロードされたキャプチャファイルを結合|
|16進数ダンプからインポート|16進数ダンプが含まれているファイルをインポートする|
|ファイルセット-ファイルの一覧|ファイルセットにあるファイルの一覧を表示|
|指定したパケットをエクスポート|一部・全てのパケットを指定してキャプチャファイルとしてエクスポート|
|エキスパートパケット解析|Byteで表したパケットで選択したBytesをCSVやXMLフォーマットでエクスポート|

### 2. 編集（Edit）

![ws_menu_edit](https://goo.gl/7DVyCZ)

|アイテム|説明|
|:---|:---|
|コピー|パケットリスト、パケットディテール、プロパティをコピー|
|パケットの検索|条件に合わせるパケットの検索|
|パケットをマーク/マーク解除|選択されているパケットをマーク/マーク解除|
|パケットを無視/無視を解除|選択されているパケットを無視/無視を解除|
|時間参照を設定/設定解除します|選択されているパケットに時間参照を設定/設定解除|
|時間調整|Ctrl + Shift + T|一部/全てのパケットにTimestampを許可|
|パケットコメント|一つのパケットに対してコメントを書く|

### 3. 表示（View）

![ws_menu_view](https://goo.gl/EUq2LE)

|アイテム|説明|
|:---|:---|
|色付ルール|ワイヤシャークに表せるパケットを区別するために色付ルール|
|ズーム|フォントサイズ|

### 4. 移動（Go）

![ws_menu_go](https://goo.gl/XZiZow)

|アイテム|説明|
|:---|:---|
|リンクされたパケットへ移動|選択されているパケットのプロトコルフィルドと同じプロトコルのパケットに移動|

### 5. キャプチャ（Capture）

![ws_menu_capture](https://goo.gl/ZJYIxJ)

|アイテム|説明|
|:---|:---|
|オプション|キャプチャのオプションを指定|
|キャプチャフィルタ|キャプチャの時のフィルタを指定|

### 6. 分析（Analyze）

![ws_menu_analyze](https://goo.gl/lXPQCd)

|アイテム|説明|
|:---|:---|
|表示フィルタ|表示フィルタの生成/修正|
|表示フィルタマクロ|表示フィルタマクロの生成/修正|
|例として適用|選択されているパケットのプロトコルを例のフィルタとして適用|
|フィルタとして適用|フィルタとして適用|
|フィルタを準備|新しい表示フィルタから元のフィルタに戻るためにフィルタ準備|
|対話フィルタ|多様なプロトコルのために準備されてる対話フィルタ|
|有効化したプロトコル|キャプチャが有効化になっているプロトコルの表示|
|...としてデコード|特定なプロトコルでパケットをデコード|

### 7. 統計（Statistics）

![ws_menu_statistics](https://goo.gl/niMB5A)

|アイテム|説明|
|:---|:---|
|キャプチャファイルプロパティ|キャプチャファイルのサマリー|
|プロトコル階層|プロトコル統計を階層的に表示|
|対話|エンドポイント間のトラフィックを表示|
|終端|エンドポイントのリストとトラフィックを表示|
|パケット長||
|サービス応答時間|要請、応答にかかった時間を表示|
|HTTP|HTTPの要請、応答の統計|

### 8. 電話（Telephony）

![ws_menu_telephony](https://goo.gl/69eiCQ)

### 9. 無線（Wireless）


### 10. ツール（Tools）

![ws_menu_tools](https://goo.gl/MHfWaE)

|アイテム|説明|
|:---|:---|
|Lua|Luaインタープリターで作業できるように設定|

### 11. ヘルプ（Help）
配列操作などその1

はい。今更ながら2.7系ベースのお話です。辛いですね(´・ω・｀) あと色々と私見にまみれたものになります。辛いですね...φ(・ω・`c⌒っ  
初期に使うであろう配列はリスト、セット、タプル、辞書(連想)とかでしょうか。dequeとか使うのはもう初学者の領域ではないと思います。。  
dequeなど参考先 [http://docs.python.jp/2/library/collections.html](http://docs.python.jp/2/library/collections.html)    
  
参考先：[http://docs.python.jp/2/tutorial/datastructures.html](http://docs.python.jp/2/tutorial/datastructures.html)  
以下では配列の変数名をlとして書きます。 
###リスト型
おそらく使用頻度は1位。中の要素の順番の保証がある。中の要素を一部だけ変更したり、先頭や末尾、若しくは任意の中間のどこかで追加/削除を出来るなどとても優秀なできる子。  
※リストにlistという名前は絶対に使わないでください。list(x)といったリスト型にキャスト、変更する操作が出来なくなります。  
####初期化
l=[]  
####追加操作
l.append(x)  
リストの末尾にxを追加。l=l.append(x)とは書きません。というかlが空になってしまいます。  
l.insert(i, x)  
リストのi番目の位置にxを追加します。  
l.extend(l2)  
リストlの末尾にl2を結合して追加。l=[1,2,3] l2=[4,5,6]だとしたらl=[1,2,3,4,5,6]になります。元々のlを保持したい場合はl3=l+l2と書くと思います。  
####削除操作
l.remove(x)  
リストの中で最初(インデックスが最も若い、一番左側)のxを削除。存在しない値を削除しようとするとValueErrorになるのでtry exceptかif in でなんとかしましょう。  
ｌ.pop(i)  
i番目の要素を取り出す。iは指定しなかった、書かなかった場合は自動で末尾になります。p=l.pop(i)で取り除いた要素を別の変数に代入可能です。  
####その他操作
l.count(x)  
リストの中のxの個数を数える。  
l.sort()
リストの中の要素を昇順でソート。リストの中がint型やstr型混在でもエラーになりませんが混在させること自体ないと思うので詳細は略。  
l.reverse()  
リストの中を逆順でソート。降順ではありません。降順にしたいならsort()してからreverse()とかで。  
  
  
###セット型
おそらく使用頻度は2位。中の要素は重複したものは存在しません。順番の保証はありません。  
####初期化
l=set()
####追加操作  
l.add(x)  
xを追加する。既に存在する要素を追加してもエラーなどにはなりません。リスト型のものは入れられないっぽいです。経路探索などで座標を管理する場合はl.add((y,x))とかタプル型にする必要があるっぽいです。
####削除操作
l.remove(x)  
中のxを取り除く。中には一つしか存在しないxが消えます。  
l.pop()
中の要素を一つ取り出す。何が出てくるかは保証されないと思います。p=l.pop()で取り出した要素を別の変数に代入可能です。  
####その他の操作
順番の保証、概念自体がない？ようですがfor i in l: で中の要素を総当りすることは出来ます。
論理演算？で色々出来ます。これはあとで追記したいです。  
  
###辞書型(連想配列)
おそらく使用頻度は3位。中の要素でkeyは重複しない。具体的にこの問題の時にというのは略なのですが問題の入力制限ではkeyになる候補が0から10^9とかの割に実際には100種類程度のkeyしか処理しない場合とかに辞書型を使うのでしょうか。長さ10^9の配列を0埋めなどで作って処理はかなり辛いと思います。  
####初期化
l={}
中の要素は{key1:value1, key2:value2} keyとvalueが対になって存在します。  
keyは重複して存在しないので重複したキーを追加しようとすると元々存在してたほうが消えます。  
####追加操作
keyの追加
l[key]=value  
いきなり追加するのは危険なので既にkeyが存在するか調べるべきだと思います。if l.has_key(key): か if key in l:とかでしょうか。私は特に理由もなく前者パターンしか使ってないですが。  
キーは変更不可、イミュータブルな要素でないといけないのでリスト型などは指定できません。  
valueの追加  
valueには様々な型の値が使えるのでkeyの出現回数の増減をl[key]+=1をしたり、特定のkeyに所属する何かをl[key].append("hoge")したりできます。  
####削除操作
key自体の削除(valueも合わせて消えます)  
del l[key]  
valueの削除  
何かしらのvalueが存在する必要があるので用途に合わせて0や""、[]かなと思います。  
####その他の操作
l.keys()
s=l.keys()などでkeyのみを別のリストに取り出したり出来ます。
for k,v in sorted(l.items()):
keyの値でソート
for k,v in sorted(l.items(), key=lambda x:x[1])
※l.items()だけを試してみると何が行われているのかよりわかると思います。  
  
###タプル型
中の要素は変更不可。順番の概念は有り。
####初期化
l=()
っていっても変更不可のものとして扱うので初期化で用意することは無いと思います。  
####追加、削除操作
追加や削除は無いものと思っていい気がします。再代入や新たな変数に代入で2つ以上のタプルを結合したり、スライス操作を頑張って削除のようなことを出来ないこともないと思いますが。。。  
####その他の操作
特に何か操作することはないと思います。辞書型のkeyにするとか、set型の中に入れて座標をごにょごにょするとか中の要素を変更せず、かつタプル型でないとダメという場面でしか使わない気がします。
  
  
###特に型を限定しない軽い話
リスト型とかをfor i in range(n):とかindex値で範囲外になりそうなのを厳密に管理せずにtry〜except でエラー時にpassでごまかす。エラー発生までの処理は行われる、有効なのでご利用は慎重に。  
配列操作だとforでごにょごにょするお話とかも書かないとだと思うのですがまた今度で。
phantomjsで画面キャプチャ

* xvfbは必要です・・・。

```
QXcbConnection: Could not connect to display 
PhantomJS has crashed. Please read the bug reporting guide at
<http://phantomjs.org/bug-reporting.html> and file a bug report.
zsh: abort (core dumped)  phantomjs a.js
```

## 参考

* [PhantomJSを使ってみる - UZABASE Tech Blog](http://tech.uzabase.com/entry/2014/12/phantomjs.html)

## 使ってみる

```bash:
apt-get install -y phantomjs
```

```js:capture.js
var page = require('webpage').create();
page.open('http://www.yahoo.co.jp/', function () {
        page.render('yahoo.png');
        phantom.exit();
});
```

```bash:実行
phantomjs capture.js
```

* yahoo.png が生成されていることを確認。

## ブラウザサイズの指定

```diff:capture.js
  var page = require('webpage').create();
+ page.viewportSize = {width: 800, height: 400};
  page.open('http://www.yahoo.co.jp/', function () {
          page.render('yahoo.png');
          phantom.exit();
  });
```
一枚のNICに大量のIPアドレスを割り当てる(Windowsバッチ編)

# ミッション

1000台分の接続テストを行いたい。

# バッチファイル

```bat:sample.bat
@echo off

for /l %%a in (40,1,49) do (
  for /l %%b in (0,1,99) do (
    echo %1%%a %1%%b
    netsh interface ip add address name="ローカル エリア接続" addr=172.21.%1%%a.%1%%b mask=255.255.0.0
  )
)
```

# 確認

```
>ipconfig
   IPv4 アドレス . . . . . . . . . . : 172.21.40.0
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.1
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.2
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.3
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.4
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.5
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.6
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.7
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.8
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.9
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.10
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.11
   サブネット マスク . . . . . . . . : 255.255.0.0
   IPv4 アドレス . . . . . . . . . . : 172.21.40.12
```
traitは線形だね

```scala
trait A {
    def foo = println("I am A." + super.toString)
}
trait B extends A {
    override def foo = {
        println("I am B." + super.toString)
        super.foo
    }
}
trait C extends A {
    override def foo = {
        println("I am C." + super.toString)
        super.foo
    }
}

object D extends A with B with C {
    def fooo = {
        println("I am D." + super.toString)
        foo
    }
}

D.fooo
// I am D.$line43.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$D$@4aa7bb1b
// I am C.$line43.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$D$@4aa7bb1b
// I am B.$line43.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$D$@4aa7bb1b
// I am A.$line43.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$D$@4aa7bb1b

```
postgresqlを9.3から9.4に移行-ubuntu

# 内容
postgresqlのメジャーバージョンアップの方法。
ubuntu 14.04で実行。

### リポジトリ登録

```
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" >> /etc/apt/sources.list.d/postgresql.list'
sudo apt-get update
```

### postgresql 9.4 のインストール
```
sudo apt-get install postgresql-9.4 postgresql-server-dev-9.4 postgresql-contrib-9.4
```

### 9.3と9.4のポート確認
別のポートで並列に動いている。

```
pg_lsclusters
    Ver Cluster Port Status Owner    Data directory               Log file
    9.3 main    5432 online postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log
    9.4 main    5433 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
```

### データ移行
ポート5432で起動している9.3から、ポート5433で起動している9.4へ

```
sudo su postgres
pg_dumpall -p 5432 | psql -d postgres -p 5433
```
[参考：www.postgresql.jp](https://www.postgresql.jp/document/9.0/html/migration.html)

### postgresql 9.3 の停止
```
sudo pg_dropcluster --stop 9.3 main
```

### postgresql 9.4 ポート変更
portの行を変更する。

```
sudo vi /etc/postgresql/9.4/main/postgresql.conf
```

### postgresql 9.4 再起動
```
sudo service postgresql restart 9.4
```

### 最終確認
```
pg_lsclusters
    9.4 main    5432 down   postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
```
関数合成

```scala
val add1: Int => Int = x => x + 1

val sq = (x: Int) => x * x

val add100 = (x: Int) => x + 100

foo map (add100 compose sq compose add1)
//res9: List[Int] = List(104, 109, 116, 125, 136)
//functionをリストにしたら、自由度高いじゃと思って！下記の方法を見つかった！
// https://bcomposes.wordpress.com/2011/08/20/fun-with-function-composition-in-scala/

val fncs = List(add1, sq, add100)
// fncs: List[Int => Int] = List(<function1>, <function1>, <function1>)

val foo: List[Int] = List(1, 2, 3, 4, 5)

foo map (fncs.reverse reduce( _ compose _ ))
//res10: List[Int] = List(104, 109, 116, 125, 136)
//とりあえずこれか！うん！
```
Ubuntu のアップデート方法

以下のコマンドを実施するとアップデートできる。
Ubuntu 22.04 でも有効な内容である。

### Ubuntu の最新のパッケージ情報を再取得 - update サブコマンド
```shell-session
$ sudo apt update
```

### Ubuntu のパッケージの更新 - dist-upgrade サブコマンド
パッケージを最新に更新、不要なパッケージの削除、カーネルの更新をしてくれます。
`sudo apt upgrade` という似たようなコマンドもあるが、そちらはパッケージを最新に更新するのみとなる。

```shell-session
$ sudo apt dist-upgrade
```

### Ubuntu の依存関係で必要なくなったパッケージを削除 - autoremove サブコマンド
```shell-session
$ sudo apt autoremove
```

### その他
他にも ```apt-get``` コマンドも存在する。


### まとめ
```shell-session
$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt autoremove
```
Raspberry Pi でカメラ


以下のサイトを参考に実施

* [Raspberry Piと安めのウェブカメラで監視カメラを作る。何か動きがあったら画像保存もする](http://divide-et-impera.org/archives/1098)
* [はじめてのRaspberry PIで監視カメラを作ってみた。](http://qiita.com/kinpira/items/bf1df2c1983ba79ba455)
* [[Raspberry Pi]motionでお手軽監視カメラをつくる](http://blog.hello-world.jp.net/raspberrypi/1949/)

# USB カメラが認識されているか確認

```shell-session
$ lsusb
Bus 001 Device 004: ID 046d:09a2 Logitech, Inc. QuickCam Communicate Deluxe/S7500
```

# Motion をインストール

```shell-session
$ sudo apt-get install motion
```

# 設定変更

```shell-session
$ sudo vi /etc/motion/motion.conf
```

書き変え

* localhostのみの操作アクセス制限をoffに
webcontrol_localhost on
　↓
webcontrol_localhost off

* localhostのみの表示アクセス制限をoffに
stream_localhost on
　↓
stream_localhost off


# 起動

```shell-session
$ sudo motion -c /etc/motion/motion.conf
```

または

```shell-session
$ sudo motion -n
(Run in non-daemon mode)
```

動体検知で /var/lib/motion に静止画が保存される

# 停止

```shell-session
$ sudo service motion stop
```

# PC からアクセス
## ブラウザで設定変更

<http://XXX.XXX.XXX.XXX:8080/>
ブラウザから設定値をコントロールできる


## ブラウザでストリーム表示

<http://XXX.XXX.XXX.XXX:8081/>

枠は表示されるが画像が表示されない
Video device fatal error - Closing video device

どこかのタイミングで静止画が保存されなくなった
reboot して

```shell-session
$ sudo motion -n
```

で、静止画が保存されるようになった
ストリーミングもOK

動体検知した部分だけ動画にして保存している


# 設定変更

```shell-session
$ sudo vi /etc/motion/motion.conf
```

書き変え

* 静止画を保存しない
output_pictures on
　↓
output_pictures off

* サイズ
width 640 # 幅
height 480 # 高さ
Raspberry Pi で Samba


# Sambaの設定
以下のサイトを参考に実施

[IT女子のラズベリーパイ入門奮闘記](http://deviceplus.jp/category/hobby/raspberrypi/)

* [第6回「ラズベリーパイの中にNASを詰め込む！」](http://deviceplus.jp/hobby/raspberrypi_entry_006/)

## Sambaのインストール

```bash
$ sudo apt-get install samba
$ smbd -V
Version 4.1.17-Debian
```

## 設定変更

smb.conf をバックアップ

```bash
$ sudo cp -p /etc/samba/smb.conf /etc/samba/smb.conf.org
```

smb.conf を編集
[netlogon] の項目のコメントを外す

```text:/etc/samba/smb.conf
# Un-comment the following and create the netlogon directory for Domain Logons
# (you need to configure Samba to act as a domain controller too.)
[netlogon]
   comment = Network Logon Service
   path = /home/pi/nas_all
   guest ok = yes
   read only = yes
```

## Samba の再起動

```bash
$ sudo service smbd restart
$ sudo service nmbd restart
```

Windows から[netlogon]フォルダが見えた！
Raspberry Pi でリモートデスクトップ


# xrdp をインストール
以下のサイトを参考に実施
* [Raspberry pi 2 + リモートデスクトップ接続（Windows 7）](http://windvoice.hatenablog.jp/entry/2015/05/04/111143)

```shell-session
$ sudo apt-get install xrdp
```
Windows で
「アクセサリ」－「リモートデスクトップ接続」

## キーボードの設定
リモートデスクトップで、キーボードが英語になっている

以下のサイトを参考に実施
* [Raspberry Piをモニターとキーボードなしで導入する(その2)初期設定とリモートデスクトップ](http://independence-sys.net/main/?p=993)
* [【RaspberryPi】Windows機からリモートデスクトップで接続する方法（xrdp）](http://knygt-p.hatenablog.jp/entry/xrdp)

```shell-session
$ cd /etc/xrdp/
$ sudo wget http://w.vmeta.jp/temp/km-0411.ini #設定ファイルのダウンロード
$ sudo ln -s km-0411.ini km-e0010411.ini
$ sudo ln -s km-0411.ini km-e0200411.ini
$ sudo ln -s km-0411.ini km-e0210411.ini
```

reboot

日本語キーボードが使えるようになった
Raspberry Pi で WiringPi


Wiring Pi
GPIO Interface library for the Raspberry Pi
http://wiringpi.com/
RaspberryPi のI/O関数セット

# Download and Install

```shell-session
$ git clone git://git.drogon.net/wiringPi
```

```shell-session
$ cd wiringPi
$ git pull origin
```

```shell-session
$ ./build
```

# コンパイル＆実行

```shell-session
$ cc -o 実行ファイル名 ソースファイル名 -lwiringPi
$ sudo ./実行ファイル名
$
```

# サンプル・プログラム
## リビジョン取得
### ソースプログラム
```cpp:revision.c
#include <stdio.h>
#include <wiringPi.h>

int main(int argc, char *argv[])
{
        printf("Revision = %d\n", piBoardRev());
        return 0;
}

```

### コンパイル＆実行

```shell-session
$ cc -o revision revision.c -lwiringPi
$ sudo ./revision
Revision = 2
$
```

参考
トランジスタ技術2016年3月号別冊付録
「全ラズパイ対応！楽々I/O関数セット
　WiringPi虎の巻」
 http://toragi.cqpub.co.jp/tabid/781/Default.aspx
Raspberry Pi のセットアップ


# Raspberry Pi ハードウェア

* [Raspberry Pi 2 Model B](https://www.raspberrypi.org/products/raspberry-pi-2-model-b/)
* SDカード 16GB(Class10)

# Raspbian の設定まで

以下のサイトを参考に実施

[IT女子のラズベリーパイ入門奮闘記](http://deviceplus.jp/category/hobby/raspberrypi/)

* [第1回　甘くないラズベリーパイをいただきました。](http://deviceplus.jp/hobby/entry_001/)
* [第2回「ラズベリーパイの下ごしらえ」](http://deviceplus.jp/hobby/raspberrypi_entry_002/)
* [第3回「基本のラズベリーパイの仕上げ」](http://deviceplus.jp/hobby/raspberrypi_entry_003/)

```shell-session
$ cat /etc/debian_version
8.0
$ cat /etc/issue
Raspbian GNU/Linux 8 \n \l
$ echo $LANG
ja_JP.UTF-8
```

* [第4回「ラズベリーパイ遊び初め！」](http://deviceplus.jp/hobby/raspberrypi_entry_004/)

```shell-session
$ sudo aptitude -y install jfbterm
```

フォントを設定

```shell-session
$ apt-cache search japanese | grep font
$ sudo apt-get install fonts-ipafont fonts-ipaexfont
$ sudo apt-get install fonts-migmix
```

「Menu」-「Appearance Settings」で変更
IPAフォントも気に入らないので・・・
[MigMix 2M Bold 12] に設定

LXTerminal のフォントは [Migu 1M 12] に設定
Oculus Rift CV1 （製品版)を入手した人のための基本的な情報

早く予約注文したので、2016年4月中旬に入手したのだが、早すぎてまだ情報を集めようにもネットに情報がなくて（開発版の情報ばかり）、困ったので、そういう人向けにばらばらと書きます。

#Oculus Rift製品にはXBoxコントローラのワイヤレスアダプタは付属しない
Oculus Riftのセットアップは、http://oculus.com/setup に従ってやっていくのだが、そこで指示されるXBoxコントローラのワイヤレスアダプタは、日本向けには同梱されておらず、同梱される有線のUSBケーブルを利用する。どうせOculus Riftは優先なのだから、XBoxコントローラだけ無線になっても仕方ないので気にしない。

#Oculusストア内のおすすめコンテンツ
##JAUNT VR
100程度の360度立体動画がアップされている。ディズニーのパレード, It's a small worldなどはおすすめ。

##ゲームは、無料のものしか試していないが、面白いものはなかった。
##ProjectCARSは楽しそうだが、まだ試していない

#share.oculus.comなどに転がっているプログラムは動かない
##数百のゲームがあるので、インストールしたが、ほとんどは製品版OculusRift向けにビルドされていないため、実行してもPC画面に表示されるだけである。

#Virtual Desktop (1480円）はおすすめ
CV1でも動くという情報があったので、初めて買ってみたアプリ。
http://store.steampowered.com/app/382110/
これがあれば、ネット上に転がっている３６０度立体写真・動画を見ることができる。

#トラッキング用のカメラはなくても動く
ソファに座って使う時など、前にトラッキング用カメラを置かなくても（接続しなくても）、警告は出るものの、問題なく利用できる。ただ、トラッキング用カメラがないとVR内の正面が、例えばソファに座った時の左とか、右になる場合があるので、その時は一度カメラを接続して体の正面に持ってきて、そのあと切断すればよい。

#ハコスコでも十分かもしれない
OculusRift CV1は画素数は高いものの、より近くでものを見せる感じなので、ピクセルの荒さが目立つ。最近のスマートフォンは画素数も高いので、PC・ケーブル不要の気軽さを考えると、スマホVRはあながち悪くないと思う。４K液晶搭載のスマホでもでれば、おそらくそちらのほうがOculusRiftCV1よりもきれいなはず。（その時にはOculusRiftも次のバージョンを出してるかもしれないですが）
typescriptの定義ファイルとimportの使い分け

#typescriptのimportと定義ファイルを使う時の違い

今回はgulpでwebpackを利用してtypescriptをコンパイルしています。

typescript 1.4 -> 1.8に変えたり、tsdがオワコンになっていたので、typings変更した内容です。

サイトにはjqueryや、jqueryプラグイン、createjs、lodashなど、色々読み込んでます。
最近の書き方はjqueryとか使わないって感じだと思いますが、
いかんせん、jquery使えないと何もできない人ばかりの環境なので
読みこまなければいけません。

とりあえず、動かすようにした方法です。

```lang:今回のディレクトリ構造
index.html
js
css
node_modules
libs
package.json
gulpfile.js
tsconfig.json
typings.json
webpack.config.js

typings
 ∟main
 ∟browser

src
 ∟ts
 ∟scss
```

```lang:version1.0以降改訂版
index.html
js
css
node_modules
libs
package.json
gulpfile.js
tsconfig.json
typings.json
webpack.config.js

typings
 ∟globals
 ∟index.d.ts

src
 ∟ts
 ∟scss
```

##typingsへの移行（version 1.0以降改訂版を含む）

このURLですでにあるd.tsファイルを簡単に移行できます。

http://qiita.com/literalice/items/d83249a5646abcb0bec6
http://qiita.com/ueokande/items/19bb6a22b1285622d2c7

※moment.jsはこの方法で移行したファイルには中身がなぜか中身が
空なので、もともと使っていたファイルの必要部分を利用してください。

**tsconfig.jsonの設定**

```lang:tsconfig.json（browser.d.tsなどを読ませる場合）
{
  "compilerOptions": {
    "module": "commonjs",
    "noImplicitAny": false,
    "removeComments": true,
    "sourceMap": true,
    "target": "es5"
  },
  "exclude": [
    "node_modules",
    "bower_components",
    "typings/main.d.ts",
    "typings/main",
    "main"
  ]
}
```

※追記 typings version 1.0以降から仕様が変わりました。

```lang:tsconfig.json（version1.0以降）
{
  "compilerOptions": {
    "module": "commonjs",
    "noImplicitAny": false,
    "removeComments": true,
    "sourceMap": true,
    "target": "es5"
  },
  "files": [
    "typings/index.d.ts"
  ],
  "exclude": [
  ]
}
```

htmlに外部ファイルを読む場合には

```lang:ts内で、lodashを読む場合
/// <reference path="../../typings/browser/ambient/lodash/index.d.ts" />
```

色々サイトをみて、管理ファイルみたいなものを読んでも、なぜか動かなかったので、今回は最初に書いた方を採用しました。

```lang:エラーが出てちゃんとコンパイルできなかった
/// <reference path="../../typings/browser.d.ts" />
```

※追記 typings version 1.0以降から、バグがなくなりましたが、
そもそもこの記述自体もなく動くようです。

```lang:version1.0以降はでちゃんと動きます。
/// <reference path="../../typings/index.d.ts" />
```


**定義ファイルのインストールの仕方**

ここのURLを見ればわかるんですが、
https://github.com/typings/typings/issues/533

```lang:version1.0以前
typings install require --ambient --save
```

typings自体のディレクトリ構造も変わった通り読み込み方法も変わりました。
今後は定義ファイルのnameとsourceは必要です。
以下のようの~で繋ぎます。

```lang:version1.0以降
typings install dt~require --global --save
```

このようにインストールしてください。
sourceでなんぞよって方はtypings search requireとしてみると

<img width="512" alt="react-test_—_RemoveSymantecMacFiles_command_—_-bash_—_175×26.png" src="https://qiita-image-store.s3.amazonaws.com/0/54953/51b961f5-d733-0cb1-454a-2f1a6af8aeb5.png">

画像のsourceって書いてる項目を入れればインストールできます。


##importの使い方
今までは自分で作ったクラスも///でファイル指定していましたが、それらかなくとも、読み込むことが可能になっています。

http://qiita.com/nogson/items/ee6e0f51449b41a42d1f

クラスを呼びたいファイルで頭の方で下の記述で呼び出してください。

```lang:app.ts
import Background from "./Background";
```

クラスは以下のような書き方です。

```lang:Background.ts（クラスが1つの場合）
class Background {
　constructor() {
　　....
　}
　....
}
export default Background;
```

これで、クラスを外部から呼ぶように使えます。
このimportの呼び方はjqueryやlodashなどnpm installすることで
同じようにimportすることができます。

外部ファイルで読むか、コンパイル時に一緒にして生成するか
の違いなので、作るサイトに合わせて使うようにしてください。
VS Codeのカスタムショートカットキーを晒してみる

VSCodeはFile->Preferences->Keyboard Shortcutsでキーボードショートカットを自由に変更できます。デフォルトのままだと他のエディターから乗り換えたときに不便だなと思うことがあるので、自分なりに使いやすいショートカットを設定してみます。他にも見つけたら更新します。

```js
[

/*
 * エディタ関連
 */

// コードの整形（フォーマット）
{ "key": "ctrl+shift+h",           "command": "editor.action.formatDocument",
                                     "when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly" },
// 行を複製
{ "key": "ctrl+shift+d",           "command": "editor.action.copyLinesDownAction",
                                     "when": "editorTextFocus" },

/*
 * タスク関連
 */

// 実行中のタスクを中断
{ "key": "ctrl+shift+x",           "command": "workbench.action.tasks.terminate"},
// タスクを実行
{ "key": "ctrl+shift+r",           "command": "workbench.action.tasks.runTask"}

]
```
Android/Windowsデュアルブートx86タブレットでAndroid側にntfsパーティションをマウント


※root取らないとできないです。
http://forum.xda-developers.com/android/software/guide-mount-internal-windows-partition-t2978679
上記URLを参考にmountしました。
結論から書くと結局以下のことをすればOKです。
- 上記URLからmount_nfsd_fuse.zipをDownload
- 出てきたバイナリを/system/xbinにコピー
- /system/etc/install_recovery.shの最下行に以下を追加
```shell-session
mount_nfsd_fuse /dev/block/sda13 /storage/usbdisk4
```
- 再起動

以下はまったポイント
- Terminal Emuratorで手で打った場合は他のアプリでは中が見えなかった。
  →/system/etc/install_recovery.shに書き込んで起動時にmountすると見れた。
- /system/xbinにバイナリをコピーできなかった。
  →root取れるファイラー使って変更
- chmodしても変わらなかった。
  →root取れるファイラー使って変更
- /starage以下にフォルダを作ったが再起動したら消えた。
  →/storage/usbdisk4を使用するようにした。
- 手持ちのタブレットでは/system/etc/init.shが存在しなかった
  →/system/etc/install_recovery.shの最下行に追加した。
- /system/etc/install_recovery.shに書き込めない。
  →root取れるファイラーのエディタを使用した。
AWS Lambdaで使う秘密情報をKMSを使って渡す (with Node.js)

## 概要
KMS(AWS Key Management Service)を使うと、コードに直書きできない情報を安全に AWS Lambdaに渡せる
普通は環境変数を使うのが一般的だが、現在Lambdaには環境変数を設定できないのでこのような代替案が必要になる
ここでは、KMSを使った暗号化、復号化の方法を簡単に説明する

KMSを使うことの主なメリットは、
 1. KMS, LambdaともにAWSのサービスなので、親和性が高い
 2. 暗号化の際におきる、鍵の保管場所という厄介な問題を回避できる
の2点
実行環境はNode.jsとする

## encrypt
コマンドライン上でencryptしてコードに書きこむ

1. AWS CLIをインストール
2. AWSのconsole上で、新たなmaster keyを作成する
    * 現状ではKMS用のアイコンはなく、Identity and Access Managementからいくので注意
3. master keyを作成した地域を指定して、目的の文字列を暗号化する (下は東京リージョンの場合)  
`$ aws kms encrypt --key-id alias/some_key_name --region ap-northeast-1 --plaintext "password1"`
4. 出力結果のCiphertextBlobをpasswordとして格納する

注意点

- 3の出力値は下記形式
- データはbase64フォーマットされている

```
{ 
  "KeyId": "****",
  "CiphertextBlob": "****"
}
```

## decrypt
実行時にAWS経由でdecryptする

注意点: 

- Promiseはbluebirdで上書きしているので注意
- ES2015組み込みのPromiseを使う場合は、kms.decryptをラップすること

```
import Promise from 'bluebird'
import AWS     from 'aws-sdk'

const kms = new AWS.KMS({ region: 'hogehoge' });
const decryptAsync = Promise.promisify(kms.decrypt, { context: kms })
const decodedPromise = (encrypted) => {
  const encryptedBuf = new Buffer(encrypted, 'base64');
  const cipherText = { CiphertextBlob: encryptedBuf }
  return decryptAsync(cipherText).then(data => data.Plaintext.toString('utf8'))
}
```

## 参考
[AWS Key Management Service](https://aws.amazon.com/jp/kms/)
[10分でわかる！Key Management Serviceの仕組み #cmdevio](http://dev.classmethod.jp/cloud/aws/10minutes-kms/)
jQueryを使わないScroll Tracking

縦長のWebページがどこまで読まれているかを Google Tag Manager (GTM) と Google Analytics (GA) を用いて計測する方法です。（jQuery不要）

# 元ネタ
LunaMetrics - Scroll Tracking Recipe for GTM
http://www.lunametrics.com/labs/recipes/scroll-tracking/

アメリカのウェブマーケティングのコンサル会社であるLunaMetricsが[ブログ](http://www.lunametrics.com/blog/)の中でGTMのコンテナ設定ファイルを公開してくれていたのでそれを使いました。

# メリット
一般的には[Scrolldepth](http://scrolldepth.parsnip.io/)というjQueryベースで動くライブラリと Google Analytics を併用する方法が良く紹介されていますが、それと比べて今回の方法では **ページにjQueryをページに導入する必要がなく、アプリケーションと完全に独立して設定ができる** 部分がメリット。

以前書いたブログ [スタートアップのための「お金と時間がかからない」ログ分析基盤](http://techblog.housmart.co.jp/2016/04/17/log-platform-for-startup/) ではScrolldepthを紹介したのですが、こちらのほうが良さそうだったので置き換えてみました。

# 導入方法
基本的には[このページ](http://www.lunametrics.com/labs/recipes/scroll-tracking/)に書いてある通りやれば導入できます。
すんなりいけば5分ほどで完了します。

## 設定手順
1.GTMのコンテナ設定ファイルを[ここ](http://www.lunametrics.com/downloads/luna-scroll-tracking.json)からダウンロード
2.GTMの管理画面からコンテナ設定ファイルをインポート
3.GAのトラッキングコードを自分が使っているものに変更

コンテナ設定ファイルのインポート方法がわからない場合はこのあたりを参照してください。
[Google タグマネージャヘルプ - [V2] コンテナのエクスポートとインポート](https://support.google.com/tagmanager/answer/6106997?hl=ja)
[LunaMetrics - How to Import a Container Into Google Tag Manager](http://www.lunametrics.com/blog/2015/08/26/import-container-google-tag-manager/)

インポートすると以下の情報が追加されます。

![imported_variables.png](https://qiita-image-store.s3.amazonaws.com/0/39236/1ba04f8f-1b41-b33d-0b17-2296dd78f42c.png)

「CU - Scroll Tracking - LunaMetrics Plugin」がスクロールイベントを検知して動くJavascriptを含んだHTMLタグで、その情報を「GA - Event - Scroll Tracking」のタグが拾ってGA側に情報を飛ばしています。

設定手順の3のステップで「GA - Event - Scroll Tracking」の中の「トラッキング ID」を自分のサイトのものに変更してください。

また、「CU - Scroll Tracking - LunaMetrics Plugin」はデフォルトで全ページで読み込まれるようになっていますが、配信トリガーをカスタマイズすることで計測したいページだけでスクロールを計測することも可能です。

# おまけ
ページの滞在時間を計測する設定もあげてくれていました。
http://www.lunametrics.com/labs/recipes/engagement-timer/

LunaMetricsのブログは色々ためになりそうな情報がありそうです。
Facebook Graph APIでフィールドのエイリアスが作成できるらしい

# これはなに？

FacebookのGraph APIのドキュメントを見ていると、戻ってきたフィールド名にエイリアスが作れるようなので試してみました。
ドキュメントの『[フィールドのエイリアスの作成](https://developers.facebook.com/docs/graph-api/aliasing-fields)』というところに書いてありました。

# サンプルを試してみる

ドキュメントに書いてあるやつをまんま試してみます。
curlではこんな感じです。

```bash
$ curl -G \
-d "fields=id,name,picture.width(100).height(100).as(picture_small),picture.width(720).height(720).as(picture_large)" \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/v2.6/me"
```

[Graph APIエクスプローラ](https://developers.facebook.com/tools/explorer/)を使う時は以下のやつをそのまま貼り付けてください。

```
me?fields=id,name,picture.width(100).height(100).as(picture_small),picture.width(720).height(720).as(picture_large)
```

取得した内容はこんな感じです。
`.as(picture_small)`と`.as(picture_large)`が効いてますね。

```json
{
  "id": "xxxxxxxx",
  "name": "<YOUR_NAME>",
  "picture_small": {
    "data": {
      "height": 100,
      "is_silhouette": false,
      "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/p100x100/xxxxx_xxxxxxxxxxxxxxx_8327030_n.jpg?oh=06568783b279aaf70a9d93efa2bc5bae&oe=57AD5DAA",
      "width": 100
    }
  },
  "picture_large": {
    "data": {
      "height": 162,
      "is_silhouette": false,
      "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/xxxxx_xxxxxxxxxxxxxxx_8327030_n.jpg?oh=b30ea2c42561252c9649ec2641664f58&oe=57BA04D6",
      "width": 162
    }
  }
}
```

`.as(picture_large)`を取って実行すると、`picture`となっているのを確認できます。

```json
{
  "id": "xxxxxxxx",
  "name": "<YOUR_NAME>",
  "picture_small": {
    "data": {
      "height": 100,
      "is_silhouette": false,
      "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/p100x100/xxxxx_xxxxxxxxxxxxxxx_8327030_n.jpg?oh=06568783b279aaf70a9d93efa2bc5bae&oe=57AD5DAA",
      "width": 100
    }
  },
  "picture": {
    "data": {
      "height": 162,
      "is_silhouette": false,
      "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/xxxxx_xxxxxxxxxxxxxxx_8327030_n.jpg?oh=b30ea2c42561252c9649ec2641664f58&oe=57BA04D6",
      "width": 162
    }
  }
}
```

試しに、`.as('でっかいやつ')`とか日本語を入れてみるとエラーになりました。

```json
{
  "error": {
    "message": "Syntax error \"'でっかいやつ' is not a valid name\" at character 112: id,name,picture.width(100).height(100).as(picture_small),picture.width(720).height(720).as('でっかいやつ')",
    "type": "OAuthException",
    "code": 2500,
    "fbtrace_id": "DYk86HsTkDT"
  }
}
```


# 感想

ぱっと使う場所が思い浮かばなかったりするのですが、自分でコントロールしたい場合は`.as()`を使うと良さそうですね。
[baserCMS] メールフォームでオプションを複数チェックしたい

baserCMSのメールフォームで拡張入力チェックを複数指定し、オプションを複数指定したい場合について紹介します。
今回は拡張入力チェックの「ファイルアップロードサイズ制限」と「ファイル拡張子チェック」にチェックを入れ、それぞれにオプションを設定する方法で説明します。

まずは「ファイルアップロードサイズ制限」と「ファイル拡張子チェック」のそれぞれのオプション設定についてです。

## １．ファイルアップロードサイズ制限の場合
ファイルアップロードサイズの上限を１Mに設定したい場合、
拡張入力チェックの「ファイルアップロードサイズ制限」にチェックを入れ、オプションのところに
```
maxFileSize|1
```
と入力することで設定できます。


## ２．ファイル拡張子チェックの場合
ファイルの拡張子のチェックをしたい場合、例えばjpgでチェックしたいときは
拡張入力チェックの「ファイル拡張子チェック」にチェックを入れ、オプションのところに
```
fileExt|jpg
```
と入力することで設定できます。


## ３．複数のオプションを設定したい場合
オプションの入力項目は１箇所しかありませんが、「|」で区切ることで複数オプションの設定ができます。
１、２の設定を同時に行う場合、
```
maxFileSize|1|fileExt|jpg
```
と入力することで、ファイルの上限サイズと拡張子のオプションを同時に指定できます。


![screencapture-basercms_test-localhost-8888-cmsadmin-mail-mail_fields-edit-1-20-1461815733521.png](https://qiita-image-store.s3.amazonaws.com/0/109866/c950fb1f-ee8b-8d77-f0b7-bfaec8d5a388.png)

    
    

【参考資料】
[baserCMS] メールフォームで郵便番号を2つに分けた際も住所補完機能を利用する
http://qiita.com/materializing/items/7151e44dc4ba392a9f85
Rails DEVISE メール認証　[ 自分用メモ ]

**「Rails DEVISE メール認証」で検索**

RailsのDeviseサインアップ時に、特定のメールアドレスにもメールを送信するやり方(登録ユーザ以外にもメールを送信する。例えば自分とか。)
http://ja.stackoverflow.com/questions/24419/rails%E3%81%AEdevise%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E6%99%82%E3%81%AB-%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AB%E3%82%82%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E3%82%84%E3%82%8A%E6%96%B9%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84


**参考サイト**
Rails deviseによるユーザー認証 メールによる認証、emailとusernameのどちらでもログイン可能にするまで
http://qiita.com/shizuma/items/c8c2e71af8c1dcf3d1c2

AWS　※上記サイトを参考
SES(AWS)でメール認証
config/initializers/devise.rb
config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com"

開発中にRailsから送信したメールを確認する(letter_opener)
http://qiita.com/k-shogo/items/d85905535a64e82a3b2b

DEVISE メール送信者名の設定
http://nograve.hatenadiary.jp/entry/2015/10/21/124732

Deviseで新規登録時とメールアドレス変更時のテンプレートを分ける
http://qiita.com/haman29@github/items/2f1cbfb3fa5606c38e52

AWSの場合
http://qiita.com/azusanakano/items/a51aef1347865a452fcc
【AWS】ebでPython環境構築してみた Flaskアプリケーションデプロイ編【Elastic Beanstalk】

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create-deploy-python-flask.html
に沿って作業していきます

###前提条件
[【AWS】ebでPython環境構築してみた Flaskアプリケーションデプロイ準備編](http://qiita.com/Yuki_BB3/items/db3020c670bad1638ab4)の内容が終わっている

要は以下4つが使えればOK

* Python 2.7
* pip
* virtualenv
* awsebcli

###EBCLIの導入

Macに __Homebrew__ を使用して導入します

```:コマンド
brew install awsebcli
```

```:確認
eb --version
```

```:結果
EB CLI 3.7 (Python 2.7.1)
```

###EB CLI でサイトをデプロイする

```bash:変数
VIRTUAL_ENV_NAME='eb-test-Flask'
```

```bash:コマンド
VIRTUAL_ENV_NAME='eb-test-Flask'
PJ_DIR_NAME='eb-flask'
cd ~/${VIRTUAL_ENV_NAME}/${PJ_DIR_NAME}
pwd
```

```:結果
/Users/****/eb-test-Flask/eb-flask
```

```:コマンド
eb init -p python2.7 flask-tutorial
```

```bash:結果
You have not yet set up your credentials or your credentials are incorrect 
You must provide your credentials.
(aws-access-id): *****************　←クレデンシャルを入力
(aws-secret-key): ****************　←クレデンシャルを入力
Application flask-tutorial has been created.
```

コンソールで確認するとできている(この手順そのままなぞると多分オレゴンに出来ます）

![Elastic_Beanstalk.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/69dfdb11-1419-0308-3cac-ada2e3cac725.jpeg)

###pemキーの準備

```:コマンド
eb init
```

```:結果
Do you want to set up SSH for your instances?
(y/n): y

Type a keypair name.
(Default is aws-eb): eb-test-yuki
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/****/****/eb-test-hoge.
Your public key has been saved in /Users/****/****/eb-test-hoge.pub.
The key fingerprint is:

The key's randomart image is:

WARNING: Uploaded SSH public key for "eb-test-hoge" into EC2 for region us-west-2.
```

```:コマンド
eb create
```

```:結果
Enter Environment Name
(default is flask-tutorial-dev): flask-env
Enter DNS CNAME prefix
(default is flask-env):
```

これで処理が走るのでしばらく待ちます

```:コマンド
eb open
```

このコマンド打った後も実際にサイトが見れるようになるまで少し時間がかかります。
![Elastic_Beanstalk_アプリケーション.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/5ff7ad4b-fc3e-cc5f-512e-5f396d5ac626.jpeg)

URLを使用してサイトに接続すると手元でやったのと同じ環境が構築されているはずです。

###リソースの削除

```:コマンド
eb terminate flask-env
```
TwitterのDMおうむ返ししてみる

Twitter APIを使う練習として、DMで受け取ったメッセージをそのままおうむ返しするbotを作ってみたよ。使用言語はJavascript（Node.js）です。

#1 準備

##1-1 bot用Twitterアカウントを作る

自分のTwitterアカウントにこれから作るおうむ返しbotを仕込むと、すべての友達からのDMにおうむ返ししちゃうので専用アカウントを作ったほうがいいと思う。

##1-2 Twitter APIを使う準備

APIを使うためには、https://dev.twitter.com/ の下部メニューの Manage Your Apps ってのでアプリケーション作成が必要らしいよ。いろいろな人がこの辺のやり方は書いてくれているので、ここでは簡単に。

1. Create New App を押してアプリケーション作成（Website や Callback URL はとりあえず適当でOK）
2. Permissions を Read, Write and Access direct messages に変更
3. Keys and Access Tokens の Create my access token を押して自分用のアクセストークンを取得

手順3で表示される、Consumer Key (API Key), Consumer Secret (API Secret), Access Token, Access Token Secret は後で使うのでメモっておきましょう。

#2 twitter npm パッケージを入手

プログラムを書く前に必要なパッケージを入手します。といっても下記を実行するだけ。
`npm install twitter`

#3 プログラムを書く

あとは動くように書いてみる。

```js:echo.js
var Twitter = require('twitter');

var twitter = new Twitter({
    consumer_key:        'きやメ',
    consumer_secret:     'うつモ',
    access_token_key:    'つをっ',
    access_token_secret: 'す書た',
});

twitter.get('account/verify_credentials',
            { include_entities: false, skip_status: true },
            function (error, info, response) {

    if (error) {
        throw error;
    }

    var myid = info.id;

    twitter.stream('user', function (stream) {

        stream.on('data', function (tweet) {
            var dm = tweet && tweet.direct_message;

            if (dm && dm.sender.id != myid) {
                // if dm from others, echo back to the sender
                send_dm(dm.sender.screen_name, dm.text);
            }
        });

        stream.on('error', function (error) {
            throw error;
        });

    });

});


function send_dm(screen_name, text) {
    console.log('sending dm to %s (message: %s)', screen_name, text);

    twitter.post('direct_messages/new',
                 { screen_name: screen_name, text: text },
                 function (error, tweet, response) {

        if (error) {
            throw error;
        }
    });
}
```

中身はStreaming APIを使って**他人からの**DMを拾って、送信元の人へDMでおうむ返しするようにしたよ。
Streaming APIは自分から送ったDMも拾っちゃうので、他人からのってチェックをしないと、自分のDMを自分でおうむ返しすることになって、ぐるんぐるん回っちゃうよ＠＠

#4 動かしてみる

`node echo.js`

って実行して誰かからDMを送ってもらう。と、おうむ返ししたよね。めでたしめでたし。

ではまたね。
Groonga新リリース自慢会 6.0.2 で教わったことまとめ


去る 4 月 27 日に弊社 CrowdWorks で[Groonga 新リリース自慢会 6.0.2](https://groonga.doorkeeper.jp/events/44055)が開催されました :tada:

そこに飛び入り参加させていただいた際に、全文検索についていろいろとご教授いただきました！
そこでお礼の念を込めて、忘れないうちにまとめてみました！

全文検索初心者がまとめた記事なので間違い等があるかもしれません。
その際は ~~優しく~~ ご指摘頂けると幸いです :bow:

# 用語

## テーブル

Groonga では RDBMS のテーブルと同じようなもの

## カラム

Groonga では RDBMS のカラムと同じようなもの

## インデックス

Groonga では転置インデックスのこと

## 転置インデックス

[wikipedia](https://ja.wikipedia.org/wiki/%E8%BB%A2%E7%BD%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9)によると

> 転置インデックス（てんちインデックス、Inverted index）とは、全文検索を行う対象となる文書群から単語の位置情報を格納するための索引構造をいう。

とのこと。早く検索結果にたどり着くためのもの（だろう）。

# トークナイザー

テキストをトークナイズするモジュールのこと。

## トークナイズとは？

検索対象となる文章や、検索キーワードをある任意の塊（トークン）に分解・抽出すること。
(辞書に登録された)単語ごとに分解する方法や、任意の連続文字数毎に区切る方法がある。

このような文章が有った場合、
![image](https://qiita-image-store.s3.amazonaws.com/0/13998/af34eb97-ccc6-85f9-0c11-811be6ea2c1d.png)

分解する方法は以下の様な方法があります。

### ■ 単語毎に分ける方法

![image](https://qiita-image-store.s3.amazonaws.com/0/13998/b73576de-f6bc-c1a3-c649-f78f050fcf21.png)

### ■ 数文字毎に分ける方法（以下の場合２文字毎）

![image](https://qiita-image-store.s3.amazonaws.com/0/13998/0602892b-03ff-60fc-51d0-701feb57a3f6.png)

#### ○ バイグラム・トリグラム・n-gram ？

トークナイズする際に、特定の文字数毎に区切る方法のこと

バイグラム(bigram) → 2 文字ごとに区切る
トリグラム（trigram） → 鶏肉の重さ...ではなく、3 文字毎に区切る

n-gram → 任意の n 文字で区切る

### ★ 更なる深みへ...

[Groonga ドキュメント 7.8 トークナイザー](http://groonga.org/ja/docs/reference/tokenizers.html)
[Groonga ドキュメント 7.8.2 「トークナイズ」とはなにか](http://groonga.org/ja/docs/reference/tokenizers.html#what-is-tokenize)

# ノーマライザー

`クラウドワークス`と`ｸﾗｳﾄﾞﾜｰｸｽ`のような表記ゆれが発生する単語の場合、そのまま保存すると別のものとして扱われてしまいます。
それを防ぐための処理が**ノーマライズ**！
以下のように、特定の表記に変更します。

```
# 例
ｸﾗｳﾄﾞﾜｰｸｽ → クラウドワークス
ｸﾗｳﾄﾞワークス → クラウドワークス
クラウドワークス → クラウドワークス
```

### ★ 更なる深みへ...

[Groonga ドキュメント 7.7 ノーマライザー](http://groonga.org/ja/docs/reference/normalizers.html)

---

トークナイズしたインデックスを使ってどうやって検索するのか説明を書こうと思ったのですが、ちょっと壮大な記事になりそうだったのと、ちゃんと説明できる自身がなかったので今回は自粛しました...

もちょっと勉強して改めて記事にします 💪
xhyveを応用したDocker on Mac OS Xに関する現状確認

## Docker on Xhyve vs Docker on VirtualBox

2016/02/16にabout.meのJosh Reichardtさんが執筆された[xhyve vs vbox driver benchmarks for docker-machine](https://thepracticalsysadmin.com/xhyve-vs-vbox-driver-benchmarks-for-docker-machine/)によると、[misterbisson/simple-container-benchmarks](https://hub.docker.com/r/misterbisson/simple-container-benchmarks/)を使ったベンチマークによれば、vbox 5上のDockerのほうがファイル書き込み性能が良いという結果になったようです。CPUやネットワークについてはほぼ互角とのこと。

実際xhyve上にDockerを構築するために使われたdocker-machine-driver-xhyveの作者さんによると、[vboxfsよりもI/Oパフォーマンスが出ているという話](http://qiita.com/zchee/items/cb4bb68a0aab12dfa2c1#docker-machine-driver-xhyve%E3%81%AE%E7%8F%BE%E7%8A%B6)もあるそうなので、IO性能で選ぶ場合などは実際試してから判断したほうがよさそうですね。

## Kubernetes on xhyve

[kube-cluster-osx](https://github.com/TheNewNormal/kube-cluster-osx)というOSSを使うと、dmgからアプリをインストールして、インストラクションにしたがって必要事項を埋めるだけで、xhyveベースのVM上にCoreOS + Kubernetesの３ノードからなるクラスタを構築できます。
CoreOSのリリースチャンネルを選べたり、ディスクサイズを変更できたり、helmが同梱されていたり、いつのまにかKubernetesベースとなったDeis v2ベータ版のインストーラがついていたりして、細かいところまで気が利いてます。手元でbetaやstableのCoreOSを選んで試してみましたが、動いています…。便利…。

2016/04/26現在、releasesを見る限りはKubernetes 1.2.1まで対応しているようです。が、そもそも、kube-cluster-osxでインストールするKubernetesのバージョンを自由に選べて、実際インストールしてみたところv1.2.3も動いているようです。

https://github.com/TheNewNormal/kube-cluster-osx/releases

## 脱線: runC on Mac OS X?

まだビルドが通るだけで、実際機能するわけではないそうですが、runCをMac OS Xで動かそう、という試みもあるそうです。Docker 1.11でrunCベースになったそうなので、runCがMac OSXに対応したら、Docker on Mac OS Xが実現するのかな…？

[Docker 1.11: The first runtime built on containerd and based on OCI technology | Docker Blog](https://blog.docker.com/2016/04/docker-engine-1-11-runc/)
[Docker's new RunC doesn't (yet?) work on Mac OS X - Vacuum - Edward Vielmetti in Ann Arbor, MI 48104](http://vielmetti.typepad.com/vacuum/2015/06/dockers-new-runc-doesnt-yet-work-on-mac-os-x-.html)
BigQueryのUDFを使ってJSON Arrayのカラムをフラット化する


例えば以下のように店ごとのデータがJSONのArrayで保存されていた場合、それぞれの種類ごとに集計する場合には一度JSONのArrayを展開する必要があります。


|store|price_data|
|:----:|---|
|a|[{kind: "orange", price: 100}, {"kind": "grape", price: 400}, {kind: "banana", price: 120}]|
|b|[{kind: "strawberry", price: 500}, {kind: "orange", price: 130}, {"kind": "grape", price: 400}, {kind: "banana", price: 150}]|
|c|[{"kind": "grape", price: 400}, {kind: "banana", price: 120}, {kind: "peach", price: 600}]|

このような場合、以下のようにJSON Arrayの各行をemitするUDFを作成すると簡単に集計可能です。

### UDF
```js
function flatten_prices(row, emit) {
  var items = eval(row.price_data);
  items.forEach(function(item) {  // forEachで各行をオブジェクト化してemitする
    emit({store: row.store, kind: item.kind, price: item.price});
  });
}

bigquery.defineFunction(
  'flatten_prices',                     // UDF名
  ['store', 'price_data'],              // Inputされるデータ定義
  [{'name': 'shop', 'type': 'string'},  // Outputするカラム名とその型定義
   {'name': 'kind', 'type': 'string'},
   {'name': 'price', 'type': 'integer'}
   ],
  flatten_prices                        // データを処理する関数
);
```

### Query

```sql
select
  kind,
  count(1),
  min(price),
  max(price),
  avg(price)
from
flatten_prices
(
select
  store,
  price_data
from [Path.to.table]
)
group by kind;
```

### 結果

|Row|kind|f0_|f1_|f2_|f3_|
|---|---|---|---|---|---|
|1|orange|2|100|130|115.0|
|2|grape|3|400|400|400.0|
|3|banana|3|120|150|130.0|
|4|strawberry|1|500|500|500.0|
|5|peach|1|600|600|600.0|

## おわりに

不確定な要素についてJSONで保存しておくのは良いですが、データ量が増えるとそのまま課金額に響くのでご注意。
Watson API Text-To-Speechの音声がSafariで再生できない件


WebAudio で再生しようとするとAudioContext.decodeAudioDataに失敗する

どうやら、こちらにあるヘッダーの破損が原因の様子。
https://developer.ibm.com/answers/questions/180732/seems-watson-text-to-speech-service-returns-a-wav.html


node.jsでTextToSpeechのwavファイルを取得して, クライアントにレスポンスする処理の例

実際にwavデータを見てみると...

バイナリファイルの先頭から ArrayBuffer として出力してみる

	{
	"0": 82,   // R
	"1": 73,   // I
	"2": 70,   // F
	"3": 70,   // F
	"4": 255,  // (totalDataLen & 0xff);
	"5": 255,  // ((totalDataLen >> 8) & 0xff);
	"6": 255,  // ((totalDataLen >> 16) & 0xff);
	"7": 255,  // ((totalDataLen >> 24) & 0xff);
	"8": 87,   // W
	"9": 65,   // A
	"10": 86,  // V
	"11": 69,  // E
	"12": 102, // f
	"13": 109, // m
	"14": 116, // t
	"15": 32,  // ' '
	"16": 16,  // 4 bytes: size of 'fmt ' chunk
	"17": 0,
	"18": 0,
	"19": 0,
	"20": 1,   // format = 1
	"21": 0,
	"22": 1,   // channels
	"23": 0,
	"24": 34,  // sampleRate & 0xff
	"25": 86,  // sampleRate >> 8) & 0xff
	"26": 0,   // sampleRate >> 16) & 0xff
	"27": 0,   // sampleRate >> 24) & 0xff
	"28": 68,  // byteRate & 0xff
	"29": 172, // byteRate >> 8 ) & 0xff
	"30": 0,   // byteRate >> 16) & 0xff
	"31": 0,   // byteRate >> 24) & 0xff
	"32": 2,   // block align
	"33": 0,   // 0
	"34": 16,  // bits per sample
	"35": 0,
	"36": 76,  // L
	"37": 73,  // I
	"38": 83,  // S
	"39": 84,  // T
	"40": 26,  // totalAudioLen & 0xff = 16x2+6=38byte??
	"41": 0,   // totalAudioLen >> 8 & 0xff
	"42": 0,   // totalAudioLen >> 16 & 0xff
	"43": 0    // totalAudioLen >> 24 & 0xff
	}


長さ部分の表示が、、明らかに違う.. 全部255で埋まっている... (実際にデータは数KB)
36-39 は "data" が入る想定だが,実際には "LIST" と入っている.

結果的に以下のように, ヘッダーを入れ替える関数を用意して、処理する.

	var buffer = getBufferWithFixedWavHeader(response);
	
	/**
	 * get ArrayBuffer by fixed header data
	 * @param data binaryData
	 * @return ArrayBuffer
	 */
	function getBufferWithFixedWavHeader(data){
		var headerSize = 44;
		var metaDataSize = 48;
		
		var noHeaderLen   = data.length - (headerSize + metaDataSize);
		var totalAudioLen = noHeaderLen;
		var totalDataLen  = noHeaderLen + headerSize - 8;
		
		var header = new ArrayBuffer(headerSize);
		for(var i = 0; i < headerSize; i++){
			header[i] = data[i];
		}
		
		// Total Data Length
		header[4] = (totalDataLen & 0xff);
		header[5] = ((totalDataLen >> 8) & 0xff);
		header[6] = ((totalDataLen >> 16) & 0xff);
		header[7] = ((totalDataLen >> 24) & 0xff);
		// data
		header[36] = 100; //'d'
		header[37] = 97;  //'a'
		header[38] = 116; //'t'
		header[39] = 97;  //'a'
		// Total Audio Length
		header[40] = (totalAudioLen & 0xff);
		header[41] = ((totalAudioLen >> 8) & 0xff);
		header[42] = ((totalAudioLen >> 16) & 0xff);
		header[43] = ((totalAudioLen >> 24) & 0xff);
		
		// join
		var buffer = new ArrayBuffer(headerSize + noHeaderLen);
		// header
		for(var i = 0; i < headerSize; i++){
			buffer[i] = header[i];
		}
		// data
		for(var i = headerSize,j = (headerSize+metaDataSize) ; j < data.length ; i++,j++){
			buffer[i] = data[j];
		}
		
		return buffer;
	}