OmniAICreator/Qiita-1.07M huggingface dataset:
ChromeでCSSStyleSheet.insertRuleにハマった

Ajax通信中のインジケーター（グルグル回るやつ）に画像ではなくSVGを挿入してくれる [NETEYE Activity Indicator](http://neteye.github.io/activity-indicator.html) を導入してちょっとハマったのでメモ。


他の画面では順調にグルグル回っていたのにある画面でChromeのみ以下のエラーが発生した。

```
Uncaught HierarchyRequestError: A Node was inserted somewhere it doesn't belong.
```

HierarchyRequestErrorが発生していてどうもDOM操作を誤っているような感じで、エラーメッセージも「ノードが属さない箇所に挿入しようとした」といった内容。

エラーが jquery.activity-indicator-1.0.0.js の150行目で発生しているので該当コードを見てみる。


```js:jquery.activity-indicator-1.0.0.js
129:   // Check if Webkit CSS animations are available, as they work much better on the iPad
130:   // than setTimeout() based animations.
131:   
132:   if (document.createElement('div').style.WebkitAnimationName !== undefined) {
133:
134:       var animations = {};
135:   
136:       /**
137:        * Animation strategy that uses dynamically created CSS animation rules.
138:        */
139:       animate = function(el, steps, duration) {
140:           if (!animations[steps]) {
141:               var name = 'spin' + steps;
142:               var rule = '@-webkit-keyframes '+ name +' {';
143:               for (var i=0; i < steps; i++) {
144:                   var p1 = Math.round(100000 / steps * i) / 1000;
145:                   var p2 = Math.round(100000 / steps * (i+1) - 1) / 1000;
146:                   var value = '% { -webkit-transform:rotate(' + Math.round(360 / steps * i) + 'deg); }\n';
147:                   rule += p1 + value + p2 + value; 
148:               }
149:               rule += '100% { -webkit-transform:rotate(100deg); }\n}';
150:               document.styleSheets[0].insertRule(rule);
151:               animations[steps] = name;
152:           }
153:           el.css('-webkit-animation', animations[steps] + ' ' + duration +'s linear infinite');
154:       };
155:   }
156:   else {
```

発生箇所はここ。

```js:jquery.activity-indicator-1.0.0.js
150:               document.styleSheets[0].insertRule(rule);
```

DeveloperToolsでオブジェクトを見ても特におかしな所はなく困り果てていたが、document.styleSheets[0]が指すCSSファイルに正常/エラーとで差があった。

```
@import 'common.css';
@import 'hoge.css';
```

こんな具合に外部ファイルをインポートしているだけのCSSファイルをHTML上で最初に定義されている場合（= document.styleSheets[0]）にHierarchyRequestErrorが発生しているようだったので、スタイルが定義されたCSSと読み込み順序を変えてみたらHierarchyRequestErrorは発生しなかった。

推測だがWebkitベースのブラウザではインポートをしているだけだとCSSOM上にノードがないとみなされている模様。そう考えると以下のメッセージもうなずける。

```
A Node was inserted somewhere it doesn't belong.
```


PullRequestしようと思ったけど、よくよく調べてみたら1年以上前に同じ問題でissueが上がっていてPullRequestが取り込まれていないっぽいだけだった。。

+ [DOM Exception for insertRule()](https://github.com/neteye/jquery-plugins/issues/45)

滅多に使わないだろうけどCSSStyleSheet.insertRuleを使用する場合は要注意だね。


## 2013/11/14追記
Google Chrome31にバージョンアップするとこんなエラーが出た。

```
Uncaught TypeError: Failed to execute 'insertRule' on 'CSSStyleSheet': 2 arguments required, but only 1 present. jquery.activity-indicator-1.0.0.min.js:10
```

insertRuleは使うなってことか。
SpriteKit入門 -5-

今回は、シーンを切り替える処理を見ていきます。

まずは、新しいシーンクラスを作成します。

![新規シーンクラス作成](https://lh4.googleusercontent.com/-unRpbmRUoyU/UmE96KnLK3I/AAAAAAAAAbQ/iGTDgW9JhyA/w719-h470-no/spritekit_010.jpg "新規シーンクラス作成")

![新クラス名入力](https://lh5.googleusercontent.com/-Eg9nY_rUuvs/UmE-uUWG5ZI/AAAAAAAAAb4/9tTK3U5Gglk/w579-h468-no/spritekit_011.jpg "新クラス名入力")

|||
|:--|:--|
|Class|**SpaceshipScene**|
|Subclass of|**SKScene**|

新しく追加したクラスを実装します。
コードはHelloScene.mと似ています。

```objectivec:SpaceshipScene.m
#import "SpaceshipScene.h"

@interface SpaceshipScene ()
@property BOOL contentCreated;
@end

@implementation SpaceshipScene

- (void)didMoveToView:(SKView *)view
{
    if (! self.contentCreated) {
        [self createSceneContents];
        self.contentCreated = YES;
    }
}

- (void)createSceneContents
{
    self.backgroundColor = [SKColor blackColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
}

@end
```

HelloScene.mにSpaceScene.hをインポートします。

```objectivec:HelloScene.m
#import "HelloScene.h"
#import "SpaceshipScene.h"
```

runAction:メソッドをrunAction:completion:メソッドに書き換えます。

```objectivec:HelloScene.m
        [helloNode runAction: moveSequence completion:^{
            SKScene *spaceshipScene = [[SpaceshipScene alloc] initWithSize:self.size];
            SKTransition *doors = [SKTransition doorsOpenVerticalWithDuration:0.5];
            [self.view presentScene:spaceshipScene transition:doors];
        }];
```

実行すると、

![HelloScene](https://lh3.googleusercontent.com/-0VAK_tImsUI/UmHGRu5PFbI/AAAAAAAAAcU/O1XLsVvhhgs/w498-h648-no/spritekit_012.jpg "HelloScene")

"Hello, World!"をタップすると、シーンが切り替わります。

![SpaceshipScene](https://lh5.googleusercontent.com/-lqbE9jhJ7ds/UmHGWPTnJEI/AAAAAAAAAcs/XleyCoLlGYk/w498-h648-no/spritekit_013.jpg "SpaceshipScene")

今回はここまで。
tmux 設定&Tips (自分用めも)


screenからtmuxに乗り換えるにあたって
あまり戸惑わないように＆凝りすぎないようにしてる自分用のメモ

# 設定

```conf:tmux.conf
# prefix key 変更
set-option -g prefix C-t
# keybind をvi風に
set-window-option -g mode-keys vi
# ペイン移動もvi風に
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# tmux.confのreloadを簡単に
bind r source-file ~/.tmux.conf; display-message "Reload Config!!"

# log output
# 参考: http://blog.glidenote.com/blog/2013/02/04/tmux-pipe-pane-logging/
bind-key H pipe-pane 'cat >> $HOME/.tmux/`date +%Y-%m-%d-%H-%M-%S`.log' \; display-message 'Started logging'
bind-key h pipe-pane \; display-message 'Ended logging'
```

# 操作
| キーバインド | コマンド |
|:-----------:|:------------:|
| Prefix + c | 新しいウィンドウ作成 |
| Prefix + n | 次のウィンドウに移動 |
| Prefix + p | 前のウィンドウに移動 |
| Prefix + d | デタッチ |
| Prefix + " | ウィンドウを上下のペインに分割 |
| Prefix + % | ウィンドウを左右のペインに分割 |
| Prefix + [ | コピーモード |
| Prefix + ] | ペースト |
| Prefix + t | どーんと時計を表示 |
| Prefix + ? | 困ったらこれを見る |
nginxソースコードリーディング その3〜コアAPI(文字列)〜

Qiitaの中の人も楽しみにしているらしい本連載ですが、今回からnginxが持つ内部のAPIについて解説していきます。


このあたりの知識はnginxの内部実装を理解するだけでなく、拡張モジュールを開発するのにも役立つと思います。

# 前回

[nginxソースコードリーディング その2〜イベント駆動エンジン〜](http://qiita.com/cubicdaiya/items/f3460682cb908901a81d)

# リビジョン

5428:fcecb9c6a057

# Cにおけるデータ型とアルゴリズム

PythonやRubyといったLLとは違い、Cは文字列、リスト、ハッシュテーブル、キューといった非常によく使う基本的なデータ構造やアルゴリズムの実装を処理系に含んでいない。

かといってどこでも使える汎用的なライブラリというのもこれまた難しいので、Cで書かれているソフトウェアは各々独自の実装を持っていることが非常によくある。僕自身何度連結リストをCで実装したかわからない。

# nginxが持つデータ型

nginxもこの例に漏れず、独自に実装された様々なデータ型やアルゴリズムの実装を持っている。ぱっと思いつくものだけでこれだけある。

 * 文字列
 * メモリプール
 * リスト
 * ハッシュテーブル
 * 赤黒木
 * キュー

全部書いてたらキリがないけど、少なくともハッシュテーブルまではやろうと思う。というわけで今回は文字列。

# ngx_str_t

nginxの文字列型は以下のように定義されている。

```c:core/ngx_string.h
typedef struct {
    size_t      len;
    u_char     *data;
} ngx_str_t;
```

lenが文字列の長さ、dataが文字列へのポインタになる。いわゆる長さ付き文字列である。文字列リテラルを使ってngx_str_tの変数を初期化するには以下のマクロを使うと便利。

```c:core/string.h
#define ngx_string(str)     { sizeof(str) - 1, (u_char *) str }
#define ngx_null_string     { 0, NULL }
#define ngx_str_set(str, text)                                               \
    (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
#define ngx_str_null(str)   (str)->len = 0; (str)->data = NULL
```

すべてのAPIがngx_str_tを使っているわけではなく、単に標準ライブラリ関数をラップしているだけのものもある。

```c:core/string.h
#define ngx_strstr(s1, s2)  strstr((const char *) s1, (const char *) s2)
#define ngx_strlen(s)       strlen((const char *) s)
```

# ngx_str_tのデータを扱う際の注意点

ngx_str_tが長さ付き文字列型であることは説明したが、それを踏まえた上でこのデータ型を扱う際の注意点について解説する。(過去に何度かハマった)

例えばnginxの以下のロケーションにアクセスするとしよう。

```nginx
location /hello {
```

curlで以下のURLにアクセスする。

```
curl http://localhost:8000/hello
```

この場合URIは/helloになる。URIはngx_http_request_sのメンバでngx_str_t型で定義されている。

```c
struct ngx_http_request_s {
            (省略)
    ngx_str_t                         uri;
            (省略) 
}
```

nginxの中でprintfなどでURIの中身を見てみる。

```c
printf("uri:%s\n", r->uri.data);
```

するとこうなる。

```
/hello HTTP/1.1
User-Agent
```

何故か余計なものがくっついてくる。試しに長さも出力してみる。

```c
printf("%s:%zd\n", r->uri.data, r->uri.len);
```

長さは合ってる。

```
/hello HTTP/1.1
User-Agent
, 6
``` 

つまり、ngx_str_t型のデータは文字列の長さ+1のところで0終端されているとは限らない。
だからngx_str_tのdataポインタに対してstrlenみたいな関数を呼ばないようにしよう。

また、この前提は他の文字列APIを使う上でも重要である。
例えばngx_pstrdupというメモリプールから必要な確保を確保して文字列データのコピーをつくる関数がある。

```c
ngx_str_t ns = ngx_string("bokko");
u_char *ss   = ngx_pstrdup(pool, &ns);
```

この関数の実装は以下のようになっている。

```c:core/string.c
u_char *
ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src)
{
    u_char  *dst;

    dst = ngx_pnalloc(pool, src->len);
    if (dst == NULL) {
        return NULL;
    }

    ngx_memcpy(dst, src->data, src->len);

    return dst;
}
```

返す文字列は0終端していない。というか0終端用の領域(最後の1バイト)すら確保していない。
なのでこの関数の以下のように別のngx_str_tのメンバに代入する形でだけ使うようにしないと思わぬ事故に見舞われる。(実際のコードから抜粋)

```c:http/ngx_http_core_module.c
conf->server_name.len = name.len;
conf->server_name.data = ngx_pstrdup(cf->pool, &name);
```

# 次回(予定)

[nginxソースコードリーディング その4〜コアAPI(メモリプール)〜](http://qiita.com/cubicdaiya/items/09f495da6ac9d889d6f8)
トップに戻るボタン

参照サイト→http://www.webopixel.net/javascript/538.html

デフォルト

html
<p id="page-top"><a href="">PAGE TOP</a></p>

css
#page-top {
	position: fixed;
	bottom: 20px;
	right: 20px;
	font-size: 77%;
}
#page-top a {
	background: #666;
	text-decoration: none;
	color: #fff;
	width: 100px;
	padding: 30px 0;
	text-align: center;
	display: block;
	border-radius: 5px;
}
#page-top a:hover {
	text-decoration: none;
	background: #999;
}

javascript
$(function() {
	var topBtn = $('#page-top');	
	topBtn.hide();
	//スクロールが100に達したらボタン表示
	$(window).scroll(function () {
		if ($(this).scrollTop() > 100) {
			topBtn.fadeIn();
		} else {
			topBtn.fadeOut();
		}
	});
	//スクロールしてトップ
    topBtn.click(function () {
		$('body,html').animate({
			scrollTop: 0
		}, 500);
		return false;
    });
});
HP作成インデックス

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"　lang="ja">
<head>
	 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	 <title>就活の虎</title>
	 <link rel="stylesheet" href="css/common.css">
	 <link rel="stylesheet" href="css/resset.css">  
</head>
<body>
	<div id="container">

		<div id="header">
		</div>
		<!--/header-->

		<div id="main">
        <p>あいうえお</p>
		</div>
		<!--/main-->
 
	</div>
	<!--container-->
</body>
</HTML>
resset.css

@charset"utf-8";

html {  
    overflow-y: scroll;  
}  
body, div, dl, dt, dd, ul, ol, li, h1, h2, h2, h3, h5, h6,  
pre, form, fieldset, input, textarea, p, blockquote, th, td {  
    margin: 0;  padding: 0;  
}  
address, caption, cite, code, dfn, em, strong, th, var  {  
    font-style: normal;  
}  
table   {  
    border-collapse: collapse;  border-spacing: 0;  
}  
caption, th {  
    text-align: left;  
}  
q:before ,q:after   {  
    content: '';  
}  
object, embed   {  
    vertical-align: top;  
}  
hr, legend  {  
    display: none;  
}  
h1, h2, h2, h3, h5, h6  {  
    font-size: 100%;  
}  
img, abbr, acronym, fieldset    {  
    border: 0;  
}  
li  {  
    list-style-type: none;  
}
elixirで素数の個数判定

社内のプログラミングコンテストで素数の個数判定プログラムをScalaで書いたので、elixirの勉強に書き直してみました。

# プログラムの概要
ある数nが与えられたとき、2からnの間に存在する素数の個数を返す。
バージョン0.10.4-devで動作確認しました。

```
defmodule PrimeNumCounter do
    def count(num) do
        list = makeList(num, [])
        res = getPrimeList(list, [], trunc(:math.sqrt(num)))
        Enum.count(res)
    end
    def getPrimeList([h|t], result, threshold) do
        if threshold >= h do 
            getPrimeList(sieve(h, t, []), [h|result], threshold)
        else 
            Enum.reverse(result)++[h|t]
        end
    end
    def sieve(num, [h|t], result) do 
        if rem(h, num) != 0 do sieve(num, t, [h|result])
        else sieve(num, t, result)
        end
    end
    def sieve(_, [], result) do Enum.reverse(result)
    end
    def makeList(num, result) do
        if num==1 do result
        else 
        makeList(num-1, [num|result])
        end
    end
end
```

# 解説
## moduleの定義

```
defmodule PrimeNumCounter do
	~~~
end
```
## count関数
素数の個数判定を行うメインの関数。

* ２から始まるnまでのリストを作る。
* 素数のリストを作る。
* 素数のリストの要素数を返す。 

```
def count(num) do
    list = makeList(num, [])
    res = getPrimeList(list, [], trunc(:math.sqrt(num)))
    Enum.count(res)
end
```

## getPrimeNumList関数

受け取った元リストから素数以外を篩い落として、素数のリストを返す関数。

それぞれの引数は、
1. 元リスト。hはリストの先頭要素、tは先頭以外のリスト。
2. 再帰で篩をかけた結果を渡すためのリスト。
3. 再帰を継続する条件値。

* 元リストの先頭要素hが、threshold以下であれば、"篩にかけたリスト"とhを追加した結果のリスト、thresholdでgetPrimeNumListを再帰。
* 元リストの先頭要素hが、thresholdより大きい場合、結果のリストと元リストを連結して返す。

※ elixirには、forやwhileのような条件ループが存在しないので、繰り返しの処理はこの関数の用に再帰で行います。

```
def getPrimeList([h|t], result, threshold) do
    if threshold >= h do 
        getPrimeList(sieve(h, t, []), [h|result], threshold)
    else 
        Enum.reverse(result)++[h|t]
    end
end
```

## sieve関数
ある数値の倍数を、リストから篩い落とした結果を返す関数。

それぞれの引数は、
1. 篩い落とす数値。
2. 篩い落とし対象のリスト。hが先頭要素、tが先頭以外のリスト。
3. 再帰で結果を渡す為のリスト。

* rem関数で剰余算を行う。hが対象の数値で割り切れなければ、hを結果リストに追加して、tを対象に再帰。
* hが対象の数値で割り切れた場合、tを対象に再帰。



```
def sieve(num, [h|t], result) do 
    if rem(h, num) != 0 do sieve(num, t, [h|result])
    else sieve(num, t, result)
    end
end
```

第２引数が空の場合のパターンマッチ。
対象のリストが空になった場合、こちらのsieve関数にマッチする。
結果のリストをEnum.reverse()で逆順にした結果を返す。

```
def sieve(_, [], result) do Enum.reverse(result)
end
```

## makeList関数
2から受け取った数値までのリストを返す。
Scalaの ```(2 to n).toList``` と同じです。

```
def makeList(num, result) do
    if num==1 do result
    else 
    	makeList(num-1, [num|result])
    end
end
```


# まとめ
一応、これで動きます。
性能はよろしくないです。
DB_DataObject::update()がユニークキーを更新できない

タイトル通りのファッキンな仕様。

テーブルを作る。

```
CREATE TABLE `test` (
 `c_primary` varchar(16) NOT NULL COMMENT '主キー',
 `c_unique` varchar(16) NOT NULL COMMENT 'ユニークキー',
 `c_index` varchar(16) NOT NULL COMMENT 'インデックス',
 `c_hoge` varchar(16) NOT NULL COMMENT '特に何もなし',
 PRIMARY KEY (`c_primary`),
 UNIQUE KEY `k_unique` (`c_unique`),
 KEY `k_index` (`c_index`)
)
```

とりあえず値を入れておく。

```
INSERT INTO test (c_primary, c_unique, c_index, c_hoge) VALUES ('a','b','c','d');
INSERT INTO test (c_primary, c_unique, c_index, c_hoge) VALUES ('w','x','y','d');
```

その後update()を実行。

```php
<?php
	//DB_DataObject
		$table = DB_DataObject::factory('test');
	
	//取得
		$table->c_primary = 'a';
		$table->find();
	
	//値をセット
		$table->c_unique = 'e';
		$table->c_index = 'f';
		$table->c_hoge = 'g';
	
	//更新
		$table->update();
```

こうした場合、testテーブルの値は`('a','e','f','g')('w','x','y','d')`になってることを期待するわけですが、実際は1行もアップデートされていません。
実際に発行されたSQLがどうなっているかというと、

	UPDATE test SET c_index='f', c_hoge='g' WHERE (c_primary='a') AND (c_unique='e')

何故かユニークキーが勝手にWHERE側に回っています。
で、どうやらこれをどうにかする手段がないっぽいという驚愕の事実。

update()の引数に値を渡すことで動作を変更することができます。

```php
<?php
	//aを取得
		$table->c_primary = 'a';
		$table->c_unique = 'b';
		$table->find();
	
	//wを取得
		$table2->c_primary = 'w';
		$table2->c_unique = 'x';
		$table2->find();
	
	//差分を更新
		$table->update($table2);
```

引数にDB_DataObjectを渡すことで、両者の差分のみをアップデートすることができます。
しかしこの場合も、差分といいつつ更新される可能性があるのはc_indexとc_hoge列だけです。
c_hogeは同じなので更新されるのはc_indexだけとなります。

```php
<?php
		$table->c_primary = 'a';
		$table->find();
		$table->c_unique = 'e';
		$table->c_index = 'f';
		$table->c_hoge = 'g';

	//WHERE句を直接指定
		$table->addWhere("c_primary='a'");
		$table->update(DB_DATAOBJECT_WHEREADD_ONLY);
```

`addWhere()`を指定後`update(DB_DATAOBJECT_WHEREADD_ONLY)`とすると、指定したWHERE句でupdateすることができます。
SQLがどうなったかというと、

	UPDATE test SET c_index='f', c_hoge='g' WHERE (c_primary='a')

ユニーク列どっか行きやがった。

結局テーブル定義変更するか自力でクエリを組むかとかいった、DB_DataObjectの利点を何も使えない解決方法をとるしかありません。
構成によっては非常に不便を強いられる作りでした。


まあ、今時DB_DataObjectなんて使ってる方が悪いんですがね。
for でループの第3夜


はい、昨日に引き続き
[http://d.hatena.ne.jp/shindannin/20111202/1322833089]
(http://d.hatena.ne.jp/shindannin/20111202/1322833089)
より。

ビットを使った総当たり

7色（赤、橙、黄、緑、青、藍、紫）の絵の具があります。そのうち3色を選んで、絵を描くことにしました。
絵の具の選び方は何通りありますか？

```py:forで7重ループさせる場合.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from __future__ import print_function
import sys
import io
import re
import math


cou = 0 #いま選んだ絵の具が何色かのカウンタ
res = 0 #3色の組み合わせが出た時に+1する変数
#for 色 in range(2): でループ1周めは0が代入されるので使っていない色
#2周めは使っている色ということにする。
for aka in range(2):
    for daidai in range(2):
        for ki in range(2):
            for midori in range(2):
                for ao in range(2):
                    for ai in range(2):
                        for murasaki in range(2):
#ループの最深部で各色を足して3と等しければ3色選んだ組み合わせ
                            cou=aka+daidai+ki+midori+ao+ai+murasaki
                            if cou==3:
                                res+=1
print (res)

```

条件が複雑になると書き間違えや与えられる色数が増えた場合に対応できないので ビットを使ったforループ という手法があるそうです。
まるまる写し替え(出来ているのか曖昧ですけど)したのが下記

```py:bitを使った総当たり.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from __future__ import print_function
import sys
import io
import re
import math

max_colors = 7
result = 0
for all_color in range(1 << max_colors):
    num_colors = 0
    for color in range(max_colors):
        if (all_color & (1 << color)):
            num_colors += 1
    if num_colors == 3:
        result += 1
print (result, end='\n')
```

理解できて書いたわけでなしにうかつに私が解説つけると誤る可能性が非常に高いので解説は今夜は略で。
from __future__ import print_function　でprintは始めました。
Windows で %PATHEXT% を利用した which コマンド


Windows では、実行可能ファイルの拡張子が環境変数 `PATHEXT` に入っているので、`PATH` と `PATHEXT` を利用すれば `which` コマンドが作れる。

## `PATHEXT` について

`PATHEXT` にはセミコロン区切りで実行可能ファイルの拡張子が入っている。

```cmd:PATHEXT
C:\Users\foo>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
```

拡張子は格納順に優先度が高いため、上記の場合、`foo.exe` と `foo.bat` が同じフォルダに存在する場合、`foo` を実行すると `foo.exe` が実行される。


## `which` コマンドの実装

インタフェースは Linux の `which` コマンドと同様にする。

```
SYNOPSIS
  which [-a] filename

OPTIONS
  -a  見つかった全ての実行可能ファイルを表示する。

EXIT STATUS
  0   指定した全てのコマンドが見つかった
  1   指定したいずれかのコマンドが見つからなかった
  2   不正なオプションを指定した
```

`-a` オプションを指定すると、環境変数 `PATH` に存在する全ての実行可能ファイルを出力する。また、複数のコマンドを同時に指定することもできる。

以下の内容の `which.cmd` をパスの通ったフォルダに置く。

```cmd:which.cmd
@echo offsetlocal  set ALL=0  set NOTFOUND=0  set OPT=%~1  if "%OPT%"=="" exit /b  if "%OPT%"=="-a" (    set ALL=1    shift  ) else if "%OPT:~0,1%"=="-" (    echo Illegal option %OPT%    echo Usage: which [-a] args    exit /b 2  )  if "%~1"=="" exit /b  :LOOP    set COMMANDS=;%PATHEXT%    call set COMMANDS=%%COMMANDS:;= %~1%%    set COMMANDS=(%COMMANDS:~1%)    for %%i in %COMMANDS% do (      if exist %%~$PATH:i (        echo %%~$PATH:i        if %ALL%==0 goto :NEXT      )    )    set NOTFOUND=1    :NEXT    shift    if not "%~1"=="" goto LOOP  if %NOTFOUND%==1 exit /b 1endlocal```

```cmd:実行結果
C:\Users\foo>which notepad ipconfig
C:\Windows\System32\notepad.exe
C:\Windows\System32\ipconfig.exe
```

### 実装方法

実装のポイントは、セミコロンで区切られた `PATHEXT` の各拡張子を取り出す方法。通常のプログラミング言語のように、`".exe;.bat".split(";")` などとして、拡張子をリストに分割できそうにないので、別の方法を考える。

```cmd:forコマンド
C:\Users\foo> for %i in (foo.exe foo.bat) do echo %i
foo.exe
foo.bat
```
のように、 `for` コマンドを使用することでループは実現できるので、`(foo.exe foo.bat)` のような文字列を作ればよい。

```cmd:which.cmd
set COMMANDS=;%PATHEXT%
=> ";.EXE;.BAT"
call set COMMANDS=%%COMMANDS:;= %~1%%
=> " foo.EXE .foo.BAT"
set COMMANDS=(%COMMANDS:~1%)
=> "(foo.EXE foo.BAT)"
```
で、変数 `COMMANDS` に、`for` で回すための文字列を作っている。
xargs でシェルスクリプトの並列実行

仕事でちょっと必要になったので。

単にバックグラウンド処理するだけでなく、同時実行数を制御したかった。

昔のメモが調べてみたらすぐ見つかったので、Qiitaに転記しときます。（http://d.hatena.ne.jp/ux00ff/20120730/1343655384）

```bash
# 別のスクリプトの出力を処理する
pre_process.sh | xargs -n 1 -P 2 ./post_process.sh

# ファイルから読み込む
cat target_list.txt | xargs -n 1 -P 2 ./process.sh

# 決まったデータを順に処理する
(for DATA in a b c d e f; do echo $DATA ;done) | xargs -n 1 -P 2 ./parallel.sh
```

普通に使うと関数が使えなかったり、大きなシェルスクリプトの一部で使う分にはちょっぴり不便だけど、昔ながらのパイプでつなぐスタイルで書く分にはとても便利。

関数を無理矢理渡す方法が、

http://d.hatena.ne.jp/wristed/20120603/1338691396

にあった。`export -f` で関数を環境に突っ込んで、`bash -c` で実行する。
annotate error when draw text in imagemagick 

error：
png.rb:17:in `annotate': unable to read font `/usr/local/share/ghostscript/fonts/n019004l.pfb' @ error/annotate.c/RenderFreetype/1125: `(null)' (Magick::ImageMagickError)
	from png.rb:17:in `make_png'
	from png.rb:29:in `<main>'


resolve：
download ftp://ftp.imagemagick.org/pub/ImageMagick/delegates/ghostscript-fonts-std-8.11.tar.gz 
unzip and copy to /usr/local/share/.....
Javaでバブルソート

帰ってきてからなんかやろうと思っても纏まった時間が取れないため、
そんな時はアルゴリズムを解いていきます。

１日１個、半年もやれば１８０個です。
地道にやっていきます。
AOJのように予め課題が用意されていると取っ付きやすいですね。

そんな訳で今回は

#バブルソート

簡単に言うと、ある配列の末尾と末尾−１の数を比較しソートしていくアルゴリズムです。
そんなに補足は必要ないと思いますが一応例を書くと

例
* 配列 6 4 5 3 1 2
並び替えの順序は
* 6 4 5 3 1 2 // 1 < 2なので何もしない
* 6 4 5 1 3 2 // 3 < 1なので入れ替え
* 6 4 1 5 3 2 // 5 < 1なので入れ替え
* 6 1 4 5 3 2 // 4 < 1なので入れ替え
* 1 6 4 5 3 2 // 6 < 1なので入れ替え
* 1 6 4 5 2 3 // また末尾の数値を比較し、 3 > 2なので入れ替え
・・・省略 

```java
package aoj.sort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BubbleSort {
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// 問題を解く為に入力を受けているだけなので無視してください。
		int elementNum = Integer.parseInt(br.readLine());
		String line = br.readLine();
		int[] numArray = parseInt(getSplitLine(line));

                // ここからバブルソート
		int count = 0;
		for (int i = 0; i < numArray.length - 1; i++) {
			for (int j = numArray.length - 1; j > i; j--) {
				if (numArray[j - 1] > numArray[j]) {
					int tmpNum = numArray[j - 1];
					numArray[j - 1] = numArray[j];
					numArray[j] = tmpNum;
					count++;
				}
			}
		}
		System.out.println(Arrays.toString(numArray)
				.replaceAll("[\\[\\],]", ""));
		System.out.println(count);
	}

	private static String[] getSplitLine(String line) {
		return line.split("\\s");
	}

	private static int[] parseInt(String[] line) {
		int[] numArray = new int[line.length];
		for (int i = 0; i < line.length; i++) {
			numArray[i] = Integer.parseInt(line[i]);
		}
		return numArray;
	}

}

```

バブルソートは
データの総数を num とすると、比較回数は　num(num-1)/2　回。
になるようです。

流石にもう少し難しいものに手を出したいですが、ペースを崩さず
基本をしっかり思い出しましょう。。。
土日はScalaでBDDでも書きたいと思います。
MacOS 10.9 に homebrewで QTをインストールする。

capybara-webkitをインストールしようとしたところ、qmakeが必要だったのでhomebrew経由でインストールしようとしたところ、qt4もqt5もエラーでインストールできません。

homebrewのissueを探していたところ以下のエントリーを参考にインストールが出来ました。
[https://github.com/mxcl/homebrew/issues/21608](https://github.com/mxcl/homebrew/issues/21608)

ただ、最後をみればわかる通りMacBook Air2013（Corei5/1.3G Mem8G）でも1時間以上かかってるのでインストールにはそれなりの覚悟が必要です。


```
$  brew install https://raw.github.com/cliffrowley/homebrew/patched_qt/Library/Formula/qt.rb --HEAD
######################################################################## 100.0%
==> Cloning git://gitorious.org/qt/qt.git
Cloning into '/Library/Caches/Homebrew/qt--git'...
remote: Counting objects: 46736, done.
remote: Compressing objects: 100% (29696/29696), done.
remote: Total 46736 (delta 15643), reused 42171 (delta 14249)
Receiving objects: 100% (46736/46736), 161.35 MiB | 404.00 KiB/s, done.
Resolving deltas: 100% (15643/15643), done.
Checking connectivity... done
Checking out files: 100% (46944/46944), done.
==> Checking out branch 4.8
==> Downloading patches
######################################################################## 100.0%
==> Patching
patching file src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro
==> Downloading http://trac.webkit.org/export/157771/trunk/WebKitLibraries/libWebKitSystemInterfaceMavericks.a
######################################################################## 100.0%
==> ./configure -prefix /usr/local/Cellar/qt/HEAD -system-zlib -confirm-license -opensource -nomake demos -nomake examples -cocoa -
==> make

==> make install
==> Caveats
We agreed to the Qt opensource license for you.
If this is unacceptable you should uninstall.
==> Summary
 /usr/local/Cellar/qt/HEAD: 2776 files, 118M, built in 72.4 minutes
```
実行したコマンドの終了コードを表示する

実行したコマンドの終了コードの確認をする場合ふつうは

```shell-session
$ command
$ echo $?
```

とか

```shell-session
$ command ; echo $?
```

のようにして確認したりする。

けれど、たまに`echo $?`を打つのを忘れて次のコマンドを打ってしまったり、
コマンド → `echo $?`を繰り返してhistoryが埋め尽くされてしまうことも。

なので、環境変数の __PROMPT_COMMAND__ を使ってコマンドを打つたびに自動で戻り値を表示するようにしてみた。

bashのmanページに書いてある。
> 
> __PROMPT_COMMAND 設定されていると、プライマリプロンプトを出す前に毎回、この値がコマンドとして実行されます。__
>

`/etc/bashrc`か`~/.bashrc`に、以下のような記述を追加する。
追加する場所は、ファイルの最後のほうが良いっすね。

PROMPT_COMMANDにはコマンドが登録済みなので、それらより先にこの関数を呼ぶようにする(そうじゃないと意味ないので)。
`${PROMPT_COMMAND//__show_status;/}`としているのは、`~/.bashrc`を読みなおした時に`__show_status`が重複登録されないように。

SETCOLORの辺りは `/etc/init.d/functions`から。ただ表示するのも面白く無いので終了コードの範囲により色を変えるようにしてみた。
この例では、終了コードが0：緑、1～100：黄、101～：赤となる。

今のところ期待する動作をしているけど、`Ctrl+C`を押下時には終了コードが`130`になるようだけど、この関数では拾えていない。もうひと工夫必要なのかな？

```bash:/etc/bashrc
：
：
function __show_status() {
    local status=$(echo ${PIPESTATUS[@]})
    local SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    local SETCOLOR_FAILURE="echo -en \\033[1;31m"
    local SETCOLOR_WARNING="echo -en \\033[1;33m"
    local SETCOLOR_NORMAL="echo -en \\033[0;39m"

    local SETCOLOR s
    for s in ${status}
    do
        if [ ${s} -gt 100 ]; then
            SETCOLOR=${SETCOLOR_FAILURE}
        elif [ ${s} -gt 0 ]; then
            SETCOLOR=${SETCOLOR_WARNING}
        else
            SETCOLOR=${SETCOLOR_SUCCESS}
        fi
    done
    ${SETCOLOR}
    echo "(rc->${status// /|})"
    ${SETCOLOR_NORMAL}
}
PROMPT_COMMAND='__show_status;'${PROMPT_COMMAND//__show_status;/}
# vim:ts=4:sw=4
```

実行結果

```shell-session
(rc->0)
[root@localhost ~]# test 0 == 0
(rc->0)
[root@localhost ~]# test 0 == 1
(rc->1)
[root@localhost ~]# command1
-bash: command1: コマンドが見つかりません
(rc->127)
[root@localhost ~]#
```
node.jsによるzlib圧縮/伸長

# node.jsによるzlib圧縮/伸長

```js:sample_zlib.js
// node v0.10.21

"use strict";

var zlib   = require('zlib');
var uncipherd_text = 'ひらぶん';

console.log("source");
console.log(uncipherd_text);

// 圧縮
console.log('deflate');
zlib.deflate(uncipherd_text, function(err, buffer) {
  if (err) {
    console.log(err);
    return;
  }

  console.log(buffer);
  
  // 伸長
  zlib.unzip(buffer, function(err, buffer) {
    if (err) {
      console.log(err);
      return;
    }
    
    console.log('unzip');
    console.log(buffer.toString());
  });
});
```

## 実行結果

```
> source
> ひらぶん
> ziped
> <Buffer 78 9c 7b dc b8 e9 71 53 e7 e3 c6 6d 8f 9b 26 03 00 35 e8 08 17>
> unzip
> ひらぶん
```
flask


# flask
werkzeugとjinja2を活用したフレームワーク。
マイクロフレームワーク。外部ライブラリを除けばビュー周りしかサポートしていない。

## スレッドローカルなオブジェクトたち

werkzeug.localを使ってrequest等をグローバルオブジェクトに見立てる。
→これはどこからでもアクセスできるようにするためか？当然実装コードは複雑化している。

**？LocalProxyがスレッドセーフであることはどうやって確保されている？**
→thread.get_ident or gleenlet.get_current関数で得られるidをキーに、Localオブジェクトがデータを管理しているので、同じキーの更新は複数スレッドから起こらないということ。

## コンテキスト
各種コンテキストオブジェクトはグローバルな形式でアクセスできるようになっている。

## セッション
werkzeugのセッションモジュールは全く使っていない。
SessionInterfaceとSessionCookieSessionがキー。SessionInterfaceがセッションの生成や保存等の操作を担い、SessionCookieがセッション情報を持つ。
セッションはRequestContextに保持される。

操作とデータが分離しているので、一見反オブジェクト指向な感じがするが、sessions.pyというひとつのモジュールとして捉えればそうでもないのだろう。

## コンフィグレーション
app.configオブジェクトを通してConfigインスタンスにアクセスする。
コンフィグオブジェクトはdictのサブクラスであるため、flask側で設定していない値も設定可能。
ConfigAttributeをアプリケーションオブジェクトに設定することで、アプリケーションオブジェクトから一部の設定値にアクセスすることが可能。ConfigAttributeはコンフィグインスタンスへの仲介をしているだけ。ちょっと必要性は疑わしい。

## 戻り値
戻り値をrvと表記する緩いルールがあるよう。処理が長い関数では何が戻り値なのかわかりやすく良い反面、rvという名前に戻り値であること以外の情報はないため、どのような値が返るのか最初に明示しないと可読性を下げる。

## ビュー
render_templateやjsonifyなど、フォーマットに応じたビュー関数。


## ブループリント
アプリケーションの操作を拡張できる機能。ベースとなるアプリケーションを作ったり、大きなアプリケーションをURLルートごとに複数に分割することが可能となる。


# wtforms
flaskで紹介されているバリデーションフレームワーク。

## パラメータデータコンバートとバリデーション
データコンバートはFormインスタンス生成時（process）、バリデーションはvalidateメソッド実行時に行っているが、データコンバートでエラーがでてもエラー情報を保持しておくだけで例外は伝播させない。validate実行時にマージされる。
pyramid


# pyramid
pylonsプロジェクトの一つ。フルスタックなフレームワークではないが、小さなアプリから大きなアプリまで対応できることがウリ。

# 依存ライブラリ
インストールするとwebobとかmakoとか他のライブラリがたくさんインストールされる。
pyramidフレームワークはこれらのライブラリの上に成り立っているので、flask的だとも言えそう。

# ビュー
* デコレータベースの設定をするが、入出力は変わらないようにしてある。（@view_configとか）
 * レンダラもビューと切り離されている
   * テスト容易性が高そう
   
   ```python
   from pyramid.view import view_config
  
   @view_config(renderer='myapp:templates/mytemplate.pt')
   def myview(request):
       return {'a':1}
     ```

## venusian
view_config関数の設定はアプリケーション実行時まで遅延される。
つまり単体としてデコレートされた関数を使ってもview_config関数の効果はない。

これはvenusianというライブラリが請け負っている。
http://docs.pylonsproject.org/projects/venusian/en/latest/

これにより、 **デコレータ関数の副作用を気にせずにテストが書けるようになる。**

pythonのデコレータをjavaのアノテーションのように、ただのメタデータに近い形としてして使うことができるようになるという意義があるのかな。
裏の仕組みが複雑になっても、宣言的に書きやすくなるのはいいことだと思う。
expressのよくある設定メモ

express使ってモックを作ったりするときの、よくある設定のメモです。

## Jadeのprettyを有効にする

古いバージョンのexpressとやり方違うので注意。基本開発環境のみの設定なので、環境がdevelopmentのときだけ適用。

```js:app.js
if ('development' === app.get('env')) {
  app.locals.pretty = true;
}
```

## livereload

<a href="https://github.com/intesso/connect-livereload" target="_blank">connect-livereload</a>を使ったやり方。こちらも開発環境のみ適用。

```js:app.js
if ('development' === app.get('env')) {

  var liveReloadPort = 35729,
      excludeList = ['.css', '.html','.js'];

  app.use(require('connect-livereload')({  
    port: liveReloadPort,
    excludeList: excludeList
  }));
}
```

## virtual hosting

第2引数がexpress()。

```js:app.js
app.use(express.vhost('www.example.com',require('./path/to/express/app.js')));
```

requireする場合は、読み込まれる側でexportしておく。

```js:app.js
var app = module.exports = express();
```

## アップロードファイルのTEMPディレクトリ設定

<a href="http://www.senchalabs.org/connect/multipart.html" target="_blank">connect.multipart</a>の設定。

```js:app.js
app.use(express.bodyParser({
  uploadDir : './files/'
}));
```

## セッション使う

セッショーン。

```js:app.js
app.use(express.session());
```

## ベーシック認証

ベーシックな認証。

```js:app.js
app.use(express.basicAuth(function(user,pass){
  return username === user && password === pass;
},'some message'));
```

## socket.io

soket.ioとは関係ないけど、本番時には立ち上げ後にユーザ変更する。

```js:app.js
var server = http.createServer(app),
    io = require('socket.io').listen(server);
    
server.listen(app.get('port'), function(){

  if ('development' !== app.get('env')) {
    process.setuid('www-data');
  }

  console.log('Express server listening on port ' + app.get('port'));
});
```

おしまい。
DockerをCentOS6.4にインストールする方法


参考：http://oss.fulltrust.co.jp/?p=537
↑のサイトの方が最新版のDockerを動かす方法について[こちらに](http://oss.fulltrust.co.jp/?p=562)載せておられるそうです．

以降は全部rootで実行する．

* リポジトリの設定とdocker-ioのインストール

```
 # wget -P /etc/yum.repos.d  http://www.hop5.in/yum/el6/hop5.repo
 # yum install xz -y 
 # yum install docker-io -y 
```

* 起動スクリプトの作成

[/etc/init.d/lxc-docker](https://gist.github.com/igaki/7352479#file-lxc-docker)
このファイルを配置し，下記コマンドを実行する．
なお，↑のファイルではrepositoryの保存場所を/shareに変更している
（デフォルトだと/var/lib/docker に作成される．デフォルトに戻すのであれば，start 及び restartのところの-g /share を削除すればOK）

```
# chmod 755 /etc/init.d/lxc-docker
# chkconfig --add lxc-docker
```

* GRUBの設定&ホストOSの再起動

```
# sed -i 's/default=1/default=0/' /boot/grub/grub.conf 
# reboot
```

* Docker起動

CentOS起動後下記のコマンドを実行すると，centosイメージをdockerが起動し，bashシェルでイメージ内部に入る（centosイメージが無い場合は，共有レジストリ(docker.io)から自動的にDLして実行してくれる）

`docker run -i -t centos /bin/bash`

終了するときはexitで抜ければOK．同時に実行されているコンテナ（centosのイメージを動かしているもの）も終了する．

## セットアップ時の注意点

### WARNING: IPv4 forwarding is disabled

`docker run`実行時に，`WARNING: IPv4 forwarding is disabled.*`というWarningが出る場合，dockerコンテナ内で正常にネットワークが使えなくなることがある．
その場合，`vi /etc/sysctl.conf` を実行し，`net.ipv4.ip_forward `の値を1にすればOK．

### lxc-start: Permission denied - failed to create symlink for kmsg

lxc-docker start時にPermission Deniedと出て実行できない場合，SELinuxの実行を疑う．`setenforce 0` と実行して，lxc-dockerが正常に実行できた場合は，SELinuxのせいなので，`/etc/selinux/config`の中の`SELINUX`の値をdisabledにする．

### コンテナ内から外部にネットワークがつながらない

ひとまずホストOSのiptablesを止めてみる（Stopだけだと正常に通信できない場合が事例としてあったので，その場合はStopしてchkconfigから自動起動をOFFにして再起動して試してみる）．
勿論iptablesが必要な場合は，コンテナからホストへの仮想NICの通信をiptablesで許可してあげればOK．

### ulimit: open files: cannot modify limit: Operation not permitted

コンテナ内でulimitを設定する際に出ることがあります．例えばmongodの起動スクリプト(/etc/init.d/mongod )．
まずコンテナ内で `ulimit -a` で `oepn files (-n)` の値を確認し，その値が今設定しようとしている値より小さく，かつ，その場で `ulimit -n 65535` 等を実行した際にも↑のエラーメッセージがでる場合，一度コンテナ外に出て，ホスト側で下記を実行する．

```
# /etc/init.d/lxc-docker stop
# ulimit -n 65535
# /etc/init.d/lxc-docker start
```

要するに，一度docker daemonを止めて，ホスト側の`ulimit -n`の数値を上げ，再度daemonを起動する．その後，コンテナを起動し，内部のulimit -n の値を確認すると，同様に65535になっている．

参考：https://groups.google.com/forum/#!topic/docker-user/T45Kc9vD804

ちなみに，ubuntu環境でDockerを実行していた場合，`/etc/init/docker.conf` に下記記述(数値は適当．要はコンテナ内で設定されるものより大きければ良い)を追記して，`sudo service docker restart` と実行すれば良い

```
limit nofile 262144 262144
```
Pushの前にかならずテストするGitのHookスクリプト

GradleとMavenのプロジェクトに使えます。

Gradleの場合、gradlewrapperを使います。

```bash
#!/bin/bash

echo "prepush called"

DIR=$PWD
ROOT=$PWD/`git rev-parse --show-cdup`
ROOT=${ROOT%/}
result=0

#dryRun
function dryRun(){
  local result=0
  pushMessage=`git push --dry-run --no-verify 2>&1`
  result=$?

  if [ $result -eq 0 ]; then
    if echo $pushMessage | grep -e "^Everything.\+" > /dev/null 2>&1; then
      result=1
    fi
  else
    if echo $pushMessage | grep -e "has no upstream branch" > /dev/null 2>&1; then
      result=0
    fi
  fi

  if [ $result -ne 0 ]; then
    echo $pushMessage 1>&2
  fi
  return $result
}

# status check
function isReadyToPush(){
  local _test=`git submodule foreach "git status|grep 'nothing to commit, working directory clean'"`
  local _expect=`git submodule foreach "git status|echo 'nothing to commit, working directory clean'"`
  if [ "$_test" != "$_expect" ] ; then
    echo "[error] submodule has uncommitted changes." 1>&2
    return 1
  fi
  _test=`git submodule foreach "git log --remotes --oneline -1|sed -e 's/ .\+//g'"`
  _expect=`git submodule foreach "git reflog -1|grep 'HEAD@{0}'|sed -e 's/ HEAD.\+//g'"`
  if [ "$_test" != "$_expect" ] ; then
    echo "[warn] submodule has unpushed or unpulled changes." 1>&2
    return 0
  fi
  return 0
}

# gradle
function forGradle(){
  if [ -f "${ROOT}/gradlew" ]; then
    cd $ROOT
    echo "${ROOT}/gradlew found. start gradle test"
    chmod +x ./gradlew
    ./gradlew clean test 2>&1 >/dev/null;result=$?
    cd $DIR
    return 0
  fi
  return 1
}

# maven
function forMaven(){
  if [ -f "${ROOT}/pom.xml" ]; then
    cd $ROOT
    echo "${ROOT}/pom.xml found. start mvn test"
    mvn clean test 2>&1 >/dev/null;result=$?
    cd $DIR
  fi
}

# -------------------------
# entry point
# -------------------------
dryRun
if [ $? -eq 0 ]; then
  isReadyToPush
  if [ $? -eq 0 ]; then
    forGradle
    if [ $? -ne 0 ]; then
      forMaven
    fi
  else
    exit 1
  fi
else
  exit 1
fi

if [ $result -ne 0 ]; then
  echo "test error!"
  echo "push rejected!"
  exit 1
else
  echo "Test ends successfully"
fi

echo "push start"
exit 0
```
awkの出力について（シングルクォーテーション、改行なし）

### シングルクォーテーション
`\047`を利用する

##### シングルクォーテーションで囲って出力させたい場合の例

```
awk '{print "\047"$1"047"}'
```

### 改行なしで出力したい
`printf`を利用する
ESCを連打したときにclose-other-windowsされたくない

Emacsで `ESC` (Escape)キーを連打してたらウィンドウがひとつになってしまって orz
そんなことってありますよね……?

あるんです ヾ(〃＞＜)ﾉﾞ☆

```el:init.el
(global-set-key (kbd "M-ESC ESC") 'keyboard-quit)
```

`.emacs`ファイルにこの一行を足してやれば良いですね。

 * `M-ESC ESC` は、`ESC` が三回押された状態のことです
 * `keyboard-quit` は `C-g` したときに呼ばれるコマンドです

初出
----

 * [keyboard-quit の beep を差し替えたい · Issue #4 · emacs-jp/issues](https://github.com/emacs-jp/issues/issues/4)
ステートメントブロックを作る

# ブロックとは

[ブロック - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/block)

# 制御フロー文なしでも使える。

今更知りました。制御フロー文(`if`や`for`や`switch`など)がなくても記述できます。JSって下記の記述って大丈夫な言語だったのですね。

```js
var a = 0;
{
    var b = 0;
    var c = 1;
    var d = a + b + c;
}
```

※ただし`var`宣言での変数ではブロックスコープを作れるわけではない。

# たとえばこんな感じで書くと視認性があがるのかも。

…あがるのか…?

(はじめて見たときはだいぶ混乱しましたけどね。)

```js
switch (foo) {
    case 0: {
        bar();
        break;
    }
    case 1: {
        bar2();
        break;
    }
    default: {
        bar3();
    }
} 
```

※`switch`文でこういう書き方ができるけど、特に`break`が省略できるわけでもない。

# `let`文で効果を発揮?

__ECMAScript6__ で導入予定の`let`文だとどうなるか。

※Firefoxで確認

```js
{
    let a = 0;
}
console.log(a); // => Reference Error a is not defined
```

わざわざ **即時関数** を作らなくてもよくなるんですね。素晴らしい。
Facebook Graph API でユーザーIDが取得出来ない原因

Facebook の Graph API でユーザーネームからユーザーID取得に失敗したときのメモです。

https://graph.facebook.com/{ username }
とかにアクセスすると普通はユーザーID含む基本情報が返ってきます。

が、あるとき以下の様なデータが返ってきた。

{
   "error": {
      "message": "Unsupported get request.",
      "type": "GraphMethodException",
      "code": 100
   }
}


で調べたらどうも対象のFacebookページが
 **「誰でも(13歳以上)」じゃない場合はエラーが返ってくる** 
仕様みたいでした。
Starlingの Image.color で色変え

## テクスチャ画像の色変え
StarlingでImageの色かえをするには以下の2つの方法があります。

- ColorMatrixFilter
- Image.color

ColorMatrixFilterは、色相・彩度などを変更でき柔軟性が高く自由に色変えを行うことができます。ほぼ従来のflash.filters.ColorMatrixFilterと同じです。ただし動作は重たくモバイルでは使いづらいのが難点です。

Image.colorプロパティは非常に高速に動作しますが、指定色を乗算をするだけなので色変えといっても表現の幅は限られています。とはいえモバイルでもパフォーマンスを気にせずに使えるのは大きな魅力です。
>Image オブジェクトでは、カラー値が指定できるcolor プロパティが公開されています。各ピクセルに関し、最終的なカラーは、テクスチャのカラーと指定したカラーとの乗算の結果になります。これによりイメージの色合いを簡単に変えることができ、別のテクスチャを使用しなくてもイメージのさまざまなバリエーションが作成できます。
[Introducing Starling 日本語訳 57ページより](http://www.himco.jp/articles/pdf/IntroducingStarling.pdf)

　

## どのような画像が色変えに向いているか？
無彩色の画像や、同系統の色でまとまっているような画像だと、違和感なく色変えしやすい印象。
![block_irokae.png](https://qiita-image-store.s3.amazonaws.com/0/3171/2faa75fa-1a7a-b12f-5c6d-c3e5665998cb.png "block_irokae.png")

　

## Flash CS6でシミュレートする
![color_effect.png](https://qiita-image-store.s3.amazonaws.com/0/3171/1df4be53-35ae-c6fa-683a-416e617b2585.png "color_effect.png")
カラー効果の詳細スタイルで、赤・青・緑のパーセンテージをいじることによって、Image.colorプロパティを変更した時と同様の効果をシミュレートできる。
なお、RGBの各値は以下の計算式で算出できる。

```
[RGB各値] = 255 * [パーセンテージ] / 100
```

　

## RGB値を算出するJSFL
以下のJSFLは、選択中のインスタンスのカラー効果をImage.color用のRGBに変換しクリップボードにコピーします。

```as3:convert_starling_image_color.jsfl
var doc = fl.getDocumentDOM();
var selection = doc.selection[0];
if(selection == undefined) alert('オブジェクトが選択されてないふにゃ');
else {
	var r = 255 * selection.colorRedPercent / 100;
	var g = 255 * selection.colorGreenPercent / 100;
	var b = 255 * selection.colorBluePercent / 100;
	
	var rgb = r << 16 | g << 8 | b;
	var rgb_hex = '0x' + ('000000'+rgb.toString(16)).slice(-6);
	
	fl.clipCopyString(rgb_hex);
	alert('copy to clipboard: ' + rgb_hex);
}
```
MySQL User 作成（簡易）

メモ

```bash
dbun=user
dbup=userpassword
dbnm=databasename

dbmn=root
dbmp=rootpassword

dbch=UTF8

mysqladmin -u $dbmn -p$dbmp --default-character-set=$dbch  create $dbnm
mysql      -u $dbmn -p$dbmp mysql --default-character-set=$dbch -e "GRANT ALL ON $dbnm.* TO $dbun@localhost IDENTIFIED BY '$dbup'"
mysql      -u $dbmn -p$dbmp mysql --default-character-set=$dbch -e "SELECT User, Host from mysql.user where User = '$dbun'"
mysqladmin -u $dbmn -p$dbmp flush-privileges
mysql      -u $dbun -p$dbup $dbnm -e "select 1"
Xcode5でStoryboardを削除する手順

**Xcode 5** で新規に作ったiOS向けの `Single View Application` プロジェクトから **Storyboardを削除してAppDelegateクラスとViewControllerクラスの紐付けを行う方法** をメモ。

<br />

### 0. プロジェクトの作成

新規にiOS向けの `Single View Application` プロジェクトを作成。

<br />

### 1. Storyboardを削除

Project Navigator（左側のツリー）から `Main.storyboard` を削除。（Move to Trash）

<br />

### 2. Info.plist を編集

`XXX-Info.plist` （XXXはプロジェクト名）を開いて `Main storyboard file base name` の項目を削除。
これで `Main.storyboard` への参照が無くなりビルド時のエラーが出なくなります。

<br />

### 3. AppDelegateクラスを編集

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // ここに ViewController を紐付ける記述が必要
    return YES;
}
```

`AppDelegete.m` ファイル内の `application:didFinishLaunchingWithOptions:` デリゲートメソッドに ViewControllerクラスとの紐付けが無いので、下記の様に編集。

<br />

```objc:AppDelegate.h
#import <UIKit/UIKit.h>
#import "ViewController.h" // 追加

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController; // 追加

@end
```

`AppDelegate.h` 内でViewControllerクラスのヘッダファイルをインポートしつつ、ViewControllerインスタンスを保持するプロパティを追加。

<br />

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // ここから
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[ViewController alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    // ここまでを追加
    return YES;
}
```

`AppDelegete.m` ファイル内の `application:didFinishLaunchingWithOptions:` デリゲートメソッドの中でUIWindowインスタンスを生成して、ルートのビューコントローラにViewContollerインスタンスを割り当ててmakeKeyAndVisibleメソッドで描画。
<br />

以上の手順でアプリ起動時にViewControllerインスタンスに自動的に生成された空のビューが表示されるようになります。
ELBではなく紐づくEC2側でSSL処理を行う

 ![ssl_elb_ec2.png](https://qiita-image-store.s3.amazonaws.com/0/16768/2b007b75-1036-ea57-7b02-2b23bbda787e.png)

* ELBではなくELBに紐づくEC2の方でSSL処理を行う方法をメモする
  * これが役に立つのはELBが対応していないSSLの機能(クライアント認証など)を使いたいのでEC2でSSL処理させたいが、ELBのロードバランス機能は利用したいというような場合かな
  * ただし、制限有(2014/03/18追記)

----
## 設定例
1. EC2でApacheを設定しhttps:443でアクセス出来るようにしておく
1. ELBを以下のように設定する => https://[ELBのDNS]でアクセス可能になる

* Listners

| Load Balancer Protocol |  Load Balancer Port |  Instance Protocol | Instance Port |
|:-----------|:------------|:------------|:------------|
|  TCP  | 443 | TCP | 443 |

* Health CheckはTCPの443番に対して実行

## 制限
 * ApacheレベルでIPによるアクセス制限ができない(EC2に対するアクセスは全てELBからでTCPプロトコルではELBにどこからアクセスがあったかわからないため)
  * [Apacheのクライアント認証をIPアドレスによっては不要にしてみる · mechamogera/MyTips Wiki](https://github.com/mechamogera/MyTips/wiki/Apache%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E8%AA%8D%E8%A8%BC%E3%82%92IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%81%AF%E4%B8%8D%E8%A6%81%E3%81%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)のようなことができない
  * [AWS Developer Forums: ELB経由のサーバアクセスをSecuri...](https://forums.aws.amazon.com/thread.jspa?threadID=77258&tstart=25#)

## 参照サイト
 * [浮浪プログラマの始末書:[AWS][Beanstalk] クライアント証明書でアクセス制限するWebアプリのための環境構築](http://blog.livedoor.jp/froo/archives/51874664.html)
MySQL Install

メモ

```bash
mkdir -p /usr/local/src/mysql/
cd /usr/local/src/mysql/
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.14-1.el6.i686.rpm-bundle.tar/from/http://cdn.mysql.com/
tar -xf MySQL-5.6.14-1.el6.i686.rpm-bundle.tar
## yum install $(ls -1 *.rpm)
yum localinstall  MySQL-*.rpm
vi /etc/my.cnf
```

```yaml:/etc/my.cnf
[client]
port    =       3306
socket  =       /var/lib/mysql/srv60.sock


[mysqld]
port    =       3306
socket  =       /var/lib/mysql/srv60.sock
datadir =       /var/lib/mysql
```

```bash
cat /root/.mysql_secret
```

```txt:/root/.mysql_secret
# The random password set for the root user at Fri Nov  8 15:10:12 2013 (local time): default-password
```

```bash
mysql -u root -p
```

```mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('password');
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql>  quit

```
Ruby Install

メモ

```bash
sudo -s
mkdir -p /usr/local/src/ruby
wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
tar -zxf ruby-2.0.0-p247.tar.gz
cd ruby-2.0.0-p247
./configure
make && make test && make install
```
objective-cで (const修飾子で) 配列を定数としたいとき

例として、文字列定数を定数配列にしてみる。

ヘッダ

```objctivec:Const.h
extern NSString *const SOME_CONSTANT_ARRAY[];

extern NSUInteger const SIZE_OF_SOME_CONSTANT_ARRAY;
```

実装

```objctivec:Const.m
NSString *const SOME_CONSTANT_ARRAY[] = { @"hoge", @"fuga", @"piyo" };

NSUInteger const SIZE_OF_SOME_CONSTANT_ARRAY = 3;
```

使いたいとき

```objctivec:SomeExternalClass.m
NSArray *array = [[NSArray alloc] init];
for(int i = 0; i < SIZE_OF_SOME_CONSTANT_ARRAY; i++)
	[array addObject:SOME_CONSTANT_ARRAY[i]];

// arrayに対する処理・・・

```
ゼロベース社内勉強会「ウェブ・アプリケーションのプロトタイピング・ワークショップ」第1回


- [Facebookイベントページ](https://www.facebook.com/events/599275573442648/)
- [ソースコード・リポジトリ (Mercurial on BitBucket)](https://bitbucket.org/zerobaseinc/meteor-npm-bower-mercurial)

## コンセプト

- "In-browser" to "in-app": イン・ブラウザー・デザインから、イン・アプリ・デザインへ。デザイナーも、エンジニアと同じローカル実行環境を使って、動作しているアプリをいじってデザインする。

- Autonomous modeless components are building blocks: 自律的でモードレスな部品によってアプリケーションを構成する。画面単位のデザインや、画面単位のコントローラー(MVC)ではない。自律的に作動する部品(component)が協調動作するシステム。

- Ubiquitous language: ユビキタス言語。プログラミング上のクラス名と、それに対応するHTMLカスタム・タグ名と、それに対応するCSSの要素名を一致させる。それによりソースコードの自動生成を推進する。

- Branch to category: 分岐せず、分類する。“if”（条件分岐）のコードを書く代わりに、既存概念の精緻化（classをsubclassに分けること）によって「条件」を表現する。

## メモ

[Tic-Tac-Toe](http://ja.wikipedia.org/wiki/%E4%B8%89%E7%9B%AE%E4%B8%A6%E3%81%B9) ゲームのモデリング作業を通じて、

- メンタル・モデル（ユーザーの心のなかにある）
- インターフェイス・モデル（モノとして存在する）
- ソフトウェア・モデル（プログラミングのモデル）

という3つのモデルの違いを理解しました。また、

- メンタル・モデルとソフトウェア・モデルを近づけることが、ソフトウェア開発上大事であること（オブジェクト指向やMVCは本来そういうものとして考案された）
- 主流のワークフローはインターフェイス・モデルに引きずられ過ぎていること（HTMLやDOMでUIを設計し、jQueryでインタラクションを実装するといった手法は、UI実装モデルに依存しすぎている）
- 我々が模索するワークフローは、インターフェイス・モデルをいったん保留し（考えず）、メンタル・モデルからソフトウェア・モデルをつくる。そのあとでインターフェイス・モデルを実装していくというワークフローであること

を確認しました。

だからHTMLではなくCustom ElementsでUIを記述するというわけです。HTMLはUI実装言語であり、Custom Elementsは（XML的な意味で）抽象的UI記述言語であります。UIそのものを記述できるのは後者。

HTML5 Custom ElementsによるUI記述というのは、ある意味で、 [XUL](http://ja.wikipedia.org/wiki/XUL) に似てるかもしれません。

で、自律的UIコンポーネントをライブラリ化し、再利用していけば、ウェブ・アプリケーション開発の生産性は大幅に向上するだろう、と考えられます。（GWT/Vaadinのアプローチです）

## 環境構築

### Mercurialのインストール

- [Mercurial SCM](http://mercurial.selenic.com/)
- [Hg Init: a Mercurial tutorial by Joel Spolsky](http://hginit.com/)

### Node.js開発環境の構築手順

- node.js v0.10.21 [node.js](http://nodejs.org/) →[Node.jsの設定]
- 例えば `npm install mocha` → package.json

### Bowerのインストール

- [BOWER: A package manager for the web](http://bower.io/)
- `npm install -g bower`
- 例えば `bower install bootstrap` → component.json

### 新規プロジェクト作成の基本手順

- `hg init` もしくは空リポジトリのクローン `hg clone ssh://hg@bitbucket.org/zerobaseinc/meteor-npm-bower-mercurial`
- `npm init`
- 必要なモジュールを `npm install`
- `bower init`
- 必要なコンポーネントを `bower install`
- `hg add component.json package.json .hgignore`
- `hg commit`

### 既存プロジェクトのクローン手順

- `hg clone ssh://hg@bitbucket.org/zerobaseinc/meteor-npm-bower-mercurial`
- `npm install`
- `bower install`

## 次回

実際に Tic-Tac-Toe を作ってみる。
TalendETLのtSendMailで件名文字化け

Talend Open Studio for Data Integration で実行すると ``Subject: =?UTF-8?....`` となるのにジョブをエクスポートしてバッチファイルから実行すると ``Subject: =?MS932?....`` となってしまう。
Windowsのシェルスクリプト（バッチファイル）で  ``-Dfile.encoding=UTF-8`` を追加するとUTF-8で送信できました。
諸事情でバッチファイルに一括修正を加えるスクリプトを作っていたのでそこに組み込んでやりました。
XCodeのBuild Settingsで、値が決まっていくルール


Build Settingsでの値の決まり方
----
Build Settingの値はどうやって決まっていくのか？Build Settingsを開いて"Levels"を見ると、どのレベルでどんな値になっていくのかを見る事が出来ます。

![PAMEventBoard.xcworkspace_—_PAMEventBoard.xcodeproj_と_Kobito-14.png](https://qiita-image-store.s3.amazonaws.com/0/7946/1aec815d-f994-7e47-233c-7ccb6e7e623c.png "PAMEventBoard.xcworkspace_—_PAMEventBoard.xcodeproj_と_Kobito-14.png")

iOS Default → (xcconfig)→Project→Target の順で、値を「上書き」し続ける形で値が決定していきます。

各Levelにて、値の設定が無ければ親の設定で上書きされています。しかし、何か設定をすると親の設定が消えてしまいます。その時は`$(inherited)`を追加して親の設定を明示的に継承します。

* そのレベルでの設定無し→親の設定で上書き
* そのレベルでの設定有り
  * `$(inherited)`が有る→`$(inherited)`を親の設定と置き換える
  * `$(inherited)`が無い→親の設定は消える

xcconfigファイルはどこで設定するのか？
----
xcconfigファイルはテキストファイルなので作るのは簡単です。
↓CocoaPodで生成されたxcconfigファイル

```Pods.xcconfig
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/AFNetworking" "${PODS_ROOT}/Headers/DCIntrospect" "${PODS_ROOT}/Headers/TestFlightSDK"
LIBRARY_SEARCH_PATHS = "$(PODS_ROOT)/TestFligh
tSDK"
OTHER_LDFLAGS = -ObjC -lTestFlight -lz -framework CoreGraphics -framework MobileCoreServices -framework QuartzCore -framework Security -framework SystemConfiguration -framework UIKit
PODS_ROOT = ${SRCROOT}/Pods
```

しかし、ただ作ってプロジェクトに入れただけでは、Build Settingsには出てきません。この登録は、Project設定の中の"Info"→"Configurations"で行います。

![PAMEventBoard.xcworkspace_—_PAMEventBoard.xcodeproj-2.png](https://qiita-image-store.s3.amazonaws.com/0/7946/5becd651-f914-2ebf-daaf-56011dc51407.png "PAMEventBoard.xcworkspace_—_PAMEventBoard.xcodeproj-2.png")

なぜこんな事を調べてたのか
----
`$(inherited)`が、何を継承しているのかがよく分かってなかったからです。階層構造になってるプロジェクトでの親/子プロジェクトの設定を引き継ぐのかと思ってました。。。
メールのテンプレートを変えたら、delayed_jobをリスタートする

railsでメール送信の仕組みは、ActionMailerを使っています。
送信処理は非同期で行いたいので、delayed_jobを組み合わせています。

メールのテンプレート（hoge.text.erb）を変更したのですが、実際に送信される文面が変わっていないのです。

ふと思いついたのが、delayed_jobのプロセス。
delayed_job をリスタートしたら変更したテンプレートが反映されました。

`script/delayed_job restart`

けっこう悩んでいたので、メモとして残しておきます。
FlaskのテストクライアントのHTTPヘッダを変更したいとき


これでいけました
たとえばUserAgentをいじる

というかこれのままです
http://stackoverflow.com/questions/15278285/setting-mocking-request-headers-for-flask-app-unit-test


``` tests.py
# -*- coding: utf-8 -*-
from nose.tools import ok_, eq_
import flask

class ClientProxy(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['HTTP_USER_AGENT'] = environ.get('HTTP_USER_AGENT', 'hogehoge')
        return self.app(environ, start_response)


def sample_test():
    app = flask.Flask(__name__)
    app.wsgi_app = ClientProxy(app.wsgi_app)
    with app.test_client() as c:
        c.get('/')
        eq_(flask.request.user_agent.string, 'hogehoge')
```
Eclipseでscala開発環境構築


メニューのヘルプから『新規ソフトウェアのインストール』を選ぶ。
追加を選んで次のサイトにある欲しいバージョンのscalaプラグインを入力する。
http://scala-ide.org/download/current.html

例）バージョン2.10なら
http://download.scala-ide.org/sdk/e38/scala210/stable/site

『OK』を押して、全ての項目にチェックを入れてインストールを開始する。