OmniAICreator/Qiita-1.07M huggingface dataset:
Guardfileのサンプル

Guardの設定、Guardfileを書き直すのに苦労したので、ここにメモしときます。

Sporkを使う場合、Sporkが読み込む設定を上に書いて、rspecが読み込む設定を下に書きます。この順番でないとうまくいきません。

参考: Railscasts

http://railscasts.com/episodes/264-guard?language=ja&view=asciicast

http://railscasts.com/episodes/285-spork?language=ja&view=asciicast

viewの変更を感知して、インテグレーションテストに使うrequestsが走るようにする。そしてmodelとcontrollerの変更をそれぞれ関知して、インテグレーションテストのrequestsとユニットテストのlibが走るように、Guardが見張る箇所の設定を加えました。

##2012年10月14日追記
よく見たらCapybara request specsにviewsのインテグレーションテスト用設定書いてあるからその部分重複してますね……orz

```ruby:Guardfile
# A sample Guardfile
# More info at https://github.com/guard/guard#readme
guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
  watch('config/application.rb')
  watch('config/environment.rb')
  watch('config/environments/test.rb')
  watch(%r{^config/initializers/.+\.rb$})
  watch('Gemfile')
  watch('Gemfile.lock')
  watch('spec/spec_helper.rb') { :rspec }
  watch('test/test_helper.rb') { :test_unit }
  watch(%r{features/support/}) { :cucumber }
end

guard 'rspec', :version => 2, :cli => "--drb" do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }


#ここから、自分で書いた設定

  watch(%r{^app/views/(.+)/}) { |m| "spec/requests/#{m[1]}_spec.rb" }
  watch(%r{^app/models/(.+)/}) { |m| ["spec/lib/#{m[1]}_spec.rb", "spec/requests/#{m[1]}_spec.rb"] }
  watch(%r{^app/controllers/(.+)/}) { |m| ["spec/lib/#{m[1]}_spec.rb", "spec/requests/#{m[1]}_spec.rb"] }

#ここまで自分で書いた設定


  # Rails example
  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml)$})                 { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }
  
  # Capybara request specs
  watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
  
  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+)\.feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$})   { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end
```
Reader Stringに相当するモナドを自作する例

```haskell:env.hs
import Control.Applicative

type Env = String
newtype F a = F (Env -> a)

onEnv :: (Env -> a) -> F a
onEnv = F

runOnEnv :: F a -> Env -> a
runOnEnv (F f) = f 

instance Functor F where
    fmap f x = onEnv $ \env -> f (x `runOnEnv` env)

instance Applicative F where
    -- pure :: a -> F a
    pure x = onEnv $ \env -> x
    
    -- (<*>) :: F (a -> b) -> F a -> F b
    f <*> a = onEnv $ \env -> (f `runOnEnv` env) (a `runOnEnv` env)

instance Monad F where
    -- return :: a -> F a
    return = pure
    -- (>>=) :: F a -> (a -> F b) -> F b
    m >>= k = onEnv $ \env -> k (runOnEnv m env) `runOnEnv` env

count char = sum . map (fromEnum . (char==))

main = print $ runOnEnv ex "Hey, I'm an environment!" where
    ex = do
        n <- onEnv $ length
        m <- onEnv $ count 'e'
        p <- onEnv $ count ' '
        return (n + m, n * m, p)
```
Ruby1.9.3-p286インストール(RVM)

### 環境

* MacBookAir
* Mac OS X 10.6.8
* rvm -v

```:ターミナル
rvm 1.16.13 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]
```

### RVM更新

```:ターミナル
rvm get stable
----------
Upgrade of RVM in /Users/shu/.rvm/ is complete.

# shu0115,
#
#   Thank you for using RVM!
#   I sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne


rvm 1.16.13 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

RVM reloaded!
----------
```

### Ruby1.9.3-p286リスト表示確認

```:ターミナル
rvm list known
----------
[ruby-]1.9.3-[p286]
----------
```

### Ruby1.9.3-p286インストール

```:ターミナル
rvm install 1.9.3-p286
----------
No binary rubies available for: osx/10.6/i386/ruby-1.9.3-p286.
Continuing with compilation. Please read 'rvm mount' to get more information on binary rubies.
Installing Ruby from source to: /Users/shu/.rvm/rubies/ruby-1.9.3-p286, this may take a while depending on your cpu(s)...
ruby-1.9.3-p286 - #downloading ruby-1.9.3-p286, this may take a while depending on your connection...
ruby-1.9.3-p286 - #extracting ruby-1.9.3-p286 to /Users/shu/.rvm/src/ruby-1.9.3-p286
ruby-1.9.3-p286 - #extracted to /Users/shu/.rvm/src/ruby-1.9.3-p286
ruby-1.9.3-p286 - #configuring
ruby-1.9.3-p286 - #compiling
ruby-1.9.3-p286 - #installing 
Retrieving rubygems-1.8.24
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  371k  100  371k    0     0  1239k      0 --:--:-- --:--:-- --:--:-- 2508k
Extracting rubygems-1.8.24 ...
Removing old Rubygems files...
Installing rubygems-1.8.24 for ruby-1.9.3-p286 ...
Installation of rubygems completed successfully.
Saving wrappers to '/Users/shu/.rvm/bin'.
ruby-1.9.3-p286 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.9.3-p286 - #importing default gemsets (/Users/shu/.rvm/gemsets/)
Install of ruby-1.9.3-p286 - #complete 
----------
```

### Ruby1.9.3-p286インストール確認

```:ターミナル
rvm list
----------
rvm rubies

   ruby-1.8.7-p352 [ i686 ]
   ruby-1.9.2-p290 [ x86_64 ]
   ruby-1.9.3-p125 [ x86_64 ]
=* ruby-1.9.3-p194 [ x86_64 ]
   ruby-1.9.3-p286 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
----------
```

### 使用Rubyデフォルト設定変更

```:ターミナル
rvm --default use 1.9.3-p286
----------
Using /Users/shu/.rvm/gems/ruby-1.9.3-p286
----------
```

### heroku toolbeltインストール(未インストール時のみ)

 => Heroku Toolbelt for Mac OS X

heroku-toolbelt.pkg実行

インストール完了後ターミナル再起動

```:ターミナル
heroku login
```

### Gemインストール

使用Rubyバージョン確認

```:ターミナル
rvm list
----------
=* ruby-1.9.3-p286 [ x86_64 ]
----------
```

```:ターミナル
cd RAILS_APP_DIR
bundle install
```
Qiita.el 作りました!!

[https://github.com/gongo/qiita-el](https://github.com/gongo/qiita-el)

## これは何か
emacs から qiita を操作出来ます

## 必要なもの

- Emacs
    - 24.2 でしかテストしていませんが、きっと 24 系なら大丈夫。23 はどうだろう。
- Emacs lisp
    - [helm](https://github.com/emacs-helm/helm)
    - [markdown-mode](https://github.com/defunkt/markdown-mode)
    - いずれも、最近流行りの package.el や el-get、auto-install でどうにかなります

## 使い方

```
(require 'qiita)
(setq qiita->token "xxxxxxxxxxx")
```

token は無くても動く機能はあります(一覧表示とか)。もちろん投稿や更新、削除では必須です。

### 投稿記事一覧(新着順)

```
M-x qiita:items
```

![](https://dl.dropbox.com/u/2532139/github-qiita-el/qiita-el-items.jpg)

アイテムを選択して Enter を押すと、ブラウザでその記事が表示されます。

### 自身の投稿記事一覧(新着順)
```
C-u M-x qiita:items
```

![](https://dl.dropbox.com/u/2532139/github-qiita-el/qiita-el-my-items.jpg)

この状態で TAB を押すと、ブラウザを開く以外に、選択した記事を削除できるアクションが確認できます。

![](https://dl.dropbox.com/u/2532139/github-qiita-el/qiita-el-my-items-actions.jpg)

Delete を選択して Enter を押すと、その記事を削除できます(y-or-n 確認あり)

### 投稿

現在開いているバッファ上で

```
M-x qiita:post
```

と実行すると **限定共有モード** で投稿されます。
公開モードで投稿する場合は

```
C-u M-x qiita:post
```

と実行します。

#### 投稿記事のルールについて

1. 開いているバッファの中で header-1 の記法 (# hoge とか ====== が下線の文字列) の箇所を、記事のタイトルとして認識します(その箇所は本文には入りません)
2. `<!-- tags hoge,fuga -->` とすると、その記事のタグとして登録されます。

どちらも

- 必須項目(無いとエラー)
- 文書中で最初に現れたのを取得する(2回目以降の header-1 や tags はそのまま本文に残ります)

というわけで markdown 例です

    qiita-el テスト投稿
    ====================
    
    みなさまお疲れ様です。
    
    <!-- tags Emacs,Ruby -->
    
    [gongo/qiita-el · GitHub](https://github.com/gongo/qiita-el)
    
    - List1
    - List2
    - List3
    
    1. hoge
        1. hoge1
    2. fuga
        1. fuga2
    3. hago
        1. hago1
        1. hago2
        1. hago3
    
    ```c
    #include <stdio.h>
    
    int main(void)
    {
        printf("Hello, World!!");
    }
    ```
    
    ```ruby
    p 'Hello, Wo\'rld!'
    ```
    
    > 1
    > 2
    > 3
 
これを投稿すると、 http://qiita.com/gongo@github/private/ee796188dc4945769282 のようになります。


### 更新

更新も同じく `M-x qiita:post` (` C-u M-x qiita:post` ) を使用します。
本文中に`<!-- uuid xxxxxxxx -->` が存在する場合、その記事 `http://qiita.com/items/xxxxxxxx` に対する `更新` と見なされます。

先程の文書を例にすると

    みなさまお疲れ様です。
    
    <!-- tags Emacs,Ruby -->
    <!-- uuid ee796188dc4945769282 -->

という感じで uuid を埋めこみます。

## まとめ

- https://github.com/gongo/qiita-el/issues
    - まだ実装してない、実装する予定の API 一覧
    - 何か要望があれば ↑ に登録お願いします
FuelPHPのoil generate migrationコマンドはbash使った方がいいみたい


はじめての〜FuelPHPやっててメモ。
タイトル通りなんですけど、Macでzsh使っているときにoil generate migrationコマンドを実行すると、なんかに引っかかるようです。

```
% oil generate migration create_form name:string[50] email:string[100] comment:string[400] ip_address:string[39] user_agent:string[512] created_at:int updated_at:int
zsh: no matches found: name:string[50]
%
```

なので、とりあえず動かすために、bashに切り替えて実行するといい感じです。

```
% bash
bash-3.2$ oil generate migration create_form name:string[50] email:string[100] comment:string[400] ip_address:string[39] user_agent:string[512] created_at:int updated_at:int
	Creating migration: /Library/WebServer/Documents/fuelphp/fuel/app/migrations/001_001_create_form_2.php
```

おわり
Pearのアップデート


忘れがちなのでメモっときます。


とりあえずバージョン確認

```
$ pear version
```

新規チャネルを自動的に探すように設定

```
$ sudo pear config-set auto_discover 1
```


あとは、一気にいきます

```
$ sudo pear channel-update pear.php.net
Password:
Updating channel "pear.php.net"
Update of Channel "pear.php.net" succeeded
$ sudo pear upgrade-all
.
.
.
.
Build process completed successfully
Installing '/usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so'
upgrade-all ok: channel://pecl.php.net/xdebug-2.2.0
upgrade-all ok: channel://pear.php.net/File_Archive-1.5.5
upgrade-all ok: channel://pear.phpmd.org/PHP_PMD-1.3.3
upgrade-all ok: channel://pear.phpunit.de/PHP_CodeCoverage-1.1.2
upgrade-all ok: channel://pear.phpunit.de/PHPUnit-3.6.11
upgrade-all ok: channel://pear.phpunit.de/DbUnit-1.1.2
upgrade-all ok: channel://pear.phpunit.de/PHPUnit_Selenium-1.2.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongo.so" to php.ini
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongo.so" to php.ini
configuration option "php_ini" is not set to php.ini location
You should add "extension=xdebug.so" to php.ini
$ 

```

xdebugが更新されたようです。
開発環境は、たまにはアップデートしといたほうがいいですね。
Apacheのいない環境で.htpasswdを作る

IDがfoo、パスワードがbarな.htpasswdを作るには、

```bash
printf "foo:$(openssl passwd -crypt bar)\n" >> .htpasswd
```

とすればよい。
必要になるのはnginxでBasic認証させたい時とかかな。
わざわざApacheいれたくないしね('A`)y-~
音声認識 Julius の「認識結果」ストリングを単語配列に



``` actionscript:

/**
*  Juliusの「認識結果」ストリングを単語配列にする
* @see http://julius.sourceforge.jp/index.php?q=doc/module.html
*/
private function juliusParser(str : String) : Array
{
        var startindex : int = str.indexOf("<RECOGOUT>");
        if(startindex== -1) return null;
        var lastindex : int = str.indexOf("</RECOGOUT>");
        if (lastindex != -1) {
            str = str.slice(startindex, lastindex + 11);
            str = str.replace(/
/, '');
            str = str.replace(/<\/s>/, '');
            var xml : XML = new XML(str);
            var wordLines : XMLList = xml.children().WHYPO.(@CLASSID != "");
            var wordLineNum : int = wordLines.length();
            var words : Array = [];
            for (var i : int = 0; i < wordLineNum; i++) {
                var word : String = wordLines[i].@WORD;
                words.push(word);
            }
            return words;
        }
        return null;
}
```
UNIXタイムスタンプと日時がキリのいいヤツ7選


日付周りでテストをするときに使えるかもしれない、UNIXタイムスタンプと日時がキリのいい瞬間をリストアップしてみました。

タイムゾーンは `Asia/Tokyo` で、1970年から2100年の間のものです。


## 壱 1998-03-03 08:08:08

### 　　888880088

多くが 8 でできている時間です。
過去の日付ではありますが、この中では一押しです。
3 もなんとなく 8 に見えないこともない！？

## 弐 2001-09-09 08:08:08

### 　　999990488

今日から最も近い過去の時間です。
9 と 8 が多いのが印象的ですね。

## 参 2027-06-06 04:04:04

### 　　1812222244

今日から最も近い未来の時間です。
偶数が多いかんじです。

## 四 2047-06-06 08:08:08

### 　　2443388888

244は2047年と似ているし、33は倍にすれば6月6日。
残りの88888は8時8分8秒というふうに覚えれば…。

## 伍 2079-04-04 08:08:08

### 　　3447788888

この時間も 8 が多いですね。偶然でしょうか？

## 六 2095-05-05 08:08:08

### 　　3955388888

遠目で見ると年月日とタイムスタンプが同じ文字でできているようにも見えます。

## 七 2098-07-07 16:16:16

### 　　4055555776

7月7日。16は1+6で7と、7に円のある日時です。

## 計算に使ったスクリプト

```php
<?php

date_default_timezone_set('Asia/Tokyo');

define('SCORE_MIN', 16);

function get_score($string)
{
	$string = strval($string);
	$length = strlen($string);
	$lastChar = null;
	$combo = 0;
	$score = 0;

	for ( $i = 0; $i < $length; $i += 1 )
	{
		$thisChar = $string[$i];
		
		if ( $lastChar === $thisChar )
		{
			if ( $combo === 0 )
			{
				$combo = 1;
			}
			
			$combo *= 2;
		}
		else
		{
			$score += $combo;
			$combo = 0;
		}
		
		$lastChar = $thisChar;
	}

	$score += $combo;
	return $score;
}

$prettyTimes = [];

for ( $year = 1970; $year < 2100; $year += 1 )
{
	for ( $month = 1; $month <= 12; $month += 1 )
	{
		$day = $month;
		
		for ( $hour = 0; $hour <= 23; $hour +=1 )
		{
			$min = $hour;
			$sec = $hour;
			
			$timestamp = mktime($hour, $min, $sec, $month, $day, $year);
			
			$score = get_score($timestamp);
			
			if ( $score > SCORE_MIN )
			{
				$prettyTimes[] = sprintf('date: %04u-%02u-%02u %02u:%02u:%02u, timestamp: %u, score: %u', $year, $month, $day, $hour, $min, $sec, $timestamp, $score);
			}
		}
	}
}

echo implode("\n", $prettyTimes);
```
cygwin vim でクリップボードを使う


cygwin コンソール版 vim は +clipboard バージョンではありません。
しかし、cygwin の機能を活用すれば間接的にクリップボードを扱うことができます。

# vim からクリップボードへのコピー

以下のコマンドで、バッファ全体をクリップボードに送ることができます（`/dev/clipboard` は cygwin の機能のひとつです）。

```vim
:w !cat > /dev/clipboard
```

また、ビジュアルモードで範囲選択してから以下のコマンドで、選択部分をクリップボードに送ることができます。

```vim
:'<,'>w !cat > /dev/clipboard
```

なお、コマンドの `'<,'>` の部分は、範囲選択中にコロンを入力すると勝手に挿入されるので、入力するのは `w !cat > /dev/clipboard` の部分だけです。

# クリップボードから vim へのペースト

mintty の機能を使うのが簡単です。
vim を挿入モードにして、mintty のペースト（Ctrl-Shift-V または Shift-Ins）を行えばよいです。
レスポンスに1秒以上かかったらbeep音を鳴らす

## 引数で渡したURLをcurlで取得、取得に1秒以上かかったらビープ音を鳴らすよ。

````bash
$ check.sh http://www.yahoo.co.jp/
````

````bash:check.sh
#!/bin/sh

if [ $# -ne 1 ]; then
    echo "set url" 1>&2
    exit 1
fi

START=`date +%s`
curl $1 > /dev/null 2>&1
END=`date +%s`

# echo $(($END-$START))

if [ $(($END-$START)) -ge 0 ]; then
	echo \\a
fi
````

MacOSXの場合は ````echo \\a```` の部分を ````afplay /System/Library/Sounds/Submarine.aiff```` みたいに書き換えて、音声ファイルを再生することもできるよ。

## おまけ

レスポンスタイムをマイクロ秒で出力（Linux限定）

````bash:check.sh
#!/bin/sh

if [ $# -ne 1 ]; then
    echo "set url" 1>&2
    exit 1
fi

START=1`date +%S%N`
curl $1 > /dev/null 2>&1
END=1`date +%S%N`

TIME=$(($END-$START))
echo `date '+%Y/%m/%d %H:%M:%S'`,$1,`expr $TIME / 1000000`msec
````
vim-quickrunで実行したRSpecの結果にレッドバー/グリーンバーを表示する

vim-quickrunで実行したRSpecの結果にレッドバー/グリーンバーを表示する

[vim-quickrunで実行したRSpecの結果にレッドバー/グリーンバーを表示する - vimまっしぐら★ - vimグループ](http://vim.g.hatena.ne.jp/tokorom/20120226/1330278123 "vim-quickrunで実行したRSpecの結果にレッドバー/グリーンバーを表示する - vimまっしぐら★ - vimグループ")

を参考に自分の環境で動かなかったところをいじった。

```vim:~/.vim/ftdetect/ruby.vim
autocmd BufWinEnter,BufNewFile *_spec.rb set filetype=ruby.rspec
```

```vim:~/.vim/after/ftplugin/ruby.vim
let g:quickrun_config['ruby.rspec'] = {'command': 'rspec', 'cmdopt': '--format progress -I .', 'outputter': 'buffer:filetype=rspec-result'}
```

```vim:~/.vim/syntax/rspec-result.vim
if exists("b:current_syntax")
  finish
endif
   
if !exists("main_syntax")
  let main_syntax = 'rspec-result'
endif

syntax case match

syntax match RSpecGreen /^\.*$/
syntax match RSpecRed   /^[F.]*F[F.]*$/
syntax match RSpecGreen /^.* 0 failure.*$/
syntax match RSpecRed   /^.* [1-9][0-9]* failure.*$/

highlight RSpecGreen ctermfg=White ctermbg=Green guifg=White guibg=Green
highlight RSpecRed   ctermfg=White ctermbg=Red   guifg=White guibg=Red

"unlet b:current_syntax
let b:current_syntax = 'rspec-result'

if main_syntax == 'rspec-result'
  unlet main_syntax
endif
```
IEで表示した際にStyleが適用されたなかったら

以前、showHeader="false"にしてIEで表示した際にStyleが適用されないことがありました。

次のようにbodyタグを宣言することで正常に表示できました。

```Visualforce:Visualforce
<body>
    <form>
      ・・・   
    </form>
</body>
```
Sublime Text2のSublimeLinterでruby1.9のハッシュリテラル("key: value"形式)のSyntax Errorを回避する方法

# 追記(2013-07-06)

`Preferences -> Package Settings -> SublimeLinter -> Settings - User`(macの場合)で簡単に設定できるようです。

```py:SublimeLinter.sublime-settings
"sublimelinter_executable_map":
{
    "ruby": "~/.rbenv/versions/1.9.3-p0/bin/ruby"
},
```
参考: http://stackoverflow.com/questions/9153210/configuring-the-sublime-linter-plugin-to-use-ruby-1-9-syntax


# 元記事

macのSublime Text2でrubyファイルを編集する時、`SublimeLinter`というバリデーションプラグインを使っていると、Syntax Errorを見つけてくれる。

ところがこのプラグイン、ruby1.9のハッシュリテラル記法
`hash = {key: value}`形式を認識しない。

これは、内部で`ruby -wc`を実行しているだけなのだが、ここで使われるrubyはrvmではなく元々インストールされているrubyを使うらしい。

そこで、SublimeLinterの設定ファイルを書き換えることで対応する。


1. ruby1.9の場所を確認
`which ruby`でrvm上のrubyの位置を確認し、
`/Users/<ユーザー名>/.rvm/rubies/ruby-1.9.3-p194/bin/ruby`

2. SublimeLinterの設定ファイル
`~/Library/Application Support/Sublime Text 2/Packages/SublimeLinter/sublimelinter/modules/ruby.py`を修正

```python:ruby.py
CONFIG = {                                                                                                                                                                       
    'language': 'Ruby',                                                                                                                                                          
    # 'executable': 'ruby',                                                                                                                                                       
    'executable': '/Users/<ユーザー名>/.rvm/rubies/ruby-1.9.3-p194/bin/ruby',                                                                                                            
    'lint_args': '-wc'                                                                                                                                                           
}
 ```


以上で、煩わしい偽Syntax Errorを回避できる。
Qiita APIをJavaScriptから叩く

QiitaAPIが公開されていたので，JavaScriptから使ってみるサンプル(jQuery使用)です．
target_nameで指定したユーザの投稿をすべてストックします．
JavaScriptはそんなに書かないので，怪しい部分は突っ込み大歓迎です．

```qiita_test.js
var API_END_POINT = 'https://qiita.com/api/v1';

stockAllPostByUserName('target_name');

function stockAllPostByUserName(user_name) {
  var qiita_test = {};
  getToken(qiita_test);
  
  $.getJSON(API_END_POINT + '/users/' + user_name + '/items', null,
      function(response) {
        response.forEach(
            function(element) {
              stockItem(element.uuid, qiita_test.token);
            });
      });
}

function getToken(namespace) {
  $.post(API_END_POINT + '/auth',
      {url_name:'name',
       password:'password'},
      function(data){
         namespace.token = data.token;
      });
}

function stockItem(uuid, token) {
  $.ajax({url: API_END_POINT + '/items/' + uuid + '/stock',
         data: {token: token},
      success: function(response) {
                   console.log(response);
               },
         type: 'PUT'});
}
```
SublimeText2 で Shift-jis を使う


SublimeText2 は大変便利なテキストエディタですが、shift-jis に対応していないのが玉にキズでした。

![mojibake](https://dl.dropbox.com/u/264530/qiita/shiftjis.png)

そんな時、@umibose さんのツイートが！

<blockquote class="twitter-tweet" lang="ja"><p>Sublime Text 2でSJISもいける！<a href="https://t.co/XxCrfPd0" title="https://github.com/seanliang/ConvertToUTF8">github.com/seanliang/Conv…</a></p>&mdash; Hayakawaさん (@umibose) <a href="https://twitter.com/umibose/status/256247651710951424">2012年10月11日</a></blockquote><script async src="http://platform.twitter.com/widgets.js" charset="utf-8"></script>

ふむ、ConvertToUTF8 というものできるのか。というわけで早速試してみました。

以下手順。

##1. Sublime Package Control の導入
[Installation – Sublime Package Control – a Sublime Text 2 Package Manager by wbond](http://wbond.net/sublime_packages/package_control/installation) の手順。

まず、SublimeText2 にパッケージコントロールシステムを導入します。(既に入っていればスキップ)

SublimeText2 を起動し、 ```shift + ctrl + @``` (ctrl+`) を押すと、画面下部にコンソールが表示されます。(Win版のショートカット知りません)

ここに、上記リンクにある import〜 の一文を貼り付けて Enter！

なんだかインストールが終わった感じなら Sublime を再起動します。

##2. ConvertToUTF8 の導入
[ConvertToUTF8 - Github](https://github.com/seanliang/ConvertToUTF8) の手順。

```shift + command + p```(Win版はry) を押すと、Command Palette が開くので、そこで ```Package Control: Install Package``` を選択。（ある程度入力するとサジェストされます）

次に出てくるポップアップ(画面名分からん)で ```ConvertToUTF8 ``` を選択。

インストールが終わったら Sublime を再起動すれば…

![choice](https://dl.dropbox.com/u/264530/qiita/choise_charcode.png)

お、なんか文字コード選択が出た（でない場合もある？）
そして…
![choice](https://dl.dropbox.com/u/264530/qiita/shiftjis_correct.png)

おっしゃー！
これであとは日本語入力時の挙動が直ってくれたら最強エディタですね。

[@umibose](https://twitter.com/umibose) さん、ありがとうございます！
date.parse()メソッドの注意点

Date型に変換するdate.parse()ですが、ユーザの地域設定によって指定方法が異なります。

地域が日本で動作しても、USに変更した際に正常に動作しなくなるケースがありました。

Date型に変換する際はdate.valueOf()やdate.newinstance()で行う方がいいみたいです。
RubyTestが動かなかったので直した


Macの話。

ターミナルから起動するときは Sublime Text 2 をパスの通ったディレクトリから起動しなければならない。
例えば次のようにリンクを作る。

```sh
ln -s /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl /usr/local/bin

```

`~/Library/Application Support/Sublime Text 2/Packages/RubyTest/RubyTest.sublime-settings` を次のように編集する。(これはなくてもいいけど好みの問題かな)

```
-  "run_single_rspec_command": "rspec {relative_path} -l{line_number}",
+  "run_single_rspec_command": "bundle exec rspec {relative_path} -l{line_number}",

```

## 参考
https://github.com/maltize/sublime-text-2-ruby-tests/issues/36
http://stackoverflow.com/questions/7513142/rubytest-in-sublime-text-2
https://github.com/maltize/sublime-text-2-ruby-tests
RubyGemを作る時の注意


会社で先輩から教えて頂いた話。

RubyGem を作るときは Gemfile に依存する gem を書いてはいけない。

Gemfile は単に次のようにする。

```ruby:Gemfile
source "http://rubygems.org"

gemspec
```

使用する gem は全て (gem名).gemspecに書く。

```ruby:(gem名).gemspec
# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "(gem名)/version"

Gem::Specification.new do |s|
  s.name        = "(gem名)"
  # … (中略) ...
  s.require_paths = ["lib"]

  # gem が依存している gem は add_runtime_dependency で指定する
  s.add_runtime_dependency 'hoge'

  # gem の開発に必要な gem は add_development_dependency で指定する
  s.add_development_dependency 'rspec'
end
```

## 参考サイト

- [tomiの日記 - rubyベストプラクティスchapter8.4](http://d.hatena.ne.jp/tomiacannondale/20111123/1322056146)
UIView（とそれを継承したView）に影をつけたい時


CALayerを使うことで、ビューに影をつけることが出来ます。
各プロパティの値を変えると、描画される影が変化します。

```objectivec:CALayerSample

- (void)shadowSample{
    UIView *uiView = [[UIView alloc] initWithFrame:CGRectMake(110, 200, 100, 100)];
    uiView.backgroundColor = [UIColor whiteColor];
    CALayer *caLayer = uiView.layer;
    caLayer.rasterizationScale = [[UIScreen mainScreen] scale];
    caLayer.shadowRadius = 3.0f;
    caLayer.shadowOpacity = 1.5f;
    caLayer.shadowOffset = CGSizeMake(0.0f, 1.0f);
    caLayer.shouldRasterize = YES;
    [self.view addSubview:uiView];
}

```


影をつけない場合　　　　　　　　　　　　　影をつけた場合


![影無し](http://cdn-ak.f.st-hatena.com/images/fotolife/h/happy_ryo/20121012/20121012192251.png?1350037389 "影無し")　![影有り](http://cdn-ak.f.st-hatena.com/images/fotolife/h/happy_ryo/20121012/20121012192252.png?1350037455 "影有り")
MATLABのコードをシェルから指定して実行

MATLABのコードをコマンドラインからは,
以下のようにして指定して実行できる.

```sh
echo 'magic(3)' | matlab -nodisplay
```

MATLABのコードをシェルスクリプト内で指定するときにも便利.

```sh
for lambda in `seq 0 0.2 1` ; do
    echo \
    "my_function($lambda);" \
    | matlab -nodisplay
done
```
AWS::S3 で endpoint を指定しろと言われたら


Ruby で aws-sdk gem を使って、次のようなコードを書いたら例外が起きた。

```ruby
require "aws"
s3 = AWS::S3.new(
  access_key_id: "FOO",
  secret_access_key: "XXX"
)
s3.buckets["bar"].objects.first 
# AWS::S3::Errors::PermanentRedirect: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
```

http://docs.amazonwebservices.com/general/latest/gr/rande.html をみると S3 の Asia Pacific (Tokyo) の endpoint は `s3-ap-northeast-1.amazonaws.com` らしい。

指定の仕方は、ドキュメントでは見つけられなかったけど、次のように s3_endpoint オプションで渡してやれば動作した。

```ruby
s3 = AWS::S3.new(
  access_key_id: "FOO",
  secret_access_key: "XXX",
  s3_endpoint: "s3-ap-northeast-1.amazonaws.com"
)
```

ググると `AWS::S3::DEFAULT_HOST.replace("s3-ap-northeast-1.amazonaws.com")` とせよ、という記述がたくさん見つかるけど aws-sdk v1.6.8 では AWS::S3::DEFAULT_HOST がなく、使えない。

参考: http://subtech.g.hatena.ne.jp/secondlife/20120116/1326715826
検索ワード入力開始時にSearchBarを最上部に移動させる（UISearchDisplayController未使用）

```objective-c
#pragma mark - UISeachBarDelegate
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
  [searchBar setShowsCancelButton:YES animated:YES];
  [self.navigationController setNavigationBarHidden:YES animated:YES];
  
  return YES;
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
  [searchBar setShowsCancelButton:NO animated:YES];
  [self.navigationController setNavigationBarHidden:NO animated:YES];
  [searchBar resignFirstResponder];
}
```
Haskell で Kleene閉包：別解

[「Haskell で Kleene閉包」](http://qiita.com/items/f672efc5b728bcf5ec10) という記事を読んだのですが、「単純な再帰を使って初期値の与え方を変えれば、重複なしで「Kleene閉包」を求められるんじゃない」か、と考えて自分なりにコーディングしてみました。

こういった分野を専門的に勉強したことはないので、もしかしたら勘違いをしてるかもしれませんが…。

とりあえず、[Wikipedia](http://ja.wikipedia.org/wiki/クリーネ閉包) の例はちゃんと求められるようです。

```kleeneStar.hs
kleeneStar :: [[a]] -> [[a]]
kleeneStar xs = [] : loop xs
  where loop xs' = xs' ++ loop [y ++ z | y <- xs, z <- xs']
```

```sample
> take 15 $ kleeneStar ["ab", "c"]
["","ab","c","abab","abc","cab","cc","ababab","ababc","abcab","abcc","cabab","cabc","ccab","ccc"]

> take 10 $ kleeneStar [['a'], ['b'], ['c']]
["","a","b","c","aa","ab","ac","ba","bb","bc"]
```


# 追記
"iterate" を使用した定義を思いつきました。

```kleeneStar2.hs
kleeneStar :: [[a]] -> [[a]]
kleeneStar xs = concat $ iterate (\ys -> [y ++ x | y <- ys, x <- xs]) [[]]
```
qiita gemを使ってみたメモ

明日のQiita HackerthonにあわせてQiita gemを使ってみました。

```ruby
# coding: utf-8                                               
require 'rubygems'
require 'qiita'

# use name and password
qiita = Qiita.new( url_name: 'username', password: 'password')

# Get token
p token = qiita.token

# use token
qiita = Qiita.new token: qiita.token

# Get userinfo
p u =  qiita.user(qiita.url_name)
u.url_name
u.description

qiita.user_items.each do |item|
  p item.uuid
  article = qiita.item item.uuid

  p "Titleがとれます   -----------------"
  p "title: #{article.title}"
  p "markdownがとれます-----------------"
  p "title: #{article.raw_body}"
end
```
gitをインストールしたらApacheが立ち上がらなくなった。 


centOSにgitをインストールしたらApacheが起動しなくなった事例があったので覚え書き程度に

原因はソースインストールしたApacheのモジュールが、gitをインストールするためにyumインストールしたパッケージで古い物が優先して読み込まれてしまったために立ち上がらなくなりました。
対象の古いパッケージを削除したら無事に立ち上がった。



初期環境構築履歴から関係ありそうなの抜粋

```
httpd-2.4.2.tar.gz
apr-1.4.6.tar.gz
apr-util-1.4.1.tar.gz


cd apr-1.4.6
sudo ./configure            \
    --prefix=/usr/local/apr

sudo make
sudo make install


cd apr-util-1.4.1
sudo ./configure                    \
    --prefix=/usr/local/apr-util    \
    --with-apr=/usr/local/apr


sudo make
sudo make install


cd httpd-2.4.2
sudo ./configure                                \
--------------------略----------------------------
    --with-apr=/usr/local/apr                   \
    --with-apr-util=/usr/local/apr-util         \
--------------------略----------------------------

sudo make
sudo make install
```



社内svnサーバーから作成したgitのrpmを持ってくる

```
cd /usr/local/src
sudo mkdir git
cd git

sudo svn export --略--/git-1.7.9.3-1.x86_64.rpm
sudo rpm -i git-1.7.9.3-1.x86_64.rpm
#>>エラー: 依存性の欠如:
#>>        perl(DBI) は git-1.7.9.3-1.x86_64 に必要とされています
#>>        perl(SVN::Core) は git-1.7.9.3-1.x86_64 に必要とされています

sudo yum install perl-DBI
sudo yum install subversion-perl

sudo vi /var/log/yum.log
# インストールされたパッケージ
# perl-DBI-1.52-2.el5.x86_64
# apr-1.2.7-11.el5_6.5.x86_64
# apr-util-1.2.7-11.el5_5.2.x86_64
# apr-1.2.7-11.el5_6.5.i386
# subversion-1.6.11-10.el5_8.x86_64
# apr-util-1.2.7-11.el5_5.2.i386
# subversion-perl-1.6.11-10.el5_8.x86_64
# subversion-1.6.11-10.el5_8.i386
# libgcc-4.1.2-52.el5_8.1.x86_64
# libstdc++-4.1.2-52.el5_8.1.x86_64
# libobjc-4.1.2-52.el5_8.1.x86_64
# libgfortran-4.1.2-52.el5_8.1.x86_64
# cpp-4.1.2-52.el5_8.1.x86_64
# libgcc-4.1.2-52.el5_8.1.i386
# libstdc++-4.1.2-52.el5_8.1.i386
# gcc-4.1.2-52.el5_8.1.x86_64
# gcc-objc-4.1.2-52.el5_8.1.x86_64
# gcc-gfortran-4.1.2-52.el5_8.1.x86_64
# libstdc++-devel-4.1.2-52.el5_8.1.x86_64
# gcc-c++-4.1.2-52.el5_8.1.x86_64
# gcc-objc++-4.1.2-52.el5_8.1.x86_64
```


上記の設定でgitは入った。
Apacheもまだ動いている。

しかし、Apacheの再起動が出来なくなる。


解決方法

```
sudo rpm -e --nodeps apr-1.2.7-11.el5_6.5.x86_64
sudo rpm -e --nodeps apr-util-1.2.7-11.el5_5.2.x86_64
sudo rpm -e --nodeps apr-1.2.7-11.el5_6.5.i386
sudo rpm -e --nodeps apr-util-1.2.7-11.el5_5.2.i386
```


環境構築時にすでに新しいバージョンでapt,apr-utilが入っていたのに
`apr-1.4.6`
`apr-util-1.4.1`

`apr-1.2.7`
`apr-util-1.2.7-11`
と古いバージョンがyumで入れてしまったのがイクなかった。

gitインストール時に依存関係を無視して強制的に入れるか

```
sudo rpm -ihv --nodeps git-1.7.9.3-1.x86_64.rpm
```

apt,apr-utilをパッケージ化してからインストールすれば良かったのかも知れぬ


冷や汗かいた
レスポンスヘッダーに X-Content-Type-Options: nosniff を追加する


railsのedgeではデフォルトで入る(`config.action_dispatch.default_headers`に入れられる)が安定版(3.2.8)にはまだ入っていないので，暫定対応． https://github.com/rails/rails/pull/7390 

configでデフォルトヘッダーを設定する方法がないためApplicationControllerのfilterでやるしかない?汚い…

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  after_filter :set_default_headers
  private
  DEFAULT_HEADERS = {
      'X-Frame-Options' => 'SAMEORIGIN',
      'X-XSS-Protection' => '1; mode=block',
      'X-Content-Type-Options' => 'nosniff'
  }.freeze

  def set_default_headers
    DEFAULT_HEADERS.each_pair do |key, val|
      response.headers[key] = val
    end
  end
end
```
staticメンバー変数のスコープにまつわる地雷を踏み抜いた話

元はJavaですが、分かりやすくするためにGroovyで問題箇所だけ書き起こしました。

```groovy:staticMemberFail.groovy
// 久々に触ったJavaでこういうことをやってしまったと言う話
public final class MyClassOne{
  private static final ArrayList<String> myList = new ArrayList<String>()
  //-------^これがミス
  public MyClassOne add(String str){
    myList.add(str)
    return this
  }
  public int size(){
    myList.size()
  }
}

def myClassOne1 = new MyClassOne()
def myClassOne2 = new MyClassOne()

assert(myClassOne1.add("hoge").size()==1)
assert(myClassOne2.add("hoge").size()==1) // これが失敗する
                                          // なぜならmyListは
                                          // MｙClassOneのインスタンス全てで
                                          // 共有されているから実際のサイズは2
```

特に定数の定義とかしたあとだと、finalって書こうとすると、
手が勝手にstaticとか打っちゃうんだよね。

随分昔にC言語でも同じ事やったけど、またやってしまったって話です。
まぁ、テストコード書いてたから気がついたんですが。

テスト重要ですよー。
フィールド更新時に更新前の値を使って処理する

フィールド`a_field`の変更前の値は`a_field_was`で取得できるので，例えば"値が変更されていたら実行する"という処理は，after_updateの中で以下のように書いてやればいい

```ruby:my_model.rb
class MyModel < ActiveRecord::Base
  after_update do 
    do_something if a_field != a_field_was
  end
end
```
PostgreSQL9.1でレプリケーション設定


PostgreSQLで同期レプリケーションの設定をしたのでメモ。

【環境】
※マスター + スレーブ×1

マスター
OS：CentOS 6.2
PostgreSQL：9.1.4

スレーブ
OS：CentOS 6.2
PostgreSQL：9.1.4


【参考サイト】
[PostgreSQL 9.1 - 同期レプリケーション](http://webcache.googleusercontent.com/search?q=cache:ACcpB90sNHMJ:www.interdb.jp/techinfo/pg_sr/sr_sync01.html+&cd=1&hl=ja&ct=clnk&gl=jp1)

[ストリーミング・レプリケーションの構築](http://lets.postgresql.jp/documents/technical/replication/1/)

※マスター側は通常運用できる設定が済んでいるものとします。




#マスター側

postgre.conf
-

```
wal_level = hot_standby
max_wal_senders = 2 #レプリケーション中に再度ベースバックアップをしたい場合の保険にスレーブ数+1に設定
synchronous_standby_names = 'slave1' #今回はスレーブ側でスレーブ名をslave1に設定
```


pg_hba.conf
-
```
# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
host    replication     接続ユーザー     スレーブサーバーのIP      trust  #この設定を追加
```

マスター再起動
-
master$ service postgresql-9.1 restart




#スレーブ側

マスタ側のベーズバックアップをコピー
-

slave1$ pg_basebackup -h [マスターサーバーIP] -p [ポート] -D /var/lib/pgsql/9.1/data --xlog --progress --verbose

スレーブの/var/lib/pgsql/9.1/data以下にマスタのベースバックアップをコピーする。
この時、dataディレクトリが存在するとうまくいかない。


recovery.conf
-

/usr/pgsql-9.1/share/recovery.conf.sampleをdataディレクトリにコピーして利用する。

```
standby_mode = on
primary_conninfo = 'host=master port=5432 application_name=slave1' # スレーブ名をapplication_nameに設定
```

スレーブ再起動
-
slave$ service postgresql-9.1 restart

マスタ側で動作確認
-
master$ psql dbname

dbname=# SELECT application_name,state,sync_priority,sync_state FROM pg_stat_replication;
 application_name |   state   | sync_priority | sync_state 
------------------+-----------+---------------+------------
 slave1           | streaming |             1 | sync
(1 row)
phpファイル内の単語を探すコマンド


```
$ find -name "*.php" | xargs grep '検索したい単語'
```

.bashrcにエイリアス貼るのもいいかも

```.bashrc
alias pgrep='find -name "*.php" | xargs grep'
```

```
$ pgrep '検索したい単語'
```
Mac に Homebrew で Haskell 入れて HelloWorld

OS は Mountain Lion、Homebrew は入ってる前提で。

##インストール
「処理系」の GHC と、開発用プラットフォームをインストールする。

```
brew install ghc
```

>==> Downloading http://www.haskell.org/ghc/dist/7.4.2/ghc-7.4.2-x86_64-apple-darwin.tar.bz2
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/ghc/7.4.2
==> make install
==> Caveats
This brew is for GHC only; you might also be interested in haskell-platform.
==> Summary
/usr/local/Cellar/ghc/7.4.2: 6209 files, 842M, built in 18.9 minutes

20分弱かかった。

```
brew install haskell-platform
```
>==> Downloading http://lambda.haskell.org/platform/download/2012.2.0.0/haskell-platform-2012
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/haskell-platform/2012.2.0.0 --enable-unsupported-
==> EXTRA_CONFIGURE_OPTS="--libdir=/usr/local/Cellar/haskell-platform/2012.2.0.0/lib/ghc" ma
==> Caveats
Run `cabal update` to initialize the package list.
>
If you are replacing a previous version of haskell-platform, you may want
to unregister packages belonging to the old version. You can find broken
packages using:
  ghc-pkg check --simple-output
You can uninstall them using:
  ghc-pkg check --simple-output | xargs -n 1 ghc-pkg unregister --force
==> Summary
/usr/local/Cellar/haskell-platform/2012.2.0.0: 869 files, 174M, built in 13.4 minutes

全部で３０分ほど。途中「ほんとに動いてんの？」って状態になったが焦らず放っておいたら終わってた。

##対話式インタプリタを起動する

```
ghci
```
>GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 

##ハロワ
```
Prelude> putStrLn "Hello, World"
```

>Hello, World

##GHCi の終了
意外と分からなかった。

```
:quit
```

>Leaving GHCi. 

##【未解決】runhaskell で「lexical error (UTF-8 decoding error)」エラー

[10分で学ぶHaskell - HaskellWiki](http://www.haskell.org/haskellwiki/10%E5%88%86%E3%81%A7%E5%AD%A6%E3%81%B6Haskell) にあった REPL じゃなくてソースをビルドして実行する方法でエラーが。

```hs:Test.hs
main = do putStrLn "What is 2 + 2?"
          x <- readLn
          if x == 4
              then putStrLn "You're right!"
              else putStrLn "You're wrong!"
```

を Test.hs で保存して、

```
ghc --make Test.hs
```

を実行して、Test, Test.hi, Test.o ファイルが生成される。
で、

```
runhaskell Test
```
とすると

>Test:1:1: lexical error (UTF-8 decoding error)

というエラーが。よく分からないからとりあえず、

```
runghc Test.hs
```
で満足してる。まだ入り口にも立ってない気分。

##参考
* [10分で学ぶHaskell - HaskellWiki](http://www.haskell.org/haskellwiki/10%E5%88%86%E3%81%A7%E5%AD%A6%E3%81%B6Haskell)
* [Haskell再入門 1日目(環境構築) - WebService::Blog->new( user => ’hide_o_55’ )](http://d.hatena.ne.jp/hide_o_55/20110427/1303914801)
PG Backupsでダウンロードしたファイルを他のDBにインポートする

HerokuのPG Backupsアドオンを使って取得したダンプファイルを、別のPostgreSQLのDBにインポートするコマンド。

```
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U ruedap -d mydb b004.dump
```

こちら↓のサイトで知りました。
http://blog.ruedap.com/entry/20110223/ruby_heroku_database_postgresql_backup
Zsh上で使用頻度の高いコマンド一覧を表示する

![](http://gyazo.com/262e765a0ca15d95bf6f04e4d0b9a81e.png)

```ruby:zsh_history_sort.py
from collections import Counter, defaultdict
import sys

try:
    #FILENAME = "/Users/{hoge}/.zhistory"
    FILENAME = sys.argv[1]
except:
    print "USAGE: zsh_history_sort.py <your_history_file>"
    sys.exit(1)


class Stat(object):
    def __init__(self):
        self.counter = Counter()
        self.children = defaultdict(Stat)

stat = Stat()

fi = file(FILENAME)
for line in fi:
    line = line.strip()
    if ";" in line:
        line = line.split(";")[1]
    words = line.split()
    s = stat
    for (i, w) in enumerate(words):
        if i > 1: break;
        s.counter[w] += 1
        s = s.children[w]


def show(stat, indent=0):
    INDENT = "  " * indent
    for name, count in stat.counter.most_common():
        if count < 10: break
        print "%s%s: %d" % (INDENT, name, count)
        show(stat.children[name], indent + 1)

show(stat)
```

`if i > 1: break;`とか`if count < 10: break`らへんを変えると深さと表示数を変更できます。
予想外に使用しているコマンドについては、短縮名を検討してみるといいかもです。

↓9割9分9厘下記ソースを使用しています。
元ネタ
[show stat. of your git usage — Gist](https://gist.github.com/2651961)
ForkBombとその対処

```C:fork_bomb.c
#include <unistd.h>

int main()
{
  while(1) { fork(); }
}
```

一番シンプルな形だとこんな形。
ひたすらForkしてメモリを食いつぶしたりプロセステーブルを食いつぶす。
だいたいの場合はこのままマシンごと落ちたり固まるものだけど、MacだとForkBombを受けても生き残るケースがある。
ForkBombを「間違って」起動してしまった場合には慌てず騒がずシェルからForkBombをkillallする。
ただし、普通にkillallを叩こうとしてもプロセステーブルがいっぱいなのでforkできないと怒られる。
ので、exec killallを叩く訳だけど、やっぱりそれもだめ。
killallが殺していくかたわらForkBombが倍々ゲームで増えて行くのでまたすぐプロセステーブルが埋まってしまう。
ForkBombが起動してしまったら、まず、 exec killall -s SIGSTOP ForkBomb を叩いて一旦停止。
それから別のシェルで exec killlall -s SIGKILL ForkBomb で殺す。
シェルを2個以上開いていなかったらご愁傷さまかも。
念のため、シェルが余っているようなら、1回目のkillallを叩いた後にもう一回 exec killall -s SIGSTOP ForkBomb させておくとなお安心。
カテゴリー中で何番目の記事か


JOIN が多くなるのでカテゴリーの slug よりも ID を使った方が良いかもしれませんが・・・。

```functions.php
function post_number_in_cat($cat_slug) {
  global $wpdb, $post;
  $number = $wpdb->get_var("
    SELECT COUNT(posts.ID)
    FROM $wpdb->posts posts
    INNER JOIN $wpdb->term_relationships rels ON posts.ID = rels.object_id
    INNER JOIN $wpdb->term_taxonomy tax ON rels.term_taxonomy_id = tax.term_taxonomy_id
    INNER JOIN $wpdb->terms terms ON tax.term_id = terms.term_ID
    WHERE terms.slug = '{$cat_slug}'
    AND posts.post_date <= '{$post->post_date}'
    AND posts.post_status = 'publish'
    AND posts.post_type = 'post'
  ;");
  return $number;
}
```
RubyでFogでGlacier


マイクラサーバーを建てたのでワールドデータのバックアップをするためにGlacierを使ってみることにしました。

はい。いつもの。

```sh:install
gem install fog
```

##アップロード
だいたいこんな感じ。

```ruby:upload.rb
glacier = Fog::AWS::Glacier.new(:aws_access_key_id => 'id', :aws_secret_access_key => 'key')
vault = glacier.vaults.create('GLACIER_TEST')
vault.archives.create(:date => open('filename'),
	:multipart_chunk_size => 1024*1024,
	:description => 'oppai')

```

一緒ににvaultもつくてます。もう既にコンソールからvault作っちゃったよって人は

```ruby
vault = glacier.vaults.get('GLACIER_TEST')
```

とでもして下さい。多分取得できます。

dataにはIOだけじゃなくてStringも渡せるよ！でもそんな用途で使うやつおらへんやろ〜。
100MB以上はmultipartアップで！とAWSさんが言ってますので素直にそうしてますが、Fogさんはmultipartにしても同時に一個ずつしかアップしてくれません。悲しい。

アップしてから反映までは1日ぐらいかかるらしいです。

##ジョブ作成
```ruby:job.rb
vault.jobs.create(:type => Fog::AWS::Glacier::Job::INVENTORY)
```

アップロードが反映されないので待ってる。
RangeError (exceeded available parameter key space) が出た時に実際どんなkey=valueの値が大きくてまずかったのか覗きたい


けどこんなのでええんかな

```ruby:monkey_patch_rack.rb
class Rack::Utils::KeySpaceConstrainedParams
  alias_method "orig_assign", "[]="
  def []=(key,value)
    Rails.logger.info "[parameter] #{key}, #{value}"
    orig_assign(key,value)
  end
end
```
JAX-RSでJSONを返すためのMessageBodyWriter

JAX-RSの参照実装であるJerseyのJSONの扱いに憤りを感じて作ったクラス。

```Java
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

import net.arnx.jsonic.JSON;

/**
 * @author jabaraster
 */
@Provider
public class JsonMessageBodyWriter implements MessageBodyWriter<Object> {

    @SuppressWarnings({ "unused", "javadoc" })
    @Override
    public long getSize(final Object pT, final Class<?> pType, final Type pGenericType, final Annotation[] pAnnotations, final MediaType pMediaType) {
        return -1;
    }

    @SuppressWarnings({ "unused", "javadoc" })
    @Override
    public boolean isWriteable(final Class<?> pType, final Type pGenericType, final Annotation[] pAnnotations, final MediaType pMediaType) {
        return MediaType.APPLICATION_JSON_TYPE.isCompatible(pMediaType);
    }

    @SuppressWarnings({ "unused", "javadoc" })
    @Override
    public void writeTo( //
            final Object pT //
            , final Class<?> pType //
            , final Type pGenericType //
            , final Annotation[] pAnnotations //
            , final MediaType pMediaType //
            , final MultivaluedMap<String, Object> pHttpHeaders //
            , final OutputStream pEntityStream //
    ) throws IOException, WebApplicationException {

        JSON.encode(pT, pEntityStream, true);
    }
}
```

はてなダイアリーにこの件の[エントリ](http://d.hatena.ne.jp/jabaraster/20121010/1349878927)書いてます。
GitHubプライベートリポジトリをJenkinsからチェックアウトする。

「GitHubプライベートリポジトリ」と書きましたが、SSH鍵認証でGITを運用してる場合も同じだと思います。


プライベートリポジトリの場合、SSH鍵認証での接続になると思いますが、Jenkins管理画面にはその設定（鍵の登録）項目がありません。


そこで、Jenkins実行サーバのJenkins実行ユーザにSSHの設定をする必要があります。

1. Jenkins実行サーバにてJenkinsユーザになり、SSHキーを生成する。`ssh-keygen -t rsa`
2. 生成した公開鍵をGithubアカウント管理画面で登録する。
3. Jenkins実行サーバにてJenkinsユーザになり、SSHでgithubに接続する `ssh github.com`

上記でjenkinsからgithubのプライベートリポジトリをチェックアウトできるようになります。


もちろん、他の方法でSSHキーを生成して、_JenkinsユーザのHOME/.ssh_ に登録しても良いのですが、その場合gitコマンドに秘密鍵ファイルを指定する方法がないので、_~/.ssh/config_ ファイルを作る必要があります。

~/.ssh/config

>Host github.com
>    HostName        github.com
>    IdentityFile    ~/.ssh/github.key
>    User            github@gmail.com

上記ファイルを作りましたら `git clone` などが実行できるかJenkinsユーザで確認しましょう。
長い String で inspect を省略


irb や rails console でちょっと大きなファイルを読んでしまったときに、inspect が延々表示されて後悔したので、長い String の場合は、最初の 1000 文字と文字数が表示されるようにした。

`~/.irbrc` に書いておくと便利。

```ruby
class String
  def inspect_with_truncate
    limit = 1000
    return inspect_without_truncate if length <= limit
    self[0, limit].inspect + "... (#{length}chars)"
  end
  alias_method :inspect_without_truncate, :inspect
  alias_method :inspect, :inspect_with_truncate
end
```
RegExp#exec で複数マッチ


[PeepCode](https://peepcode.com/) の [@creationix の回](https://peepcode.com/products/play-by-play-nodejs-creationix)を見ていて気になったので。

まず、複数マッチさせるには、RegExp が global になっていないといけません。

```js
var regexp = /wow/g;
var target = "wow this is great! wow! wow!"
console.log(regexp.exec(target));
// [ 'wow', index: 0, input: 'wow this is great! wow! wow!' ]
console.log(regexp.exec(target));
// [ 'wow', index: 19, input: 'wow this is great! wow! wow!' ]
console.log(regexp.exec(target));
// [ 'wow', index: 24, input: 'wow this is great! wow! wow!' ]
console.log(regexp.exec(target));
// null
console.log(regexp.exec(target));
// [ 'wow', index: 0, input: 'wow this is great! wow! wow!' ]
```

というふうに、global になっている RegExp は順番にマッチを返してくれます。これは RegExp#lastIndex に前回のマッチが保存されているため。全てのマッチを返し終わった後は一度 `null` を返し、その後また最初のマッチに戻ります。

全部のマッチを集めるには、こんな感じです。

```js
var regexp = /wow/g;
var target = "wow this is great! wow! wow!"
var match; // Make sure not to inject global :-)
var matches = [];
while (match = regexp.exec(target)) {
  matches.push(match);
}
console.log(matches);
// [ [ 'wow', index: 0, input: 'wow this is great! wow! wow!' ],
//   [ 'wow', index: 19, input: 'wow this is great! wow! wow!' ],
//   [ 'wow', index: 24, input: 'wow this is great! wow! wow!' ] ]
```

参考
http://stackoverflow.com/questions/520611/how-can-i-match-multiple-occurrences-with-a-regex-in-javascript-similar-to-phps
MYSQLのレプリケーション不整合を解決 



今回は Slave_IO_Running: No の場合


スレーブ側で

``` sql
mysql> SHOW SLAVE STATUS;
```

Slave_IO_Running: と Slave_SQL_Running: が両方とも YES になっていると、スレーブは問題なく動作していることになる。

しかしSlave_IO_RunningのみがNOになっている。どうしよう困った。


手順としてはレプリケーション側の情報をマスターの情報に全て書き変えてしまってSTART SLAVE;を行う。


まず最初にマスター側で

``` sql
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
```

で表示された
FileとPositionの値を取っておく
例としてFile:mysql-bin.000003 | Position:3533033としておく

メモ取り終わったら

``` sql
mysql> UNLOCK TABLES;
```

でロック解除

そしてマスターのDB情報をダンプ

``` sh
$ mysqldump -u root -p master_db  > master_db.sql
```

ダンプしたsqlをスレーブに上書きする

``` sh
$ mysql -u root -p slave_db < master_db.sql
```

スレーブ側で

``` sql
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003',  MASTER_LOG_POS=3533033;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;
```


これで直った
nilまたは空白の場合にデフォルト値を返す

```ruby:
blank_or_value.blank? ? 'Default' : blank_or_value
```
のように書かざるを得ないところを

```ruby:
blank_or_value.presence || 'Default'
```
と書ける

ちなみに[Rails 2.3.8くらいから](http://apidock.com/rails/Object/presence)

`.presence ||` でつなげるのかっこいいな

[参考:Stackoverflow(If string is empty then return some default value)](http://stackoverflow.com/questions/4817266/if-string-is-empty-then-return-some-default-value)

この書き方を調べたきっかけは、みな良く知っていて最も良く使われる以下の表現

```ruby:
nil_or_value || 'Default'
``` 

他にも関連する例を挙げておくと

```ruby:
@nil_or_value ||= 'default value'

nil_or_object.try(:hoge)

blank_or_value.present?
```
認証proxyを回避する

日本企業にありがちな認証Proxyで困ったよ、というお話。

パフォーマンスを上げるために、jsとかcssをサービス提供元のドメインではなく、CDNなど外部にホストされているものを利用することは珍しいことではないと思う。
認証Proxyを利用しているネットワークから、外部にホストされたリソースを読み込んでいるページヘアクセスすると、Proxy認証ダイアログが表示される。これは、Gebなどで書かれたテストコードを実行する際にも起きる。

せっかくテストコードを書いたにも関わらず、ちっとも自動テストにならない。

そこでFiddlerですよ。http://www.fiddler2.com/fiddler2/

ローカルプロキシツールで、httpの通信をキャプチャしたり、レスポンスそのものを特定のものに差し替えたり、っていうことができる代物。これを使って、リクエストにProxy-Authorizationヘッダーを追加すれば、テスト実行時にプロキシ認証を回避することができる。

http://www.fiddler2.com/Fiddler/Dev/ScriptSamples.asp を見ると書いてあるけど、スクリプトでヘッダーの書き換えなどを実現できる。

メニューからRules->Customize Rulesを選ぶとエディタが起動するので、OnBeforeRequestというメソッドを探す。その中に、
```oSession.oRequest["Proxy-Authorization"] = "認証Token";```
と記述すると、Fiddler経由での通信時にHTTP認証済みの状態となるので、ページ内から外部にホストされたリソースを読み込もうとしても認証ダイアログが出ず、テストを自動実行することができる。
ubuntuにjavaを入れる


```
$ sudo apt-get install openjdk-6-jre openjdk-6-jdk openjdk-6-source
$ java -version
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

```

普段はjavaの人では無いのですが
取り急ぎjavaコマンドを使いたくてパッケージを導入

openjdkパッケージの他にもoracle-javaパッケージ等あったのですが違いは良く解らず。。
ページの slug を body のクラスに足す


デフォルトでは `page-id-9` のように ID が追加されますが、スタイルシートに書いたときにわかりにくいですよね。

わかりやすいように slug を足すには、テーマの `functions.php` に以下を追記します。

```functions.php
function add_slug_body_class($classes) {
  global $post;
  if (isset($post)) {
    $classes[] = $post->post_type . '-' . $post->post_name;
  }
  return $classes;
}
add_filter('body_class', 'add_slug_body_class');
```

[How to Add Page Slug in Body Class of your WordPress Themes](http://www.wpbeginner.com/wp-themes/how-to-add-page-slug-in-body-class-of-your-wordpress-themes/) より。
可変長引数で渡したコールバック関数を$.Deferred().pipe()で直列処理

アニメーションなどの直列処理をするときjQueryのDeferredとpipeを使うと便利。

```js
$.Deferred().pipe(function () {
	// なんらかの処理
	// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
	// （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
	return promised;
}).pipe(function () {
	// なんらかの処理
	// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
	// （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
	return promised;
}).pipe(function () {
	// なんらかの処理
	// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
	// （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
	return promised;
}).resolve();
```
結構冗長なので、次のような関数にしてしまう。

```js
var sequence = function () {
		var dfd,
			piped,
			i,
			l = arguments.length;
		dfd = $.Deferred();
		for (i = 0; i < l; i += 1) {
			if ($.isFunction(arguments[i])) {
				piped = (piped ? piped : dfd).pipe($.proxy(function () {
					return this();
				}, arguments[i]));
			}
		}
		dfd.resolve();
};

sequence(
	function (){
		// なんらかの処理
		// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
		// （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
		return promised;
	},
	function (){
		// なんらかの処理
		// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
		// （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
		return promised;
	},
	function (){
		// なんらかの処理
		// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
		// （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
		return promised;
	}
);
```
CoffeeScriptで書くときはもっとすっきり書ける。

```coffeescript
sequence(
	->
		# なんらかの処理
		# ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
		# （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
		promised
	->
		# なんらかの処理
		# ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
		# （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
		promised
	->
		# なんらかの処理
		# ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
		# （※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される）
		promised
)
```
現在のブランチ名を取得するコマンド


以下のコマンドで、現在のブランチ名を表示できる。

```sh
git branch --contains=HEAD
```

branch コマンドの contains オプションは、指定したコミットを含むブランチのみを表示する。

コミット指定を省略すると HEAD が指定されたとみなすので、以下でも上記コマンドと同じ意味になる。

```sh
git branch --contains
```