OmniAICreator/Qiita-1.07M huggingface dataset:
Web Speech APIをAngularJSで試す


[AngularJS Advent Calendar 2014 11日目](http://www.adventar.org/calendars/350)

## 概要

音声スピーチ機能に興味があったのでWeb Speech APIを使ったディレクティブを作ってみました。これであなたのサイトのアクセシビリティは激アップ！！（爆）

Chrome、Safariで動きます（2014/12/10現在） ⇒ [Can I Use](http://caniuse.com/#feat=web-speech)

## 実装

``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>Web Speech API</title>
</head>
<body ng-app="app">
	<div>
		<div speech>テスト</div>
		<div speech>そこにしびれるあこがれるぅぅぅ！！</div>
		<div speech lang="en-US">Hi I'm speeker</div>
		<input type="text" ng-model="inputText" placeholder="入力してね">
		<div speech ng-bind="inputText" ></div>
	</div>
	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.min.js"></script>
	<script type="text/javascript" src="app.js"></script>
	<script type="text/javascript" src="speech.js"></script>
</body>
</html>
```

``` app.js
angular.module("app", ["speech"]);
```

``` speech.js
var app = angular.module("speech", []);

// Speech service
app.service("speech", function() {
    this.speak = function(text, options) {
        options = angular.extend({
            "volume": 1,
            "rate"  : 1,
            "pitch" : 2,
            "lang"  : "ja-JP"
        }, options);
        var msg = new SpeechSynthesisUtterance();
        msg.volume = options["volume"];
        msg.rate = options["rate"];
        msg.pitch = options["pitch"];
        msg.lang = options["lang"];
        msg.text = text;
        speechSynthesis.speak(msg);
    }; 
});

// Speech directive
app.directive("speech", ["speech", function(speech) {
    return {
        restrict: "A",
        link: function(scope, element, attrs) {
            var lang = attrs.lang || "";
            
            element.bind("click", function() {
                var text = angular.element(element).text();
                var options = {};
                if (lang) {
                    options["lang"] = lang;
                }
                speech.speak(text, options);
            });
        }
    };
}]);
```

## サンプル

https://web-speech-api-balmychan.c9.io/

テキストをクリックすると、しゃべります


## まとめ

* 想像以上に手軽で、ほとんどコードを書く必要がなかった・・・。
* Web Speech APIには音声入力の機能も含まれてるため、input要素と組み合わせも可能

※当初は[VoiceText Web API](https://cloud.voicetext.jp/webapi)なるWeb上の音声合成APIと組み合わせる予定だったが、中継サーバーが必要なためこれを使うのは別の機会に

## 参考

[HTML5] Web Speech APIに入門
http://www.yoheim.net/blog.php?q=20140701
Blenderの3D View（視点の変更）

# はじめに
Blenderによるモデリング作業で最も使用する3D Viewの簡単な説明です。

# モード
まず最初に確認するのは「3D View」には以下のモードがあるという事です。

<dl>
  <dt>Texture Paint Mode:テクスチャ・ペイント・モード</dt>
    <dd>テクスチャをオブジェクトに貼り付けた状態で直接色を付ける機能</dd>
  <dt>Weight Paint Mode:ウェイト・ペイント・モード</dt>
    <dd>オブジェクトの部分毎に重み付けを行う機能。毛を生やす部分を指定したり、骨格を動かした時にどの程度影響を受けるか、などを指定します</dd>
  <dt>Vertex Paint Mode:頂点ペイント</dt>
  <dd>オブジェクト自体に直接色を付ける機能</dd>
  <dt>sculpt Mode:彫刻モード</dt>
    <dd>一般的な面/線/点を操作してモデリングするのではなく、彫刻のようにオブジェクトを削ったり、盛ったりしながらモデリングを行う機能</dd>
  <dt>Edit Mode:エディット・モード</dt>
    <dd>面/線/点を操作してモデリングを行う機能</dd>
  <dt>Object Mode:オブジェクト・モード</dt>
    <dd>オブジェクトを操作するモード</dd>
</dl>

通常のモデリングで使用するのは最後の２つ（エディットモード、オブジェクトモード）です。この２つのモードをTABキーで切り替えながらモデリングを行います。もちろんメニューからも切り替え可能です。（図の１）

# 基本操作１：視点の変更

Blenderを立ち上げた直後はCube（立方体）を斜め上から見ていると思います。この視点を変更する方法には以下のような方法があります。

## マウスによる変更

<dl>
<dt>MMB（マウス中ボタン）を押したままドラッグする</dt>
<dd>現在選択中のオブジェクトを中心にぐりぐり回転します。</dd>
<dt>Shift+MMBを押したままドラッグする</dt>
<dd>画面を上下左右にスクロールします</dd>
<dt>Ctrl+MMDを押したまま上下にドラッグする</dt>
<dd>画面を拡大／縮小します</dd>
</dl>

## テンキーによる変更

<dl>
<dt>NUM_1</dt>
<dd>真正面から</dd>
<dt>NUM_3</dt>
<dd>右正面から</dd>
<dt>NUM_7</dt>
<dd>真上から</dd>
<dt>Ctrl+NUM_1</dt>
<dd>真後ろから</dd>
<dt>Ctrl+NUM_3</dt>
<dd>左正面から</dd>
<dt>Ctrl+NUM_7</dt>
<dd>真下から</dd>
<dt>NUM_2</dt>
<dd>現在より15度下から</dd>
<dt>NUM_8</dt>
<dd>現在より15度上から</dd>
<dt>NUM_4</dt>
<dd>現在より15度左から</dd>
<dt>NUM_6</dt>
<dd>現在より15度右から</dd>
<dt>NUM_0</dt>
<dd>カメラを視点／戻す トグル切り替え</dd>
<dt>.（ピリオド）</dt>
<dd>選択中のオブジェクトを中心に</dd>
<dt>+（プラス）</dt>
<dd>拡大</dd>
<dt>-（マイナス）</dt>
<dd>縮小</dd>
<dt>NUM_5</dt>
<dd>投影法の切り替え。Perspective（透視投影）とOrthographic（垂直投影）の切り替えをトグルで行います。モデリング時は歪みのないOrthographicで行うのが楽です。現在どちらが選択されているかは3D Viewの左上（図の２）に表示されています。</dd>
</dl>

![bl01.png](https://qiita-image-store.s3.amazonaws.com/0/43250/8ec0721d-78f4-6c97-f814-54f0d933bda8.png)

今日はここまでです。
[blackbird-xfs] blackbird で xfs をモニタリングする

ちょっと変わりネタを
ミドルウェアだけじゃなくてこういう使い方もできるよっていう例です

# blackbird xfs plugin

この plugin では `/proc/fs/xfs/stat` から様々な情報を取得し、backend にデータを送信します

![xfs1.png](https://qiita-image-store.s3.amazonaws.com/0/40416/d77837ec-691a-b1f2-4165-6d4e609a4cb7.png)
read/write bytes

![xfs2.png](https://qiita-image-store.s3.amazonaws.com/0/40416/111f1e48-552a-4db2-c99a-3eea442bdc32.png)
read statistics

![xfs3.png](https://qiita-image-store.s3.amazonaws.com/0/40416/5ecf0426-bf1f-752f-3a99-86fe5264d021.png)
transaction&log statistics

![xfs4.png](https://qiita-image-store.s3.amazonaws.com/0/40416/c585ef69-03e7-b644-56cd-2002599120de.png)
write statistics

こんなグラフが取れるようになります

`/proc/fs/xfs/stat` の中身はというとこんな感じです

```:/proc/fs/xfs/stat
extent_alloc 237924 2165708 236223 2146331
abt 0 0 0 0
blk_map 7853715 2395617 465507 235483 252144 10725562 0
bmbt 0 0 0 0
dir 681659 330194 327757 265257
trans 4 3906407 226656
ig 0 145020 0 184316 0 138245 797142
log 15381 529947 883 14762 4527
push_ail 4798418 0 1957554 39739 0 11943 0 334634 0 3197
xstrat 223749 0
rw 3139114 9057686
attr 366943 281834 665204 2
icluster 24257 18636 375003
vnodes 4294689189 0 0 0 278107 278107 278107 0
buf 5725391 21967 5704136 1688 1294 21255 0 28943 5322
abtb2 477443 3347640 23420 23417 0 0 0 0 0 0 0 0 0 0 6300911
abtc2 924783 6545480 462393 462390 0 0 0 0 0 0 0 0 0 0 60569372
bmbt2 479 2767 24 17 0 0 0 0 0 0 0 0 0 0 8
ibt2 851476 7733093 2428 2396 0 0 22874 372 0 0 0 0 0 0 408098
qm 0 0 0 0 0 0 0 0
xpc 8782831616 8104431965 21835555278
debug 0
```

あまり普段は見ることのない情報だと思いますが、もしかしたらモニタリングしておくと役に立つかもしれません


# Install

## blackbird 本体

[こちら](http://qiita.com/makocchi/items/9166016b2ad4cc43e83f)を参考に install してください

## Install xfs plugin

setup.py で入れる方法と rpm で入れる方法があります

### setup.py で install

```bash
git clone https://github.com/Vagrants/blackbird-xfs.git
cd blackbird-xfs
python setup.py install
```

### rpm で install

```bash
yum install blackbird-xfs --enablerepo=blackbird
```

# plugin の設定をする

config は `/etc/blackbird/conf.d/xfs.cfg` にありますが通常は特にいじるところはありません

```ini:/etc/blackbird/conf.d/xfs.cfg
[xfs]
module = 'xfs'
```

監視の間隔は 60 秒がデフォルトですが、変更したい場合は

```ini:/etc/blackbird/conf.d/xfs.cfg
interval = 30
```

のように指定してください

設定が終わったら `blackbird` を再起動させます

```bash
sudo /etc/init.d/blackbird restart
```

# Zabbix 上でデータが入ってきているか確認する

Zabbix の Template は [github の repository](https://github.com/Vagrants/blackbird-xfs/tree/master/templates)にあります
Zabbix に import して対象のサーバーに適用させて下さい

**Zabbix 上の host 名と blackbird が起動しているサーバーの host 名が違う場合は `/etc/blackbird/conf.d/xfs.cfg` 上で hostname を設定してあげる必要があります**
Zabbix 上と合わせてください

```ini:/etc/blackbird/conf.d/xfs.cfg
hostname = your_static_hostname
```

# その他

* 正直 `/proc/fs/xfs/stat` の値がそれぞれ何を意味しているのか自分なりに kernel 調べたりしたのですが、あまり自信がないです
* xfs のパフォーマンスやボトルネックを見たい場合にどの値を見ればいいのか、識者の方に教えて頂きたいところです
[blackbird-memcached] blackbird で Memcached をモニタリングする

# blackbird memcached plugin

この plugin では Memcached から様々な情報を取得し、backend にデータを送信します
現在のところ、下記の情報をモニタリングすることができます。

* `stats` の各項目
* `stats settings` の各項目
* item の `get`/`set` の response time

# Install

## blackbird 本体

[こちら](http://qiita.com/makocchi/items/9166016b2ad4cc43e83f)を参考に install してください

## Install memcached plugin

setup.py で入れる方法と rpm で入れる方法があります

### setup.py で install

```bash
git clone https://github.com/Vagrants/blackbird-memcached.git
cd blackbird-memcached
python setup.py install
```

### rpm で install

```bash
yum install blackbird-memcached--enablerepo=blackbird
```

# plugin の設定をする

config は `/etc/blackbird/conf.d/memcached.cfg` にあります

```ini:/etc/blackbird/conf.d/memcached.cfg
[memcached]
module = memcached

# The following values are default.
#
#host = '127.0.0.1'
#port = 11211
#timeout = 10

# memcached.py script get response time("set" and "get" command).
# If you set "profile_include_conn_establish" is True, response time includes time that connection establishing.
# Default : False
#
#profile_include_conn_establish = False

# If hostname options is None, it is used result of socket.getbyhostname(= hostname -s).
#hostname = 'YOUR_HOSTNAME_IN_ZABBIX'
```

host や port を設定してください

`profile_include_conn_establish` が `True` の場合、response time の計測が Memcached に接続をするところから始まります
`False` の場合は接続した後に response time の計測が始まります

設定が終わったら `blackbird` を再起動させます

```bash
sudo /etc/init.d/blackbird restart
```

# Zabbix 上でデータが入ってきているか確認する

Zabbix の Template は [github の repository](https://github.com/Vagrants/blackbird-memcached/tree/master/templates)にあります
Zabbix に import して対象のサーバーに適用させて下さい

しかしこの Template、例によって **Trigger の依存エラーで 2.4 系だと import できない問題があります**
import 時に Trigger の部分の checkbox を外せば import できるんですが・・

**Zabbix 上の host 名と blackbird が起動しているサーバーの host 名が違う場合は `/etc/blackbird/conf.d/memcached.cfg` 上で hostname を設定してあげる必要があります**
Zabbix 上と合わせてください

```ini:/etc/blackbird/conf.d/memcached.cfg
hostname = your_static_hostname
```

また、監視間隔も変更できます (デフォルト 60 秒)

```ini:/etc/blackbird/conf.d/memcached.cfg
interval = 30
```

# Zabbix Template のアイテムについて

Memcached は version によって `stats` の取れる値が変わっていますので、動かしている version によっては取得できない item がある可能性があります
[github の repository](https://github.com/Vagrants/blackbird-memcached/tree/master/templates) の `_Memcached_1.4` の Template は Memcached 1.4.20 で取れる値を元に作られています
例えば CentOS 6 の Base に入っている Memcached の version は 1.4.3 なので取得できる item は 1.4.20 よりも少なくなります
また、Template には一部 agent の item も入ってます
openFrameworksでオブジェクトを追跡するカメラを作る


とあるネタを作る際に、オブジェクトを追従させるようなカメラの動きが必要になりました。
そしてトラックボール的な機能も加えたかったので、(この辺りの学習をサボッていた
私にとって)これらの機能の実装は結構時間がかかってしまいました。。
理解が正しいかどうか不安ですが、忘れないように簡単なメモを残そうと思います。


## トラッキング機能の基本仕様

* 物体から常に一定の距離離れた場所にカメラを移動させる
* カメラの注視点は常にオブジェクトとなる
![tracking_img01.png](https://qiita-image-store.s3.amazonaws.com/0/42772/8cc169fb-0288-14ae-45e3-8926cccb4a9e.png)


### レンダリング時のプログラムフロー

以下のようなフローにしました。

1. オブジェクトの現在位置をカメラの基本位置に設定<br />
  ※ 基本位置とは、一定距離離す前のカメラの位置です。
2. オブジェクトの現在位置をカメラの注視点に設定
3. カメラの位置を、オブジェクトから一定の距離だけ離す。<br />
  ※ 予め決めておいた距離と方向ベクトルから移動分のベクトルを計算し、<br />
     　カメラの基本位置に加算します。距離を変更できるようにするので、<br />
     　移動ベクトルの計算はこのタイミングで行います。
4. 求まったカメラ位置と注視点を利用し、視点座標系の変換を行う
5. オブジェクトの描画

<br />
これを実装すると以下のような動きになります。

![no_mouse.gif](https://qiita-image-store.s3.amazonaws.com/0/42772/c3514733-137b-ec20-aa2e-640c11763a34.gif)

<br />

## トラックボール機能

次に、マウスドラッグでグリグリと回転できるようにトラックボール機能を追加します。
<br />
トラックボール機能は、

1. 画面上のマウス位置の変化から、視点座標系のX軸、Y軸に対するクォータニオンを計算<br />
  ※ 画面に表示されているものはカメラからみたもの(視点座標系)なので、画面上のマウス位置の変化が<br />
     　視点座標系のX軸、Y軸に対する回転となります。
2. 計算したクォータニオンを合成<br />
  ※ 合成することにより、視点座標系内での任意軸回転を表すクォータニオンとなります。
3. 合成したクォータニオンから、そのクォータニオンが表現する回転軸及び回転する角度を求める
4. 求めた回転軸及び回転する角度から回転行列を生成し、それを掛ける

という手順を踏むことで実現できます。

<br />
カメラとオブジェクトが動かない場合、基本となるX軸とY軸は固定(視点座標系のX軸とY軸が、<br />ワールド座標系のX軸(1.0, 0.0, 0.0)とY軸(0.0, 1.0, 0.0)に一致するような場合)でよいので、<br />そんなに難しくありません。<br />openFrameworksのサンプル"quaternionArcballExample"などを見ると非常にシンプルです。

<br />
ただ、今回のようにカメラとオブジェクトが動く(視点座標系が変わる)ような場合は少し工夫が必要です。

まず考えなければならないことは、視点座標系です。<br />現状では、画面上のマウス位置の変化に対応する視点座標系のX軸、Y軸が分かりません。


そこで視点座標系を求めます。
まずはZ軸からです。
Z軸はカメラが向いている方向、つまりカメラ位置と注視点を結ぶベクトルです。
**Z軸 = カメラ位置 － 注視点**です。
※ 正規化が必要です。


次にX軸です。
X軸は、ワールド座標系のY軸と先ほど求めたZ軸(が作る平面)に対して垂直となるベクトルです。
**X軸 = (0.0, 1.0, 0.0) × Z軸**です。
※ 正規化が必要です。


最後にY軸です。
Y軸は、先ほど求めたZ軸とX軸(が作る平面)に対して垂直となるベクトルです。
X軸と同様に、Z軸とX軸の外積がY軸になります。
**Y軸 = Z軸 × X軸**です。
※ 正規化が必要です。


![tracking_img02.png](https://qiita-image-store.s3.amazonaws.com/0/42772/7267a119-35aa-9264-85cd-661ca5b14544.png)
※ 図は適当なイメージです。X軸、Z軸がマイナス方向になってたりします。

### レンダリング時のプログラムフロー

最後に、上記の視点座標計算を組み込んだフローをまとめます。


1. オブジェクトの現在位置をカメラの基本位置に設定
2. オブジェクトの現在位置をカメラの注視点に設定
3. 1,2で設定したカメラの基本位置と注視点に、前フレームで更新したマウスドラッグによる回転(トラックボール機能)を適用<br />
   ※ カメラ位置にマウスドラッグによる回転を加えるのは、当然ながら視点座標系への変換(lookAt())より<br />　前に行う必要があります。
4. カメラの位置を、オブジェクトから一定の距離だけ離す<br />
   ※ カメラ位置は、マウスドラッグによる回転が考慮されたものになっています。
5. 求まったカメラ位置と注視点を利用し、視点座標系の変換を行う
6. オブジェクトの描画<br />
   ※ 描画するオブジェクトに対しても、マウスドラッグによる回転を適用します。
7. 次のフレームに備えてて、視点座標系の座標軸を更新

<br />
![mouse.gif](https://qiita-image-store.s3.amazonaws.com/0/42772/22851859-1a10-289d-0fa8-09f981b0457f.gif)


<br />
サンプルとして作成したソースはGithubにアップしています。
プログラムのベースはopenFrameworksのorientationExampleです。
[trackerSample](https://github.com/tkt182/trackerSample)
WatchKitでPageControlを表示する

この投稿は Apple Watch Advent Calendar 2014 の 11日目の記事です。

![pagecontrol.png](https://qiita-image-store.s3.amazonaws.com/0/8292/fa49623f-5c83-6341-b78a-ffafe045ef73.png)

上のスクショのように **画面を横にスワイプして簡単に切り替えられるApple Watchアプリ** を作ろうとして、PageControllに相当するクラスを探していたのですが、

- WKInterfaceButton
- WKInterfaceDate
- WKInterfaceGroup
- WKInterfaceImage
- WKInterfaceLabel
- WKInterfaceMap
- WKInterfaceSeparator
- WKInterfaceSlider
- WKInterfaceSwitch
- WKInterfaceTable
- WKInterfaceTimer 

・・・あれ？それらしきものがない！！

というわけで、Appleが公開しているサンプルコード[WatchKit Catalog](https://developer.apple.com/library/prerelease/ios/samplecode/WKInterfaceCatalog/Introduction/Intro.html#//apple_ref/doc/uid/TP40015046)の中にそれっぽいことをしている個所がないか探してみることに。

そしたら、ありました！

## どうやっていたか

[presentControllerWithNames:contexts:](https://developer.apple.com/library/prerelease/ios/documentation/WatchKit/Reference/WKInterfaceController_class/index.html#//apple_ref/occ/instm/WKInterfaceController/presentControllerWithNames:contexts:) というメソッドを使ってました。

Appleのドキュメントに

> Presents a page-based interface modally.

とあるように、pageベースの画面をモーダル表示してくれるようです。

第1引数に **表示したい画面（WKInterfaceController）の Identifier** を配列で渡すことにより、自動的にPageControlを作ってくれます。

```objc
NSArray *controllerNames = @[@"pageController", @"pageController", @"pageController", @"pageController", @"pageController"];
[self presentControllerWithNames:controllerNames contexts:nil];
```

上の例では `PageController` という Identifier を持った画面を5つ並べた画面をモーダル表示します。（スクリーンショットを載せたいのですが、NDAに違反する可能性があるのでやめておきます）

## 疑問点

モーダルでPageControlを表示できるのはわかったんですが、初期画面でPageControlを表示する方法がわかってません。できればモーダルを挟まずにPageControlを表示したいのですが、その方法を知っている方がいらっしゃいましたらぜひ教えて下さい！

**追記：**
初期画面でPageControlを表示する方法をコメント欄で教えて頂きました！
@fmtonakai さん、ありがとうございました！

**追記2：**
Xcode6.2 beta2で `reloadRootControllersWithNames:contexts:` というメソッドが追加されており、そちらを使うことで初期画面でもPageControlを表示できるようです。
荷物追跡HTML　3社（ヤマト運輸、佐川急便、日本郵便）対応

宅急便、宅配便、ゆうパックなどの伝票番号で、配送の状況を調べるHTMLファイルです。
このHTMLファイルをクリックしてブラウザーが開いたら、伝票番号を入力して、
「ヤマト運輸」、「佐川急便」、「日本郵便」の3つのボタンから該当のボタンを押すと、
配送状況のページを直接開くことができます。


```HTML:荷物追跡.html
<html>
<head>
<title>各社荷物追跡</title>
</head>
<body>

<h2>各社荷物追跡</h2>

伝票番号：<input id="bango" tyope="text" /><br>
<br>
<button onclick="kuroneko()">ヤマト運輸</button>　

<button onclick="sagawa()">佐川急便</button>　

<button onclick="yuubin()">日本郵便</button>　
<br>

<script type="text/javascript">
 function kuroneko() {
  window.location.href = "http://jizen.kuronekoyamato.co.jp/jizen/servlet/crjz.b.NQ0010?id=" + document.getElementById("bango").value;
 }
function sagawa() {
  window.location.href = "http://k2k.sagawa-exp.co.jp/p/web/okurijosearch.do?okurijoNo=" + document.getElementById("bango").value;
 }
function yuubin() {
  window.location.href = "http://tracking.post.japanpost.jp/service/singleSearch.do?org.apache.struts.taglib.html.TOKEN=&searchKind=S002&locale=ja&SVID=&reqCodeNo1=" + document.getElementById("bango").value;
 }

</script>
<br>

</body>
</html>
```
UIPickerView (ドラムみたいなやつ) を下からピュッと出す

# 要旨

　UIViewに載せて`UIView.animateWithDuration`すれば、下からでも上からでも出せます。
　なお実際にやってみたら面倒だったので[サブクラス化しました。](
https://github.com/tottokotkd/PopUpPickerView)  

# UIPickerView

　複数の選択肢を選ぶときに使う、iOSユーザーおなじみのドラムみたいなやつ。あれがピッカービューです (以下ドラム)。
> ![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/17957/1b7cd283-881e-17cf-742e-a5a074f0c950.png)

　UITextFieldやUILabelをタップするとドラムが下から出てきて選択できる… というものを作ろうと思ったのですが、いざやってみると思ったより面倒くさいです。なぜならiOSには**「ドラムを下からピュッと出す機能」はない**ので自力で作らねばならないのです。  
　実際にやるべき内容は「1つのUIViewに動かしたいものを載せてアニメーションで動かす」というシンプルなものですが、実際に書いてみると相応に面倒くさいです。このままでは次回また使うときに泣きながら再度調べることになりかねないので、ひとまとめにしてUIViewのサブクラスにしました。本稿はその使い方と、詰まったところのメモです。

# PopUpPickerView
## 説明
「キャンセルボタンを押すとリセットされる」「完了ボタンを押すとデリゲートを使う」の二点以外は、UIViewに部品を載せただけのクラスです。特に便利でもありませんし、凝ったことはできないので適当に改修してください。
## 用法
　インスタンスを適当なUIViewにaddSubviewすれば動きます。ただし、UIPickerViewを使うのでデリゲートの設定が常に必要です。
　ViewControllerにこれだけ書けば動く…　はずです。たぶん。

```
class ViewController: UIViewController, PopUpPickerViewDelegate {
    var pickerView: PopUpPickerView!
    let array = ["test1", "test2", "test3", "test4", "test5"]

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView = PopUpPickerView()
        pickerView.delegate = self
        if let window = UIApplication.sharedApplication().keyWindow {
            window.addSubview(pickerView)
        } else {
            self.view.addSubview(pickerView)
        }

        let button = UIButton.buttonWithType(UIButtonType.ContactAdd) as UIButton
        button.frame = CGRectMake(50, 100, 30, 30);
        button.addTarget(self, action: "showPicker", forControlEvents: UIControlEvents.TouchDown)
        UIApplication.sharedApplication().keyWindow!.addSubview(pickerViewTester)`
    }
    func showPicker() {
        pickerView.showPicker()
    }
    // for delegate
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 3
    }
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return array.count
    }
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        return array[row]
    }
    func pickerView(pickerView: UIPickerView, didSelect numbers: [Int]) {
        println(numbers)
    }
}
```

## メモ
### UIPickerViewDataSource を継承してないのに動く
　デリゲートだけ設定しているのに、なぜか

 - `func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int`
 - `func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int`

が動きます。内部でデリゲート・データソースに同じ操作を試行しているんでしょうか…？

### アニメーションは括弧の外に書ける (ことがある)
　swiftでは、**最後の引数がクロージャなら括弧の外に書ける**というルールがあります。これを使えれば、アニメーションを書くのがちょっとだけ楽になります。

```
UIView.animateWithDuration(0.2) {
    self.frame = CGRectMake(0, screenSize.height, screenSize.width, 260.0)
}
```

### 無理にStoryboardを使わない
　コードで書くほうが楽なこともありますね、ということで。
Dockerコンテナに接続できる状態か確認したい


Macでboot2dockerつかっている前提。

```sh
docker ps 
```

で、ターゲットとなるコンテナのポートが開いてるか確認。

```text
PORTS
0.0.0.0:49154->5432/tcp
```

みたいな感じになっている。

ついでにホストマシンから接続できる状態か確認。

```sh
nc -z 192.168.59.103 49154
```

以下の結果がでれば接続出来る状態。何も出なければ何かがおかしい。

```text
Connection to 192.168.59.103 port 49154 [tcp/*] succeeded!
```
Windowsのアップデートをコマンドラインからアンインストールする

## 参考 

[Windowsのアップデートをコマンドラインからアンインストールする方法 : 備忘録](http://golorih.exblog.jp/20639234)

```bash:
wusa.exe /uninstall /kb:<KB Number>
```

例: 

```bash:
wusa.exe /uninstall /kb:3001234
```


## exe化する手順

[Linuxでexeをつくるのが簡単だった。 - Qiita](http://qiita.com/tukiyo3/items/e4097faf80f13f0dd057)を見ると良いが、

```bash:kbuninst.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    system("wusa.exe /uninstall /kb:3001234");
    return 0;
}
```

こんな感じでダブルクリックで実行してくれる。
Enterキーを無効にする方法

Enterキーを押すと、フォームが送信されることがある。
キーボード入力後、マウス操作してクリックする、という手間が省けてとても便利だと思う。
しかし、入力中にうっかり押してしまったりなど、期待しない挙動をしてしまうこともあるだろう。

この挙動は、HTMLの仕様がそうなっているからである。

※ 古いブラウザでは以下の内容で対処できない場合があります。
※ ブラウザの仕様が変わり、以下の内容では対応できなくなる場合があります。

## 対処方法①　送信ボタンを書き換える(テキストフィールドなどが2つ以上のとき)

テキストフィールドなどがアクティブな状態で、Enterキーを押すとフォームが送信される。

```html
<form name="testform1" action="test1.html">
	<input type="text" name="text1" />
	<input type="text" name="text2" />
	<input type="submit" value="送信" />
</form>
```

または

```html
<form name="testform2" action="test2.html">
	<input type="text" name="text1" />
	<input type="text" name="text2" />
	<button type="submit">送信</button>
</form>
```

### 送信ボタンを書き換える

`type`を`button`にする。
つまり、`submit`を使わない。
これで、Enterキーを押しても送信されなくなる。

```html
<form name="testform1" action="test1.html">
	<input type="text" name="text1" />
	<input type="text" name="text2" />
	<input type="button" onclick="submit();" value="送信" />
</form>
```

```html
<form name="testform2" action="test2.html">
	<input type="text" name="text1" />
	<input type="text" name="text2" />
	<button type="button" onclick="submit();">送信</button>
</form>
```

`onclick`の部分をjQueryで書いてもよい。

```html
<form name="testform3" action="test3.html">
	<input type="text" name="text1" />
	<input type="text" name="text2" />
	<input type="button" value="送信" />
</form>

<script>
	$(function(){
		$('input[type=button]').click(function(){
			$('form').submit();
		});
	});
</script>
```

## 対処方法②　ダミーのテキストフィールドを用意する(テキストフィールドなどが1つのとき)

それでもEnterキーで送信されるときがある。
それは、テキストフィールドなどが1つしかないとき、①の対処をしても送信されてしまう。

```html
<form name="testform1" action="test1.html">
	<input type="text" name="text1" />
	<input type="button" onclick="submit();" value="送信" />
</form>
```

### ダミーのテキストフィールドを用意する

`display:none;`などを使い、テキストフィールドを2つ以上にする。

```html
<form name="testform1" action="test1.html">
	<input type="text" name="text1" />
	<input type="text" name="dummy" style="display:none;">
	<input type="button" onclick="submit();" value="送信" />
</form>
```

## 対処方法③　jsでEnterキーを無効化する

①と②はhtmlだけで制御ができるが、jsで制御することもできる。

```html
<form name="testform1" action="test1.html">
	<input type="text" name="text1" />
	<input type="button" value="送信" />
</form>

<script>
	$(function(){
		$("input"). keydown(function(e) {
			if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
				return false;
			} else {
				return true;
			}
		});
	});
</script>
```

または

```html
<form name="testform4" action="test4.html">
	<input type="text" name="text1" />
	<input type="button" value="送信" />
</form>

<script>
	$(function(){
		$("input").on("keydown", function(e) {
			if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
				return false;
			} else {
				return true;
			}
		});
	});
</script>
```

### おまけ

ここで出てくる`13`というのは、EnterキーのkeyCodeの番号です。

このサイトで各キーのKeyCodeが確認できます。[jQueryでキーボードのキーコードを調べる方法](http://black-flag.net/jquery/20110630-3283.html)
SeleniumでイレギュラーなFileInputを操作する際の対応（おすすめでない！）

何かというと、フロントがAngularJSでタグ生成されており
ファイルアップローダが通常のFileInputでされていないことが問題。

ファイルアップロードのトリガータグがaタグで実装されているため
sendkeyでtypeを実行できない、という状況で自動化するための備忘録。

※AngularJSなんだからおとなしくProtractor使えば？とか聞こえそうだけどね。。

さて今回試した方法

#sendkey出来ないので泥臭くブラウザ操作でFileアップロードダイアログ対応してみる

選択肢は以下の２つ
①Actionクラスで操作してみる
②Java Robotクラスで操作してみる

#まず①の場合


```
// Actionクラス対応版
// locateNameはタグのcssSelectorを指定
// valueはファイルアップロードのフルパス
private void inputFileAction(String locateName, String value){
	
	if("".equals(value)) return;
	
	click(By.cssSelector(locateName));
	
	try{
		//ダイアログ表示にタイムラグがあるので強制wait
		Thread.sleep(2000);
		
		Action action = new Actions(webDriverProvider.get())
			.sendKeys(value)
			.sendKeys(Keys.ENTER)
			.build();
		action.perform();
		
		//アップロード完了までタイムラグがあるので強制wait
		Thread.sleep(2000);
		
	}catch(Exception e){
		fail(e.toString());
		
	}
	
}

```

結論：全く動かず。

なんかsendKeyがうまく機能してない。
でもダイアログボックスの「開く」にフォーカスが当たってるとこを見ると
何となく操作しようとする片鱗は見えるんだけど。
とりあえず悩む前にもう一つの方法を確かめてみる。

#次に②の場合

```
private void inputFileRobot(String locateName, String value){
	
	if("".equals(value)) return;
	
	click(By.cssSelector(locateName));
	
	try{
		//ダイアログ表示にタイムラグがあるので強制wait
		Thread.sleep(2000);
		
		setClipboardData(value);
		
		Robot robot = new Robot();
		robot.keyPress(KeyEvent.VK_CONTROL);
		robot.keyPress(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_CONTROL);
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.keyRelease(KeyEvent.VK_ENTER);
		
		//アップロード完了までタイムラグがあるので強制wait
		Thread.sleep(2000);
		
	}catch(Exception e){
		fail(e.toString());
		
	}
	
}

public static void setClipboardData(String string) {
	StringSelection stringSelection = new StringSelection(string);
	Toolkit.getDefaultToolkit()
		.getSystemClipboard()
		.setContents(stringSelection, null);
}
```

setClipboardDataで指定の文字列をクリップボードへ格納し
あとはRobotクラスで愚直にペースト操作と決定ボタンをキーボード操作。

結論：動く！　。。んだけど超不安定。

何が不安定かというと
そもそもJava Robotクラスがwebdriverと連動していないので
画面をちょっとでもいじっちゃうとRobotのターゲットウィンドウが移動してしまう。
結果として全く違うウィンドウにファイルフルパスがペーストされたり。。

この辺は強制的にフォーカスをwebdriverの画面に戻すとか改造しないと話にならない。
それはさておきJUnitRunnerを動かしてじっとしておけば動くことは確認できた。


#思ったこと
あまりにも無理やりすぎて自動テストという本懐からはかけ離れてしまった気がする。
詳しくないから知らないのだがProtractorならもっと簡単にいけたのかしら？

何にせよテスト自動化に関しては実装時に包括的に計画しないと
いろいろ工数かかり過ぎてシンドイなぁとしみじみ思った。

■補足■
参考までに実際の起動画面のhtmlを乗せておきます。

```fileinput.html
<div class="input-file text-inline">
  <form action="/hogehoge/image/upload" method="post" enctype="multipart/form-data" target="hogehogeData.hogehogePath" class="ng-pristine ng-valid">
    <input type="file" name="file" style="display: none;">
  </form>
  <span class="form-control uploadImgFileName w75"></span>
  <span class="separator"></span>
  <a class="btn btn-normal select-img">参 照</a>
</div>
```

input type="file" style="display: none;"
もうね、これのおかげですげー苦しんだ。
svg 要素を png 形式の画像に変換する

# はじめに
D3.js で作成した svg 要素を png 形式の画像に変換する方法．注意事項として，svg 要素の大きさ (width と height) が絶対値で指定されてないといけない（つまり 100% などでは駄目）．また、テキスト要素にフォントを指定する必要がある．

__フォントの指定の例__

```js
obj.attr("font-family", "sans-serif")
    .attr("font-size", "14px")
    .attr("fill", "black")
```

# 実際の変換
方針は，svg 要素の中身をデータ URI スキームで表し，canvas 要素に読み込ませる．

```js
// #svg1: ターゲットの svg 要素
var width = $("#svg1").width()
var height = $("#svg1").height()
$("body").append("<canvas id='canvas1' class='hidden' width="
                                  + width + " height=" + height +"></canvas>")

var canvas = $("#canvas1")[0]
var ctx = canvas.getContext("2d")

var svg = $("#svg1")
svg.attr("viewBox", "0 0 " + width + " " + height)

var data = new XMLSerializer().serializeToString(svg[0])
var imgsrc = "data:image/svg+xml;charset=utf-8;base64,"
                       + btoa(unescape(encodeURIComponent(svgData)))
var image = new Image()
image.onload = function(){

    ctx.drawImage(image, 0, 0);
    // Optional: 自動でダウンロードさせる場合
    $("body").append("<a id='image-file' class='hidden' type='application/octet-stream' href='"
                       + canvas.toDataURL("image/png") + "' download='graph.png'>Donload Image</a>")
    $("#image-file")[0].click()

    // 後処理
    $("#canvas1").remove()
    $("#image-file").remove()

}
image.src = imgsrc;
```

([CoffeeScript版](https://gist.github.com/jkawamoto/657be368dbec2e8750a50e071789bc29))

# 参考
* [D3.jsなどで出力されるsvgを画像として表示する方法](http://qiita.com/okappy/items/bc20774aa08842adf4d7)
* [SVGを画像みたいに保存できるD3 Plugin作った](http://qiita.com/_likr/items/d9439806198f4b61010d)
750,000MPSを達成したsurgemqの秘密に迫る

(かきかけ)つい先日、surgemqの速さについての記事「[SurgeMQ: MQTT Message Queue @ 750,000 MPS](http://zhen.org/blog/surgemq-mqtt-message-queue-750k-mps/)」が製作者本人により書かれ自分の周りのTLではにぎわいを見せました。


現時点ではまだまだ未実装な点が多い[surgemq](https://github.com/surge/surgemq)ですがgoでこの速度を達成した、ということは驚異に値します。

nsqdが約10万msg/sec、私のgoのmqttサーバーが4万msg/sec、ということで普通にgoでああいったTCPサーバーを書くと何もしないとSingle Coreで1〜2万に行くのがやっとこなはずなので凄さがわかると思います。

## LMAX Disruptor style RingBuffer

surgemqの実装周りの参考にしたのがLMAX DisruptorのRing Bufferだそうです。
Disruptorは高速な汎用QueueをRing Bufferを使って実現しているのですが、surgemqではこのRing Bufferの設計を参考にbufioの代わりとして使えるものを作ったそうです。

LMAX DisruptorはRingBufferにSequenceを持たせたのが特徴です。Producerが書き込みをする際にSequenceの値を得て、該当するBufferに書き込みPublishを行うと読み込みを待っていたConsumerがSequence番号を受け取り、読み込みが行えるという仕組みです。

![ring.png](https://qiita-image-store.s3.amazonaws.com/0/24324/093ad503-2f2d-9920-578e-f4151dd05a12.png)

これにより複数のProducer / ConsumerからもRingBufferを並列に扱うことが容易になりました。

実装については[trishaのblog](http://mechanitis.blogspot.jp/2011/08/dissecting-disruptor-why-its-so-fast.html)に色々と書かれていたり[LMAX Disruptorのページ](https://lmax-exchange.github.io/disruptor/)に参考リンクがあるので興味が有る方は読んでみると面白いと思います。

詳細に見ていくとLMAX DisruptorはCPUレベルでの最適化ができるようにクラスやBufferにPADDINGをしてより高速に扱えるようにしているようです(あんまりJava力ないので読んだだけ)

◇　◇　◇　◇

surgemqがRingBufferを使うに至った背景としては、surgemqのcpu profileを見ていた時に沢山のメモリコピーが発生していたのを発見したこと。そして以前にDisruptorスタイルの[RingBufferを実装して](http://zhen.org/blog/ring-buffer-variable-length-low-latency-disruptor-style/)試していた事から思いついたそうです。 


## RingBufferで速度を稼ぐ

Networkアプリケーションでbufioを使うことは非常によいアイデアです。bufioはシステムコールを減らし、パフォーマンスの向上につながるのでbufioを使うことは非常に良い手法です。

gnatsではflushだけを別goroutineからコールすることで20万MPSを達成しました(ちょっとうろ覚え)。通常の用途であればこれだけでも十分いい仕事をこなしてくれます。しかし、もっと速度を稼ぎたい場合はどうすればいいのでしょうか？

◇　◇　◇　◇

surgemqではRingBuffer(Producer, Consumer)を使い驚異的な速度を達成しました。

![surge.png](https://qiita-image-store.s3.amazonaws.com/0/24324/f98b6861-7c23-65d4-2309-8756aba88dd2.png)

ひとつのクライアントに対して3つのGoroutine(Processor, Receiver, Sender)を使っているのはGoでのサーバー実装ではよくある構成ですが、Receiver・Senderでbufioの代わりにRingBufferを使っているため[fill()](http://golang.org/src/bufio/bufio.go)でのデータ移動処理を省いた結果、あの速度になっているようです。


## bufio VS RingBuffer

一般の用途であればbufioを使うべきです。しかし、抱えている問題を解決するには圧倒的な速度が必要など特殊な事情であればRingBuffer等の別アプローチをとることでgoでも容易に達成することができるかもしれません。

今回説明したRingBufferはProducer / Consumerを使ったDisruptorスタイルです。単順にbufioの変わりにRingBufferを渡せば置き換えできる、というわけではなく、うまく読み出しをしてくれるように書き換える必要が出てきます。

またRingBufferではバッファ領域が足りない場合にエラーを返す実装が多く、サイズがわからないデータを受け取りづらいことも問題に思えます。実装次第でどうにでもなる部分ですが考える事が多くなるので悩ましい部分です。

## 総括

surgemqはbufferの実装を工夫することで驚異的な速度を達成し、goでのMiddleware実装の可能性を広げてくれました。

基本的なGoアプリケーションの高速化のアプローチとしては、メモリコピーを極力減らす、システムコールは極力別goroutineで行う、GCのインパクトが小さくなるようにつくるというのが大事です。

◇　◇　◇　◇

余談ですが、よくある例としてGoのベンチマークではClientの条件が違うためUnfairなベンチマークが散見されます。ベンチマーク系の記事を見るときはClient実装はどうなっているか？ということも確認しておきましょう。
UX白書まとめ


# UX白書とは
2010年9月にドイツで行われたUXセミナーの議論の内容をまとめた宣誓文。一般公開されている。
[原文](http://www.allaboutux.org/uxwhitepaper)

# 参考資料
[UX白書サマリー資料20111015](http://www.slideshare.net/hcdvalue/ux20111015)

# はじめに
UXという用語は広く使われるが人によって解釈は異なる

# UXとは
* 一般的な概念としての経験の一部（システムを通じた経験）
* 個人的な利用に限らず、受動的にシステムと関わることを含む
* ある個人に固有のものである
* 過去の経験と、それに基づく期待によって影響される
* 社会的文化的な文脈に根ざす

# UXの特徴
* ユーザビリティはUXと同義ではない。
	* UX全体に影響を与える側面はあるが、イコールではない
* UXデザインは、インターフェイスデザインよりも広範囲なものである

# 3つの視点
* 経験する
	* システムと出会うときの知覚・認知の流れとその解釈、またその結果として生じる感情の変化
* ある経験
	* 始まりと終わりがあるシステムとの出会いにおいて、人がその時間をどのように経験したか、という全体的な意味
* 共経験
	* ある状況に位置付けられ社会的に構成されたものと解釈できるような経験

# UXの期間
UXは期間（time span）の違いによって分類される

* 予期的UX
	* 初めての利用よりも前の期間、あるいは下記以外の期間
	* 利用前に経験を想像する
* 一時的UX
	* インタラクション中に感じる感情の特定の変化
	* 利用中に経験する
* エピソード的UX
	* ある特定の利用エピソードに関する評価
	* 利用後に、ある経験を内省（自分の考えや行動などを深くかえりみること）する
* 累積的UX
	* 特性のシステムをしばらくの期間、利用したあとの見方
	* 利用時間全体で、多種多様な利用期間を回想する

UXについて議論するときには、対象とする期間を明確にすることが重要である

# UXに影響する要素
* 文脈
	* 文脈が変わればシステムは変わらずともUXは変化する
		* 社会的な文脈
		* 物理的な文脈
		* 仕事の文脈
		* 技術や情報の文脈
* ユーザー
	* ある人がシステムを体験することは動的なため、UXも動的になる
		* モチベーション
		* 雰囲気
		* 心理状態
		* 身体的状態
		* 期待値
* システム
	* システムの特性に対するユーザーの知覚・認識はUXに影響を及ぼす
		* 機能性
		* 審美性
		* インタラクティブ性
		* 反応性
bashでIPとPORT番号を取得

`docker run` コマンドの `link` オプションで受け取った環境変数を bash スクリプト内で解析する。

```bash
#!/bin/bash
URL=tcp://127.0.0.1:80
IPPORT=${URL#*//}

# IP
echo ${IPPORT%:*}
# Port
echo ${IPPORT#*:}
```

__参考__
  * [shとbashでの変数内の文字列置換など | ろば電子が詰まっている](http://d.hatena.ne.jp/ozuma/20130928/1380380390)
[ruby] 小数点以下x位にて切り捨て処理をしたい - メモ

# やりたい事
```lang:floor.rb
12.3456 => 12.34
255/13  => 19.61
```
こんな処理をしたい場合。
すぐに思いつくのは、floor関数。
[Class: Float (Ruby 2.1.5) #floor](http://www.ruby-doc.org/core-2.1.5/Float.html#method-i-floor)

```lang:floor.rb
1.2.floor      #=> 1
2.0.floor      #=> 2
(-1.2).floor   #=> -2
(-2.0).floor   #=> -2
```
残念ながら、float型はfloor関数に引数（小数点以下指定）を指定する事ができません。
これは、浮動小数点問題があるからなのでしょうか。。。（？）

仕方ないので別の方法を探します。

# BigDecimal
[class BigDecimal](http://docs.ruby-lang.org/ja/1.9.3/class/BigDecimal.html#I_FLOOR)

```lang:floor.rb
BigDecimal("1.23456").floor   # => 1
BigDecimal("-1.23456").floor  # => -2

BigDecimal("1.23456").floor(4).to_f   # => 1.2345
BigDecimal("15.23456").floor(-1).to_f # => 10.0
```

BigDecimal型にもfloor関数があり、こちらのfloor関数は引数に小数点以下を指定可能です。
これを使いましょう。

## 注意点
さきほどのやりたい事を、やってみます

```lang:floor.rb
[6] pry(main)> BigDecimal(12.3456).floor(2)
ArgumentError: can't omit precision for a Float.
from (pry):5:in `BigDecimal'
```
float型をそのまま引数で渡すとエラーとなってしまいます。
これはおそらく、float型を渡してる時点ですでに、浮動小数点問題により誤差が生じて正確な値じゃなくなっちゃうからだと思われます。

BigDecimalの引数にはStringを渡しましょう。

```lang:floor.rb
[7] pry(main)> BigDecimal('12.3456').floor(2)
=> #<BigDecimal:7f8cbf78fe30,'0.1234E2',18(27)>
[8] pry(main)> BigDecimal('12.3456').floor(2).to_f
=> 12.34
```

どうせStringを渡すのであれば、String/Integer/Floatなどには`#to_d`が用意されているので、これを使うともっとシンプルになりそうです
[Class: String (Ruby 1.9.3)](http://ruby-doc.org/stdlib-1.9.3/libdoc/bigdecimal/rdoc/String.html#method-i-to_d)

```lang:floor.rb
[9] pry(main)> '12.3456'.to_d.floor(2)
=> #<BigDecimal:7f8cbf7e2428,'0.1234E2',18(27)>
[10] pry(main)> '12.3456'.to_d.floor(2).to_f
=> 12.34
```

もう一つのやりたい事もやってみます。

```lang:floor.rb
[35] pry(main)> (255.to_d/13.to_d).floor(2).to_f
=> 19.61
```

# 参考
[[Ruby]消費税計算にはBigDecimalを使いましょう - Qiita](http://qiita.com/jnchito/items/d0ef71b25732ad5a881c)
[Class: String (Ruby 1.9.3)](http://ruby-doc.org/stdlib-1.9.3/libdoc/bigdecimal/rdoc/String.html#method-i-to_d)
[class BigDecimal](http://docs.ruby-lang.org/ja/1.9.3/class/BigDecimal.html#I_FLOOR)
[小数第2位以下の切り捨て - ayaketanのプログラミング勉強日記](http://ayaketan.hatenablog.com/entry/2013/11/12/160530)
CakePHPのPaginate->sortで、タブが切り替わってしまうのを、防ぐ。

**自分用メモです。かなり不親切なメモです。ご注意ください。**

より良い方法を見つけたので、更新しました。

# より良い方法、hash使う

```php:View
<?php $this->Paginator->options(array('url' => array('?' => $params, '#' => 'hoge'))); ?>
```

```php:Controller
// ソートのoption用パラメータを用意
$params = $this->request->query ? $this->request->query : '';
$this->set('params', $params);
```

こんな感じにしておけば、既存のGETパラメータも失わずに、URLの後ろに、#hogeを付けることができる！

あとはこれを（#hoge）をjQuery側で、ひっぱってきてタブを切り替えればよい。

```js:js
// hashを確認して、タブを切り替える
var platform = location.hash.substr(1);
if (platform) {
	jQuery('.toggle').removeClass('active');
	jQuery('[data-platform=' + platform + ']').addClass('active');
	jQuery('.toggle-data').hide();
	jQuery('[data-platform=' + platform + ']').show();
	jQuery('.' + platform).show();
}
```



# getUrlVars使う、めんどい方法。

しかもこちらは、他にパラメータを付けていた場合は、それが無視されちゃったので、ダメ。


```php:view.ctp
<?php $this->Paginator->options(array('url' => array('tab' => 'hoge'))); ?>
```

という感じで、paginatorにオプションつけます。そうするとURLが以下のようになるので。

```php:ソートのところのURL
http://piyo.net/limit:100/sort:Model.field/direction:asc/tab:hoge
```

これで、GETパラメータ取得して、jQuery側でこねこねしてみました。

```js:foo.js
jQuery(document).ready(function($){

	// GETパラメータを確認して、タブを切り替える 
	var tab = getUrlVars()['tab'];
	if (tab != null) {
		jQuery('.toggle').removeClass('active');
		jQuery('[data-tab=' + tab + ']').addClass('active');
		jQuery('.toggle-data').hide();
		jQuery('[data-tab=' + tab + ']').show();
		jQuery('.' + tab).show();
	}

	function getUrlVars()
	{
		var vars = [], hash;
		var hashes = window.location.href.slice(window.location.href.indexOf('/') + 1).split('/');
		for(var i = 0; i <hashes.length; i++)
		{
			hash = hashes[i].split(':');
			vars.push(hash[0]);
			vars[hash[0]] = hash[1];
		}
		return vars;
	}
});
```

以上です。ありがとうございました。
brew cask のインストールでエラー



```
$ brew cask install firefox-ja
==> Downloading https://download.mozilla.org/?product=firefox-latest&os=osx&lang
Already downloaded: /Library/Caches/Homebrew/firefox-ja-latest
Error: undefined method `extname' for nil:NilClass
Please report this bug:
    https://github.com/caskroom/homebrew-cask/issues
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/container/criteria.rb:43:in `extension'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/container/pkg.rb:3:in `me?'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/container.rb:50:in `block in for_path'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/container.rb:48:in `each'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/container.rb:48:in `find'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/container.rb:48:in `for_path'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/installer.rb:83:in `extract_primary_container'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/installer.rb:50:in `install'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/cli/install.rb:20:in `block in install_casks'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/cli/install.rb:17:in `each'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/cli/install.rb:17:in `install_casks'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/cli/install.rb:6:in `run'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/cli.rb:81:in `run_command'
/usr/local/Cellar/brew-cask/0.48.0/rubylib/cask/cli.rb:121:in `process'
/usr/local/bin/brew-cask.rb:42:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/usr/local/Library/brew.rb:59:in `require?'
/usr/local/Library/brew.rb:142:in `<main>'
```

以下を実行したらインストール出来た。

```
$ brew update && brew upgrade brew-cask && brew cleanup && brew cask cleanup
```

実際は、```brew update```だけはしてあったのだが、```brew upgrade brew-cask```が重要なのかしら？

### 参考

https://github.com/caskroom/homebrew-cask/issues/4959
[ruby] 割り算で小数点以下も必要な場合

# 割り算
```lang:float.rb
255/12
```
こんな計算をすると、小数点がどっか行っちゃう。

```lang:float.rb
[1] pry(main)> 255/12
=> 21
```

これは別にどっか行っちゃう訳ではなく、`整数/整数=整数`を返す仕様らしい。
勝手にfloatにはならない。

# 一覧表
|除算の対象|除算する数値|/|div|quo|
|------+-----+----+----+---|
|整数|整数|整数|整数|浮動|小数点数|
|整数|浮動小数点数|浮動小数点数|整数|浮動小数点数|
|浮動小数点数|整数|浮動小数点数|整数|浮動小数点数|
|浮動小数点数|浮動小数点数|浮動小数点数|整数|浮動小数点数|

```lang:float.rb
[2] pry(main)> 255/12.to_f
=> 21.25
[3] pry(main)> 255.quo(12)
=> (85/4)
[4] pry(main)> 255.quo(12).to_f
=> 21.25
[5] pry(main)> 255.to_f/12.to_f
=> 21.25
```

floatを明示すれば無問題

# 参考
[除算による商と剰余を取得する - 数値(Numeric)クラス - Ruby入門](http://www.rubylife.jp/ini/numeric_class/index6.html)
VR空間内でのUIについて

*[Oculus Rift Advent Calendar 2014](http://qiita.com/advent-calendar/2014/oculus-rift) 寄稿記事です*

技術的内容のない記事なので[Qiitaの運営方針を尊重](http://anond.hatelabo.jp/20150127003906)しTumblrで[公開](http://simrea.tumblr.com/post/110503393374/vr-ui)することにしました。
オブジェクト指向の神　〜ゴッドクラス と ゴッドメソッド〜

はじめに
---
巷では、OOPでは大量のメソッドを保有する万能クラス (ゴッドクラス) を作ってはいけないらしい。また、1メソッドあたり3行程度であるべきで、長いメソッドを書くのはオブジェクト指向的ではないらしい。そういうコードを書くやつはオブジェクト指向がわかっていないのだそうだ。

そこで純粋オブジェクト指向言語Smalltalkの標準ライブラリではそのような原則が徹底されているのか、フリーな実装 (Pharo3.0, Pharo4.0(dev), Squeak4.5) のインストール直後でのクラスライブラリを調べてみた。

ゴッドクラスはいねーがー？
---
Smalltalkでは以下のコードでメソッド数最大のクラスを調べることができる。
```"God class that defines the largest number of own methods in it"
(ProtoObject allSubclasses collect: [ :c | c selectors size -> c ])  max```

結果

| Smalltalk | class | number of own methods |
|:----------|:-----------|------------:|
Pharo3.0 | Morph | 887 |
| Pharo4.0(dev) | ScriptLoader | 919 |
| Squeak4.5 | Morph | 1,185 |

Squeak4.5のMorphクラス単独で1185個のメソッドを定義している。
さすが多様性のSqueakである。そして、Morphクラスの多様なGUIフレームワークとしての面目躍如だ。

上記は各クラスが定義しているメソッド数を調べた。しかしSmalltalkには継承がある。そこで、継承されたメソッドも含めて全メソッド数を以下のコードで調べた。
```"God class that holds the largest number of methods including inherited ones"
(ProtoObject allSubclasses collect: [ :c | c allSelectors size -> c ])  max```

結果

| Smalltalk | class | number of all methods |
|:----------|:-----------|------------:|
Pharo3.0 | FileDialogWindow | 1,736 |
| Pharo4.0(dev) | FileDialogWindow | 1,736 |
| Squeak4.5 | ZoomAndScrollMorph | 2,066 |

やはりSqueak4.5の圧勝である。神と崇めよ。

ゴッドメソッドはいねーがー？
---
次にリファクタリング等で目の敵にされる長大なメソッドを調べる。
Smalltalkではメソッドもオブジェクトなので、以下のコードで最大行数のメソッドを簡単に調べることができる。
```"God method that consists of the largest number of lines" 
(CompiledMethod allInstances collect: [ :m | m getSource asString lines size -> m name ]) max```

結果

| Smalltalk | method | number of lines |
|:----------|:-----------|------------:|
| Pharo3.0 | ISOLanguageDefinition class>>iso3166Codes | 1,964 |
| Pharo4.0(dev) | ISOLanguageDefinition class>>iso3166Codes | 1,964 |
| Squeak4.5 | ISOLanguageDefinition class>>iso3166Codes | 1,964 |

まさに三国志の様相。5行以上のメソッドを「オブジェクト指向がわかってないヤツが書いたゴッドメソッド」と仮定すると、このメソッドには392柱の神が宿っていることになる。きっと、走る南風に乗ってくるに違いない。

行数だけではナンなので、文字数でも調べてみた。
```"God method whose source code has the largest number of characters" 
(CompiledMethod allInstances collect: [ :m | m getSource asString size -> m name ]) max```

結果

| Smalltalk | method | number of characters |
|:----------|:-----------|------------:|
| Pharo3.0 | OpenSansRegular class>>fontContents | 664,639 |
| Pharo4.0(dev) | SourceSansProRegular class>>fontContents | 425,157 |
| Squeak 4.5 | UCSTable class>>initializeKSX1001Table | 132,404 |

文字数では圧倒的な差がついた。メソッドの神はPharo3.0に宿るようだ。640*1024 < 664639であるから、DOSマシンの640KiBのメインメモリにはたかが1本のメソッドのソースも格納できないことがわかった。

まとめ
---
今回調べた3つの処理系いずれにも巨大なクラスがあり、また、極めて長大なメソッドがあることがわかった。特に、クラスの神はSqueakに宿り、メソッドの神はPharoに宿っているようだ。
ちなみにオレが納品したPharoベースの某システムには 832,489文字のメソッドが。神を超えたキリリ。メソッドのソースが812KiBということはオレが最初に買ったマシンであるPC-8801のメインメモリとVRAMが7台分あってもまだ足りない。科学技術の進歩に感謝します。

関連情報
---
[PLHX](http://qiita.com/PLHX)さんが[GNU Smalltalk でゴッドクラスとゴッドメソッドを調べる](http://qiita.com/PLHX/items/a602342ba439b06e818c)を投稿してくれました。なるほど、[GNU Smalltalk](http://smalltalk.gnu.org/)は、とても清いSmalltalkなのですね。
git hooksで

git　hooksでブランチごとにドキュメントルートを
きってgit pullするようにしてるんだけど。
masterはgit hooksされるんだけど
ブランチのdevelopだけ出来ない。

このシェルの何がまちがってんだー

branch="$(git rev-parse --abbrev-ref HEAD)"
if [ "$branch" = "master" ]; then
cd /var/www/honban
git --git-dir=.git pull
fi

if [ "$branch" = "develop" ]; then
cd /var/www/develop
git --git-dir=.git pull
echo "neko" >> ~/log.txt
fi
jade 内で 外部実装の javascript 関数を使う

趣味でスマホ版ソリティ馬のおウマさん管理ツールを作っているのですが、 jade の中で **each** とかして **select** タグなり作りたい時に、どうやって変数を取ってこようかなーと色々悩んだメモをおいておくなど。

jade の説明とかは省略

**mixin** だと配列を返すとか出来ないので(出力しか出来ない)、関数欲しいってなった時はrenderする時に options(ローカルオブジェクト) に渡すだけで簡単

## express 使った場合

```coffeescript:app.coffee
app.get '/', (req, res) ->
  res.render 'top',
    globalFunctions: require './global-functions'
```

```jade:top.jade
doctype html
html
  head
    meta(charset="utf-8")
  body
    each i in globalFunctions.getArray()
      p= i
```

```coffeescript:global-functions.coffee
module.exports =
  getArray: ->
    return [10, 11, 12]
```

```html:出力結果
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>10</p>
    <p>11</p>
    <p>12</p>
  </body>
</html>
```

４時間は悩んだけど簡単なことだった...。
libxml2がインストール済みなのにnokogiriのインストールで怒られるときの対処法

#僕は間違ってない！！悪いのはパソコンだ！！
ruby 2.1.3、MacOS 10.9.4にnokogiriをインストールしようとしたんです。

```
Building nokogiri using system libraries.
libxml2 version 2.6.21 or later is required!

途中省略
```

っていうエラーがでてnokogiriをインストール出来ない。
もちろん、Homebrewでlibxml2はインストール済みで、バージョンは2.9.1なので上記の条件を満たしている。僕は間違っていない、パソコンが悪い、そうでしょ？



...こういう場合は大抵の場合参照先が間違っている。
というわけで、以下のコマンドで参照先を修正

```
bundle config build.nokogiri "--use-system-libraries --with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2"
bundle install
```

できた。間違っていたのは僕でした。本当にすいませんでした。
PgAdmin上で文字列をコピーすると勝手に二重引用符でくくられる機能、あれ切れます

PgAdminのテーブル編集中に、値をコピーして別のセルにペーストするとなぜか二重引用符でくくられた状態貼り付けられますね。あれやられるたびに激怒していたせいか寿命が縮んでしまったので、おせっかい引用機能を切ることにしました。

【ファイル(F)】-【オプション(O)...】-【クエリーツール】-【Result grid】-【結果のコピー引用】
これです。
![PgAdmin-quot.png](https://qiita-image-store.s3.amazonaws.com/0/2852/8227fb8f-78da-979d-0591-88fc7e2389da.png)

「無し」だ「無し」！
寿命を半分ほど取り戻せました。
`nil`を含む数値の配列で`max`や`min`を使う

最小値や最大値を求めたい時に配列に`nil`が入ってるとエラーになります。

```rb
[2] pry(main)> [1, nil, 3].min
ArgumentError: comparison of NilClass with 1 failed
```

そんな時は`Array#compact`！

```rb
[3] pry(main)> [1, nil, 3].compact.min
=> 1
```
UIWebViewのScrollViewにフッターを作成する

UIWebViewで表示されているコンテンツの下にフッターとしてUIViewを追加する実装をしなければいけなったためメモ。
調べてもスクロールしない固定フッターの情報ぐらいしかなかなかなかったので。

参考：https://github.com/coryalder/DMAFWebViewController

#フッターの作成

```
@property (strong, nonatomic) UIView *footerView;

- (void)createFooter {
    self.footerView = [[UIView alloc] initWithFrame:CGRectMake(x, y, width, height)];
}
```

#ScrollViewのコンテンツサイズを監視

```
[self.webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
```


KVOはdeallocで開放してください

```
- (void)dealloc {
    [self.webView.scrollView removeObserver:self forKeyPath:@"contentSize"];
}
```

#コンテンツサイズの変更にあわせてフッターを追加
```
#import <objc/runtime.h>

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"contentSize"] && self.footerView) {
        NSNumber *incumbentheight = objc_getAssociatedObject(object, "associated_height");
        NSValue *newValue = [change objectForKey:NSKeyValueChangeNewKey];
        CGSize newSize;
        [newValue getValue:&newSize];
        
        if (!incumbentheight || [incumbentheight floatValue] != newSize.height) {
            CGFloat newHeight = newSize.height + self.footerView.frame.size.height;
            
            if (!self.footerView.superview) {
                [self.webView.scrollView addSubview:self.footerView];
            } else if ([self.footerView superview] != self.webView.scrollView) {
                [self.footerView removeFromSuperview];
                [self.webView.scrollView addSubview:self.footerView];
            }
            
            self.footerView.frame = (CGRect){0,newSize.height, .size = self.footerView.frame.size};
            
            objc_setAssociatedObject(object, "associated_height", @(newHeight), OBJC_ASSOCIATION_COPY);
            
            self.webView.scrollView.contentSize = (CGSize){newSize.width, newSize.height+self.footerView.frame.size.height};
           
        } else {
            objc_setAssociatedObject(object, "associated_height", @(newSize.height), OBJC_ASSOCIATION_COPY);
        }
    
    }
}

```
pcreを使って正規表現マッチを行う

## 流れ

1. pcre_compile() で条件をコンパイルする
2. pcre_exec() で比較する
3. pcre_free() でコンパイルした条件を解放

同じ条件で比較を繰り返すならば、pcre_compileを一回だけ行いpcreオブジェクトを共有すれば実行効率が良い

パターンが正しくない時はpcre_compile()はNULLを返す
errStrにエラーメッセージが入る

使用済になったオブジェクトはpcre_freeで必ず解放すること

## ソースコード

```c:pcre_match.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pcre.h>

int
pcre_match(const char *subj, char *pattern)
{
    int matched;
    pcre *re;
    const char* errStr;
    int errOffset;
    int ovector = 0;

    re = pcre_compile(pattern, PCRE_EXTENDED, &errStr, &errOffset, NULL);
    if(re == NULL) {
        fprintf(stderr, "pcre pattern matching compile error: message[%s]\n", errStr);
        return -1;
    }

    matched = pcre_exec(re, NULL, subj, (int)strlen(subj), 0, 0, &ovector, 1);
    pcre_free(re);

    if (matched < 0) {
        return 0;
    }

    return 1;
}

int
main(int argc, char *argv[])
{
    if (pcre_match("http://foobar.example.com/", "(^http|^https)://") == 1) {
        printf("matched\n");
    } else {
        printf("unmatched\n");
    }

    return 0;
}
```

## コンパイル

<pre>
$  gcc -o pcre_match pcre_match.c -lpcre
</pre>

## 詳しい使用方法

オンラインマニュアルを参照

<pre>
$ man pcre_exec
</pre>

pcreが持っている関数の一覧

<pre>
$ man -k pcre
</pre>
import _sslでエラー時の対処方法


ググるとPython入れ直せとある．
で，
インストール時にsslのオプション付けろとある．

でも，Homebrew環境だったので，そのまま再インスコしてみたら直った．

以下，手順コマンド

```
$ brew remove python
$ brew doctor
$ brew install python
$ brew doctor
$ python
>>> import _ssl

```

エラー出てないのを確認して `>>> exit()`
System.Decimal 構造体の小数桁数を取得する

`System.Decimal` 構造体は内部的に桁数の情報を持っている。
そのため、以下は異なる結果が返る。

```csharp
Console.WriteLine(0m.ToString()); // 0
Console.WriteLine(0.0m.ToString()); // 0.0
```

この桁数を取得したい。

# 結論

結論としては以下のコードで取得可能。

```csharp
int exponent = Decimal.GetBits(0.0m)[3] >> 16 & 0x00FF;
Console.WriteLine(exponent); // 1
```

# 仕組み

`System.Decimal` 構造体は次のように値を保持している。

![System.Decimal構造体の構造.png](https://qiita-image-store.s3.amazonaws.com/0/11978/3978174c-19fd-0d0b-6cb5-76e8bb66f708.png)

[Decimal.GetBits(decimal) メソッド](http://msdn.microsoft.com/ja-jp/library/system.decimal.getbits%28v=vs.80%29.aspx) を使用すると内部のバイナリデータを取得できるため、そこから取得する。

返ってくる `System.Int32[]` 配列の 0 ～ 2 は仮数部なので今回は無視。

```csharp
// 4 要素の int 配列
int[] binary = Decimal.GetBits(0.0m);
// 添え字 0 ～ 2 は仮数部領域。添え字 3 の先頭 32 ビット領域が符号と指数部、そして未使用領域
int info = binary[3];
```

添え字 3 の数値に桁数（指数部）の情報が含まれるがそのままではダメで、未使用分のビットをずらす＆符号情報を取り除く必要がある。

```csharp
// 下位16ビットは未使用（全部ゼロ）なので捨てる
int signAndExponent = info >> 16;
```

さらに、最上位ビットが符号なのでこれを除外する。残りのビットは未使用領域でゼロなので `0x7FFF` を掛けてもよいが、今回は明示的に取得したいビット（下位8ビット）が残るように `0x00FF` を掛ける。

```csharp
int exponent = signAndExponent & 0x00FF;
```

# 参考

* [Re[2]: Decimalが保持している表示小数点桁数を取得したい](http://bbs.wankuma.com/index.cgi?mode=al2&namber=64106&KLOG=108)
* [decimal | ++C++; // 未確認飛行 C ブログ](http://ufcpp.wordpress.com/2010/02/03/decimal/)
* [Decimal.GetBits(decimal) メソッド](http://msdn.microsoft.com/ja-jp/library/system.decimal.getbits%28v=vs.80%29.aspx)
scp のワンライナーを作る練習

### 背景
　アプリケーションの検証のために「データベースサーバから、ダンプファイルを持ってきたい」というのはよくある話だと思います。その時に、毎回 `ssh` でログインしてファイルの場所を確かめて、`scp` でコピーする、という手順を踏んでいたんですが、これが結構面倒くさいので、もうちょっと早くしてみようと思いました。

### 前提
　ホスト名 `dbserver` のディレクトリ `/backup/db_bkup/daily/` にて、毎日データベースをダンプしています。ダンプファイルの名前には、タイムスタンプがついていて `database_20141201.dump.gz` みたいな形式になっています。直近の一週間、七個のファイルが常に配置されています。

### 結論
　上の前提のとき、下のコマンドを叩けばホームディレクトリに最新のダンプファイルが取れます。

```.sh
scp dbserver:`ssh dbserver "ls /backup/db_bkup/daily/database* | tail -n1"` ~/
```
### 解説
　最初は下のようなシェルスクリプトを書きました。これを混ぜてみたら上のができました。

```.sh
# 一番新しいファイルの絶対パスを得るコマンドを作成
# （場合によっては ls のオプションでソートする必要があります）
CMD="ls /backup/db_bkup/daily/kit_database* | tail -n1"

# 上のコマンドを dbserver で実行して、結果を代入
FILE_PATH=`ssh dbserver $CMD`

# scp でファイルを取ってくる
scp dbserver:$FILE_PATH ~/
```