OmniAICreator/Qiita-1.07M huggingface dataset:
SQLServerのインデックスについてざっくりとまとめてみた

#SQLServerについて

SQLServerのインデックスについて学ばせていただく機会があり、ものすごく勉強になったのでまとめます。

# はじめに
他のDBと同様にSQLServerにもインデックスの概念は存在します。
インデックスとは、DBデータの検索を高速に行うための索引のようなものです。
これがあることによって、データベース内すべてを検索せずに目的のデータを特定することができる便利なしくみです。
SQL Serverにおいてインデックスの種類は以下のようになっています。
 
* ヒープ表（インデックスなしのテーブル）
* クラスタ化インデックス
* 非クラスタ化インデックス
* 複合インデックス
* 付加列インデックス

インデックスは大きく分けてクラスタ化、非クラスタ化にわかれ、非クラスタ化インデックスの中に複合インデックスや、付加列インデックスといったものがあります。
これらを順に説明していきます。

# ヒープ表
SQLServerでは、インデックスの作成されていない通常のテーブルをヒープ表と呼びます。
ヒープ表では、挿入されたデータはハードディスクの様々な位置に格納されます。

検索の際には、目的のデータがどこにあるかを先頭から順に走査していきます
そのため検索に必要なオーダーはO(n)になります。
データ量が多くなればなるほど検索時間は比例して増えてしまうため、通常はテーブルにインデックスをはることになります。

# クラスタ化インデックス
SQLServerはインデックスの仕組みとしてB-Treeを採用しています。
そのため、インデックスをはるとO(logn)以下でデータの検索を行うことができます。
B-Treeについては<a href="http://blog.h13i32maru.jp/entry/2012/07/01/000000">こちらのサイト</a>が非常に参考になります。
クラスタ化インデックスにおいてデータはインデックスに指定したキーの値によってソートされてディスクに格納されます。
結果的にB-Treeのリーフ（一番下の先端にあたる場所）にデータが格納されるイメージです。

クラスタ化インデックスに指定したキーで検索する場合、ルートからノードをたどっていけば目的のデータにたどりつけます。
よってO(logn)で目的のデータを探すことができます。
一般的に、クラスタ化インデックスはPrimary Keyの値で作成されます。

# 非クラスタ化インデックス
クラスタ化インデックスはデータをソートして格納するので、一つのテーブルに対してひとつまでしか作成できません。
それに対して、複数個作成できるのが非クラスタ化インデックスです。

非クラスタ化インデックスのリーフノードには、実データへの参照が格納されています。
この参照をレコードIDといい、以降RIDと表記します。
このRIDをもとに、実データへアクセスしデータを取得する仕組みが非クラスタ化インデックスです。
この実データへのアクセスをページジャンプといいます。

# 複合インデックス
通常のインデックスの場合、各ノードには一つのインデックスキーのみが格納されています。
複数カラムをインデックスのキーに指定すると、複合インデックスとなります。
例えば、user_idとitem_idという二つのカラムをインデックスキーとして設定するような場合です。
ここで注意しなければいけないのが、user_id, item_idがユニークでなく同じデータが大量にあった場合、大量のRIDを保持しなければいけないため、インデックスサイズが大きくなってしまいます。

また、複合インデックスでも非クラスタインデックスと同様にリーフノードからページジャンプが起こり実データにアクセスします。
しかし、利用したいデータがuser_idとitem_idのみであった場合、欲しいデータはインデックスツリーが保持しているため実データ領域へとアクセスする必要がなくなります。
このことを生かして、取得するデータをすべてインデックスに含めてしまおうという考えがあります。
この方法がカバーリングインデックスと呼ばれます。（インデックスがクエリをカバーするともいう）
うまく使うと、ディスクI/Oを減らせるため有効な手法となります。

# 付加列インデックス
複合インデックスでは、インデックスツリーの各ノードに複数のキーを持たせられることを説明しました。
しかし、複数キー持たせるということはそれだけインデックスのサイズが大きくなってしまうということでもあります。
そこで、付加列インデックスという手法がよく用いられます。

すべてのノードに複数カラムのデータを保持するのではなく、リーフノードにのみカラムを追加する（列を付加する）ことで、ページジャンプを防ぐとともに、インデックスのサイズも押さえることができます。

# まとめ
SQL Serverのインデックスについて簡単に紹介させていただきました。
インデックスをただしく利用し、効率よくデータを取得することはとても重要です。特に大量のアクセスが同時に集まるようなシステムの場合、致命的な問題になりかねません。
設計段階で、インデックスについて十分に留意しておくことが重要だと思います。
[Swift]カウンタクラスを作ってみた[暇つぶし]


## 序

[Infinite loop in getter](http://qiita.com/Lewuathe/items/63801688817c38614cf4)という記事をみて、カウンタクラス（整数を順番にかえすだけのクラス）を作ってみたくなったので作ってみた。

## 正攻法

とりあえず、正攻法で以下のように書いた。

```swift:Counter.swift
class BaseCounter {
    var __counter = 0

    var counter: Int {
        get {
            return __counter++
        }
    }
    
}

let c = BaseCounter()

println(c.counter)
println(c.counter)
println(c.counter)
println(c.counter)
```

まあそれなりに動くのだが、

```swift:
c.__counter = 0
```

とか、カウンタの値を外側から直接書き換えられるのがイマイチ。
（privateとか出来ないのかな…？）

## クロージャ

そこで、クロージャ（関数閉包）を使って書き換えてみたのが以下。

```swift:Counter.swift（その２）
class Counter {
    
    func CountUp() -> (() -> Int) {
        var count = 0
        func c() -> Int {
            return count++
        }
    
        return c;
    }

    let f : (() -> Int)?
    
    init(){
        f = CountUp()
    }
    
    var counter : Int {
        get {
            return f!()
        }
    }
}

let c = Counter()

println(c.counter)
println(c.counter)
println(c.counter)
println(c.counter)
println(c.counter)
```

これでも、

```swift:
c.f!()
```

のように、クロージャに直接アクセスは可能だが、カウンタをゼロに戻すことは出来ないからいい……ことにしておく。

## 追記：無名関数

どうにかして、もっと短くかけないか頑張ってみた。
無名関数の後ろに()をつけられることに気づいたので、ちょっと短くできた。

```siwft:Counter.swift（その３）
class Counter {
    let f = { () -> (() -> Int) in
        var count = 0
        func c() -> Int {
            return count++
        }
        return c;
    }()
    
    var counter : Int {
        get {
            return f()
        }
    }
}


let c = Counter()

println(c.counter)
println(c.counter)
println(c.counter)
println(c.counter)
println(c.counter)
```
githubにssh公開鍵を登録

# 環境

+ mac OS X 10.8.5


# フロー

+ sshキーペア作成
+ githubに公開鍵登録


# sshキーペア作成

macにはssh-keygenというコマンドが最初から入っているので、
このコマンドを使用してキーペア(rsa)を作成します。

```bash
$ ssh-keygen -t rsa -C "コメント"
Enter file in which to save the key (/Users/hoge/.ssh/id_rsa):   ←enter押下
Enter passphrase (empty for no passphrase):   ←enter押下
Enter same passphrase again:    ←enter押下
```

コメントは任意で大丈夫です。

コマンドを実行すると鍵ファイルをどこに保存するか聞かれるので、
保存先が問題なければenterを押してください。

そのあと、キーにパスを設定するか聞かれるので(2回)、
パスなしにするのであれば2回ともenterを押してください。

これでキーペアが作成されました。
次はgithubに公開鍵を登録します。


# githubに公開鍵登録

まずはgithubにログインしてください。

公開鍵の登録場所は、

"account setting"から設定ページにいき、
"SSH keys"にあります。


登録は簡単。
titleを入力し、先ほど作成した公開鍵(~/.ssh/id_rsa.pub)を
コピペするだけです。

以上で完了です！！


# tips
デフォルトのビット数は2048ビットに設定されています。
ビット数を指定するには "-b" オプションを使用してください。
Swiftでボタンのレイアウト(配置)を試してみる その1


##Storyboardの場合

StoryboardでButton を中心に配置してみた。
![スクリーンショット 2014-06-14 14.02.55.png](https://qiita-image-store.s3.amazonaws.com/0/3184/333d08ce-9ce4-6d75-3338-fb780a2e6cf5.png "スクリーンショット 2014-06-14 14.02.55.png")

シミュレータで実行してみると、中心ではなく右寄りに配置されている。
![スクリーンショット 2014-06-14 14.07.28.png](https://qiita-image-store.s3.amazonaws.com/0/3184/771e461e-4b8d-2fb2-5872-bd839268e2a2.png "スクリーンショット 2014-06-14 14.07.28.png")

まずは、デフォルトでUse Auto Layout と Use Size Classes にチェックが入っていることを確認する。
![スクリーンショット 2014-06-14 14.28.09.png](https://qiita-image-store.s3.amazonaws.com/0/3184/90151b7a-be27-62ac-5eee-04a76f78e4f2.png "スクリーンショット 2014-06-14 14.28.09.png")

そこで、Storyboardで、Button を選択して下記のようにチェックボックスを選択し Add 2 Constraintsを押してみる。
![スクリーンショット 2014-06-14 14.17.48.png](https://qiita-image-store.s3.amazonaws.com/0/3184/686421c4-406d-2c78-6056-38e8087136d9.png "スクリーンショット 2014-06-14 14.17.48.png")

すると、上下より中心に配置される。
![スクリーンショット 2014-06-14 14.16.50.png](https://qiita-image-store.s3.amazonaws.com/0/3184/c1a1958b-4232-ae48-3a4c-a80e851cc426.png "スクリーンショット 2014-06-14 14.16.50.png")

思った通り。やったぁ。

これは、対象であるButtonにレイアウトの制約(Constraints)を、Storyboardで付加してあげたのである。
下記のOutlineView画面を見てもらうとわかる。
![スクリーンショット 2014-06-14 14.22.38.png](https://qiita-image-store.s3.amazonaws.com/0/3184/bb0cbe30-313f-6e5d-06c0-20daeeff58fe.png "スクリーンショット 2014-06-14 14.22.38.png")

では、次回はこれを Swiftコード上で配置できるか試してみる。
SeleniumWebdriver+JUnit+browsermob-proxyでブラウザのログを取得

#目的
・ブラウザ内のflashなどのコンテンツの呼び出しURL解析のため

#コード

```java
package site;

import java.io.FileOutputStream;
import java.io.IOException;

import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.ProxyServer;
import net.lightbody.bmp.proxy.jetty.http.HttpContext;
import net.lightbody.bmp.proxy.jetty.http.HttpException;
import net.lightbody.bmp.proxy.jetty.http.HttpRequest;

import org.apache.commons.httpclient.Header;
import org.apache.http.HttpRequestInterceptor;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

public class Google {

    private static WebDriver driver;

    @Test
    public void searchForSeleniumWebsite() throws Exception {

    	ProxyServer server = new ProxyServer(9978);
        server.start();
        server.setCaptureHeaders(true);
        server.setCaptureContent(true);
        server.newHar("test");

        FirefoxProfile profile = new FirefoxProfile();

        profile.setPreference("network.proxy.type", 1);
        profile.setPreference("network.proxy.http", "localhost");
        profile.setPreference("network.proxy.http_port", 9978);

        WebDriver driver = new FirefoxDriver(profile);

        driver.get("http://www.youtube.com/watch?v=xxxxxxxx");

        Har har1 = server.getHar();

        FileOutputStream fos = new FileOutputStream("log.log");
        har1.writeTo(fos);

        driver.quit();
        server.stop();

    }


}

```

#今後の追加予定
・@DataPointでパラメータテスト
　外部ファイル読み出しでデータ分割
自分用メモ: matplotlibを使ったグラフの調整

データをmatplotlibでプロットしたはいいが細かい部分が気に入らない。
一旦適当な形式で出力して画像編集ソフトで調整すればいいがそれも面倒くさい。
なので可能な限りmatplotlib側で調整しよう、そんなときに役立ちそうなコマンドをメモしておく。

#前提

```Python
from matplotlib import pyplot as plt
```

とimportして、対話的にグラフを書くことにする。

#rcParams
全体に適用される設定の大体は、この辞書変数を書き換えれば事足りる。

```Python
plt.rcParams['font.family'] = 'Times New Roman' #全体のフォントを設定
plt.rcParams['font.size'] = 20 #フォントサイズを設定
plt.rcParams['axes.linewidth'] = 1.5 #軸の太さを設定。目盛りは変わらない
plt.rcParams['xtics.major.size'] = 10 #x軸目盛りの長さ
plt.rcParams['xtics.major.width'] = 1.5 #x軸目盛りの太さ
```

勿論、`xtics`を`ytics`に変えるとy軸目盛りの設定が可能。

#それ以外
軸名を設定するには

```Python
plt.xlabel(r'$\alpha$') #x軸名。Latex形式で書ける
plt.ylabel(r'$\beta$') #y軸名
```

軸と目盛り数字の感覚が狭いなあと思ったら

```py
plt.tick_params(pad=10) #数字を大きくするほど離れる
```

今のところ使ってみたコマンドはこんな感じ。
もっと色々試して、使えそうなものを追加していくかも。
PHPからPOSTでQiitaのauthAPIを叩く方法のメモ


```php:qiita_auth.php
// APIのURL
$url = 'https://qiita.com/api/v1/auth';

// Qiitaユーザ名とパスワード
$data = array(
	'url_name' => $params['uid'],
	'password' => $params['pwd'],
);

// HTTPヘッダの内容(※ここがかなり重要っぽい)
$headers = array(
	'Content-Type: application/x-www-form-urlencoded',
);

// コンテキストリソース
$options = array(
	'http' => array(
		'method' => 'POST',
		'content' => http_build_query($data),
		'header' => implode("\r\n", $headers),
	)
);

$contents = file_get_contents($url, false, stream_context_create($options));
```

これでいけるっぽい。
コンテキストリソースにヘッダの内容(Content-Type)を含めないと、なんかこんなエラーが起こってしまう。
<pre>file_get_contents(): Content-type not specified assuming application/x-www-form-urlencoded</pre>

Content-Typeが特定できません。的な。

これできちんとユーザ名とTokenが帰ってきてTokenが必要なAPIも叩けるようになりました。
GitLabとSparkleShareを使ってDropbox風サービスとして使う場合のメモ

[SparkleShare](http://sparkleshare.org/)はGitリポジトリを使ってDropbox風の機能を提供するクライアントアプリケーションです。

SparkleShareはローカルのGitリポジトリの変更を監視して自動で`git add`と`git commit`と`git push`をしてくれるみたいです。

そいで、

- プロトコル: HTTPS
- GitLabをSubURIを使って運用
- ユーザ名: username
- パスワード: password
- リポジトリのURL: https://neko.example.net/gitlab/group/project.git

という状況の場合、SparkleShareでは以下のように設定すれば動作しました、というメモ。

- Address: https://username:password@neko.example.net:443
- Remote Path: /gitlab/group/project.git
Control Structure with Extension

Swiftを調べていて一番感動したのがこのFeature。既存のクラスにたいていExtensionという仕組みを使うと自分なりに拡張することができる。

```swift
struct SampleStruct {
    var v: Int = 0
    init(v: Int) {
        self.v = v
    }
}

extension SampleStruct {
    mutating func mulFactor(factor: Int) {
        v *= factor
    }
}
```

既存の`struct` SampleStructとその拡張を用意する。
そうするとmulFactorはクライアントコードから呼び出すことができる。

```swift
var s: SampleStruct = SampleStruct(v: 5)
s.mulFactor(10)
println(s.v) // -> 50
```

今回はSampleStruct本体を自分で定義したから別に面白くないけれど、これが他人の書いたクラスだったらどうだろう。例えば`Int`

```swift
extension Int {
    func repetition(task: () -> ()) {
        for i in 0..self {
            task()
        }
    }
}
```

こんな拡張を書いてあげるとこれは`Int`のメソッドとして使うことができる。

```swift
100.repetition({ println("Hello, World")})
// Hello, World
// Hello, World
// Hello, World
// Hello, World
// ... 100個続く
```

Swiftでは評価部分だけのClosureは丸括弧を省いていいので以下のようにも書ける。

```swift
100.repetition{
   println("Hello, World")
}
```

制御構造のようにも見える。ExtensionとClosureを使えばScalaのように自由にDSLも書ける！

ちなみにひとつハマったのは

`Class`に対しては`mutating`宣言されたExtensionを書くことができない。先ほどの例だとこんか感じ。

```swift
class SampleClass {  // <-- ここがクラス
    var v: Int = 0
    init(v: Int) {
        self.v = v
    }
}

extension SampleClass {
    mutating func mulFactor(factor: Int) {  // <-- ここでコンパイラに怒られる
        v *= factor
    }
}
```

**`'mutating'` isn't valid on methods in classes...**

とか言われるのでダメっぽい。
Infinite loop in getter

Swiftでは簡単にプロパティのgetterとsetterが定義できる。

```swift
class BaseCounter {
    var counter: Int {
        get {
            println("This is get")
            return self.counter + 1
        }
        set {
            println("This is set")
        }
    }
    init() {
        counter = 0
    }
}
```

このような形でクラスの書くプロパティに対して、任意のgetterとsetterを定義できる。
ところがこれを呼ぶと大変なことになる。

```swift
let c = BaseCounter()
println(c.counter)

//
// This is get
// This is get
// This is get
// This is get
// This is get
// ... 永遠に続く
```

どうやらgetの中に書いてある`self.counter`がまたさらにgetterを呼ぶためにこういうことになるみたい。サンプル見ても自分自身の参照をgetterの中には書いてないのでやめた方がいいみたい。
そのproperty自体を操作して返す場合にはgetterを定義しない方がいいということなのかな。
PHPのPDOでカラムにNULLを設定する方法

PHPのPDOを使ってカラムにNULLを設定するには、bindValueでPDO::PARAM_NULLを引数に指定します。
例 : 空文字の場合にNULLを設定する.
<pre>
$pdo = new PDO("mysql:host=localhost; dbname=mydatabase", $user, $pass);
$value = "";

$stmt = $pdo->prepare("UPDATE mytable SET mycolumn=:value");
if ($value === "") { 
  $stmt->bindValue(":value", null, PDO::PARAM_NULL);
} else {
  $stmt->bindValue(":value", $value);
}
$stmt->execute();
</pre>
Compass @import の優先順位

最近はまった Compass の @import の優先順位。

# Compass の設定

## /htdocs/config.rb

```rb
sass_dir = "css/"
```

# ケース1

## ディレクトリ構造

```
/htdocs/
  └ /css/
      ├ import.scss 
      └ /sample/
            ├ import.scss
            └ index.scss
```

## 記述内容

### /htdocs/css/import.scss

```sass
.import1 {
    content: "/htdocs/css/import.scss";
}
```

### /htdocs/css/sample/import.scss

```sass
.import2 {
    content: "/htdocs/css/sample/import.scss";
}
```

### /TOFU/htdocs/css/sample/index.scss

```sass
@import "import.scss";
```

## 出力内容

```css
.import2 {
    content: "/htdocs/css/sample/import.scss";
}
```

# ケース2

## ディレクトリ構造

```
/htdocs/
  └ /css/
      ├ import.scss 
      └ /sample/
            └ index.scss
```

## 記述内容

### /htdocs/css/import.scss

```sass
.import1 {
    content: "/htdocs/css/import.scss";
}
```

### /htdocs/css/sample/index.scss

```sass
@import "import.scss";
```

## 出力内容

```css
.import1 {
    content: "/htdocs/css/import.scss";
}
```

# ケース3

## ディレクトリ構造

```
/htdocs/
  └ /css/
      └ /sample/
            └ index.scss
```

## 記述内容

### /htdocs/css/sample/index.scss

```sass
@import "import.scss";
```

## 出力内容

```css
Syntax error: File to import not found or unreadable: import.scss.
```

当然エラー。

# 結論

Compass がコンパイルするとき、@import の優先順番は下記っぽい。

1. 相対的なパスのファイル
2. Config に定義された CSS ディレクトリのルートのパスからファイル
3. 上記にファイルがなければエラー

仕組みとしてはユーザーフレンドリーだけど、実際に遭遇するとすげーわかんない...。
AssetBundleの暗号化について図でまとめてみた


公式のドキュメントで暗号化について言及しているが文章がいまいちわかりにくかったので図にまとめてみた。

* [Unity - Manual: Protecting Content](http://docs.unity3d.com/Manual/protectingcontent.html)
* [Unity - Unity Manual](http://docs-jp.unity3d.com/Documentation/Manual/protectingcontent.html#) ※上記の日本語訳

※どのアプローチでも暗号化とその復号はUnityはやってくれないので自前でライブラリ等を使って実装する必要はある。

# アプローチ1


![AssetBundle暗号化_1.png](https://qiita-image-store.s3.amazonaws.com/0/8219/46ce0349-e7bd-14e4-e254-9aaa631890c6.png "AssetBundle暗号化_1.png")

# アプローチ2

![AssetBundle暗号化_2.png](https://qiita-image-store.s3.amazonaws.com/0/8219/e35221f8-3901-2897-6155-f41dd774c297.png "AssetBundle暗号化_2.png")

# アプローチ3

![AssetBundle暗号化_3.png](https://qiita-image-store.s3.amazonaws.com/0/8219/d33328d2-de50-e852-387f-0c069e103da9.png "AssetBundle暗号化_3.png")

# 結論

まとめると、以下のような感じだと思われる。

* 暗号化の対象となるリソースが少ない場合 => アプローチ1
* 暗号化の対象となるリソースがある程度あるが、ダウンロードは頻繁に発生しない => アプローチ2
* 暗号化の対象となるリソースがある程度あり、ダウンロードが頻繁に発生する => アプローチ3
Homebrewでtmuxをインストール＆初期設定


余り使いこなせてるとは思えないのだけど、自宅のMacでtmuxを使っているので、ひとまず最小限の設定をする方法を。

参考：[tmux 1.9aの挙動が怪しかったので1.8に戻した](http://blog.glidenote.com/blog/2014/03/14/tmux-1.9a-is-not-good/)

一時期、上記を参考に1.8で運用していたのだけれど、Homebrewの最新化をした際に1.9aに更新して、現時点では余り不具合を感じていません。

ということで、当座はこのまま1.9aで運用する予定です。

### Homebrewでtmuxをインストール

```bash:install
$ brew install tmux
$ brew install reattach-to-user-namespace
```

tmux本体と合わせて`reattach-to-user-namespace`を入れます。

参考：[Mac の tmux でクリップボードを使う。](http://koseki.hatenablog.com/entry/20110816/TmuxCopy)

現状試してみた範囲では、`pbcopy`/`pbpaste`は`reattach-to-user-namespace`ありならOKなのですが、`launchctl`が余りまともに動かず(^_^;)

```bash:reattach-to-user-namespace関連テスト
$ echo hoge | pbcopy
$ pbpaste
hoge
$ launchctl load ~/Library/LaunchAgents/org.ksworks.PeriodicWork.plist 
nothing found to load
```

ひとまずは`launchctl`を使わない運用方針に切り替えることで対処としますorz

### 最低限のtmux.conf

使うにあたって、プレフィクスコマンド`C-b`が予約されてしまうと、１文字前に移動(backward-char)を良く利用するのでツラい(^_^;)

ということで、プレフィクスコマンドは`C-z`に変更します。

合わせて、先ほどインストールしておいた`reattach-to-user-namespace`の設定と、何か変更した時に設定ファイルをリロードするためのキーバインド設定(`C-z C-r`)を作っておきます。

```profile:~/.tmux.conf
# Prefix: C-z
unbind C-b
set -g prefix C-z
bind C-z send-prefix

# for pbcopy/pbpaste/launchctl
set-option -g default-command "reattach-to-user-namespace -l bash"

# reload
bind C-r source-file ~/.tmux.conf \; display "reload: ~/.tmux.conf"
```

この辺りまでが自分なりの最低限の設定ということで…
SVG Textの縦方向描画位置を調整する


SVG Textの横方向の描画位置を調整する手段としてtext-anchor属性があります。text-anchorを使うことで、x=0の点をtextの左端、中央、右端に変更することができます(以下参照)。

* [text-anchor](http://www.w3.org/TR/SVG/text.html#TextAnchorProperty)
* [SVG Textのtext-anchor属性をつかってみた。](http://kadoppe.com/archives/2012/01/svg-text%E3%81%AEtext-anchor%E5%B1%9E%E6%80%A7%E3%82%92%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82.html)

同じように、縦方向の描画位置を調整する、すなわちy=0の点がtextのどこにあたるかを調整する属性として[dominant-baseline](http://www.w3.org/TR/SVG/text.html#DominantBaselineProperty)を使うことができそうです。

text-anchorには12種類の値を設定することができます。D3.jsを使って全パターンを描画させてみました。

```javascript
var texts = [
    'abcdefg',
    'ほげほげ'
];
var params = [
    'auto',
    'use-script',
    'no-change',
    'reset-size',
    'ideographic',
    'alphabetic',
    'hanging',
    'mathematical',
    'central',
    'middle',
    'text-after-edge',
    'text-before-edge'
];
var textWidth = 120;
var width = textWidth * params.length;
var height = 500;

var svg = d3.select('body')
    .append('svg')
    .attr({
        width: width,
        height: height
    });

svg.selectAll('text')
    .data(params)
    .enter()
    .append('text')
    .text(function(param) {
        return param;
    })
    .attr({
        x: function(_, i) {
            return textWidth * i;
        },
        y: 50
    });

var line = svg.selectAll('g')
    .data(texts)
    .enter()
    .append('g')
    .attr('transform', function(_, i) {
        return 'translate(0,' + (100 * i + 150) + ')';
    });
line.append('line')
    .attr({
        x1: 0,
        y1: 0,
        x2: width,
        y2: 0,
        stroke: 'black'
    });
line.selectAll('text')
    .data(function(text) {
        return params.map(function(param) {
            return {
                text: text,
                param: param
            };
        });
    })
    .enter()
    .append('text')
    .text(function(d) {
        return d.text;
    })
    .attr({
        'dominant-baseline': function(d) {
            return d.param;
        },
        x: function(_, i) {
            return textWidth * i;
        },
        y: 0
    });
```

動作結果は http://jsfiddle.net/likr/4z6mX/ のようになります。
Deferred/Promise のとある性質についての話

# ケーススタディ
## #1 Deferred/Promise

Promise は値を包み込み、その値へアクセスする方法 then を提供する。

```coffeescript
deferred = $q.defer()
promise = deferred.promise

extA = 1
extE = null
promise
  .then (innerA) ->
    return innerA + 1               # 2
  .then (innerB) ->
    return "hoge#{innerB}fuga"      # hoge2fuga
  .then (innerC) ->
    return innerC.toUpperCase()     # HOGE2FUGA
  .then (innerD) ->
    return extE = innerD.split("G") # ["HO", "E2FU", "A"]

console.log extE # null
deferred.resolve(extA)
```

型 A の値を包み込む `promise` のことを、 `P(A)` と書くことにする。`then` に関数 `f: A -> B` を渡してやると、then の返り値は型 B の値を包み込んだ型 P(B) になる。これを使って、少し面白い関数を作る事ができる。

```coffeescript
pf = (f) -> (pa) -> pa.then f
```

`pf` は 関数 `f: A -> B` を受け取り、関数 `P(A) -> P(B)` を返す。
これは、P(A) が 型 A の値を包み込んだように、関数 `f` を包み込んだように見える。この関数を象徴的に P(f) と書いてみる。

外側の世界：

```
f: A -> B
```

内側の世界：

```
P(f): P(A) -> P(B)
```

## #2 Array
さて、これとよく似た性質を持つものが、ずっと昔から様々な言語に実装されている。配列の `map` 関数だ。

```coffeescript
# CoffeeScript
arr = [1..5] # [1,2,3,4,5]
sqArr = arr.map (n) -> n*n # [1,4,9,16,25]
```

```hs
-- Haskell
let arr = [1..5]
let sqArr = map (\n -> n*n) arr
```

```py
# Python
arr = range(1,6)
sqArr = map(lambda n: n*n, arr)
```

```php
<?php
$arr = range(1,5);
$sqArr = array_map(function($n) { return $n*$n; }, $arr);
```

```rb
# Ruby
arr = 1..5
sqArr = arr.map {|n| n*n}
```

```objc
// Objective-C
// NSArray+map.h
#import <Foundation/Foundation.h>
typedef id (^callback_t)(id);
@interface NSArray(map)
+ (NSArray *)arrayWithCallback:(callback_t)callback usingEachObjectInArray:(NSArray *)arr;
@end

// NSArray+map.m
#import "NSArray+map.h"
@implementation NSArray(map)
+ (NSArray *)arrayWithCallback:(callback_t)callback usingEachObjectInArray:(NSArray *)arr
{
  NSMutableArray *res = [NSMutableArray arrayWithCapacity:[arr count]];
  for(id obj in arr)
    [res addObject:callback(obj)];
  return res;
}
@end

// how to use
NSArray *arr = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], [NSNumber numberWithInt:4], [NSNumber numberWithInt:5], nil];
NSArray *sqArr = [NSArray arrayWithCallback:(^NSNumber *n) { int m = [n intValue]; return [NSNumber numberWithInt:m*m];} usingEachObjectInArray:arr];
```

```swift
// swift
let arr = [1, 2, 3, 4, 5]
let sqArr = arr.map { $0 * $0 }
```

型 A の値を集めた配列を `L(A)` と書くことにする。`map` を使って、`L(f)` を作ることが出来る。

```coffeescript
lf = (f) -> la -> la.map f
```

外側の世界

```
f: A -> B
```

内側の世界

```
L(f): L(A) -> L(B)
```

# 関手
P や L のことを関手と呼ぶ。関手は、次のような性質を持つ：

```
f: A -> B
g: B -> C
のとき、
L(g.f) = L(g).L(f)
P(g.f) = P(g).P(f)
（ここで、g.f は f と g の合成関数で、g.f(a) = g(f(a)) である。
```

Monad にも触れたかったけど、（主に Objective-C のせいで）長くなってしまったのでおしまい。気が向いたら書く。
新人エンジニア必見！Webの研修でわかるあなたの会社の技術特性！

本投稿は完全なる私の私見で、いささかネタじみています。Java大好き。
一時のお楽しみのために読んでいただき、あんまり真剣に捉えてはならないことを予めご了承の上、先にお進みください。

# Webの研修内容でわかる、あなたの会社の技術特性、もしくは技術力
現在のアプリケーションを作る、となると、多くはWebアプリケーションです。多くの会社は、新人研修で言語研修の後に、Webアプリケーションの技術研修をすると思います。

一口にWebアプリケーションと言っても、利用する技術は多様です。いろいろな言語やフレームワークでを選択してWebアプリケーションは作ることができるのですが、その選択によって、その会社の技術力がわかります。

# 選択肢と、技術特性・技術力
あなたの会社がどんな研修をしてくれるかで、会社のあり方が見えてきます。各言語、およびフレームワーク別に見てみましょう。

## Perl
やべー。
あなたの会社でのお仕事は、古めかしいWebサイトのメンテナンスに追われることとなるでしょう。
Perlは[LAMP](http://ja.wikipedia.org/wiki/LAMP)の一部としてもてはやされてましたが、ずいぶん古めかしい技術です。
Perlを教える、ということはあなたの会社は「新しい技術に関心がないよ」といっているのに等しいです。

## PHP
えっ。。。（困惑）
あなたの会社でのお仕事は、簡単なWebサイトを細々作ることになります。多くの場合、そのサイトはずいぶん古く、ごちゃごちゃとよくわからない作りになっていることでしょう。先輩たちは事あるごとに「デグレデグレ」と謎の言葉を、モニターの前で頭を抱えてつぶやいています。「CakePHP」というものも一緒にならったとすれば、あなた方の先輩が、変化を嫌う上位職との戦いの果てに妥協点を見つけた、ということです。あなたの会社は技術革新には置いていかれるでしょう。

## Ruby
お、いいじゃん。
さらに、「Ruby on Rails」を一緒に習っていて、それがVersion4ならなおのこと期待できます。事前の言語研修で、Scalaとか、Javaを習っていたら、技術力がすごくある会社と思っていいでしょう。楽しんで仕事や自己研鑚に進んでいける会社です。良かったですね。
ただ、いささか流行に惑わされ、じっくり腰を据えて技術に向き合う態度がかけているかもしれません。なぜその技術を選択するかを考えて勉強するようにしましょう。

## Python
来たーーーー！！
あなたの会社は、技術を選べる会社です。周りに惑わされることなく、「良いものは良い」と言える会社でしょう！
ただ、社外勉強会や技術サイトの流行情報を横目に見て羨ましくなることがあるかもしれません。

## Scala, Groovy, Node.js
あ、いいね！でも、、、大丈夫？
あなたの会社は、流行りモノが好きな会社です。もしかすると、講師は先輩で、その先輩は講義が終わったあと、深夜まで残業していることでしょう。なぜなら、その先輩がNode.jsをやりましょうと企画して、周りに薦めたからです。それ以前には、Javaとか、PHPとかをやっていたんでしょうね。あなたの会社は、その先輩の言いなりです。その先輩がNode.jsに飽きちゃったら、別の作り方を習わされることになるんでしょうね。かわいそうに。

## Java
さて、ここからはJava。多くの方はJavaで研修を受けていることでしょう。Javaにはとても多くの作り方があり、どのような作り方を習ったかによってあなたの会社の技術力はずいぶん変わってきます。

## Java (web.xmlっていうのを書かされた。)
うん。ヤバイ。
なんか、＜servlet＞とか書かされたとしたら、その会社は化石のような技術を使ってます。あなたの会社は技術に関心がありません。あなたの会社での仕事は、意味のないものでしょう。右から左に仕事を流すのが、あなたの先輩の仕事です。もしかしたら、給料はとてもいいかもしれませんが、仕事にやりがいを求めたいのであれば、「転職サイト」とググることをおすすめします。

## Java (Strutsっていうのを習った。)
あぁ。。。マズイ。
struts-config.xmlを書かされそうになったら、おもむろに立ち上がって叫びましょう。「江戸か！？」あなたの会社は技術に対するコントロールを効かせようとしていません。あなたが価値のある仕事をしたとしても、上位職はその価値を認めないどころか、理解することもできないでしょう。

## Java(なんか、@つけてた。)
凄くいい。スゴくいいよ！
あなたの会社は、自分たちで使う技術をじっくりと精査し、メンテナンスできる会社です。流行りに流されることなく、現状に満足することなく、いかに技術の価値を発揮するかということに貪欲に邁進していることでしょう！

## C＃
。。。酒飲みに行きましょう。一緒に泣くことくらいはできますよ。
C#をやっている、ということは、あなたの会社はかなり偏った技術を持っているでしょう。Windows+.net Frameworkです。いつか、勉強会に行って、「あ、、、この人、lsもわかんないのか、、、エンジニアじゃないんだな。。。」と哀れな視線を感じることでしょう。また、ニュースサイトで流行っている技術を横目に見て、羨ましく思うものの、あなたの仕事との隔たりに絶望することになります。仕事をするようになっても、あなたに技術のコントロールをする権限は一切与えられません。

## それ以外。
えっと、第二新卒市場も今活気あるから、大丈夫だよ！

## 番外編。
Objective-Cを習ったよ！（HTTPってなに？）っていう方は、ゲームを作り続ける会社なんでしょうな！

御社、どうだったでしょう？
ところで Swift では Array#map が使えます

```rb:map.rb
api_response = [
  {last_name: "Tanaka", first_name: "Taro"}, 
  {last_name: "Taguchi", first_name: "Ichiro"}, 
  {last_name: "Haraguchi", first_name: "Saburo"} 
]
full_names = api_response.map {|a| "#{a[:last_name]} #{a[:first_name]}"}

# Returns
# ["Tanaka Taro", "Taguchi Ichiro", "Haraguchi Saburo"]
```

```swift:map.swift
let api_response = [
  ["last_name": "Tanaka", "first_name": "Taro"],
  ["last_name": "Taguchi", "first_name": "Ichiro"],
  ["last_name": "Haraguchi", "first_name": "Saburo"]
]
let full_names = api_response.map {(a) in "\(a['last_name']) \(a['first_name'])"}

# Returns
#  ["Tanaka Taro", "Taguchi Ichiro", "Haraguchi Saburo"]
```

まさに神
エセC言語で痛み付けられた心が洗われますね
Vagrant の設定（主にネットワーク）あれこれ

# Vagrant の設定あれこれ
細かい事は公式サイトをみるといいんだろうけど英語だし・・・ちょっとしたことなんだけど良く忘れるのでメモっておく。

> [VAGRANT DOC](http://docs.vagrantup.com/v2/networking/private_network.html) / [日本語訳](http://lab.raqda.com/vagrant/vagrantfile/machine_settings.html)

## 超おまかせ設定
最低限の設定、アクセスは ```127.0.0.1:3333``` でアクセスする。

```lang:Vagrantfile
config.vm.define :web do |web|
  web.vm.network :forwarded_port, guest: 22, host: 3333, host_ip: "127.0.0.1", id: "ssh", auto_correct: true
end
```

## Vagrant起動時にshellを実行させる設定＆別パーティションの共有フォルダ追加する設定

> [シェルスクリプトを使ったプロビジョニング](http://momijiame.tumblr.com/post/70670744574/vagrant-vm)

```lang:Vagrantfile
config.vm.define :web1 do |web1|
   web1.vm.synced_folder "C:/Users/temp/vagrant_share", "/vagrant_share", type: "nfs"

  web1.vm.provision "shell", inline: <<-EOT
    echo hello
  EOT
end
```

## Vagrant単位に使用するメモリや、サーバ名の設定

```lang:Vagrantfile
config.vm.define :web2 do |web2|
  web2.vm.provider "virtualbox" do |v| 
    v.customize ["modifyvm", :id, "--memory", 512] 
    v.name = "web2" 
  end 
end
```

## プライベートネットワークの設定
> http://docs.vagrantup.com/v2/networking/private_network.html

```lang:Vagrantfile
config.vm.define :web3 do |web3|
  web3.vm.network :private_network, ip: "192.168.11.200" 
end
```

## パブリックネットワークの設定
> http://docs.vagrantup.com/v2/networking/public_network.html

```lang:Vagrantfile
config.vm.define :web4 do |web4|
  web2.vm.network :public_network, ip: "192.168.0.128" 
end
```

## ホストOSのhostsファイルにゲストOSのホスト名・IPを追加・削除してくれるVagrantプラグイン

> https://github.com/cogitatio/vagrant-hostsupdater

コマンドラインで ```vagrant plugin install vagrant-hostsupdater``` を実行する。通常通りに ```vagrant up```で、ホストOS側の hosts ファイルにゲストOSのホスト名・IPを追加してくれるそうな。

```
config.vm.hostname = "hogehoge.devel"
config.vm.network :private_network, ip: "192.168.33.250"
```

## 環境変数で Vagrant の bridge を指定できるようにする
複数のネットワークカードがある場合、これは便利かも。

> [環境変数で Vagrant の bridge を指定できるようにする](http://qiita.com/elim/items/816f03c732e4b274d181)


## リンク
> [vagrantのネットワークについて](http://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11)
> [Vagrantのネットワーク周りのあれこれ](http://labs.septeni.co.jp/?p=966)
> [vagrantのネットワーク設定を見てみよう。](https://ie.u-ryukyu.ac.jp/e115720/2014/07/20/vagrant%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%80%82/)
> [vagrantのprivate_networkのIP指定でエラーが出る人は今すぐアップデートしましょう](http://treeapps.hatenablog.com/entry/2014/06/04/011636)
今更ながらVB.NET2005を使ったアプリケーションでテキストボックスとコンボボックスがEnabledの時の文字色を変える必要が出てきたので調査した件


前提としてEnabled時は文字色が灰色になります。そして、Enabled時の文字色を変えるプロパティは存在しません。（現在最新の２０１３でもないっぽい。何故無いのだろう。）
よって、通常のテキストボックスでEnabled時で文字色を変えたいならば、Enabledの代わりに、ReadOnlyをTrueに、TabStopをFalseにして擬似的なEnabled状態を作る方法がまず一点。ただし、コンボボックスにはReadOnlyが存在しないので、動きに一貫性が無くなる点が問題。

で、次の解決策、テキストボックスのサブクラスを作って、その中でEnabledでの動きをオーバーライドしてEnabled時の文字色を変更するというもの。今回はこちらを採用。

http://dobon.net/vb/dotnet/control/tbenabledfalse.html


リンク先のサンプルソース上にあるペイントのオーバーライド時に色を編集しているので好みの色を設定してやればいい。

```VB.NET:MyTextBox
'TextBoxを描画する
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)
        Dim b As New System.Drawing.SolidBrush(Me.ForeColor)
        '文字列を描画する
        e.Graphics.DrawString(Me.Text, Me.Font, b, -1, 1)
        b.Dispose()
    End Sub
```

で、この解決策はコンボボックスでも適用できます。


```VB.NET:MyComboBox
Class MyComboBox
    Inherits ComboBox
'以下同じ
```

ただし、ComboBoxの場合、Enabled時に右にある三角のやつが消えます。再描画が微妙にうまく出来てないということか？そこは解決方法があるかもしれませんが、今回はパス。誰か知ってるなら教えて下さい。
MySQL に大量のデータを手っ取り早く挿入する

LOAD DATA にパイプからデータを流し込みます。

まずはデータを入れるテーブルを作ります。

```sql
create table t (
  id int not null primary key,
  str text not null
);
```

LOAD DATA には計算式をかますことができるので RAND() のような関数も使うことができます。

 - [MySQL の LOAD DATA で関数や計算式をかます - Qiita](http://qiita.com/ngyuki/items/f886d5bec1bb9d07025b "MySQL の LOAD DATA で関数や計算式をかます - Qiita")

LOAD DATA にはファイル名しか指定できませんが /dev/stdin とでもすれば標準入力から流しこむことができます。

```bash
seq 10000000 |
  mysql test -e "
    load data local infile '/dev/stdin' into table t (id)
    set str = floor(rand()*10000000)
  "
```

LOAD DATA LOCAL INFILE ではなく LOAD DATA INFILE を使いたければ mkfifo を使うと良いです。
mysqld から読めるように -m 0644 も指定しておきましょう。

```bash
mkfifo -m 0644 /tmp/xxxx
seq 10000000 > /tmp/xxxx &
mysql test -e "
  load data infile '/tmp/xxxx' into table t (id)
  set str = floor(rand()*10000000)
"
rm /tmp/xxxx
```

環境や流し込むデータの内容によってかかる時間は全然違うと思いますが、1000 万件が 1 分強ぐらいでした。

---

LOAD DATA LOCAL INFILE よりも LOAD DATA INFILE の方が速いかなと思ったけど接続が Unix ドメインソケットなら特に違いは無かった。
ChatWorkでタグを拡張してシンタックスハイライトする

ChatWorkでコードを連投されてカッとなってやりました。
平たくいうとこういうのです。

![ChatWork2.png](https://qiita-image-store.s3.amazonaws.com/0/5522/6838a928-40a4-25b1-1227-3a18d18c1c07.png)

困ったことがあれば公式が対応する前に作ってしまえば良いんですよ。

# 作り方

## 解析

ChatWorkの````window````オブジェクトの中を見ていると````TimeLineView````という見慣れないのがあります。
適当にブレイクポイントを貼ってタイムラインを更新すると````renderTimeLine````というメソッドで止まってくれることがわかります。

```js:chatwork_all_ja.min.js
renderTimeLine: function(a, b) {
    a.html(b).find("._taskCompleteHide").each(function() {
        var a = $(this);
        a.find("._taskBody").height() >= 38 && a.append('<p class="_showMore showMore showMoreComplete">' + L.read_more + "</p>")
    })
}
````

この````renderTimeLine````の引数の````a````にはタイムラインの$element（Jqureyの要素オブジェクト）が、````b````には新しく更新するHTML文字列が入ります。
つまり、このメソッドにフックして引数の````b````を書き換えてやればタイムラインを好きに書き換えることができるという訳ですよ。

## フック

　````TimeLineView````ではprototypeを使ったクラスで使用しているので、prototypeの中の````renderTimeLine````をスワップするとフックできます。

```js
var renderTimeLine = TimeLineView.prototype.renderTimeLine;
TimeLineView.prototype.renderTimeLine = function (a, b) {
  var b = $('<div></div>').html(b).find('div[id^="_messageId"]').each(function(i, e) {
    // タイムラインを書き換える処理
  });
  renderTimeLine.apply(TimeLineView, [a, b]);
}
````

**※Chromeのみで動作確認済み**

これであとはタイムラインの書き換え処理を書くだけです。

## タイムラインを書き換える

{code}{/code}という独自拡張したタグでシンタックスハイライトする例です。
事前に[hilight.js](http://highlightjs.org/)を読み込んでください。

```js
// タイムライン中の{code}{/code}を書き換える（適当）
$el = $(e).find('.chatTimeLineMessageArea pre');
if ($el.length) {
    $el.html($el.html().replace('{code}', '<code>').replace('{/code}', '</code>')).find('code').each(function(i, e) {hljs.highlightBlock(e)});
}
````

簡単ですね！！
例えばマークダウンを表示するとか、寿司を表示するのも同じようなやり方で作ることができます。

# シンタックスハイライト Extension

実際に作ったChrome用のExtensionです。
適当に解凍して参考にしてください。

https://dl.dropboxusercontent.com/u/29949744/chatwork-code-hilighter/app.crx

耐久テストとかしていないので、1日中使ったりすると重くなるかもしれません。気をつけてください。

---

同じような仕組みでメッセージを受け取ったらXHRでメッセージを飛ばすWebHookモドキも作れそうですね。
気が向いたらChatWorkから伺かにメッセージを飛ばしたいです。
Pattern of Optional type

Optional Typeに関してのPatternをWWDCのVideoで幾つか見つけた。

## Non Optional Typeにはnilは入れられない

これらは当然OKだが

```swift
var s: String = "This is String"

var c: MyClass = MyClass()
```

これはだめ。値がないということがNon Optional Typeでは認められないらしい。
これは安全なプログラムを書くことに貢献するので非常に嬉しい。値がないケースを考えたかったら
Optional Typeを使いましょう

```swift
var s: String = nil // Compile Errorになる

var c: MyClass = nil // Compile Errorになる
```

## `if let`パターン
Optional Typeでは値がない場合があるので、使うときには判定してあげないといけない
Optional Typeはif文の中に突っ込めるのでnaiveにやるとこんな感じ。

Optional Typeを返す何かしらの関数

```swift
let array: String[] = ["A", "B", "C", "D", "E"]
func findIndexOfArray(s: String, array: String[])-> Int? {
    for (index, value) in enumerate(array) {
        if value == s {
            return index
        }
    }
    return nil
}
```

ただしコレはエラーになる。

```swift
let ret = findIndexOfArray("C", array)
if ret {
    println("\(array[ret]) exists")  // Compile Error
} else {
    println("not exists")
} 
```

Optional TypeはそのままだとWrapされた値を参照できないので`!`マークを使ってUnwrapさせる必要がある。

```swift
let ret = findIndexOfArray("C", array)
if ret {
    println("\(array[ret!]) exists")  // Unwrap ret value
} else {
    println("not exists")
} 
```

もう少しかっこよくやるには`let`を`if`の中に含めてしまう手がある。

```swift
if let ret = findIndexOfArray("C", array){
    println("\(array[ret]) exists")  
} else {
    println("not exists")
} 
```

こうすることでif clauseの中でコンパイラは自動的にretの値をUnwrapしてくれる。

## Optional Chaining
でも値があるかどうかをいちいち`if let`で判定していくとネストが深くなるしわかりづらい。
なのでOptional Chainingという方法がある。Optional型を返すものは繋げられるのだ。

```swift
let addressNumber = paul.residence?.address?.buildNumber?.toInt()
```
それぞれがOptional Typeを返す部分でどこかでnilが返ってきた場合全体の評価値もnilになる。
エラーにはならない。このように書くことで簡単に深い構造での値の存在確認ができる。

参照：[Intermediate Swift](https://developer.apple.com/videos/wwdc/2014/)
gulp.js その2 gulpでWebサーバー/ライブリロード


**※ ここで紹介している"gulp-connect"プラグインは deprecateされた。
後継の"gulp-webserver"プラグインを使うこと（[» gulp-webserverプラグインの解説](https://www.npmjs.org/package/gulp-webserver)）**

"gulp-connect"プラグインを使えば、簡単に開発用Webサーバーを立ち上げ、ライブリロードで確認しながら作業することができる

## 準備

gulpがインストールされていることが前提

### gulp-connectのインストール

npmで開発用としてインストールする
`npm install --save-dev gulp-connect`


### gulpfile.jsの編集

[gulp-connect - npm](https://www.npmjs.org/package/gulp-connect) のサンプルそのまんま
事前に'app'ディレクトリを作成し、中に'index.html'と'about.html'を入れておく

【ディレクトリ構成】
テスト用ディレクトリ
　├ gulpfile.js
　├ app
　│　├ index.html
　│　└ about.html
　└ node_modules

```gulpfile.js
var gulp = require('gulp'),
  connect = require('gulp-connect');

//Webサーバー
gulp.task('connect', function() {
  connect.server({
    root: 'app',//ルートディレクトリ
    livereload: true //ライブリロード
  });
});

//'html'に、htmlファイルをリロードする処理を登録
gulp.task('html', function () {
  gulp.src('./app/*.html')
    .pipe(connect.reload());
});

//監視：HTMLファイルが変更されたら'html'を実行
gulp.task('watch', function () {
  gulp.watch(['./app/*.html'], ['html']);
});

//デフォルトタスクに登録
gulp.task('default', ['connect', 'watch']);


```

## 実行

ターミナルでgulp実行。
`gulp`

「アプリケーション"node"へのネットワーク受信接続を許可しますか？」とアラートが出るので、許可。
標準出力で、サーバーとライブリロードが開始されたことが確認できる
ホストやポート番号は connect.server() のオプションで変更できる

```
[09:19:18] Server started http://localhost:8080
[09:19:18] LiveReload started on port 35729
```

【結果】
ブラウザで http://localhost:8080 にアクセスすると、index.html が表示される
http://localhost:8080/about.html にアクセスすると、about.html が表示される
存在しないファイルにアクセスしようとすると"Cannot GET /ファイル名"と表示

ブラウザを開きながらエディタでHTMLを変更保存すると、ライブリロードが機能していることが確認できる。




## 参考サイト

* [gulp-connect - npm](https://www.npmjs.org/package/gulp-connect)
* [Gulp as a Development Web Server - Tuts+ Code Tutorial](http://code.tutsplus.com/tutorials/gulp-as-a-development-web-server--cms-20903)
themeのcss修正

redmineにalminiumのgitmikeというthemeを使っているのですが、
`h1`の表示が気に入らないのでcssに追記した。

変更前
-------

![変更前.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7ba1d7b6-acd6-28a8-0c0b-94a8e5199c65.png)

変更後
------

![変更後.png](https://qiita-image-store.s3.amazonaws.com/0/25728/863c7dda-e405-5614-1dea-b379728b8ee4.png)


css
------

```css:/opt/alminium/public/themes/gitmike/stylesheets/application.css
* {
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
}

h1 {
    -webkit-border-radius: 3px;
    -moz-border-radius: 3px;
    border-radius: 3px;
    margin: 1.3em 0 .7em 0;
    background-color: rgba(0, 0, 0, 0.1);
    padding: 3px 10px;
    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
    line-height: 30px;
    font-size: 24px;
    font-weight: 600
}

h2 {
    margin: 1.3em 0 .7em 0;
    border-bottom: solid 1px #d9d9d9;
    line-height: 28px;
    font-size: 22px;
    font-weight: 600;
}

a {
    color: #117ec6;
    text-decoration: none;
    border-bottom: none;
}
```
Swiftで"hw.machine"を取得する

sysctlbyname関数で"hw.machine"の値を取得するコードをSwiftで書き直すとき、Cの部分をどうするかでちょっと手間取ったのでメモとして残します。
参考:
[Interacting with C APIs](https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithCAPIs.html)
[Collection Types](https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/CollectionTypes.html)

```swift
func platformString() -> String {

	let name = "hw.machine"
	let cName = (name as NSString).UTF8String //Cの文字列を作成

	//サイズを取得
	var size: Int = 0 //size_tの代わりにInt
	sysctlbyname(cName, nil, &size, nil, 0)

	//取得したサイズでCCharの配列を初期化
	//*Xcode6-Beta4からCChar[]を[CChar]に変更
	var machine = [CChar](count: size / sizeof(CChar), repeatedValue: 0)
		
	//値を取得
	sysctlbyname(cName, &machine, &size, nil, 0)

	//Stringに変換
	return NSString(bytes: machine, length: size, encoding: NSUTF8StringEncoding) as String

}
```
[vDSP][信号処理]オーディオ・音声分析への道2 演算処理

#オーディオ・音声分析への道 その2　演算処理

さて、前回はXcodeのプロジェクトの作成と、設定、更に簡単なvDSP演算処理について書きました。
今回も演算処理について書いて、今後信号処理を行う上で必要になる関数を勉強したいと思います。

こちらは四則演算の関数一覧です。

+ 加算 : vDSP_vadd()　
+ 減算 : vDSP_vsub()
+ 乗算 : vDSP_vmul()
+ 除算 : vDSP_vdiv()

データ型に関しては、

+ vDSP_vaddi(); = int
+ vDSP_vadd(); = float
+ vDSP_vaddD(); = double

ちなみに、addの前につく"v"はvectorの意味です。

加算は前回やりましたので、減算からやりましょう。
減算はfloatとdouble型のみ用意されている模様です。

##減算

```C:main.c
#include <stdio.h>
#include<Accelerate/Accelerate.h>

int main(int argc, const char * argv[])

{
    float input1[8] = {1,2,3,4,5,6,7,8};
    float input2[8] = {11,12,13,14,15,16,17,18};
    float output[8];
    vDSP_vsub(input1,1,input2,1,output,1,8);

    // 結果表示
    int i;
    for(i=0;i<8;i++){
        printf("output[%d] = %f\n",i,output[i]);
    }

    return 0;
}
```

結果は

```C:result
output[0] = 10.000000
output[1] = 10.000000
output[2] = 10.000000
output[3] = 10.000000
output[4] = 10.000000
output[5] = 10.000000
output[6] = 10.000000
output[7] = 10.000000

Program ended with exit code: 0
```

でした。

##乗算

```C:main.c
    vDSP_vmul(input1,1,input2,1,output,1,8);
```

上の様にして、結果は

```C:result
output[0] = 11.000000
output[1] = 24.000000
output[2] = 39.000000
output[3] = 56.000000
output[4] = 75.000000
output[5] = 96.000000
output[6] = 119.000000
output[7] = 144.000000

Program ended with exit code: 0
```

こうなります。

##除算

```C:main.c
vDSP_vdiv(input1,1,input2,1,output,1,8);
```

結果

```C:result
output[0] = 11.000000
output[1] = 6.000000
output[2] = 4.333333
output[3] = 3.500000
output[4] = 3.000000
output[5] = 2.666667
output[6] = 2.428571
output[7] = 2.250000

Program ended with exit code: 0
```
##その他

上の例では、四則演算を全て配列で行っていました。
しかし、例えばinput1に格納されている全てのデータに、同じ数を掛け合わせたい、というケースがあるかもしれません。
この場合は、ベクトルスカラー計算んを行います。

つまり、

vDSP_vsmul()

とvectorのvの後にscalarのsをいれます。

```C:main.c
float mul = 10;
vDSP_vsmul(input1,1,&mul,output,1,8);
```

同じデータ型の変数を用意し、それをポインタで渡します。
この変数のストライドは必要ありません。

```C:main.c
extern void vDSP_vsmul(

    const float *__vDSP_A, // input1

    vDSP_Stride  __vDSP_IA, // input1のストライド (1)

    const float *__vDSP_B, //割る数 (ストライド無し)

    float       *__vDSP_C,  // output

    vDSP_Stride  __vDSP_IC, // outputのストライド(1)

    vDSP_Length  __vDSP_N) //データの長さ
```

次は波形を生成したいと思います。
Ruby On Rails で MongoDBを使ってみるよ

ネットで探すといろいろやり方あるのですが、各アプリケーションのバージョンによってやり方が微妙に違うようなのでバージョンはよく確認しましょう。
今回は

 - Ruby 2.0.0
 - Ruby On Rails 4.1.1
 - MongoDB 2.6.1

です。

各アプリはインストールされている前提です。

# プロジェクト作成
railsプロジェクトはActiveRecordなしで作成します。

```bash
$ rails new sample --skip-active-record
```

# mongoidをインストール
GemFileに以下を追加します。

```bash
gem 'io-console'
gem 'mongoid', '4.0.0.beta1'
```

バージョン指定は特にしなくても動くと思うのですが、、、とりあえずこれで動いてますということで。。。

mongoidインストール後

```bash
$ rails g mongoid:config
```

を実行します。
すると`sample/config/mongoid.yml`ファイルが作成されます。

デフォルトで`rails new`で作成した名前が入っているので、必要に応じてここでデータベース名を指定します。

# モデル作成してMongoDBを操作

```bash:モデル作成
rails g model example
```

**登録**

```rb:登録
example = Example.new(:hogehoge => 'hogehoge', :fugafuga=>'fugafuga')
example.save
```

**検索**

```rb:検索
example = Example.where(:hogehoge => 'hogehoge')
```

この辺はRDB使う場合とほぼ同じ
mongodbはスキーマレスなんで最初にテーブル作成とかいらないのでいいですね。
Amazon WorkSpacesを使った感想

# Amazon WorkSpaces とは？

[Amazon WorkSpaces (クラウド上の仮想デスクトップサービス）| アマゾン ウェブ サービス（AWS 日本語）](http://aws.amazon.com/jp/workspaces/?nc1=h_l2_cn)

Amazon WorkSpacesは、Amazonが提供するクラウドで動作するデスクトップサービスです。
一般的には、DaaS（Desktop as a Service）とかクラウド型仮想デスクトップとか、シンクライアントとか呼ばれるものになるかと思います。

# WorkSpaces のバンドルは何を選ぶか？
私は、「パフォーマンスプラス」を選択して1ヶ月ほど使用してみました。
「プラス」がつくタイプは、下記のものが追加されます。

- Microsoft Office Professional 2010
- Trend Micro Worry-Free Business Security Services

よくよく考えたら、アンチウイルスは会社でエンタープライズ入っているし、
Officeも会社でOffce365買ってるし、必要なかったかなと思いました。
大抵の会社は上記はエンタープライズで購入していると思うので「プラス」は必要ないかもしれませんが、個人や中小企業・スタートアップベンチャーには嬉しいかもしれないですね。

普段Office2013を使っているので、2010はストレスが溜まりますね。

スタンダードとパフォーマンスの違いは以下のとおり。

| WorkSpaces バンドル | CPU | メモリ |ストレージ |
|:-------------------|-----|-------|----------|
|スタンダード | 1vCPU | 3.75 GiB |50 GB ユーザーストレージ|
|パフォーマンス | 2vCPU| 7.5 GiB |100 GB ユーザーストレージ|

使用目的を開発環境とすると、スタンダードではスペックが低いと思います。
パフォーマンスタイプを使用してみた感想ですが、メモリは十分に足りていました。CPUについては、2コアでは物足らないかも・・・と思ったり。

パフォーマンスタイプのCPUスペックは以下のとおり。

```
Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz 2.50 GHz
```

結構よいですね。スペックは十分ですが、やはり開発作業を行うとネットワーク越しのオーバーヘッドがかかり、多少のストレスを感じました。
ただ、東京リージョンに来れば解決するのかもしれません。

WorkSpace内からインターネットはとても快適です。アプリのダウンロードも非常に高速で一切のストレスを感じませんでした。
タブレットなどからLTEを通じてアクセスしても、通信速度の心配はないですね。

後は、常時立ち上がっているので会社でビルドやチェックアウトをしたまま自宅に帰り、続きを行う事も可能です。とても素晴らしいですね。

# 気になった点
開発環境を構築する上で、いろいろなアプリケーションをインストールを行うとOSの再起動を求められることがあるかと思います。
ウィザードに従って、再起動を行うとクライアントからアクセスできなくなることがしばしば起こりました。
そのような場合は、AWSのコンソールからWorkSpaceを再起動してやることで解決しました。

後は、Vagrant環境をWorkSpace上で構築する上で、VirtualBoxをインストールしたのですが若干不安定になってしまいアンインストールしました。
再度インストールを行おうと思って試したのですが、二度とインストール出来くなってしまいました。また検証してみようかと思います。

# その他
次は、AD連携を試してみようと思います。

後、WorkSpaceを構築すると、VPCが作られます。（すでにあるVPC上に作ることもできた気がする）例えば、VPCの同一サブネットにファイルサーバを作るとか、そういうこともできそうですね。
ちなみに、WorkSpaceはEC2の一覧には表示されないようです。（AWS Console上）

月＄600で使えるのなら、十分採用の価値はあると思いました。
解決すべき課題は

- プリンタへの接続はどうするべきか（VPN接続かな・・・）
- 社内リソースへのアクセスはどうするか（VPN接続かな・・・）

あまりないですね。強いて言うなら、日本語化が面倒くさかったというところでしょうか。
東京リージョンに来るときは、ディフォルトで日本語に設定されていると嬉しいですね。
Titanium で [ERROR] Failed to run command "build"


titanium で ios (iphone/ipad) で実機インストールしようとしたらこんなエラーが...

```
$ ti build -p ios -T device
（前略）
[ERROR] Failed to run command "build"
[ERROR] TypeError: Cannot read property 'cyan' of null
    at iOSBuilder.loginfo (/Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/iphone/cli/commands/_build.js:1368:
81)
    at /Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:551:21
    at /Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:227:13
    at iterate (/Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:134:13)
    at /Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:145:25
    at /Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:229:17
    at /Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:556:34
    at iOSBuilder.initialize (/Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/iphone/cli/commands/_build.js:13
40:2)
    at /Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:551:21
    at /Users/issei/Library/Application Support/Titanium/mobilesdk/osx/3.2.3.GA/node_modules/async/lib/async.js:227:13
```

なんでかなーとずっと調べてみたら原因は，Mac を新しくしたことでした．

iOS Dev Center にアクセスして，Certificates と Provisioning を更新しましょう！！
Unityでエディタスクリプトから画像ファイルを読み込んで表示する

ファイルの選択ダイアログで選択した画像をウィンドウに表示する。

任意のパスからテクスチャを読み込むメソッドがどれを使えばよくわからなかったので、バイナリデータとして読み込んで `LoadImage` で設定した。

![result_ss.png](https://qiita-image-store.s3.amazonaws.com/0/37221/6521e516-6d11-19d6-0583-74325d911719.png)

```csharp
using UnityEditor;
using UnityEngine;
using System.IO;

public class ImagePreview : EditorWindow
{
	Texture2D texture = null;

	[MenuItem("Editor/Image Preview")]
	static public void Init()
	{
		EditorWindow.GetWindow<ImagePreview>();
	}

	void OnGUI()
	{
		if (GUILayout.Button("Load...", GUILayout.Width(100)))
		{
			string path = EditorUtility.OpenFilePanel("Select png", "", "png");

			if (path.Length != 0)
			{
				texture = new Texture2D(1, 1);
				texture.LoadImage(File.ReadAllBytes(path));
				texture.filterMode = FilterMode.Point;
			}
		}

		if (texture != null)
		{
			EditorGUI.DrawPreviewTexture(new Rect(25, 40, 256, 256), texture);
		}
	}
}
```
今更なnetstatとss

ときおり、netstatのオプションを忘れて -a でgrepしちゃってダサいので、メモ。

オプションはnetstatもssもほぼ同じ。

```
       -l, --listening リッスンしているやつ
       -n, --numeric   ポートやナマのIPで表示
       -t, --tcp       TCPを表示
       -u, --udp       UDPを表示
       -x, --unix      UNIX Domainソケットを表示
```

TCPのやつを表示する場合は -ltn で。

```
$ netstat -ltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:110                 0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:143                 0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN

$ ss -ltn
State      Recv-Q Send-Q                     Local Address:Port                       Peer Address:Port
LISTEN     0      100                                   :::110                                  :::*
LISTEN     0      100                                    *:110                                   *:*
LISTEN     0      100                                   :::143                                  :::*
LISTEN     0      100                                    *:143                                   *:*
LISTEN     0      128                                   :::111                                  :::*
```

-p は netstat と　ss は微妙に違っているけど、気にしない。

```
$ netstat -p
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  
tcp        0      0 frank:ssh                   epitaph:49943               ESTABLISHED 8761/sshd         
tcp        0     96 frank:ssh                   epitaph:58700               ESTABLISHED 12097/sshd        
tcp        0      0 frank:ssh                   epitaph:59786               ESTABLISHED 3962/sshd         
tcp        0      0 frank:ssh                   epitaph:51301               ESTABLISHED 9383/sshd         
tcp        0      0 frank:ssh                   epitaph:54043               ESTABLISHED 1680/sshd

$ ss -p
State      Recv-Q Send-Q                   Local Address:Port                       Peer Address:Port
ESTAB      0      0                         192.168.0.40:ssh                         192.168.0.3:49943    users:(("sshd",8761,3))
ESTAB      0      96                        192.168.0.40:ssh                         192.168.0.3:58700    users:(("sshd",12097,3))
ESTAB      0      0                         192.168.0.40:ssh                         
```
Ubuntu14.04にShipyardとDockerUIをインストール

# shipyard? DockerUI?
Dockerでの運用を考えた際に、コンテナの監視は必要になるだろう。
監視もいろいろあると思うが、今回はwebUIつきでいいのないかなと探した
候補はこの2つが上がった
- [DockerUI](https://github.com/crosbymichael/dockerui)
- [Shipyard](https://github.com/shipyard/shipyard)

もう一つ、docklandというのもあがったのだが、残念ながらもうコミットしていないっぽいので、除外した

# DockerUI
[githubのREADME.mdのContainerQuickstart](https://github.com/crosbymichael/dockerui)に従う

```bash
docker build -t crosbymichael/dockerui github.com/crosbymichael/dockerui
docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock crosbymichael/dockerui -e /docker.sock
```
上記コマンドを監視したいコンテナ郡を持つDocker Hostで実行する事で、そのDockerHostの持つコンテナの状態を監視することが出来るようになる

なんでbuildせにゃあかんのやと思って[Dockerの公式リポジトリ](https://registry.hub.docker.com/u/crosbymichael/dockerui/)を見たら、執筆時現在(2014/06/09)、最終コミットが3ヶ月前になっているので、一応buildすることにした。もっとDockerhubが活用される世界になったらいいと思います

runさせる

```bash
docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock crosbymichael/dockerui -e /docker.sock
```

9000番ポートでWebサーバが立ち上がります。Playframeworkで9000番使っちゃってるので、`9500:9000`として公開する。

これで、同じサーバのコンテナの状態が監視できるようになります

# Shipyard

[github](https://github.com/shipyard/shipyard)や[公式サイト](http://shipyard-project.com/)の通りにインストールする
まず、`/etc/default/docker.io`に

```bash
DOCKER_OPTS='-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock'
```

これを追加し、Docker Daemonを再起動する。
その後`docker run -i -t -v /var/run/docker.sock:/docker.sock shipyard/deploy setup`を叩く
このコマンドがかなり感動的で、叩いたらWebアプリケーション、MySQL、Redis、LBそれぞれのコンテナが立ち上がってアプリケーションが立ち上がる

勝手にアプリケーションが立ち上がってくれるのもそうだけれど、MySQLやRedisなどのサーバソフトウェアを躊躇なく使えるようになった、コンテナ時代を感じさせる。

これでアプリケーションは立ち上がるが、Shipyardは一つのアプリケーションで多くのDocker hostを監視するため、エージェントと呼ばれるものを、監視対象のDockerホストにインストールする必要がある。
公式サイトではいろいろやれって言われるが、

```bash
docker run -i -t --rm -v /var/run/docker.sock:/docker.sock -e URL=http://<shipyard-host>:8000 -p 4500:4500 shipyard/agent
```

このコマンドを監視したいサーバで実行してコンテナを立てればOK
もちろん、ネットワークの疎通がないとダメです。（僕はこれで1時間くらい悩みました……）

# 特徴
本当は、SSとかとって紹介すべきだったけれど、この記事を仕上げている段階では立ち上げたサーバにアクセス出来ない状態だったので文章で。

DockerUIは閲覧性にはある程度優れているかなと思った。コンテナ一覧でどのコンテナがstartしてて、どのコンテナがstopしてるか観やすかった。それだけ。

Shipyardは、多数のサーバが登録できるけれど、たくさんのホストを登録すると閲覧性が悪くなる。かつ、コンテナ一覧のところでコンテナの状態が見られないのが辛い。しかし提供される情報量は多分一番多いし、ツールからコンテナイメージをbuildしたりrunさせたりも出来た。

現在元気なのはShipyardで、僕はこっちに期待しているけれど、いま現在だと運用には耐えない気がする。今後に期待しよう