OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS を Jenkins のスレイブマシーンに追加する方法

#CentOS を Jenkins のスレイブマシーンに追加する方法

##ノードの追加

Jenkinsの管理
<notextile>-> ノードの管理 -> 新規ノード作成</notextile>
<notextile>-> ノード名を入力 -> ダムスレーブを選択 -> OK</notextile>

以下のノード情報を入力してOK
ノード名、説明、ラベルは都度変更

```
ノード名:test
説明:
同時ビルド数:1
リモートFSルート:/var/lib/jenkins
ラベル:test
用途:このマシーンを特定ジョブ専用にする
起動方法:JNLP経由でスレーブを起動
可用性:可能な限りオンラインのままにする
```

##スレーブマシーン側の設定

スレーブマシーンにログイン後、

起動ユーザーを作成

```
# useradd jenkins
```

ワークディレクトリを作成

```
# mkdir -p /var/lib/jenkins
# chown -R jenkins:jenkins /var/lib/jenkins
```

設定ファイルを作成
　JENKINS_URL は Jenkins のアクセスURL
　JENKINS_NODENAME は 作成したノード名
　JENKINS_SECRET は 作成したノードページに書いてある -secret の値

```
# vi /etc/sysconfig/jenkins-slave

JENKINS_WORKDIR="/var/lib/jenkins"
JENKINS_USER="jenkins"
JENKINS_URL="https://210.0.0.0:41001/jenkins"
JENKINS_NODENAME="test"
JENKINS_SECRET="9f1819708de5b9ddd1033847172e9157b152e509f404e4274f10ef8b63c30346"
JENKINS_OPTION="-noCertificateCheck"
```

```
 # chmod 600 /sysconfig/jenkins-slave
```

起動サービスの作成

```
# vi /etc/init.d/jenkins-slave

#!/bin/sh
#
# jenkins-slave:    Launch a Jenkins BuildSlave instance on this node
#
# chkconfig:    - 99 01
# description:  Enable this node to fulfill build jobs
#
 
# Source function library.
. /etc/rc.d/init.d/functions
 
[ -f /etc/sysconfig/jenkins-slave ] && . /etc/sysconfig/jenkins-slave
 
[ -n "$JENKINS_URL" ] || exit 0
[ -n "$JENKINS_WORKDIR" ] || exit 0
[ -n "$JENKINS_USER" ] || exit 0
[ -n "$JENKINS_NODENAME" ] || exit 0
[ -n "$JENKINS_SECRET" ] || exit 0
[ -n "$JENKINS_OPTION" ] || exit 0
[ -x /usr/bin/java ] || exit 0
 
download_jar()
{
    curl -s -o slave.jar $JENKINS_URL/jnlpJars/slave.jar || exit 0
}

start()
{
  cd $JENKINS_WORKDIR
  [ -f slave.jar ] || download_jar
 
  echo -n $"Starting $prog: "
 
  su $JENKINS_USER sh -c "\
    java -jar slave.jar -jnlpUrl $JENKINS_URL/computer/$JENKINS_NODENAME/slave-agent.jnlp -secret $JENKINS_SECRET $JENKINS_OPTION >slave.log 2>&1 &"

  if [ $? = 0 ]; then echo '[OK]'; else echo '[NG]'; fi
}
 
stop()
{
  echo -n $"Shutting down $prog: "
 
  PID=`ps -ef | grep '[j]ava -jar slave.jar' | awk '{print $2}'`
  [ -n "$PID" ] && kill $PID
 
  if [ $? = 0 ]; then echo '[OK]'; else echo '[NG]'; fi
}
 
# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload)
    stop
    start
    ;;
  status)
    status java
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart|reload}"
    exit 1
esac
 
exit 0
```

```
# chmod 755 /etc/init.d/jenkins-slave
```

起動サービスに登録

```
# chkconfig --add jenkins-slave
# chkconfig jenkins-slave on
# chkconfig --list jenkins-slave
```

起動

```
# service jenkins-slave start
```

slave.jar がダウンロードが失敗した場合は手動で配置
slave.jar は 作成したノードページからダウンロード可能

```
# mv slave.jar /var/lib/jenkins/
```
第21回オフラインリアルタイムどう書くの問題をRubyで解く

問題は
http://d.hatena.ne.jp/torazuka/20140509/yhpg

```rb
def solve(q)
  rooms = [[],[],[],[],[],[]]
  5.times{|i|
    q.split('|').each{|e|
      no, reqs = e.split('_')
      next if rooms.flatten.include?(no.to_i)
      j = reqs.split('').map(&:to_i)[i]
      rooms[j] <<= no.to_i if rooms[j].size < 4
    }
  }
  (1..5).select{|i| rooms[i].size > 0}.map{|i| (i.to_s + '_' + rooms[i].sort.join(':'))}.join('|')
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t"
  print ans
  puts ans == a ? 'o' : 'x'
end
__END__
0	1_12345	1_1
1	30_32451	3_30
2	1_12345|2_12345	1_1:2
3	3_12345|2_12345|1_12345	1_1:2:3
4	1_23415|2_12435|3_42135	1_2|2_1|4_3
5	1_23415|2_12435|3_42135|4_31245|5_53124	1_2|2_1|3_4|4_3|5_5
```
レッスンは何曜日？

###採点ツール
採点ツールv2(Ruby版)は非対応ですので、「C/C++/Javaのテストデータ」を採点ツールv1(C++版)に結合してコンパイルすることで採点が可能です。

```rb:hena21.rb
#!/usr/bin/env ruby
#http://qiita.com/torazuka/items/cbdb6b581a57e4754dd4
#http://d.hatena.ne.jp/torazuka/20140509/yhpg
WEEKDAYS=5
STDOUT.sync=true
while gets
	cls=WEEKDAYS.times.map{[]}
	input=$_.chomp.split('|').map{|e|
		a=e.split('_')
		[a[0].to_i,a[1].chars.map{|e|e.to_i-1}]
	}
	WEEKDAYS.times{|i|
		j=0
		while j<input.size
			if cls[input[j][1][i]].size<4
				cls[input[j][1][i]]<< input[j][0]
				input.delete_at(j)
			else
				j+=1
			end
		end
	}
	ret=[]
	cls.each_with_index{|e,i|ret<< ((i+1).to_s+'_'+e.sort*':') if !e.empty?}
	puts ret*'|'
end
```
第21回オフラインリアルタイムどう書く ruby で


* 問題 : http://d.hatena.ne.jp/torazuka/20140509/yhpg
* 他の実装へのリンク : http://qiita.com/torazuka/items/cbdb6b581a57e4754dd4
* イベント : http://yhpg.doorkeeper.jp/events/10503

当日その場で書いた ruby。これでだいたい１時間。


```ruby
def solve_impl( src )
  fixed={}
  5.times.each_with_object(Hash.new{ |h,k| h[k]=[] }) do |pri, r|
    src.each do |num, w|
      next if fixed[num] || 4<=r[w[pri]].size
      r[w[pri]].push num
      fixed[num]=true
    end
  end
end

def format( r )
  r.keys.select{ |k| ! r[k].empty? }.sort.map{ |k|
    [k, r[k].sort.join(":")].join("_")
  }.join("|")
end

def parse( src )
  src.split("|").map{ |i| 
    a,b=i.split("_")
    [a.to_i, b.chars ]
  }
end

def solve(src)
  format solve_impl( parse( src ) )
end

$stdout.sync=true
DATA.map do |line|
  num, src, exp = line.split(/\s+/)
  actual = solve( src )
  ok = actual==exp
  puts( "%d %s\n   A:%s\n   E:%s\n" % [ num, src, actual.inspect, exp.inspect ] ) unless ok
  ok
end.all?{ |x| x }.tap{ |x| puts( x ? "Okay!" : "**NG**" ) }

__END__
0 1_12345 1_1
1 30_32451  3_30
19  55_13524|64_41523|40_23451|99_25314|65_21453|69_31524|77_45231|62_51432|21_13542|81_13452|66_21534|33_41352|5_52314|90_31452|6_42135|93_42351|84_43125|54_45213|76_21453|19_52134|50_21435|61_13542|30_35421|43_25431|24_25341|31_15234|39_15243|20_51423|67_13524  1_21:55:61:81|2_40:65:66:99|3_30:69:84:90|4_6:33:64:77|5_5:19:20:62
```

いつも通り、テストデータの大半は省略。
初めての非出題者での参加でどきどきしたけど、時間内に書けた。ほ。
しかし。
制限時間内に groovy も書こうという野望はついえた。残念。

実装戦略はたぶん順当な感じだと思う。
上記の実装は、parse 計算 整形 に分かれているけど、最初は 計算と整形が一緒になってた。あと、`each_with_object` が好き。
/etcって全然エトセトラじゃないじゃないですかやだー

FHS関連の記事読んでたらちょっとおもしろかったので。

 * http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
 * http://ask.slashdot.org/story/07/03/03/028258/define---etc

> The UNIX Programming Environment written by Brian W. Kernighan and Rob Pike of Bell Labs, published in 1984 by Prentice Hall defines /etc as et cetera on page 63. IMO this is the single best Unix book ever wriiten to learn Unix.

言い訳の余地のない感じでetcはエトセトラなのに読み取りのみの設定ファイル群のディレクトリです。

後付け的に"Editable Text Configuration"だとかなんだとか言う主張もあるようですが、他のFHS内のディレクトリには一切acronymがないそれ無理やりじゃないですかバカー、っていう冷静なツッコミとかあったりして面白いです。

で個人的にはetc関係ないんですがacronym周りでは以下も面白かった。

```
Re: other unix-related bacrynyms: (Score:5, Funny)

emacs - Escape Meta Alt Control Shift.
gdb - Get Down Baby.
gcc - Give Communism (a) Chance.
linux - Linus Is Not Usually Xeroflulogitic.
lisp - Lisp Is (for) Symbolic Programming.
java - Just Another Variant (of) Ada.
perl - Perl Essentially Resembles Lisp.
printf - People Rarely Insist (on) Naming This Function.
sed - Slashdot (is) Easily Duped.
top - Totally Ongoing Programs.
vi - Very Irritating.
```

viで吹いた。

古い*nix周りの真面目な説明とかも勉強になりますが、アミーガがどうとか言われてもピンときませんどうしましょう
AngularJSでngModelをinputに付けたときに日本語入力がリアルタイムで反映されない問題


```html
<input ng-model="hoge" type="text">
<h1>{{hoge}}</h1>
```

上みたいにソースを書き,実際にテキスト入力をするとき,日本語入力を確定しないとmodelに反映されない問題がある.
angularjsの1.2.7以上のバージョンで確認できる.
[Angularjs公式](https://angularjs.org/)の最初のサンプルでも確認することができる.
Win8.1+MicrosoftIME環境,ブラウザはIE,Firefox,Chromeで確認.

とりあえず以下の用なdirectiveを作成してngModelの代わりに使うと回避できる.

```js
app.directive('jpNgModel', function($parse){
    return {
        restrict:'A',
        link:function(scope, element, attrs){
            var getter = $parse(attrs.jpNgModel);
            var setter = getter.assign;
            var value = getter(scope);
            element.bind('input', function(){
                setter(scope, element.val());
                scope.$apply();
            });
            
            scope.$watch(attrs.jpNgModel, function(n){
                if(n !== element.val()){
                    element.val(n);
                }
            });
        }
    }
});
```

## 使用例

```html
<input jp-ng-model="hoge" type="text">
<h1>{{hoge}}</h1>
```
Excel VBA チートシート


たまにExcelでVBAを書いてて、毎回調べているようなことをメモ。


## 基本文法

### メッセージ表示

```
MsgBox "Hello world"
Debug.Print "Hello world"
```

### コメント

```
'コメント
```

### 変数宣言

```
Dim flag As Boolean
Dim num As Integer
Dim value As Double
Dim today As Date
Dim str As String
```

### インクリメント/デクリメント

```
i = i + 1
i = i - 1
```

### 文字結合

```
join1 = "aaa" & "bbb"
```

### 制御文

```
If a = 0 Then

Elseif a = 1 Then

Else 

End If
```

```
i = 0
Do While i < 5

   If i = 3 Then
      Exit Do
   End If

   i = i + 1
Loop
```

```
For i = 0 To 4

  If i <> "" Then
     Exit For
  End If

Next
```


## セルの操作

### 参照

```
a = Cells(1, 1).Value
```

### 代入

```
Cells(1, 1).Value = "Hoge"
```

### シート指定

```
Worksheets("Sheet1").Cells(1, 1).Value = "Hoge"
```

### Withで一括指定

```
With Cells(3, 6)
        .Value = "項目"
        .Font.Bold = True
        .Interior.ColorIndex = 15
```

## シートの操作

### アクティブにする

```
Worksheets("Sheet1").Activate
```

### 範囲指定

```
Range(Cells(1,1), Cells(2,2)).Borders.LineStyle = xIContinuous
```

### Withで一括設定

```
With Range(Cells(1,1), Cells(2,2))
     	.Borders.LineStyle = xIContinuous
	    .Borders.ColorIndex = xlAutomatic
	    .Columns.AutoFit
```

### 選択範囲の取得とセルの結合

選択した範囲で、横方向のみセルを結合するスクリプト。

```
Start = Selection(1).Column
End   = Selection(Selection.Count).Column
For i = Selection(1).Row To Selection(Selection.Count).Row
    Range(Cells(i, Start), Cells(i, End)).MergeCells = True
Next i
```


## 参考

VBA基礎文法最速マスター
http://d.hatena.ne.jp/nattou_curry_2/20100129/1264787849
puppylinux で git log の表示がでない

puppylinux 5 辺りの devx.sfs に含まれている git で、なぜか
git log の表示ができなくて気になっていたのですが、
(lupu528jpやprecise5.6.1jp でも同じ。)

git log を表示するのに必要なpagerの設定がうまくいってなかったようで、
次のように、git config で pager に less を設定すると表示されるようになった。

# git config --global core.pager less

設定の確認
# git config --global --list
..
core.pager=less     <--- これが表示されていればセットされている。
第21回オフラインリアルタイムどう書くの問題

オフラインでリアルタイムに「どう書く」をやるイベント( http://yhpg.doorkeeper.jp/events/10503 )を行っています。

問題は「レッスンは何曜日？」という名前で、詳細は
http://d.hatena.ne.jp/torazuka/20140509/yhpg
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
herokuでlogの反応が悪い（ローカルでforeman startしているときを含む）

#きっかけ
ローカルでforeman startしたときに出力が出てこず、なぜだろうと悩んでいました。もしや標準出力は出力されないのか？と思ったり。
#バッファするため
RubyやPythonが標準出力をバッファする影響が出ている、とのこと。
>##Missing Output 
If you are not seeing any output from your program, there is a likely chance that it is buffering stdout. Many languages such as Ruby and Python buffer stdout by default. To disable this behavior, add this code as early as possible in your program:
[Missing Output · ddollar/foreman Wiki](https://github.com/ddollar/foreman/wiki/Missing-Output)

#おまじない
* Ruby

    * スクリプトのはじめのほうに書いておく

```
$stdout.sync = true
```

* Python（いちおう書いておきます）

    * 環境変数に `PYTHONUNBUFFERED=True` を設定

    * または起動時のオプションを指定する

```
python -u script.py
```
sudoしないと使えないコマンドを使えるようにする

mountのようなsudoしないと使えないコマンドを
sudoしないで使えるようにするには、

````shell-session
/etc/sudoers
````

に

```
user ALL=(ALL)  /bin/mount, /bin/umount
```

と追記すれば使えるようになります。(上記はユーザ名がuserの場合)

ただ、/etc/sudoers はreadonlyでrootユーザも編集できません。
そのときは、visudoコマンドを使えば、編集できるようになります。

```shell-session
$sudo visudo
```
Geolocation APIをjQuery.Deferredでラップ

Geolocation APIをjQuery.Deferredでラップ

```js
function geolocation() {
    var deferred = $.Deferred();
 
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            deferred.resolve(position.coords);
        }, function (error) {
            deferred.reject(error.code);
        });
    } else {
        deferred.reject();
    }
 
    return deferred.promise();
}
 
 
geolocation()
    .done(function(coords) {
        console.log(coords);
    })
    .fail(function(errorCode) {
        switch (errorCode) {
	    case 1:
	        // 位置情報の利用が許可されていません
	        break;
	    case 2:
	        // デバイスの位置が判定できません
	        break;
	    case 3:
	        // タイムアウト
	        break;
	    default:
	        // APIが未対応
        }
    });
```
Extensions Reloaderとguard-shellでサクサクChrome Extension開発

Chrome Extensionの開発中における、
```ファイル修正 ⇒ 拡張機能ページ開く ⇒ リロード ⇒ 確認```
の手間を軽減。ファイル更新を検知して自動更新を実現します。意外と手間なんですよね。

**Mac環境用です** 

### 必要なもの

* Extensions Reloader
    * https://chrome.google.com/webstore/detail/extensions-reloader/fimgfedafeadlieiabdeeaodndnlbhid
* guard-shell
    * https://github.com/guard/guard-shell

### 手順

#### Extensions Reloader インストール

インストールされているExtensionを一括リロードしてくれるChrome Extensionです。[Chrome WebStore](https://chrome.google.com/webstore/detail/extensions-reloader/fimgfedafeadlieiabdeeaodndnlbhid)からインストール。

ツールバーのボタンを押すか、```http://reload.extensions```を開く事でExtensionがリロードされます。

#### guard-shell インストール

ファイルシステムを監視してくれるgem、Guardのプラグインです。Ruby1.9.2以上が必要です。

ここではbundle installします。

Gemfile

```rb
source "https://rubygems.org"

gem 'guard-shell'
```

#### Guardfileを作る

```shell-session
$ bundle exec guard init shell
```

Guardfileのサンプルファイルが生成されます。これを下記のように修正

Guardfile

```rb
guard :shell do
  watch /(js|html)$/ do
    `open -g http://reload.extensions`
  end
end
```

監視対象のファイルは、Guardfileのwatchの部分に指定します。

#### guardを起動する

```shell-session
$ bundle exec guard
```

この状態でファイルを変更すると、自動でExtensionがリロードされます。benry!
Rhino.Mocks使ってみたメモ

通信に関わる部分だけStubにしてテストしたいなぁと思ってRhino.Mocks使ってみたメモ。
参考：[#123 Rhino.Mocksを使ってみた « C# « a wandering wolf](http://blog.livedoor.jp/gab_km/archives/1487387.html)
Stubにしたいメソッドをvirtualにして

```csharp
Hoge target = MockRepository.GeneratePartialMock<Hoge>();
target.Stub(x => x.スタブにしたいメソッド(想定する引数)).Return(欲しい戻り値);
```

ってするだけ。これで引数がヒットした時だけStubになって欲しい戻り値が得られる。
JavaScriptの暗黙の型変換の例

#JavaScriptの暗黙の型変換の例

##JavaScriptの等価演算子
JavaScriptには、2種類の比較方法があります。

* `等価演算子(==)`  暗黙の型変換をして比較する
* `厳密等価演算子(===)` オペランド同士を型変換することなく、型や値を厳密に比較する

```lang:JavaScript
console.log(1 == '1'); // true
console.log(1 === '1'); //false 
```

上記の`等価演算子`による比較の例では、
暗黙的に型変換されて、trueがreturnされます。

それに対して、`厳密等価演算子`による比較の例では、
数値型の1と文字列型の1として比較するため、falseがreturnされます。

>ちなみにJavaScriptには5つの基本型があります。
・ 文字列型
・ 数値型
・ ブーリアン型
・ null型
・ undefined型

##暗黙の型変換の例

JavaScriptの暗黙の型変換によって
以下の例はすべてtrueになります。

```
0 == '' //true
0 == '0' //true
0 == false //true
1 == true // true
0 >= null //true
null == undefined // true
```

##暗黙の型変換によって起こること

###■文字列値やブーリアンの型変換

```
> 1 + '1'
> 11
```

```
> 1 + true
> 2
```

###■オブジェクト型のインスタンスの型変換

```lang:JavaScript
var s1 = new String("JavaScript");
var s2 = new String("JavaScript");

//文字列の内容は同じだが、参照先のオブジェクトが異なるためfalse
s1 == s2; // false
s1 === s2; // false

//ここで +'' すると…
//暗黙の型変換により、文字列値どうしの比較になるためtrue
s1 + '' == s2 + ''; //true
s1 + '' === s2 + ''; //true


```


といった挙動をするのがJavaScriptです。
Mac OS X Mavericksでjubatusをインストールするまでの手順


gw_さんコメントありがとうございます。
自分がまとめたインストール方法は、古い対処法となってしまいました。

対応いただいたということで、brewでぶっこませていただきましょうm(__)m


``` bash
# gw_さんのコメントより
brew tap jubatus/jubatus
brew install jubatus
```

--

下記非推奨

公式に、brewでいれろって書いてたので、
```brew tap jubatus/jubatus && brew install jubatus```しても、
インストールできなかったので調査してみた。


とりあえず、ライブラリのインストール

``` bash
brew install libtool msgpack glog pkg-config oniguruma mecab
brew install -v --c zookeeper
```


issueに書いてたインストール手順流したらいけた。

>参考: support for 10.9 (Mavericks) · Issue #11 · jubatus/homebrew-jubatus https://github.com/jubatus/homebrew-jubatus/issues/11


```bash
cd /usr/local/src/
git clone https://github.com/gwtnb/jubatus-mpio.git
git clone https://github.com/gwtnb/jubatus-msgpack-rpc.git
git clone https://github.com/gwtnb/jubatus.git

# jubatus-mpio
cd jubatus-mpio
git checkout -b libc++11 origin/libc++11
./bootstrap
CXXFLAGS=-std=gnu++11 ./configure --prefix=$HOME/local
make -j
make install
cd ..

# jubatus-msgpack-rpc
cd jubatus-msgpack-rpc
git checkout -b libc++11 origin/libc++11
cd cpp
./bootstrap
CXXFLAGS="-std=gnu++11" ./configure --prefix=$HOME/local --with-jubatus-mpio=$HOME/local
make -j
make install
cd ../..

# jubatus
cd jubatus
git checkout -b libc++11-0.5.3 origin/libc++11-0.5.3
CXXFLAGS="-std=gnu++11 -I$HOME/local/include" LDFLAGS="-L$HOME/local/lib" ./waf configure --enable-zookeeper --prefix=$HOME/local
./waf
./waf install
```


最後に環境変数追加し、動作確認

```bash
export PATH=$PATH:$HOME/local/bin

jubaclassifier -f ~/local/share/jubatus/example/config/classifier/pa.json
I0509 16:41:30.883137 2065683216 server_util.cpp:322] starting jubaclassifier 0.5.3 RPC server at 192.168.54.77:9199
...
```

テストしてないし推奨できないって、issueでオーナーが書いてたけど、実行できたのが確認できた。


あとは、チュートリアルで遊んでみよう。
チュートリアル — Jubatus http://jubat.us/ja/tutorial.html
key-value 形式のデータをシェルコマンドでランキング集計する

# key-value 形式のデータをシェルコマンドでランキング集計する

別にそんなランキングが好きってワケでもないのだけど、
`sort`と`uniq`と`awk`でいけそうなので試してみた。

## 元のファイル

```text:scores.txt
user_1 2
user_2 4
user_3 3
user_4 5
user_5 5
user_6 10
user_7 10
user_8 2
user_9 5
user_10 9
user_11 1
user_12 10
user_13 5
user_14 3
user_15 10
user_16 3
user_17 8
user_18 8
user_19 6
user_20 8
```

## 値で降順ソート

```bash:bash
cat scores.txt | sort -n -k2 -r
```

```text:output
user_7 10
user_6 10
user_15 10
user_12 10
user_10 9
user_20 8
user_18 8
user_17 8
user_19 6
user_9 5
user_5 5
user_4 5
user_13 5
user_2 4
user_3 3
user_16 3
user_14 3
user_8 2
user_1 2
user_11 1
```

## ランク付け

```bash:bash
echo -e "rank\tscore\t同一値が何件あるか"
echo "---------------------------------"
cat scores.txt | sort -n -k2 -r | uniq -c --skip-fields=1 | awk 'BEGIN {rank=1} {print rank "\t" $3 "\t" $1; rank += $1}'
```

```text:output
rank	score	同一値が何件あるか
---------------------------------
1	10	4
5	9	1
6	8	3
9	6	1
10	5	4
14	4	1
15	3	3
18	2	2
20	1	1
```

## 用途とか

DBから吐き出したデータ流し込んでみたり。
1万件程度ならたぶん一瞬で終わるはず。

手元のmac book airだと50万件で5secくらいだった。

```bash:bash
$ echo "select user_id, some_value from some_scores" | mysql -N > output
$ wc output
  560064 1120128 7120489 output
$ time cat output | sort -n -k2 -r | uniq -c --skip-fields=1 | awk 'BEGIN {rank=1} {print rank "\t" $3 "\t" $1; rank += $1 }'
1       15931976        1
2       12639996        1
3       12243584        1
4       10977612        1
5       10884615        1
6       10373565        1
7       10055521        1
8       10042108        1
9       9980887 1
10      9505452 1

-- 略 --

real	0m5.271s
user	0m3.688s
sys	0m0.094s
```

ちなみに実際は`gsort`と`guniq`と`gawk`でやってます。例によってmacなので。
リアル女子大生とペアプロできないのはどう考えても俺が悪い 第一話

とりま超ナイーブバージョン

```rb
($mx,$my) = gets.split(" ").map(&:to_i)

$mem = []
$mx.times do
   $mem << gets.chomp.bytes.map(&:chr).map(&:to_i)
end

def count(x,y)
  k = 0
  $mx.times do |i|
    $my.times do |j|
      if $mem[i][j] == 0
        k += 1 if drawable(i,j,x,y) 
      end
    end
  end
  puts k
end

def drawable(mx,my,x,y)
  return false if mx + x > $mx
  return false if my + y > $my
  x.times do |i|
    y.times do |j|
      return false if $mem[mx + i][my + j] == 1
    end
  end
  return true
end

widgets = gets.to_i

widgets.times do
  count(*(gets.split(" ").map(&:to_i)))
end

```

テスト4でタイムアウト。42点。

http://paiza.jp/poh/paizen/result/b07f02f7524397b7a3eb635409fa15bf
Mackerelつかってみた

こっそりMackerel使ってみてます。

### すてき

- グラフがきれい
- agentの負荷がすごく少ない
- タイムゾーンが日本w
- 今後Azureとかつかうことになっても同じRoleで監視できる

### いまいち

- マルチコアのときにCPUの使用率表記が100%を越える
- メモリのグラフが利用率じゃなくて絶対値(xGByte利用)
- 使ってるポートどこ('ω'三'ω')
- サーバにroleを与えるのがいまのとこ手動だけっぽい?

Mackerelは手軽さがうれしいと思いました。
今後の機能追加にも期待です。
最終的にいくらで使えるのかもきになります。
git revertした後にマージ漏れが発生することがある

（わりと特殊な状況だと思うけど・・・）
安易なgit revertによる事故に遭遇したので備忘録をつける。

## 現象
開発ブランチをメインブランチにマージして、バグってたのでメインブランチをgit revertした。
その後、開発ブランチでバグを修正してメインブランチにマージし直したら、マージされないファイルが出た。

## 原因
git revertで戻したファイルが、それ以降の開発ブランチで編集されていなかったため、マージ対象にならなかった。

### こんな状況
my-featureでXXX.rbとYYY.rbを編集してマージした状態

```
*   commit 9965401bafd800bec9ea0ce8fa75d8d0d5c8af25
|\  Merge: 3d7c60f cf474a6
| |
| |     Merge branch 'my-feature'
| |
| * commit cf474a61754a26e0ca053aeaff21a990fa3ff780
|/
|       開発コミット

M       XXX.rb
M       YYY.rb
|
* commit 3d7c60fd8127b32f96785093e17334a059cfc0e3
```

バグってたことが発覚したのであわててrevert

```
* commit b855c5e9ebee1117e33c0689309ba613d21c8dfe
|     Revert "Merge branch 'my-feature'"
|
|     This reverts commit 9965401bafd800bec9ea0ce8fa75d8d0d5c8af25, reversing
|     changes made to 3d7c60fd8127b32f96785093e17334a059cfc0e3.

M       XXX.rb
M       YYY.rb
|
*   commit 9965401bafd800bec9ea0ce8fa75d8d0d5c8af25
|\  Merge: 3d7c60f cf474a6
| |     Merge branch 'my-feature'
| |
| * commit cf474a61754a26e0ca053aeaff21a990fa3ff780
|/
|       開発コミット

M       XXX.rb
M       YYY.rb
|
* commit 3d7c60fd8127b32f96785093e17334a059cfc0e3
```

"そのままの状態で"my-featureで作業を継続。ZZZ.rbを修正しないといけなかったので対応してマージしなおした。

```
*   commit 724e3feb28195e61ca179784fea226106f8bf4fd
|\  Merge: b855c5e 11ac0c1
| |
| |     Merge branch 'my-feature'
| |
| * commit 11ac0c10984ee49515ac5077d386ef671be4547f
| |
| |     修正漏れ対応

M       ZZZ.rb
| |
* | commit b855c5e9ebee1117e33c0689309ba613d21c8dfe
| |
| |     Revert "Merge branch 'my-feature'"
| |
| |     This reverts commit 9965401bafd800bec9ea0ce8fa75d8d0d5c8af25, reversing
| |     changes made to 3d7c60fd8127b32f96785093e17334a059cfc0e3.

M       XXX.rb
M       YYY.rb
| |
* |   commit 9965401bafd800bec9ea0ce8fa75d8d0d5c8af25
|\ \  Merge: 3d7c60f cf474a6
| |
| |       Merge branch 'my-feature'
| |
| * commit cf474a61754a26e0ca053aeaff21a990fa3ff780
|/
|       開発コミット

M       XXX.rb
M       YYY.rb
|
* commit 3d7c60fd8127b32f96785093e17334a059cfc0e3
```

この時点でmy-featureの作業が全部マージされた気になるが、実際はZZZ.rbの修正分しかマージされていない(XXX.rbとYYY.rbの変更分はすでにマージ済みなので)

## 解決方法
- 開発ブランチを使い続けるときは、開発ブランチでrevertするなり、対応を直接入れるなりしてマージする
- メインブランチにrevertを当てた場合は、開発ブランチを切り直して最初からやり直す
 - rebaseしても同じかな
matplotlib (+ pandas) によるデータ可視化の方法 (5)

[前回](http://qiita.com/ynakayama/items/e37c222771db53a0e629)まで延々と続いていたデータ可視化の話も今回で最終回です。

## 散布図

前回と同様 pydata-book のデータを利用します。

pydata-book/ch08/macrodata.csv
https://github.com/pydata/pydata-book/blob/master/ch08/macrodata.csv

```py3
import numpy as np
from pandas import *
import matplotlib.pyplot as plt

# CSV データを読み込む
macro = read_csv('macrodata.csv')

# いくつかの列をピックアップする
data = macro[['cpi', 'm1', 'tbilrate', 'unemp']]

# .diff() メソッドは値をひとつ前の行からの差分に変更する
# 先頭が NaN になるので .dropna() メソッドで取り除く
trans_data = np.log(data).diff().dropna()

# trans_data は前行からの変化を示すデータセットになる
# 最後の 5 行を表示
print( trans_data[-5:] )
# =>
#           cpi        m1  tbilrate     unemp
# 198 -0.007904  0.045361 -0.396881  0.105361
# 199 -0.021979  0.066753 -2.277267  0.139762
# 200  0.002340  0.010286  0.606136  0.160343
# 201  0.008419  0.037461 -0.200671  0.127339
# 202  0.008894  0.012202 -0.405465  0.042560

# 2 つの列から散布図をプロッティング
plt.scatter(trans_data['m1'], trans_data['unemp'])

plt.show()
plt.savefig("image.png")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/d58fdd15-276c-99b6-0b5f-cc7ce833b5b4.png)

## 散布図行列

一連の変数のすべてのペアを散布図にしたのが[散布図行列](http://www.okada.jp.org/RWiki/?%A5%B0%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF%A5%B9%BB%B2%B9%CD%BC%C2%CE%E3%BD%B8%A1%A7%BB%B6%C9%DB%BF%DE%B9%D4%CE%F3)です。 scatter_matrix 関数でこれを作成することができます。

```py3
# 散布図行列を生成
from pandas.tools.plotting import scatter_matrix
scatter_matrix(trans_data, diagonal='kde', color='k', alpha=0.3)

plt.show()
plt.savefig("image2.png")
```

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/d954bef4-82f2-098a-03ab-c4e89f031a62.png)

任意の 2 つの 1 次元データの相関を見るとき、シンプルで強力な方法として役立ちます。

## 参考

Pythonによるデータ分析入門――NumPy、pandasを使ったデータ処理
http://www.oreilly.co.jp/books/9784873116556/
PHPテンプレートエンジンを10行で自作する

【追記】
**続編の記事<a href="http://qiita.com/yasumodev/items/5e1b2ca5dbc4921a52f3" target="_blank">「続・PHPテンプレートエンジンを10行で自作する」</a>では、extract() を使用しない、よりシンプルな方法でまとめています。**

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) はじめに

PHPのテンプレートエンジンといえばSmarty（最近ではTwig？）が有名ですが、Smartyの文法や作法をひと通り覚え、それに従う必要があります。しかし、もともとPHPには `<?php echo "Hello!"; ?>` というふうに、HTMLへの埋め込み表示機能がありますので、これとinclude文を利用すると、テンプレート表示の仕組みは10行ほどで作れてしまいます。自作テンプレートだとPHPの知識だけで事足りますので、新しいことを覚える必要はありません。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) WEB上のファイル構成

```
Webフォルダ
|
+-- class/
|   |
|   +-- MyTemplate.class.php
|
+-- template/
|   |
|   +-- sample.tpl.html
|
+-- sample.php
```

全部で３ファイルです。上のファイルから順に解説します。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) 10行テンプレートエンジン

```php:class／MyTemplate.class.php（UTF-8）
<?php
class MyTemplate
{
	function show($tpl_file_path)
	{
		extract((array)$this);
		include($tpl_file_path);
	}
}
?>
```

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) サンプル画面テンプレートファイル

```html:template／sample.tpl.html（UTF-8）
<html>
<meta charset="utf-8">
<h1>店名：<?php echo $name; ?></h1>
<hr>
<ul>
<?php for($i=0; $i<count($foods); $i++){ ?>
	<li><?php echo $foods[$i]; ?></li>
<?php } ?>
</ul>
</html>
```

このテンプレートファイルは`include文`で読み込まれるため、お使いのサーバーによっては拡張子を`.php`とする必要があります(コメント欄参照)。さくらレンタルサーバーやさくらVPSでは、`.html`のままでも問題ありません。

ただ、拡張子が`.html`のままだとブラウザーでソースが表示されてしまいますので、留意しておく必要があります。

あと、テンプレートファイル内のPHP処理を `for(): ～ endfor` などの代替構文で書く場合もあります。可読性が良くなる反面、「テンプレートは代替構文で」というルールが１つ増えてしまいますので、一長一短ではあります。そこはお好みでどうぞ。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) サンプル画面実行ファイル

```php:sample.php（UTF-8）
<?php
include("class/MyTemplate.class.php");
$tpl = new MyTemplate();
$tpl->name  = '悟空軒';
$tpl->foods = array('ラーメン', '餃子', '焼き飯', '麻婆豆腐');
$tpl->show('template/sample.tpl.html');
?>
```

### ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/ee230923-b0a1-2694-397f-5da0f854a844.png)参考URL

- <a href="http://qiita.com/yasumodev/items/5e1b2ca5dbc4921a52f3" target="_blank">続・PHPテンプレートエンジンを10行で自作する</a>
- <a href="http://yusei-game.jp/yusei/yuseiki/PHP%E6%9C%80%E5%B0%8F%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3">PHP最小のテンプレートエンジン</a>
- <a href="http://www.webcyou.com/?p=1835">html 拡張子のまま php の include 使用｜ウェブ帳</a>

(･o･ゞ いじょー。
git commitの度にコミットメッセージを再生する（Mac）


Macではsayコマンドで音声合成を再生することができますので、それを利用します。

リポジトリのあるディレクトリで

> $ vim .git/hook/post-commit

```
#!/bin/zsh
 
git log -1 HEAD --pretty=format:%s | read _msg
 
/usr/bin/say -v "Kathy" "$_msg"
```

> $ chmod +x .git/hook/post-commit

とします。そして、

> $ git commit -am "Hello"

のようにコミットすると「Hello」と合成音声で再生されます。


'Kathy'は英語しか話してくれないので、日本語が混じっているとうまく再生されません。
日本語のときは、'Kyoko' にします。
FuelPHPの複数環境切り替えとはまった所

公式ドキュメントにすべてが書いてます。
http://fuelphp.jp/docs/1.7/general/environments.html  (日本語訳)

##用意されている環境

DEVELOPMENT
PRODUCTION
STAGING
TEST

デフォルトではDEVELOPMENTの環境として動作している。環境を変えると、動作時に読み込むconfigが変わります。

```php
fuel/app/config/development //develop環境時のみ読み込み
               /production  //production環境時のみ読み込み
               /staging  // staging環境時のみ読み込み
               /test  // test環境時のみ読み込み
```

テスト環境と本番環境で、読むconfigを変えたい場合に使います。
特に使うのはDB周りの設定です。

#設定方法
PRODUCTION環境で動くように設定を変更する例です。

##方法A bootstrap.phpの書き換え
bootstrap.phpを書き換える事で環境切り替えができます

```php:fuel/app/bootstrap.php
/**
 * Your environment.  Can be set to any of the following:
 *
 * Fuel::DEVELOPMENT
 * Fuel::TEST
 * Fuel::STAGING
 * Fuel::PRODUCTION
 */
//Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::PRODUCTION);
```

が、gitとかでソースを管理してると面倒です。
個人的には次の方法Bの方がいいと思います。

##方法B Apacheで環境変数を設定

Apacheの設定で環境変数を指定します。開発環境と本番環境のソースを同じにできるので、こっちの方がおすすめです。

```apache:httpd.confのvirtualhost例
<VirtualHost *:80>
    DocumentRoot /home/fuel/public
    ServerName example.com
    SetEnv FUEL_ENV production
</VirtualHost>
```

何らかの原因で本番環境時に環境変数が取れなかった時を考えて、本番環境時にはbootstrap.phpも編集して、デフォルトでPRODUCTION環境で動くようにしておくのがよいのではないかと思います。

#oilコマンドでの指定

例えばPRODUCTIONの環境で動かしたい場合は以下のようにoilコマンド前に```FUEL_ENV```を入れます。

```
FUEL_ENV=production php oil refine migrate
```

#はまった所

FuelPHPのバージョン1.3くらいまでApacheやoilでの環境変数の指定は大文字だったが、1.6以降ぐらいからは小文字での指定になってました。

```
SetEnv FUEL_ENV PRODUCTION
```

これはダメで

```
SetEnv FUEL_ENV production
```

これだとOKです。
地味にはまりました。
Smarty再入門

**Smartyを数年ぶりにさわってみたので要点をメモ。**

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) はじめに

SmartyはPHPテンプレートエンジンでは一番有名なやつです。（ただ、別記事にも書いてますが、Smartyもどきは10行ほどで簡単に自作できます）
http://qiita.com/yasumodev/items/049c41a2f90db935503c

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) 導入手順

まずはインストール…というか、導入方法は色々あるようですが、php.ini 設定不要のアップロードするだけでOKなやり方でいきます。

ダウンロードはここから。
http://www.smarty.net/download

１）Latest Stable Release にある Smarty-3.1.18.zip をダウンロード。

２）解凍すると、libsフォルダがあるのでそれをそのままアップ。

３）フォルダ構成は下記の通り。

```
|-libs
|    |-Smarty.class.php
|    |-SmartyBC.class.php
|    |-plugins
|    |-sysplugins
|    |-debug.tpl
|
|（以下は、自力で作成）
|
|-templates_c
|-templates
|    |-hello.tpl
|
|-hello.php
```

４）libsフォルダと同じ階層に次の２フォルダ作成。
　templates_c、templates
　（ひとまずパーミッションは777で…。）

５）hello.tpl を作成し、構成図の場所にアップ。


```html:hello.tpl（UTF-8）
<html>
<meta charset="utf-8">
こんにちは、{$Name}さん。
<ul>
{foreach from=$Fruits key=key item=item}
    <li>{$key}: <b>{$item}</b></li>
{/foreach}
</ul>
</html>
```

６）hello.phpを作成し、構成図の場所にアップ。

```php:hello.php（UTF-8）
<?php
require './libs/Smarty.class.php';
$smarty = new Smarty();
//// 下記２フォルダの相対位置が変わるなら明示的に指定
//$smarty->setTemplateDir('./templates/');
//$smarty->setCompileDir('./templates_c/');
$smarty->assign("Name", "果物屋");
$smarty->assign("Fruits", array("みかん", "りんご", "バナナ"));
$smarty->display('hello.tpl');
?>
```

７）あとはブラウザから hello.php にアクセスして確認。

(･o･ゞ いじょー。
続：今さらだけどIntelliJ IDEAで使えるJavaのブレークポイントあれこれ

以前、IntelliJ IDEAでJava開発するときに使える基本的なブレークポイントについて紹介しました。

* [今さらだけどIntelliJ IDEAで使えるJavaのブレークポイントあれこれ](http://qiita.com/oohira/items/825ef5f252d0fd2e752f)

今回は、そのときに力尽きて書けなかった「条件付きブレークポイント」機能について紹介したいと思います。条件付きブレークポイントを使うと、ブレークポイントで実行中断する条件をより柔軟に制御できるようになります。毎日使うような機能ではありませんが、いざというときに知っておいて損はないと思います。

* 条件式が成立したときだけストップ
* 一定回数ごとにストップ
* 別のブレークポイントにヒットした後でストップ
* ストップせずにログ出力

## 条件式が成立したときだけストップ

繰り返し実行される処理にブレークポイントを設定するときに、毎回無条件でストップするのではなく、ループカウンタの値やノードの種類が特定の条件（ex. `i == 50`, `nodeType != ELEMENT_NODE` ）を満たしたときだけストップさせたいことがあります。

このような場合には、ブレークポイントの [Edit] - [Condition] に任意の条件式を指定してやることで望みの結果を得ることができます。

![bp1.png](https://qiita-image-store.s3.amazonaws.com/0/33668/efc1e248-8bd8-923f-56b2-b42222a6a8d8.png)

![bp2.png](https://qiita-image-store.s3.amazonaws.com/0/33668/f07972da-02e7-2504-78ca-ff60750e0f17.png)

上の例では、`i < 50` の間はブレークポイントにヒットせず実行が続き、 `i == 50` になったときに初めて実行が中断されます。また、[Condition] は真偽値を返す式であれば自由に指定できるので、次のような式も設定できます。この例では、 `i == 11` のときに条件式が成立して実行中断されます。

![bp3.png](https://qiita-image-store.s3.amazonaws.com/0/33668/3647df25-104a-376f-e4d8-373846a781f0.png)

## 一定回数ごとにストップ

先ほどのループカウンタと似た例として、偶数回目だけ実行を中断したり、10回ずつ実行を中断したり、と一定回数ごとに処理をストップさせたいときに使えるのが、[Pass count] 設定です。ブレークポイントの [Edit] - [More] から詳細設定ダイアログを表示することで指定できます。

![bp4.png](https://qiita-image-store.s3.amazonaws.com/0/33668/0fce4e92-7630-ceeb-3b40-8d8db95f2521.png)

上の例では、`i == 15`, `i == 30`, `i == 45`, ... と15回目ずつストップします。ちょうど「FizzBuzz」と出力するときですね。

## 別のブレークポイントにヒットした後でストップ

使い道がなさそうでたまに役立つのが、ブレークポイントに依存関係をもたせる機能です。ブレークポイントの詳細設定ダイアログで、[Disable until selected breakpoint is hit] に先行する他のブレークポイントを指定してやると、そのブレークポイントがヒットするまでは後続のブレークポイントも無視されます。

![bp5.png](https://qiita-image-store.s3.amazonaws.com/0/33668/b5dd53b4-9052-841b-a6f4-d046cee069e7.png)

上の例では、`i == 50` のときに5行目のブレークポイントへ初めてヒットし、このタイミングで10行目のブレークポイントが有効になります。そして、`i == 55` になったときに10行目のブレークポイントで処理が中断されることになります。

実際の利用シーンとしては、例えば外部公開している3つのメソッドA, B, Cが内部処理としては共通のメソッドXを使っている場合に、B → Xという経路で呼び出された場合だけ実行中断してデバッグするような場合に使えます。

## ストップせずにログ出力

単にブレークポイントでストップさせるのではなく、特定の式を評価してログ出力させることもできます。文字列を返すような式であれば自由に設定できるので、デバッグ情報をログ出力しておいてあとで全体の出力を確認しながらデバッグしたいときには便利かもしれません。とはいえ、私はほとんど使ったことはないのですが…

![bp6.png](https://qiita-image-store.s3.amazonaws.com/0/33668/d34fc8d9-1f11-0d26-8d8d-5b9f8f535199.png)

## まとめ

IntelliJ IDEAでJava開発する際に使えるブレークポイント機能について、より詳細に停止条件を制御するテクニックをいくつか紹介しました。スクリーンショットを見ていただければ分かる通り、本当はインスタンスIDやクラスの種類で絞り込む機能もあるのですが、サンプルコードを考えるのが面倒だったので今回は割愛させていただきました。

このあたりのブレークポイントの知識は、知らなくてもさほど日々の開発には影響がありませんが、知っているとデバッグ効率が上がると思いますので、ぜひ活用していただければと思います。
SourceTreeにsubversionリポジトリをインポートしようとした時に発生したエラーと対処

## 1つ目
### エラーの内容

```text
abort: no compatible bindings available:
 
Subversion 1.5.0 or later required, but no bindings were found
Subvertpy 0.7.4 or later required, but not found
 
Please install either Subvertpy or the Subversion Python SWIG bindings!
```

### 対応
subversionを--with-pythonオプション付きで再インストール

```bash
brew reinstall --with-python subversion
```

## 2つ目
### エラーの内容

```text
svn: E200019: ra_serf was compiled for serf 1.3.4 but loaded an incompatible 1.2.0 library
```

### 対応
古いバージョンを削除

```bash
brew remove serf
```

## 3つ目
### エラーの内容

```text
Fatal Python error: PyThreadState_Get: no current thread
```

### 対応
brewなどでインストールしたpythonを削除する

```bash
brew remove python
```

## 参考にしたページ
https://confluence.atlassian.com/pages/viewpage.action?pageId=285840840
https://groups.google.com/forum/#!topic/gurobi/ythYdXB0ntc
移動時に途切れないmapのfade

#現象
mapにareaが複数あるとき、隣接していてもIEでは移動時にmouseoutとmouseoverが起きてしまう。

```html
<!--html-->
<img src="http://jsrun.it/assets/o/l/f/d/olfdl.gif" alt="" usemap="#link"><!--画像-->
<map name="link">
    <area shape="rect" coords="0,0,137,100" href="http://google.co.jp" alt="Google"><!--area1-->
    <area shape="rect" coords="138,0,275,100" href="http://yahoo.co.jp" alt="Yahoo"><!--area2-->
</map>
```

```js
//js
$('map').hover(function(){
    $('img[usemap="#' + $(this).attr('name') + '"]').fadeTo(100,0.3);
},function(){
    $('img[usemap="#' + $(this).attr('name') + '"]').fadeTo(100,1);
});

```

#解決策

.stop()を追加する

```js
$('map').hover(function(){
    $('img[usemap="#' + $(this).attr('name') + '"]').stop().fadeTo(100,0.3);
},function(){
    $('img[usemap="#' + $(this).attr('name') + '"]').stop().fadeTo(100,1);
});
```


デモ：
http://jsdo.it/Ituki/9mXA
属性セレクタの優先度

# はじめに

CSSのセレクタによって、どちらのスタイルの指定が優先されるのかにはルールがあります。
「id > class > 要素名」の順に優先されます。

例えば、

```html
<!doctype html>
<style>
  #bar { color: red; }
  .foo { color: green; }
  p    { color: blue; }
</style>
<p class=foo id=bar>TEST
```

このような、HTMLの場合、「TEST」の文字は赤く表示されます。
ここまでは基礎なのでたぶん誰でも知ってると思います。

# 属性セレクタ

CSS3から属性セレクタというものが使えます。
`elemName[attrName=attrValue]`のようなやつです。

今までは、属性セレクタで優先順位は変化しないものだと勝手に思っていました。
実際に書いてみたところ、

```html
<!doctype html>
<style>
  .foo      { color: red; }
  [data-my] { color: blue; }
</style>
<p class=foo data-my=bar>TEST
```

このHTMLでは「TEST」の文字が青く表示されます。
どうやら、属性セレクタの優先順位は`class`の指定と同じなんですね。

# 仕様

[仕様](http://www.w3.org/TR/css3-selectors/#specificity)を調べてみたら、普通に書かれてました。当然ですよね。
（それにしても、仕様にあるidは100倍、classは10倍の例えは間違っているので、いい加減修正すべきだと思う）

> - count the number of ID selectors in the selector (= a)
- count the number of class selectors, attributes selectors, and pseudo-classes in the selector (= b)
- count the number of type selectors and pseudo-elements in the selector (= c)
- ignore the universal selector

1. IDセレクタ
2. classセレクタ、属性セレクタ、疑似クラスセレクタ
3. 要素名セレクタ（この名称でいいのかな）、疑似要素セレクタ

の順ですね。
C/C++のコンパイルについてメモ


コンパイル周りについてまだまだ理解が浅いので、色々とメモしていきます。（随時更新予定）

## gccコマンドのオプションメモ

* -I インクルードファイルを検索するパスを指定
* -L ライブラリを探すパスを指定
* -l リンクしたいライブラリ名を指定
	* `libhoge.a`と、`lib`を接頭辞として付ける
	* `-lhoge`と、`lib`を抜いて指定する



### includeパスをコマンドラインオプションで指定する場合

```shell
gcc -o sample -I/usr/local/hoge main.c
```

再帰的には読み込まないので、指定したディレクトリ以下がさらにディレクトリで分かれている場合は、`#include <hoge/fuga.h>`のようにパスを指定する必要あり。


### ライブラリパスをコマンドラインオプションで指定する場合

```shell
gcc -o sample -L/usr/local/lib/hoge -lfoo -lbar main.c
```

ライブラリ検索パスに`/usr/local/lib/hoge`を追加し、さらにそこからふたつのライブラリ`libfoo.a`、`libbar.a`を読み込む指定。

### ライブラリの読み込みで実行時エラーが出る場合

例えばこんなエラー。

```shell
dyld: Library not loaded: /usr/local/lib/libpng15.15.dylib
  Referenced from: /usr/local/Cellar/opencv/2.4.7.1/lib/libopencv_highgui.2.4.7.dyl
```

動的にライブラリを読み込もうとしてエラーが出てるので、適切にライブラリをインストールするか、あるいはライブラリのパスを以下のように環境変数に設定して読み込めるようにしてあげる必要がある。

```shell
if [ -n "$DYLD_LIBRARY_PATH" ]; then
DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/Cellar/opencv/2.4.7.1/lib
else
DYLD_LIBRARY_PATH=/usr/local/Cellar/opencv/2.4.7.1/lib
fi
export DYLD_LIBRARY_PATH
```

- -O2

`-O2`は最適化のレベルを指定するオプションです。（OptimizeのO？）
（レベルは0〜3があるようです）

-------------------------------------------

## インクルードパス、ライブラリパスを追加する（for Mac）

以下のように、`CPATH`、`LIBRARY_PATH`環境変数にコロン`:`区切りで指定します。

```console
export CPATH=$CPATH:/usr/local/include
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
```


---------------------------

## アーカイブファイルを作る - `ar`コマンド

```shell
ar -rcs libhoge.a foo.o bar.o
```

`foo.o`、`bar.o`オブジェクトファイルを、`libhoge.a`ファイルにアーカイブする。

* -r ... すでに.aファイルがある場合に上書きする
* -c ... フィードバックなしにアーカイブを作成する
* -s ... `.a`ファイルの先頭にインデックスを作成するよう指示



## 参考リンク

* [GCCコマンド・オプション](http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html)
atomをUbuntuにPPA経由でインストールする

# 追記!!
この記事を書いた時点では公式のパッケージはありませんでしたが、現在はGithub上の[リリースページ](https://github.com/atom/atom/releases)からUbuntu（Debian）用のパッケージが配布されているので、そちらを使用したほうがいいかもしれません。詳しくは以下のInstallingセクションを参考にしてください。

[atom/atom: The hackable text editor](https://github.com/atom/atom)

PPAの方もメンテナンスされており以下の内容も有効なので、お好きな方法でいいかと思います。

---

GitHub製のエディタとして話題になっているatomですが、バイナリはMac用しかありません。
しかしUbuntu用にPPAでインストールできるようになっていました。
詳細はここに書いてる通りです。

[Install Atom Text Editor In Ubuntu Via PPA ~ Web Upd8: Ubuntu / Linux blog](http://www.webupd8.org/2014/05/install-atom-text-editor-in-ubuntu-via-ppa.html)

# 注意点

* 64bitのUbuntu(14.04、13.10、12.04)にしか入らない
* 最初の起動時にコケることがあるから、その場合はもう一度起動すること。

# インストール手順

```bash
sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom
```

インストール後はdashからatomで検索すれば普通に実行可能でした。

# 感想

Sublime Textにそっくりですね。ちょっと触っただけですが、良さそうです。
Sublime TextだとUbuntuからの日本語入力が辛い部分がありましたが、
atomは問題なく入力可能でした。
list()は最も右のパラメータから値を代入します

[PHP: list - Manual](http://www.php.net/manual/ja/function.list.php#refsect1-function.list-notes "PHP: list - Manual")
 
> list()は、最も右のパラメータから値を代入します。 

なので次のような結果になります。

```php
$arr = [1, [2, 3]];
list ($key, $arr) = $arr;
var_dump($key, $arr);
// int(2)
// array(2) {
//   [0] => int(2)
//   [1] => int(3)
// }
```

```php
$arr = [[1, 2], 3];
list ($arr, $key) = $arr;
var_dump($arr, $key);
// array(2) {
//   [0] => int(1)
//   [1] => int(2)
// }
// int(3)
```

最初のコードは次のコードと同じ opcode になります。

```php
$arr = [1, [2, 3]];
$arr = $arr[1];
$key = $arr[0];
var_dump($key, $arr);
```

が、そもそも `list ($key, $arr) = $arr` などというコードは違法でした。
 
> list() を実行して配列を変更 (`list($a, $b) = $b` など) した場合の挙動は未定義です。 

次のように配列のブラケットを array に書き換えて実行するとバージョンによって結果が異なり、

```php
$arr = array(1, array(2, 3));
list ($key, $arr) = $arr;
var_dump($key, $arr);
```

さらにバージョンによってはエラー制御演算子の有無で結果が変わります。

```php
$arr = array(1, array(2, 3));
@list ($key, $arr) = $arr;
var_dump($key, $arr);
```

- http://3v4l.org/X58Xf
- http://3v4l.org/Fkd21

---

> list()は、最も右のパラメータから値を代入します。～～、添字配列を使用している場合には、～～～。この配列の添字は逆の順番となります。 

という説明は恐らく次のようなコードに対するものでしょう。

```php
$arr = [1, 2, 3];
$axx = [];
list ($axx[], $axx[], $axx[]) = $arr;
var_dump($axx);
// array(3) {
//   [0] => int(3)
//   [1] => int(2)
//   [2] => int(1)
// }
```
Pebbleアプリのビルド＆インストール


iOSと連携部分を見たかったのでサンプルのweatherアプリを試してみる。iOSアプリはプロビジョニングファイルさえマッチすればビルドもインストールも問題ない。問題は、pebble側のアプリをどうやってビルドして、どうやってpebbleにインストールするかである。

この手のは使わないとすぐ忘れてしまうので、忘備録として残しておく。

##下記ページからSDKをインストールする
https://developer.getpebble.com/2/getting-started/using-examples/

    curl -sSL https://developer.getpebble.com/install.sh | sh && source ~/.bash_profile

とすると、ホームディレクトリにインストールされるはずです。もしインストール後に他のディレクトリに移動した場合は、pebbleコマンドのパスが通らなくなってしまうので、.bash_profile ファイルを開いていて移動先のパスに変更しておくこと。

##アプリをビルドしてインストールする
インストールしたいソースコードのディレクトリへ移動します

    cd /Users/misawa/Documents/Develop/pebble-dev/PebbleSDK-2.1.1/Examples/weather-demo/weather

こんな感じ。

##ビルドしてみる。

    pebble build

##デバイスにインストールする

    pebble install --phone 192.168.1.123

みたいにする。IPアドレスは、PebbleアプリのDeveloper Modeのところで確認できます。たまに、ネットワークが切り替わると通信できないので、Macと同じWiFiになっているか事前チェックするべし。
Apache Click Framework で tr要素にclassを指定する

[Apache Click](http://click.apache.org/)には [`Table`](https://click.apache.org/docs/click-api/org/apache/click/control/Table.html) クラスがあり、これを使うとレコードをHTMLテーブルで表示してくれる。

HTMLの生成はTableクラスが自動でやってくれる。
もし`tr`要素にclassを追加したい場合は、`Table`クラスを継承して`addRowAttributes`メソッドをoverrideする。

```java
public static class PersonTable extends Table {
  @Override
  protected void addRowAttributes(Map<String, String> attributes, Object row, int rowIndex) {
    if( row instanceof Person ) {
      Person person = (Person) row;
      if (person.isMan())
        attributes.put("class", "person-gender-man");
      else if (person.isWoman())
        attributes.put("class", "person-gender-woman");
    }
    super.addRowAttributes(attributes, row, rowIndex);
  }
}
```

なお、`class`属性を使うのが一般的なのでこっちでサンプルを書いたが、
実際には[カスタムデータ属性](http://www.w3.org/html/wg/drafts/html/master/dom.html#attr-data-*)を使ったほうが良いと思う。
`class`属性を使うと、自力で空白区切りで連結をしないといけないので。
HFTのtrading plantまわりの話


EnterpriseTechに載ってた記事、[Wall Streat Wants Tech to Trade Smarter And Faster](http://www.enterprisetech.com/2014/04/09/wall-street-wants-tech-trade-smarter-faster/)がおもろかったのでいくつか抜粋。

![写真はイメージです](http://2eof2j3oc7is20vt9q3g7tlo5xe.wpengine.netdna-cdn.com/wp-content/uploads/2013/09/new-york-stock-exchange-370x290.jpg)


## キューで上位30内に入れないと儲からない

```
If I can instead predict that I am going to be first in the queue 80 percent of the time, I think I can get there. A high frequency trader told me about a year ago that you have to consistently be among the top 30 in the queue, otherwise there is no way for you to make any kind of money. And only a few firms can afford to play at that level.
```

## 統計的アービトラージだけでなく、機械学習や予測分析も使われ始めた

```
So today, the big players are starting to use machine learning and predictive analytics not only to do statistical arbitrage, but to predict where they can get to the front of the queue before they execute a trade.
```

## でもそうした手法は大量データの事前処理が必要で、データが古くなりやすい。リアルタイム分析を実現したい

```
To do such trading takes a lot of data, of course, as Alex Tsariounov, principal architect of the London Stock Exchange, explained. There is a tremendous amount of post-market data that gets chewed on, and it often takes two days to run simulations and risk analysis against that data. “The problem is that by the time you make decisions, the data is slightly stale. So what we want to be able to do is real-time analysis on that data and make that data available essentially as a market feed to trading participants.”
```

## データを動かすコストが高い。だからNUMAが熱い

```
NUMA’s Revenge

Fadi Gebara, a senior manager at IBM Research, said that Wall Street firms were taking a hard look at shared memory systems. After analyzing code at financial services firms, IBM has figured out that a lot of what applications are doing is shuffling around bits rather than chewing on them and on a cluster of X86 servers you can, as he put it, “get MPI’d to death getting all of that communication going.”

“Data movement is very expensive,” Gebara continued. “Programs are moving data left and right and all over the place, and we have found that 80 to 90 percent of what the program is doing is moving data.”
```

## シンボルルーティングやリスク管理はラック単位スイッチで。100usで取引

![](http://2eof2j3oc7is20vt9q3g7tlo5xe.wpengine.netdna-cdn.com/wp-content/uploads/2014/04/juniper-hpc-bach-2.jpg)

```
The risk management is embedded in one set of top-of-rack switches, these kink out to the core switches, and the symbol routing that was done in the gateway is pushed into the top-of-rack switches out above the matching engine. The data pre-processing and post-processing is pushed down into the network interface cards on the servers in the matching engine. When this is all done, the trade plant has a 40 percent reduction in server count, to 60 machines, and only needs 1,000 ports instead of 1,500 ports, a 33 percent reduction. More importantly, the trades can execute in 100 microseconds, a 33 percent reduction.
```

----
Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡
MacでANEを使うアプリをデバッグする

Mac(のFlashBuilder 4.6)でANEを使うAIRアプリケーションをデバッグしようとすると、エラーになる問題を回避する方法です。

内容はquetwo氏のブログ http://quetwo.com/2011/12/03/working-with-air-native-extensions-on-the-mac/ の最後の段落です。

1. 検索パスにADLを含める。`/etc/paths`ファイルに`/Applications/Adobe Flash Builder 4.6/sdks/4.6.0/bin`の行を追加する。
    > Make sure you have ADL in your search path.  Edit the /etc/paths file and add a new line with /Applications/Adobe Flash Builder 4.6/sdks/4.6.0/bin

2. デスクトップや書類など検索可能なフォルダの中に新しいフォルダを作成し、.ANEファイルをコピーする。
    > Create a new folder on your desktop, Document folder, or somewhere where you will find it.  Copy your .ANE into it.

3. このフォルダの中に`MyTestANE.ane`という名前のフォルダを作成する。(`.ane`が含まれていることが重要)
(訳註)フォルダの名前は`.ane`で終わっていれば何でも良い様子。
    > Create a new folder within this folder, and name it MyTestANE.ane (make sure to include the .ane — that is very important)

4. 上の`.ane`フォルダで次のコマンドを実行する。
`unzip ../ArduinoConnector.ane`
(.ANEファイルの名前が`ArduinoConnector.ane`の場合)
    > cd into that new .ane directory, and execute the following command : unzip ..\ArduinoConnector.ane (assuming you named your .ane ArduinoConnector.ane)

5. プロジェクトのbin-debugフォルダで次のコマンドを実行する。
`adl -profile extendedDesktop -extdir ~/Documents/Extensions/ Main-app.xml`
(2.で文書フォルダの中に新しくExtensionsフォルダを作った場合)
    > Go into the bin-debug folder of your project, and run the following command : adl -profile extendedDesktop -extdir ~/Documents/Extensions/ Main-app.xml    assuming that the directory you created in the second step was named Extensions and was located in your Documents folder.

6. .ANEファイルを更新する必要がなければ、5.を繰り返せばよい。
デバッガやプロファイラをアタッチするには、[このブログの手順](http://stacyyoung.org/2007/01/30/how-to-connect-flex-builder-debug-session-to-standalone-swf/)に従う(ただし`http://localhost`の代わりに`about:blank`を使う)
    > You can repeat the last step as often as you need with no additional work, assuming you don’t need to update your .ane. If you need to attach the debugger / profiler , you can follow the steps outlined on this blog (but use about:blank instead of http://localhost)
@Assertで文字数制限をつける(MinLength] / MaxLength)

BEFORE
/**
*@Assert\MinLength(limit=2)
*@Assert\MaxLength(limit=100)
*/

AFTER
  /**
     * @Assert\Length(
     *      min = "2",
     *      max = "100",
     *      minMessage = "Your first name must be at least {{ limit }} characters length",
     *      maxMessage = "Your first name cannot be longer than {{ limit }} characters length"
     * )
     */