OmniAICreator/Qiita-1.07M huggingface dataset:
JavascriptのDateオブジェクトをStringのXXXX-XX-XXに変換する

/*
     * Convert Javascript Date Object to String XXXX-XX-XX
     */
    function getStringDate(aDate){
        var dd = aDate;
        var yy = dd.getYear();
        var mm = dd.getMonth() + 1;
        dd = dd.getDate();
        if (yy < 2000) { yy += 1900; }
        if (mm < 10) { mm = "0" + mm; }
        if (dd < 10) { dd = "0" + dd; }
        var rs = yy + "-" + mm + "-" + dd;
        return rs;
    }
ロード中イメージの表示・非表示をJSとCSSで実現

//Javascript source  (jQuery required)----------------------->>>

//call this before ajax transaction
    function setLoadingAnm(){
        $("#your_id").after("<div class=\"your_loading_img_class\"></div>");
        $("#your_id").after("<div class=\"your_loading_bg_class\"></div>");
        var pos = $("#your_id").position();
        var gridW = $("#your_id").width() + 23;
        var gridH = $("#your_id").height() + 20;
        $(".your_loading_bg_class").css({left:pos.left, top:pos.top, width:gridW, height:gridH});
        var centerW = (pos.left * 2 + gridW)/2 -30;
        var centerH = (pos.top * 2 + gridH)/2 -27;
        $(".your_loading_img_class").css("left",centerW);
        $(".your_loading_img_class").css("top",centerH);
    }

//call this after ajax transaction
    function removeLoadingAnm(){
        $(".your_loading_img_class").remove();
        $(".your_loading_bg_class").remove();
    }

//usage exapmle

function yourFunction(){
    setLoadingAnm();
    $.ajax({
            //bla bla bla...
    });
    removeLoadingAnm();

}


/*CSS------------------------>>>*/

.your_loading_img_class{
   background: url(images/loading.gif);
   height: auto;
   width: auto;
   position: absolute;
   z-index: 1001;
   display: block;
}

.your_loading_bg_class{
   background: #0000FF;
   height: auto;
   width: auto;
   position: absolute;
   z-index: 1000;
   display: block;
   opacity: 0.10;/*all with CSS3 compatibility*/
   filter: alpha(opacity=10);/*Netscape*/
   -ms-filter: alpha(opacity=10);/*IE*/
}
VPC 内の Secutiry Groups を消せないとき

VPC にある Security Groups を削除しようとしても

> resource sg-01234567 has a dependent object

などと表示されて削除できないことがあります。いったいなにが依存してるんだよ！と言いたくなりますが、EC2 の NETWORK & SECURITY に作られている Network Interfaces が依存していることがあるようです。作られている Network Interface を削除したら Security Group も削除できました。
GNU screen のコピー機能と、クリップボードの同期

`.zshrc` とか `.bashrc` にこう書く

```sh
if which xsel > /dev/null 2>&1
then
    # X Window System 環境でのコピー （xsel をインストールする必要あり）
    copy_cmd="xsel -i -b < /tmp/screen-exchange;\
              xsel -i -p < /tmp/screen-exchange"
elif which pbcopy > /dev/null 2>&1
then
    # Mac OS X 環境でのコピー （要動作テスト）
    copy_cmd="pbcopy < /tmp/screen-exchange"
elif which putclip > /dev/null 2>&1
then
    # Cygwin 環境でのコピー（要動作テスト）
    copy_cmd="putclip < /tmp/screen-exchange"
fi
[ $STY ] && [ $copy_cmd ] &&\
  screen -X bindkey -m ' ' eval "stuff ' '" writebuf "exec sh -c '$copy_cmd'"
```

bash では動作テストしてないけど多分動く。

screen でシェル立ち上げるたびにキーバインド設定されてしまうの気持ち悪いのでどうにかしたい。
PlayFramework1.2でローカルのlibにjarを追加して利用する方法

PlayFrameworkでは用意されていないjarを、自分でダウンロードして使いたい場合

（下記のサイトで発見
 http://d.hatena.ne.jp/maneater_rhythm/20120105/1325739607 ）

dependencies.ymlに下記を追加した後、
play dependenciesコマンドを叩けば良い

```dependencies.yml
require:
    - provided -> evernote-api 1.20
    
repositories: 
    - provided: 
        type:       local 
        artifact:   "${application.path}/lib/[module]-[revision].jar" 
        contains: 
            - provided -> * 
```
Railsでよく使うDSLのfiletypeを設定する

GemfileとかDSLで書かれた設定ファイルがrubyのファイルとして認識されずシンタックスハイライトやインデントが効いてないときがある。そういうときの設定。

```.vimrc
autocmd BufNewFile,BufRead Gemfile setlocal filetype=ruby
```

- `Gemfile`のあとにfiletypeを設定したいファイル名やパターンを追加すればおｋ。
- `autocmd`は「あるイベント」に対して「あるパターンのファイル」に「あるコマンド」を実行させる設定
- `BufNewFile`は新しいファイルを編集するイベント
- `BufRead`はファイルを読み込んで新しいバッファを開くイベント
- `filetype`の変更はグローバルには影響しないらしいけど、`autocmd`で変更する値は無難に`setlocal`にしておく
Lismoのアドレス帳をVCFに変換する

LSIMOのアドレス帳バックアップで取り出せる、アドレス帳はなぜかCSVなので困ります、携帯端末からSDカードにバックアップすればVCFが出てくるのに、なぜかCSVなのです。

```ruby:lismo2vcf.rb
require 'rubygems'
require 'kconv'
require 'csv'
require 'vpim'
$KCODE='u'
#Authors::   takuya_1st
#Copyright:: @takuya_1st
#License::   GPL
class CSV 
	## CSVファイルを読み込んで一行目を見出し行として、全部をハッシュに読み込む
	def CSV.csv_to_hash(filename)
		#一行目がヘッダのCSVファイル
		f = CSV.open(filename, "r") 
		header = f.shift
		f.map{|e| 
			Hash[*header.zip(e).flatten]
		}
	end

end


class LismoAddressBook


	def csv_to_vcf_array(filename)
		info_list = csv_to_info(filename)
		vcf_list = info_list.map{|info,k|
			info_to_vcf(info)
		}
	end

	def csv_into_vcf_files(filename)
		list = csv_to_info(filename)
		list.each{|info| 
			save_vcf(info)
		}
	end


	def csv_to_info(csv_file)
		hash_list = CSV.csv_to_hash(csv_file)
		hash_list.map{|e| 
			hash_to_info(e)
		}
	end
	def hash_to_info(hash)
		info ={};

		info['f_name'   ] =  hash["名前"]
		info['l_name'   ] =  "" if false
		info['kana'     ] =  hash["よみ"]
		info['email'    ] =  [hash["Ｅメール１"], hash["Ｅメール２"],hash["Ｅメール３"],hash["Ｅメール４"],hash["Ｅメール５"],].select{|e| e}
		info['tel'      ] =  [hash["電話番号１"],hash["電話番号２"], hash["電話番号３"],hash["電話番号４"],hash["電話番号５"], ].select{|e| e}
		info['home_addr'] =  "#{hash["郵便番号"]}  #{hash["住所"]}" if hash["住所"]
		info['birthday' ] =  hash["誕生日"]   if hash["誕生日"]
		info['memo'     ] = "#{hash["メモ"]}" if hash["メモ"] 

		info.delete("tel") if info["tel"].size < 1
		info.delete("email") if info["email"].size < 1
		return info
	end
	def info_to_vcf(info)
		
		vcard = Vpim::Vcard.create
		vcard << Vpim::DirectoryInfo::Field.create('N;CHARSET=utf-8'        , "#{info['f_name']};#{info['l_name']};;;"  )
		vcard << Vpim::DirectoryInfo::Field.create('FN;CHARSET=utf-8'       , "#{info['l_name']}#{info['l_name']}"      )
		vcard << Vpim::DirectoryInfo::Field.create('X-PHONETIC-FIRST-NAME'  , "#{info['kana']}"      )
		info["email"].each{|mail|
			vcard << Vpim::DirectoryInfo::Field.create('EMAIL;INTERNET'     , "#{mail}" )
		} if info["email"]
		info["tel"].each{|num|
			vcard << Vpim::DirectoryInfo::Field.create('TEL;CELL;VOICE'     , "#{num}" )
		} if info["tel"]
		vcard << Vpim::DirectoryInfo::Field.create('ADR;HOME;CHARSET=utf-8' , "#{info['home_addr']}" )
		vcard << Vpim::DirectoryInfo::Field.create('BDAY;value=date'        , "#{info['birthday']}" )
		vcard << Vpim::DirectoryInfo::Field.create('NOTE;CHARSET=utf-8'     , "#{info['memo']}" )
		vcard.to_s.gsub( /¥r?¥n/, "")
	end

	def save_vcf(info)
		require 'digest/sha1'
		vcf_string = info_to_vcf(info)
		file_name = "#{info["f_name"]}#{info["l_name"]}.vcf"
		file_name = "#{Digest::SHA1.hexdigest(vcf_string)}.vcf" if file_name.strip == ".vcf"
		open("#{info["f_name"]}#{info["l_name"]}.vcf", "w" ){|f|
			f.write vcf_string
		}
		puts "#{file_name} saved."
	end





end



converter = LismoAddressBook.new 
converter.csv_into_vcf_files("./address.csv")
Subversionのベーシック認証にkeychainを使う方法


MacでSubversionのベーシック認証のユーザIDとパスワードをkeychainに保存する方法。

$HOME/.subversion/configで、authセクションに以下を追記する。

```config
[auth]
password-stores = keychain
```

これで一度ユーザIDとパスワードを入力したら、keychainに保存される。git-svnを使っている場合もkeychainを見てくれた。

元々は$HOME/.subversion/auth/svn.simpleに平文でパスワードが保存されていた（たぶんデフォルト）ので、svn.simpleにあったファイルは全て消した。
sshでサーバ接続時のRSA鍵のエラー

MacのターミナルからRSA鍵を再設定してsshでサーバに繋ごうとしたらエラーがでた。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Please contact your system administrator.
Add correct host key in /Users/decobisu/.ssh/known_hosts to get rid of this message.
Offending key in /Users/decobisu/.ssh/known_hosts:1
RSA host key for decobisu.hogehoge.net has changed and you have requested strict checking.
Host key verification failed.
```


RSA鍵が違うらしい。以前に繋いだ時に設定した鍵が~/.ssh/known_hostsに登録されているので再設定したものと違っている。ファイルのエラーが出てる以前登録したホストの行を消せばよい。
改めて繋ぐ時に

```
Are you sure you want to continue connecting (yes/no)? 
```
と聞かれるのでyesだと新しい鍵がknown_hostsに登録される。
Jenkinsで一定サイクルに終わらなかったジョブを検出する

一定サイクルで実行するジョブを作成したとき、
ジョブの実行がサイクルの時間内に収まらなかった場合は、
次の実行がビルドキューに追加される。(※)

> (※) ジョブの設定で「可能であれば並行してビルド」を「OFF」にしている場合。
> 「ON」にしていると、Jenkins全体のジョブ並行実行数の制限に達していない限り、
> キューには追加されず、即座に実行されてしまう。)

これは、ジョブの実行時間に対して、
指定されたサイクルが短すぎるということなので、
サイクルを長くするなり、ジョブの実行時間をチューニングするなりすべきで、
一般的には良くない状態である。はず。

ではどうすれば、サイクルに収まらず、
次の実行がビルドキューに追加されてしまったジョブを、
プログラマティックに検出できるかという話。

Jenkinsには「リモートアクセスAPI」という便利なものが用意されていて、

> https://wiki.jenkins-ci.org/display/JA/Remote+access+API)

以下のURLを呼び出すことで、ビルドキューの状態がjsonで取得できる。
http://[host]:[port]/queue/api/json

```javascript:json
{
  items: [
    {
      actions: [
        {
          causes: [
            {
              shortDescription: "ユーザーkei2100が実行",
              userId: "kei2100",
              userName: "kei2100"
            }
          ]
        }
      ],
      blocked: true,
      buildable: false,
      id: 564,
      params: "",
      stuck: false,
      task: {
        name: "test_job",
        url: "http://[host]:[port]/job/test_job/",
        color: "blue_anime"
      },
      why: "ビルド #20 は既に実行中です。 (予定時間:21 秒)",
      buildableStartMilliseconds: 1340090312065
    }
  ]
}
```

このjsonで、「blocked: true」になっているものが「次の実行がビルドキューに追加されている」状態にあたるので、

> 参考 : http://javadoc.jenkins-ci.org/hudson/model/Queue.Item.html

これを検出してあげれば良い。

例えば以下のような感じ。

```ruby
#!/usr/bin/env ruby

require 'json'
require 'net/http'
require 'optparse'

def get_job_infos_with_json(host, port) 
  uri = '/queue/api/json'

  http = Net::HTTP.new(host, port) 
  http.open_timeout = 30
  http.read_timeout = 30

  begin
    http.start do 
      response = http.get(uri)
      if response.instance_of? Net::HTTPOK 
        return response.body
      else
        raise "http://#{host}:#{port}#{uri} returns #{response.code}"
      end
    end
  rescue => e
    raise "http://#{host}:#{port}#{uri} throws exception.\n caused by #{e.message}"
  end
end

def duplicate_job_start?(job_info)
  if job_info['blocked'] 
    return true
  else
    return false
  end
end

host = nil
port = nil 

# コマンドラインパラメータの取得
opt = OptionParser.new do | opt |
  opt.on('-h HOST') {| val | host = val} 
  opt.on('-p PORT') {| val | port = val} 

  opt.parse(ARGV)
end

if (!host || !port)
  puts opt.help
  exit 1
end

# Jenkisのジョブキュー情報を取得
job_infos_json = get_job_infos_with_json(host, port)  
job_infos = JSON.parse(job_infos_json)

# 前回の実行が終わっていないジョブを検出
duplicate_jobs = []

job_infos['items'].each do | job_info |
  if duplicate_job_start?(job_info) 
    duplicate_jobs << job_info
  end
end

if duplicate_jobs.size > 0
  puts "Previous job has not finished yet..."
  duplicate_jobs.each do | job_info |
    puts "job name : #{job_info['task']['name']}"
  end
  exit 1
else
  exit 0
end
```
見やすいgit-grep

```.zshrc
alias gg="git grep -H --heading --break"
```

```.gitconfig
[grep]
  lineNumber = true
```
![git-grep](http://gyazo.com/6896ca7dc18ae1ab53e05e6efa3602b9.png?1341209674)

- `-H`でファイル名を相対パスにする
- `--heading`でファイル名をヒットした行の上にまとめて表示する
- `--break`で空行を入れる
- `git config --global grep.lineNumber true`と打つと、デフォルトでヒットした行数を表示する

---
### 訂正
- `-H`はフルパスじゃなくて相対パスでした（manの英語がわかりにくい
pryを使った快適なRubyライブラリのコードリーディング&開発方法

この記事は[Ruby開発環境 Advent Calendar / Jul.](http://qiita.com/advent-calendar/ruby-devenv)の1日目の記事です．参加は「[7/1よりRuby開発環境アドベントカレンダーを開始します!](http://qiita.com/items/8fc562a44e528169ed91)」から!
7/2になってしまってごめんなさい．

tmuxによる縦分割，pryを使った快適，高速なコードリーディング&開発について書きます．
以下では[resque](https://github.com/defunkt/resque)のコードを読んだり，手を加えたりするという想定で話を進めます．

## 事前準備
それぞれのツールについては
pry: [ググるよりもまずはpry - Qiita](http://qiita.com/items/2b36068cdf2e40e75c2d)
tmux: [tmuxタグページ](http://qiita.com/tags/tmux)
あたりを参考に．
以下，必要なものをインストールします．


```ruby
gem install -r gem-browse pry pry-doc
cd /tmp
gem clone resque
cd resque
# tmuxを使って画面を縦半分に割る
# 左: vim -R lib/redis.rb
# 右: pry -Ilib
```

![](https://dl.dropbox.com/u/164559/screenshots/Screen Shot 2012-07-02 at 12.40.46 PM.png)

上記みたいな感じ．ここでpry -Ilibがポイントです．-Ilibすることでいま見ているresqueのソースを参照させます．


## pryのedit, edit-methodをうまく使う
pry内で`edit lib/resque.rb:50`のように実行すると，`lib/resque.rb`の50行目にカーソルが移動した状態でエディタが立ち上がります．(ちなみにぼくはemacsclientを使ってます)
そこで適当に編集し，保存して戻ってくると変更が反映されているので，pryで実行すると挙動が変わっているのがわかると思います．

特定メソッドを編集したい場合は`edit-method Resque#redis`という形でも指定できます．便利!

## binding.pry
実行時のローカル変数を見たいとき，毎回ソースに`p @foo`を入れて実行→結果を見てまた`p @bar`を入れて実行，は面倒すぎる．そこで`binding.pry`です．ブレークポイントを設定できます．
上記の`edit`や`edit-method`を使って目的の場所に`binding.pry`を入れてメソッドを呼ぶと，binding.pryの行で実行が止まり，その行のスコープに入ってpryを開いてくれます．あとはローカル変数を覗くなりステップ実行するなりメソッドを呼ぶなりするなりお好きなように．
`edit -c`するとその行をエディタで開いてくれます．


## まとめ
```
pry -Ilib
[1] pry(main)> edit lib/foo.rb:10
[2] pry(main)> edit-method Foo#bar
[3] pry(main)> …
```

文章による説明だとあまり便利さが伝わりにくいのですが，コードリーディング時にメソッドの挙動を確認したい，少し変更したいときなんかにはとても便利なので，一度試してみてください．
Insert command で方向キーで移動できない問題の対処法

補完を選べなくなるかもしれないけど。多分こんな感じ

```vimrc
" keys in display mode
map OA  k
map [A  k
map OB  j
map [B  j
map OD  h
map [D  h
map OC  l
map [C  l
map [2~ i
map [3~ x
map [1~ 0
map OH  0
map [H  0
map [4~ $
map OF  $
map [F  $
map [5~ 
map [6~ 
map [E  ""
map [G  ""
map OE  ""
map Oo  :
map Oj  *
map Om  -
map Ok  +
map Ol  +
map Ow  7
map Ox  8
map Oy  9
map Ot  4
map Ou  5
map Ov  6
map Oq  1
map Or  2
map Os  3
map Op  0
map On  .

" keys in insert/command mode
map! <Esc>[H <Home>
map! <Esc>OH <Home>
map! <Esc>[F <End>
map! <Esc>OF <End>
map! <Esc>OA <Up>
map! <Esc>OB <Down>
map! <Esc>OC <Right>
map! <Esc>OD <Left>
map! <Esc>[3~ <Delete>
map! <Esc>OE  <Space>
	
```


via: http://xxki.com/tutorial/pukiwiki.php?vi/vmrc collection
bindParam()とbindValue()の違い

## 変数を評価するタイミング
```php:bind_value.php
$statement = $database->prepare('INSERT INTO favorite_category (id_users, category_id) values(:id, :category_id)');
$id = 3;
$categoryID = 10;
$statement->bindParam(':id', $id);
$statement->bindParam(':category_id', $categoryID);
$statement->execute();
 
$statement->bindValue(':id', 3);
$statement->bindValue(':category_id', 10);
$statement->execute();
```

bindParam()は変数を入れないとエラーが出る。bindValue()は値を直接入れても、変数を入れてもOK。
bindParam()はexecute()された時点で変数を評価する。bindValue()はすぐに変数を評価。

```php:bind_param.php
$a = [
    'id' => 2,
    'user' => 'jack',
    'sex' => 1,
    'prefecture' => 24
];
 
$statement = $db->prepare('INSERT INTO users (id, name, sex, birthday, prefecture) VALUES (?, ?, ?, ?)');
 
$statement->bindParam(1, $a['id'], PDO::PARAM_STRING);
$statement->bindParam(1, $a['name'], PDO::PARAM_INT);
$statement->bindParam(2, $a['sex'], PDO::PARAM_INT);
$statement->bindParam(4, $a['prefecture'], PDO::PARAM_STRING);
$statement->execute();
```

bindParam()はその場では変数が評価されないので未定義の配列を指定してもエラーが出ないし、未定義のまま実行してもエラーは出ない。bindValue()だと未定義の配列を指定するとエラーが出る。

## bindParam()の副作用(?)

```php:strange_behavior.php
$statement = $database->prepare(/** 省略 **/);
$id = 3;
$statement->bindParam(':id', $id, PDO::PARAM_INT);
var_dump($id); //=> int(3);
$statement->execute();
var_dump($id); //=> string(1) "3"
```

`bindParam()`を使った場合にのみ発生する。`execute()`を実行したあとに`bindParam()`に渡した変数が文字列型になってしまう。`strange_behavior.php`の場合だと, `$id`が整数型から文字列型に変わっている. なので, クエリを実行した後に`$id`を何かの処理で使用する場合, 思わぬ挙動をするおそれがある.

PDOにもそんな例があって, まさに`strange_behavior.php`の`bindParam()`がそれにあたる. 第3引数に`PDO::PARAM_INT`を指定すると, バインドする変数が整数型でない場合にエラーとなってしまう. 変数`$id`を使って何度もクエリを実行する場合には, 結構厄介な問題になる気がする.
node.jsでコールバックのネストを浅くする

```javascript:app.js
var fs = require('fs')
, path = '/tmp/fs.txt';

console.log('非同期処理です');
fs.writeFile(path, 'hello', function (error) {  //ファイルを作成
    fs.open(path, 'a', 0666, function (error, file) {   //ファイルをオープン
        fs.write(file, '\nworld', null, 'utf-8', function () { //ファイルに書き込み
            fs.close(file, function (error) {   //ファイルポインタをクローズ
                fs.readFile(path, 'utf-8', function (error, data) { //ファイル読み込み
                    console.log(data);  //コンソールに出力
                });
            });
        });
    });
});
console.log('こっちが先');
```

たとえばこんな処理。ネストが深くなってて読みづらい。
こんな時にフロー制御ライブラリを使うと、ネストを浅くできて可読性が増す。
とりあえず最も有名っぽいasyncを使う。

```bash:
npm install async
```
インストール終わり。

```javascript:async.js
async.waterfall([処理1, 処理2, 処理3], 処理が終了した時の処理);
```
処理1→処理2→処理3→処理が終了した時の処理
という順で実行される。

さっきのコードをasyncで書いてみる。

```javascript:fsAsync.js
var fs = require('fs')
, async = require('async')
, path = '/tmp/fsAsync.txt';

console.log('非同期処理です');
async.waterfall(
    [
    function(callback) {
        //ファイルを作成
        fs.writeFile(path, 'hello', function(error, file){
            callback(null);
        });
    },
    function(callback) {
        //ファイルポインタを生成
        fs.open(path, 'a', 0666, function (error, file){
            callback(null, file);
        });
    },
    function (file, callback) {
        //書き込み
        fs.write(file, '\nworld', null, 'utf-8', function () {
            callback(null, file);
        });
    },
    function(file, callback) {
        //ファイルポインタをクローズ
        fs.close(file, function (error){
            callback(null);
        });
    },
    function(callback) {
        //ファイルの中身を読み込む
        fs.readFile(path, 'utf-8', function(error, data) {
            console.log(data);  //コンソールに出力
            callback(null);
        });
    }
    ], function (error) {
        console.log('終わり');
    });
console.log('終わりじゃない');
```

縦に長くなっただけではないかと思われるけど、可読性は向上している。たぶん。
起動したシェルスクリプトのパスをさっさと取っておく


シェルスクリプト使って色々やっていると、なんだかんだで起動したスクリのディレクトリ位置を絶対パスで欲しくなるので、自分で用意する分は起動直後に、これでさっさとパスを取得しています。

``` bash:script.sh
DIR_SCRIPT=$(cd $(dirname $0) && pwd)
DIR_BASE=${DIR_SCRIPT}/..
. ${DIR_SCRIPT}/config
```

主に自分用になにか作っている場合は、プロジェクトルートにscriptsディレクトリを作っているので、プロジェクトルートも取れて便利
RubyのTDDのベストプラクティス


この記事は、[RubyのAdvent Calendar](http://qiita.com/advent-calendar/ruby-devenv)の2日目の記事です。
オライリーの『Rubyベストプラクティス』のテスト駆動開発の章をまとめました。
開発環境とrubyとテストに関する記述が入り交じっています。

##テストができるように設計する
1.大きなテストにすると、失敗した場合に、どこが原因で引っかかったかわかりにくい
2.小さなテストを追加する→レッドになるようにする→グリーンにする→リファクタリングする→始めに戻る
3.単純なテストから追加する
4.可読性向上のため、mustメソッドを使う

```ruby:must.rb
class TC_Foo < Test::Unit::TestCase
  def setup
    @obj = Foo.new
  end

  must "be foo" do
    assert_equal("foo", @obj.foo)
  end
  must "be bar" do
    assert_equal("bar", @obj.bar)
  end
end
```
mustメソッドの実装は下記の通り。
https://github.com/sandal/rbp/blob/master/testing/test_unit_extensions.rb


##テスティングの基礎
1.上記と重なるが、レポートが詳細な意味を持つようにするために、テストケースは小さくアトミックに保つ
2.例外をテストする

```ruby:例外が起きることを期待する場合
class LockBoxTest < Test::Unit::TestCase
  def setup
    @lock_box = LockBox.new( password:"secret",
			     content:"My secret message") 
  end

  must "raise an error when an invalid password is used" do
    assert_raises(LockBox::InvalidPassword) do
      @lock_box.unlock("kitten")
    end
  end
  must "Not raise error when a valid password is used" do
    assert_nothing_raised do
      @lock_box.unlock("secret")
    end
  end
end
```
3.rakeタスクを使ってテストを自動実行する

```ruby:rake.rb
require 'rake/testtask'

task :default => [:test] 

Rake::TestTask.new do |test|
  test.libs << "test"
  test.test_files = Dir["test/test_*.rb"]
  test.verbose = true
end```
##高度なテストテクニック
1.外部とのインタラクションと内部処理を切り分ける
2.外部のテストには、モックとスタブを使う。おすすめはflexmockライブラリ

```ruby:例
require 'flexmock/test_unit'

class HapinessTest < Test::Unit::TestCase
  def setup
    @questioner = Questioner.new
  end

  must "respond 'Good I'm Glad' when inquire_about_hapiness gets 'yes'" do
    stubbed = flexmock(@questioner,:ask => true)
    assert_equal "Good I'm Glad",stubbed.inquire_about_hapiness
  end

  must "respond 'That's Too Bad' when inquire_about_hapiness gets 'no'" do
    stubbed = flexmock(@questioner,:ask => false)
    assert_equal "That's Too Bad",stubbed.inquire_about_hapiness
  end
end
```
3.xmlの比較は、一つにまとめてするのではなく、nokogiriライブラリを使って分解してやろう

##整理しておく
1.ライブラリファイルにテストを組み込む

```ruby:if文でラップするだけ
class Foo
  #...
end  

if __FILE__ == $PROGRAM_NAME
  require "test/unit"

  class TestFoo < Test::Unit::TestCase
    #test
  end  
end
```
2.テストヘルパーを一つのファイルにまとめて定義して、pathで直接requireする
3.組み込みのアサートで間に合わないなら、カスタムアサーションをassert_blockでつくる

```ruby:assert_block
def assert_in_zone(expected,person)
  assert_block("Expected #{person.inspect} to be in Zone #{expected}") do
    person.current_zone.eql?(Zone.new(expected))
  end
  assert_block("Expected #{person.inspect} not to be in Zone #{expected}") do
    !person.current_zone.eql?(Zone.new(expected))
  end
end```##後口上ruby特有のベストプラクティスというよりは、テスト一般のお話でした。
以前にRailsの2系を少し触った程度で、普段Rubyを使わないのですが、各方面からRails3系を推されたため、最近オライリーの『Rubyベストプラクティス』を現在読んでいるところです。何か良いtipsや本があればご紹介お願いします。
短絡評価して最初に現れたNone以外の値を返す関数

Pythonで、短絡評価して最初に現れたNone以外の値を返す関数の書き方について考えてみました。

まずは例として3つの式、`yahoo()`、`google()`、そして`ask()`を順番に評価し、最初に現れたNone以外の値を返す関数`get_answer()`を実行する get_answer.py を普通に書いてみました。動作はPython 2.7.3と Python 3.2.3で確認しています。

```python:get_answer.py
#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import print_function

yahoo = lambda *_: print("in yahoo()") or None
google = lambda *_: print("in google()") or 0
ask = lambda *_: print("in ask()") or "draw"


def get_answer(question):
    answer = yahoo(question)
    if answer is None:
        answer = google(question)
        if answer is None:
            answer = ask("sagami", question)
    return answer

if __name__ == '__main__':  # pragma: nocover
    print("Answer is {}.".format(get_answer("1 - 1")))
```

これを実行すると、

```
in yahoo()
in google()
Answer is 0.
```

のように表示されます。`google(question)`を評価してNone以外の値である0が得られましたので、`ask("sagami", question)`は評価されていません。
if文のネストを浅くしたいのであれば、行数は若干増えますが、

```python
def get_answer(question):
    answer = yahoo(question)
    if answer is not None:
        return answer
    answer = google(question)
    if answer is not None:
        return answer
    return ask("sagami", question)
```

のように書くこともできます。しかし、この関数を

```python
def get_answer(question):
    return (yahoo(question) or
            google(question) or
            ask("sagami", question))
```

や

```python
def get_answer(question):
    for answer in (yahoo(question),
                   google(question),
                   ask("sagami", question)):
        if answer is not None:
            return answer
    return None
```

のように書くことはできません。前者を実行すると、

```
in yahoo()
in google()
in ask()
Answer is draw.
```

となって、None以外の値である0が無視されてしまいますし、後者を実行すると、

```
in yahoo()
in google()
in ask()
Answer is 0.
```

となって、評価する必要がない`ask("sagami", question)`まで評価されてしまいます。

そこで色々悩んだ結果、デコレータ`@anyone`を使うことで、

```python
@anyone
def get_answer(question):
    yield yahoo(question)
    yield google(question)
    yield ask("sagami", question)
```

と書く方法を思いつきました。`@anyone`の中身は、

```python
def anyone(function):
    def _(*args, **kwargs):
        for value in function(*args, **kwargs):
            if value is not None:
                return value
        return None

    return _
```

です。`get_answer()`はシンプルに書けるようになったと思うのですがいかがでしょうか？
他に何かもっと良い方法があれば、教えていただけると助かります。

以下は、`@anyone`を使って書き直した get_answer.py です。

```python:get_answer.py
#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import print_function

yahoo = lambda *_: print("in yahoo()") or None
google = lambda *_: print("in google()") or 0
ask = lambda *_: print("in ask()") or "draw"


def anyone(function):
    def _(*args, **kwargs):
        for value in function(*args, **kwargs):
            if value is not None:
                return value
        return None

    return _


@anyone
def get_answer(question):
    yield yahoo(question)
    yield google(question)
    yield ask("sagami", question)

if __name__ == '__main__':  # pragma: nocover
    print("Answer is {}.".format(get_answer("1 - 1")))
```
Javascriptで扱えるカッコイイグラフのまとめ



##結論:Highchart
ccchart(canvasChart)と悩みましたが、Highchartを選んだ理由は、下記の通りです。

1.円グラフや棒グラフを組み合わせた複合的なグラフのサンプルを載せている
2.複合グラフのアニメーションがかっこいい

商用ライセンスなので、無料にこだわる方は、ccchart(canvasChart)がおすすめです。

##Highchart
http://www.highcharts.com/

>表現力、完成度の点でいちばんだと思います。商用なのでお金さえあればこれがイチオシ。

##ccchart(canvasChart)
http://jsgt.org/c/

>私のイチオシは canvasChart です 
ライセンスは PUBLIC DOMAIN! 

##raphael.js
http://raphaeljs.com/

>qiitaのプロフィールの円グラフで使われているjQueryプラグイン
美しめなグラフを作成することができる。
raphael.jsのプラグインのelycharts.js
http://elycharts.com/docs

##Google Chart Tools
https://developers.google.com/chart/ 

>Google Chart Tools も良いかと思いますが、 3D棒グラフが出来たかどうかが謎です。


>僕が自分で使おうと決めたのはこれ。デモを見ただけだと貧弱に見えるのですが、グラフの種類とオプションなど柔軟性があり、アニメーションやドロップシャドウなどもできて、実はHighChart並の表現力と柔軟性があります。オープンソースなので、気軽に使えますし、プログラミングしがいがあります。

##SenchaTouch Chats
http://extjs.co.jp/products/touch/

>これも表現力、種類など十分です。ただ円グラフの凡例がちょっと独特だったので、見送りました。

Flot
http://code.google.com/p/flot/ 
Flotr
http://solutoire.com/flotr/ 
jqPlot
http://www.jqplot.com 
jQuery Sparkline
http://omnipotent.net/jquery.sparkline/ 
jQuery-Visualize
https://github.com/filamentgroup/jQuery-Visualize 
MilkChart
http://mootools.net/forge/p/milkchart 
moochart
http://moochart.coneri.se/ 
MooWheel
http://www.labs.unwieldy.net/moowheel/ 
PlotKit
http://www.liquidx.net/plotkit/ 
table2chart
http://mootools.net/forge/p/table2chart 
TufteGraph
http://xaviershay.github.com/tufte-graph/ 
YUI Charts
http://yuilibrary.com/yui/docs/charts/ 

上記は、html5のユーザーグループへの投稿に対する返信をまとめたものです
https://groups.google.com/forum/?fromgroups#!topic/html5-developers-jp/dmkGbLJ6CAo
Emacsのclojure-modeを更新したい


clojure-modeはELPAパッケージを使って入れてたのだが、メンテの流れが滞ってるっぽい?!

ググると[Marmalade](http://marmalade-repo.org/)なるリポジトリが良いみたいな？
ELPA完全互換で流れもよさげなので切り替えまする。

ここのサイトからpackage.elをコピペって設置してみる。
書いてあるelispを記述してevalる、いやemacs再起動。

```init.el
(require 'package)
(add-to-list 'package-archives 
    '("marmalade" .
      "http://marmalade-repo.org/packages/"))
(package-initialize)
```

書いてある通りやってみる。

```
M-x package-refresh-contents	
```


さっそくパッケージリスト一覧を見てみる。

```
M-x package-list-packages
```

リターンキーでコネクトしてくれて一覧とパッケージ情報を表示してくれるので、一覧からclojure-modeをセレクトする。

パッケージ情報のところの`Install`を押すとインストールしてくれる親切さ、素晴らしい (・∀・)

clojure-modeの設定をinit.elに記述する。

```init.el
(require 'clojure-mode)
(defun turn-on-paredit () (paredit-mode 1))
(add-hook  'clojure-mode-hook 'turn-on-paedit)
```

さっそくleiningenでClojureプロジェクトを作ってみる。

```
>lein new sample
```

emacsでフォルダを開く
```
C-x C-f sample
```

ここで```M-x clojure-jack-in```としたらREPLが自動的に立ち上がった (*´∀｀*)
こんなにお手軽になってるなんて！素晴らしい。
gitでありがちな問題の解決方法まとめ

[Git Advent Calendar / Jun.](http://qiita.com/advent-calendar/git) 最終日(30日目)の記事です．29日目は「[いざという時のためのgit reflog](http://qiita.com/items/e37c707938847aee671b)」でした．
Git Advent Calendar最後なので，git操作でやりがちなミスからどう回復するかをまとめます．他にもあればコメントもらえるとマージしていきます．


## ブランチを切り忘れてmasterでコミットしてしまった
その時点でブランチを切る&reset --hardで間違ったコミットたちをmasterから消す

```sh
$ git checkout -b new-branch
# masterの最新コミットを消す
$ git checkout master && git reset --hard HEAD~
```


## ブランチを移動し忘れてコミットしてしまった
cherry-pickでコミットを引っ張ってくる．

```sh
# 現在間違ったブランチ(bad-branch)にいる
$ git checkout good-branch
$ git cherry-pick bad-branch # 間違ったブランチに行なったコミットを持ってくる
# 間違ったブランチに行なったコミットを消す
$ git checkout bad-branch && git reset --hard HEAD~ 
```


## 間違ったコミットをpushしてしまった
個人プロジェクトならコミットを消して[反則技のgit push -f](http://qiita.com/items/e37c707938847aee671b)する．そうでないなら，可能な限り速やかにgit revertを使って「間違ったコミットを打ち消すコミット」を行ない，pushする


## マージ済みのブランチが大量にある
`git branch --merged`で一覧が見られるので，masterとカレントブランチ以外を以下のようにして消す．

```sh
$ git branch -d $(git branch --merged | grep -v master | grep -v '*') # masterと現在いるブランチは消さない
```


## 間違ってreset --hardで戻しすぎた
git reflogを使う．詳しくは昨日のエントリ([いざという時のためのgit reflog](http://qiita.com/items/e37c707938847aee671b))を参照．

## 重要なstashを消しちゃった
`git stash drop`したり，`git stash pop` -> `git reset --hard`したとき．
`git fsck`するとdangling commitが見られるので，`git cherry-pick <SHA1>`か`git stash apply <SHA1>`してあげるとよい．
git gcが走ってたら消えてるかも．

## コミットメッセージでtypoした
直前のコミットの場合は`git commit --amend`を使う．amendと打つのが面倒なので，`git commit --amend`は`git fix`にエイリアスしてる

```sh
$ git commit # コミットメッセージでtypoした
$ git commit --amend # 入力しなおす
```


## ブランチを移動しようとしたら怒られた
以下のようなメッセージが出たとき

```sh
$ git checkout fix/piyo
error: Your local changes to the following files would be overwritten by checkout:
        config/deploy.rb
Please, commit your changes or stash them before you can switch branches.
Aborting
```

消してもいい変更なら`git reset --hard HEAD`とか`git co .`する．後者をよく使う．
消さずに保存したい場合はきちんとコミットするか，stash saveする．
git stashについては[fukajuneさんの「変更を一時的に退避！キメろgit stash」](http://qiita.com/items/41288806e4733cb9c342)が詳しいです．


## 昔のコミット内容にちょっとしたバグを見つけた
**そのコミットをまだpushしていない場合限定**
新しく行なった変更を以前のコミットに含めたい．
### 直前のコミットに含めたい
上記の`commit --amend`を使うとよい．

### それ以上古いコミットに含めたい
変更をcommitしたあと，`git rebase`を使う．

```sh
$ git commit -m '適当なメッセージ'
$ git rebase -i HEAD~3 # 修正したいコミットを指定
# エディタが立ち上がるので，'適当なメッセージ'のコミットを修正したいコミットの下に移し，先頭をsquashに変更する
```


## その他困った
[QiitaのGitタグ投稿](http://qiita.com/tags/Git)を見るか，[git-tasukete](https://github.com/rosylilly/git-tasukete)に助けを求めてみる
jenkinsのtmpdirを変更する

jenkins自身は、tmpdirを設定するパラメータは持っていないので、javaの引数で指定する。

```
JAVA_ARGS="-Djava.io.tmpdir=/var/lib/jenkins/tmp"
```

てな感じ。

コレ変えとかないと、tmpdirがチープな環境でやってる場合にmaster自身がリソース不足でオフラインにされたりして実行に難儀する。
再帰や繰り返しが面倒な順列/組み合わせの生成もRubyなら一瞬

順列なら `Array#permutation`

```ruby
perm = (1..3).to_a.permutation(3)
perm.to_a
# => [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
```

組み合わせなら `Array#combination`

```ruby
comb = (1..4).to_a.combination(2)
comb.to_a
# => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
```

どちらも引数無しなら Enumerator が返ってくる。各要素について処理したいならブロックも渡せる。

これで順列/組み合わせで再帰に悩む必要はなくなった！やったね！
Facebook: graph apiの形式で、fqlを利用する。

graph apiを利用している時に、たまにfqlで情報を取りたいときがあります。
その時には、下記のように、fql prameterを利用すると取得出来ます。
行末の、localeは、その言語で登録した表記に変更されます。

```
https://graph.facebook.com/fql?q=select first_name,last_name,name from user where uid in ( select uid2 from friend where uid1 = me() )&locale=JP_ja
```

ちなみに、ruby on railsで実装するには、RestClientを利用すると便利です。
下記のような感じになります。

```

require "rest_client"

    _fql = "SELECT+name+,+uid+FROM+user+WHERE+uid+in+(+select+uid2+from+friend+where+uid1=me()+)"
    res = RestClient.get "https://graph.facebook.com/fql?q=#{_fql}&access_token=#{me.token}"
```
Xcode4 でスキームが "Mac 32-bit" となり iOS が選択出来なくなる現象


Xcode プロジェクトファイルを SVN Update した際によく起こる現象。

1. ツールバー上のスキームボタンの左側クリック "Edit Scheme…"
2. "Info" タブ
3. "Executable" を開いて今選択されているものを選択して閉じる

まったく意味の無い作業だが、これをすると iOS デバイスやシミュレーターを選択出来るようになる。Xcode のバグと思われる。
MBA構築

#MBA構築時のメモ
MBA環境を構築した時のメモをとりあえず書いてみようかなと思います。

## google japanese inputインストール

日本語入力は慣れてる環境でやりたい

## chromeインストール

わからない事があっても素早く調べれないと困るので、safariで調べていい感じにインストールします

## iTerm2をインストール

WEBで検索してダウンロードして、インストール（AppStoreにない）

## homebrewインストール
* Xcode
http://itunes.apple.com/jp/app/xcode/id497799835?mt=12

* Xcode command line tools

* home brew

```
/usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"
```

* homebrewが正しくインストールしてあることを確認

```
brew doctor
```

* homebrewでインストールするパッケージ

```
 brew install ImageMagick
 brew install mysql
```

## SCM使えるようにする

* sshキー作成

```
 ssh-keygen
 cat .ssh/id_rsa.pub
```

* git-hub, bitbucketへそれぞれ登録する


## 設定ファイルの配置

* dotfiles

```
 git clone git@github.com:fukajun/dotfiles.git
 ```

## Rubyのインストール
オプションを指定せずに、インストールしてしまうと、irbで文字化けしてしまうので
rvmが用意しているreadlineをインストールして、それを利用してRubyをインストール
する。

* RVM

```
curl -L https://get.rvm.io | bash -s stable
rvm requirements
rvm pkg install readline
rvm pkg install zlib --verify-downloads 1
rvm pkg install openssl
rvm install 2.0.0
```

# 個人的なソフトウェア

## witchをインストール

Tab切り替え動作変更ソフト
http://manytricks.com/witch/
「補助用装置にアクセスできるようにする」を有効にする

## Dropboxインストール

Dropboxや

## BetterTouchツールのインストール

http://www.boastr.de/

## vim

```
brew install vim
```

```
mkdir -p ~/.vim/bundle
git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

## ec2ssh

https://github.com/mirakui/ec2ssh

## tmux

```
brew install tmux
```

## OhMyZsh

https://github.com/robbyrussell/oh-my-zsh
勉強会の参考問題の解答例。pythonで。

7/6(金) に行われる予定の勉強会( http://atnd.org/events/30285 )の参考問題( http://qiita.com/items/cbc3af152ee3f50a822f )の解答例、もう一つ。
まだ出てない言語で書こうということで、python。

```python:poka.py
# -*- coding: utf-8 -*-
import re

Q=[ "DASAD10CAHA", "S10HJDJCJSJ",
  "S10HAD10DAC10", "HJDJC3SJS3",
  "S3S4H3D3DA", "S2HADKCKSK",
  "SASJDACJS10", "S2S10H10HKD2",
  "CKH10D10H3HJ", "C3D3S10SKS2",
  "S3SJDAC10SQ", "C3C9SAS10D2"]

def hand_name( d ):
  if d==[1,4]:  return '4K'
  if d==[2,3]:  return 'FH'
  if d==[1,1,3]:  return '3K'
  if d==[1,2,2]:  return '2P'  
  if d==[1,1,1,2]:  return '1P'
  return '--'

def rank_dist( ranks ):
  map={}
  for r in ranks:
    if r in map:
      map[r]+=1
    else:
      map[r]=1
  dist = map.values()
  dist.sort()
  return dist
  
p = re.compile( r"[SHDC]([JQKA\d]+)"*5 )
for q in Q:
  mo=p.match( q )
  ranks=sorted( [ mo.group( x+1 ) for x in range(5) ] )
  dist=rank_dist( ranks )
  print hand_name( dist )
```

ほとんどまったく python の経験はないので、たぶんずっとうまく書けるんだと思う。特に、rank_dist 関数がすごく間抜けな感じ。

return 書かなくちゃいけないんだとか、括弧省略できないのかなとか、そういう新鮮さがあった。

リスト内包表記は醍醐味だから使わなきゃね、とか。
いざという時のためのgit reflog

[Git Advent Calendar / Jun.](http://qiita.com/advent-calendar/git) 29日目の記事です．28日目は[@uasi](http://qiita.com/users/uasi)さんの「[どこでも使える git diff と git apply](http://qiita.com/items/905376f02ff029fb23f8)」でした．

「間違ってマージしていないブランチを消した」「reset --hard HEAD^*で戻しすぎた」ということがたまにある．
しかし`git reflog`を使うと(GCされていなければ)過去のあらゆるコミット履歴を見ることができ，git logやgit branchでは辿り着けない時点まで戻すことができる．

```sh
$ git reset --hard HEAD^^ # HEAD^と指定するつもりが間違えた!
$ git reflog
f5cb888 HEAD@{0}: head^^: updating HEAD
b0b8073 HEAD@{1}: merge @{-1}: Merge made by the 'recursive' strategy.
fe3972d HEAD@{2}: checkout: moving from fix/some-bug to master
$ git reset --hard HEAD@{1} # reset --hard HEAD^^する前に戻れる
```

歴史を書き換え間違えたときのために覚えておくと便利!
引数を渡さなかった際にデフォルト値を使う場合の注意点

## よくやる variable = argument || default_value; パターン は割と罠
jQuery のソースコードなり、色んな実装で見るこのパターンのことです。

``` javascript
/**
  * @param {number} value
  * @param {number=} opt_value
  * @param {(function():*)=} opt_callback
  */
function doSomething(value, opt_value) {
   var option = opt_value || 10; // opt_value が渡されていなかったらデフォルト
   /**
     * 以下なんらかの処理
     */
}
```

これは `undefined` を boolean キャストして `false` が返る仕様を利用したテクニックですが、実際は割と限定された用途で書けるものだと捉えた方が良いです。

## まずいパターン
このようなコンストラクタを作った場合

``` javascript
function Hoge(foo, opt_bar) {
  this.foo = foo || 'foo';
  this.bar = opt_bar || 10;
}
```

### 目的を持って null を渡す場合に無効化される
`null` も `undefined` 同様 `boolean` として扱うと `false` を返します。

``` javascript
var hoge = new Hoge('hey', null);
hoge.bar; // 10
```

### opt_value が 0, false が渡って、それに意味がある場合
同様に `boolean` として扱うと `false` になるものもすべて無効化されます。
ありがちなのは、明示的に `0` を渡して無効化されてるケアレスミス

``` javascript
var hoge = new Hoge('hey', 0);
hoge.bar; // 10
```

### opt_value をバリデーションしないと挙動が想定してない結果になる場合
利用側でそもそも渡すべきではない、という方針もありだけど (というか、そうであれば optional arguments を設計に入れない方が良い)、こういった失敗のパターン

``` javascript
/**
  * @param {Array.<number>} scores
  * @param {number=} opt_index
  * @return {number}
  */
function average(scores, opt_index) {
   var l = opt_index || scores.length, // option 引数で配列を絞り込むつもり
         sum = 0;
   for (i = 0; i < l; i++) {
       sum += scores[i]; // l > scores.length であった場合 undefined が加算
   }
   return sum / l; //  l > scores.length であった場合 sum が NaN になってる
}
```

## 対策
### opt_value === undefined ? default_value : opt_value; パターンにする
関数宣言内では `typeof undefined_value == 'undefined'` としなくても `RefferenceError` にはなりません。以下のように三項演算子で書くと、確実に引数が渡されていなかった、あるいは `undefined` を渡していた時のみデフォルト値を代入します。

``` javascript
function Hoge(foo, opt_bar) {
  this.foo = foo || 'foo';
  this.bar = opt_bar === undefined ? 10 : opt_bar;
}
```

### supplement() メソッドみたいなのを作る
バリデーションも込みで効率化したい場合、（というか、↑ はたくさん書くとすごい読みづらいし糞コード化する）
#### `supplement(default_value, opt_arg, opt_callback)` 
``` javascript
/**
 * @description 関数宣言内で引数をバリデーションしたり
 * @param {*} default_value
 * @param {(*)=} opt_arg
 * @param {(function(*,*):*)=} opt_callback
 * @return {*}
 */
function supplement(default_value, opt_arg, opt_callback) {
  if (opt_arg === undefined) {
    return default_value;
  }
  if (opt_callback === undefined) {
    return opt_arg;
  }
  return opt_callback(default_value, opt_arg);
}
```

#### こう使う
これで 先のサンプルをこう修正します。

``` javascript
/**
  * @param {Array.<number>} scores
  * @param {number=} opt_index
  * @return {number}
  */
function average(scores, opt_index) {
   function validate(def, val) {
     return Math.max(Math.min(def, val), 0);
   }
   var l = supplement(score.length, opt_index, validate),
         sum = 0;
   for (i = 0; i < l; i++) {
       sum += scores[i];
   }
   return sum / l;
}
```

以上です
ActiveResourceでcreated_at, updated_atのmass-assignment protectionを回避する


後段API側がRailsである場合ActiveResourceを用いてupdate_attributesを実行すると全てのattributesが後段APIにリクエストされてmass-assginment protectionでエラーになってしまう。そこでリクエストを送る前にattributesからcreated_at, updated_atを削除してこれを回避剃る方法。

```ruby
class Model < ActiveResource::Base
  alias :original_update_attributes update_attributes

  def update_attributes(params)
    self.attributes.delete('created_at')
    self.attributes.delete('updated_at')
    original_update_attributes(params)
  end
end
```
Eclipse Junoでnull解析を行う

Eclipse Junoでnull解析を行う

Eclipse Juno(4.2)から、`@Nullable`が付いたパラメータを、そのメソッド内でNullチェックしていない場合はwarningやerrorにすることが出来るようになります。

http://download.eclipse.org/eclipse/downloads/drops4/R-4.2-201206081400/news/eclipse-news-part2.html#annotation-null-analysis

## @Nullable

Nullableアノテーションがついているパラメータは、そのパラメータにはNullが渡されることも許容するという意味になります。
なので、メソッド内で値のNullチェックを行う必要があります。

例えば、以下のようなコードを書いたとします。

```java:NullableTest.java
import static org.junit.Assert.assertEquals;

import javax.annotation.Nullable;

import org.junit.Test;

public class NullableTest {

	@Test
	public void test() {
		assertEquals("ABC", toUpper("abc"));
	}
	
	private String toUpper(@Nullable String param) {
		return param.toUpperCase();
	}
	
}
```

このtoUppserメソッドは`param`パラメータのNullチェックをしていないので、NullPointerExceptionを起こす可能性があります。

![error](http://cdn-ak.f.st-hatena.com/images/fotolife/Y/YuichiTanaka/20120630/20120630121623.png?1341026203)

そういったチェックは↑の画像のように静的にコンパイラがチェックしてくれると、実行時エラーを未然に防げて嬉しいです。

というようにこの機能は素敵なのですが、デフォルトの設定ではNullableはNullableでも`org.eclipse.jdt.annotation.Nullable`のアノテーションのみが対象となっています。

さすがに、Eclipseプラグインでもなんでもないコードにorg.eclipseのNullableを使うのは嫌ですが、そこは設定で変更できます。

## 使用するNullableクラスの設定

Preferencesの「Java > Compiler > Errors/Warnings」の一番下に「Null analysis」という項目があります。

![](http://gyazo.com/cd181b8239b7b48da98366d47ca809d2.png?1341029486)

その項目の中の「Enable annotation-basd null inference」にチェックを入れ、その下の方の「Configure」を押します。

![](http://gyazo.com/f97cc44ee39084edb17afa1c8435e8af.png?1341029574)

そうすると、↓の様にnull解析で使用するアノテーションのクラスを指定できるようになるので、ここでNullableにjavax.annotation.Nullableを、NonNullにjavax.annotation.Nonnullを指定しておきます。

![](http://gyazo.com/0791341c6d256368f9b93f27e98bc7af.png?1341030161)

これで、あとは各メソッドのパラメータに`@Nullable`や`@Nonnull`をつけていくだけで、null解析が実行されるようになります。

## おまけ

(2013/06/05)
こちらの内容は@bleisさん、@uasiさんより、@NullableなのにcheckNotNullしちゃうのは意味が無いと指摘いただいたので取り消させて頂きます。@bleisさん、@uasiさん、ご指摘ありがとうございます。

<del>`@Nullable`パラメータのNullチェックに毎回if文を書いていては面倒ですし、コードも無駄に長くなってしまいます。</del>

<del>そういう時は、guava libraryのPreconditions.checkNotNullを使うと以下のように簡単にnullチェックが書けて幸せになれます。</del>

```java:nullable
	private String toUpper(@Nullable String param) {
		return checkNotNull(param).toUpperCase();
	}
```

そのあたりはこちらにまとめました。
[メソッド内でパラメータの値チェックを行う](http://qiita.com/items/3d3506241f4d0076f7c2)
バックグラウンドスレッドからの遅延実行

ランループのないバックグラウンドスレッドでは performSelector:withObject:afterDelay: が使用できない。
理由は、

  * performSelector:withObject:afterDelay: は、現在のスレッド上で遅延実行される。
  * 遅延時間経過後にはスレッドが消滅している。

このため、

1. ランループの終了を遅延させる。
2. dispatch_after() を使用する。

のどちらかで対処。違いは前者が同じスレッド上で実行されるのに対し、後者は別のバックグラウンドスレッド上で動作する、だけ？

```objective-c

- (IBAction)button1Action:(id)sender
{
    // バックグラウンドスレッドで実行
    [self performSelectorInBackground:@selector(selectorInBackground) withObject:nil];
}

- (void)selectorInBackground
{
    @autoreleasepool {
        NSLog(@"(A) %@", [NSThread currentThread]);
        
        // (1) ↓runUntilDate: でメソッドの実行時間までランループの終了を遅延させる
        [self performSelector:@selector(selectorFromBackground1) withObject:nil afterDelay:5.f];
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.f]]; // ←これがないとダメ。

        // (2) ↓dispatch_after()だと待たなくても別のスレッド上で遅延実行される。
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
            [self selectorFromBackground2];
        });
    }
}

- (void)selectorFromBackground1
{
    NSLog(@"(B) %@", [NSThread currentThread]);
}

- (void)selectorFromBackground2
{
    NSLog(@"(C) %@", [NSThread currentThread]);
}

```


＞出力

>2012-06-30 01:58:28.201 Sandbox 40035:10e03 (A) &lt;NSThread: 0x595d3f0&gt;...
2012-06-30 01:58:33.206 Sandbox 40035:10e03 (B) &lt;NSThread: 0x595d3f0&gt;...
2012-06-30 01:58:38.212 Sandbox 40035:10e07 (C) &lt;NSThread: 0x4d540e0&gt;...


(A) と (B) は同じ。(C) は別スレッドで実行されているのがわかる。
Ruby の配列で、取得したい要素が範囲外だったときはデフォルト値を返してほしい

大抵は分岐を考えると思う。

```ruby
a = ["a", "b", "c", "d", "e"]
DEFAULT_STR = "miss"
(a[10]) ? a[10] : DEFAULT_STR   # => "miss"
```

それをするためのメソッド `Array#fetch` があるのは案外知られてないようだ。

```ruby
a.fetch(10, DEFAULT_STR)        # => "miss"
```

ちなみに、第二引数を省略すると範囲外のときに例外 IndexError が発生し、さらにブロックを渡すと範囲外のときにブロックの返り値を返す。ブロック引数には第一引数に指定した値が入る。

```ruby
a.fetch(10) rescue $! # => #<IndexError: index 10 outside of array bounds: -5...5>
a.fetch(10) {|idx| "a[#{idx}] not found."} # => "a[10] not found."
```

まあ分岐でどうにかなるわけだが、せっかくメソッドがあるわけなので適した場面があれば是非どうぞ。
順列列挙

```next_permutation.pl
sub next_permutation {    my $ary = shift;    return unless ref($ary) eq 'ARRAY';    my $last = $#$ary or return;    my $i = $last;    while ($ary->[$i-1] > $ary->[$i]) {        return unless $i-- > 1;    }    my $j = $last;    while ($ary->[$i-1] > $ary->[$j]) {        $j--;    }    @$ary[$i-1, $j] = @$ary[$j, $i-1];    @$ary[$i..$last] = reverse @$ary[$i..$last];    return 1;}
zshでのzコマンドの入れかた


移動したディレクトリの履歴を取ってくれるzコマンドをインストールする。

```
$ brew install z
```

~/.zshrcに追記

```
. /usr/local/etc/profile.d/z.shfunction _Z_precmd {  z --add "$(pwd -P)" 61 }precmd_functions=($precmd_functions _Z_precmd)
```

再読み込み

```
$ source ~/.zshrc
```

## ちなみに

[オリジナル](https://github.com/rupa/z)だとzshと相性が悪いらしいので、[フォークされたもの](https://github.com/sjl/z-zsh)を使ったほうがいいらしい。
でもHomebrewのフォーミュラを見るとオリジナルの方を向いているので、何が違うんだろう。
MySQLでINTO OUTFILEしないでもカンマ区切りcsvファイルをエクスポートする方法

INTO OUTFILEは権限が必要なので…

1.SQLを記述した.sqlファイルを作成する

```sql:foo.sql
select
  *
from
  foo
order by
  id
limit
  5
;
```

2.ファイルを指定して下記コマンドを実行する

```
mysql -ufoo -ppassword < foo.sql | sed -e "s/\t/,/g" > foo.csv
```

SELECT結果が記載されたfoo.csvが精製されます。
python 2.5 で #ff000 みたいな色指定の彩度と明度を変更

```python
import colorsys
import struct
## e.g. gradient_color("#ff0000", 0.66, 0.91) #=> "#e84e4e"
def gradient_color(color, saturation_ratio, brightness_ratio):
    rgb0 = struct.unpack('BBB', color[1:].decode('hex'))
    h, s, v = colorsys.rgb_to_hsv(*[x / 255.0 for x in rgb0])
    rgb1 = colorsys.hsv_to_rgb(h, s * saturation_ratio, v * brightness_ratio)
    return "#" + struct.pack('BBB', *[x * 255 for x in rgb1]).encode('hex')
```
引き伸ばしたUIImageをUIButtonにセットする


ボタンに使用する画像を横に引き伸ばして使う方法。

```Objective-C
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, 144, 36);
    [button setTitle:@"hogehoge" forState:UIControlStateNormal];

    UIImage *image = [[UIImage imageNamed:@"button_image_hoge.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:0];
    [button setBackgroundImage:image forState:UIControlStateNormal];

    [self.view addSubview:button];
```


`- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;`

**leftCapWidth**と**topCapHeight**は、Imageのどの位置から繰り返しで引き伸ばすか指定する。
理屈ではわかってるつもりだけど、実際に動かしてみると想像と違う動きをしてたりして、細かい挙動がいまいちわかっていない。。。

参考
http://blog.syuhari.jp/archives/1407
Herokuで使用するDBをXeroundに移行する

Xeroundというのはこれです。
http://xeround.com/

何か特別なことが必要かと思ったのですが、結論から言うと、普通にdb:pull／db:pushでデータ移行できます。

## 1. 事前にShared Databaseのデータをダンプしておく

```
gem install taps # 必要であれば
heroku db:pull sqlite://dump.sqlite3
```

## 2. Xeroundを導入する（例はstarterプラン）

```
heroku addons:add xeround:starter --app your-app
```

## 3. Xeroundのインスタンス上にデータベースとユーザーを作成する

Xeroundの管理画面 > anage > DB Instance Manager > 使用するインスタンス > Detailsにアクセスする。

### 3.1. インスタンスのパスワードを作成
Usernameの下のChange Passwordからパスワードを設定。

### 3.2. phpMyAdminにアクセス
External DNS hostnameをクリックしてphpMyAdminへ。インスタンスのパスワードを入力して、データベースとユーザーを作成する。

## 4. DATABASE_URLを設定する

先程作成したデータベース名、データベースユーザー名をつなげてURLを作成し、herokuに設定する。

```
heroku config:add DATABASE_URL=mysql2://{username}:{password}@instanceXXXXX.db.xeround.com:XXXXX/{database_name} --app your-app
heroku restart --app your-app
```

## 5. DBデータをリストアする

```
heroku db:push sqlite://dump.sqlite3 --app your-app
```
includedのclass_eval中で他のModuleをextendしてメソッド定義


ライブラリ読むとよく出てくるテクニック

~~~~~~~ruby:hoge.rb
module Hoge
  def self.included(base)
    base.class_eval do
      extend Piyo::ActsAsMethodsDayooooooo
    end
  end
end

module Piyo
  module ActsAsMethodsDayooooooo
    def www
      puts "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"
    end
  end
end

class A
  include Hoge
end

puts A.www
~~~~~~~~
ディレクトリ構造、ファイル構造をツリー状に表示

##### ディレクトリをツリー構造で表示

```linux:linux
find . -type d|sort|sed -ne'1b;s/[^\/]*\//+--/g;s/+--+/|  +/g;s/+--+/|  +/g;s/+--|/|  |/g;p'
```

##### ファイルをツリー構造で表示

```linux:linux
find . -type f|sort|sed -ne'1b;s/[^\/]*\//+--/g;s/+--+/|  +/g;s/+--+/|  +/g;s/+--|/|  |/g;p'
```

##### 全て（ディレクトリ、ファイル）をツリー構造で表示

```linux:linux
find . -type . *|sort|sed -ne'1b;s/[^\/]*\//+--/g;s/+--+/|  +/g;s/+--+/|  +/g;s/+--|/|  |/g;p'
```

参考
http://www.math.kobe-u.ac.jp/~kodama/tips-dirtree.html
安全なcrontab修正手順

例の如く上司に教わった安全な作業手順。
作業ディレクトリ作成&移動

```
mkdir -p ./`date '+%Y%m%d'`/crontab/
cd ./`date '+%Y%m%d'`/crontab/
```

現在のcrontabの設定のバックアップを作成。同時に編集用ファイルを作成。

```
crontab -l > crontab.org
crontab -l > crontab.edit
```

編集&現状の設定とdiffをとる

```
vi crontab.edit
crontab -l | diff crontab.edit -
```

適用&確認

```
crontab crontab.edit
crontab -l
```
MySQLのビューでローカル変数を呼び出す

マニュアルにはできないと書かれているが実際にはできて概ね問題のない動作をしているように見えるのでメモ．もしかすると，本当は何かの制約を満たせないからローカル変数への参照を制限しているのにもかかわらず，抜け道を見つけてしまっただけなのかもしれないので自己責任で．

# 問題点
MySQLではビューに直接ローカル変数を書き込むことができない．例えば以下の例の場合，

```sql
CREATE VIEW get_variable_test_view AS SELECT @variable
```

` #1351 - View's SELECT contains a variable or parameter` というエラーが発生してビューを作ることはできない

# 解決法
しかし，ローカル変数を返すストアドファンクションを経由するとローカル変数を参照することができる．

```sql
CREATE FUNCTION GetVariable() RETURNS INT DETERMINISTIC RETURN @variable;
CREATE VIEW get_variable_test_view AS SELECT GetVariable();
```

のようにしてストアドファンクションとビューを作った後，

```sql
SET @variable = 1000;
SELECT * FROM get_variable_test_view;
```

のように参照する．この例だとちゃんと1000が返ってくる(MySQL 5.1)．

# 応用

```sql
CREATE FUNCTION GetVariable2() RETURNS INT NO SQL RETURN @variable2 := @variable2 + 1;
CREATE VIEW get_variable2_test_view AS SELECT GetVariable2(), GetVariable2();
SET @variable2 = 1000;
SELECT * FROM get_variable2_test_view;
```

ローカル変数を書き換えることも可能で，この例だと1001,1002が返ってくる．
SSH 越しに tmux を開いたときステータスの色を変える

SSH で接続した先で tmux を起動したらステータスの色を変えるようにしてみた。

```config:.tmux.conf

# cat <<__DATA__ >/dev/null

# （無関係の設定項目は省略……）

# __DATA__
#
# function set_color {
#     if [ -z "$SSH_CONNECTION" ]; then
#         tmux set -t: status-bg                colour64
#         tmux set -t: pane-active-border-fg    colour64
#         tmux set -t: pane-border-fg           colour238
#         tmux set -t: window-status-current-bg colour106
#     else
#         tmux set -t: status-bg                colour30
#         tmux set -t: pane-active-border-fg    colour30
#         tmux set -t: pane-border-fg           colour238
#         tmux set -t: window-status-current-bg colour37
#     fi
# }
#
# function on_login {
#     # NOTE:
#     # Redirecting output of tmux to somewhere,
#     # such as "tmux ls > /dev/null", will never return on some system!
#     # You can use "| true" instead of "> /dev/null" to discard output.
#     set_color | true
# }
#
# $1

```

```zsh:.zshrc

if [[ -n "$TMUX" ]]; then
         cut -c3- ~/.tmux.conf | sh -s on_login
fi

```

[.tmux.conf にシェルスクリプトを埋め込んで実行する技](http://d.hatena.ne.jp/uasi/20111117/1321464551)を使っている。 .zshrc にベタ書きしてもいいのだが、 tmux に関する設定は .tmux.conf にまとめておきたいのでこうした。

[ローカルの tmux のステータスは緑に、リモートの tmux のステータスは水色になる](http://d.pr/i/LDn2)。
RSpecで標準出力をテストしたい


ここにまんま書いてあったので試してみる。

[->RSpecで標準出力の内容をテストする](http://d.hatena.ne.jp/shizm/20110623/1308822280)


```hello_spec.rb
require 'stringio'

class Hello
	def hello
		puts "hello"
	end
end

def capture(stream)
	begin
		stream = stream.to_s
		eval "$#{stream} = StringIO.new"
		yield
		result = eval("$#{stream}").string
	ensure
		eval "$#{stream} = #{stream.upcase}"
	end
	result
end

describe "Hello#helloは'hello'と標準出力すること"
	@target = Hello.new
	
	capture(:stdout) { @target.hello }.should == 'hello\n'
		
end
```

rspecにかけてみる

```
>rspec hello_spec.rb
Finished in 0.00007 seconds
0 examples, 0 failures
```

素晴らしい。
なぜか 'stringio' をrequireしないと動かなかった。