OmniAICreator/Qiita-1.07M huggingface dataset:
複数のパスの共通のプリフィクスを求める（２）

下のようなメソッドで、複数のパスの共通のプリフィクスを取得できます。

* 意図しないところで`Dir.chdir`するかも知れないので（他のスレッドとか）パスは全部フルパスにしておきたい
* でもユーザーへの表示とかどこかへの出力には極力短いパス名を使いたい

という時に使えます。

```ruby
require 'pathname'
require 'pathname/common_prefix'

paths = %w[
  /path/to/base/dir/and/file1
  /path/to/base/dir/and/file2
  /path/to/base/dir/and/subdir/file1
  /path/to/base/dir/and/sub/dir/file2
].map {|path| Pathname(path)}
dir = Pathname.common_prefix(*paths) # => #<Pathname:/path/to/base/dir/and>
puts paths.map {|path| path.relative_path_from(dir)}
# file1
# file2
# subdir/file1
# sub/dir/file2
```

……のですが、こんな需要あるのかな？
僕は必要なので書いたんですけど。
以下がメソッドの実装です。

```ruby
require 'pathname'

class Pathname
  class << self
    def common_prefix(*paths)
      base = paths.pop
      return if base.nil?
      base.common_prefix(*paths)
    end
  end

  def common_prefix(*paths)
    paths = paths.map {|path| path.enum_for(:descend)}
    last_filename = nil
    enum_for(:descend).each do |filename|
      break unless paths.all? {|path|
        begin
          filename == path.next
        rescue StopIteration
        end
      }
      last_filename = filename
    end
    last_filename
  end
end
```
解答発見編：nosetestsで再帰でテストケースを見てもらう

※[これ](http://qiita.com/items/b4abd81cf0d7c6b116ad)の調査結果

これだけだったorz

``` 
nosetests-2.7 --all-modules -v src/test
```

再帰で見てくれるって幾つかの日本語ブログで見た気がするし、公式ドキュメントは…自分がそう誤読したのかなぁ。なんにせよすぐ見つかってよかった。
nosetestsが何故か再帰でテストケースを探してくれない？


macportsでインストールしたnoseについているnosetests-2.7が何故かテストケースを再帰的に探してくれない？

``` 簡易構成
ProjectRoot/
	src/
		test/
			__init__.py
			module_name/
				__init__.py
```

``` python:src/test/__init__.py
""" test sample
"""
from nose.core import unittest

class MainTest(unittest.TestCase):
    def test_sample(self):
        "set up test fixtures"

```

``` python:src/test/module_name/__init__.py
""" unittest for module
"""
# -*- coding: utf-8 -*-
from nose.core import unittest

class SampleTest(unittest.TestCase):
    def test_sample(self):
        self.fail('sss')
```

で、やってみた

``` ターミナルで実行する(プロンプトは適当に直した)
>Project_Root $ nosetests-2.7 -v  src/test 
set up test fixtures ... ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
```

あれ？これだけ？

``` ターミナルで実行する(プロンプトは適当に直した)
>Project_Root $ nosetests-2.7 -v  src/test/*
set up test fixtures ... ok
set up test fixtures ... ok
test_sample (test.module_name.SampleTest) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.002s

OK
```

*つければ確かに次の階層までは見ているけど、これだと更に下の階層を作るとまた同じ結果かなぁ。
TestSuiteでどうにかするか、再帰で見に行く方法を考えてみるか……
地図SDKは MapKit だけじゃない！OSMやBingが使える iOS用 Map SDK、route-me のセットアップ方法

MapKit の有無を言わせない変更により自作アプリの地図がしょぼくなってしまったとお嘆きのデベロッパーのあなたにお送りします。自分の地図アプリが Apple 対 Google の争いに巻き込まれて影響を受けるなんて耐えられない！そう思いませんか？

route-me という SDK をご存知でしょうか。MapKitと同じような機能を提供するオープンソースのSDKです。現在のところ、 OpenStreetMap, Microsoft VirtualEarth, CloudMade, OpenAerialMap, OpenCycleMap, SpatialCloud などに対応しています。

この記事では、route-me の使い方を解説します。

# ライブラリのダウンロードとセットアップ

早速 iOS でビルドしてみましょう。まずはソースコードをダウンロードしてきます。

```sh:
git clone https://github.com/route-me/route-me.git
```

clone している間に、CloudMade のライセンスキーを取ってきましょう。http://cloudmade.com/register からアカウントを取ると、APIキーが取得できます。
clone が終わったら、サンプルプロジェクトを適当なフォルダにコピーします。

```sh:
cp -rp samples/SampleMap/ ../your/awesome/mapproject
```

プロジェクトファイルを開きます。

```sh:
open your/awesome/mapproject/SampleMap.xcodeproj/
```

Exampleフォルダ以下のプロジェクトからは相対パスでroute-meのライブラリにリンクがされている為、Exampleプロジェクトを別のフォルダに移すとリンクが壊れビルドできませんので、リンクを修正します。

* MapView.xcodeproj のリンク先を、route-me フォルダ配下のMapView.xcodeproj に指定しなおします。（XCode4 以降の場合、左のファイルインデックスから赤くなっている MapView.xcodeproj を選択した状態で右ペインの Utility を開き、Location 部分のアイコンをクリックすると変更できます。）
* SampleMap の TARGETS を選択し、Build Phases からTarget Dependencies を開き、MapView を追加します。
* Link Binary With Libraries を開き、libMapView.a を追加します。
* Build Settings を開き、Header Search Paths を検索、../MapView/ となっているところを正しい位置に修正します。

MainViewController.m の、CloudMade のライセンスキー部分を、先ほど取得したものに変更します。

```objective-c:MapViewController.m
id myTilesource = [[[RMCloudMadeMapSource alloc] 
              initWithAccessKey:@"YOUR_API_KEY" styleNumber:999] autorelease];
```

本来これで動くはずなのですが、私の場合ビルドすると RMCloudMadeMapSource.h が存在しないというエラーになってしまいました。
よく見ると MapView.xcodeproj/Map の中にRMCloudMadeMapSource 関連のファイルが入っていません。したがって Finder から、MapView/Map/以下にある RMCloudMadeMapSource.h と RMCloudMadeMapSource.m のファイルを XCode 上の MapView.xcodeproj/Map にドラッグドロップしたところ動くようになりました。

![CloudMade](https://dl.dropbox.com/u/442212/qiita/cloudmade1.png "CloudMade")

移動やピンチイン、アウトでのズームなんかも問題なく動きます。

# デザインを変更する

あれ、でもなんか画像が夜みたいになってますね。かっこいいけど地図としてはみにくいです。ちゃんとした地図を表示したいですね。CloudMade にはStyleEditor というものがあって、ユーザーが様々なスタイルを作ることが可能です。先ほどの

```objective-c:MapViewController.m
id myTilesource = [[[RMCloudMadeMapSource alloc] 
              initWithAccessKey:@"YOUR_API_KEY" styleNumber:999] autorelease];
```
の、styleNumber 部分が実はスタイルを指定しているのです。
http://maps.cloudmade.com/editor から、好きなスタイルを選んできましょう。
![Styles](https://dl.dropbox.com/u/442212/qiita/cloudmade_styles.png "CloudMade Editor")
いっぱいありますね！ 右下の数字がStyleIDです。試しに997番を選んでみました。

```objective-c:MapViewController.m
id myTilesource = [[[RMCloudMadeMapSource alloc] 
              initWithAccessKey:@"YOUR_API_KEY" styleNumber:997] autorelease];
```

みごとスタイルが変更されました。やりましたね！
![変更された！](https://dl.dropbox.com/u/442212/qiita/style-997.png "変更された地図")

CloudMade 以外の地図サービスの使い方も書こうと思ってたのですが、時間がなくなってきたので今日はこのへんで。
WEB APIで の json取得時に http header に content-type:Application/json を付加するとPOSTリクエストが無効になる


\WEB API側の設計によるのかもしれないけど…

当方の環境

xCode4.3からNSURLConnection で PHP で記述されたWEB APIにアクセス。サーバはApache+Postgres。
http body にリクエストキューを格納し、POSTでhttp requestを送信するも戻り値が取得できなかったので少しハマった。
Apacheのlog上でもPOSTで記録されているが、試しにPHP側で 'GET ならここ' の条件分岐を置くとそこに入る。

原因が分からなかったので少しずつコードをいじってわかったのが

    [urlRequest setValue:@"application/json;" forHTTPHeaderField:@"content-type"];

を付加すると発生する現象だと判明。

    [urlRequest setValue:@"application/x-www-form-urlencoded;" forHTTPHeaderField:@"content-type"];

にて解決。



こういう感じで書けばいいのかな??
anythingから、ローカルにあるrubygemsのファイル開く。bundlerも対応

以下を評価して、
M-x anything-local-gems
すると、インストールされているgemの一覧が出るので、選択すると、 そのgemのlib/を開く。

また、カレントバッファの祖先ディレクトリにGemfileがみつかった場合、bundlerで管理されている方のgemが選択されまうす。

```cl
(defvar anything-c-sources-local-gem-file
  '((name . "rubygems")
    (candidates-in-buffer)
    (init . (lambda ()
              (let ((gemfile-dir (block 'find-gemfile
                                   (let* ((cur-dir (file-name-directory
                                                    (expand-file-name (or (buffer-file-name)
                                                                          default-directory))))
                                          (cnt 0))
                                     (while (and (< (setq cnt (+ 1 cnt)) 10)
                                                 (not (equal cur-dir "/")))
                                       (when (member "Gemfile" (directory-files cur-dir))
                                         (return-from 'find-gemfile cur-dir))
                                       (setq cur-dir (expand-file-name (concat cur-dir "/.."))))
                                     ))))
                (anything-attrset 'gem-command
                                  (concat (if gemfile-dir
                                              (concat "BUNDLE_GEMFILE=" gemfile-dir "/Gemfile "
                                                      "bundle exec ")
                                            "")
                                          "gem 2>/dev/null"))
                (unless (anything-candidate-buffer)
                  (call-process-shell-command (concat (anything-attr 'gem-command) " list")
                                              nil
                                              (anything-candidate-buffer 'local))))))
    (action . (lambda (gem-name)
                (let ((path (file-name-directory
                             (shell-command-to-string
                              (concat (anything-attr 'gem-command) " which "
                                      (replace-regexp-in-string "\s+(.+)$" "" gem-name))))))
                  (if (and path (file-exists-p path))
                      (find-file path)
                    (message "no such file or directory: \"%s\"" path))
                  )))))

(defun anything-local-gems ()
  (interactive)
  (anything-other-buffer
   '(anything-c-sources-local-gem-file)
   "*anything local gems*"
  ))
```
クロスブラウザ対応placeholder

##全然凝った動きをしないシンプルなplaceholder。
IE8とか7でも動くのがウリ。

```js
(function($) {

$.fn.snPlaceholder = function(options) {
	var defaultSetting = {
		 phTextColor	: 'silver'
		,phAttribute	: 'placeholder'
		,saveAttribute : '_placeholder'
	}
	
	var ready = 'ready';
	
	var settings = $.extend({},defaultSetting,options);
	
	var init = function(){
		var _self = $(this);
		_self.attr(defaultSetting.saveAttribute ,_self.attr(settings.phAttribute));
		if (_self.val() == '' || _self.val() == _self.attr(defaultSetting.saveAttribute)) {
			_self.css('color',settings.phTextColor);
			_self.val(_self.attr(settings.phAttribute));
		}
		_self.removeAttr('placeholder');
		
		_self.focus(function(){
			if(_self.val() == _self.attr(defaultSetting.saveAttribute)){
				_self.attr(ready ,'true');
			}
		})
		
		_self.keydown(function(e){
			if(_self.attr(ready) == 'true'){
				_clear(_self);
				_inputStart(_self);
			}
		})
		_self.blur(function(){
			_reset(_self);
		})
		_self.closest('form').submit(function() {
			if(_self.val() == _self.attr(defaultSetting.saveAttribute)){
				_self.val('');
			}
			return true;
		});
		
		function _clear(self){
			self.val('');
		}

		function _reset(self){
			if(self.val() === ''){
				self.val(self.attr(defaultSetting.saveAttribute));
				self.css('color',settings.phTextColor);
			}
		}
		
		function _inputStart(self){
			self.attr(ready ,'false');
			self.css('color','');
		}
	}
	
	
	this.each(function(){
		init.apply(this);
	});
	return this;
};
})(jQuery);
```

##使い方
```html
  $('.ph').snPlaceholder({});
```
##オプションについて
以下の要素を変えたい時、引数のオブジェクトに指定してやってください。

* phTextColor　プレースホルダの色を変えます
* phAttribute　プレースホルダとして指定するアトリビュート名を設定します
* saveAttribute　プレースホルダ内容を保持しておくアトリビュート名を設定します。あんまりいじる意味はないです。
実行ファイルとDLLを一つにまとめる


Visual C# で、自作のクラスライブラリと実行ファイルを一つにまとめる（静的リンクもどきを行う）やり方です。
Microsoftが提供しているツール「[ILMerge](http://www.microsoft.com/en-us/download/details.aspx?id=17630)」で複数のアセンブリを一つのアセンブリにマージできます。
このツールを使うことで、自作のクラスライブラリのDLLと実行ファイルを一つにまとめることができます。

## ILMergeの使い方

インストール後、コマンドプロンプトでこんな感じにコマンド打てばexeとDLLをマージしてくれます。

```bat:コマンドプロンプト&nbsp;ILMerge&nbsp;実行例
"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /out:hoge_merge.exe hoge.exe piyo.dll foo.dll
```

/out: に出力ファイル名を指定します。（この例ではhoge_merge.exeを指定）
それ以外の引数にマージしたいexe、DLLファイル名を指定します。（この例ではhoge.exe、piyo.dll、foo.dllを指定）


<br />
### ワイルドカードでファイル名を指定する

引数に渡すファイル名をワイルドカードで指定したい場合は次のように /wildcards を追加します。

```bat:コマンドプロンプト&nbsp;ワイルドカードによるファイル名指定の&nbsp;ILMerge&nbsp;実行例
"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /wildcards /out:hoge_merge.exe hoge.exe *.dll
```

ちなみに /wildcards を指定せずに実行するとエラーになります。

```bat:コマンドプロンプト&nbsp;/wildcards&nbsp;を指定しないときの&nbsp;ILMerge&nbsp;実行例（エラーになる）
"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /out:hoge_merge.exe hoge.exe *.dll
```

実行結果

> An exception occurred during merging:
> ILMerge.Merge: Could not find the file '*.dll'.
> &nbsp;&nbsp;&nbsp;場所 ILMerging.ILMerge.Merge()
> &nbsp;&nbsp;&nbsp;場所 ILMerging.ILMerge.Main(String[] args)

<br />
## Visual C# でビルドしたあと自動的にマージされるようにする

いちいちコマンドラインで入力するのがぶっちゃけ面倒なので、
ビルドかけたときに自動でexeとDLLをマージしてくれるようにします。

Windowsアプリケーションを出力するプロジェクトのプロパティで、
「ビルド イベント」の「ビルド後に実行するコマンドライン」に
次の内容を追加するとビルド後にマージを行うようになります。
（コピペですぐ使えるはず）

```bat:ビルド後に実行するコマンドライン
set fname_new=$(TargetName)_merge$(TargetExt)
"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /wildcards /out:%fname_new% $(TargetFileName) *.dll
```

説明不要かと思いますが、一応。（Visual C# がごにょごにょしてくれる）

- $(TargetName) … アプリケーションのアセンブリ名
- $(TargetExt) … 拡張子（.exe）
- $(TargetFileName) … 出力される実行ファイル名


<br />
### 注意

次のようにマージ後のファイル名を元のファイル名にしてしまうと、デバッガが効かなくなります。

```bat:ビルド後に実行するコマンドライン
set fname_bk=$(TargetName)_bk$(TargetExt)
move $(TargetFileName) %fname_bk%
"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /wildcards /out:$(TargetFileName) %fname_bk% *.dll
```


<br />
## 参考
- アプリケーションのEXEファイルやDLLファイルを1つにまとめるには？ － ＠IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/426ilmerge/ilmerge.html

- Download: ILMerge - Microsoft Download Center - Download Details
http://www.microsoft.com/en-us/download/details.aspx?id=17630
第一回オフラインリアルタイムどう書くの回答 Haskellで

[Tick-Tack-Toeの判定](http://nabetani.sakura.ne.jp/hena/1/)を書いてみた。
他のひとのより長いなー……。

```haskell
import Data.Array (Array, listArray, (//), (!))
import Data.Char (digitToInt)
import Data.Maybe (isJust)

data Member = O | X deriving Eq
instance Show Member where
  show O = "o"
  show X = "x"
opposite :: Member -> Member
opposite O = X
opposite X = O

type Map = Array Int (Maybe Member)
newMap :: Map
newMap = listArray (1, 9) $ repeat Nothing

newtype Result = Result (Maybe Member, Bool)
instance Show Result where
  show (Result (Just m, f))  = (if f then "Foul : " else "") ++ show m ++ " won."
  show (Result (Nothing, _)) = "Draw game."


main :: IO ()
main = getLine >>= print . parse . map digitToInt

parse :: [Int] -> Result
parse = parse' newMap 0 . zip (cycle [O, X])
  where
    parse' :: Map -> Int -> [(Member, Int)] -> Result
    parse' _ 9 _      = Result (Nothing, False)
    parse' m c (i:is) = let (m', r@(Result (w, _))) = play m i
                        in  if isJust w then r
                                        else parse' m' (c+1) is

    play :: Map -> (Member, Int) -> (Map, Result)
    play m (mem, pos)
      | isJust (m ! pos) = (m, Result (Just $ opposite mem, True))
      | otherwise        = let m' = m // [(pos, Just mem)]
                           in  (m', Result (check m', False))

check :: Map -> Maybe Member
check m = foldr1 (<|<) $ map (isEqual . map (m !)) patterns
  where
    (<|<) :: Maybe a -> Maybe a -> Maybe a
    _ <|< b@(Just _) = b
    a <|< Nothing    = a
    
    isEqual :: [Maybe Member] -> Maybe Member
    isEqual [Just a, Just b, Just c]
      | a == b && b == c             = Just a
    isEqual _                        = Nothing
    
    patterns :: [[Int]]
    patterns = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9], [1, 5, 9], [3, 5, 7]]
```
【初心者速報】WindowsでRailsはほんとしぬ

WindowsでRailsを使おうとしたらあまりに苦痛だったので、Linux系と比べてどうデメリットがあるのか、2点だけ簡潔にメモ。

1.遅きこと亀の如し

だれかが「WindowsのRailsがもしわが社の新入社員だったら即刻解雇だね！」と言っていたのは本当である。びっくりするほど遅く、逆にMacでRailsを試したときその速さにビビる。

2.ライブラリ不具合おおすぎ

libv8とやらが邪魔で毎回bundle installができない。挫折。
第一回オフラインリアルタイムどう書く参考問題の回答 Haskellで

問題文はこちら。
http://qiita.com/items/cbc3af152ee3f50a822f

不正な入力への対策が要らない、役の種類も限定的、ということで、スートを捨てて良いことになるが、今回は拡張性を残して記述した。

```haskell
import Data.List (sort, group)

type Card = (Char, Char)

main :: IO ()
main = getLine >>= print . analyze . process

process :: String -> [Card]
process []             = []
process (s:'1':'0':ss) = (s, 'X') : process ss
process (s:l:ss)       = (s, l)   : process ss

analyze :: [Card] -> String
analyze cs = case sortLank cs of
               (4:_)   -> "4K"
               [3, 2]  -> "FH"
               (3: _)  -> "3K"
               (2:2:_) -> "2P"
               (2:_)   -> "1P"
               _       -> "--"
  where
    sortLank :: [Card] -> [Int]
    sortLank = reverse . sort . map length . group . sort . snd . unzip
```
OpenGL ES でのglReadPixelsとpresentRenderbufferの嫌な関係

なぜかglReadPixelsが真っ黒のデータを返してくる！！
と非常に困っていたが、どうもEAGLContextのpresentRenderbufferの後にglReadPixels
を呼んでいたことが原因のようだ。
そしてこれが発現するのは、
CAEAGLLayerのdrawablePropertiesのkEAGLDrawablePropertyRetainedBackingがNOの場合だけのようだ。
描画可能サーフェスを表示した後にコンテンツを保持するかで、
今回の場合、presentしちゃったからもう破棄されていて、真っ黒だったのだ。
なので、kEAGLDrawablePropertyRetainedBackingをYESにするか、
presentの前にglReadPixelsをしなければならない。

こんなところで引っかかる人は相当少ないだろうが、一応メモっておこう。
Rails3.2インストールメモ

     1.  RVM インストール
               $bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

     2.  RVMインストール時のコメントに下記が表示されるので、
          * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
          in all your open shell windows, in rare cases you need to reopen all shell windows.
          下記を実行
               $ source /etc/profile.d/rvm.sh
          .bash_profileが変更されるため、読み込み
               $ source .bash_profile

     3. Ruby用パッケージのインストール
               $ rvm requirements
          ruby: yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel
          そのままコピペして実行する
               $  yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel

     4. Gitインストール(作業時はインストール済みだった)
               $ yum install git
     
     5. Rubyインストール 
               $rvm install 1.9.3
               $rvm --default 1.9.3
 
     6. Railsインストール
               $gem install rails

     7. Node.jsインストール(stable 最新バージョンをインストール)
               $ wget http://nodejs.org/dist/v0.6.15/node-v0.6.15.tar.gz
               $ tar zxf node-v0.6.15.tar.gz
               $ cd node-v0.6.15
               $ ./configure
               $ make && make install
          
     8. SQLite3インストール
               $yum install sqlite-devel

     9. バンドルのインストール
               $ bundle install 
               * パスを指定しない場合$GEM_HOME以下にインストールされる
knife(chef)のsshでホスト名以外のattributeを使う

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

適当なサーバに`knife bootstrap`したあと、`knife ssh`などでなにかコマンド実行させよう。


`knife ssh`はデフォルトではホスト名で接続に行くので、IPが引けないとこうなる。

```
knife ssh "hostname:hogehoge" "uptime"
FATAL: 1 node found, but do not have the required attribute to stablish the connection. Try setting another attribute to open the connection using --attribute.
```

この場合、ohaiで取れる別の`attribute`を使うことが出来る。

```
knife ssh "hostname:hogehoge" "uptime" --attribute ipaddress
210.xxx.xxx.xxx  02:03:11 up 33 min,  2 users,  load average: 0.00, 0.00, 0.00
```

OK.
Setup modern Python environment with Homebrew

Based on http://ymotongpoo.hatenablog.com/entry/20120516/1337123564
Unfortunately, pythonbrew is owkn...
Let's use **virtualenv** for switching multiple Python versions!

## Install Python and related tools

I mainly use Python3 :)
Latest Python3 version in Homebrew is Python 3.2.3.

```sh
% brew install python3
% /usr/local/share/python3/easy_install3 pip
% /usr/local/share/python3/easy_install3 virtualenv
% /usr/local/share/python3/easy_install3 virtualenvwrapper
```

## Configuration in .zshrc

```sh
PYTHON_VER=3.2
export HOMEBREW_PREFIX=/usr/local
export VIRTUALENVWRAPPER_PYTHON=$HOMEBREW_PREFIX/bin/python$PYTHON_VER
export VIRTUALENV_BIN=$HOMEBREW_PREFIX/share/python3
export WORKON_HOME=$HOME/.virtualenvs
. $VIRTUALENV_BIN/virtualenvwrapper.sh
export PATH=$VIRTUALENV_BIN:$PATH

mkvenv ()
{
    base_python=`which python$1` 
    mkvirtualenv --distribute --python=$base_python $2
}
```

## Try!

```sh
% source .zshrc
% mkvenv 3.2 dev
(dev)% which python
$WORKON_HOME/dev/bin/python
(dev)% python -V                                   
Python 3.2.3
(dev)% pip install tornado
(dev)% deactivate
% source $WORKON_HOME/dev/bin/activate
(dev)% 
```
HerokuでStaging環境のデータベースをProduction環境にコピーする手順


##事前準備
###remoteオプションを追加する
`--remote staging` `--remote production`のようなオプションで、Staging環境とProduction環境を使い分けられるようにしておきます。
詳細は以下のブログ記事を参照してください。

http://blog.mat-aki.net/heroku-staging-production-command-remote


###PG Backupsアドオンを追加する
Staging, ProductionともにHerokuのPG Backupsアドオンを追加します。(無料)



##手順
PG Backupsのcaptureとrestoreを使って、データをトランスファーします。
間違って逆方向にコピーしたりしないよう、二人で作業することを推奨します。

````bash
# サイトにメンテナンスモードに変更
$  heroku maintenance:on --remote staging
$  heroku maintenance:on --remote production

# Staging環境のバックアップ状況を確認
$  heroku pgbackups --remote staging

# Staging環境のデータをコピー(バックアップ)
$  heroku pgbackups:capture --remote staging

# バックアップが増えたことを確認
$  heroku pgbackups --remote staging

# Staging => Productionへのコピー(リストア)を実施
$  heroku pgbackups:restore DATABASE `heroku pgbackups:url --remote staging` --remote production

# Production環境に接続してデータがちゃんとコピーされたことを確認
$  heroku console --remote production

# サイトのメンテナンスモードを解除
$  heroku maintenance:off --remote production
$  heroku maintenance:off --remote staging

````


##参考
PG Backupsのコマンドマニュアル
https://devcenter.heroku.com/articles/pgbackups
RSpecのテンプレート

=======================

会社の先輩から教えて頂いたRSpecを書くときのコツ。次のテンプレートを基本として書く。

```ruby
describe '#メソッド名' do
  subject { hoge }                     # describe に対して subject を書く

  context '状況1' do
    before do                        # context に対して before を書く
    end

    it { ... }
  end
  
  context '状況2' do
    # ...
  end
end
```

Mock を使う場合は subject が使えないので、it の代わりに specify を使って書く。
ただ、Mock ではなく spy を使えば subject でかける。
RSpec で spy を使うには [rspec-spies](https://github.com/technicalpickles/rspec-spies) を用いる。

また、このテンプレートの問題点は複数のメソッドで同じ context を使いたい場合にテストが冗長になること。その場合、shared_context を使う。
Homebrew で Nodes.js をやってみた


##環境
* Mac OS X 10.7
* Homebrew はインストール済み

##参考
* [Node.jsでHello worldするまで - 飲む、寝る。](http://d.hatena.ne.jp/nomnel/20111204/1323003399)

手順はほぼこのとおり。

##手順

	$ brew install node.js

>Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.
==> Downloading http://nodejs.org/dist/v0.8.4/node-v0.8.4.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/node/0.8.4 --without-npm
==> make install
==> Caveats
Homebrew has NOT installed npm. We recommend the following method of
installation:
  curl http://npmjs.org/install.sh | sh

>After installing, add the following path to your NODE_PATH environment
variable to have npm libraries picked up:
  /usr/local/lib/node_modules
==> Summary
/usr/local/Cellar/node/0.8.4: 79 files, 11M, built in 6.2 minutes

なんか、 MacPorts/Fink と仲が悪そうだけど、とりあえず無視して次へ。


	$ curl http://npmjs.org/install.sh | sh
>  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    85    0    85    0     0    109      0 --:--:-- --:--:-- --:--:--   384
sh: line 1: syntax error near unexpected token \`newline'
sh: line 1: `\<html>Moved: \<a href="https://npmjs.org/install.sh">https://npmjs.org/install.sh \</a>'

うお、エラーだ！どうやら URL が変わった(http → http***s*** になっただけ)らしい。
URL を修正してリトライ。

	$ curl https://npmjs.org/install.sh | sh

>  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7882  100  7882    0     0   5672      0  0:00:01  0:00:01 --:--:--  7977
tar=/usr/bin/tar
version:
bsdtar 2.8.3 - libarchive 2.8.3
install npm@1.1
fetching: http://registry.npmjs.org/npm/-/npm-1.1.62.tgz
0.8.4
1.1.62
cleanup prefix=/usr/local

>All clean!

> npm@1.1.62 prepublish .
> npm prune ; rm -rf test/*/*/node_modules ; make -j4 doc

>sh: npm: command not found
make: Nothing to be done for \`doc'.
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@1.1.62 /usr/local/lib/node_modules/npm
It worked
```

**npm: command not found** が気になるけど成功したぽい。

##Hello World!!

前述のサイトそのまんまなので略。
ふむ、うまくいった。
Amazon EC2にディスク(EBS)を追加してEC2にアタッチする手順


## EBSの追加
EC2 Management Consoleにて

1.	左にあるNavigationより「ELASTIC BLOCK STORE」->「Volumes」を選択
2. EBS Volumesより一番上の方にある「Create Volume」を選択
3. 必要な項目を入力
 * Availability Zoneはディスクを利用予定のEC2インスタンスがある場所と同じ場所を選択
 * Snapshotは取得済みのスナップショットからコピーしてディスクを使う場合に選ぶ(と思われる。試してない)
 * Volume TypeはProvisioned IOPSにするとIO waitに合わせたチューニングが出来るようになるらしい。(試してない)
4. 作成が済んだらEBS Volumesより今作成したVolumeを選択して右クリックして「Attach Volume」を選択
5. InstancesよりアタッチしたいEC2インスタンスを選択する

以上によりEC2インスタンスの/dev以下にアタッチしたディスクのデバイスファイルが作成される。
注) Management Console上では/dev/sdfのデバイスファイルと表示されていたが、実際は/dev/xvdfが生成されている様子
マルチバイト文字と指定の文字をエスケープしたJSONを作る（Jacksonを使用）


サロゲートペアの文字でもちゃんとエスケープしてくれる。

```groovy:
import org.codehaus.jackson.map.ObjectMapper
import org.codehaus.jackson.io.CharacterEscapes
import org.codehaus.jackson.SerializableString
import org.codehaus.jackson.JsonGenerator.Feature
@Grab('org.codehaus.jackson:jackson-mapper-lgpl:1.9.9')

public class CustomCharacterEscapes extends CharacterEscapes {

    private final int[] _asciiEscapes;

    public CustomCharacterEscapes() {
        _asciiEscapes = standardAsciiEscapesForJSON();
        _asciiEscapes['/'] = CharacterEscapes.ESCAPE_STANDARD;
        _asciiEscapes['<'] = CharacterEscapes.ESCAPE_STANDARD;
        _asciiEscapes['>'] = CharacterEscapes.ESCAPE_STANDARD;
        _asciiEscapes['+'] = CharacterEscapes.ESCAPE_STANDARD;
    }
    
    @Override
    public int[] getEscapeCodesForAscii() {
        return _asciiEscapes;
    }
    
    @Override
    public SerializableString getEscapeSequence(int i) {
        return null;
    }
}

def mapper = new ObjectMapper()
mapper.configure(Feature.ESCAPE_NON_ASCII, true)
mapper.getJsonFactory().setCharacterEscapes(new CustomCharacterEscapes())

def map = ["名前":"長谷川一清","code":"<script>alert(1)</script>"]

def json = mapper.writeValueAsString(map)
assert json == '{"\\u540D\\u524D":"\\u9577\\u8C37\\u5DDD\\u4E00\\u6E05","code":"\\u003Cscript\\u003Ealert(1)\\u003C\\u002Fscript\\u003E"}'
```
ACCEPTしたSQLプロファイルの一覧を表示する


Oracle Database 11g R2 (11.2.0.3) Enterprise Editionで動作確認済み。

```SQL
SET LONG 1000
SET LONGCHUNKSIZE 1000
SET LINESIZE 255
SET TRIMS ON
ALTER SESSION SET nls_timestamp_format = 'YYYY/MM/DD HH24:MI';
COL name FORMAT a30
COL category FORMAT a10
COL sql_text FORMAT a80
COL created FORMAT a20
COL last_modified FORMAT a20
COL force_matching FORMAT a5 HEADING 'FORCE|MATCH'
SELECT name, category, created, last_modified, force_matching, sql_text
  FROM dba_sql_profiles
 ORDER BY created DESC;
```
【初心者】ExecJS::RuntimeErrorでつまづいたら

Railsの環境はRailsInstallerで導入しました。
scaffoldで最初のステップ☆踏もうとしたのに突如ExecJS::RuntimeErrorとかいう謎のエラーが出て、解決に時間がかかったのでこちらに記述します。

まず、わけもわからずググったところ、therubyracerをGemfileに記述すればいいんだぜ！
といわれたので、Gemfileに

gem 'therubyracer'

と記述したところ、まったく解決せず。
わからなかったので、Execjsとはなんぞやと思いそちらをなんとなく検索。
するとこれはgemだったらしく、

gem install execjs

と記述してインストール。その後、Gemfileに

gem 'execjs'

と記述し、

bundle install

しなおす。そしたら表示できました。
ググっても解決しない問題はあるのですね。こわかったー＞＜；
Qiitaの使い方

すみません、ヘルプ等を見てもよくわからなかったので…
Qiitaを知って登録したばかりです。
Qiitaってパッと見 ノウハウを共有するようなサイトかと思ったのですが、
質問とかもして良い、のでしょうか…？

普通に「ノウハウ・Tipsを投稿する」から質問を投稿するのでしょうか。
＃ そうすると質問でノウハウが埋もれちゃうのじゃないかと気になったのですが…
＃ 別にそれで良いんでしょうか。質問もノウハウも混在している感じで良いの？

何か質問の仕方（付けるべきタグや付けるべきでないタグ、その他決まり？）とかあるのでしょうか。

あ、あと投稿した内容は消せない、んですよね。

よろしくお願いします。
Fluentdでほんとにパースされてるのかを全力で確認したいんです。

``` Ruby:parser.rb
require 'fluent/log'
require 'fluent/config'
require 'fluent/parser'
require 'fluent/engine'

require 'time'

log = ''
format = //
time_format = ''

parser = Fluent::TextParser::RegexpParser.new(format, :time_format => time_format)

puts parser.call(log)
```

logにnginxやapacheのログを1行はる
formatにfluentdのconfファイルのformatをそのままはる
time_formatは良しなに。

テンションあがれば、もうちょっと詳しく書く。
Phingのインストール

追記: 2016-12-19

この記事では、インストールにpearを使っていますが、
現代的なプロジェクトではcomposerを使うことをお勧めします


毎度、新規のサーバーに入れる時、面倒なことになるのでメモっておく。

```
sudo pear channel-discover pear.pdepend.org
sudo pear channel-discover pear.phpmd.org
sudo pear channel-discover pear.docblox-project.org
sudo pear channel-discover bartlett.laurent-laville.org
sudo pear channel-discover pear.phing.info 
sudo pear upgrade pear
sudo pear install --alldeps phing/phing
```

ついでにbuild.xmlのテンプレ

```
<?xml version="1.0"?>
<project name="social-in" basedir="." default="test">
  <!-- 本番用にデプロイ用の設定 -->
  <target name="deploy">
    <phingcall target="clean"></phingcall>
    <phingcall target="test"></phingcall>
    <copy file="path/to/production.yml" tofile="path/to/yaml-name.yml" overwrite="true" />

  </target>

  <!-- テスト用のタスク -->
  <target name="test">
    <phpunit3 haltonfailure="true" printsummary="true">
      <batchtest>
        <fileset dir="path/to/test">
          <include name="*Test.php"/>
        </fileset>
      </batchtest>
    </phpunit3>
  </target>

  <!-- クリア用のタスク -->
  <target name="clean">
      <delete dir="reports" includeemptydirs="true" />
      <delete dir="clover" includeemptydirs="true" />
      <delete dir="apidocs" includeemptydirs="true" />
  </target>

  <!-- カバレッジリポートを出したい時のタスク --> 
  <target name="coverage" depends="clean">
    <mkdir dir="reports/tests" />
    <mkdir dir="clover" />
    <coverage-setup database="reports/coverage.db">
      <fileset dir="path/to/classes">
        <include name="**/*.php"/>
      </fileset>
    </coverage-setup>
    <phpunit haltonfailure="true" printsummary="true" codecoverage="true">
      <formatter todir="reports" type="clover"/>
      <formatter todir="reports" type="xml"/>
      <batchtest>
        <fileset dir="path/to/test">
          <include name="*Test.php"/>
        </fileset>
      </batchtest>
    </phpunit>
    <coverage-report outfile="reports/coverage.xml">
      <report todir="clover" />
    </coverage-report>
  </target>

  <!-- ドキュメントを出力したい時のタスク --> 
  <target name="phpdoc">
    <phpdoc title="SAT Library Documentation"
            destdir="apidocs"
            sourcecode="false"
            output="HTML:Smarty:PHP">
        <fileset dir="path/to/classes">
          <include name="**/*.php" />
          <exclude name="**/pattern-exclude*" />
        </fileset>
      <projdocfileset dir=".">
        <include name="README" />
        <include name="INSTALL" />
        <include name="CHANGELOG" />
      </projdocfileset>
    </phpdoc>
  </target>
</project>
```
RichTextBoxにバインド

転載元：http://stackoverflow.com/questions/6475775/how-do-i-bind-string-in-xaml-format-to-xaml-property-of-richtextbox-in-silverl

ほぼ元のままですがちょっとだけ変えました。XamlSource → InlinesXaml
自分で使うのに Section とか Paragraph を渡す必要がなかったので Inlines だけ渡すようにカスタマイズ。

```csharp
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace test
{
    public static class RichTextBoxBinder
    {
        private const string _XAML_BEGIN = @"<Section xml:space=""preserve"" HasTrailingParagraphBreakOnPaste=""False"" xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""><Paragraph>";
        private const string _XAML_END = @"</Paragraph></Section>";

        #region InlinesXaml ----------------------------------------------------

        #region RichTextBox attached properties

        public static readonly DependencyProperty InlinesXamlProperty =
          DependencyProperty.RegisterAttached(
            "InlinesXaml",
            typeof(string),
            typeof(RichTextBox),
            new PropertyMetadata(OnInlinesXamlPropertyChanged));

        private static void OnInlinesXamlPropertyChanged(
          DependencyObject d,
          DependencyPropertyChangedEventArgs e)
        {
            var rtb = d as RichTextBox;
            if (rtb == null) throw new ArgumentException(
              "Expected a dependency object of type RichTextBox.", "d");

            string xaml = null;
            if (e.NewValue != null)
            {
                xaml = e.NewValue as string;
                if (xaml == null) throw new ArgumentException("Expected a value of type string.", "e.NewValue");
            }

            // Set the xaml and reset selection 
            //rtb.Xaml = xaml ?? string.Empty;
            rtb.Xaml = (xaml == null) ? string.Empty : _XAML_BEGIN + xaml + _XAML_END;
            rtb.Selection.Select(rtb.ContentStart, rtb.ContentStart);
        }

        #endregion

        public static void SetInlinesXaml(this RichTextBox rtb, string xaml)
        {
            rtb.SetValue(InlinesXamlProperty, xaml);
        }

        public static string GetInlinesXaml(this RichTextBox rtb)
        {
            return (string)rtb.GetValue(InlinesXamlProperty);
        }

        #endregion InlinesXaml -------------------------------------------------
    } 

}
```

Xaml側

```xml
<RichTextBox local:RichTextBoxBinder.InlinesXaml="{Binding HogeXaml}" />
```

バインドされる側

```csharp
public string HogeXaml
{
    get {
        var xaml = @"あいうえお<LineBreak />"
                 + @"<Span Foreground=""Red"">あいうえお</Span><LineBreak />"
                 + @"さしすせそ";
        return xaml;
    }
}

```
公開鍵の形式を変更する

SSH でアクセスさせるために公開鍵を送ってもらったら見たことのない形式だった。

```id_rsa.pub
---- BEGIN SSH2 PUBLIC KEY ----
Comment: 
文字列
---- END SSH2 PUBLIC KEY ----
```

調べてみたら、SECSH 形式らしい。
OpenSSH の形式に変換しなきゃいけないのかな、と ssh-keygen の man をあたると、-i オプションで公開鍵の形式を変換できそうだった。
-m オプションで読み込むファイルの形式を指定できるが、デフォルトが RFC 4716/SSH2 public or private key。
RFC 4716 を見てみたら、この形式のことみたい。

```
$ ssh-keygen -i -f id_rsa.pub >> ~/.ssh/authorized_keys
```

ログインできた。
Emacsにzshの環境変数PATHを取り込む

> ## 追記:
> この記事の内容は時代遅れなので、[purcell/exec-path-from-shell](https://github.com/purcell/exec-path-from-shell)を利用しよう。
> [EmacsでPATHの設定が引き継がれない問題をエレガントに解決する - Qiita](http://qiita.com/catatsuy/items/3dda714f4c60c435bb25)

Ruby や Python を `/usr/bin` や `/usr/local/bin` などのシステムディレクトリではなく、バージョンごとにホームディレクトリ内にインストールして環境変数 `PATH` を通して使用する、なんてひとも少なくはないですね。筆者も rbenv や Pythonz 、 nodebrew に頼りきりです。

ところで Ubuntu で GTK 版の Emacs をデスクトップのランチャーから起動すると、ユーザのログインシェルを `/bin/zsh` などに設定してても、 環境変数をちゃんと引き継いでくれません。これは困った！ 特に `/usr/bin/ruby` には何もありませんし。

Emacs から `term` などで、 `zsh` を起動する場合はその中で `.zshenv` を読んでくれるのでまた困らないんですけど、 Emacs のシェルと言ったら Eshell なので、こっちの `PATH` は確実に設定しておきたいところです。

あ、Zsh の `PATH` はちゃんと `.zshenv` とかに設定しといてください。

```common-lisp:set_path.el
(let* ((zshpath (shell-command-to-string
		 "/usr/bin/env zsh -c 'printenv PATH'"))
       (pathlst (split-string zshpath ":")))
  (setq exec-path pathlst)
  (setq eshell-path-env zshpath)
  (setenv "PATH" zshpath))
```
これを評価すると

1. `zsh` を起動して、出力される `$PATH` を文字列として受け取る
2. **1** で取得した `PATH` 環境変数を Emacs の環境にも設定する
3. `PATH` は `:` 区切り形式の文字列なのでリストに変換する
4. **2** のリストを Emacs の `exec-path` 、 `eshell-path-env` に設定する

って流れで設定していきます。 

練習がてらにもうちょっと汎用性持たせて Windows のこともちょびっと考慮しつつ Emacs Lisp としてまとめてみるのも良いですかね。
WordPressでTabbedWidgetが動作しないときの対処

WordPress3.xでTabbedWidgetが動作しなくなったら、tabbed-widgets/tabbed-widgets.phpのaddHeader()に少し記述を追加する。

```
function addHeader() {
	wp_enqueue_script('jquery-ui-tabs',  $this->plugin_path . 'js/jquery-ui-custom.min.js', array('jquery'), false, false);
	wp_enqueue_script('jquery-ui-accordion',  $this->plugin_path . 'js/jquery-ui-custom.min.js', array('jquery'), false, false);
	wp_enqueue_script('jquery-ui-cookie',  $this->plugin_path . 'js/jquery-cookie.min.js', array('jquery-ui-accordion'), false, false);

	// Add default widgets styles
	wp_enqueue_style('tabbed-widgets', $this->plugin_path . 'css/tabbed-widgets.css');

	wp_enqueue_script('jquery-ui-accordion',  $this->plugin_path . 'js/jquery-ui-custom.min.js', array('jquery'), false, true);
	wp_enqueue_script('jquery-ui-cookie',  $this->plugin_path . 'js/jquery-cookie.min.js', array('jquery-ui-accordion'), false, true);
		
	// Add default widgets styles
	wp_enqueue_style('tabbed-widgets', $this->plugin_path . 'css/tabbed-widgets.css');
	
	if (get_current_theme() == 'Twenty Ten') {
		wp_enqueue_style('tabbed-widgets-2010', $this->plugin_path . 'css/twenty-ten.css');
	}
}
```

ページキャッシュを無効にしたらタブが正常にでるはず。
XCodeを4.5にバージョンアップした後に、gem(native extensions)のインストールで「You have to install development tools first.」と言われてしまった時の対処法


参考：http://stackoverflow.com/questions/10344821/gem-install-pg-doesnt-work-on-osx-lion

以下を実行して下さい。

```
sudo ln -s /usr/bin/llvm-gcc-4.2 /usr/bin/gcc-4.2
```

もしくは、

```
sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2
```
Nokogiriにてxml生成時にCDATAをつける

下記ドキュメント見てもいまいちわかりにくかったのでメモ
http://nokogiri.org/


```ruby:sample.rb
require 'rubygems'
require 'nokogiri'

builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
      xml.article(:id => "1", :data => "2012-09-20T10:20:29"){
           xml.attribute(){
                xml.cdata "hoge"
            }
       }
end

puts builder.to_xml
```

```xml
<?xml version="1.0" encoding="UTF-8"?>
<article data="2012-09-20T10:20:29" id="1">
  <attribute><![CDATA[hoge]]></attribute>
</article>
```
'input type=file'から'canvas'への転写

```html
<canvas id="canvas" ></canvas>
<input id="uploadFile" name="image" type="file" />
<script>
// forked from _shimizu's "input type=file → canvas" http://jsdo.it/_shimizu/5KO3
$("#uploadFile").change(function() {

	var file = this.files[0];
	if (!file.type.match(/^image\/(png|jpeg|gif)$/)) return;

	var image = new Image();
	var reader = new FileReader();

	reader.onload = function(evt) {
		image.onload = function() {
            
 
            $("#canvas").attr("width",image.width);   
			$("#canvas").attr("height",image.height);
 
            
            var canvas = $("#canvas");
			var ctx = canvas[0].getContext("2d");		
			ctx.drawImage(image, 0, 0); //canvasに画像を転写
			
		}


		image.src = evt.target.result;
	}
	reader.readAsDataURL(file);
});
</script>

```

jQueryのwidth(height)メソッドでcanvsのサイズを変更するとうまくいかない。
http://shimz.me/blog/?p=1483
Cold を Hot にできる。そう、Publish ならね。

Rx いいよ Rx とか言っておきながら、いままで Cold と Hot の違いについて、ちゃんとわかってませんでしたスイマセン。

そのため、

* [reactive4java で端末の方位を取得しつづける - Qiita](http://qiita.com/items/07762776102dbc84b1c7)
* [reactive4java で位置を取得し続ける - Qiita](http://qiita.com/items/e15ba88d51938531b1a3)

で作ったサンプルプログラム、盛大にバグってましたorz

## Cold な Observable と Hot な Observable
音楽プレーヤ iPod に例えると自分なりにしっくり来ました。
Observable が iPod で、Observer は聴く人。
なんとこの iPod はイヤホンジャックがたくさんあります。
そしてさらにこの iPod はイヤホンを接続するだけで再生が始まり、抜くと停止します。

Cold な iPod では、聴く人がイヤホンを接続すると、音楽が最初から再生されます。
次の人がイヤホンを接続すると、また音楽が最初から再生されます。(最初の人は、再生されなおすわけじゃないよ。)

Hot な iPod では、最初に聴く人がイヤホンを接続すると、音楽が再生され始めます。
次の人が、イヤホンを接続すると、その人は途中から聴くことになります。一つのストリーミング放送をみんなで聴くみたいな。
最後の人がイヤホンを外すと、再生が止まります(この辺はストリーミングと微妙に感覚が異なる、ストリーミングって、聴いてる人が居ようが居まいが流され続けるってイメージだから)。

## 何が問題か

以上を踏まえた上で、[reactive4java で位置を取得し続ける - Qiita](http://qiita.com/items/e15ba88d51938531b1a3) で作ったプログラムのどこが問題だったかというと。

位置を聞くために接続をすると、その都度、```locMan.requestLocationUpdates``` が呼ばれているという事です。上記の音楽プレーヤで例えると、```player.start()``` です。

位置情報の取得は、ホントに無限ストリーミングなので、一見問題無さげに見えますが、２つリスナを登録するのは頂けません。(中には複数のリスナを登録できない API もあるでしょう、ありました。それで気づいたんです。)

これは最初の register でのみ ```locMan.requestLocationUpdates``` が実行され、2番目以降の register では、observer.next だけが呼ばれるようにしないといけません。
そのためには、register した複数の observer を保持・管理する必要があります。うげー。

## そこで Publish ですよ。
.publish() を Observable のおしりにくっつけます。はい、これだけ。本当に。簡単すぎて「いいの？」って思っちゃうくらい。

```java:getCurrectLocationAsHotObservable.java
/**
 * 位置を取得し続ける(Hot)
 */
public static ObservableBuilder<Location> getCurrentLocationAsHotObservable(          
	final Context context, final String provider) {
    return ObservableBuilder.from(
		getCurrentlocationAsObservable(context, provider)
		).publish(); // Cold → Hot へ変換！
}
```

これだけで、複数の人が位置を聴きに来ても、```locMan.requestLocationUpdates``` が呼ばれるのは１回だけである、Hot な Observable になります。Rx すげえよ Rx！

reactive4java のソースを読んだところ、前述の「複数の observer を保持・管理して、最初だけリスナ登録して、誰もいなくなったらリスナ解除する」みたいな面倒なことを publish の中(正確には observeOn)で行なってくれているようです。

ますます Reactive Extensions が好きになりましたよ。

## .NET の Reactive Extensions と reactive4java の違い
.NET の Reactive Extenstions では、Publish は、```IConnectableObservable<T>``` を返すそうです。そして ```Subscribe``` しただけでは再生は開始されず、```Connect``` した時に再生されるのだ、とも。

一方、[reactive4java](http://reactive4java.googlecode.com/svn/trunk/Reactive4Java/docs/javadoc/index.html) では、```publish``` は、普通の ```Observable<T>``` を返します。Observable には register(.NET の Subscribe に相当)しかないので、これを呼び出した時に再生が開始されます。

特に reactive4java の挙動で困っていませんが、今後のバージョンアップで .NET 側に合わせられるかも知れません。
ConnecableObservable という interface は既に用意されていますが、使われていないようです。

## 参考
* [Rx入門 (14) – Cold to Hot変換 : xin9le note](http://xin9le.net/archives/104)
* [Reactive Extensions再入門 その３６「ColdからHotへ！Publishメソッドと参照カウンタ？RefCountメソッド」 - かずきのBlog@Hatena](http://d.hatena.ne.jp/okazuki/20120212/1329059831)
* [neue cc - Reactive Extensions for .NET (Rx) メソッド探訪第7回:IEnumerable vs IObservable](http://neue.cc/2010/06/24_263.html)

Rx の神々のみなさんが懇切丁寧に解説してくださってるのに、失敗しないと気づかない自分のバカバカ！
第四回オフラインリアルタイムどう書く参考問題の回答 Javaで

オフラインでリアルタイムに「どう書く」をやるイベント。
http://atnd.org/events/32191
の参考問題
http://qiita.com/items/9c514267214d3917edf2
の実装例。
Javaで。


```java:Fukashigi.java
import java.util.HashSet;
import java.util.Set;

public class Fukashigi {
  static final int SIZE=5;

  Set<String> deadEnds;

  public Fukashigi(String deadEndsText) {
    deadEnds = new HashSet<String>();
    for (String deadEnd : deadEndsText.split("\\s+")) {
      deadEnds.add(deadEnd);
      deadEnds.add(new StringBuilder(deadEnd).reverse().toString());
    }
  }

  int count() {
    String attended = "a";
    return countPath(attended, 1) + countPath(attended, SIZE);
  }

  private int countPath(String attended, int dir) {
    Character next = calcMoved(last(attended), dir);
    if (next == null || !canMove(attended, next)) {
      return 0;
    }
    if (next == 'a'+SIZE*SIZE-1) {
      return 1;
    }
    String newAttended = attended + next;
    int sum = 0;
    for (int nextDir : new int[]{-1, 1, -SIZE, SIZE}) {
      sum += countPath(newAttended, nextDir);
    }
    return sum;
  }

  private boolean canMove(String attended, Character next) {
    return attended.indexOf(next) < 0
        && !deadEnds.contains("" + last(attended) + next);
  }

  private static Character calcMoved(char last, int dir) {
    int ix0 = last - 'a';
    int x0 = ix0 % SIZE;
    int y0 = ix0 / SIZE;
    int ix1 = ix0 + dir;
    int x1 = ix1 % SIZE;
    int y1 = ix1 / SIZE;
    if (0 <= x1 && x1 < SIZE && 0 <= y1 && y1 < SIZE && (x1 == x0 || y1 == y0)) {
      return (char) ('a' + ix1);
    } else {
      return null;
    }
  }

  private static char last(String s) {
    return s.charAt(s.length() - 1);
  }
}
```

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

public class RunFukashigi {
  static void test(String deadEnds, int expected) {
    int actual = new Fukashigi(deadEnds).count();
    assertEquals(expected, actual);
    System.out.printf("\"%s\" -> %d\n", deadEnds, actual);
  }

  public static void main(String[] args) {
    test("", 8512); //そのまま。これが最大値。
    // 略
    test("fg gl lm mr rs", 171);
  }
}
```

順当な深さ優先探索というつもり。
Java らしく書こうという努力はしているものの、仕事で使ったことがあまりないのでJavaらしくなっているかどうか、甚だ疑問。
datetimeを今日の日付なら時間と分だけにtrimする

```php

<?php

/**
 * 今日の日時なら時間と分だけに刈る
 *
 * 2012-01-01 19:14:21 -> 19:14
 *
 * @param array &$rows
 */
function trimDatetime(&$rows) {
    foreach ($rows as &$row) {
        if (substr($row['created_at'], 0, 10) === date('Y-m-d')) {
            $row['created_at'] = substr($row['created_at'], 11, 5);
        }
    }
}

$rows = array(
    array(
        'id' => 1,
        'created_at' => date('Y-m-d 19:14:21')
    ),
    array(
        'id' => 1,
        'created_at' => '2012-01-01 19:14:21'
    ),
);

echo '[before]' . PHP_EOL;
echo $rows[0]['created_at'] . PHP_EOL;
echo $rows[1]['created_at'] . PHP_EOL;

trimDateTime($rows);

echo '[after]' . PHP_EOL;
echo $rows[0]['created_at'] . PHP_EOL;
echo $rows[1]['created_at'] . PHP_EOL;
```

結果↓

[before]
2012-09-26 19:14:21
2012-01-01 19:14:21
[after]
19:14
2012-01-01 19:14:21
ARDrone SDK 2.0のiPhone用サンプルがMac上でビルド出来ないのをなんとかする方法

SDK内に含まれるControlEngineのビルドに失敗する。具体的にはビルド用のシェルスクリプトにより自動生成されるヘッダが壊れている。

対象ファイルとその内容を抜粋。

```ARDroneEngine/Classes/ARDroneGenerateTypes.h
(略)
../../ARDroneLib/Soft/Common/navdata_common.h:#define
NB_NAVDATA_DETECTION_RESULTS 4

typedef enum {
../../ARDroneLib/Soft/Common/led_animation.h:LED_ANIMATION(BLINK_GREEN_RED,{0,2,{{0x55,500},{0xAA,500}}})
../../ARDroneLib/Soft/Common/led_animation.h:LED_ANIMATION(BLINK_GREEN,{0,2,{{0x00,500},{0xAA,500}}})
../../ARDroneLib/Soft/Common/led_animation.h:LED_ANIMATION(BLINK_RED,{0,2,{{0x55,500},{0x00,500}}})
(略)
```

こんな感じで、grepした結果を加工し損なったような残念な状態になってる。こいつを生成してるのはControlEngine/iPhone/CopyLibraries.sh。案の定grepへのオプション指定をミスってるので-hオプションを付け、ファイルパス出力を抑制してやればok。

パッチは https://gist.github.com/3786383
端末をスリープにさせない設定の有効範囲は？


* [画面をスリープ状態にさせないためには - 逆引きAndroid入門](http://www.adakoda.com/android/000207.html)

について、これってどの期間で有効になるのか気になったので調べてみた。

「Activity.onCreate でスリープ抑制、onDestroy で解除」という実装をした時、そのアプリがバックグラウンドにまわった時はどうなるの？というところ。

結論は「ちゃんといい感じで動いてくれた」。
アプリ(というかその Activity)がフォアグラウンドの時は、スリープは期待通り抑制される。
アプリがバックグラウンドにまわった場合は、システムの設定値に応じて、スリープになる。
heroku db:push時に404エラーが起こった時の対処法


参考：http://stackoverflow.com/questions/12591322/404-error-on-heroku-dbpush

[Taps gem](https://github.com/ricardochimal/taps)から直接DATABASE_URLで参照しているEC2インスタンスのDBに向けてデータを転送する。

## Connection Settingの値からEC2インスタンスのURLを作成する

1）HerokuのPostgresダッシュボードから使用しているDBを選択する。
https://postgres.heroku.com/
  
2）Connection SettingsのHost、Databse、User、Port、Passwordから以下のようなURLを作成する。（以降このURLを[EC2_URL]と呼ぶ）

```text:[EC2_URL]
postgres://[User]:[Password]@[Host]:[Port]/[Database]
```

## Tapsでデータを転送する

1）Tapsサーバを立ち上げて、ローカルのDBの情報をURLで参照できるようにする。

```
taps server sqlite://db/development.sqlite3 user password
```

2）作成した[EC2_URL]に向けてデータを転送する

```
taps pull [EC2_URL] http://user:password@localhost:5000
```

力技ですが、これでデータを転送することができます。
任意のタイムゾーンで出力する方法


## 一般的な方法
Timeにはlocaltimeというローカルタイムで出力するためのメソッドがあるが、これはシステムのローカルタイムに依存してしまう。
なので任意のタイムゾーンを出力するにはENV['TZ']の環境変数を一時的に書き換えてlocaltimeを取れば良い

```ruby:
class Time 
  def timezone(timezone = 'UTC')
    old = ENV['TZ']
    utc = self.dup.utc
    ENV['TZ'] = timezone
    output = utc.localtime
    ENV['TZ'] = old
    output
  end
end

@time = Time.now
puts @time.timezone('Asia/Tokyo')      # => 2012-09-26 12:19:18 +0900
puts @time.timezone('America/Chicago') # => 2012-09-25 22:19:18 -0500 
```

## ActiveSupport::TimeWithZone#in_time_zoneを使った方法
```ruby:
Time.zone.now.in_time_zone('America/Chicago') # => 2012-09-25 22:19:18 -0500
```
Haskell で「素数列」をつくる。

Haskell で「素数列」のリストを返す関数を作ってみました。

ベンチマークテスト代わりに、「Project Euler」の問題 10 を解いてみました。


#追記

[こちら](http://qiita.com/bra_cat_ket/items/6a99a9b01682886607d0#_reference-12640f002c7fca58a795) で紹介していただいた際に、内部関数 f の第一引数 m が

```
m = 5
m = 5 * 5
m = 5 * 5 * 7
...
```

と変化していくことに気付きました。

この引数は素数を小さい順に１つずつ順番にかけていくべきなので、このままでは最初の５が余計です。
そこで

```
m = 1
m = 1 * 5
m = 1 * 5 * 7
...
```

となるように修正したものを挙げておきます。
性能的にはほとんど変わらないので、ただの自己満足ですが…（笑）
　
　

###《 修正後バージョン 》
```primes.hs
--
-- 素数列（修正版）
--
-- http://d.hatena.ne.jp/notogawa/20110114/1295006865 を参考に
-- gcd の使い方が秀逸
--
primes :: Integral a => [a]
primes = map fromIntegral $ [2, 3] ++ primes'
    where
      primes' = [5] ++ f 1 7 primes'
      f m s (p : ps) = [n | n <- ns, gcd m n == 1] ++ f (m * p) (p * p) ps
          where ns = [x + y | x <- [s, s + 6 .. p * p - 2], y <- [0, 4]]
```
　
　
　
　

###《 修正前バージョン 》

```p010.hs
-- 素数列
-- http://d.hatena.ne.jp/notogawa/20110114/1295006865 を参考に
-- gcd の使い方が秀逸
primes :: Integral a => [a]
primes = map fromIntegral primes'
    where
      primes' = [2, 3, 5] ++ f 5 7 (drop 2 primes')
      f m s (p : ps) = [n | n <- ns, gcd m n == 1] ++ f (m * p) (p * p) ps
          where ns = [x + y | x <- [s, s + 6 .. p * p - 2], y <- [0, 4]]

main :: IO ()
main = print $ sum $ takeWhile (< 2000000) primes


-- Intel Core i5 2.40GHz
--
-- >p010 +RTS -sstderr
-- p010 +RTS -sstderr
-- p010 +RTS -sstderr 
-- 142913828922
--       57,695,712 bytes allocated in the heap
--        6,237,676 bytes copied during GC
--        2,198,460 bytes maximum residency (3 sample(s))
--          231,308 bytes maximum slop
--                6 MB total memory in use (0 MB lost due to fragmentation)

--   Generation 0:   108 collections,     0 parallel,  0.02s,  0.01s elapsed
--   Generation 1:     3 collections,     0 parallel,  0.00s,  0.01s elapsed

--   INIT  time    0.00s  (  0.00s elapsed)
--   MUT   time    0.23s  (  0.23s elapsed)
--   GC    time    0.02s  (  0.01s elapsed)
--   EXIT  time    0.00s  (  0.00s elapsed)
--   Total time    0.25s  (  0.24s elapsed)

--   %GC time       6.2%  (5.0% elapsed)

--   Alloc rate    246,561,818 bytes per MUT second

--   Productivity  93.8% of total user, 96.0% of total elapsed
```
Rails3でfaviconを設定する

### faviconパス(サンプル)

app/assets/images/rails.png

### headタグで読み込み

```:app/views/layouts/application.html.erb
<head>
  <title>Wonder</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>

  <%# 追加 %>
  <%= favicon_link_tag 'rails.png' %>

  <%= csrf_meta_tags %>
</head>
```