OmniAICreator/Qiita-1.07M huggingface dataset:
SVGで動的に円を追加

* SVGは名前空間が必要なので、名前空間を忘れない
* SVGでのDocumentは evt.target.ownerDocumentで取得できる。

```circle.svg
<svg xmlns="http://www.w3.org/2000/svg" onload="func(evt)">
<script>
function func(evt) {
    var ns = "http://www.w3.org/2000/svg";
    var doc = evt.target.ownerDocument;
    var circle = doc.createElementNS(ns, 'circle');
    circle.setAttribute('cx', '100');
    circle.setAttribute('cy', '100');
    circle.setAttribute('r', '50');
    doc.documentElement.appendChild(circle);
}
</script>
<rect x="10" y="10" width="100" height="100" />
</svg>
```
[Mac][ターミナル]ターミナルのログを自動で取得する


## 目的

* ターミナルを起動したときに自動でログを取得したい
	* 出力をコピーするのが面倒くさい
		* 障害対応で毎度コピーするくらいなら最初から設定したい
	* 振り返りたい
		* 操作したコマンドなんだっけ？
		* あの時の実行結果どうだったけ？
	* 監査目的
		* 操作ログは残せ！と言われた
	* 超慎重派


## 設定方法
### ログ出力用のディレクトリを作成する

```コマンド
mkdir -p /Users/[username]/scriptlogs/
```

### [ターミナル.app]を起動する

### [ターミナル] - [環境設定]を開く
![スクリーンショット 2014-02-11 17.51.54.png](https://qiita-image-store.s3.amazonaws.com/0/17518/d6275fec-3dd2-53ae-0c95-0cfcc060b85d.png "スクリーンショット 2014-02-11 17.51.54.png")

### [設定]- [シェル]を開いて、[コマンドを実行]にチェックを入れる
![スクリーンショット 2014-02-11 18.11.14.png](https://qiita-image-store.s3.amazonaws.com/0/17518/390baf9c-ec8f-76c2-4688-0417695e6fb1.png "スクリーンショット 2014-02-11 18.11.14.png")

### 以下をテキストボックスに入力

```コマンドライン
now=`date +%Y%m%d%H%M%S`;logpath=~/scriptlogs/script_${now}.txt ;script ${logpath}
```

ログファイルが沢山増えたときに探したりlsが遅くなったりして大変になるので、ディレクトリを分けたければ、ディレクトリ用の変数と、ファイル名用の変数を設定する。
mkdir -p を使えばディレクトリがなければ作成してくれるし、なければ何もしない（エラーも吐かない）。
e.g. ~/scriptlogs/yyyy/mm/dd/script_hhmmss.txt 

```コマンドライン
directory=~/scriptlogs/$(date +%Y)/$(date +%m)/$(date +%d);filename=script_$(date +%H%M%S).txt;mkdir -p ${directory}; script ${directory}/${filename}
```

### ターミナルを一度閉じる

### ターミナルを起動する

以下のように表示される

```表示
Last login: Tue Feb 11 18:01:38 on ttys002
now=`date +%Y%m%d%H%M%S`;logpath=/Users/[username]/scriptlogs/script_${now}.txt ;script ${logpath}
[username]-no-MacBook-Air:~ [username]$ now=`date +%Y%m%d%H%M%S`;logpath=/Users/[username]/scriptlogs/script_${now}.txt ;script ${logpath}
Script started, output file is /Users/[username]/scriptlogs/script_20140211180947.txt
bash-3.2$ 
```

### 「bash-3.2$」ってプロンプトが気に食わない人は…

```コマンド
bash --login
```
tar(1) でアーカイブ前の名前ではなく新たな名前のディレクトリで展開したいときのメモ


#### こんな構成のディレクトリ```before```をアーカイブするとします。
```shell::
$ tree before/
before/
├── one
│   ├── two
│   │   └── three
│   └── two1
└── one1

3 directories, 2 files

$ tar czvf dummy.tgz before
before/
before/one/
before/one/two1
before/one/two/
before/one/two/three/
before/one1
```

#### これを```after```という名前で展開します。
```shell::
$ mkdir after && tar xzvf dummy.tgz -C after --strip-components 1
before/one/
before/one/two1
before/one/two/
before/one/two/three/
before/one1

$ tree after/
after/
├── one
│   ├── two
│   │   └── three
│   └── two1
└── one1

3 directories, 2 files
```

#### 実現させてくれるオプションのmanualは以下のとおり。
```
-C, --directory=DIR
       change to directory DIR

--strip-components=NUMBER
       strip NUMBER leading components from file names on extraction
```

#### ちなみに```--strip-components```の引数の値を変えてみるとこんな感じです。上位のN階層を「剥ぎとって」くれるようですね。
```shell::
$ mkdir after2 && tar xzvf dummy.tgz -C after2 --strip-components 2
before/one/two1
before/one/two/
before/one/two/three/

$ tree after2
after2
├── two
│   └── three
└── two1

2 directories, 1 file
```
anything-git-files-elをhelmに移植

taraoさん作の[anything-git-files-el](https://github.com/tarao/anything-git-files-el)はsubmoduleも一覧表示できるという素晴しい機能を持っているので、helmに移植してみた。

リポジトリ：https://github.com/kenbeese/helm-git-files

導入方法
===========
`~/.emacs.d/elisp`にhelm-git-files.elを置いて、
`.emacs`に以下を書き込む。

```el
(add-to-list 'load-path "~/.emacs.d/elisp/")
(require 'helm-git-files)
```

後は`M-x helm-git-files`とすれば、一覧表示されるはずだ!


私の設定
========
私は以下のように、recentfからgit repositoryに属しているファイルのみを
絞ったソースを用意して、それと一緒に表示してる。

```el
(require 'helm-git-files)

(defvar knbs-git-recentf-list '())

(defun knbs-git-set-recentf-list (rlist)
  (let ((root (helm-git-files:root))
        glist)
    (setq knbs-git-recentf-list '())
    (when root                          ; check in git repository
      (dolist (f rlist)
        (if (eq (string-match root f) 0)
            (add-to-list 'knbs-git-recentf-list f t))))))

(setq knbs-helm-source-git-recentf
  `((name . "Git Recentf")
    (init . (lambda ()
              (require 'recentf)
              (or recentf-mode (recentf-mode 1))
              (knbs-git-set-recentf-list recentf-list)))
    (candidates . knbs-git-recentf-list)
    (keymap . ,helm-generic-files-map)
    (help-message . helm-generic-file-help-message)
    (mode-line . helm-generic-file-mode-line-string)
    (action . ,(cdr (helm-get-actions-from-type
                     helm-source-locate))))))

(defun knbs-helm-git-files ()
  "`helm' for opening files managed by Git."
  (interactive)
  (helm-other-buffer `(knbs-helm-source-git-recentf
                       helm-git-files:modified-source
                           helm-git-files:untracked-source
                           helm-git-files:all-source
                           ,@(helm-git-files:submodule-sources
                              '(modified untracked all)))
                         "*helm for git files*"))
```
enchant.jsのプラグインとオブジェクトについて

#enchant.jsプラグイン

*  **nineleap.enchant.js** 
ゲーム投稿サイト[9leap](http://9leap.net/)でのゲームスタート・オーバ画面の表示と、
スコアランキングを表示する。  

*  **twitter.enchant.js** 
[9leap](http://9leap.net/)でTwitterアカウントを使ってログインしているユーザの、
Twitter情報を取得する。  

*  **memory.enchant.js** 
[9leap](http://9leap.net/)でTwitterアカウントを使ってログインしているユーザの、セーブデータを保存する。
デバック機能を使ってブラウザのローカルストレージに保存することもできる。

*  **ui.enchant.js** 
十字キーパッド、アナログパッドやグラフィックフォントを利用したラベルなど
ゲームの中で使われる UI部品のクラスを定義したプラグイン

*  **gl.enchant.js** 
WebGLを用いた３Dな描画ができる。three.jsみたいなの。

*  **bone.gl.enchant.js** 
ボーンアニメーションができる。

*  **collada.gl.enchant.js** 
collada形式のモデルデータを読み込む。
無料のモデリングソフトだと、Blenderでいけるっぽい。
メタセコイアのデータの場合は下記参照
（[gl.enchant.js 上でメタセコイアのデータを読み込めるようにするプラグイン mqo.gl.enchant.js を作りました | TM Life](http://tmlife.net/programming/javascript/gl-enchant-js-plugin-metasequoia.html)）

*  **avatar.enchant.js** 
ユビキタスが過去に商用サービスで使っていた画像素材の一部を使ってキャラクターを作成する機能

*  **mmd.gl.enchant.js** 
ミクのアニメーションデータ形式（pmd, vmd）に対応したプラグイン

*  **widget.enchant.js** 
様々なUI部品をを利用できるプラグイン。

*  **box2d.enchant.js** 
2D物理シミュレーション機能

■ 詳細
[Plugins | enchant.js - A simple JavaScript framework for creating games and apps.](http://enchantjs.com/ja/resource-ja/plugins/)

#enchant.jsのオブジェクトについて

*  **Label** ....文字列の表示
*  **Sprite** ...画像の表示
*  **Map** ......タイルを並べて作った画をうを1つの大きな画像にする
*  **Entity** ...Sprite/Lavel/Mapの基底
*  **Scene** ....描画オブジェクト(Lavel,Sprite,Map,Groupなど)を貼付ける画面オブジェクト
*  **Group** ....複数の描画オブジェクトを1つの描画オブジェクトにまとめる
*  **Surface** ..画像や図形のデータを保持する
*  **Node** .....表示オブジェクトツリーに属する基底
*  **Core** .....ゲームの画面やメインループ、シーンを管理する
*  **EventTarget** ...イベントリスナを管理する
*  **Sound** ....サウンドを管理する


##enchant.jsの継承ツリー
![img_01.gif](https://qiita-image-store.s3.amazonaws.com/0/3140/43e72146-5e2a-3981-92cd-e23723f9fcb9.gif)

下の方にある子オブジェクトは親オブジェクトのメソッドやプロパティを利用できる。

##表示オブジェクトツリー
![img_02.gif](https://qiita-image-store.s3.amazonaws.com/0/3140/1f92a1a0-c11e-affe-ab6b-6526540f1091.gif)

描画オブジェクの表示順をツリー構造で管理している。

#参考書籍
[はじめて学ぶ enchant.jsゲーム開発](http://www.c-r.com/book/detail/900)
VBAマクロ作成時にドハマりした事

最近ちょっとWordでやりたいことが出てきてVBAを触らざるを得なかったのですが、変な所でハマってしまったので備忘もかねて投稿します。
##Word VBAマクロはExcel VBAマクロじゃない
「やりたい事 + VBA」なんかでググると大抵ExcelのVBA記事が引っかかる上に、似たような名前のオブジェクトがあったりします。が、別物です。
例：図形を新規作成して文字を入れる場合、Excelの場合にはShapeのTextFrameプロパティに"Characters"があり、
そのTextに入れればいいのですが、WordのShape.TextFrameにはCharactersはありません。
"TextRange.Text"に入れましょう。以下参考リンク。
[Microsoft.Office.Interop.ExcelのTextFrame]
(http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.textframe(v=office.11).aspx)
[Microsoft.Office.Interop.WordのTextFrame]
(http://msdn.microsoft.com/ja-jp/library/Microsoft.Office.Interop.Word.TextFrame(v=office.11).aspx)
##Office 2007から図形内のテキストは「自動を選択すると白色になる」
素直に黒を指定しましょう。Wordだと
(任意のShape).TextFrame.TextRange.Font.ColorIndex = wdBlack
みたいです。Excelは調べてください。
jqを使って今日の天気を取得

最近、jqコマンドを覚えました。めっちゃ便利ですね、これ。

"jq"でググってたら、こちらの記事（[shell - シェルで今日の天気予報表示 - Qiita](http://qiita.com/stc1988/items/70e27508e2febc20571d)）に辿り着いたので、練習にとこれを改造してみました。
かなり適当なので汚いですが…

## シェルでやってみる
```zsh
WEATHER_CITY=130010
curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=$WEATHER_CITY | jq -r '.location.prefecture+" - "+.location.city+" ( "+.publicTime+" 発表 )\n  今日の天気は "+.forecasts[0].telop+"\n  最高気温: "+ if .forecasts[0].temperature.max == null then "不明" else .forecasts[0].temperature.max.celsius+"℃" end +" / 最低気温: "+ if .forecasts[0].temperature.min == null then "不明" else .forecasts[0].temperature.min.celsius+"℃"end'
```

こちらを実行するとこんな感じに表示されます。

```zsh
東京都 - 東京 ( 2014-02-11T17:00:00+0900 発表 )
  今日の天気は 曇り
  最高気温: 不明 / 最低気温: 不明
```

`WEATHER_CITY=130010` で表示したい地点のIDを指定してください。（[ID一覧](http://weather.livedoor.com/forecast/rss/primary_area.xml)）
130010で東京都の東京を表してます。

最高気温と最低気温が"不明"と表示されていますが、どうも天気予報の取得に利用しているAPI（Weather Hacks）の仕様らしく、時間帯によっては気温の部分がnullで返ってくるぽいです。
（そもそも定時に気象庁の発表している情報に気温の情報が含まれてないんですかね）


## シェル関数にしてみる

```zsh
weather() { curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=$1 | jq -r '.location.prefecture+" - "+.location.city+" ( "+.publicTime+" 発表 )\n  今日の天気は "+.forecasts[0].telop+"\n  最高気温: "+ if .forecasts[0].temperature.max == null then "不明" else .forecasts[0].temperature.max.celsius+"℃" end +" / 最低気温: "+ if .forecasts[0].temperature.min == null then "不明" else .forecasts[0].temperature.min.celsius+"℃"end' }
```

とすることで、以下の様なコマンドの形で利用できるようになります。

```zsh
$ weather 130010
東京都 - 東京 ( 2014-02-11T17:00:00+0900 発表 )
  今日の天気は 曇り
  最高気温: 不明 / 最低気温: 不明
```

さらにこれを`~/.zshrc`や`~/.bashrc`に記述しておくことで、いつでも今日の天気をチェックすることができます
いちいちブラウザ開いて天気予報サイト開く手間が省けますね！

以上です。
NaNの判定について

NaNをisNaNで判定しようとするとおかしな事になる可能性があるので気をつけましょうって話です。
[Effective JavaScript](http://www.amazon.co.jp/Effective-JavaScript-JavaScript%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AB%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%8468%E3%81%AE%E5%86%B4%E3%81%88%E3%81%9F%E3%82%84%E3%82%8A%E6%96%B9-David-Herman/dp/4798131113)で紹介されていたのですが、知らなかったのでメモです。

## isNaNの挙動
標準で用意されているisNaNにNaNを渡すと確かにtrueが返ります。
ただ、暗黙の型変換によって引数を数値へと変換してしまう為、NaN自身でなくても、NaNへと変換される類のものに対してもtrueを返してしまいます。

```js
isNaN(NaN);                // true
isNaN("foo");              // true
isNaN(undefined);          // true
isNaN({});                 // true
isNaN({ valueOf: "foo" }); // true
```

isNaNはNaNであるかの判定ではなく、引数が数値へ変換可能かどうかの判定に使われるみたいです。

## NaN判定のイディオム
[Effective JavaScript](http://www.amazon.co.jp/Effective-JavaScript-JavaScript%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AB%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%8468%E3%81%AE%E5%86%B4%E3%81%88%E3%81%9F%E3%82%84%E3%82%8A%E6%96%B9-David-Herman/dp/4798131113)では、NaNが自身との等号判定でfalseを返すという性質を利用して、以下のようなイディオムが紹介されていました。

```js
NaN === NaN    // falseを返す!!!
function isReallyNaN(x) {
  return x !== x;    // xがNaNであればtrue, それ以外ではfalse
}
```

確かに、これで判定出来ますね。

## Number.isNaN
ECMAScript6ではNumber.isNaNというのが策定されて、きちんとNaNを判別出来るようになったようです。

```js
Number.isNaN(NaN);   // true
Number.isNaN('NaN'); // false
```

[このページ](http://qiita.com/VoQn/items/f0525429a2831890b2e6)を参考にしました。
標準で判定用の関数が用意されるなら、そちらを使った方が良さそうですね。
tweepy.error.TweepError: Failed to send request: [Errno -2] Name or service not known　について

 tweepy.error.TweepError: Failed to send request: [Errno -2] Name or service not known
なるエラーがtweepyを使ってPythonでTwitterBotを作っている最中に発生しました。
それの原因や対処について私のブログにまとめたので良かったら読んでみてください。

http://infotech776.blog.fc2.com/blog-entry-39.html
Dart で Grunt みたいなことをする

JavaScript には [Grunt](http://gruntjs.com/) という有名なタスクランナーがあり, Lint や Unit Test, あるいはドキュメント生成の設定を事前に記述しておくとコマンド一つで実行できてとても効率的だ.

Dart では同様のことを達成するためのツールとして [Hop](http://pub.dartlang.org/packages/hop) というものがあるようだ.

## インストールする

`pubspec.yaml` に次のような行を追加して, `pub install` する.

```yaml:pubspec.yaml
...
dependencies:
  ...
  hop: any
```

## タスクを記述する

Hop を採用しているプロジェクトを見ると, タスクの記述は `tool/hop_runner.dart` に記述するのが慣例のようだ.

次のように `main()` 関数内で `addTask()` の呼び出しによりタスクを登録する.

```dart:tool/hop_runner.dart
library hop_runner;

import '../test/test_runner.dart' as test_runner;
import 'package:args/args.dart';
import 'package:hop/hop.dart';
import 'package:hop/hop_tasks.dart';
import 'dart:async';
import 'dart:io';

void main(List<String> args) {

  // Add a task to execute dartanalyzer: the static analyzer.
  // The task analyzes Dart files under `lib/` directory.
  addTask('analyze', createAnalyzerTask(_expandDir('lib')));

  // Add a task to execute unit tests.
  // The task starts `testCore()` function described in `../test/test_runner.dart`.
  addTask('test', createUnitTestTask(test_runner.testCore,
        timeout: new Duration(seconds: 10)));

  // Add a task to generate documents for Dart files under `lib/` directory.
  // The documents are checked into `gh-pages` branch.
  addTask('docs', createDartDocTask(_expandDir('lib'),
        targetBranch: 'gh-pages',
        packageDir: 'packages/',
        linkApi: true));

  runHop(args);
}

/**
 * Returns a list includeing Dart files under directory specified by an argument.
 */
Future<List<String>> _expandDir(String dirName) {
  return new Directory(dirName)
    .list(recursive: true)
    .where((FileSystemEntity fse) =>
        fse is File && fse.path.endsWith('.dart'))
    .map((File file) => file.path)
    .toList();
}
```

ここでは次のようなタスクを登録している.

* **analyze** - `lib/` 以下の Dart ファイルを静的解析する
* **test** - `test/test_runner.dart` に記述されているユニットテストを実行する
* **docs** - `lib/` 以下の Dart ファイルからドキュメントを自動生成して `gh-pages` ブランチ (Git) にチェックインする

それぞれのタスクの作成には Hop にビルトインされている `createAnalyzerTask()`,`createUnitTestTask()`, `createDartDocTask()` メソッドを利用した.

Hop にはその他にもいくつかのビルトインのメソッドがあり, 仕様は[ここ](http://dart-lang.github.io/hop/index.html)で確認できる.

## タスクを実行する

`dart tool/hop_runner.dart` に続けてタスク名を指定する.

例えば, `test` タスクを実行するためには次のようにコマンドする.

```bash
$ dart tool/hop_runner.dart test
```

または

```bash
$ dart --checked tool/hop_runner.dart test
```
`:=` の動作を理解する


Go の `:=` は非常に便利なのですが、特に多値を扱うときにハマる可能性があるので、よく理解して使いましょう。

## 基本

まずは次のコードを見てください。([Playground](http://play.golang.org/p/Kg3dIapZyo))

```go
package main

import "fmt"

func main() {
	a := 1
	// a := 2    // これはコンパイルエラー
	a, b := 3, 4 // a は定義ではなくただの代入

	if b := true; b { // この b は if スコープで定義される
		a, c := 5.5, 7 // これらも if スコープで定義
		fmt.Println("a=", a, ", b=", b, ", c=", c)
	}
	fmt.Println("a=", a, ", b=", b)
}
```

まとめると:

* `:=` は左辺に最低一つ新しい変数の定義が無いとエラーになる。
* ブロックスコープ内で `:=` を使うと、ブロック外の変数を shadowing する形で新しい変数を定義する
* ブロックスコープは `{}` の間だけでなく、 if や switch などのキーワードと `{` の間も含まれる。

## イディオム

基本さえ理解してしまえば、実際に使うのは C++ や Java と比べて特に難しいことはありません。

### スコープを最小限に

可能なら if や switch の内側での定義を活用し、変数名の衝突を避ける。

### 頻出イディオムは慣習に従う
```go
val, err := someFunc()
if err != nil {
    return err
}
// val を使った処理
```
などの場合、 `err` を if のスコープにはできません。
とはいえ、 bool 型の ok, error 型の err など、頻出するイディオムに対する変数名は慣習に従うことで、その後の `val, err := ...` などの場面で再定義によるコンパイルエラーを避けられます。

### `:=` を避ける
`:=` を使っていて怖いのは次のようなケースです。

```go
func foo(v int) (int, error) {
    ret := defaultValue()
    if pred(v) {
        // ret に代入するつもりが再定義
        if ret, err := someFunc(v); err != nil {
            log.Println("ret=", ret)  // コンパイラの未使用変数チェックもすり抜ける
            return -1, err
        }
    }
    return ret, nil
}
```

val や関数の戻り値変数を使って、スコープの先頭で変数を定義し、 `:=` を避ける事ができます。

```go
func foo(v int) (ret int, err error) {
    ret = defaultValue()
    if pred(v) {
        if ret, err = someFunc(v); err != nil {
            log.Println("ret=", ret)
            return -1, err
        }
    }
    return
}
```


定義と初期化をセットにするのは、とくに一度初期化したらあとは参照するだけで再代入しない変数に対してはとても良い習慣ですが、再代入される変数はスコープの先頭で定義するのも悪くないと思います。型も明示できますしね。
Ruby2.1で素数ライブラリ「Prime」の計算速度が向上したので処理時間測定

Ruby2.0から、Ruby2.1にアップデートされ、
**素数ライブラリ「Prime」の計算速度が大きく向上したようです。**

そこで、ベンチマークをしてバージョン「2.0.0-p353」と「2.1.0-p0」の処理時間を比べてみました。


ベンチマークに使ったのは、5,000,000までの素数の配列を変数に格納するプログラムです。

```ruby:benchmark_prime.rb
require 'prime'

start_time = Time.now
primes = Prime.each(5000000).to_a
puts "処理時間: #{Time.now - start_time} [秒]"
```

バージョンの切り替えはrbenvを使いました。

```bash
$ rbenv global 2.0.0-p353
$ ruby benchmark_prime.rb

$ rbenv global 2.1.0
$ ruby benchmark_prime.rb
```

**結果**
（環境:Ubuntu 12.04LTS, CPU Celeron Dual-Core 1.2GHz）

|バージョン  | 2.0.0-p353 | 2.1.0-p0    |
|:----------|:-----------|:------------|
|処理時間[秒]|65.58       |2.50    |

**このプログラムだとRuby2.1では2.0に比べて約3.8％の処理時間で実行できることが分かりました。**
環境やプログラムに依存することが大きいと思うので、色々試していただければと思います。
GoogleChartAPIの折れ線グラフの色を変える


```javascript:chart.js
chart.draw(graphData, {
    colors :['#000000'], // ここでかえる。
    width  :500,
    height :300
};

```


// ------ 参考URL

http://stackoverflow.com/questions/4445072/google-chart-color

https://developers.google.com/chart/interactive/docs/gallery/linechart?hl=ja
git treeのエイリアス設定

新しい環境を用意するときに、いつもエイリアスを忘れるのでメモ。

git logをサマリ＆ツリーで見られるので重宝させていただいています。
どこでブランチ分かれたとかもわかるし。

```:~/.gitconfig
[alias]
    tree = log --graph --date=short --pretty='format:%C(yellow)%h%Creset %s %Cgreen(%an)%Creset %Cred%d%Creset'
```

あとで何か思い出したら追記するかも。
Postfix で特定の宛先だけを AWS SES に流す

効果があるかどうかは不明ですが、メールを沢山送る際に受信制限の厳しいサーバー宛だけを AWS SES に流すことで遅延を防ぐ（防げるかどうか誰か試してみて）方法。

Postfix におけるメールのリレーは master.cf で定義されている `smtp` もしくは `relay` に渡されるが、ここに SES 用の定義を追加する。

```:master.cf
ses       unix  -       -       n       -       -       smtp
        -o smtp_fallback_relay=
        -o smtp_sasl_auth_enable=yes
        -o smtp_sasl_password_maps=hash:/etc/postfix/sasl-ses
        -o smtp_sasl_security_options=noanonymous
        -o smtp_sasl_mechanism_filter=plain
        -o smtp_use_tls=yes
        -o smtp_tls_security_level=encrypt
        -o smtp_tls_note_starttls_offer=yes
        -o smtp_tls_CAfile=/etc/ssl/certs/ca-bundle.crt
```

SMTP AUTH 用の ID、パスワードを `smtp_sasl_password_maps` で指定した `/etc/postfix/sasl-ses` に書きます。

```:sasl-ses
email-smtp.us-east-1.amazonaws.com  SES_ACCESS_KEY:SES_ACCESS_SECRET
```

hash map なので postmap コマンドで sasl-ses.db ファイルを作成します。

```
sudo postmap /etc/postfix/sasl-ses
```

SES に流すのは特定の宛先だけなので `transport_maps` を使います。
`postconf` コマンドで設定値を確認します。設定されてなかったら `/etc/postfix/main.cf` で設定します。

```
$ postconf transport_maps
transport_maps = hash:/etc/postfix/transport
```

`/etc/postfix/transport` ファイルにその特定アドレスの定義を行います。書き換えたら

```
$ sudo postmap /etc/postfix/transport
```

で .db ファイルを更新します。

```:transport
example.com         ses:email-smtp.us-east-1.amazonaws.com
user-1@example.net  ses:email-smtp.us-east-1.amazonaws.com
```

これで設定を反映させれば指定の宛先だけ SES にリレーされるはずです。

SES のホスト名はリージョンによって違うと思います。sasl-ses* ファイルのパーミッション設定には気をつけてください。
Google Analyticsでイベントを送信している場合に直帰率がおかしくなる(異常に低くなる)ことがある問題への対処方法

## 背景と問題
Google Analyticsを使っていて、一部のアクションが実行された場合にイベントを送信するようにしていたところ、イベント送信を始めたあたりから直帰率が異常に低くなった。

## 解決方法
### ga.jsを使っている場合
_trackEvent()送信時に`noninteraction`というパラメータを`true`にすると直帰率が戻る。

>
Default value is false. By default, the event hit sent by _trackEvent() will impact a visitor's bounce rate. By setting this parameter to true, this event hit will not be used in bounce rate calculations.
>
[Tracking Code: Event Tracking - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEventTracking?hl=en&csw=1)

ということで、何も設定せずにイベント送信しているとデフォルトではそのイベントが直帰率に影響する仕様だった。

### analytics.jsを使っている場合

原因はga.jsと近いけど設定方法は異なるので注意。詳細は[Analytics.js Field Reference - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#nonInteraction)を参照。
for文とWhile文を速度計測

久々にC言語に触れたのでなんとなく。
コンパイラはVC2013のCL。

コンパイルオプションは、```/Ot /FA```をつけます。

#計測対象
```c:time_while.c
#include <stdio.h>
#include <time.h>

int main(void)
{
    clock_t start, end;
    int i=0;
    int a=0;

    start = clock();

    while(i<10000*10000) { 
        ++a;
        ++i;
    }
    end = clock();

    printf("%.10lf[s]\n", (double)(end - start)/CLOCKS_PER_SEC);

    return 0;
}
```

ループ文だけ変えます。

```c:time_for.c
#include <stdio.h>
#include <time.h>

int main(void)
{
    clock_t start, end;
    int i=0;
    int a=0;

    start = clock();

    for( ;i<10000*10000; ++i) { 
        ++a;
    }
    end = clock();

    printf("%.10lf[s]\n", (double)(end - start)/CLOCKS_PER_SEC);

    return 0;
}
```

# 計測結果
While文
```0.2320000000[s]```
for文
```0.2800000000[s]```

意外と差がつきました。

# アセンブリ
長かったので、ループ部分だけ抜き出してみた。

```:time_while.asm
; Line 10
    call    _clock
    mov DWORD PTR _start$[ebp], eax
$LN2@main:
; Line 12
    cmp DWORD PTR _i$[ebp], 100000000       ; 05f5e100H
    jge SHORT $LN1@main
; Line 13
    mov eax, DWORD PTR _a$[ebp]
    add eax, 1
    mov DWORD PTR _a$[ebp], eax
; Line 14
    mov ecx, DWORD PTR _i$[ebp]
    add ecx, 1
    mov DWORD PTR _i$[ebp], ecx
; Line 15
    jmp SHORT $LN2@main
$LN1@main:
; Line 16
    call    _clock
    mov DWORD PTR _end$[ebp], eax
```

```:time_for.asm
; Line 10
    call    _clock
    mov DWORD PTR _start$[ebp], eax
; Line 12
    jmp SHORT $LN3@main
$LN2@main:
    mov eax, DWORD PTR _i$[ebp]
    add eax, 1
    mov DWORD PTR _i$[ebp], eax
$LN3@main:
    cmp DWORD PTR _i$[ebp], 100000000       ; 05f5e100H
    jge SHORT $LN1@main
; Line 13
    mov ecx, DWORD PTR _a$[ebp]
    add ecx, 1
    mov DWORD PTR _a$[ebp], ecx
; Line 14
    jmp SHORT $LN2@main
$LN1@main:
; Line 15
    call    _clock
    mov DWORD PTR _end$[ebp], eax
```

for文だと、最初にジャンプがあるというくらいの差かな。
加算処理を頭に置いているからジャンプしなければならない、と。

ふむふむ。
超エコで超高速なやつらの性能比較: Go vs Node.js (vs Vert.x)

# 超エコで超高速なやつらの性能比較: Go vs Node.js (vs Vert.x)

今時のWebで大量接続で高負荷になりそうなサイトを作りたい人は必見。
スタートアップ起業が選ぶなら、こういう言語やフレームワークを選ぶべき。
人気が出て急激な負荷に耐えられる様に、最初から正しいアーキテクチャを選んでね。
妙なやつを選んだらサーバはたくさん必要だし、クラウドでも費用が高くなるし大変だよ。

Node.js vs Go の記事を読んだのでこの記事を書いています。
http://yosuke-furukawa.hatenablog.com/entry/2014/02/10/134014
https://speakerdeck.com/yosuke_furukawa/benchmarking-node-dot-js-vs-golang
http://sssslide.com/speakerdeck.com/yosuke_furukawa/benchmarking-node-dot-js-vs-golang

![Go_Node_Vert.png](https://qiita-image-store.s3.amazonaws.com/0/16128/d1f02214-df4b-a92b-52be-c46f0ec81d2e.png)

# Go
Go 速いっスねぇ。
やっぱりコンパイラだね。
Goroutine とかが効いているんだろうな。
結構エコだと思う。
プログラマが少ないのがちょっと気になる。
C/C++ でやるよりは Go をお勧めします。
メモリーリークさせるより GC で解決する方が今時だよね。

# Node.js
でもしばらく Node.js で行きたいかな。
JavaScript プログラマはいっぱいいるし。
簡単でエコだと思う。
ES6 がデフォルトで動く node v4/v5 を使うといいかな。
ES6 generators/yield を使った aa や co とか koajs が革命を起こすと信じている。
(ES7 async/await を ES6 generators/yield と aa/co で実現できる)
co-monk (MongoDB) もちゃんとやってみたいね。
(coroutine の co ね, async-await の aa ね)
コールバック地獄に陥っている人、是非注目してね。
他の言語の yield と同じと思っている人は大間違いだよ。
スレッドをほとんど使わないのが超エコなんだよね。

# Vert.x
Java VM が好きな人は Vert.x でやってね。
Java, JavaScript, Ruby, Python プログラマはたくさんいるし
既存のライブラリも呼べていいと思う。
Groovy もあるし Scala, Clojure, とかもそのうち。
で、しっかりとエコだと思う。
Java 8 以降がいいかな。
Lambda 式とか使えるし。

# Go も Vert.x も速いね

## Go 速い
http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=json

## Vert.x も速い
http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=plaintext

# 参考: Go 関係
http://www.slideshare.net/derekcollison/go-conference-japan
http://www.slideshare.net/mgiglesias

# 参考: Node.js 事例

* LinkedInの事例: Ruby Rails から Node.js
http://www.infoq.com/jp/news/2012/10/Ruby-on-Rails-Node-js-LinkedIn

* PayPalの事例: Java から Node.js
http://www.infoq.com/jp/news/2014/01/paypal-java-javascript

* アメーバピグ, ピグライフ
http://www.slideshare.net/akuwano/ss-8876695
http://ameblo.jp/ca-1pixel/entry-11476850674.html
http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=001987

* [Node.js について知っておくべきこと](http://readwrite.jp/archives/2125)
この記事を読んで、同感だなぁ... と思った。
そうなんだよ。他の言語じゃダメなんだよ。
というか他の仕組みじゃダメなんだよ。
という事でこの記事を書いています。

* Life is beautiful - node.js と thread hog の話
以前、これ読んでうれしくなった。
・Life is beautiful - [node.js と thread hog の話（１）](http://satoshi.blogs.com/life/2012/10/thread_hog.html)
・Life is beautiful - [node.js と thread hog の話（２）](http://satoshi.blogs.com/life/2012/10/thread.html)
・Life is beautiful - [node.js と thread hog の話（３）](http://satoshi.blogs.com/life/2012/10/closure.html)
・[Life is beautiful](http://satoshi.blogs.com/life/)

* [Node.jsはC10K問題を解決する銀の弾丸か](http://tech-public.blogspot.jp/2012/12/nodejsc10k.html)
他の言語で C10K サーバを実装してみるとどれだけ苦労するのかがわかり
Node.js がどれだけ簡単に記述できるのかわかると思うよ。

* 自分でも Node.js で C10K サーバ書いてみた
大体 16000 までくらいなら接続できる様だ。C16K だね。
また別記事書く予定。

* [サーバーマシン1台で同時接続者数1万名を実現するにはどうすればいいのかというノウハウと考え方](http://gigazine.net/news/20120831-10000-jointer-1-server-cedec2012/)

* [サーバーマシン１台でMMO同時接続者数10,000名を実現する方法](http://cedec.cesa.or.jp/2012/program/AB/C12_I0284.html)
キー値監視(KVO)


オブジェクトのプロパティ値が変更されたのを検出できます。

```objectivec:
{
	[obj addObserver:self forKeyPath:@"prop" options:NSKeyValueObservingOptionNew context:nil];
}

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
	if ([keyPath isEqualToString:@"prop"]) {
		// object.propが更新された.
	}
}
```
Re:haskellの数値のなんか

[haskellの数値のなんか](http://qiita.com/yomi322/items/bf5b1d872b2caed6d2e2)を自分なりに考えてみた。
思いついたやり方は2つ。

Doubleが最も上の階層にあることを利用する方法
----

IntegerもRationalもDoubleにできるのでこれを利用する。足し算を実行したい型が全てDoubleより下の階層にあることがわかっている場合はこんなんでもよいと思う。

```hs
fooDouble :: Foo -> Double
fooDouble (FooInteger x) = fromInteger x
fooDouble (FooDouble x) = x
fooDouble (FooRational x) = fromRat x

fooPlus :: Foo -> Foo -> Double -> Foo
fooPlus (FooDouble _) _ = FooDouble
fooPlus _ (FooDouble _) = FooDouble
fooPlus (FooRational _) _ = FooRational . toRational
fooPlus (FooInteger _) (FooInteger _) = FooInteger . truncate
fooPlus y x = fooPlus x y

addFoo' :: Foo -> Foo -> Foo
addFoo' x y = fooPlus x y $ fooDouble x + fooDouble y
```

それ以外
------

特定の型同士を相互変換して足し算を実行する。
この方法だとinstance宣言のときにかなり自由度の高い型のパターンマッチが可能。さらに足し算できない型同士を足そうとしたらコンパイルエラーまで出てくれる。その代わりOverlappingの制限が厳しいので書き下さないといけないケースが多くてつらい。
Type Familyは足し算を実行したあとの結果の型を強制するのに使う。これがないといちいち`addBar x y :: Double`などと書かなければいけないのでとてもめんどくさい。

```hs
{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, TypeFamilies, UndecidableInstances #-}

data Bar a = Bar a deriving (Show)

class BarLaw a b where
  barPlus :: a -> b -> Result a b

type family Result a b :: *
type instance Result Double a = Double
type instance Result a Double = Double
type instance Result Rational Integer = Rational
type instance Result Rational Rational = Rational
type instance Result Integer Rational = Rational
type instance Result Integer Integer = Integer

instance BarLaw Integer Double where
  barPlus x y = fromIntegral x + y
instance BarLaw Double Integer where
  barPlus x y = x + fromIntegral y
instance BarLaw Rational Integer where
  barPlus x y = x + fromIntegral y
instance BarLaw Integer Rational where
  barPlus x y = fromIntegral x + y
instance BarLaw Rational Double where
  barPlus x y = fromRat x + y
instance BarLaw Double Rational where
  barPlus x y = x + fromRat y
instance (a ~ Result a a, Num a) => BarLaw a a where
  barPlus x y = x + y

addBar :: (BarLaw a b) => Bar a -> Bar b -> Bar (Result a b)
addBar (Bar x) (Bar y) = Bar $ x `barPlus` y
```

パターンマッチに柔軟性を持たせるか、型に柔軟性を持たせるか、お好きな方で。
erl_nif のメモ（その２）

[その１](http://qiita.com/tomaon/items/7f1e16724eee8096436e)の、その後。

```c++:nif.c
#include <stdio.h>
#include <string.h>
#include <errno.h>

#define UNUSED(p) (void)(p)

// -- --

typedef struct {
  int id;
} nif_t;

// -- --

static ERL_NIF_TERM open(ErlNifEnv *env, int argc, const ERL_NIF_TERM *argv) {

  if (1 == argc &&
      enif_is_number(env, argv[0])) {

    int id = 0;
    enif_get_int(env, argv[0], &id);

    ERL_NIF_TERM term;

    nif_t *resource = (nif_t *)enif_make_new_binary(env, sizeof(nif_t), &term);

    if (NULL != resource) {

      resource->id = id;

      printf("open: resource=%ld, id=%d\r\n", (long)resource, resource->id);

      return enif_make_tuple2(env,
                              enif_make_atom(env, "ok"),
                              term);
    } else {

      return enif_make_tuple2(env,
                              enif_make_atom(env, "error"),
                              enif_make_string(env, "enomem", ERL_NIF_LATIN1));
    }
  }

  return enif_make_badarg(env);
}

static ERL_NIF_TERM close(ErlNifEnv *env, int argc, const ERL_NIF_TERM *argv) {

  if (1 == argc) {

    ErlNifBinary bin;

    if (enif_inspect_binary(env, argv[0], &bin) && sizeof(nif_t) == bin.size) {

      ERL_NIF_TERM term;

      nif_t *resource = (nif_t *)enif_make_new_binary(env, sizeof(nif_t), &term);

      memcpy(resource, bin.data, bin.size);

      printf("close: resource=%ld, id=%d\r\n", (long)resource, resource->id);

      return enif_make_atom(env, "ok");
    }
  }

  return enif_make_badarg(env);
}

// -- --

static ErlNifFunc funcs[] = {
  {"open", 1, open},
  {"close", 1, close},
};

static int load(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM load_info) {

  UNUSED(env), UNUSED(load_info);

  *priv_data = NULL;

  return 0;
}

/*
 */
ERL_NIF_INIT(nif, funcs, load, NULL, NULL, NULL);
```

```erlang
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V5.10.4  (abort with ^G)
1> 
1> {ok,B} = nif:open(123).
open: resource=444388128, id=123
{ok,<<123,0,0,0>>}
2> nif:close(B).
close: resource=444424072, id=123
ok
3> q().
```

[crypto](http://www.erlang.org/doc/man/crypto.html) を真似て。戻りの binary が <<>> でないのも良い。
第３回オフラインリアルタイムどう書くの参考問題をC++の練習に使ってみた


プログラムはやはり何かを作ろうとしないと覚えられない。
ということで、オフラインリアルタイムどう書くのこの問題がC++の練習にほど良いレベルだったので書いてみました。

問題は[こちら](http://qiita.com/Nabetani/items/ebd8a56b41711ba459f9)

```BallCount.cpp
#include <stdio.h>
#include <iostream>
#include <cstring>

int main(){

    std::string input;
    char result[10];
    char ch[10];
    int out,strike,ball;

    std::cin >> input;

    int len = input.size();

    for(int i = 0; i < len; i++){

        strcpy(ch, input.substr(i, 1).c_str());

        switch(ch[0]){

            case 's':
                strike++;
                if(strike > 2){
                    strike = 0;
                    out++;
                }
                break;

            case 'b':
                ball++;
                if(ball > 3){
                    strike = 0;
                    ball   = 0;
                }
                break;

            case 'f':
                if(strike < 2){
                    strike++;
                }
                break;

            case 'h':
                strike = 0;
                ball   = 0;
                break;

            case 'p':
                strike = 0;
                ball   = 0;
                out++;
                break;

            default:
                break;
        }

        // アウトの数をカウント
        if(out > 2){
            out    = 0;
            strike = 0;
            ball   = 0;
        }

        // 結果出力
        std::cout << out;
        std::cout << strike;
        std::cout << ball;

        if(i != len - 1){
            std::cout << ",";
        }
    }

    std::cout << "\n";

    return 0;
}
```

実行

```
$ g++ -o BallCount BallCount.cpp 
$ ./BallCount 
sssbbbbsbhsbppp
010,020,100,101,102,103,100,110,111,100,110,111,200,000,100
```
C++でポインタ初歩の初歩


##概要
C++をやってみると、やはりポインタに慣れることは必須科目でしょう。
私は遠い昔、大学の授業でC言語やったときの記憶しかございません。
ということで、主に自分の備忘録用として、
int型の変数、配列、構造体の3つについて、ポインタを使ったサンプルを書いてみました。

ちなみに余談ですが、コード中で使用している「int iValue」といった、
変数のデータ型を名称の接頭辞に付与する記法を「[ハンガリアン記法](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95)」というらしいです。
へー
そして、[時代遅れ](http://blogs.itmedia.co.jp/yohei/2008/04/post-fcac.html)という記事も見かけましたw

確かに普段自分も書かない。
(だって今更C++を初歩から調べてみても、参考サイトが古い記事ばっかなんだもん・・・)


##1.変数のポインタ

```pointer.cpp
#include <iostream>

int main(){

    // 普通のint型変数
    int  iValue;

    // iValueのポインタ(変数のアドレス)
    int* piValue = &iValue;

    std::cout << piValue;
    std::cout << "\n";

    // ポインタを使ってiValueに書き込む
    *piValue = 10;

    std::cout << iValue;
    std::cout << "\n";

    return 0;
}
```
コンパイル&実行


```
$ g++ -o pointer pointer.cpp 
$ ./pointer 
0x7fff1ab9bd14
10
```

##2.配列のポインタ


```
/**
 * 配列のポインタ
 */
int main(){

    // 配列の宣言
    int aiArr[] = {10, 20, 30, 40, 50};

    // aiArrのポインタ(下記は同意)
//    int *paiArr = &(aiArr[0]);
    int *paiArr = aiArr;

    for(int i = 0; i < 5; i++){

        // ポインタの値
        std::cout << paiArr + i;
        std::cout << ":";
        // ポインタを使って配列の値を参照
        std::cout << *(paiArr + i);
        std::cout << "\n";
    }

    return 0;
}
```
コンパイル&実行


```
$ g++ -o pointer2 pointer2.cpp 
$ ./pointer2
0x7fffa9516b70:10
0x7fffa9516b74:20
0x7fffa9516b78:30
0x7fffa9516b7c:40
0x7fffa9516b80:50
```

##3.構造体のポインタ

メモ：
構造体のポインタは「```->```」でメンバ参照する

```
/**
 * 構造体のポインタ
 */
int main(){

    struct employee {
        int  id;
        const char* name;
    };

    struct employee emp = {100, "Taro"};
    struct employee *pemp = &emp;

    /* 普通に構造体を参照 */
    std::cout << emp.id;
    std::cout << ":";
    std::cout << emp.name;
    std::cout << "\n";

    /* ポインタを使った参照 */
    std::cout << pemp->id;
    std::cout << ":";
    std::cout << pemp->name;
    std::cout << "\n";

    /* 構造体のメンバのポインタ */
    int *pid = &emp.id;
    std::cout << *pid;
    std::cout << "\n";
}
```

コンパイル&実行

```
$ g++ -o pointer3 pointer3.cpp 
$ ./pointer3 
100:Taro
100:Taro
100
```
Quaternionの数学的理解メモ その3


[Quaternionの数学的理解メモ その1](http://qiita.com/__takamoto/items/77790a608e142e18a882)
[Quaternionの数学的理解メモ その2](http://qiita.com/__takamoto/items/bf8b2ed43879ed5d90be)

#クォータニオンによる回転
##回転軸とベクトルが直交している場合
![graph.png](https://qiita-image-store.s3.amazonaws.com/0/17891/4d27cb37-6e95-e334-2466-0c480dbd848a.png)

xからx'に回転する事を考える。
ベクトルyを以下のように定義する。

```math
Y≡XR
```


ベクトルxと回転軸rは直交している為、

```math
\begin{array}{ccl} Y & = & XR \\  & = & -[[x\cdot r,\quad \sigma _{ 1 }(x\times r)_{ 1 }+\sigma _{ 2 }(x\times r)_{ 2 }+\sigma _{ 3 }(x\times r)_{ 3 }]] \\  & = & -[[0, \quad \sigma _{ 1 }(x\times r)_{ 1 }+\sigma _{ 2 }(x\times r)_{ 2 }+\sigma _{ 3 }(x\times r)_{ 3 }]] \end{array}
```

となる。この時ベクトルy,x,x'は同一平面上に存在する。
よって、

```math
\begin{array}{ccl} X' & = & Xcos\theta +Ysin\theta  \\  & = & X(Ecos\theta +Rsin\theta ) \\  & = & X[[cos\theta ,\quad \sigma _{ 1 }r_{ 1 }sin\theta +\sigma _{ 2 }r_{ 2 }sin\theta +\sigma _{ 3 }r_{ 3 }sin\theta ]] \end{array}
```

上の式が[前回の最後の式](http://qiita.com/__takamoto/items/bf8b2ed43879ed5d90be#1-3)と等しい事はXがユニタリ行列かつ逆エルミート行列であることを用いれば分かる。


##任意軸の場合

```math
x=x_{\bot}+x_{\parallel}
```

ベクトルxを回転軸rに直交するものと平行なものに分離して考えると、

```math
\begin{array}{ccl} X' & = & X_{ \bot  }cos\theta +Ysin\theta +X_{ \parallel  } \\  & = & X_{ \bot  }V(\theta )+X_{ \parallel  } \\  & = & X_{ \bot  }V(\theta /2)V(\theta /2)+X_{ \parallel  } \\  & = & \left( X_{ \bot  }V(\theta /2) \right) cos\frac { \theta  }{ 2 } +\left( X_{ \bot  }V(\theta /2) \right) Rsin\frac { \theta  }{ 2 } +X_{ \parallel  } \\  & = & \left( X_{ \bot  }V(\theta /2) \right) cos\frac { \theta  }{ 2 } -R\left( X_{ \bot  }V(\theta /2) \right) sin\frac { \theta  }{ 2 } +X_{ \parallel  } \\  & = & \left( cos\frac { \theta  }{ 2 } -Rsin\frac { \theta  }{ 2 }  \right) \left( X_{ \bot  }V(\theta /2) \right) +X_{ \parallel  } \\  & = & V^{ * }(\theta /2)X_{ \bot  }V(\theta /2)+X_{ \parallel  } \\  & = & V^{ * }(\theta /2)X_{ \bot  }V(\theta /2)+V(\theta /2)V^{ * }(\theta /2)X_{ \parallel  } \\  & = & V^{ * }(\theta /2)X_{ \bot  }V(\theta /2)+V^{ * }(\theta /2)X_{ \parallel  }V(\theta /2) \\  & = & V^{ * }(\theta /2)XV(\theta /2) \end{array}
```

途中以下の外積の性質を用いている。

```math
x \times y= -y \times x
```

ちなみにこの変換はユニタリ変換の一つである

##回転の合成
行列の結合性からすぐ可能であることが分かる。
更新したファイルに該当するタスクだけ走らせる Gruntfile

grunt-contrib-watch って便利なんですが、監視ファイルが多くなる＝走る処理が多くなるとどうしても時間がかかってしまいます。それでなんだか効率が落ちてたりするわけなんですが、grunt-este-watch が幸せということを聞いて、ぼくも幸せになりたいと思いやってみました。

更新されたファイルに関係ないタスクが走るのが良くないわけで、ちゃんと個別にタスクを走らせたら良いわけですね。ということで、以下にサンプルを置いておきます。とりあえず便宜上なので、ファイル名に意味はありません。

# やりたいこと
## Sass
### common.sass
css へのコンパイル -> reset.sass との concat -> minify
### mobile.sass
css へのコンパイル -> minify

## JavaScript
### common-a.js / common-b.js
common-a.js と common-b.js を concat -> minify

### mobile.js
minify

## YAML
### functions.yml / settings.yml
それぞれのファイル名での json 化

## 前提
監視対象のファイルは全て ./src/ に入ってるものとします。

# 利用するプラグイン

- grunt-contrib-compass
- grunt-contrib-concat
- grunt-contrib-cssmin
- grunt-contrib-uglify
- grunt-este-watch
- grunt-yaml

# Gruntfile.coffee
```coffeescript:Gruntfile.coffee
module.exports = (grunt) ->
	pkg = grunt.file.readJSON 'package.json'
	grunt.initConfig
		compass:
			dev:
				options:
					config: 'config.rb'
					environment: 'development'
					force: true
			prod:
				options:
					config: 'config.rb'
					environment: 'production'
					force: true
		concat:
			css:
				files:
					'css/styles.css': ['css/reset.css', 'css/common.css']
			js:
				files:
					'js/functions.js': ['src/common-a.js', 'src/common-b.js']
		cssmin:
			common:
				files:
					'css/styles.min.css': ['css/styles.css']
			mobile:
				files:
					'css/mobile.min.css': ['css/mobile.css']
		uglify:
			common:
				files:
					'js/functions.min.js': ['js/functions.js']
			mobile:
				files:
					'js/mobile.min.js': ['src/mobile.js']
		yaml:
			functions:
				files:
					'js/functions.json': ['src/functions.yml']
			settings:
				files:
					'js/settings.json': ['src/settings.yml']
		esteWatch:
			options:
				dirs: ['src/']
			sass: (file) ->
				return if getTarget(file) is 'mobile' then ['compass:dev', 'cssmin:mobile'] else ['compass:dev', 'concat:css', 'cssmin:common']
			js: (file) ->
				return if getTarget(file) is 'mobile' then ['uglify:mobile'] else ['concat:js', 'uglify:common']
			yml: (file) ->
				return ['yaml:' + getTarget(file)]

	for t of pkg.devDependencies
		if t.substring(0, 6) is 'grunt-'
			grunt.loadNpmTasks t

	grunt.registerTask 'w', ['esteWatch']
	grunt.registerTask 'default', ['compass:dev', 'concat', 'cssmin', 'uglify']

getTarget = (file) ->
	return file.split('/')[1].split('.')[0]
```

これで ```grunt w``` で、css でも yaml でも該当タスクだけ走るので、劇的にスピードが変わりました。めでたしめでたし。
Quaternionの数学的理解メモ その２

[Quaternionの数学的理解メモ その1](http://qiita.com/__takamoto/items/77790a608e142e18a882)

#回転行列の三次元拡張
**オイラー角（ロール・ピッチ・ヨー）**

```math
T_{ 1 }(\theta )=\begin{pmatrix} 1 & 0 & 0 \\ 0 & cos{ \theta  } & sin{ \theta  } \\ 0 & -sin{ \theta  } & cos{ \theta  } \end{pmatrix}
```

```math
T_{ 2 }(\theta )=\begin{pmatrix} cos{ \theta  } & 0 & -sin{ \theta  } \\ 0 & 1 & 0 \\ sin{ \theta  } & 0 & cos{ \theta  } \end{pmatrix}
```

```math
T_{ 3 }(\theta )=\begin{pmatrix} cos{ \theta  } & sin{ \theta  } & 0 \\ -sin{ \theta  } & cos{ \theta  } & 0 \\ 0 & 0 & 1 \end{pmatrix}
```

二次元の回転行列と同様に、

```math
T_{ i }(\theta )=exp(J_{ i }\theta )
```

と書ける。（J:生成子）

```math
J_{ 1 }=\begin{pmatrix} 0 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & -1 & 0 \end{pmatrix}
```

```math
J_{ 2 }=\begin{pmatrix} 0 & 0 & -1 \\ 0 & 0 & 0 \\ 1 & 0 & 0 \end{pmatrix}
```

```math
J_{ 3 }=\begin{pmatrix} 0 & 1 & 0 \\ -1 & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix}
```



#複素行列

```math
H^{ \dagger  }≡複素行列Hを転置+それぞれの複素数を共役複素数化したもの
```

とする。

##エルミート行列

```math
H^{ \dagger }=H
```

のときの複素行列Hをエルミート行列と呼び、

```math
H^{ \dagger }=-H
```

のときの複素行列Hを逆エルミート行列と呼ぶ。

##ユニタリ行列
実数の行列Mにて、

```math
M^{ -1  }=M^t
```

のときのMを直交行列と呼んだが、複素行列では

```math
\gamma^{ -1  }=\gamma^{ \dagger  }
```

以上が成り立つとき、γをユニタリ行列と呼ぶ。
2x2行列の時は、

```math
\gamma =\begin{pmatrix} \alpha  & \beta  \\ -\beta ^{ * } & \alpha ^{ * } \end{pmatrix}
```

例えば上のような形をとる。ただし以下を満たす。

```math
\left\| \alpha  \right\| ^{ 2 }+\left\| \beta  \right\| ^{ 2 }=1
```

##パウリ行列

さて上のユニタリ行列γに対し、

```math
\alpha =[[u_0,u_3]]\quad \beta =[[u_2,u_1]]\quad u_i∈R
```

と置くと、

```math
\begin{matrix} \gamma  & = & u_{ 0 }E+iu_{ 3 }\sigma _{ 3 }+iu_{ 2 }\sigma _{ 2 }+iu_{ 1 }\sigma _{ 1 } \\  & = & [[uE,\quad u_{ 3 }\sigma _{ 3 }+u_{ 2 }\sigma _{ 2 }+u_{ 1 }\sigma _{ 1 }]] \end{matrix}
```

```math
\sigma _{ 1 }≡\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\quad \sigma _{ 2 }≡\begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix}\quad \sigma _{ 3 }≡\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}
```

と変形できる。この時のσをパウリ行列と呼ぶ。


パウリ行列と単位行列は互いに直行しているため、基底に取ることが出来る。

またパウリ行列は複素数の行列表示の時と同じようにオイラーの公式が成立する。

```math
exp[[0,\quad \sigma _{ 1 }\theta + \sigma _{ 2 }\theta + \sigma _{ 3 }\theta ]]=[[Ecos{ \theta ,\quad \sigma _{ 1 }sin\theta + \sigma _{ 2 }sin\theta + \sigma _{ 3 }sin\theta}]]
```

#複素行列からクォータニオンへ

```math
X=[[0,\quad \sigma _{ 1 }x_{ 1 } + \sigma _{ 2 }x_{ 2 } + \sigma _{ 3 }x_{ 3 }]]
```

```math
Y=[[0,\quad \sigma _{ 1 }y_{ 1 } + \sigma _{ 2 }y_{ 2 } + \sigma _{ 3 }y_{ 3 }]]
```

とする。（X,Yは逆エルミート行列）
このときXとYの積を取ると、

```math
XY=-[[E(x\cdot y),\quad \sigma _{ 1 }\left( x\times y \right) _{ 1 } + \sigma _{ 2 }\left( x\times y \right) _{ 2 } + \sigma _{ 3 }\left( x\times y \right) _{ 3 }]]
```

となる。X,Y,XYは基底に[[0, σ]]+Eを取ったベクトルと見ることが出来る。このようなものをクォータニオンと呼ぶ。

[Quaternionの数学的理解メモ その3](http://qiita.com/__takamoto/items/49e325af63cd477a6e88)
Ruby の nonzero? は !! と一緒に使うと良さそうと思ったけど、zero? 使えば十分だった

タイトルのまま。

`Numeric#nonzero?` はクエスチョンマークで終わる問い合わせメソッドなのに `nil` または `self` を返すので、

```rb
if num.nonzero?
```

といったコードなら問題ないが、変数に代入したり、 `Array` の中に突っ込んだりしたら、思わぬことになりそうなので、

```rb
enamble = !!num.nonzero?
```

みたいに強制的に真偽値にする `!!` とセットで使うと良さそう。

と思ったけど、

```rb
enamble = !num.zero?
```

で十分だった。

`Numeric#nonzero?` は次のような使い方をする場合にあるのではないかと予想。　`ActiveSupport` の `presence` と似た雰囲気。

```rb
one = 1
if (n = one.nonzero?) # n => 1

zero = 0
if (n = zero.nonzero?) # n => nil
```
Rubyでnewした時に違うクラスを生成する

Rubyって何でもできるんですね。

```rb
class A
  attr_reader :x
  def initialize(x)
    @x = x
  end
end

class B
  def self.new(x)
  	obj = A.allocate
  	obj.send(:initialize, x)
  	obj
  end
end

b = B.new('abc')
puts b.class # => A
puts b.x # => abc
```

もちろん多用すると収拾がつかなくなるだけですが、
newの引数によって別のサブクラスを生成したい場合などは、
自然な呼び出し方ができますね。

継承した時などに思わぬ挙動をすることがあるようなので、
いろいろ試行錯誤中。
それも考慮した書き方もできそうです。
elasticsearchでroutingを使う

# routingとは
検索するshardを限定する事により検索を高速化する仕組みです。

mysqlなどのインデックスと概念的には似ています


# routingの設定
```bash
# indexを作成
curl -XPUT "http://localhost:9200/store"

# routing作成
curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '
{
  "order":{
    "_routing":{
      "required":true,
      "path":"user_id"
    }
  }
}'
```

# routingを使った検索
```bash
curl -X GET 'http://localhost:9200/store/order/_search?routing=1' -d '{
  "query": {
    "query_string": {
      "query": "user_id:1"
    }
  },
  "from": 0
}'
```

# 複数指定
```bash
curl -X GET 'http://localhost:9200/store/order/_search?routing=1,2' -d '{
  "query": {
    "query_string": {
      "query": "user_id:(1 2)"
    }
  },
  "from": 0
}'
```
VMWareのゲストイメージ圧縮方法

# VMWareのゲストイメージ圧縮方法

## 経緯
VMWareでの仮想イメージですが、Windowsに限らず、LinuxなどのゲストOSのセキュリティアップデートなどをたびたびすると媒体ROM上で不要ファイルを削除したのに、ホスト側から見るとファイルサイズが減っていない。むしろ増えているという現象が起こります。これはゲストのほうでは減っていても、ホスト側からは容量が減らないという謎の現象です。ちなみにアップデートを繰り返すとその分、VMwareのサイズはぶくぶく肥えていきます･･･。ROMをRARでバックアップをとっているときに気付きました。

## ディスク圧縮
対象は、VMware Player, Fusion, Workstation などでバージョン９からです。他にもできるはずです。条件としては２つ。１つは、VMwareのゲストにVMware Toolがインストールされていてゲストが起動している段階で実行します。もうひとつは、スナップショットがあるとうまくいかないことがあります。なので、RARか7zipでスナップショットの代用をしたほうがいいでしょう。９以前はGUIでツールがあるらしいのですが当方やったことがないのでわかりません。
各ゲストともに、コンソールから以下を打ち込みます。listが圧縮対象のドライブ一覧、shrinkが不要ファイルを除去したROMの再構築実行コマンドです。サイズによもりますが10ギガの再構築で30分ぐらいです。ホストのハードウェア環境でまちまちでしょう･･･。
※Linuxの場合、ゲストがLVMだと実行できません。ext4までなら動くようです。


・ゲストがWindowsの場合
C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe disk list
C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe disk shrink C:\


・ゲストがLinuxの場合
sudo vmware-toolbox-cmd disk list
sudo vmware-toolbox-cmd disk shrink /


・ゲストがMacの場合
sudo /Library/Application\ Support/VMware\ Tools/vmware-tools-cli disk list
sudo /Library/Application\ Support/VMware\ Tools/vmware-tools-cli disk shrink /


## ディスク最適化
ゲスト圧縮後、シャットダウンし、仮想マシン設定からハードディスクを選択後、ユーティリティの圧縮がありますが、こちらは正直あまり効果がありませんでした。ゲストが起動していないとどのファイルがいるのかいらないのかわからないようです。しかし、ディスクの最適化はファイルの再配置をしてくれるはずなので効果はあると思います。

## 仮想マシンのクリーンアップ（Fusion）
Fusionに限っては上記以外にクリーンアップ機能があります。
上記後クリーンアップをすることでさらに小さくなるようです。

![vmwarefusion_disk_cleanup01.png](https://qiita-image-store.s3.amazonaws.com/0/22018/f03c7dff-b53c-8885-639e-21b7a7064fff.png)


## おわり
場合によっては数十ギガほど圧縮に成功できた例があるようです。
ゲスト起動中のままの圧縮は、あらたに仮想ROMイメージをコピーして構築することになるのでホストにはそれなりの媒体容量が求められます。
基本的に書き込みが多発するのでSSDでの実行はやめたほうがいいかも。SSDは書き込み制限などあるので仮想化に向いているのか不明です。
Macのゲストの場合も記載しましたが、･･･いえ、なんでもありません。
仮想化いいよ、仮想化･･･。
Ant実行時にclasspathをコンソールに出力する

\<echo />タグのmessageにクラスパスの変数を記述する

```xml:build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="example" default="test" basedir=".">

  <path id="classpath">
    <fileset dir="lib">
      <include name="*.jar" />
    </fileset>
  </path>

  <target name="test">
    <echo message="${classpath}" />
  </target>

</project>
```
MavenからAntを実行する


* maven-antrun-pluginプラグインを使用する
* \<ant />タグを使用する
 * \<ant antfile="Antファイル名" target="実行するtarget名" />
* mavenの実行時クラスパスをantに渡したい場合は\<property name="Antに渡すプロパティ名称" refid="maven.runtime.classpath" />でクラスパスを定義する。\<ant />タグにinheritRefs="true"を指定する
* targetをmavenの実行引数で変更したい場合は\<ant />タグのtarget内を${target}にする。(左記の場合maven引数として-Dtargetを指定する)

下記pom.xmlとbuild.xmlを同ディレクトリに配置して以下のコマンドを実行する。

```
mvn antrun:run -Dtarget=call
```

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <dependencies>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.0</version>
          </dependency>
        </dependencies>
        <configuration>
          <tasks>
            <property name="classpath" refid="maven.runtime.classpath" />
            <ant antfile="build.xml" target="${target}" inheritRefs="true" />
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </plugin>
    </plugins>
  </build>
</project>
```

```xml:build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="maven-call-example" default="call" basedir=".">
  <target name="call">
    <echo message="${classpath}" />
  </target>
</project>
```
StoryBoard上のパーツ同士の距離を簡単に知る方法

１、StoryBoard上のパーツ（例：UIButton）を選択します。
２、Optionを押しながらカーソルを別のパーツ上まで動かします。
３、パーツ同士の距離が表示されます。

以上、間違い等あれば指摘頂けると幸いです。
videoタグのIE対応もできて自鯖だけで色々完結出来た話。


自鯖にファイルを全部置くことを前提とした動画の埋め込みがどこまで対応できるのか調べてみた。



MediaElement.js
http://mediaelementjs.com/

MITライセンス！

MITライセンス!! 

動画エンコードは3種類用意する必要がありますが、
結構いろんな端末からで再生を確認できてます。

- 必要ファイル
mp4,f4v,webm

##videoタグことはじめ
サーバ側のContent-typeがtext/planeで送られることがあるので、
以下の設定をしておく。

```shellscript:.htaccess
AddType "video/webm" webm
AddType "video/mp4" mp4
```
レスポンスが以下になってればOK

![sample1-7.png](https://qiita-image-store.s3.amazonaws.com/0/5472/9228566a-c1f1-bcc1-8b96-b8bc74c8d2b6.png "sample1-7.png")



##検証端末
下記で再生を確認できてます。

14.02.10 現在

// ------ Win
IE7+
Chrome 最新
Firefox 最新

// ------ Mac
Safari 最新
Chrome 最新
Firefox  最新

// ------ スマホ
iPhone iOS7
Android Nexus5 ISW11F




##オプション
$('video').mediaelementplayer({
　　// 動画2つを埋め込んだ時に片方を再生すると再生中のもう一方をポーズにする
　　// falseにすると両方同時に再生可能
　　pauseOtherPlayers: true
});
僕が使ったのは↑のオプションだけなので実際の挙動は検証が必要かも。



```javascript:option

$('video').mediaelementplayer({
    defaultVideoWidth: 480, // ビデオタグにwidthが指定されていないときのデフォの幅の指定
    defaultVideoHeight: 270,// ↑の高さ
    videoWidth: -1,         // これがセットされているとvideoタグのwidthを上書き
    videoHeight: -1,        // ↑の高さ
    audioWidth: 400,        // 音楽プレイヤの幅
    audioHeight: 30,        // 音楽プレイヤの高さ
    startVolume: 0.8,       // 再生時の初期ボリューム指定
    loop: false,            // audioプレイヤのループ
    // enables Flash and Silverlight to resize to content size
    enableAutosize: true,
    // 表示するプレイヤのボタンリスト 
	['playpause','progress','current','duration','tracks','volume','fullscreen'],
    // Hide controls when playing and mouse is not over the video
    alwaysShowControls: false,       // 
    iPadUseNativeControls: false,    // force iPad's native controls
    iPhoneUseNativeControls: false,  // force iPhone's native controls
    AndroidUseNativeControls: false, // force Android's native controls
    alwaysShowHours: false,          // forces the hour marker (##:00:00)
    showTimecodeFrameCount: false,   // show framecount in timecode (##:00:00:00)
    framesPerSecond: 25,             // used when showTimecodeFrameCount is set to true
    enableKeyboard: true,            // turns keyboard support on and off for this instance
    // 動画2つを埋め込んだ時に片方を再生すると再生中のもう一方をポーズにする
    pauseOtherPlayers: true,
    keyActions: []   // array of keyboard commands
 
});


```


## つまったとこ
ベーシック認証が貼ってあるとAndroidが再生できない。 


// ----------------- 参考URL
イナヅマTVログ
http://www.inazumatv.com/contents/?s=video