OmniAICreator/Qiita-1.07M huggingface dataset:
多次元配列をフラットな配列にするとき


タイトルまんまですけど、多次元配列をフラットにして処理していくということが続いたのでメモ。

flatten_array()とarray_flatten()ともに[PHPマニュアル](http://php.net/manual/ja/ref.array.php)から引っ張ってきたものを、クラスメソッドにするためにちょっといじってます。
結果はどっちも同じなので好きな方でどうぞ。（テストコードで一応簡単に調べてます）

```PHPマニュアルから
<?php
class arr{
	
	/**
	 * array_walk()のコールバック関数として使います
	 */
	public function flatten_array($value, $key, &$array) {
		if (!is_array($value))
			array_push($array,$value);
		else
			array_walk($value, array('self','flatten_array'), &$array); 
	}

	/**
	 * こっちは普通に呼ぶだけ
	 */	
	public static function array_flatten($arr){ //flattens multi-dim arrays (distroys keys)
		$flat_arr = array();
		if(!is_array($arr)) return $flat_arr;
		foreach($arr as $value){
			if(is_array($value)){
				$flat_arr = array_merge($flat_arr,self::array_flatten($value));
			}else{
				array_push($flat_arr,$value);
			}
		}
		return $flat_arr;
	}
}

// 以下はテストコード
$test_arr = new test_arr;
$test_arr->test_flatten_array();
$test_arr->test_array_flatten();

class assertion {
	
	public function assertEqual($expected, $actuary){
		if($expected !== $actuary) {
			throw new Exception('Assertion failed.');
		} else {
			echo '.',PHP_EOL;
		}
	}
}

class test_arr extends assertion {

	public $arr;

	public function __construct(){
		$this->arr = new arr;
	}

	public function test_flatten_array(){
		$new_array = array();
		$old_array = $this->old_array();
		array_walk($old_array, array('arr','flatten_array'), &$new_array);
		$expected_array = $this->expected_array();
		$this->assertEqual($expected_array, $new_array);
	}

	public function test_array_flatten(){
		$old_array = $this->old_array();
		$new_array = arr::array_flatten($old_array);
		$expected_array = $this->expected_array();
		$this->assertEqual($expected_array, $new_array);
	}
	
	public function old_array(){
		return array(
		    1 => array(
	    		'0001_hoge.dat',
	    		'0002_hoge.dat',
	    		'0003_hoge.dat',
	    		'0004_hoge.dat',
	    		'0005_hoge.dat',
	    	),
		    2 => array(
	    		'0001_fuga.dat',
	    		'0002_fuga.dat',
	    		'0003_fuga.dat',
	    		'0004_fuga.dat',
	    		'0005_fuga.dat',
	    	),
		    3 => array(
	    		'0001_mugi.dat',
	    		'0002_mugi.dat',
	    		'0003_mugi.dat',
	    		'0004_mugi.dat',
	    		'0005_mugi.dat',
	    	)
		);
	} 

	public function expected_array(){
		return array(
			'0001_hoge.dat',
			'0002_hoge.dat',
			'0003_hoge.dat',
			'0004_hoge.dat',
			'0005_hoge.dat',
			'0001_fuga.dat',
			'0002_fuga.dat',
			'0003_fuga.dat',
			'0004_fuga.dat',
			'0005_fuga.dat',
			'0001_mugi.dat',
			'0002_mugi.dat',
			'0003_mugi.dat',
			'0004_mugi.dat',
			'0005_mugi.dat',
		);
	}

}

```
.zshrc.localのススメ


すごく環境依存なコードを`.zshrc`に書かなければならないことってありますよね。
そういう時は、`.zshrc`に直接書くのではなく、例えば、`.zshrc.local`というファイルを作り、

```Bash:.zshrc.local
# 今使っているマシンでのみ有効にしたい設定を書く

## 例1：heroku toolbeltを有効にするためのパス
export PATH="/usr/local/heroku/bin:$PATH"

## 例2：Treasure Dataのtdコマンドを使うためのAPI_KEYの設定
export TREASURE_DATA_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

`.zshrc`ファイルの最後で、以下のように読み込むようにすると良いです。

```Bash:.zshrc
# どのマシンでも共通に使いたい設定を書く
# ...
# ...

[ -f ~/.zshrc.local ] && source ~/.zshrc.local
```

こうすると、`.zshrc.local`というファイルがない場合は読み込みが起こらないので、`.zshrc`をそのまま他人にあげたり、他のPCに持っていったりしても不具合が起こらない状態を維持できます。
ファイルの最後で読み込むのは、`.zshrc.local`で`.zshrc`の設定を上書きすることを出来るようにするためです。

`[ -f hoge ]`の意味の詳細は、`man test`と打って調べてください。(http://www.manpagez.com/man/1/test/)

## 応用

自分は、`.zshrc.local`の他に`.zshrc.mac`も作っていて

```Bash:.zshrc.mac
# open new tab in same working directory on osx lion.
precmd () {print -Pn "\e]2; %~/ \a"}
preexec () {print -Pn "\e]2; %~/ \a"}

alias emacs='/Applications/Emacs.app/Contents/MacOS/Emacs -nw'
```

というようになっています。

他にも、どのPCでも使うけれど、個人用の設定があるという場合は、`.zsh.personal`を作って、その中に入れておくと良いのではないでしょうか。
テンプレート自動更新ツール: xoops-watch-template


![](https://raw.github.com/suin/xoops-watch-template/master/image.png)

[XOOPS Themes and Templates Advent Calendar 2012](http://qiita.com/advent-calendar/2012/xoops-themes-templates/participants)の12日目の投稿です！

<- 前日:[ブロックによって表示方法を変えるテーマの修正方法](http://ryus.co.jp/modules/d3blog/details.php?bid=366)
-> 翌日: おたのしみに♪

## 0. xoops-watch-templateって？

XOOPSのモジュール開発で一番めんどくさい作業といえば、テンプレートの更新です。いちいち手動でモジュールアップデートを実行しないといけません。開発者仲間からどうにかならないの？と言われたので、テンプレート更新を検知したらモジュールアップデート自動でやってくれるコマンドラインツールを作りました。それが `xoops-watch-template` です。

`xoops-watch-template` はXOOPSのテンプレートの変更を検知して自動でテンプレートの更新をかけるコマンドラインツールです。モジュールのテンプレートファイルを変更することが多い開発者やデザイナなどのテンプレート編集者向けに作られました。めんどくさいテンプレート更新作業は `xoops-watch-template` を使って楽ちんにしちゃいましょう！

## 1. 先達たち

テンプレートの自動更新を行う方法は、既に複数存在します。その先達たちにも触れておきます。

### 1.1 TemplateAutoUpdate

メリット

* プリロードといわれるファイルを置くだけでテンプレートの自動更新ができる

デメリット

* プリロードのPHPを書き換えないといけない
* d3モジュールに対応していない

入手先

* [sunday-lab 日本語版: Template Automatic Update Site-Preload](http://sunday-lab-ja.blogspot.jp/2007/03/template-automatic-update-site-preload.html)
* [xoopscube-themes](http://code.google.com/p/xoopscube-themes/downloads/detail?name=TemplateAutoUpdate.class.zip&can=2&q=)


### 1.2 ALTSYSのテンプレート自動更新機能

メリット

* 情報が多い
* d3モジュールの発案者が作っているだけあって、d3モジュールに対応している

デメリット

* mainfile.phpにプログラムを書かないといけない
* mainfile.phpを書き換えたのを消すのを忘れて本番環境でもムダなアップデート処理が走る

入手先

* [PEAK XOOPS - altsys 0.71a](http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=76)

## 2. 先達とxoops-watch-templateの違い

xoops-watch-template は先達たちとは違うアプローチで作られています。先達たちはどちらかというと、XOOPS自体に細工を施して対応するという方法論でした。xoops-watch-templateは直接XOOPSに変更を加えなくていいようにデザインされました。そのため、xoops-watch-templateには先達たちにはない次のようなメリットがあります。

メリット

* XOOPSのプログラムを書き換えなくていい
* 設定の手間がない
* PHPを知らなくていい

もちろん、弱点もあります。xoops-watch-template はコマンドラインツールという点から、コマンドを使い慣れていない人には導入が難しいかもしれません。更に、Windows環境では使えないかもしれません。

## 3. xoops-watch-templateのインストール方法&使い方

ここでは、Mac(MacOSX Mountain Lion)でのインストール方法を解説します。

1 xoops-watch-templateをダウンロードします

[xoops-watch-template.php](https://raw.github.com/suin/xoops-watch-template/master/xoops-watch-template.php) を名前をつけて保存します。

2 「アプリケーション」→「ユーティリティ」→「ターミナル」を起動します。

![](https://lh4.googleusercontent.com/_dG0BBWAhWis/TXNaHRVnPGI/AAAAAAAABZQ/p7AKl0kb5K8/s400/スクリーンショット（2011-03-06%2017.29.59）.png)

3 `php` とタイプしたあと、スペース (` `) をタイプします

![](https://dl.dropbox.com/u/949822/qiita.com/121212-xoops-watch-template/1.png)

4 先ほどダウンロードした `xoops-watch-template.php` ファイルをターミナルにドラッグ＆ドロップします

![](https://dl.dropbox.com/u/949822/qiita.com/121212-xoops-watch-template/2.png)

5 テンプレート自動更新をしたいXOOPSのmainfile.phpをターミナルにドラッグ&ドロップします

![](https://dl.dropbox.com/u/949822/qiita.com/121212-xoops-watch-template/3.png)

6 enterキーを押せば、`xoops-watch-template.php` が走り始めます

![](https://raw.github.com/suin/xoops-watch-template/master/image.png)


これで、あとはテンプレートを変更すれば、自動でテンプレートが更新されるようになります！

終了する場合は、ターミナルを閉じるか「Ctrl + C」を押します。

xoops-watch-templateプロジェクトページ: https://github.com/suin/xoops-watch-template
Excelで表示形式を1,000や1,000,000単位で表示する方法

- 1,000単位で表示する
## [#,##0,]
最後に「,」（カンマ）を「1つ」つけます。

- 1,000,000単位で表示する
## [#,##0,,]
最後に「,」（カンマ）を「2つ」つけます。
OpenGL ESでオブジェクトを動かす

iOSのOpenGL ESでオブジェクトを動かしたいときに、行列演算をどうやるといいか、いろいろ試して、一番よさげな方法を見つけた
まず必要な行列は３つ

```Objective-C:matrixes.m
    _projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
    _baseViewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0.0f, 0.0f, _nearness);
    _modelViewMatrix = GLKMatrix4Multiply(GLKMatrix4Identity, _baseViewMatrix);
```

* _projectionMatrix    視体積などの設定
* _baseMatrix            カメラとの相対位置
* _modelViewMatrix  視点座標での物体の位置
これらのMatrixをupdateで更新していくとよい。その時にMatrixを保持していくのではなく、位置、角度をfloatとして持っておく。
updateでは一回一回初期化して、行列を作り直すときれいに描画ができた。

```Objective-C:update.m
- (void)update{
    _baseViewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0.0f, 0.0f, _nearness);
    _modelViewMatrix = GLKMatrix4Rotate(_baseViewMatrix, _angle, 1.0f, 0.0f, 0.0f);
    _modelViewMatrix = GLKMatrix4Rotate(_modelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f);
}
```
BlenderでMecanimしようぜ（前編）

２回にわたってBlender＋Unityの新機能Mecanimについて書かせて頂きます。

本稿（前編）はBlenderで人物モデルを扱うのならRigifyで楽しようという内容です。ある程度のリギングに関する知識やblenderの基本操作などを理解している方向けになっておりますので、その旨ご了承ください。後編ではUnity上にインポートした後の設定などについて書く予定です。

Rigifyというのは一言で言うと汎用的に使える人体リグで、下記のような特徴があります。

- コントロールボーンがついてる
- IKとFKが簡単に切り替え可能
- MecanimのHumanoidを使うのにうってつけ（リグの構成がほぼ同じ）

Rigify自体はBlender用アドオンとして提供されており、最近のBlenderには最初から入っているので、まずはこちらを有効にするところから始めましょう。File / User PreferenceのAddonsを開き、左メニューのRiggingを選び、Rigifyにチェックを入れます。

![image](https://dl.dropbox.com/u/31709397/Qiita/BlenderUnity/pict1.jpg)

これでRigifyが使えるようになりました。

次に人物のモデルデータを用意します。今回はおなじみの配管工のおじさんをインポートし、こちらにリグを入れ直してみることにします。が、unityで提供されている3Dデータは主にFBX形式で、残念ながらそのままではblenderにインポートできません。以下のどちらかの手順で読み込みます。

- cheetar3DなどFBX形式を読み込めるソフトを介してからblender上に読み込む
- 下記FBXインポートアドオンを使う（windows版のみ使用可能のようです）。
http://blenderfbx.render.jp/

形式を変えるとUVテクスチャが剥がれてしまったりするのでマテリアルやテクスチャの再設定をします。また、ポリゴンのつなぎ目がリッピングされた状態になりがちなので、そういった場合はMesh Tools / Remove Doubleなどで頂点の重複を解消すると隣り合うポリゴン同士がくっつきます。

読み込んだら元々入っていたリグは破棄します。

続いて追加コマンドshift + AからArmature / Human(Meta Rig)を選び、rigifyを呼び出します。

こちらを原点に置き、配管工の人体に合わせてボーンの位置調整を行うわけですが、この手順は下記のムービーがとても参考になります。

[http://www.youtube.com/watch?v=Txl1X2WVX_E](http://www.youtube.com/watch?v=Txl1X2WVX_E)

ムービーの手順に従い、こんな感じになればオーケー

![image](https://dl.dropbox.com/u/31709397/Qiita/BlenderUnity/pict2.jpg)

ここまでできれば、あとはオブジェクトパネル上のRigfy Buttons / Genetateを押せば、この骨格に合ったリッチな汎用リグが生成されます。いままで調整してきたアーマチュアはもう不要なので、目玉アイコンをクリックして非表示にしておきます。あるいは破棄してしまっても構いません。

生成されたボーンをよく見てみると、多くがレイヤーで隠されているだけで実際は多数のボーンを含んでいることに気がつくと思います。このあたりがこの手の汎用リグのわかりにくい部分だと思うのですが、とにかくやたらとボーンが多い。そしてどれがどのような役割を果たしているのか理解しにくいです。

そこで、ボーンの役割を下記のような5通りに分類して考えると理解の手助けになるのではと思います。

1. オリジナルボーン（やや簡易化された基本的なボーン。名前がORGから始まる）
2. デフォームボーン（実際にウェイトが与えられるボーン。名前がDEFから始まる）
3. IK用に制限が掛けられたボーン（名前がMCHから始まる）
4. FKコントローラ（upper_arm.Lなどシンプルな名前が特徴）
5. IKコントローラ（４と同じくシンプルだがikと入る）

本体の形状に影響を与えるボーン本体は2. のみであることに注意してください。

コントロール系のボーンの表示・非表示は専用のパネルがあります。
該当するボーンを選択してNパネルを開くと下記のようなボタン群が出てきます。

![image](https://dl.dropbox.com/u/31709397/Qiita/BlenderUnity/pict3.jpg)

レイヤーで切り替えるより、こちらのパネルで切り替える方がはるかにわかりやすいです。
また、IKとFKの切り替えもこの上のパネルで行います。

つづいてリグの有効範囲を決めますが、今回のおじさんのように比較的やせている体型のキャラクターはエンベロープでざっくり決めてしまい、その後バーテックスペイントに変換し、微調整するような形で行うのがいいかと思います。

指先のヒート設定などを生真面目に行うとかなりの作業工数になってしまいますので、不要な部分は適当にやってしまっても問題ないと思います。

ここまでできれば、もうUnity側にインポート可能です。

ということろで後編に続きます
EC2にmonit v5.5をインストール

```bash:
wget http://mmonit.com/monit/dist/monit-5.5.tar.gz
tar zxvf monit-5.5.tar.gz 
sudo cp monit-5.5.tar.gz /usr/src/rpm/SOURCES/monit-5.5.tar.gz

cd monit-5.5
sudo rpmbuild -bb --clean contrib/packages/redhat/monit.spec
sudo rpm -ivh /usr/src/rpm/RPMS/x86_64/monit-5.5-1.x86_64.rpm

sudo /etc/init.d/monit start
```
これで動きました。
google custom searchを使う


##制約

* 1日100リクエスト
* 1ページ10件
* 10ページまでしか取得できない
* つまり100件しかURLとれない

マニュアルは
https://developers.google.com/custom-search/v1/using_rest

##api keyの取得
API Consoleより取得できる

##サンプルコード
結果のjsonをファイルとして出力する

``` python:googlesearch.py
#! /usr/bin/python
# -*- coding:utf-8 -*-

import urllib
import json
QUERY = ''
API = ''
NUM = 10

url = 'https://www.googleapis.com/customsearch/v1?'
params = {
    'key': API_KEY,
    'q':QUERY,
    'cx':'013036536707430787589:_pqjad5hr1a',
    'alt':'json',
    'lr' :'lang_en',
}
start = 1
f = open('googleresult.json','w')

for i in range(0,NUM):
    params['start'] = start
    req_url = url + urllib.urlencode(params)
    res = urllib.urlopen(req_url)
    dump = json.loads(res.read())
    f.write(json.dumps(dump) + "\n")
    if not dump['queries'].has_key('nextPage'):
        break
    start = int(dump['queries']['nextPage'][0]['startIndex'])

f.close()

```
ターミナルコマンドの完了時にサウンドを鳴らす

gitでのデプロイなど完了まで時間が掛かるコマンドの終了時に警告音を鳴らす。
これを利用すればコマンド終了を知らせてくれるので、デプロイ中に他の作業ができます。
やってることは単純、pushとサウンドを鳴らすコマンド、tput belを続けて実行してるだけです。これをエイリアスに入れてます。

```bash
$ git push heroku master; tput bel;
```

tput belを実行すると、[システム環境設定]->[サウンド]->[サウンドエフェクト]で選択している警告音が鳴ります。もちろん、警告音の音量が0だと鳴りませんのでご注意を。
say hogeで何か喋らせても面白いかもしれませんね。

【2012/12/12 00:22 追記】
ターミナルの設定でオーディオベルのチェックが外れていたり、silence bellにしていると鳴りません！

【質問】
ターミナルアイコンを弾ませるコマンドがあれば、静かな環境でも使えるようになりますが、どなたか知りませんか？
Play Framework 2.0.4 のシェルで config.resource を読んでくれない

```
[yourapp] $ run -Dconfig.resource=development.conf
```

これ、動いてくれないので、代わりに

```
[yourapp] $ run -Dconfig.file=conf/development.conf
```

とするしかないようです。test とかでも動かないみたいで、これが動作するのは

```
[yourapp] $ start -Dconfig.resource=development.conf
```

だけです。悲しい。

同様の報告:

- http://afartinspace.com/post/28977419765/play-multiple-environments
- https://groups.google.com/forum/#!msg/play-framework/L-Do4qTmArw/X6xmv35ZSl4J
jQuery.lazyloadを使ってAutopagerを実装する

[tuupola/jquery_lazyload](https://github.com/tuupola/jquery_lazyload) は本来 img タグを遅延読み込みするための jQuery プラグインだがその実体は jQuery オブジェクトが画面に出現したら `appear` イベントを発行するものなので、`appear` イベントにコールバックをバインドすれば「続きを読み込む」機能を簡単に実装できる。

例えば `/timeline` に timestamp でタイムスタンプを指定すればそこを起点として何件かとって来てくれるAPIが実装されており、タイムラインの各div要素の `data-timestamp` 属性がそのポストのタイムスタンプを表しているとすれば、これらを使って次のようにAutopagerを実装できる。

```js
var loading = false;
$('#more')  // "もっと見る" ボタン
  .lazyload({ threshold: 200 })  // 200px 余裕をもって appear イベントを発行
  .on('appear', function () {
    if (loading) return;  // 非同期通信を抑制する
    loading = true;
    $.getJSON('/timeline', { timestamp: $('.timeline-item:last-child').data('timestamp') })
      .done(function (data) {
        // data を挿入する
        loading = false;
      })
      .fail(function () {
        // ユーザにエラー通知
        // loading は true のままにすれば以降非同期通信は発生しない
      });
  })
```
Capybara の visit などに signed cookie を設定

EDIT: 2012-12-15: page.driver.header() すると他の cookie が設定されなくなってしまうので page.driver.browser.set_cookie() を利用するコードに変更。また Capybara 2.0.1 だと [バグ]( https://github.com/jnicklas/capybara/pull/899) があって set_cookie() で例外発生するので注意

~~~ruby:spec/support/cookie_helpers.rb
module CookieHelpers
  def set_cookies(cookies)
    cookie_jar = ActionDispatch::Cookies::CookieJar.new(Rails.application.config.secret_token)
    if signed = cookies.delete(:signed)
      #cookie_jar.signed.update(signed)
      signed.each do |key, val|
        cookie_jar.signed[key] = val
      end
    end
    cookie_jar.update(cookies)
    headers = {}
    # cookie_jar.write(headers)
    # page.driver.header("Cookie", headers["Set-Cookie"])
    cookie_jar.each do |k, v|                                                                                 
      page.driver.browser.set_cookie(k + "=" + v)                                                             
    end
  end
end
~~~

~~~ruby:spec/features/admin_spec.rb
feature "admin console" do
  include CookieHelpers
  senario "enter as admin" do
    set_cookies(:signed => {:role => :admin})
    vist admin_console_path
    status_code.should == 200
  end
end
~~~
`Time#beginning_of_week`

`Time#beginning_of_week` は、何曜日始まりでも大丈夫。

```ruby:lib/active_support/core_ext/time/calculations.rb
def beginning_of_week(start_day = :monday)
  days_to_start = days_to_week_start(start_day)
  (self - days_to_start.days).midnight
end
```

一週間が火曜で始まろうが土曜で始まろうが問題が無い。そのため、「最後の火曜日」みたいな、ちゃんと自分で書くと結構頭が痛くなるロジックでも、すぐに求められますね。

```ruby
Time.now
#=> 2012-12-11 15:35:58 +0900
Time.now.beginning_of_week(:saturday)
#=> 2012-12-08 00:00:00 +0900
```
Rubyで使えるNLPライブラリ


ちょっと使ってみたものをまとめ。

## [Treat](https://github.com/louismullie/treat)
###インストール
`gem install treat`

言語に応じてパッケージのインストールもしてくれる模様。
以下の様にする。

	require 'treat'
	Treat::Core::Installer.install 'english'

もしくは、
`rake treat:install[english]`

###特徴
DSLチックに使える自然言語処理ライブラリ。
使い方はこんな感じ。
	
	require 'treat'
	include Treat::Core::DSL
	w = word "dogs"
	w.stem

	

## [Linguistics](https://github.com/ged/linguistics)
###インストール
`gem install linguistics`

### 特徴
Stringなどのオブジェクトを拡張してくれるので、コードが読みやすい。例えばステミングをような感じに書ける。

	require 'linguistics'
	Linguistics.use :en
	"dogs".en.stem #=> dog

## [Ruby-Stemmer](https://github.com/aurelian/ruby-stemmer)
###インストール
`gem install ruby-stemmer`

### 特徴
こちらはstemmingしたかっただけなときに探したライブラリ。
こんな感じで使う。
	
	require 'lingua/stemmer'
	Lingua.stemmer("dogs") #=> dog
Gitリポジトリを管理するツール


## gitosis
[scie.nti.st » Hosting Git repositories, The Easy (and Secure) Way](http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way)
[gitosis - Git リポジトリ群の管理とアクセス制御 vol.0 - openbooth](http://openbooth.org/archives/60.html)

## Gitorious
[Gitorious - Gitorious](http://gitorious.org/projects/gitorious)

## GitLab
[Home · gitlabhq/gitlabhq Wiki](https://github.com/gitlabhq/gitlabhq/wiki)
[「GitLab」を使ってGitリポジトリを管理 - Tech-Sketch](http://tech-sketch.jp/2011/12/gitlabgit.html)

## Gitolite

[Home · sitaramc/gitolite Wiki](https://github.com/sitaramc/gitolite/wiki)
[sitaramc/gitolite · GitHub](https://github.com/sitaramc/gitolite)
[Git管理の神ツール「Gitolite」なら、ここまでできる！ (1/2) - ＠IT](http://www.atmarkit.co.jp/fjava/rensai4/devtool26/devtool26_1.html)
インスタンスメソッドから静的メソッドを呼ぶ方法の違い

これ「[staticメソッドは$this->でも呼べる](http://qiita.com/items/0e2364e362143f348d53)」を見て、インスタンスメソッドからの静的メソッド呼び出しで self, static, \$this::, \$this-> がそれぞれどのように動作するか気になったので調べたメモ。

PHP のバージョンは手元にあった 5.4.6 です。

```php
<?php
class A
{
    public static function public_static($name)
    {
        var_dump("$name " . __METHOD__);
    }
    
    private static function private_static($name)
    {
        var_dump("$name " . __METHOD__);
    }
    
    public function test()
    {
        self::public_static('self');
        self::private_static('self');
        
        static::public_static('static');
        //static::private_static('static'); // Fatal error: Call to private method B::private_static() from context 'A'
        
        $this::public_static('$this::');
        //$this::private_static('$this::'); // Fatal error: Call to private method B::private_static() from context 'A'
        
        $this->public_static('$this->');
        $this->private_static('$this->');
    }
}

class B extends A
{
    public static function public_static($name)
    {
        var_dump("$name " . __METHOD__);
    }
    
    private static function private_static($name)
    {
        var_dump("$name " . __METHOD__);
    }
}

$b = new B;
$b->test();
```

**結果**

```
string(21) "self A::public_static"
string(22) "self A::private_static"
string(23) "static B::public_static"
string(24) "$this:: B::public_static"
string(24) "$this-> B::public_static"
string(25) "$this-> A::private_static"
```

コメントアウトの部分をコメントインすると Fatal error です。


### self::
クラス A のコンテキストで A のメソッドが呼ばれる。
`A::method()` と呼び出しているのと等価。

### static:: と $this::
クラス A のコンテキストで B のメソッドが呼ばれる。
`B::method()` と呼び出しているのと等価。

### $this->
クラス A のコンテキストで可視なメソッドが呼ばれる。

* * *

$this-> で静的メソッドを呼ぶとインスタンスメソッドのように可視性によって呼び先が変わるようです。

### 追記

ちなみに私は特別な理由がない限り self::hoge() です。static:hoge() は静的束縛遅延したいときだけ使います（特に理由はありません）。
メソッド内で生成されるインスタンスをstubしたいときにdouble rubyとrspec-mocksを使って書く

## 問題
たとえば、次のようなメソッドを書いていたとする。

```ruby
def run_with_deep_dependent_other_library
  lib = DependentLibrary.new
  attributes = lib.configure_some_attributes(self)
  run_some_routines(attributes)
end
```

とある理由(たとえば、いろんなところから参照され、そのたびにinstanceを生成するのは面倒なので内部で生成)から、メソッド内でインスタンスを内部で生成している。
そのメソッドをテストしたいけど、内部で生成しているインスタンスはテスト環境で再現することが困難な場合stubしたい。
だが、直接その生成しているインスタンスにアクセスできない。
どうするか?

## double ruby
[double ruby](http://github.com/btakita/rr)では、`any_instance_of`を使う。

```ruby
describe C do
  describe "#run_with_deep_dependent_other_library" do
    let(:attributes) { {foo: 'bar'} }
    before do
      any_instance_of(DependentLibrary) do |o|
        stub(o).configure_some_attributes { attributes }
      end
    end
    # ...
  end
end
```


## rspec-mocks
[rspec_mocks](http://github.com/rspec/rspec-mocks)では、`any_instance`を使う。
詳しい使い方は、[any_instanceのspec](https://github.com/rspec/rspec-mocks/blob/master/spec/rspec/mocks/any_instance_spec.rb)を読むこと。

```ruby
describe C do
  describe "#run_with_deep_dependent_other_library" do
    let(:attributes) { {foo: 'bar'} }
    before do
      DependentLibrary.any_instance.stub(configure_some_attributes: attributes)
    end
    #...
  end
end
```

## サンプルコード
https://gist.github.com/4244501
ImageButtonの背景を透明にしたときのクリック感を出す


切り替え画像にこだわらないのであれば↓でサクッと。


```
class SimulateButtonClick implements OnTouchListener {
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			((ImageView) v).setColorFilter(Color.argb(100, 0, 0, 0));
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			((ImageView) v).setColorFilter(null);
		}
		return false;
	}
}
```

```
ImageButton.setOnTouchListener(new SimulateButtonClick());
```
Spotlightから電卓を起動する時のTips

Spotlightから電卓を起動する際に、
`calc`と入力する必要があります。
ただ、4文字入力する必要があり、しかも`cal`までの入力だとカレンダーがヒットします。
![](http://gyazo.com/d70bcd37512ff8ccadf02cfb7dcb29c5.png)

Spotlightで`e`と入力すると、自然対数の底であるe(ネイピア数)がヒットし、それを選択することができます。トップヒットはEvernoteであるためSpotlight起動→eと入力→下キーを入力→Enterを入力で電卓を起動できます。
少ないタイプ数で電卓も起動でき、しかもeの値を覚えることもできます！まさに一石二鳥ですね（はーと
![](http://gyazo.com/2656093bf0c259cdfa670e4ec8610009.png)

※Spotlightの設定で書類やフォルダ、連絡先なども検索対象にしている場合には、そちらが上位にヒットするかもです。その場合は今回のTipsは使えないかもしれませんねー。
sqlkorma 使ってみた(Lisp アドベントカレンダー 2012 ネタです)

Lisp アドベントカレンダー 2012 11日目の記事 
[sqlkorma 使ってみた](https://gist.github.com/4252252) を書きました。
(全然 Lisp ネタじゃねぇ...すんません)
phpstormでメソッドのコメントtips 

phpstormではメソッドにコメントを書いてやると勝手に判別して保管候補を表示してくれて賢いのでコメントを書いてやればいろいろと特をする。

たとえばfunctionのreturn にhugeクラスが書かれていたとしたら、そのfunctionを呼び出して変数に格納した後からでもhugeクラス内で記述されたものが候補として表示されるので良い。

さぁレッツコメント

基本的にphpDocumentorの記述方法を参考に
http://manual.phpdoc.org/HTMLSmartyConverter/PHP/phpDocumentor/tutorial_tags.pkg.html


まずはコメントが無いメソッドを作成、paramとreturnは最低限書いておけばコメントの意味をなす

```
    public function fuge(array $hoge, $unntann = null)
    {
        return true;
    }
```


`/**`を入力してエンターを押すと以下のようにコメントが自動で挿入される

```
    /**
    public function fuge(array $hoge, $unntann = null)
    {
        return true;
    }
```

```
    /**
     * @param array $hoge
     * @param null $unntann
     * @return bool
     */
    public function fuge(array $hoge, $unntann = null)
    {
        return true;
    }
```


クラスを自動判別してコメントに記入してくれもする

```
    /**
     * @return Huge
     */
    public static function getOneHuge()
    {
        $huge = new Huge();
        return $huge;
    }
```


array形式で返ってくる場合は以下のように何のarrayで返ってくるのかが保管が判別してくれなくよくわからなくなる。

```
    /**
     * @return array
     */
    public static function getListHuge()
    {
        $hugeList = array();

        for ($i=0;$i>3;$i++) {
            $hugeList[] = new Huge();
        }
        return $hugeList;
    }
```

これだと保管候補として何を表示すればいいか判別が出来ないので少しコメントを書き換えてやる

```
    /**
     * @return Huge[]
     */
    public static function getListHuge()
    {
        $hugeList = array();

        for ($i=0;$i>3;$i++) {
            $hugeList[] = new Huge();
        }
        return $hugeList;
    }
```

`@return Huge[]` にしてやればarrayの中にHugeクラスが格納されていることを判別してくれるので保管をしてくれる。
ALAssetの日付順ソート最適化

ALAssetsLibraryでユーザーの画像をもらって日付ソートしたくなりました。
（ALAssetの日付にはいろいろ問題もあるようですが、ここでは触れません）

アセットの配列が取れたのでソートしようとして次のコードを書きました。

```
[assetList sortWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(ALAsset *a, ALAsset *b) {
                                             NSDate *datea = [a valueForProperty:ALAssetPropertyDate];
                                             NSDate *dateb = [b valueForProperty:ALAssetPropertyDate];
                                             return [dateb compare:datea];
                                         }];
```

しかしこれがどうも遅い。
InstrumentsのTimeProfilerで調べてみると、valueForProperty:ALAssetPropertyDateが遅いようです。
なので、あらかじめ配列は、
[assetList addObject:@{@0 : asset, @1 : [asset valueForProperty:ALAssetPropertyDate]}];
のようにあらかじめ日付をいれておくことにします。
ほんとはkeyをもっと分かりやすくしたほうがいいのですが、パフォーマンス上文字列比較はしたくないので、整数値にします。

そして、

```
[assetList sortWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(NSDictionary *a, NSDictionary *b) {
                                             NSDate *datea = a[@1];
                                             NSDate *dateb = b[@1];
                                             return [dateb compare:datea];
                                         }];
```

のようにします。するとびっくり相当早い。
これにて満足のいく速度となりました。
比較する部分は非常に何度も呼ばれる部分なので、注意深く実装したいですね。
なお、マルチコアのデバイスならば、NSSortConcurrentが地味に効果的でした。
よりソートの日付精度が欲しい場合は、NSDateのtimeIntervalSince1970を使うといいようですね。
UIImageを様々なtypeのcv::Matへ変換したい時の単純な方法

よくあるUIImageをOpenCVのcv::Matへ変換するときのコードは以下。

    @interface UIImage(OpenCVUtility)
    - (cv::Mat)cvMat;
    @end
    @implementation UIImage (OpenCVUtility)
    -(cv::Mat)CVMat
    {
        
        CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
        CGFloat cols = self.size.width;
        CGFloat rows = self.size.height;
        
        cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
        
        CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                        cols,                      // Width of bitmap
                                                        rows,                     // Height of bitmap
                                                        8,                          // Bits per component
                                                        cvMat.step[0],              // Bytes per row
                                                        colorSpace,                 // Colorspace
                                                        kCGImageAlphaNoneSkipLast |
                                                        kCGBitmapByteOrderDefault); // Bitmap info flags
        
        CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
        CGContextRelease(contextRef);
        
        return cvMat;
    }
    @end

これだと、CV_8UC4型のcv::Matしか扱えないのでここから任意の型のcv::Matを扱いたい時は以下のようにすれば面倒がない。

    - (cv::Mat)cvMat32F:(cv::Mat)cvMat
    {
        cv::Mat cvMat32F(cvMat.rows, cvMat.cols, CV_32F);
        cvMat.convertTo(cvMat32F, CV_32F);
        return cvMat32F;
    }

効率は恐らくそんなに良くないけど手っ取り早く動かしたい時に。
git push時に表示されるwarning: `push.default is unset...`の意味と解決方法

(おそらく)git v1.8から以下のようなメッセージが出るようになった人は多いと思います．この意味を解説します．

```
$ g push         
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
```

## push.default: simple? matching?
`push.default`は，`git push`時にrefspec(ブランチ名やタグ名)を指定しなかったときの挙動を設定する．(例えば`git push`, `git push origin`としたとき)
`push.default`のデフォルト設定がGit 2.0でmatchingからsimpleに代わる．

### simple
現在のブランチをupstreamのブランチにpushする．ただしupstreamのブランチ名が現在のブランチと異なる場合はpushしない．
"This is the safest option and is well-suited for beginners."とのこと．あまり起きなさそうだけど，間違ったブランチをtrack設定してしまったときなどはpushできないので安全?

### matching
`git push`時に同名のブランチ(=マッチするブランチ)をそれぞれpushする．いままでのデフォルト．

### その他
push.defaultに設定できる値としては以下がある．

- nothing
 - pushしない．つまり必ずgit push origin masterのようにrefsを指定する必要がある．
- current
 - 現在のブランチを同名のリモートブランチにpushする．
- upstream
 - 現在のブランチをupstreamのブランチにpushする．

## 結論
warningの通り，いまのgitの挙動を保ちたいならmatching，現在のbranchのみ安全にpushしたいならsimpleにするとよい．

````sh
git config --global push.default matching
# or
git config --global push.default simple
```
EC2,CloudWatchでメモリ使用量とかを監視する方法

以下のシェルをCRONで定期実行

```custom_metrics.sh
#!/bin/zsh

export AWS_CREDENTIAL_FILE=`dirname $0`/credential
export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
export PATH=/opt/aws/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/jre

# get ec2 instance id
instanceid=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`

memtotal=`free | grep 'Mem' | tr -s ' ' | cut -d ' ' -f 2`
memfree=`free | grep 'buffers/cache' | tr -s ' ' | cut -d ' ' -f 4`
let "memused=100-(memfree*100/memtotal)"
swapmemused=`free |grep Swap:|awk '{print $3}'`
loadave1=`uptime | tr -s ' ' | cut -d ' ' -f 9 | cut -d ',' -f 1`
steal=`vmstat | tail -1 | tr -s ' ' | cut -d ' ' -f 18`

mon-put-data --metric-name "SwapMemory" --namespace "DP/App" --dimensions "InstanceId=$instanceid" --value "$swapmemused" --unit "Bytes" --region ap-northeast-1
mon-put-data --metric-name "FreeMemory" --namespace "DP/App" --dimensions "InstanceId=$instanceid" --value "$memfree" --unit "Bytes" --region ap-northeast-1
mon-put-data --metric-name "UsedMemoryPercent" --namespace "DP/App" --dimensions "InstanceId=$instanceid" --value "$memused" --unit "Percent" --region ap-northeast-1
mon-put-data --metric-name "LoadAverage" --namespace "DP/App" --dimensions "InstanceId=$instanceid" --value "$loadave1" --unit "Count" --region ap-northeast-1
mon-put-data --metric-name "Steal" --namespace "DP/App" --dimensions "InstanceId=$instanceid" --value "$steal" --unit "Percent" --region ap-northeast-1
```

＊Pathは各自の環境に合わせて

参考にした記事
http://dev.classmethod.jp/cloud/cloudwatch-custom-metrics-vmstat-free-uptime/
プロパティの無いオブジェクトを 配列→論理値 すると false

これ「[配列への変換で気をつけるメモ ](http://qiita.com/items/d410bd6b19f495c72436)」を見て思いついた小ネタ。

```php
<?php
var_dump((bool)(array)false);        // false -> array(false) -> true
var_dump((bool)(array)new stdClass); // object -> array() -> false
```

false を 配列にキャストして論理値として評価すると true。
プロパティの無いオブジェクトを配列にキャストして論理値として評価すると false。
HipChatとGithub連携

この記事は[Atlassian Advent Calendar 2012](http://www.zusaar.com/event/444403)の14日目です。

HipChatはIRCを彷彿とさせるインターフェースで、思わず「[ただちにセプクしろ！！][1]」とか書き込んでしまう気軽さが魅力です。

ところで、JIRAやGithubをチームで使っていると、あることの発生がしばしばあることに気がつきます。それは・・・「**課題のアサインに気がつかない**」ということです。

たとえば起票された優先度高のバグを放置、pull requestを放置、コメントを放置・・・といった具合です。
もちろんそれぞれのアクションの時にメールが飛ぶんですが、メールなんか誰も読んでませんよね？（含む自分）

私のいるチームでも最初はtwitter botでこの手の通知を行っていたのですが、HipChatで行うようにしました。
HipChatでは[いろいろなサービスへの連携が出来るようになっています。][2]
また、連携するルームの設定ができるので、プロジェクト毎にルームを分けているような場合にも便利です。

HipChat Auth Tokenの生成
------------------------
まずはAPI連携に必要なHipChatのAuth Tokenの生成です。

1. HipChatの "Group admin" > "API" を表示
2. Create new token.
ここでAdmin tokenとnotification tokenが選択できます。JIRAと連携する場合にはAdmin tokenが要求されるので、僕はAdmin tokenを生成しました。Githubだけならnotificationでもいけます。
3. 生成されたTokenをコピー

Github連携
------------------
次にGithub側の作業です。

1. Githubで、連携したいリポジトリの "Admin" メニューを選択
2. メニューから "Service Hooks"を選択
3. HipChatを選択
4. 先ほど生成したAuth Token, 連携Room名を入力。Activeにチェック。(Notifyはお好みで）

これで連携できるようになります。

連携
----
連携すると、下図のような通知が出ます。pushしたときに表示されるので、複数のコミットメッセージが束ねられていて便利です。

![from atlassian](http://blog-content.hipchat.com/wp-content/uploads/2010/05/hipchat-github.png)

see: [atlassianの連携解説サイト](http://help.hipchat.com/knowledgebase/topics/10037-integrations) 図もここからお借りしました

活用例
------
プロジェクトに必要なドキュメントをgithubで管理し、Q&AをIssuesで行うようにします。(*1)
そうすると質問が上がる度に通知が来ますし、githubのissuesはコミットログも合わせて表示するので、「修正しました」みたいなメールを書く必要もありません。
「これってどういうことですか？」「この項間違いでは？」みたいなショートメールがメールボックスを埋め尽くさなくても良いのです。

(*1) wikiでいいじゃん、と思うんですが、諸般の事情によりバイナリ形式のプロプライエタリフォーマットを扱わなければならないこともあります。
[1]: https://twitter.com/njslyr_r/status/180996623734804481
[2]: http://help.hipchat.com/knowledgebase/topics/10037-integrations
HipChatとJIRAの連携

この記事は[Atlassian Advent Calendar 2012](http://www.zusaar.com/event/444403)の15日目です。明日は [@kokuzawaさん](https://twitter.com/kokuzawa)の、FishEyeについてです。

前回に続いて、HipChatとJIRAの連携方法を紹介します。
同じAtlassianの製品なので、JIRAとHipChatの連携は簡単です。

1. JIRA管理画面でHipChatのAdmin Tokenを登録
2. ワークフローのカスタムアクションでHipChatへの連携を定義

Admin Tokenの登録
----------------
(以下はAtlassian On Demaindでのやり方になります）

1. JIRAの管理メニュー > System > Mail > HipChat Configurationを選択
2. HipChatのAPI Tokenを設定

これだけです。

ワークフローでのアクション定義
-------------------------
さて次に「どういうイベントが発生した際にHipChatに連携するか」を設定する必要があります。
例えば、「ステータスREVIEWに遷移したときに通知」「Issue Typeがバグの場合は、起票時に通知」といった具合です。

これらはワークフローで設定します。

1. プロジェクト管理 > workflowsを選択
2. ワークフローを編集
3. HipChatに連携したいワークフロー遷移(例えば、create issue)の設定メニューから、"view post functions" を選択
![画像](https://www.evernote.com/shard/s11/sh/a0e8bc9f-4b96-451a-b480-8334f3693815/f613da104cb68b7894c7cfcb01ed6906/res/1836c69a-6e1e-4972-83a9-935ebd2b48d4/skitch.png)

4. Add post function を選択
5. Notify HipChatを選択
![画像](https://www.evernote.com/shard/s11/sh/89a895fe-6aeb-4693-8f14-bc6b9f496e4d/19771b10120d61d204b5616c0aa85838/res/126df4a6-ae2d-403c-9de7-5f8bfd95c996/skitch.png)

6. JQLで条件を指定したり、通知するルームを指定。例えば、JQLで、``IssueType = "Bug"`` と指定すれば、バグのみが対象となります。
7. addしたステップはpost functionsの先頭に追加されてしまうので、move downで一番後ろに来るようにします。
8. ワークフローをpublish

これでOKです。

連携
----
連携が完了すると、下図のような通知がHipChatに出ます。
タスクへのリンクも張られるので、通知を確認次第JIRAの該当Issueにジャンプできるのでかなり便利です。
![from atlassian](https://marketplace.atlassian.com/files/com.atlassian.labs.hipchat.jira/screenshots/85f6aa97-2ea8-4e70-82a1-b59617f92a65.png)

see: [atlassianの連携解説サイト](https://plugins.atlassian.com/plugins/com.atlassian.labs.hipchat.jira) (図もお借りしました)

活用法
------
Scurm boardを使っていると、バグを起票したときはまずBacklogに積まれて、Sprintには入ってきません。これはこれで正しい動き（勝手に入ってこられても困る）のですが、バグに気がつかない事があります。
バグが作成されたらHipChatに連携するようにしておけばルームに通知されますし、OSXなら通知エリアにも表示されます。(iPhoneならiPhoneにも!!) 見過ごしが無くなり便利です。
グローバル汚染することの一番の弊害(実録Qiitahackathon)

グローバル汚染して困ることはなんでしょう。私なりの答えを最後に書きました。先日のQiitaHackathonで痛感したことです。
上記のお題目で、先日のHackathonのレポートも兼ねたいと思います。
当日、私は一人チームで、いきなりマルチスクリーンをクロスプラットフォームと取り違えるチョンボをやらかし、普通のWebアプリケーションをつくりはじめました。Filtterというタイムラインから良ツイートを抽出するためのアプリです。しかも事前にプロトをつくっており、頭も悪ければ根性も腐ってる感じでなかなかあれです。
残り2時間半の時点でその誤りに気づき、Websocketでそれっぽい機能をつくって急場をしのぐことを思いつきます(Qiitaのデザイナーの小西さんに相談にのってもらいました)。生WebsocketはPlayで少ししか触ったことがなかったので、Google App EngineのChannel APIを選択しました。
Google App Engineのローカル環境のアドレスがlocalhost:XXXXで、そのままではtwitter apiのアドレスとして指定できないため、localhostにローカルの適当なDNSを割り当てるか、本番環境使って開発するか2分くらい悩みました。結局その時点で残り2時間しかなかったので、後者の方針で行くことに。
普段は過剰なくらいクロージャや無名オブジェクトを使いまくって汚染を回避するのですが、イチイチ本番環境に上げてクロージャに閉じられた関数をチマチマデバッグするのがめんどくさかったので、禁忌を破り、windowオブジェクトを汚染しまくってデバッグをしはじめます。かなりいいペースで進んでいたのですが、残り30分くらいで見たことのないエラーにブチ当たります。

```javascript:エラー
Uncaught TypeError: Illegal invocation
```

jsではnativeの関数の別名を作成することを禁止しており、これはそれにひっかかったときに吐くエラーです。グローバル汚染の腐臭がぷんぷんします。結局、問題の切り分けに時間がかかり、完成しないままタイムアップしました。

あとで調べた結果、このエラーはグローバル汚染が原因ではありませんでした。が、直接問題がなくても、ちょっとしたエラーでヒヨってしまうので、あまり精神衛生上よろしくないということがよくわかりました。

###グローバル汚染の弊害:メンタルがやられる

振り返らずともわかっていたことですが、改めて振り返ってみてもやはり何一つとしてよかったところがありませんでした。時間に追われながらプログラムを書いてると24のクロエに自分を重ねることができ、中二心が満たされます。懇親会も楽しかったです。今度はもうちょっとマシなものがつくりたいです。
パスワード等の標準入力を隠す

コンソールスクリプトなどで、パスワードを隠しつつ入力させたい時があります。
そんな時、 Ruby 1.9.3 以降であれば、 [IO#noecho](http://apidock.com/ruby/IO/noecho) が使えます。

```ruby
require 'io/console'

password = STDIN.noecho(&:gets)
```

Ruby 1.9.3 以前であれば、 [highline](http://rubygems.org/gems/highline) gem を利用するのが簡単です。

```ruby
require 'highline/import'

password = ask("Enter password: ") { |q| q.echo = false }
```
パラメトリックとノンパラメトリックの狭間

http://d.hatena.ne.jp/risuoku/20121210

Machine Learning Advent Calendar 2012の10日目を担当します、@risuoku です。
今回は、数ある機械学習手法の中で、以下の２つに焦点を当て、いくつかのアプローチを紹介します。

回帰分析
クラスタリング
特に、パラメトリックな手法とノンパラメトリックな手法の違いや、それぞれの特徴の理解を目指しています。
staticメソッドは$this->でも呼べる

static::doSomething()で呼ぶ必要があるのだと勘違いしてた。

```php
<?php
class Hoge {
  static function foo() {
    //この中で$thisは使えない
    echo 'Hoge::foo';
  }

  function hoo() {
    $this->foo();
  }
}

$hoge = new Hoge;
$hoge->foo(); //一切エラーは発生しない
$hoge->hoo(); //一切エラーは発生しない
```

staticにすると$thisが使えなくなり、プロパティの読み書きもできず、かなり制約がきつくなる。むしろ積極的に使うと、インスタンスの状態変更を行っていないことを明示できて読みやすいコードになるかも。
ember-restを使ったREST通信

Ember.jsは現状データの保存、サーバとの通信の機能を提供していません。なので、サーバとのやり取りの処理は別途用意する必要があります。
今日は、ember-restという、Ember.ObjectにREST通信機能を追加するライブラリを紹介します。

[ember-rest](https://github.com/cerebris/ember-rest)

ember-restを使ったrailsアプリケーションのサンプルが公開されています。このアプリケーションのコードを見ていきます。

[ember_rest_example](https://github.com/dgeb/ember_rest_example)

このサンプルアプリケーションは、REST + JSONでサーバと通信し、オブジェクトのロード、セーブを行います。
サーバ側は /contacts というURLで、RESTインタフェースを実装しています。
JavaScript側でREST通信に使用する肝のコードは、以下の2つのオブジェクトです。

```js
App.Contact = Ember.Resource.extend({
  resourceUrl:        '/contacts',
  resourceName:       'contact',
  resourceProperties: ['first_name', 'last_name'],

  validate: function() {
    if (this.get('first_name') === undefined || this.get('first_name') === '' ||
        this.get('last_name') === undefined  || this.get('last_name') === '') {
      return 'Contacts require a first and a last name.';
    }
  },

  fullName: Ember.computed(function() {
    return this.get('first_name') + ' ' + this.get('last_name');
  }).property('first_name', 'last_name')
});

App.contactsController = Ember.ResourceController.create({
  resourceType: App.Contact
});
```

Ember.Resource, Ember.ResourceControllerが、REST通信のための機能を提供しています。

↓全オブジェクトをロードしている箇所です。

```js
  refreshListing: function() {
    App.contactsController.findAll();
  }
```
↓オブジェクトを保存している箇所です。

```js
  submit: function(event) {
    var self = this;
    var contact = this.get("contact");

    event.preventDefault();

    contact.saveResource()
      .fail( function(e) {
        App.displayError(e);
      })
      .done( function() {
        var parentView = self.get("parentView");
        parentView.get("contact").duplicateProperties(contact);
        parentView.hideEdit();
      });
  }
```



Ember.Resource, Ember.ResourceControllerが提供している、REST通信のためのメソッドは以下のとおりです。

## findResource

id指定でオブジェクトをロードします。 (GET xxx/id)

## saveResource

オブジェクトを保存します。(POST xxx or PUT xxx/id)

## destroyResource

オブジェクトを削除します。 (DELETE xxx/id)

## findAll

全オブジェクトをロードします。


ember-restはシンプルな感じのライブラリですね。
emacsの設定ファイルをどうするかというのはおそらく共通の悩み

最近少しだけemacsから離れていました。
離れている間に分からないことが増えたりなどして、環境整備をしようと思ったりしたのですが。
その時どうしようかななどと考えたことについて書いてみました。emacsの設定をどのように管理するかというのはおそらく共通の悩みだろうと思うので、他の方がどうしているかは聞いてみたいです。
http://pod.hatenablog.com/entry/2012/12/10/204538
beatportのトラック検索APIを叩く

beatportでトラック検索用のAPIを叩こうとしたらドキュメントがわかりづらかったのでrailsでやったときのメモ。

API叩くクラスをモデル的に作成

```ruby:beatport.rb
require 'nokogiri'
require 'open-uri'

class Beatport 
  def self.search(query)
    url = BEATPORT_API_URL #'http://api.beatport.com/catalog/search?query='
    keywords = URI.encode(query)
    options = '&facets[]=fieldType:track&format=xml&v=2.0&page=0&perPage=3&sortBy=releaseDate%20desc' #option指定

    uri = URI(url + keywords + options)

    doc = Nokogiri::XML(uri.read)
    return doc 
  end
end
```

コントローラー側で呼び出す

```ruby:test_controller.rb
class TestController < ApplicationController
  
  #===検索フォーム
  #
  #
  def form
  end
  
  #===表示
  #
  def show
    if params['search'].present?   
      #beatport
      @beatport = Beatport.search(params['search'])
    else
      @errors = 'error'
      render :action => :form
    end
  end
end
```

viewはaudioタグ使って表示。

```html:show_html.erb抜粋
      <script type="text/javascript" src="http://api.html5media.info/1.1.4/html5media.min.js"></script>
  
      <% @beatport.search("document").xpath(".//track") .each do |doc| %>
        <audio src="<%= doc['url']  %>" preload="none" controls>Your browser can not open audio file. オーディオファイルを読み込めません</audio>
        <br />
      <% end %>
```
スクリプト言語で実行可能なファイルを作る


以下のように、`#!`から始まる行をファイルの1行目に記述する。

```hoge.rb
#!/usr/bin/env ruby

(プログラムの内容)
```

`#!`は、シェバングと言って、これ以下に書いてあるコマンドで、自分自身を実行し直してくれる。
`/usr/bin/env`を使うことで`which ruby`で出てくるような環境依存のPATHを書かなくて良くなる。`/usr/bin/env`も環境依存っちゃ環境依存だけど、ほとんど共通で入ってるし、もしデフォルトで入ってなくてもこのPATHでenvを実行できるようにしちゃえば、それ以降は困ることが無いからいいんじゃないかな。

後は、

```
$ chmod +x hoge.rb
```

とやって実行権限をつけてあげれば、

```
$ ./hoge.rb
```

のように実行できる。

他の言語でも、`ruby`の部分を`perl`,`python`などに置き換えれば良い。

```hoge.py
#!/usr/bin/env python
```


### 補足

文字コードを指定するのに使う、

```
# coding: utf-8
```

等は2行目に持ってきたのでOK。


### 参考
http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0
３D最初の難関！ モデリングについて 

僕の経験から学んだ３Dモデリングをする上で注意する点を４つ述べたいと思います。



１、最初は簡単なモデルを作る。
キャラクターを作ろうとするとどんどん手を加えがちです。
出来るだけ単純な形を保ちましょう。


２、法線の向きの確認、頂点の結合忘れに気をつけましょう。
一部ポリゴンが表示されない場合は法線が反対を向いている可能性があります、また頂点同士が近い状態で結合し忘れることもあります。



３、UVの編集に慣れる
モデルが出来たら終わりではありません。UVマップという３Dを２Dに変換した座標で展開図を編集します。
例えると、紙でできたサイコロが３Dオブジェクトで解体して平面にしたのがUVマップです。


４、UVマップを元にテクスチャーを描く、描いたテクスチャーを３Dモデルに貼る。
ラフでもいいのでテクスチャーを描くところまでやって欲しいです。UVマップの展開図をペイントソフトで開き、それを元に色を塗って行きます。


大枠ではありますがモデリングの流れについて説明しました。
自分の作りたいモデルから手をつけると技術的に無理がでてきてイヤになってしまいます。まず最初は簡単なモデルから作るのが一番大事だと僕は思います。（Amazonの段ボールキャラクターみたいなの）



最後に僕が作った作品のリンクを載せさせてもらいます。
３Dモデリングって楽しい！と思ってくれたら幸いです。
http://pupoman.cgsociety.org/gallery/




↓「２、法線の向きの確認、頂点の結合忘れに気をつけましょう。」の説明図
![モデリング時のトラブル.php](http://cl.ly/image/3q120d0l2L3d/%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E6%99%82%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB.jpg)
![UV編集について.php](http://cl.ly/image/1L0L2T0e0P3R/UV%E7%B7%A8%E9%9B%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.jpg)
PullRequestベースの開発フロー説明図

必要に迫られて書いてみました。
間違い、足りない説明、足したほうがいい解説などありましたら突っ込みください。

![PullRequestベースの開発フロー説明図](https://cacoo.com/diagrams/IcsZW6b6e0HduTrh-523FB.png)

詳細が見たい方はCacooのものを参照ください
⇒ https://cacoo.com/diagrams/IcsZW6b6e0HduTrh
rubyでアンダースコアの混じったURIは使えない

ちょっとハマったのでメモ

テストの時に外部APIにアクセスするURIを

```
test_server
```

とか使っていて

/etc/hostsにもテスト用のサーバーの設定を追加して

```
127.0.0.1 test_server
```

コマンドラインから ping も通るのに

rubyでこのURIを使用すると

```
URI::InvalidURIError:
       the scheme http does not accept registry part: test_server (or bad hostname?)
```

とかって例外が発生する。
rfcとかだと最新は、使って良いらしいんだけど...

で、アンダースコアを"-"とかに変更すると許してもらえた。

```
test-server
```
pukiwikiのwikiデータのファイル名を読みやすい構造に変換する

```ocaml:trans_pukiwiki_fnames.ml
(*
  pukiwikiの内部データのファイル名を可読できる名前に変換する
  ls /PUKIWIKIDIR/wiki/*.txt | ocaml trans_pukiwiki_fnames.ml
*)
let outdir = "out/"
let verbose = true

let (|>) x f = f x
let (@@) f x = f x
let (!%) = Printf.sprintf

let rec split_at n xs =
  match (n, xs) with
  | (0, xs) -> ([],xs)
  | (n, []) -> ([], [])
  | (n, x::xs) ->
      let (ys,zs) = split_at (n-1) xs in
      (x::ys, zs)

let rec group n xs =
  match split_at n xs with
  | (ys, []) -> [ys]
  | (ys,zs) -> ys :: group n zs

let implode cs =
  String.concat "" (List.map (String.make 1) cs)

let explode s =
  let rec explode_rec n =
    if n >= String.length s then
      []
    else
      String.get s n :: explode_rec (succ n)
  in
  explode_rec 0

let trans1 cs =
  let hex char =
    match char with
    | '0'..'9' -> int_of_char char - int_of_char '0'
    | 'a'..'f' -> 10 + int_of_char char - int_of_char 'a'
    | 'A'..'F' -> 10 + int_of_char char - int_of_char 'A'
    | _ -> failwith (!%"trans1: %c" char)
  in
  List.map hex cs
  |> List.fold_left (fun x y -> 16*x+y) 0
  |> char_of_int

let trans s =
  String.sub s 0 (String.length s - 4)
  |> explode
  |> group 2
  |> List.map trans1
  |> implode
  |> (fun s -> s ^ ".txt")

let read_lines () =
  let rec iter store =
    try iter (read_line () :: store) with
    | End_of_file -> List.rev store
  in
  iter []

let command s =
  if verbose then print_endline s;
  Sys.command s

let mkdir_p filepath =
  command ("mkdir -p " ^ filepath)

let cp x y =
  command ("cp '"^x^"' '"^y^"'")

let _work path =
  let basename = Filename.basename path in
  let new_path = trans basename in (* 変換後のパス ('/' が含まれる!) *)
  let dstdir = outdir ^ Filename.dirname new_path in
  ignore @@ mkdir_p dstdir;
  ignore @@ cp path (outdir ^"/"^ new_path);
  ()

let work path =
  try _work path with
  | e ->
      prerr_endline ("work error: "^path);
      raise e

let () =
  read_lines ()
  |> List.iter work
```
PHPのインタラクティブシェルでSymfony2コンテキストを使う


shell.php をアプリケーションルートに配置する

```php
<?php

require 'app/bootstrap.php.cache';

use Symfony\Component\HttpFoundation\Request;

require 'app/AppKernel.php';

$kernel = new AppKernel('dev', true);
$kernel->loadClassCache();
$kernel->init();
$kernel->boot();

function getContainer()
{
	global $kernel;
	return	$container = $kernel->getContainer();
}

function getEntityManager()
{
	return getContainer()->get('doctrine.orm.entity_manager');
}

```

## 使う

```php

$ php -a

php > require 'shell.php';
php > $c = getContainer();
php > $c->get('doctrine.orm.entity_manager');

```

こんな感じでSymfony2のコンテキストでsnippetを試せる。
コピーコンストラクタの省略

以下のような C++ のコードがあります。 実行せずにどのような出力が得られるか予想してみて下さい。

```c++:
#include <iostream>

struct Foo {
  Foo() { std::cout << "default constructor." << std::endl; }
  Foo(const Foo&) { std::cout << "copy constructor." << std::endl;}
  ~Foo() { std::cout << "destructor." << std::endl; }
};

int main(int argc, char *argv[]) {
  Foo a = Foo();
  std::cout<<"Hello."<<std::endl;
  return 0;
}
```

素直に考えればこんな順序になります。

1. Foo() はデフォルトコンストラクタを呼出し、一時オブジェクトを生成する。
2. コピーコンストラクタが起動して a を構築する。
3. 完全式の終わりで一時オブジェクトはデストラクタで解体される。
4. Hello. と出力する。
5. a がデストラクタで解体される。

これを踏まえて出力結果を予想するとこうです。

```
default constructor.
copy constructor.
destructor.
Hello.
destructor.
```

でも、コンパイラ (処理系) によって、あるいは最適化オプションの違いなどによってこうなる場合もあります。

```
default constructor.
Hello.
destructor.
```

いったいどちらが正しいのでしょうか？

ここで規格を参照してみましょう。 JISX3014:2003 の 12.8 にはこうあります。

> 処理系は、ある基準が満たされれば、そのクラスオブジェクトのコピーによる構築を省略してよい。 これは、このオブジェクトのコピーコンストラクタ及び/又はデストラクタが副作用をもつ場合も含む。 コピーによる構築を省略する場合、処理系は、省略されたコピー演算のコピー元とコピー先を、同一オブジェクトに対する二つの異なる参照として扱い、この最適化を施さなかった場合に二つのオブジェクトが解体される時点の遅いほうで、そのオブジェクトを解体する。

この場合に当て嵌めれば、 a は一時オブジェクトの参照として扱われ、オブジェクトの解体は return のタイミングということになります。 しかし、この省略はあくまでも「してもよい」というものです。 しなくてもよいのです。 つまり、上述のふたつの例はどちらも規格に適合しているのでした。

具体的に省略が許される条件まではここでは述べませんが、オブジェクトを構築する以外の副作用をコピーコンストラクタに持たせている場合には注意が必要だということは覚えておくとよいでしょう。 ちなみに gcc だと -fno-elide-constructors というオプションを付けることによって省略しないように強制することが出来ます。

# C++17 における保証

従来はコンパイラが選択してよいとしていた上記のようなコピーの省略について、策定中の次期仕様 C++17 では常に省略するよう保証を追加するようです。

参考： [C++1z 値のコピー省略を保証 - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/2017/01/24/161342)
テキストファイルを任意の場所から読む方法

テキストファイルは始めから一行ずつ読み込んでいくのが普通ですが、以下の方法を使うとテキストファイルの途中から読み始めることが出来ます。詳細は、http://d.hatena.ne.jp/funayoi/20080120/1200837828 を参照してください。

```
// ファイルストリームを開く
var fs = System.IO.File.OpenRead("file.txt");
// 先ほどのファイルストリームを元に、Shift-JISのテキストを読み込むストリームを作成
var sr = new System.IO.StreamReader(fs, System.Text.Encoding.GetEncoding("Shift_JIS"));

// ファイルの中間の場所にシーク
long pos = fs.Length / 2;
fs.Seek(pos, System.IO.SeekOrigin.Begin);
// シークした位置から一行読み込む
string line = sr.ReadLine();
```

ちなみに、ファイルの位置はStreamReaderオブジェクトのPositionプロパティで取得できます。
C#によるRubyっぽい繰り返し

Rubyを勉強して、10.times do～endを見たとき、C#でも使いたいなぁと思ったので、拡張メソッドで作ってみました。

```
public static class Extentions
{
	public static void For(this int i, Action action)
	{
		for(int j = 0; j < i; j++) {
			action();
		}
	}

	public static void For(this int i, Action<int> action)
	{
		for(int j = 0; j < i; j++) {
			action(j);
		}
	}
}
class Program
{
	static void Main(string[] args)
	{
		10.For(() => Console.WriteLine("for"));
		Console.WriteLine();
		10.For(i => Console.WriteLine(i));

		Console.Read();
	}

}
```

結果は以下の通り。

```
for
for
for
for
for
for
for
for
for
for

0
1
2
3
4
5
6
7
8
9
```
zsh、ssh の補完で .ssh/config の設定を読む。

補完関数を書いてみたかっただけなので既出かも知れない。

以前、[.ssh/config の一覧を表示する何か](http://qiita.com/items/2dfa2fe87edc912561d2)を書いたのだが、
最近 zsh を始めたので練習がてらに移植してみる。


```sh:.zshrc
function _ssh {
  compadd `fgrep 'Host ' ~/.ssh/config | awk '{print $2}' | sort`;
}
```

で、ターミナル開き直して普通にコマンド打って補完

```
ssh [tab]
host1 host2 ....
```

簡単すぎる orz

次は known_hosts でも追加しようか？