OmniAICreator/Qiita-1.07M huggingface dataset:
複数キーでのdistinctをaggregationで実現する


mongodbでキーのdistinctを実現しようとするとき、大抵mapReduceを用いていたのですが、最近流行り？のaggregation frameworkを用いて実現できることに最近気が付きました。

## 前提
以下のようなデータをinsert済みと仮定します。

``` javascript:data.js
var data = [
  {first_name: 'aa', family_name: 'xx', old:12},
  {first_name: 'bb', family_name: 'xx', old:13},
  {first_name: 'cc', family_name: 'xx', old:14},
  {first_name: 'aa', family_name: 'yy', old:15},
  {first_name: 'bb', family_name: 'yy', old:16},
  {first_name: 'cc', family_name: 'yy', old:17},
  {first_name: 'aa', family_name: 'xx', old:18},
  {first_name: 'bb', family_name: 'yy', old:19}
];

db.person.insert(data);
```


## 方法
aggregationの$groupにおいて、_idの値に元のコレクションのdistinctしたいキーを`{hg: '$hoge', fg: '$fuga'}`で指定して上げるだけです。

以下、例。

``` javascript:multikey_distinct.js
var result = db.person.aggregate(
  {
   $group:{
		    _id:{
			   	  fi: '$first_name',
				  fa: '$family_name'
                }
           }
  }
);

printjson(result.result);
/* 出力
[
	{
		"_id" : {
			"fi" : "cc",
			"fa" : "yy"
		}
	},
	{
		"_id" : {
			"fi" : "bb",
			"fa" : "yy"
		}
	},
	{
		"_id" : {
			"fi" : "aa",
			"fa" : "yy"
		}
	},
	{
		"_id" : {
			"fi" : "cc",
			"fa" : "xx"
		}
	},
	{
		"_id" : {
			"fi" : "bb",
			"fa" : "xx"
		}
	},
	{
		"_id" : {
			"fi" : "aa",
			"fa" : "xx"
		}
	}
]


*/
```
PHPで短いハッシュ

[base64_encode](http://php.net/manual/ja/function.base64-encode.php)で圧縮しURLセーフにしています。

```php:short_hash.php
<?php
$shortHash = function ($data, $algo = 'CRC32') {
    return strtr(rtrim(base64_encode(pack('H*', hash($algo, $data))), '='), '+/', '-_');
};
 
$a = 'hello';

echo CRC32($a); // 907060870
echo $shortHash($a); // kHBghwA
echo md5($a) . PHP_EOL; // 5d41402abc4b2a76b9719d911017c592
echo $shortHash($a, 'md5'); // XUFAKrxLKna5cZ2REBfFkg
echo hash('sha256', $a); // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
echo $shortHash($a, 'sha256'); // LPJNul-wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ


```
git-remote-ext 機構で ~/.ssh/config を編集しないで ssh コマンドへのオプションを追加する方法です。

例えば、カレントディレクトリにある `admin` という名前の鍵を指定したい場合。

    ssh -i $(pwd)/admin 〜〜〜

上記のように `git` が裏で `ssh` を利用する時に、こんなコマンドになっていてほしいよという時には、以下のように ssh コマンドへのオプションを指定することができます。

    % git clone "ext::ssh -i $(pwd)/admin git@example.com:gitolite-admin.git %S 'gitolite-admin.git'" gitolite-admin

ここで想定したのは、あるレポジトリ `git@example.com:gitolite-admin.git` へはブートストラップするっぽく、まず専用の鍵でクローンして、その上で自分の鍵を追加、そしてプッシュする必要がある、みたいなのがあったので、それ用のメモです。

こんな感じで、そのためだけに `~/.ssh/config` を編集するのは overkill な感じがするような時に、 `git-remote-ext` 機構を利用して、sshへのオプションを指定することができます。

`clone` への `<repository>` 指定が謎めいていますけれども、これで動いた(\^\^;;

スマン続きは [git-remote-ext(1)](http://git.kernel.org/?p=git/git.git;a=blob;f=Documentation/git-remote-ext.txt;hb=v1.8.1.3) へ当って下さい(ォィ
mrubyとISO Ruby (CRuby)の非互換部分(数値関連編)

mruby の仕様はまだ未確定であり，仕様変更に伴い，下記の挙動も変更となる可能性が十分にあることに留意．

## 1 / 2 の結果
CRuby は 0．mruby は 0.5．
一般に,FixNum / FixNum の結果は，Float．

## 1 / 0 の結果
CRuby では ZeroDivisionError の発生． mruby では inf が返り raise は起きない．
ちなみに -1 / 0 の mruby での結果は -inf．

## 大きな数値の演算結果
mruby には BigNum が無いので，CRuby との非互換が生じる．

### シフト演算子の挙動

```
p (1 << 32) - 1
```

CRuby では4294967295．mruby では RangeError が raise．ただし，mruby での RangeError の発生は，内部表現 mrb_int のビットサイズに依存する．(mrb_int のビットサイズが 33 ビット以上なら，上記演算で CRuby と同一の結果が得られる可能性もある)

### 加算乗算べき乗算などの挙動

```
p 2 ** 64 - 1
```
CRuby では 18446744073709551615．mruby では 1.844674407371e+19 など動作環境依存．
Phabricator+nginxをUbuntuにインストールしてみる


- install_ubuntu.sh
	- apt-get installの行からphpとapache2を削除
	- a2enmodの行を削除
	- Install dependenciesの行からapacheを削除 ;)
- ガイドに乗っているnginxの設定ファイルを/etc/nginx/sites-available/phabricatorに設置
	- 変更：`fastcgi_pass unix:/var/run/php5-fpm.sock`
    - 追加：`fastcgi_param PHABRICATOR_ENV local/myconfig`
	- `sudo ln -s /etc/nginx/sites-available/phabricator  /etc/nginx/sites-enabled/phabricator`
- 設定ファイルを新規作成

	```php:conf/local/myconfig.conf.php
	<?php

	return array(

	    'phabricator.base-uri' => 'http://' . $_SERVER['HTTP_HOST'], // not good

	    // mysql
	    'mysql.host' => 'localhost',
	    'mysql.user' => 'root',
	    'mysql.pass' => 'your_password',

	    // email
	    'metamta.default-address' => 'noreply@localhost',
	    'metamta.domain'          => 'localhost',
	    'metamta.mail-adapter'    => 'PhabricatorMailImplementationTestAdapter', // do not send any mail

	    // storage
	    'storage.local-disk.path' => '/path/to/writable/dir',

    	// PATH
    	'environment.append-paths' => ['/usr/local/bin', '/usr/bin'],

	) + phabricator_read_config_file('production'); // 	default
	?>
	```

- ドメインがlocalhostの場合
    - とりあえずsrc/aphront/AphrontRequest.phpを下記のように変更すれば、ログインできる

			setcookie(
			  $name,
			  $value,
			  $expire,
			  $path = '/') /*,     
			  $base_domain,
			  $is_secure,
			  $http_only = true) */;

ちなみに癖が強そうだったので、インストール後触らないままになってしまいました・・・；
gitコマンドで端末(tty)以外へ出力する場合にも色をつける方法

[gitのリモートリポジトリの更新を確認する #git - Qiita](http://qiita.com/items/a30387bdd6a0afc1185c) を作ってる時に知ったTips

下記のように、gitコマンドの結果を端末へ出力する場合は、その結果に色を付けることができるのはみなさんご承知のことと思います。
(※ git config color.xxxx の値に依存します)

```
$ git status -s
 M hoge.txt    # <- カラー表示されます
```

しかし、パイプ使用時や、結果を変数へ保存する場合にはカラーになりません。

```
$ git status -s | cat
 M hoge.txt    # <- カラー表示されない
```

gitに限らず、カラー出力が可能なコマンドはだいたいこういう仕様になっているかと思います。
結果を加工する場合にはこの仕様はありがたいのですが、ときにはカラーコードを含んだ結果が欲しいこともあります。

そういう場合は以下のように実行することでカラーの結果が得られます。

```
$ GIT_PAGER_IN_USE=true git status | cat

$ output=$(GIT_PAGER_IN_USE=true git status)
```

また、一時的にコンフィグの値を変えてコマンドを実行するという方法もあります。

```
$ git config color.status
auto

$ git -c color.status=always status -s
 M hoge.txt    # <- カラー表示されます

$ git config color.status
auto
```

グローバルコンフィグの値は変わっていません。

このコンフィグの一時変更はカラー表示に限らず、他のケースにも応用出来そうなので覚えておくと良いのではないでしょうか。
gitのリモートリポジトリの更新を確認する

gitのリモートリポジトリが更新されているかどうかを確認する方法はいくつかあります。

##方法1: git fetch 後にdiffをとる

```
$ git fetch origin
$ git diff origin/master
```

##方法2: git ls-remote コマンドを使用する

``git ls-remote``を使用することでリモートリポジトリのコミットIDが取得できます。

リモートリポジトリの最新コミットID(HEAD)とローカルの最新コミットID(HEAD)を比較し、その2つが異なっていれば差分があると判断できます。
さらに、リモートのコミットIDが過去に存在しないものであれば、ローカルのリポジトリが古い(マージしていないコミットがリモートに存在する)ことになります。

```
$ git ls-remote origin HEAD
78ddd44eb3b76017a55014f27d9f846054dfa52b        HEAD
$ git log -1 HEAD  # or master
commit 8741c1a1fd81e0e3620e7054f3731ad2338f25fa
$ git log -1 origin/HEAD  # or origin/master
commit 8741c1a1fd81e0e3620e7054f3731ad2338f25fa
```

##方法3: git remote show コマンドを使用する

以下のように実行結果の最終行に (local out of date) と表示されていればローカルの方が古いことになります。(ブランチが複数ある場合は複数行表示されます)

ただし、リモートブランチと同名のブランチがローカルにも存在する場合のみ表示されます。
また、リモートブランチと異なる名前のブランチは upstream/tracking branch を設定していても表示されません。(残念…)

```
git remote show origin
* remote origin
  Fetch URL: git://github.com/Shougo/unite.vim.git
  Push  URL: git://github.com/Shougo/unite.vim.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)
```
----------

以上の3種類が私の知っている方法です。
(他にもあるようでしたら教えて頂けるとありがたいです)

方法1が最もメジャーな方法かと思いますが、fetchを行う必要があるという点でやや面倒ではあります。とはいえ細かいdiffを確認する場合には必須ですが。
方法2/方法3はfetchが不要で、ざっくりと更新状況を見たい場合に利用できます。
特に方法3が分かりやすいですね。


##方法4を提案

一応今回の本題…方法2,3の拡張版です。

チェックするリポジトリが1つ2つなら上記の方法でも良いかと思いますが、たくさんのリポジトリの更新状況を確認したい場合には少々面倒です。

そこで、今回は複数のリポジトリの更新状況をざっくり確認するコマンド``git-check``を作成しました。

まずは実行結果です。

![sample01](https://raw.github.com/yonchu/git-check/master/img/sample01.png)

こんな感じにざっくりと更新状況が確認できます。
submoduleが存在する場合はインデントされて表示されています。
(上記はneobundleで管理しているvimプラグインのリポジトリの更新状況を確認しています)

###導入方法

下記githubのリポジトリからcloneまたはダウンロードし、中にある``git-check``コマンドをPATHの通った所に置いて下さい。

[yonchu/git-check · GitHub](https://github.com/yonchu/git-check)

```
$ git clone https://github.com/yonchu/git-check.git
$ mv git-check/git-check ~/bin
```

gitを使用しない場合は[ここ](https://github.com/yonchu/git-check/archive/1.2.tar.gz)から直接ダウンロードして下さい。

###使用方法

```
Usage:
git-check [-s|-r|-w] [-f <Repositories list file>] [Directory ...]

Options:
  -s : git status を確認
  -r : リモートリポジトリの更新状況を確認
  -w N : インデント幅 (Default: 4)
  -f [File] : リポジトリのディレクトリパスを記述したファイルを指定
  ※-s/-r いずれも未指定の場合は両方表示します
```

ディレクトリは複数指定が可能で、ワイルドカードを使用することもできます。
関係のないファイルやディレクトリは無視しますのでワイルドカードでざっくりと指定すると良いでしょう。ディレクトリ未指定の場合はカレントディレクトリが対象になります。

``-r``指定でリモートリポジトリの更新状況を確認できますが、他にも``-s``を指定することで``git status --short``の結果を表示することもできます。

![sample02](https://raw.github.com/yonchu/git-check/master/img/sample02.png)

また、``-f``を指定することでリポジトリの場所をファイルで指定することもできます。

```
$ cat repos.txt
~/dotfiles
~/dotfiles.local
~/work/dev/myproject/*
~/work/dev/github/*
~/work/dev/gist/*
~/work/dev/github_tracking/*

$ git-check -f repos.txt
```

よくチェックするものをファイル内に記述しておくことでチェックが楽になります。

##蛇足
な、長い…方法1,2,3の説明が蛇足だった気がする…
XCode での実機デバッグ時に、アプリが立ち上がらない場合の対応


実機デバッグ時に、以下のようなメッセージが出てアプリがデバッグできない時がある

```
"Couldn't register com.yourcompany.yourapp with the bootstrap server. Error: unknown error code. This generally means that another instance of this process was already running or is hung in the debugger."
```

デバッグ中にXCodeが落ちた場合などに良く発生する。iPhone を再起動すれば治るのだが、いちいち再起動をするのが面倒。

http://www.mikeash.com/pyblog/solving-simulator-bootstrap-errors.html
に書かれているように、Terminal から以下のコマンドを叩けば、iPhone をわざわざ再起動しなくても良い。

```
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
```

元記事にあるように、unfuckbootstrap といったコマンド名で登録しておけば、便利です
第7回オフラインリアルタイムどう書く。Haskell による実装。改訂版

問題は http://nabetani.sakura.ne.jp/hena/ord7selectchair/
解答リンク集は http://qiita.com/items/4364285801d1c9f370a1


先日、[『第7回オフラインリアルタイムどう書く。Haskell による実装』](http://qiita.com/items/769ca52518e7cad51ec8)というタイトルで投稿したのですが、関数のまとめ方などで気になる部分があったので、改訂版を投稿します。

アルゴリズムは変更していません。



```off-line07_02.hs
import Data.List
import Data.Char

-- ex) solve "6:NABEbBZn"  =>  "-ZAB-E"
solve :: String -> String
solve str = init $ tail $ foldl f seat cs
  where
    (n, _ : cs) = break (== ':') str
    seat = replicate (read n + 2) '-'
    f seat c = if (isUpper c) then sit c seat else remove (toUpper c) seat

sit :: Char -> String -> String
sit c cs = as ++ (c : bs)
  where
    (as, _ : bs) = splitAt (search cs) cs
    search cs@(_ : cs')
      | isPrefixOf "--" cs = search' 0 ( 1, -1) cs
      | otherwise          = search' 1 (-1, -1) cs'
    -- search' c (i1, i2) cs
    --  c : index counter
    --  i1, i2 : 「条件 2」と「条件 3」に適合する index
    search' _ (i1, i2) "-" = if i1 < 0 then i2 else i1
    search' c (i1, i2) cs@(s : cs')
      | isPrefixOf "---" cs              = c + 1
      | (i1 < 0) && (isPrefixOf "--" cs) = search' (c + 1) (c , i2) cs'
      | (i2 < 0) && (s == '-')           = search' (c + 1) (i1, c ) cs'
      | otherwise                        = search' (c + 1) (i1, i2) cs'

remove :: Char -> String -> String
remove c cs = as ++ ('-' : bs)
  where (as, _ : bs) = break (== c) cs



-- Test
main :: IO ()
main = mapM_ disp testData
  where disp (n, s1, s2) = putStrLn $ show n ++ " : " ++ show (solve s1 == s2)

testData :: [(Int, String, String)]
testData = [(1,  "6:NABEbBZn",        "-ZAB-E"),
            (2,  "1:A",	              "A"),
            (3,  "1:Aa",              "-"),
            (4,  "2:AB",	      "AB"),
            (5,  "2:AaB",	      "B-"),
            (6,  "2:AZa",	      "-Z"),
            (7,  "2:AZz",	      "A-"),
            (8,  "3:ABC",	      "ACB"),
            (9,  "3:ABCa",	      "-CB"),
            (10, "4:ABCD",	      "ADBC"),
            (11, "4:ABCbBD",	      "ABDC"),
            (12, "4:ABCDabcA",	      "-D-A"),
            (13, "5:NEXUS",           "NUESX"),
            (14, "5:ZYQMyqY",	      "ZM-Y-"),
            (15, "5:ABCDbdXYc",       "AYX--"),
            (16, "6:FUTSAL",	      "FAULTS"),
            (17, "6:ABCDEbcBC",       "AECB-D"),
            (18, "7:FMTOWNS",         "FWMNTSO"),
            (19, "7:ABCDEFGabcdfXYZ", "YE-X-GZ"),
            (20, "10:ABCDEFGHIJ",     "AGBHCIDJEF")]
```
Zsh が提供する Git の補完関数を利用する w/ Homebrew


最近、Homebrew をアップデートしたら Git の補完関数がコマンドの説明を出力しなくなったり、そもそもオプション引数を補完してくれなくなった。

これは Homebrew が Git が提供する bash 互換の補完関数をインストールするようになったため。

Git が提供する bash 互換の補完関数のほうが新しいオプションなどへの追従が速いというメリットもあるが、説明などが補完時に見れないのはつらいので Zsh が提供するほうを使う。

```zsh:
brew install git --without-completions
```
RubyでSeleniumを使ってスクレイピング


JavaScriptバリバリなページはNokogiriなどのスクレイピングツールで扱うのが難しいですが、Seleniumでブラウザ自動操作すると大体のものはできるようになるので、使い方をまとめておきます。
Javaから使うのと比べて、Rubyバインディングだとずいぶんシンプルで良かったです。

## リファレンス

http://selenium.googlecode.com/svn/trunk/docs/api/rb/frames.html

【2015-11-12 追記】上記のリンクは更新停止しているようなのでこちらを見たほうが良さそうです
http://www.rubydoc.info/gems/selenium-webdriver/

## 使い方

gemをインストールする。

```bash
gem install selenium-webdriver
```

seleniumなんちゃらというgemがたくさんあるけどこれだけでよい。

コード内で `require 'selenium-webdriver'` すれば使えるようになる。


## 起動と終了

```ruby
driver = Selenium::WebDriver.for :firefox # ブラウザ起動

driver.quit # ブラウザ終了
```

:firefox のところは :ieとか:chromeとか:operaとか好きなのを


## ページ、フレーム移動

```ruby
driver.navigate.to 'http://example.com' # URLを開く
driver.switch_to.frame(1)               # 1つめの子フレームに移動
driver.switch_to.frame("frameid")       # フレームのnameを指定して移動
```

## 要素を指定

```ruby
element = driver.find_element(:name, 'calendar')        # nameで指定
element = driver.find_element(:id, 'calendar')          # idで指定
element = driver.find_element(:class, 'right_box')      # classで指定
element = element.find_element(:tag_name, 'table')      # 要素名で指定
element = element.find_element(:xpath, 'tr[2]/td[3]/a') # XPathで指定
element = driver.find_element(:class, 'body').find_element(:name, 'form').find_elements(:xpath, './/input')[2] # メソッドチェーン
```

DriverとElementがどちらもfind_element・find_elementsメソッドを持っている。


## 入力

```ruby
# テキストフィールドへ入力・削除
element = driver.find_element(:name, 'userId')
element.send_keys('username')
element.clear

# ドロップダウンリスト選択
select = Selenium::WebDriver::Support::Select.new(driver.find_element(:id, 'dropdown'))
select.select_by(:value, 'item1')       # valueの値で選択
select.select_by(:text, 'どちらでもない') # 表示テキストで選択
select.select_by(:index, 2)             # インデックス（0始まり）で選択

# ラジオボタン選択
driver.find_elements(:name, 'selectOne')[2].click

# リンクやボタンを押す
driver.find_element(:xpath, '//table[2]/tr[3]/td[1]/a').click

```


## 情報取得

```ruby
# 要素の内容テキスト
puts element.text

# Firefoxでダウンロードのリンクを踏んだとき保存確認ダイアログを出さずに指定のフォルダに保存
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.folderList'] = 2
profile['browser.download.useDownloadDir'] = true
profile['browser.download.dir'] = 'path/to/downloadFolder'
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv'
driver = Selenium::WebDriver.for :firefox, :profile => profile

# スクリーンショットを撮る
# !!private APIにつき動作保証なし!!
driver.save_screenshot('path/to/filename.png')
```



## おわりに

ここにもう少し詳しく書いてあります（英語）
http://code.google.com/p/selenium/wiki/RubyBindings
ACAccountを汎用的に取得するメソッド


iOS5からTwitterアカウントにアクセス出来るようになりましたが、複数アカウントがある場合、選択するためのUIが必要になってきます。
UIはアプリごとに差異があるため、毎回一から実装し直しだったりします。

今回はUI部分はカスタマイズ性を残しつつ、取得処理をカプセル化できるような処理を考えてみました。
メソッドは以下のようになります。（エラー処理は端折ってます）

```
typedef void (^STACAccountInnerCallback)(ACAccount *account);
typedef void (^STACAccountCallback)(NSArray *accounts, STACAccountInnerCallback innerCallback);

+ (void)requestACAccountWithAccountTypeIdentifier:(NSString *)accountTypeIdentifier options:(NSDictionary *)options callback:(STACAccountCallback)callback completion:(void (^)(ACAccount *, NSError *))completion
{
    //省略
    [accountStore requestAccessToAccountsWithType:accountType options:options completion:^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray *accounts = [accountStore accountsWithAccountType:accountType];
            //省略　一つの場合はそのままcompletionに渡す
            //複数アカウントの場合
            callback(accounts, ^(ACAccount *account) {
                completion(account, nil);
            });
        }
    }];
}

```



利用するときはこんな感じです。
[BlocksKit](https://github.com/zwaldowski/BlocksKit)推奨です。

```
//コールバックブロック内に任意の選択UIを実装する
STACAccountCallback callback = ^(NSArray *accounts, STACAccountInnerCallback innerCallback) {
    dispatch_async(dispatch_get_main_queue(), ^{
		//今回はUIActionSheetを利用
        UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select"];
        for (ACAccount *account in accounts) {
            [actionSheet addButtonWithTitle:account.username handler:^{
				//選択されたアカウントを引数にブロックを呼び出す
                innerCallback(account);
            }];
        }
        
        UIView *view = [[[UIApplication sharedApplication] delegate] window];
        [actionSheet showInView:view];
    });
};


[Hoge requestACAccountWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter
                                        options:nil
                                       callback:callback
                                     completion:^(ACAccount *account, NSError *error) {
                                          NSLog(@"%@", account);
                                      }];

```

このメソッドを利用することでアカウントが一つでも複数の場合でも、completionブロックでアカウントを取得した後の処理を実装することができます。
また、UI部分を外出し出来たので色々な環境で利用出来ると思います。
一応、Facebookのアカウント取得も同じメソッドで取得出来ます。
Node.js で __LINE__ を使うワンライナー

__LINE__ やっぱ欲しい時がある。
ということで、https://gist.github.com/mmalecki/3000364 を見つけたんだけど、
特に npm で入れる程でもないし、ワンライナーにまるめておいて必要なときにスニペット
から呼び出して貼れればいいやということで。

```javascript:line.js
global.__defineGetter__('__LINE__', function () { return (new Error()).stack.split('\n')[2].split(':').reverse()[1]; });
log(__LINE__); // display current line number
```
Ruby 1.8系でsort by keyなJSONを出力する

Ruby 1.8系のHashは順列を保持しないため、Hashを含むデータをJSONで出力しようとすると、実行するたびに並び順の違うJSONが出力されてしまいます。しかしそれだと、テストがやりづらかったり、本来同一内容のファイルが違う内容になってしまったり、いろいろ面倒です。
諸事情ありRuby 1.9系にバージョンを上げたくなかったので、**Ruby 1.8系のままsort by keyなJSONをdump出来るように**してみました。

## サンプルコード
手軽にデータを準備...ということで、YAMLをJSONに変換するコードで解説。

```ruby:yaml2json.rb
#!/usr/bin/env ruby -w
require 'rubygems'
require 'json/pure'
require 'yaml'

module JSON::Pure::Generator::GeneratorMethods::Hash
  remove_method :json_transform
  def json_transform(state)
    delim = ','
    delim << state.object_nl
    result = '{'
    result << state.object_nl
    depth = state.depth += 1
    first = true
    indent = !state.object_nl.empty?
    keys.sort.each { |k|
      result << delim unless first
      result << state.indent * depth if indent
      result << k.to_s.to_json(state)
      result << state.space_before
      result << ':'
      result << state.space
      result << self[k].to_json(state)
      first = false
    }
    depth = state.depth -= 1
    result << state.object_nl
    result << state.indent * depth if indent if indent
    result << '}'
    result
  end
end

puts JSON.dump(YAML.load(ARGF.read))
```

## ポイント
jsonモジュールはデフォルト動作はCで書かれた拡張版で動作しますが、**json/pureを明示的に指定することで、Rubyで書かれたpure版**を使う事が出来ます。Rubyであれば既存のモジュールのメソッドを上書きすることが出来るので、Hashをまさにeachしているこいつのコードを書き換えてsortするようにしてしまいます。先にremove_methodしているのは、これをしないで再定義すると"warning: method redefined; discarding old json_transform"と警告が出てしまうので、お行儀を良くするために。

これでJSON中に含まれる全てのHashはキーでソートされるので、実行毎に出力結果が変わることが無くなります。
S3(aws)へコマンドラインで接続した時のメモ


## 環境
OS X 10.8.2

## 手順

最新のものをダウンロード
http://sourceforge.net/projects/s3tools/files/s3cmd/

インストール

```
$ tar xvfz s3cmd-1.1.0-beta3.tar.gz
$ cd s3cmd-1.1.0-beta3
$ sudo python setup.py install
```

設定

```
$ s3cmd --configure
```
* access keyとsecret keyが必要
* 確認は、コンソール右上[MyAccount]->[セキュリティ証明書]

使い方は、

```
$ s3cmd --help
```
Rails2とRails3でform_forのタグの違い

Rails2とRails3でform_forのタグの違いがあるようです。
Rails2では`<%`と「＝」が必要ないが、Rails3は`<%＝`としないと動きません。
注意です。

**Rails2**

```
<% form_for(@user) do |f| %>
```

**Rails3**

```
<%= form_for(@user) do |f| %>
```
Methodの代わりにStringを使ってinstance variableをsetする

いまいち何と説明するのか分からないけど
`str = 'title'`のtitleを使って`@blog.title = 'bacon'`みたいな事がしたい。

####instance_variable_setを使う

```ruby
str = 'title'
@blog.instance_variable_set("@#{str}".to_sym, 'bacon')
```

で出来るんだけど、他にやり方ないかなぁ。

####getも出来る

```ruby
str = 'title'
@blog.instance_variavle_get("@#{str}".to_sym)
```

##追記
コメントで頂きました

```ruby
@blog.send("#{str}=", 'bacon')
```

こっちのが良いですね！
Windowsストアアプリにおける4段階のコード共通化方法

# Windowsストアアプリにおける4段階のコード共通化方法

Windowsストアアプリ(のデザイン面)において、
主に以下に示す4段階のコード共通化方法が提供されている。

## 第1段階： リソースディクショナリ

**UI要素のプロパティレベルの共通化を行う。**

例えばボタンの前面色をリソースディクショナリ内で定義すると、

```
<ResourceDictionary ... >
    <SolidColorBrush x:Key="BackButtonForegroundThemeBrush" Color="#FF666666"/> 
</ResourceDictionary>
```

XAMLファイル内でStaticResource関数を用いて次のように参照できる：

```
<Button Foreground="{StaticResource BackButtonForegroundThemeBrush}" ... />
```

複数のプロパティを一括して参照したい場合はスタイルタグを利用する：

```
<Style x:Key="SeparatorStyle" TargetType="Image">
    <Setter Property="Width" Value="494"/>
    <Setter Property="Height" Value="4"/>
    <Setter Property="Source" Value="/Assets/separator.png"/>
</Style>
```

↓

```
<Image Style="{StaticResource SeparatorStyle}" ... />
```


## 第2段階： テンプレートコントロール

**カスタムコントロールをプログラム的に定義する。**

Controlクラスを継承してカスタムコントロールを作成する：

```
public sealed class CustomControl1 : Control
{
    public CustomControl1()
    {
        this.DefaultStyleKey = typeof(CustomControl1);
    }
}
```

外部に公開したいプロパティは、DependencyPropertyプロパティを用いて定義する：

```
public string Title
{
    get { return (string)GetValue(TitleProperty); }
    set { SetValue(TitleProperty, value); }
}

public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title",
    typeof(string), typeof(FlyoutPanel), null);
```

外部に公開したいイベントは次のように行う：

```
public event RoutedEventHandler MyEvent;
```

すると、以下のようにカスタムコントロールを利用できる：

```
<local:CustomControl1 Title="xxx"  MyEvent="CustomControl1_MyEvent" />
```

## 第3段階： ユーザーコントロール

**上述のテンプレートコントロールをベースにしたうえで、
XAMLファイルを用いてデザインを定義することができる。**

UserControlクラスを継承してカスタムコントロールを作成する：

```
public sealed partial class MyUserControl1 : UserControl
{
    public MyUserControl1()
    {
        this.InitializeComponent();
    }
}
```

対応するXAMLファイルにて、デザインを定義していく：

```
<UserControl ... >
    ...
</UserControl>
```

XAMLファイルが使えるので、より複雑な構造のUIが構築しやすい。

## 第4段階： (部分)ページ

**ページは画面全体を表すだけでなく、Frameを用いて、部分的な領域として埋め込んで表すことができる。**

```
<Page ... >
  ...
  <!-- 埋め込みページ -->
  <Frame x:Name="LeftFrame" />
  ...
</Page>
```

↓

```
LeftFrame.Navigate(typeof(SubPage));
```

以上です。
Objective-Cで非同期通信

.hに

	NSURLConnection *connection;
	NSMutableData *listData;

viewDidLoadとかに

	// パラメータを作成
	NSString *data = [[NSString alloc] init];
	data = [NSString stringWithFormat:@"user_id=%@", uuid_];
    
    NSURL *url = [NSURL URLWithString:[NSString stringWithCString:URL encoding:NSUTF8StringEncoding]];
    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc]initWithURL:url];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setHTTPBody:[data dataUsingEncoding:NSUTF8StringEncoding]];
    
	// 取得データを格納
    listData = [[NSMutableData alloc] initWithCapacity:0];
    
    if (connection) [connection cancel];
    connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self startImmediately:NO];
    [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    [connection start];


別にメソッドを作成

	// レスポンスを受け取った時点で呼び出される
	- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    	[listData setLength:0];
	}

	// データを受け取る度に呼び出される
	- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data2 {
 	   [listData appendData:data2];
	}

	// 非同期通信ダウンロード完了
	- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
		NSLog(@"%@", listData);
	}

解析するために、NSDataをNSStringに変換

    NSString *json_string = [[NSString alloc] initWithData:listData encoding:NSUTF8StringEncoding];
Capistranoを使ってサーバ上にてバックグラウンドプロセスを実行させる

UnixライクなOSの場合、プロセスをバックグラウンドに回すためには行末にアンパサンド（&）を付与します。

Capistranoからも同様にアンパサンドを付与すれば、と思いましたが、それだけではダメでした。

```ruby
task :example do
  run 'sleep 5 &' # これじゃダメ
end
```

```
$ cap example
  * 2013-02-08 17:18:08 executing `example'
  * executing "sleep 5 &"
    servers: ["my-server"]
    [my-server] executing command
    command finished in 5157ms
```

下記の方法で大丈夫。

```ruby
task :example do
  run 'sh -c "sleep 5 &" >& /dev/null' # リダイレクトさせる（/dev/nullである必要はない）
end
```

```
$ cap example
  * 2013-02-08 17:25:32 executing `example'
  * executing "sh -c 'sleep 5 &' >& /dev/null"
    servers: ["my-server"]
    [my-server] executing command
    command finished in 189ms
```

アプリケーションサーバに[puma](http://puma.io/)を使っているんですが、rubygems.orgから手に入るpuma-1.6.3だと、デーモン化のためのオプションがないため、アンパサンドを付与してやるのですが、まあそれでいろいろやってたら見つけたという経緯です。
blocksによるコールバックのジレンマ

なにか非同期のリクエストを送るメソッド呼び出しを行う場合、よくあるデザインとして、
完了をblocksで通知してくれるものがあります。
例えば、

```
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.co.jp"]];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        
    }];
```

のようなケースです。
シングルリクエストならこれでいいでしょう。
しかしながら、これをループさせたくなったとき、多くの人ははたと手が止まってしまうのではないでしょうか？
というのも、

```
    for(int i = 0 ; i < 10 ; ++i)
    {
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.co.jp"]];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
            
        }];
    }
```

というのは良くないことが目に見えているからです。
できれば１つずつ完了を待ってやりたいですね。

そこで登場するのが今回の肝、再帰呼び出し（線形反復）です。

```
- (void)downloadWithURLs:(NSArray *)urls iteration:(int)i
{
    if(urls.count <= i)
    {
        //done.
        NSLog(@"all done.");
        return;
    }
    NSLog(@"downloading...");
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urls[i]]];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        NSLog(@"downloading done.");
        [self downloadWithURLs:urls iteration:i + 1];
    }];
}

//呼び出し側
    NSArray *urls = @[@"http://google.co.jp", @"http://google.co.jp", @"http://google.co.jp"];
    [self downloadWithURLs:urls iteration:0];
```

これを実行すれば、以下の出力を得られます
2013-02-08 16:49:00.808 MultipleDownloadIdiom[11178:c07] downloading...
2013-02-08 16:49:00.942 MultipleDownloadIdiom[11178:c07] downloading done.
2013-02-08 16:49:00.942 MultipleDownloadIdiom[11178:c07] downloading...
2013-02-08 16:49:01.001 MultipleDownloadIdiom[11178:c07] downloading done.
2013-02-08 16:49:01.002 MultipleDownloadIdiom[11178:c07] downloading...
2013-02-08 16:49:01.082 MultipleDownloadIdiom[11178:c07] downloading done.
2013-02-08 16:49:01.083 MultipleDownloadIdiom[11178:c07] all done.

ちゃんとやりたいことが実現できています
少々アクロバティックではありますが、目的が達成できました。
MySQL5.6で遅延レプリケーション機能を使う

まず、レプリケーションを停止。

```
STOP SLAVE;
```
<br>
停止を確認したら下記コマンドを実行

```
CHANGE MASTER TO MASTER_DELAY=86400;
```
<strong>※上記の例だと24時間遅延</strong>

<br>
レプリケーションを再開

```
START SLAVE;
```

<br>
レプリケーションの遅延を確認

```
SHOW SLAVE STATUS \G
```

<br>

下記の様になっていれば成功

```
SQL_Delay: 86400
```
リンクタグを使用した閉じるボタン記述方法「colorbox.js」

## ヘッダにID指定させる方法

ブログで一般的に書かれている方法は
```
$(“#cancel”).click(function(){
parent.$.fn.colorbox.close(); return false;
});
```
※↑はjsに上記を追加し、閉じるボタンにid=”cancel”を追加する方法。

でもこれってちょっと面倒くさくない？
閉じるボタン一個だけの場合は、シンプルにその場だけでcloseさせたいんですけどー！

・・・・そういう場合は下記で出来ました。
閉じるボタンの要素に直接リンク指定をする 方法。

## リンクに直接書く方法
```<a href='#' onclick="$.colorbox.close(); return false;">画像やテキスト</a>```


上記普通にcolorbox.jsに元々あるcolorbox.close();を呼び出してるだけ。
シンプルですね。
かっこよくredirectかつreturn in rails

Railsのコントローラーで、redirectして更にその後の処理をしたくないときはかなりあると思います。
そんなとき僕は今まで

```ruby:users_controller.rb
def show
  @user = User.find params[:id]
  if @user.nil?
    redirect_to :root
    return
  end
end
```
と書いていて、ただのチェックの処理に4行も使っているのがすごく不満だったのですが

```ruby:users_controller.rb
def show
  @user = User.find params[:id]
  return redirect_to :root if @user.nil?
end
```
このように`return redirect_to ... if ...`と書けば一行で、更にかっこ良く書けることに今更ながら気づきました。
モデルをサブディレクトリに分割する Rails 3.2	


プロジェクトが大きくなるにつれて、モデルクラスの数もどんどん多くなる。収拾がつかなくなる前に、モデルをディレクトリにわけて置いておく方法をまとめる。

参考にした書籍は「エンタープライズRails」の第三章だけど、内容が古くそのままではうまく動かなかったので、検討してみた結果が以下。

まず、/app/models/以下に、好きなようにディレクトリを作り、適当にモデルファイルを配置する。例えば、/app/models/physical/users/ と　/app/models/logical/のふたつのディレクトリを作り、それぞれuser.rbとrole.rbのモデルファイルを配置した。
さらに、User belongs_to Role として関連を設定する。

```/app/models/physical/users/user.rb
class User < ActiveRecord::Base
  belongs_to :role
  #以下省略
end
```

```/app/models/logical/role.rb
class Role < ActiveRecord::Base
  attr_accessible :name
  #以下省略
end
```

モデルの設定はこれでおしまい。
ただ、このままだとアプリの起動時にモデルの読み込みに失敗する。そこで、/config/application.rbにローディングの記述を追加する。

```
module YourAppName
	class Application < Rails::Application
		#18行目あたり
		config.autoload_paths += %W(#{config.root}/app/models/logical)
		config.autoload_paths += %W(#{config.root}/app/models/physical/users)
	end
end
```
これですべて上手くいった。

-

ちなみに、書籍やブログで調べると、モデルクラスにはモジュールでラップし、関連の設定にはクラスのパスを明示的に知らせる必要があるというものがほとんどだったが、どれもうまくいかなかった。こんな感じ。

```
※これはうまくいかなかった設定です
module Physical
	module users
		class User < ActiveRecord::Base
  			belongs_to :role, :class_name => '::Logical::Role'
  			#以下省略
		end
	end
end
```
上記は結局上手く行かず、モジュールでのラップも、関連を設定する際のパスの指定も不要のようだ。Rails3.2からそのあたりが楽チンになったのだろうか？？

どなたか間違いがわかる方はご指摘ください！
Objective-C++でLinker errorが出た時の対処法


OpenCV iOS開発の初心者はよくつまづいてる部分みたいです。
（私もその一人です。）

以下設定で。

![](https://s3.amazonaws.com/f.cl.ly/items/1L453D1d140x3Z2E0e0A/screen_shot%202013-02-21%2013.51.04.png)

　↑ Library Search Pathsは入れなくても平気なことがある


![](https://s3.amazonaws.com/f.cl.ly/items/3z3r2n280N3N1W3F3V2i/LLVM.png)



ダメなら、以下で。
![](http://cl.ly/image/272b2Z1J3k2U/kagDL.png)


とりあえず。

あと、当然ながら必要なdylibファイルが指定されていないとLinker errorとかが出ます。
サンプルコードの載せているサイトの多くで、以下3つのみ追加しているようですが、怪しいと思ったらOpenCVのdylibファイルを色々突っ込んでみて下さい。

![](http://cl.ly/image/2M382R0X3f1Y/screen_shot%202013-02-21%2014.03.23.png)
git-flow童貞のためのメモ featureブランチ編


```
brew install git-flow
```
でインストール

導入したいレポジトリで

```
git flow init
```
設定は各々

```
git flow feature start pokopoko
```
feature/pokopokoブランチの作成(featureブランチは新機能作成用のブランチ)

addとcommitはgitと同じ
(git add pokopoko, git commit -m 'pokopoko change')

リモートブランチをつくりたいとき

```
git flow feature publish pokopoko
```
でremoteにpush+trackされる

pullしたいとき

```
git flow feature pull origin pokopoko
```

作業が終わってmergeしたいとき

```
git flow feature finish pokopoko
```
(最初の設定で設定したdevelopmentブランチにmergeされ，feature/pokopokoは削除される)

続編はあるのだろうか
Twitterのウィジェット(埋め込みタイムライン)のスタイルをカスタマイズする

[Twitterのウィジェットを高さ以外もカスタマイズできるスクリプト - Qiita](http://qiita.com/items/8407733a88b0e5e2aec0)

こちらの改良版です。
Twitterの埋め込みタイムラインウィジェットはあまりカスタマイズできないのでjsで外からスタイル変更する方法です。

ただ、ウィジェットのidやクラスが変わると使えなくなったりします。
また、スタイルを変更するのはtwitterのブランドデザイン？的にあまりよろしくないことなのかもしれないので参考程度に。。。

```js
/** 新しいTwitterウィジェットのスタイルを設定* */
function decorateWidget(id) {
  var $twwgt = $(id);
  var decorate = function($el) {
    $el.find(".timeline-header").css(/*スタイルを変更*/);
    $el.find(".timeline-footer").css(/*スタイルを変更*/);
    return $el;
  };
  
  //ウィジェットが読み込まれるまで再帰
  if ($twwgt.length > 0 && $twwgt[0].contentWindow.document.body.innerHTML !== "") {
    decorate($($twwgt[0].contentWindow.document));
  } else {
    setTimeout(function() {
      decorateWidget(id);
    }, 500);
  }
}
decorateWidget("#twitter-widget-0");
```
SELECT文で行(レコード)間の相関係数を取得する

example_tb

| id | a | b | c | d | e |
|:--:|:-:|:-:|:-:|:-:|:-:|
| 1  | 1 | 2 | 3 | 4 | 5 |
| 2  | 5 | 4 | 3 | 2 | 1 |
| 3  | 2 | 3 | 4 | 5 | 5 |
| 4  | 5 | 5 | 4 | 3 | 2 |
| 5  | 1 | 1 | 1 | 1 | 1 |
| 6  |   |   |   |   |   |
| 7  | 1 | 2 | 1 | 2 | 1 |
| 8  | 5 | 4 | 5 | 4 | 5 |

上記テーブルに対して、id:1のレコードと他のレコードの相関係数を求める

```sql
SELECT
x.id, x.a, x.b, x.c, x.d, x.e
(
    (
        (x.a*y.a)+(x.b*y.b)+(x.c*y.c)+(x.d*y.d)+(x.e*y.e) 
    )
    -
    (
        (x.a+x.b+x.c+x.d+x.e)*(y.a+y.b+y.c+y.d+y.e)/5
    )
)
/
NULLIF(
    (
        sqrt(
                (
                    (pow(x.a,2)+pow(x.b,2)+pow(x.c,2)+pow(x.d,2)+pow(x.e,2)) 
                    - 
                    (x.a+x.b+x.c+x.d+x.e)*(x.a+x.b+x.c+x.d+x.e)/5
                )
                *
                (
                    (pow(y.a,2)+pow(y.b,2)+pow(y.c,2)+pow(y.d,2)+pow(y.e,2)) 
                    - 
                    (y.a+y.b+y.c+y.d+y.e)*(y.a+y.b+y.c+y.d+y.e)/5 
                )
            )
      
    )
,0)
as pearson
from
example_tb x,
example_tb y
where y.id = 1 
order by pearson DESC
```

詳細は以下にて
[http://shimz.me/blog/sql/2564](http://shimz.me/blog/sql/2564)
GoogleAnalyticsを使ったユーザの外部遷移の追跡

自分のサイト内の外部遷移のURL(アフィリエイト等)をクリックされた際に、
どのページからどの外部URLに遷移したのかをGoogleAnalyticsで簡単に調査できるように
するための方法。

GoogleAnalyticsの`_trackEvent`を使う。

https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide

```javascript:sample.js
<script type="text/javascript">
//<![CDATA[
$(function(){
  $("a").on("click", function(){
    url = $(this).attr('href');
    if(url.indexOf($(location).attr('hostname')) == -1 && url.indexOf('http') >= 0)
    {
      _gaq.push(['_trackEvent','Link', $(location).attr('href'), url]);
    }
  });
});
//]]>
</script>
```

```
_gaq.push(['_trackEvent', category, action, opt_label, opt_value, opt_noninteraction])
```
という書式なので、`action`, `opt_label`等は分析したいように適当に

このコードを設置後、
GoogleAnalyticsの`コンテンツ`=>`イベント`=>`上位のイベント`
で確認すると以下のように外部遷移イベントを確認できるようになる。

![trackEvent](http://kengos.github.com/images/qiita/ga_01.png)

上記のJSを設置した場合、
* イベントアクションに遷移元ページ(自分のサイト)
* イベントラベルに外部遷移したページ

が入る。

イベントアクションを外部遷移したページにしたほうがいいかもしれない。
PHP5以降で起こるdate関数エラー

PHP5、正確にはPHP 5.1.0 以降でdate関数を使うと発生するエラー。  
忘れた頃に牙を剥いてくるのでメモ。

```error
It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.
```

## 解決策1
phpファイル内に以下を記述。これだけでOK。

```PHP
date_default_timezone_set('Asia/Tokyo');
```

## 解決策 2
php.ini に以下を記述。

```PHP
date.timezone = Asia/Tokyo
```
Vim (with python) で json を整形

整形されていない json を持ってきて vim で見やすく整形したい。

1. 例えばどこかのAPIを叩いて取得した値
2. 例えばどこかのドキュメントに載っている値
3. 例えばサンプルをドキュメントに残すために手作業で作った値

などなど。1番目の例であればブラウザの拡張を使うことで、綺麗に表示できたりもしますが、2番目3番目の場合に vim にぺたっと貼り付けて整形できると、便利そうです。

python2.6以降がインストールされている環境で（python コマンドに PATH が通っている状態で）、下記コマンドを叩くとバッファ内の json 文字列を整形することができます。

```vim
:%!python -m json.tool
```

例えば、こんな文字列がバッファに入っている時に上記コマンドを叩くと

```
{"count":1,"list":[{"url":"http://json.org/example.html","title":"\u3042\u3044\u3046\u3048\u304a"}]}
```

こんな感じになります。

```
{
    "count": 1, 
    "list": [
        {
            "title": "\u3042\u3044\u3046\u3048\u304a", 
            "url": "http://json.org/example.html"
        }
    ]
}
```

良い感じです。しかし、日本語がエスケープされたままではあまり嬉しくありません（また行末尾に半角スペースが入っていたりするのも気になります）。というわけで、少し改良したコマンドを作ってみました。vim 初心者なので、ツッコミもらえると嬉しいです。

```vim
command! JsonFormat :execute '%!python -m json.tool'
  \ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)), sys.stdin.read()))"'
  \ | :%s/ \+$//ge
  \ | :set ft=javascript
  \ | :1
```

簡単に説明を書くと

1. python の json.tool で整形
2. "\u307d" のような unicode 文字列をデコード
3. 各行の末尾にスペースが入るので削除
4. vim の filetype を javascript にしてハイライト表示
5. カーソルを先頭行に移動

コマンドを実行すると

```vim
:JsonFormat
```

下記のような表示になります。

```json
{
    "count": 1,
    "list": [
        {
            "title": "あいうえお",
            "url": "http://json.org/example.html"
        }
    ]
}
```
PHPUnitでProtectedなプロパティ、関数をテストする

# テスト対象コード
```php:SampleClass.php
<?php

class SampleClass
{
    protected $foo = TRUE;

    protected function hoge()
    {
        return TRUE;
    }
}
```
- hoge()がTRUEを返すことを検証したい
- $fooがTRUEであることを検証したい

# テストコード
```php:SampleClassTest.php
<?php

require_once 'SampleClass.php';

class SampleClassTest extends PHPUnit_Framework_TestCase
{
    public function testAccessProtectedProperty()
    {
        $foo = self::getProperty('foo');
        $obj = new SampleClass();

        $this->assertTrue($foo->getValue($obj));
    }

    public function testAccessProtectedMethod()
    {
        $foo = self::getMethod('hoge');
        $obj = new SampleClass();

        $this->assertTrue($foo->invokeArgs($obj, array()));
    }

    protected static function getProperty($name)
    {
        $class = new ReflectionClass('SampleClass');

        $property = $class->getProperty($name);
        $property->setAccessible(true);

        return $property;
    }

    protected static function getMethod($name)
    {
        $class = new ReflectionClass('SampleClass');

        $method = $class->getMethod($name);
        $method->setAccessible(true);

        return $method;
    }
}
```
# テスト実行結果
```console
$ phpunit SampleClassTest.php 
PHPUnit 3.6.10 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 2.50Mb

OK (2 tests, 2 assertions)
```
- ReflectionClassを活用することで検証結果を得ることができた
ソリューション内の[VB|C#]ドキュメント全てをフォーマットする

VSの便利な機能として、ドキュメントのフォーマットがあります。
参考：[ソース・コードを一瞬で整形するには？](http://www.atmarkit.co.jp/fdotnet/dotnettips/581codeformat/codeformat.html)
※VS2005 のみとあるが、筆者が確認したところ VS2012 でも問題なかった

しかし、これは単一のドキュメントしか対象にできません。
ソリューション内のドキュメントに対して一括で操作したいと考える方も多いと思います。

はい、ということで、一括で操作を行う方法について記します。
そして、今回も [Roslyn CTP - September 2012](http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx) を使いたいと思います。
※Roslyn を使うため、対象となるプロジェクトは VB または C# で書かれたものとなる。

方針としては、
1.ソリューションのパスからドキュメントの一覧を取得
2.そのドキュメント全てに **Format()** を適用
3.適用したドキュメントを上書き保存
の順になります。

以下サンプルです

```c#:sample.cs
using System;
using System.IO;
using System.Linq;
using System.Text;
using Roslyn.Services;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
                throw new ArgumentException("*.sln path を設定してください");

            var path = args.Single();

            var solution = Workspace.LoadSolution(path).CurrentSolution;

            foreach (var document in solution.Projects.SelectMany(p => p.Documents))
            {
                var newDocument = document.Format();

                using (var writer = new StreamWriter(document.FilePath, false, Encoding.UTF8))
                    newDocument.GetText().Write(writer);
            }
        }
    }
}
```

前回の [ソリューション内のドキュメント全てを対象に未使用のusing削除および並び替えをする](http://qiita.com/items/60ae763fd34160437dff) と組み合わせれば、ソリューション内のドキュメント全てに対し、整形とusingの整理を行うことも可能です。
Pythonで実装されたRuby処理系らしいTopazをビルドする

pypyプロジェクトの成果物を利用しているらしい。
詳しい事は知らないけど、とりあえずビルドしてみた。

環境は Ubuntu 12.04 です。

まず、ビルドに必要なパッケージをインストールする。

```sh
sudo apt-get install mercurial
sudo apt-get install python-pip
sudo apt-get install libffi-dev
```

~/package 以下で作業する

```sh
cd ~/package
git clone http://github.com/topazproject/topaz
hg clone https://bitbucket.org/pypy/pypy

cd topaz
sudo pip install -r requirements.txt
python ~/package/pypy/rpython/bin/rpython -Ojit targettopaz.py
```

仮想マシンでビルドしているせいかめっちゃ時間掛かった。。。
~/package/topaz/bin/topaz が生成されます。
とりあえず、Hello, Worldでも出力して今回は終わり。

```sh
bin/topaz -e "puts 'Hello, world'"
> Hello, world
```
[const char*] with const_cast<char*>


C/C++を書いていて文字列そのまま突っ込みたいと思ったりしても、配列の確保して、コピーしてとか普通やらないといけない。
でもC++のconst_cast<char*>を使ってやると以下のように書ける。

```
char **params;
params = new char*[paramNum];
params[0] = const_cast<char*>("param1");
params[1] = const_cast<char*>("param2");
```

文字をそのまま突っ込む感じで書ける。
第7回オフラインリアルタイムどう書く。Prologによる実装。

お題は こちら http://qiita.com/items/4364285801d1c9f370a1

Haskellでパタンマッチングで書くことができたので、Prologに翻訳してみました（Haskellで投稿したものからちょっとだけ手を加えてあります、番兵のところ）。

テストの実行には https://github.com/hiratara/offline-DOUKAKU-skeletons のtest.prolog を利用してください。

```prolog:answer.prolog
sitdown3([0'+, 0'-, 0'-|CS], P, [0'+, P, 0'-|CS]).
sitdown3([0'-, 0'-, 0'-|CS], P, [0'-, P, 0'-|CS]).
sitdown3([C|CS], P, [C|RS] ) :- sitdown3(CS, P, RS).

sitdown2([0'+, 0'-|CS], P, [0'+, P|CS]).
sitdown2([0'-, 0'-|CS], P, [P, 0'-|CS]).
sitdown2([C|CS], P, [C|RS] ) :- sitdown2(CS, P, RS).

sitdown1([0'-|CS], P, [P|CS] ).
sitdown1([C|CS], P, [C|RS] ) :- sitdown1(CS, P, RS).

sitdown(CS, P, RS) :- sitdown3(CS, P, RS), !.
sitdown(CS, P, RS) :- sitdown2(CS, P, RS), !.
sitdown(CS, P, RS) :- sitdown1(CS, P, RS), !.

leave([P|CS], P, [0'-|CS]).
leave([C|CS], P, [C|RS] ) :- leave(CS, P, RS).

traffic([], CS, CS).
traffic([P|PS], CS, RS) :- between(0'A, 0'Z, P), sitdown(CS, P, NS), traffic(PS, NS, RS).
traffic([P|PS], CS, RS) :- between(0'a, 0'z, P), to_upper(P, Q), leave(CS, Q, NS), traffic(PS, NS, RS).

sentinel(XS, H, T, [H|YS]) :- sentinel(XS, T, YS).
sentinel([], T, [T]).
sentinel([X|XS], T, [X|YS]) :- sentinel(XS, T, YS).

split(D, [D|XS], [], XS).
split(D, [X|XS], [X|YS], ZS) :- D \= X, split(D, XS, YS, ZS).

get_source(Input, Count, Source) :- split(0':, Input, NS, Source), number_chars(Count, NS).

replicate(0, _, []).
replicate(N, C, [C|CS]) :- N1 is N - 1, replicate(N1, C, CS).

solve(Input, Actual) :-
  get_source(Input, Count, Source),
  replicate(Count, 0'-, CS0),
  sentinel(CS0, 0'+, 0'-, CS1),
  traffic(Source, CS1, CS2),
  sentinel(Actual, 0'+, 0'-, CS2),
  format("~s~n", [Actual]).
```
Sencha Touch 2でのイベントキャプチャー

Ext JSやSencha Touch 1では、あるオブジェクトのイベントをすべてキャプチャーする、
captureというメソッドが、Ext.util.Observableにありました。

このメソッドは、デバッグの時や、コンポーネントのイベント発火の挙動を確かめるときに非常に便利です。

    Ext.util.Observable.capture(someCmp, function () {
        console.log(argumetns);
    });

なんてやっておくと、someCmpで何かイベントが発生したら全部ログしてくれます。
そのログをみて、「はぁ、こういう風に動くんだ」とか「あ！ここではイベント発火しないんだ！」とかわかるわけです。

と、開発時に便利なメソッドなんですが、Sencha Touch 2では廃止されて、なくなってしまいました。そのことをつぶやいたら、 @kotsutsumi さんが同じ事をやる方法を教えてくれました。

http://www.sencha.com/forum/showthread.php?182344-What-is-equivalent-of-ST1-Observable.capture-method&langid=14


    Ext.define('Override.mixin.Observable', {
        override : 'Ext.mixin.Observable',

        fireEvent : function(eventName) {
            console.log(eventName);

            this.callOverridden(arguments);
        },

        fireAction : function(eventName) {
            console.log(eventName);

            this.callOverridden(arguments);
        }
    });

ちなみに、Ext.util.ObservableもExt.mixin.ObservableもSencha Touch 2では同じです。

Ext.defineのoverride指定で、fireEventをオーバーライドしています。
これを実行した後にイベントを装着したクラスをインスタンス化したら、
それらみんなのオブジェクトをキャプチャーできるようになります。
ioctlの意味


ファイルディスクリプタを制御するのにioctlという関数を見たのでメモ。

```
ioctl(fd, FIOCLEX, NULL) 
= fcntl(fildes, F_SETFD, FD_CLOEXEC)

ioctl(fd, FIONCLEX, NULL)
= fcntl(fildes, F_SETFD, 0)
```

それぞれ=でつながったやつと同じらしい。fcntlは何かっていうとファイルディスクリプタのフラグをセットする関数らしい。

`FD_CLOEXEC`があればfdを閉じる。0であれは開けっ放しにするらしい。
force_sslを指定したControllerのSpecを書く


Controllerにて`force_ssl`を指定することで、ブラウザからのアクセスを強制的にSSLにすることができる。

```ruby
class HogeController < ApplicationController
  force_ssl

  def index
  end
end
```

force_sslを指定したControllerのRSpecを記述する場合、テストを通すためにはひと工夫必要。

```ruby
describe HogeController do
  before do 
    request.env['HTTPS'] = 'on'
  end

  describe 'GET index' do
    it 'should xxxxx' do
      get :index
      # 略
    end
  end
end
```

`request.env['HTTPS'] = 'on'`が各Exampleの前に実行されるようにすることで、HTTPSからのアクセスとして各Exampleが実行されるようになる。
第7回オフラインリアルタイムどう書く。Haskellによる実装。

お題は こちら http://qiita.com/items/4364285801d1c9f370a1

パタンマッチングで解けないだろうか、とやってみました。一応できましたが、いろいろ不細工…。こちらも番兵を置いています。

```haskell:Answer.hs
module Answer(solve) where

import Data.Char

sitdown p cs = take (length cs) $ tail $ drop ((length result) - (length chairs)) result
  where
    chairs = '+':cs ++ "+"
    result = sitdown' p chairs chairs

sitdown' p _  ('+':'-':'-':cs) = '+':p:'-':cs
sitdown' p _  ('-':'-':'-':cs) = '-':p:'-':cs
sitdown' p _  ('-':'-':'+':cs) = '-':p:'+':cs
sitdown' p ss (c:cs)           = c:(sitdown' p ss cs)
sitdown' p ss []               = sitdown'' p ss ss

sitdown'' p _  ('+':'-':cs) = '+':p:cs
sitdown'' p _  ('-':'-':cs) = p:'-':cs
sitdown'' p _  ('-':'+':cs) = p:'+':cs
sitdown'' p ss (c:cs)       = c:(sitdown'' p ss cs)
sitdown'' p ss []           = sitdown''' p ss

sitdown''' p ('-':cs) = p:cs
sitdown''' p (c:cs)   = c:(sitdown''' p cs)

leave p cs = h ++ '-':t
  where
    (h, _:t) = break (== p) cs

solve s = take size $ foldl solve' (replicate size '-') input
  where
    (size', _:input) = break (==':') s
    size             = read size' :: Int
    solve' xs x      = if isUpper x then sitdown x xs
                                    else leave (toUpper x) xs
```

```haskell:test.hs
module Main where
import Test.HUnit
import Answer

split :: (a -> Bool) -> [a] -> [[a]]
split f s =
    case dropWhile f s of
         [] -> []
         s' -> w : split f s''
               where (w, s'') = break f s'

doAssert :: [String] -> Assertion
doAssert (name:input:expected:_) =
    assertEqual name expected (solve input)
doAssert _ = error "Specify a list which contains more than 3 items."

main :: IO ()
main =
    readFile "patterns.tsv"
    >>= runTestTT . test . map (doAssert . split (== '¥t')) . lines
    >>  return ()
```
mongodb 起動エラー時の対処方法-journallog

mongodbの起動時に発生したエラーの対処

/var/log/mongo/mongod.log

```pre
Thu Feb  7 10:32:26 [initandlisten] options: { config: "/etc/mongod.conf", dbpath: "/var/lib/mongo", fork: "true", logappend: "true", logpath: "/var/log/mongo/mongod.log", pidfilepath: "/var/run/mongodb/mongod.pid" }
Thu Feb  7 10:32:26 [initandlisten] journal dir=/var/lib/mongo/journal
Thu Feb  7 10:32:26 [initandlisten] recover : no journal files present, no recovery needed
Thu Feb  7 10:32:26 [initandlisten] 
Thu Feb  7 10:32:26 [initandlisten] ERROR: Insufficient free space for journal files
Thu Feb  7 10:32:26 [initandlisten] Please make at least 3379MB available in /var/lib/mongo/journal or use --smallfiles
Thu Feb  7 10:32:26 [initandlisten] 
Thu Feb  7 10:32:26 [initandlisten] exception in initAndListen: 15926 Insufficient free space for journals, terminating
Thu Feb  7 10:32:26 dbexit: 
```

mongodbはjournalログをデフォルトで有効にし、その場合3.5Gのファイルを確保する。
ディスクに余裕がない場合は、この時点でエラーになる。

開発時などはjournalログを無効にすると解消する。

####/etc/mongod.conf
######変更前

```text
#nojournal = true
```

######変更後

```text
nojournal = true
```

これでエラー解消。
PhotoshopのJavaScriptファイル（.jsx）をシェルスクリプト／コマンドラインから実行する（Mac）

sample.shと同一階層にあるsample.jsxをPhotoshop CS5で実行する例。

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

dirpath=$(cd $(dirname $0); pwd)
jsxpath="${dirpath}/sample.jsx"
photoshop='Adobe Photoshop CS5'

osascript -e "tell application \"${photoshop}\" to activate & do javascript file \"${jsxpath}\""
```

```javascript:sample.jsx
alert('hello');
```

ただ、自分の環境では`53:136: execution error: No result was returned from some part of this expression. (-2763)`というAppleScriptのエラーが起こってしまうみたい。
どうすればいいのかな？

また他のAdobe製品もだいたい同じでいけるっぽいけど若干コードが異なったりパスの扱いが違う模様。
weak を unsafe_unretained に書き換える際の注意点

ARC-enabled なライブラリを Snow Leopard に対応させるために、 weak 修飾子を unsafe_unretained 修飾子に書き換たいことがまれにある。基本的には単純に書き換えるだけでいいが、注意すべき点が2つある：

1. `unsafe_unretained` プロパティが参照するオブジェクトが解放されたらプロパティに `nil` をセットする
2. `__unsafe_unretained` 変数が参照するオブジェクトを使う前に強参照を作る

# 1. プロパティについて
`weak` プロパティはオブジェクトが解放されると同時に `nil` がセットされるが、 `unsafe_unretained` プロパティは無効な領域を参照し続ける：

```objc
@property(weak) id weakProp;
@property(unsafe_unretained) id unsafeUnretainedProp;

// ...

- (void)propExample {
    id obj = [[NSObject alloc] init];

    self.weakProp = obj;
    self.unsafeUnretainedProp = obj;

    obj = nil; // ここでオブジェクトが解放される

    // ここでは self.weakProp == nil
    // ここでは self.unsafeUnretainedProp == 無効なアドレス
}
```

`weak` プロパティを `unsafe_unretained` プロパティに書き換えた場合、参照しているオブジェクトが解放されたタイミングで `nil` をセットしてやる必要がある。

上に掲載した例は同一スコープ内でオブジェクトを作ってすぐ解放する単純なコードなので解放タイミングが掴みやすいが、実際の参照関係はより複雑になる場合がほとんどである：

```objc
- (void)complexRefExample {
    self.unsafeUnretainedProp = [self.mutableDict objectForKey:@"obj"];

    [self.mutableDict removeObjectForKey:@"obj"];

    // ここで、
    // 強参照していたのが self.mutableDict だけなら：
    //     self.unsafeUnretainedProp == 無効なアドレス
    // 他のオブジェクトがまだ強参照しているなら：
    //     self.unsafeUnretainedProp == オブジェクトの有効なアドレス
}
```

オブジェクトが解放されるタイミングが予測できない場合、メモリリークする可能性と引き換えに `strong` プロパティを使う手もある。

# 2. 変数について
`__weak` 変数も `weak` プロパティと同様に、参照するオブジェクトが解放されると同時に `nil` がセットされる：

```objc
- (void)varExample1 {

    id obj = [[NSObject alloc] init];

    __weak id weakVar = obj;
    __unsafe_unretained id unsafeUnretainedVar = obj;

    obj = nil; // ここでオブジェクトが解放される

    // ここでは weakVar == nil
    // ここでは unsafeUnretainedVar == 無効なアドレス
}
```

`__weak` 変数を `__unsafe_unretained` 変数に書き換えた場合、手動で `nil` をセットする代わりに、強参照を作ってオブジェクトを解放させないようにするのが手軽である：

```objc
- (void)varExample2 {
    {
        id obj = [[NSObject alloc] init];

        __unsafe_unretained id unsafeUnretainedVar = obj;
		id var = unsafeUnretainedVar;

        obj = nil; // まだ var が参照しているのでオブジェクトは解放されない

        // ここでは unsafeUnretainedVar == obj
    }
}
```