OmniAICreator/Qiita-1.07M huggingface dataset:
日付文字列をISO-8601形式のNSDate型に変換するコード

RSSとかでTとかZの付いているあの日付文字列をNSDateに変換するコードです

参考
[iPhoneアプリ開発備忘録](http://iphone-app-developer.seesaa.net/article/134688683.html)

```objc
NSString *dateString = [dic objectForKey:@"2013-04-30T11:30:00+09:00"];
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZZ"];
NSDate* date = [formatter dateFromString:dateString];
```
Qiitaに要望リスト

#要望
* 3階層以上のリストに対応して欲しい。

#解決済み
* 自分が書いたコメントの一覧が欲しい。(2015-03-19)
* 自動補完をESCで閉じられるようにして欲しい。（いつの間にか閉じられなくなってた）(2014-03-17)
* 非公開オプションが欲しい。（下書き保存も兼ねて）(2013-05-25)
* 自動補完をESCで閉じられるようにして欲しい。(2013-05-04)
[chrome:debian]Chromeがdpkgでインストールできない場合はaptでインストール

#dpkgでChromeがインストールできない状態
公式にDebianで行くとdebファイルをゲットできるが
dpkgコマンドを使うとエラーを吐く場合お勧めします
別に必ずエラーが出るか確認してからやる必要はありません

#Chromeのインストール

##Keyを登録
 
 ```sh
 wget --no-check-certificate https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo apt-key add linux_signing_key.pub
 ```

##Chrome repositorieを登録
 ```sh
echo "deb http://dl.google.com/linux/chrome/deb/ stable non-free main " >> /etc/apt/sources.list
 ```
修正 2013/5/24: URLを修正しました

##apt-getかaptitudeでインストール
 
 ```sh
sudo apt-get install google-chrome-stable
```

以上です。
rails4.0.0.beta1 -> rails4.0.0.rc1 migration guide


今のところ、これ以外わからん。

## config/initializers/session_store.rb

```
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
index e3f861f..b7cac75 100644
--- a/config/initializers/session_store.rb
+++ b/config/initializers/session_store.rb
@@ -1,3 +1,3 @@
 # Be sure to restart your server when you modify this file.

-HogeCo::Application.config.session_store :encrypted_cookie_store, key: '_hoge_co_session'
+HogeCo::Application.config.session_store :cookie_store, key: '_hoge_co_session'
```

```encrypted_cookie_store``` てのが無くなったぽい。


@see https://github.com/rails/rails/pull/9978

### error log

```
gems/railties-4.0.0.rc1/lib/rails/application/configuration.rb:144:in `const_get': uninitialized constant ActionDispatch::Session::EncryptedCookieStore (NameError)
```

## config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb

```
diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb
index 33725e9..ddd9dd5 100644
--- a/config/initializers/wrap_parameters.rb
+++ b/config/initializers/wrap_parameters.rb
@@ -9,6 +9,6 @@ ActiveSupport.on_load(:action_controller) do
 end

 # To enable root element in JSON for ActiveRecord objects.
-# ActiveSupport.on_load(:active_record) do
-#  self.include_root_in_json = true
-# end
+ActiveSupport.on_load(:active_record) do
+ self.include_root_in_json = true
+end
```

もしくは、

```@post.to_json``` で ['post'] を期待したコードを排除する



@see https://github.com/rails/rails/issues/9459
@see https://github.com/rails/rails/commit/8c7d4018e0ddec462075027defb3575c47952c3e


## layout nil はデフォルトレイアウトを返すようになった

xhr経由でレイアウト出さないような処理

```
  layout Proc.new { |controller| controller.request.xhr? ? false : 'application' }
```

てな感じで、```layout false``` に変更

@see https://github.com/rails/rails/commit/ef27bba63d93453dee26e2decfca80659f2da735#actionpack/lib/abstract_controller/layouts.rb
J-○○ric.netでコピーしやすくするブックマークレット

既に100個くらいは存在してるであろうブックマークレットですが・・・

```javascript:
javascript: (function(){
    var d = document;
    var s = d.createElement('script');
    s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js';
    d.body.appendChild(s);
    setTimeout(function(){
    	var d=window.open().document;
		d.writeln($("p#lyricBody").html());
    }, 1000);
})();
```

ブックマークレットへの変換
[http://ted.mielczarek.org/code/mozilla/bookmarklet.html](http://ted.mielczarek.org/code/mozilla/bookmarklet.html)
とか
SciPyとmatplotlibのインストール(Python)

Python用の科学計算モジュールであるSciPyと、
グラフ作成モジュールのmatplotlibをインストールします。
Homebrewを使います。

pythonが入ってなければまず

```
brew install python
```

続けて

```
brew install gfortran
pip install numpy
pip install scipy
pip install matplotlib
```

scipyのインストールにgfortran, numpyが必要なようです。
warningがいっぱい出ますが無視で

brewでpythonを入れた場合、pipの場所は
/usr/local/lib/python2.7/site-packages/
なので、PYTHONPATHを通しておきます。
Eclipseの場合は、環境設定のPyDev→Interpreter - Python→newで
browseから/usr/local/Cellar/python/2.7.4/bin/pythonを選択すると、
PYTHONPATHを通す場所の一覧が表示されるので、全部にチェックを入れて
OKすれば良いです。

(追記)
easy_installが廃止されてpipが標準装備になったのは最新版(2.7.4)からのようです。
pythonのバージョンが古い場合は更新してください。
第8回オフラインリアルタイムどう書くの練習問題をF#で

```fsharp:entropy.fs
type Tree = Term | Undefined | Value of char | Node of Tree * Tree
let root =
  Node (
    Node (
      Node (Value 't', Node (Value 's', Value 'n')),
      Node (
        Node (Value 'i', Node(Value 'd', Node (Node (Undefined, Value 'c'), Value 'l'))),
        Node (Value 'o', Value 'a')
      )
    ),
    Node (Value 'e', Node (Node (Value 'r', Value 'h'), Term))
  )

let rec find t xs =
  match (t,xs) with
  | (Node _    , [])    -> None
  | (Node (l,r), 0::ys) -> find l ys
  | (Node (l,r), _::ys) -> find r ys
  | (_,_)               -> Some (t,xs)

let decode xs =
  let rec  decode xs ys =
    match (find root ys) with
    | Some (Term,zs)     -> Some (xs,zs)
    | Some (Value t,zs)  -> decode (t::xs) zs
    | _                  -> None
  match (decode [] xs) with
  | None -> None
  | Some (ys,zs) -> Some (List.rev ys, List.length xs - List.length zs)

let parse (s:string) =
  let dec c = System.Convert.ToInt32(c.ToString(), 16)
  let rec bin n x =
    if n = 0 then [] else (x%2) :: bin (n-1) (x/2)
  s.ToCharArray() |> Array.map (dec >> bin 4) |> List.concat

let solve (s:string) =
  match (parse s |> decode) with
  | Some (xs,c) -> System.String(List.toArray xs) + ":" + c.ToString()
  | None        -> "*invalid*"

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "16d9d4fbd" "ethanol:30"
  test "df" "e:5"
  test "ad7" "c:10"
  test "870dcb" "t:6"
  test "880f63d" "test:15"
  test "a57cbe56" "cat:17"
  test "36abef2" "roll:23"
  test "ad576cd8" "chant:25"
  test "3e2a3db4fb9" "rails:25"
  test "51aa3b4c2" "eeeteee:18"
  test "ad5f1a07affe" "charset:31"
  test "4ab8a86d7afb0f" "slideshare:42"
  test "ac4b0b9faef" "doctor:30"
  test "cafebabe" "nlh:17"
  test "43e7" "sra:15"
  test "53e7" "eera:15"
  test "86cf" "tera:16"
  test "b6cf" "hon:15"
  test "0" "*invalid*"
  test "c" "*invalid*"
  test "d" "*invalid*"
  test "e" "*invalid*"
  test "babecafe" "*invalid*"
  test "8d" "*invalid*"
  test "ad" "*invalid*"
  test "af" "*invalid*"
  test "ab6e0" "*invalid*"
  test "a4371" "*invalid*"
  test "a4371" "*invalid*"
  test "96e3" "*invalid*"
  test "0dc71" "*invalid*"
  test "2a9f51" "*invalid*"
  test "a43fb2" "*invalid*"
  test "ab6e75" "*invalid*"
  test "a5dcfa" "*invalid*"
  test "ca97" "*invalid*"
  test "6822dcb" "*invalid*"
  0
```
raspberry pi + 無線LANアダプタでWPA接続

###### raspberry pi + 無線LANアダプタでWEP接続

http://d.hatena.ne.jp/pasela/20121224/raspi_wlan

###### raspberry pi + 無線LANアダプタでWPA接続

ルーターがWPA接続の場合は、上記にあるようなiwconfigではだめで、wpa_passphraseを使う必要がある。以下、設定手順。

`su -`
`wpa_passphrase SSID KEY > /etc/wpa_supplicant/wpa_supplicant.conf`

次に以下のコマンドを使い、wpa_supplicant/wpa_supplicant.confに「proto=WPA WPA2」と「key_mgmt=WPA-PSK」と「pairwise=CCMP TKIP」を追加する。

`nano  /etc/wpa_supplicant/wpa_supplicant.conf`
（内容は省略）

次に`nano  /etc/network/interfaces`から設定を一部変更する。

```interfaces
#iface wlan0 inet manual
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

と変更して、ネットワーク関連のデーモンを再起動

`/etc/init.d/networking restart`

最後にスーパーユーザから抜ける
`exit`

- - -
使用した無線LANアダプタ：WLI-UC-GNM2
使用したOS：2013-02-09-wheezy-raspbian
使用したRPi：Raspberry Pi Model B
DebianでのWPA接続設定については
http://www.miuxmiu.com/archives/2011/06/10/linux_ubuntu_debian_wpa_wireless_lan_settings_command.html
を参考に致しました。
wordpress on nginxで良い感じのurlを実現する

wordpressのcategoryとかうまく使いなはれ。。。という意見が大多数だとは思われるが、漢にはやらねばならぬ時があるのです。

想定するのはこんなケース。

/items/7/10 というURLにアクセスされたら、/itemsページに割り当てられたテーマでページを表示しつつ、クエリパラメータとして7と10を p1=7&p2=10 と言った感じで渡したい。

最初はnginxのrewrite使って/items?p1=7&p2=10とかすれば良いんでは？と思ったのだけど、それだとページが見つからないと怒られる。で、wp_rewriteの中身をみてみると、設定の中に

 /index.php?pagename=$matches[1]&paged=$matches[2]

という値があったので、

 rewrite /items/([0-9]+)/([0-9]+)$ /index.php?pagename=items&p1=$1&p2=$2;

してみたらうまくいった。

pagenameの値を見てどのページを表示するか（≒私の場合はどのテーマを使うか）を判断してるようなので、そこに適切な値を設定してあげれば良い。
備忘: clang++でC++11のスレッド

備忘です。
FreeBSD 9.1-RELEASEでclang++でC++11のスレッドを含むプログラムのビルド方法。

以下のソースコードを

```C++:hello_thread.cpp
#include <iostream>
#include <chrono>
#include <thread>

void f()
{
        std::chrono::milliseconds ms(500);
        for (int i = 0; i < 10; i++) {
                std::cout << __func__ << "()" << std::endl;
                std::this_thread::sleep_for(ms);
        }
}

int main(void)
{
        std::thread thr(f);

        std::chrono::milliseconds ms(250);
        for (int i = 0; i < 10; i++) {
                std::cout << __func__ << "()" << std::endl;
                std::this_thread::sleep_for(ms);
        }

        thr.join();

        return 0;
}
```

を以下のコマンドでビルド。

`clang++ -std=c++11 -stdlib=libc++ -o hello_thread hello_thread.cpp -lpthread`

pthreadライブラリのリンクは必須みたい。

↓実行結果はこんな感じ

```
> ./hello_thread
main()
f()
main()
f()
main()
main()
f()
main()
main()
f()
main()
main()
f()
main()
main()
f()
f()
f()
f()
f()
>
```
Railsのファイル入出力に関して

単純にrubyでのファイル入出力を応用します

まずはファイルへの書き込み

```ruby
f = File.open('file.txt', 'w') # wは書き込み権限
f.puts test
f.close
```

デフォルトだと
application/
    /app
    /db
    /config
    /file.txt

の位置に出来るので,
好みで

```ruby
f = File.open('./app/assets/file.txt', 'w')
```

のようにするのがオススメ

読み込みは 
wを
r
にするだけ!
x++;

# 単項演算子++について

## C

```c:hoge.c
#include <stdio.h>

void func(int a, int b, int c);

int main(void) {
	int x = 0;

	func(x++, x++, x++);

	return 0;
}

void func(int a, int b, int c) {
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
}
```

### 実行結果

C++も同様

```
$ cc hoge.c
$ ./a.out
2
1
0
```

## 次にJava

```java:Hoge.java
public class Hoge {
	public static void main(String[] args) {
		int x = 0;

		func(x++, x++, x++);
	}

	static void func(int a, int b, int c) {
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
	}
}
```

### 実行結果

```
$ javac Hoge.java
$ java Hoge
0
1
2
```

## PHP
```php:hoge.php
<?php

$x = 0;

func($x++, $x++, $x++);

function func($a, $b, $c) {
	echo $a;
	echo $b;
	echo $c;
}
?>
```
### 実行結果

```
012
```

## まとめ

- ++演算子使える言語って意外と知らなかった。

Perlにも++があるらしい……。

- Cは関数の引数を右から評価?

C言語の規格(ISO/IEC 9899:2011)を参照してみたところ、[C11](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf "ISO/IEC 9899:2011") のSection 6.5.2 に書いてあった。shunichi_sanさんのコメントのリンク先(該当箇所の日本語訳、解釈)によると、1行中に2回以上副作用を用いてはいけないらしい。

規格に違反するコードなため、値の評価は処理系依存ということのようだ。今回の実行環境cygwin+gccではたまたま右から評価される。

- Java、phpはメソッド、関数の引数を左から評価?

[The Java® Language Specification 15.12.4.2](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.4.2)によると、Javaは引数の評価が必ず左から行われる。

[phpのリファレンスマニュアル](http://php.net/manual/ja/functions.arguments.php)によると関数の引数は必ず左かららしい。

## 参考文献

- "ISO/IEC 9899:2011," http://www.open-std.org/jtc1/sc22/wg14/www/standards .
- "The Java® Language Specification Java SE7 Edition," http://docs.oracle.com/javase/specs/jls/se7/html/index.html .
- "PHP Manual," http://php.net/manual/ja/functions.arguments.php .
UbuntuServer12.04でphpenv+php-build使ってみる

[CHH/phpenv](https://github.com/CHH/phpenv)
[CHH/php-build](https://github.com/CHH/php-build)

# phpenv？

> Sets up a separate rbenv environment for PHP

だそうです。
rbenvのように、phpのバージョンをかなり細かく切り替えられます。
\# ちうか、内部的にrbenv利用してます。
また、こいつ自身にPHPをビルドする能力はないので、php-buildを利用します。

# 必要なライブラリ

```text
$ sudo apt-get update
$ sudo apt-get install git git-core curl build-essential libxml2-dev \
libssl-dev libcurl4-gnutls-dev libjpeg-dev libpng12-dev libmcrypt-dev \
libreadline-dev libtidy-dev libxslt1-dev autoconf
```
必要最小限なのかどうかは分かんないんですけど、まあこれで全部通ります。

# phpenv持ってくる
参考：[モダンなPHP開発環境を構築する  &#8211;  phpenv + php-build で 複数のPHPバージョンを管理する | Creator Life](http://creator-life.net/modern-php-env/)

```
$ cd ~
$ mkdir tmp && cd tmp
$ git clone https://github.com/CHH/phpenv.git
$ cd phpenv/bin
$ ./phpenv-install.sh
$ vi ~/.bashrc
...
PATH=$HOME/.phpenv/bin:$PATH
eval "$(phpenv init -)"
$ source ~/.bashrc
```

# php-build持ってくる
参考：[php-buildをphpenvのプラグインとして利用  &#8211;  phpenvとphp-buildで作るモダンなPHP開発環境 | Creator Life](http://creator-life.net/phpbuild-for-phpenv/)

```
$ git clone https://github.com/CHH/php-build ~/.phpenv/plugins/php-build
```

# php入れる
```text
$ phpenv install 5.4.14
$ phpenv global 5.4.14
$ phpenv rehash
$ php -v
PHP 5.4.14 (cli) (built: Apr 29 2013 17:34:32) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans
```
Ruby 2.0 で gem mirror を使えるようにする


ローカルに gem を全部持ってきてくれる `gem mirror` っていう便利コマンドがあるんだけど、Ruby 2.0.0 で動かない 

```sh
$ gem install rubygems-mirror
Successfully installed rubygems-mirror
```
って出てても

```sh
$ gem mirror
ERROR: Install the rubygems-mirror gem for the mirror command 
```

って言われて、してるわ！！！ って起こってもしょうがないので調べてみたら `issues` あがってた。

[doesn&#39;t work with Ruby 2.0 · Issue #19 · rubygems/rubygems-mirror](https://github.com/rubygems/rubygems-mirror/issues/19)

なーんだ、俺だけじゃないんだと思ったけど何も解決してないので無理やり解決した。

```ruby
require 'rubygems/mirror/command'                                                                                                                                                              
                                                                                                                                                                                               
Gem::Commands::MirrorCommand.new.execute   
```

上記を実行するだけ、
`pry` でも 上記をファイルに保存して実行でもどちらでも行けると思う…… が、俺もさっき実行し始めたので結果が分かるのは明日かなｗｗ
GW's working 29-Apr(mon) - 2013

## todo

#### パーフェクトPHP 第8章ミニブログアプリケーション開発
###### ユーザーアカウント
* アカウント登録
* ログイン
* ログアウト

予想工数:__各1Hずつ__ (_15:30 - 18:30_)

## Contents
### アカウント登録
AccountController:registerActionメソッド

```php:AccountController.php
public function registerAction(){
     
    //varidation check
    .
    .
    .

    //snip   

return controller::render(array(
    'user_name' => $user_name,
    'password' => $password,
    'error' => $errors,
    '_token' => $csrfToken,
), 'signup');
}

```

```php:Controller.php
/*
*ビューファイルのレンダリング
*/
class Controller
{
    public function render($variables = array(),  $template, $layout = 'layout')
    {
        $defaults = array(
            'request' => $this->request;
            'base_url' => $this->request->getBaseUrl(),
            'session' => $this->session
        );    

        $view = new View($this->application->getViewDir(), $default;

        //snip

        return $view->render($path, $variables, $layout);
    }
}

```
```php:View.php
class View
{
    public funciton render($_path, $_varialbes = array(), $_layout = false)
    {
        ob_start();
        ob_implicit_flush(0);
        require $_file;
        $contents = ob_get_clean();

        return $content;
    }
}
```


### PHP 抑えておくべき事
######[extract関数](http://php.net/manual/ja/function.extract.php)
連想配列のキー名で変数が作られる(あまり使えなさそう)

######[ob_start関数](http://www.php.net/manual/ja/function.ob-start.php), [ob_implicit_flush関数](http://php.net/manual/ja/function.ob-implicit-flush.php), [ob_get_clean関数](http://php.net/manual/ja/function.ob-get-clean.php)



クラスのインスタンス生成時に引数を指定してやると、コンストラクタに渡される(知らなかった...)

```php:sample
<?php

class Hoge
{
    protected $item;    

    function __construct($hoge)
    {
        $this->item = $hoge;
    }

    public function out()
    {
        return $this->item;
    }
}

$object = new Hoge('test');

echo $object->out();

?>
```

```php:実行結果
test
```
Railsでswfファイルを扱う方法

色々試したけど、

/app/assets/javascripts/test.swf

として、

ビューで

```ruby
<embed src="<%= asset_path("test.swf") %>" type="application/x-shockwave-flash" />
```

とする。

何か他に良い方法があれば教えて下さい。
出来れば

/app/assets/swf
とか
/app/assets/flash
で管理したいですが…
Clojure での開発に役立つライブラリ一覧


プログラミング Clojure の第２版が出版されました。
amazon で一時的に在庫切れになってたりと思っていたより人気がある(でてきた？) Clojure。

そんな Clojure をこれから使い始める人のため、自分が使っているライブラリをリストアップしておきます。

<br>

## Web アプリケーション/フレームワーク

### [Ring](https://github.com/ring-clojure/ring)

WSGI(Python)、Rack(Ruby) の Clojure 版。

<br>

### [Compojure](https://github.com/weavejester/compojure)

Ring をベースにした軽量 Web フレームワーク。
Sinatra(Ruby) の Clojure 版。
Ring と作者が同じ。

<br>

### [lib-noir](https://github.com/noir-clojure/lib-noir)

  Ring ベースのアプリケーションで使えるユーティリティライブラリ。
  Noir っていう Compojure を内部的に利用していたフレームワーク(開発終了)から便利な機能(セッション、バリデーション等)を切り出したライブラリ。
  Compojure と一緒に使うことができます。

<br>

## テンプレートエンジン

### [Hiccup](https://github.com/weavejester/hiccup)

シンプルなテンプレートエンジンで Clojure のテンプレートエンジンとしては一番有名。
Ring, Compojure と同じ人が作っている。

<br>

### [Enlive](https://github.com/cgrand/enlive)

hiccup を使っているためほとんど使ったことないですが hiccup と共に Clojure のテンプレートエンジンとしてよく名前を見かけるのでリストアップしておきます。

<br>

## HTTP ライブラリ

### [clj-http](https://github.com/dakrone/clj-http)

HTTPリクエストを送るライブラリ。

<br>

## データベース/SQL

### [Korma](https://github.com/korma/Korma)

DB アクセスに使えるライブラリ。
SQL を柔軟に組み立て発行することができ、とても使いやすい。
使う際には、利用する DB (mysql, postgres, sqlite3, oracle など) に合わせた JDBC ドライバも必要になる。

<br>

## テストフレームワーク

### [Midje](https://github.com/marick/Midje)

repl で自動テストを走らせることができる。
自動テストを走らせている間も、repl としての機能をそのまま利用することができる。
メタタグにより、実行するテストを切り分けたりネストしてテストを書いたりでき、RSpec(Ruby)に似ている。

<br>

## 環境設定

### [Environ](https://github.com/weavejester/environ)

環境設定を統一的に扱うライブラリ。
現状は、環境変数、Java のシステムプロパティ、Leininge の Profiles を扱える。
Ring, Compojure, Hiccup と同じ人が作っている。

<br>

## 日付/時間

### [clj-time](https://github.com/KirinDave/clj-time)

Java の Joda Time をラップした日付/時間処理を便利にするライブラリ。

<br>

## JSON

### [Cheshire](https://github.com/dakrone/cheshire)

JSON をエンコード、デコードを行うライブラリ。
高速で Custom Encoders という機能を持っている。

<br>

## CSV

### [Clojure-CSV](https://github.com/davidsantiago/clojure-csv)

CSV ファイルを読み書きするライブラリ。

<br>

## ロガー

### [Timbre](https://github.com/ptaoussanis/timbre)

設定がシンプルなロガー。
プロファイリングに必要なライブラリを含んでいる。

<br>

ひとまず、こんなところでしょうか。
使ってみて便利だと思ったライブラリがでてきた際には、追記していきたいと思います。
ユーザー定義リテラルの例

某所で話題になったユーザー定義リテラル。
私自信、存在を知っているだけで書いたことはなかったので、書いてみた。

とはいえ
http://cpplover.blogspot.jp/2012/02/blog-post_16.html
にたぶん全部書いてあるので、このコードを見るよりも上記のリンク先を見るのがよいかもしれない。

```c++
// compiled with followings:
//    clang -c -std=c++11 udl.cpp
//    g++ udl.o

#include <iostream>

struct gram{
    double m;
    gram( double v ) : m(v){}
};

gram 
operator+( gram const & a, gram const & b )
{
    return gram( a.m + b.m );
}

std::ostream &
operator<<( std::ostream & o, gram const & g )
{
    return o << g.m << "g";
}

typedef unsigned long long ull_t;

gram operator "" _g( long double v ){  return gram( v );  }
gram operator "" _g( ull_t v ){  return gram( v );  }
gram operator "" _kg( ull_t v ){  return gram( v*1e3 );  }
gram operator "" _kg( long double v ){  return gram( v*1e3 );  }

int main()
{
    std::cout 
        << 1234_g << "\n"       // => 1234g
        << 10_g +0.2_kg<< "\n"       // => 210g
        << 1e2_g +1_kg<< "\n";       // => 1100g
    return 0;
}
```

仕事以外では是非乱用したい。

ちなみに `gram operator "" _μg( ull_t v ){/*略*/}` はコンパイルエラーだった。残念。

あと。
clang だけだとリンクが通らない。なんでだろ。
rsolrでデータの初期化(全削除)をする方法


rsolr(https://github.com/mwmitchell/rsolr)を用いてsolrのインデックスを全削除する方法
delete_by_queryで全件マッチさせて削除する。
もっといい方法がありそう。

```ruby:
solr = RSolr.connect(:url => "example.com/examples")
solr.delete_by_query '*:*'
solr.commit
```
いざというとき覚えておきたいgitコマンドまとめ


まだあわてるような時間ではございません。

## インデックス

1.コミットメッセージを間違えちゃった! -- _直前のコミットのやり直し_
2.そろそろブランチを整理しなきゃ! -- _ブランチの名称変更と削除_
3.間違ってコミットしちゃった! -- _コミットを取り消す3つのリセット_
4.別のブランチをプッシュしちゃった! -- _リモートブランチのリセットと削除_
5.コミットの順番を間違えちゃった! -- _コミットログの並べ替えと削除_
6.コミット細かすぎィ! -- _コミットログの統合と編集_
7.あのコミットさえあれば…! -- _他のブランチのコミットを適用する_
8.やばい!ハードリセットしたら消えちゃった! -- _過去の状態の復元_
9.masterにマージ後にバグ発生!どうする!? -- _コミットを打ち消すコミット_

## 1.コミットメッセージを間違えちゃった! -- _直前のコミットのやり直し_

エディタが立ち上がるので編集しましょう。コミットIDは変わります。

```bash
$ git commit --amend
```

## 2.そろそろブランチを整理しなきゃ! -- _ブランチの名称変更と削除_

バックアップ用にブランチを切って後で削除するという用途によく使っています。

#### ブランチ名変更

```bash
$ git branch -m <old_branch> <new_branch>
```

#### ブランチ削除

```bash
$ git branch -D <branch>
```

## 3.間違ってコミットしちゃった! -- _コミットを取り消す3つのリセット_

リセットはワーキングディレクトリとステージの状態によって3種類あります。

#### ワーキングディレクトリはそのままでステージとコミットをリセット

```bash
$ git reset <commit>
```

#### ワーキングディレクトリもステージもそのままでコミットだけリセット

```bash
$ git reset --soft <commit>
```

#### ワーキングディレクトリ, ステージ, コミットの全てをリセット

```bash
$ git reset --hard <commit>
```

## 4.別のブランチをプッシュしちゃった! -- _リモートブランチのリセットと削除_

共用リポジトリで使うと怒られたり泣かれたりするのでやめましょう。
そういうときは後述のrevertを使うと良いかもしれませんね。

#### リモートブランチのリセット

```bash
$ git push -f <repository> <commit>:<branch>
```

#### リモートブランチの削除

```bash
$ git push <repository> :<branch>
```

もしくは、1.7.0以降ならこちらでもOKです。

```bash
$ git push --delete <repository> <branch>
```

## 5.コミットの順番を間違えちゃった! -- _コミットログの並べ替えと削除_

エディタが立ち上がるので並べ替えたり削除したりしましょう。
push前にログを整理するのによく使われます。

```bash
$ git rebase -i <commit>
```

## 6.コミット細かすぎィ! -- _コミットログの統合と編集_

まずはエディタを立ち上げます。

```bash
$ git rebase -i <commit>
```

親コミットに統合したい子コミットの`pick`を`fixup`に書き換えます。
コミットメッセージを編集したいコミットは`pick`を`edit`にします。

```bash
pick xxxxxx parent
fixup yyyyyy child
edit zzzzzz hoge
```

## 7.あのコミットさえあれば…! -- _他のブランチのコミットを適用する_

リベースだと都合が悪いときに使います。

```bash
$ git cherry-pick <commit>
```

## 8.やばい!ハードリセットしたら消えちゃった! -- _過去の状態の復元_

落ち着いてください。全ての操作は記録されています。
ログから親コミットを指定してハードリセットします。

```bash
$ git reflog
zzzzzz HEAD@{0}: reset: moving to <commit>
yyyyyy HEAD@{1}: foo
xxxxxx HEAD@{2}: hoge
$ git reset --hard HEAD@{1}
```

## 9.masterにマージ後にバグ発生!どうする!? -- _コミットを打ち消すコミット_

revertして修正後に再度マージしましょう。
revertはコミットログに残ります。

```bash
$ git revert <commit>
```
MongoLabでshardingを有効にすべきか確認した記録

http://docs.mongodb.org/manual/core/sharded-clusters/
MongoLabではどうすべきだったろうとサポートを検索。

下記が引っかかる。

https://support.mongolab.com/entries/20188132-Does-my-application-need-sharding-

> Does my application need sharding?
> Most likely not! Check out Kristina Chodorow's very good article on this topic:
> 
> http://www.snailinaturtleneck.com/blog/2010/08/09/sharding-and-replica-sets-illustrated/
> 
> Kristina is a software engineer for 10gen.

<適当な訳>
アプリケーションはshardingする必要ありますか？
ほとんど必要ないよ！Kristina Chodorowのこのトピックにある（ http://www.snailinaturtleneck.com/blog/2010/08/09/sharding-and-replica-sets-illustrated/ ）とても良い文書を確認してみてね。

Kristinaは10genのソフトウェアエンジニアだよ。
</適当な訳/>

というわけで
http://www.snailinaturtleneck.com/blog/2010/08/09/sharding-and-replica-sets-illustrated/
を見る。

最初の段階で「Don’t use sharding」と書かれてあった。殆どの人は使う必要がないという事を述べてから、具体的な内容の解説に入っている。親切な文章。
virtual boxの仮想マシンがtagged VLANのネットワークに接続する方法

記憶をたよりに書いているので、間違っていたらごめんなさい。
## モチベーション
* 複数の仮想マシンを同じVLANに接続したい
	- 説明のために、VLAN100とする
* 仮想マシンにはVLANを意識させたくない
	- 設定が面倒なので
* NICは1枚
	- IEEE802.1Qのtagged VLANを活用する
* ホストマシンにはVLAN100のIPアドレスを振りたくない

## 試した環境
ホストマシン: ubuntu 12.04.2 LTS 64bit
仮想マシン: ubuntu 12.04.2 LTS 64bit (vagrantの配布しているイメージを利用)

## 設定手順
1. ホストマシンにtagged VLAN用パッケージを導入する

		sudo apt-get install vlan

2. ホストマシンのVLANの設定をする

		# vlan用のモジュールを読み込む
		sudo modprobe 8021q
		# 再起動後にも有効になるようにする
		sudo vim /etc/modules
		ファイルの末尾に8021qと追記
		# vlanのインターフェスを追加
		# 例: eth0に対してVLAN id 100のタグをつけたパケットを流したいとき
		sudo vconfig add eth0 100

3. 本当に追加されたかチェック

		# うまくいっていれば、eth0.100というインタフェースが見える
		ifconfig

		# もし見えていなければ、以下のコマンドを試してみる
		# sudo ifconfig eth0.100 up

	ここでVLAN id 100に対応するIPアドレスをeth0.100に割り当てる必要はない。

4. 仮想マシンのネットワークを設定する

		Virtual Boxの仮想マシンの設定でeth0.100とのブリッジ接続のインタフェースを追加する
		# CLI から設定する場合はVBoxManage modifyvm コマンドを活用すると思われる

5. 仮想マシンを立ち上げて、ネットワークにつながるか確認する

	仮想マシンにログインして、DHCPでよければDHCP、固定IPアドレスならIPアドレスを割り当てる。
	ubuntuのネットワークをCLIで設定する場合は /etc/network/interfaces を編集する。
	仮想マシン上でroute コマンドで、default gatewayが複数存在しないか確認する（仮想マシンに複数nicを設定している場合はよくはまる）。

	vagrantのページからダウンロードできるprecise64は、/etc/rc.d/rc.local でデフォルトゲートウェイの設定を行っているので、ここを修正する必要があるかも。

## 課題
* ホストマシン再起動時にvlanのインタフェースが消えてしまうので、vconfig add, ifconfig up をもう一度やる必要がある

/etc/network/intefaces にeth0.100を構成する設定を追加すればよいという記述を見るが、うまくいかない。

## そのほか
* ほかの仮想化環境(vmplayer等)でも同じように設定できそう
個人用Gitメモ

にわかGitユーザが日々躓いたことを書いていくためのメモ(になる予定)

## ユーザ名とメールアドレスを設定する

`git config --global user.name "rsooo"`
`git config --global user.email "rsooo@hogehoge.com"`

まず最初にこれをやる。

## addしたファイルを取り消したい。
 `git reset <filename>` でOK。

## Gitで管理していたファイルを.gitignoreで除外したい/除外したいファイルを間違えてaddしていて、除外させたい

` git rm -- cached $file`

で一度ファイルを除外してやればOK
意図しないファイルがgit管理下に入ってしまったことでpull したときに "The following untracked working tree files would be overwritten by merge:"とか言われたりする。

## まだcommitされていない編集を無かったことにしてHEADに戻したい
` git reset --hard HEAD^`

上記は編集内容が取り消されるが、
単純にaddを取り消したい時は、以下のコマンドでOK

` git reset [HEAD]`

## リモートのpush先を追加/参照したい

` git remote -v`
` git add heroku git@XXXX.git`

リモートのpush先の追加は、herokuはgithubにpushしたい時によく使う。
push先を追加しておけば、以下のようにpushできる。

` git push heroku master`

## 編集内容を一時的に退避させたい/戻すには

` git stash`

現状の変更内容が退避され、HEADの状態に戻る
stashした情報を確認、戻すには

` git stash list`
` git stash apply "ID"`
` git stash pop "ID"`

stash popするとstashした情報は削除される。


## リモートブランチの変更を取得したい

`git fetch`
`git branch -a`

`git fetch` でリモートブランチの状況を反映し、
`git branch -a` でリモートブランチの内容も含めて確認できる。

## git fetch と git pull ってどう違うの？

`git pull` は `git fetch` してから `git merge origin master` と同じ。


##  自分のローカルブランチをリモートのmasterにpushしたい

`git push origin local_branch:master`

上記のコマンドで自分のローカルブランチ"local_branch" の内容をリモートのmaster に対してpushできる。

## 一つ前のコミットを見たいとき

`git show HEAD~` HEADが今いるブランチの最新のコミットを指す。
HEAD~ がそれよりひとつ前のコミット。 HEAD~~ なら2つ前。

## コミットを取り消したい
コミットのみを取り消して、ワーキングディレクトリの修正点は残したい場合、
`git reset --soft HEAD^`

ワーキングディレクトリごと戻したい場合、
`git reset --hard HEAD^`

## 異なるブランチ名でpushしたい
以下の書式で可能
`git push #{remote_name} #{local_branch}:#{remote_branch}`

## リモートブランチをローカルブランチとしてチェックアウトする

`git checkout -b local-branch-name origin/remote-branch`

## ブランチの削除

`git branch -d local-branch-name`
Admin用ページを作るのに使えそうなjavascript(主にjQuery)ライブラリ集 - WrapBootstrapより


## Inlineグラフ描画

### sparkline
- http://omnipotent.net/jquery.sparkline/#s-about

### Peity
- http://benpickles.github.io/peity/

## グラフ描画

### Flot
- http://www.flotcharts.org/

### Knob
- http://anthonyterrien.com/knob/


## Notification

### Glitter
http://boedesign.com/demos/gritter/

### pnotify
http://pinesframework.org/pnotify/


## Code Editor

### Ace Editor
- http://ajaxorg.github.io/ace/#nav=about


## Rich-text Editor

### wysihtml5
- http://xing.github.io/wysihtml5/


## Modern Form Element 

### select2
- https://github.com/ivaynberg/select2

### uniform
- http://uniformjs.com/

### colorpicker
- http://www.eyecon.ro/colorpicker/
- http://bgrins.github.io/spectrum/

### datepicker
- http://jqueryui.com/datepicker/

### validation
- http://bassistance.de/jquery-plugins/jquery-plugin-validation/

### wizard
- https://github.com/thecodemine/formwizard
- https://github.com/kflorence/jquery-wizard


### 参考
https://wrapbootstrap.com/themes/admin
ruby2.0.0 では nil に to_h メソッドがあるらしい。

ruby 2.0.0 から Nil#to_h が追加されました。これの何が嬉しいかというと、
ruby 1.9.3 以前だと Hashクラスを期待するオブジェクトがnilだった場合の対応として、オブジェクトに{}を代入して、nilからHashオブジェクトに変換して、後の処理を同一に出来るようにしたりします。（僕だけですかね）

``` ruby:hash_error.rb
# 変換しないままだと、添字メソッドを呼ぶことが出来ず例外が発生する。
def hash_error(hash)
  hash["hoge"] # デフォルトを定義しない場合
end

hash_error({"hoge" => "fuga"}) #=> "fuga"
hash_error(nil) #=> undefined method `[]' for nil:NilClass (NoMethodError)
```

``` ruby:hash_normal.rb
# 変換すると添字メソッドが呼ばれ例外が発生せず、nilが返る({}なので"hoge"キーは定義されていない
def hash_normal(hash)
  (hash || {})["hoge"] # デフォルトを定義する場合
end

hash_normal({"hoge" => "fuga"}) #=> "fuga"
hash_normal(nil) #=> nil
```

今までは、このように (hash || {}) としてnil回避をしていましたが、ruby2.0.0からはNil#to_hが追加されたので、以下のように書くことが出来ます。

``` ruby:hash_normal2.rb
def hash_normal(hash)
  hash.to_h["hoge"] # ruby2.0.0 では to_h でデフォルト定義ができる。
end
```

これでまた一つrubyから記号が消えたのであった。
Expect.jsのREADMEを和訳してみた｡

# Expect.js

[should.js](http://github.com/visionmedia/should.js)をべースに開発されたミニマムなBDDアサーションライブラリ。

```js
expect(window.r).to.be(undefined);
expect({ a: 'b' }).to.eql({ a: 'b' })
expect(5).to.be.a('number');
expect([]).to.be.an('array');
expect(window).not.to.be.an(Image);
```

## 特徴

- クロスブラウザ: IE6+, Firefox, Safari, Chrome, Operaで動作する｡
- 全てのテスティングフレームワークと併用可能｡
- Node.JSで使用可能(`require('expect.js')`).
- スタンドアローン

## 使い方

### Node

npmを利用してインストール｡

```sh
$ npm install expect.js
```
```js
var expect = require('expect.js');
```

### ブラウザ

```html
<script src="expect.js"></script>
```

## API

**ok**: 値が _truthy_ か否か検証｡

```js
expect(1).to.be.ok();
expect(true).to.be.ok();
expect({}).to.be.ok();
expect(0).to.not.be.ok();
```

**be** / **equal**: 厳密等価演算子を用いて値を検証｡

```js
expect(1).to.be(1)
expect(NaN).not.to.equal(NaN);
expect(1).not.to.be(true)
expect('1').to.not.be(1);
```

**eql**: 等価演算子で等価な値か検証(objectも含む)｡

```js
expect({ a: 'b' }).to.eql({ a: 'b' });
expect(1).to.eql('1');
```

**a**/**an**: typeof演算子を用いて指定したデータ型の値か検証｡array､instanceof演算子に対応｡

```js
// typeof with optional `array`
expect(5).to.be.a('number');
expect([]).to.be.an('array');  // works
expect([]).to.be.an('object'); // works too, since it uses `typeof`

// constructors
expect(5).to.be.a(Number);
expect([]).to.be.an(Array);
expect(tobi).to.be.a(Ferret);
expect(person).to.be.a(Mammal);
```

**match**: 文字列が正規表現に一致するか検証｡

```js
expect(program.version).to.match(/[0-9]+\.[0-9]+\.[0-9]+/);
```

**contain**: 文字列･配列の中に値が含まれているか検証｡

```js
expect([1, 2]).to.contain(1);
expect('hello world').to.contain('world');
```

**length**: 配列のlengthプロパティを検証｡

```js
expect([]).to.have.length(0);
expect([1,2,3]).to.have.length(3);
```

**empty**: 配列が空か否かを検証｡

```js
expect([]).to.be.empty();
expect({}).to.be.empty();
expect({ length: 0, duck: 'typing' }).to.be.empty();
expect({ my: 'object' }).to.not.be.empty();
expect([1,2,3]).to.not.be.empty();
```

**property**: プロパティの存在を検証(値もオプションで指定可能)｡

```js
expect(window).to.have.property('expect')
expect(window).to.have.property('expect', expect)
expect({a: 'b'}).to.have.property('a');
```

**key**/**keys**: オブジェクトのキーの存在を検証｡

```js
expect({ a: 'b' }).to.have.key('a');
expect({ a: 'b', c: 'd' }).to.only.have.keys('a', 'c');
expect({ a: 'b', c: 'd' }).to.only.have.keys(['a', 'c']);
expect({ a: 'b', c: 'd' }).to.not.only.have.key('a');
```

**throwException**/**throwError**: 関数が呼ばれた際に例外を投げるか否かを検証｡

```js
expect(fn).to.throwError(); // synonym of throwException
expect(fn).to.throwException(function (e) { // get the exception object
  expect(e).to.be.a(SyntaxError);
});
expect(fn).to.throwException(/matches the exception message/);
expect(fn2).to.not.throwException();
```

**within**: 数値が範囲内かを検証｡

```js
expect(1).to.be.within(0, Infinity);
```

**greaterThan**/**above**: ｢より大きいか｣を検証｡

```js
expect(3).to.be.above(0);
expect(5).to.be.greaterThan(3);
```

**lessThan**/**below**: ｢より小さいか｣を検証｡

```js
expect(0).to.be.below(3);
expect(1).to.be.lessThan(3);
```

**fail**: 明示的にテストを失敗させる｡

```js
expect().fail()
expect().fail("Custom failure message")
```
herokuコマンドをgemでインストールしたものからheroku toolbeltのものに置き換える


heroku gemをインストールしようとすると以下のようにdeprecatedだというメッセージがでます。

```console
 !    The `heroku` gem has been deprecated and replaced with the Heroku Toolbelt.
 !    Download and install from: https://toolbelt.heroku.com
 !    For API access, see: https://github.com/heroku/heroku.rb
```

herokuの操作をコマンドラインからする際に使うheroku CLIは、以前はgemで提供されていましたが、最近はheroku toolbelt経由でインストールするのが公式には推奨されているようです。


というわけで、gemでインストールしたものをアンインストールしてtoolbeltをインストールする手順です。

まず、使っているheorkuコマンドがgem経由であるか確かめます。

```console
$ heroku version
heroku-gem/2.39.2 (x86_64-darwin11.4.0) ruby/1.9.3
```

のように`heroku-gem`と表示されたらgem経由であることがわかります。toolbelt経由の場合は`heroku-toolbelt`と表示されます。

## heroku gemのアンインストール

基本的には`gem uninstall`するだけです。

```console
$ gem uninstall heroku
Remove executables:
	heroku

in addition to the gem? [Yn]
Removing heroku
Successfully uninstalled heroku-2.39.2
```

rbenvを使っていて、他のrubyのバージョンでもheroku gemを使っていた場合は以下の様なメッセージがでます。

```console
$ heroku
rbenv: heroku: command not found

The `heroku' command exists in these Ruby versions:
  1.9.3-p194
```

この場合は表示されたそれぞれのrubyのバージョンで`gem uninstall`します。

```console
$ rbenv shell 1.9.3-p194
$ gem uninstall heroku
```

## heroku toolbeltのインストール

https://toolbelt.herokuapp.com/

からダウンロードしていれるだけ。

今後は自動でアップデートされるようになります。

```console
$ which heroku
/usr/bin/heroku
$ heroku version
heroku-toolbelt/2.39.2 (x86_64-darwin10.8.0) ruby/1.9.3
```

## 参考

Heroku公式ブログ https://blog.heroku.com/archives/2012/10/15/upgrading-to-the-heroku-toolbelt
anything-c-moccur.elの検索を1文字から始める

`anything-occur`は1文字から検索をしてくれますが、`anything-c-moccur-occur-by-moccur`は3文字以上ないと検索をしてくれません。

そこで、`anything-c-moccur.el`を読んでみると`requires-pattern`が何文字以上あると検索をするかを表しているようなので以下を修正しました。

```scm:anything-c-moccur.el
@@ -441 +441 @@
-    (requires-pattern . 3)
+    (requires-pattern . 1)
@@ -494 +494 @@
-    (requires-pattern . 5)
+    (requires-pattern . 1)
@@ -583 +583 @@
-    (requires-pattern . 5)
+    (requires-pattern . 1)
@@ -621 +621 @@
-    (requires-pattern . 3)
+    (requires-pattern . 1)
```

これで、`anything-c-moccur-occur-by-moccur`、`anything-c-moccur-buffer-list`、`anything-c-moccur-dmoccur`、`anything-c-moccur-dired-do-moccur-by-moccur`が1文字から検索をしてくれるようになりました。

ただし、動作が重くなるので注意してください。
第10回オフラインリアルタイムどう書くの参考問題をCoffeeScriptで解く

```coffeescript

test = (actual, expected) -> return ( if actual is expected then 'ok' else '***NG***' )

rank = (s) -> {'X' : 10, 'J' : 11, 'Q' : 12, 'K' : 13, 'A' : 1}[s] || parseInt(s, 10)

isRoyalFlash = (hand) ->
    for i in hand
        sortedStr = i.split(//).sort( (x, y) -> rank(x) - rank(y) ).join('')
        return true if 'AXJQK'.indexOf(sortedStr) isnt -1
    false

hasSequence = (hand) ->
    for i in hand
        sortedStr = i.split(//).sort( (x, y) -> rank(x) - rank(y) ).join('')
        sortedStrs = if sortedStr[0] is 'A' then [sortedStr, sortedStr.replace('A', '') + 'A'] else [sortedStr]
        for j in sortedStrs
            return true if 'A23456789XJQKA'.indexOf(j) isnt -1
    false

permutation = (ary) ->
    ret = ['']
    for i in ary
        tmp = ret
        for j in tmp
            ret.push(i + j) unless i is j
    ret

solve = (src) ->
    str = src.replace(/10/g, 'X')
    values = (str.split(/([^shdc]+)[shdc]/).filter (x) -> x.length isnt 0)
    keys = str.split(/[^shdc]+([shdc])/).filter (x) -> x.length isnt 0
    h = { 's' : '', 'h' : '', 'd' : '', 'c' : ''}
    h[key] += values[i] for key, i in keys
    suits = [ (h['s'].length || -1), (h['h'].length || -1), (h['d'].length || -1), (h['c'].length || -1) ]
    if Math.max.apply(null, suits) is 5
        hand = permutation(values).filter (x) -> x.length is 5
        return if isRoyalFlash(hand) then 'RF' else if hasSequence(hand) then 'SF' else 'FL'
    hand = permutation(values).filter (x) -> x.length is 5
    return 'ST' if hasSequence(hand)
    if Math.max.apply(null, suits) is 4
        hand = permutation(values).filter (x) -> x.length is 4
        key = { 0 : 's', 1 : 'h', 2 : 'd', 3 : 'c' }[suits.indexOf(Math.max.apply(null, suits))]
        reg = RegExp( '([^shdc]+)[' + key + ']' )
        values = str.split(reg).filter (x) -> x.length is 1
        hand = permutation(values).filter (x) -> x.length is 4
        return if values.length is 4 and hasSequence(hand) then '4SF' else '4F'
    hand = permutation(values).filter (x) -> x.length is 4
    return if hasSequence(hand) then '4S' else '-'

console.log( test( solve('Qs9s3dJd10h'), '4S' ) )

```
npm の使い方

Node Packaged Modules

npm のインストールはこちら.
node.js をインストールすれば同封されてくる.
https://gist.github.com/Itomaki/d22c56c1a1bf2b431292

# npm install からわかること

npm なるものが便利そうなので, まずマニュアルを読む.
https://gist.github.com/Itomaki/8d719b9769603ad4214c

npm を使ったパッケージを作るためには, package.json を書かなければならない.

パッケージ
a) package.json, 配布物を含むディレクトリ.
b) (a) を tarball で gip したもの.
c) (b) を指す url.
...
g) (b) を指す git remote url.

# package.json の書き方
https://gist.github.com/Itomaki/f262659385b0989be233

# npm build
ルートディレクトリに package.json を含むディレクトリをパッケージとしてビルドする.
Poltergeist + Rspec + Capybara導入のメモ


PoltergeistをRailsの統合テストに組み入れた。

Railscasts#391 http://railscasts.com/episodes/391-testing-javascript-with-phantomjs?view=asciicast を参考にした。

しかし、いくつかRailscastsには書かれていない変更点があった。

## Poltergeistの設定

Poltergeistを組み入れて

```
$ rspec
```

したところ、

```
An error occurred in an after hook
  Capybara::Poltergeist::TimeoutError: Timed out waiting for response to …
```

というエラーが発生した。
Poltergeistの説明書( https://github.com/jonleighton/poltergeist/issues/169 )を読んだところ、

```spec_helper.rb
Capybara.javascript_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, :js_errors => false, :timeout => 60)
end
```

とすればよいとわかった。各オプションについて以下に説明する。

### :js_errors

:js_errors => falseにしたのはCapybara::Poltergeist::JavascriptError: というエラーを防ぐため。JSのエラーはよくあることなのだが、エラーが出るたびにCapybaraを止めるのは時間の無駄。ということで、JSのエラーは無視することにした。

### :timeout

Timeoutはデフォルトでは30秒。しかし、ログインのような時間のかかるDB走査がある場合、30秒以上時間がかかることがある。そのため、60秒に設定した。


## データベースの問題

Factory Girlで作ったはずのモデルが読み込めなかったりするのは、1つ1つのテストが別のデータベーストランザクションで行われいるのが原因。……とRyan Bates( http://railscasts.com/episodes/391-testing-javascript-with-phantomjs?view=asciicast )が言っている。

なので、ActiveRecord::Baseをオーバーライドして修正。

```/spec/support/share_db_connection.rb
class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil
 
  def self.connection
    @@shared_connection || retrieve_connection
  end
end
 
# Forces all threads to share the same connection. This works on
# Capybara because it starts the web server in a thread.
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
```

これでOK。
CodeIgniterで複数環境の取り扱いが微妙だったので改造してみた


*3.x系では同様の方法で環境を切り替えられるようになっているようです。*

---

CodeIgniterで複数環境を扱うとき皆さんどうしているのでしょうか。

参考）
複数の環境の取扱い
http://codeigniter.jp/user_guide_ja/general/environments.html
configの設定
http://codeigniter.jp/user_guide_ja/libraries/config.html#environments

index.phpに記述してある以下のコードで環境を変えているのですが

```index.php
define('ENVIRONMENT', 'development');
```

本番環境にしたいときは以下のように修正するってことです。

```index.php
define('ENVIRONMENT', 'production');
```

index.phpも含めてgitに入ったりしているわけだからそれを環境変えた時に変更して置いておくのもなぁ…

index.phpの上の部分を以下のように修正

```index.php
define('ENVIRONMENT', isset($_SERVER["ENVIRONMENT"]) ?  $_SERVER["ENVIRONMENT"] : 'development');
```

サーバーの環境変数で環境が決定できるようにしました。

nginx+php-fpmの場合

```nginx(php-fpm)
server {
	...
	location ~* \.php$ {
		...
        fastcgi_param  ENVIRONMENT production;
    }
}

```

apacheの場合

``` apache2
<VirtualHost *:80>
	...
	SetEnv ENVIRONMENT production
</VirtualHost>
```

こんな感じでENVIRONMENTを設定してやるといけます。
Octopress に Pocket ボタンを追加する 

私は [Pocket](http://getpocket.com/) をかなり使い倒してます。何か興味深いページがあれば、「Pocketに追加する」で Pcket に保存しておき、後で読み返しながら興味深ければ Twitter でツイートして、後で使いそうな知識であれば Evernote に保存してお>きタグで整理しています。

さて、役に立つかどうかはわかりませんが、私の Github pages にも「Pocket に追加する」ようなボタンを追加したいと思います。

Pocket ボタンのコードを取得する
---------------------------------
[Pocket for Publishers: Pocket Button](http://getpocket.com/publisher/button)にクセスして、Pocket ボタンのコードを取得します。スタイルはお好みで選んでください。

_config.yml に設定を追加する
----------------------------
せっかくなので、設定で Pocket ボタンをオン／オフできるようにしてみます。

_config.yml の末尾に `pocket_putton` という属性を追加します。`git diff` を取った
ものが以下のコードです。

```diff:_config.yml
@@ -93,3 +93,6 @@

 # Facebook Like
 facebook_like: true
+
+# Pocket
+pocket_button: true
```

shareing.html を修正する
------------------------
source/_includes/post/sharing.html に先ほどのコードを貼り付けます。Pocket はなる
べく早く押せたほうがいいので、ソーシャルボタンの先頭になるようにします。貼り付け
たままだとインデントが気になるので、私は `Vim` 上から `:setlocal expandtab ts=2 sts=2 sw=2` とコマンドを入力して、`g=G` でインデントを修正しました。

横幅が長くなりますが `git diff` を取った結果は以下の通りになります。

```diff:source/_includes/post/sharing.html
@@ -1,4 +1,8 @@
 <div class="sharing">
+  {% if site.pocket_button %}
+  <a data-pocket-label="pocket" data-pocket-count="vertical" class="pocket-btn" data-lang="en"></a>
+  <script type="text/javascript">!function(d,i){if(!d.getElementById(i)){var j=d.createElement("script");j.id=i;j.src="https://widgets.getpocket.com/v1/j/btn.js?v=1";var w=d.getElementById(i);d.body.appendChild(j);}}(document,"pocket-btn-js");</script>
+  {% endif %}
   {% if site.twitter_tweet_button %}
   <a href="http://twitter.com/share" class="twitter-share-button" data-url="{{ site.url }}{{ page.url }}" data-via="{{ site.twitter_user }}" data-counturl="{{ site.url }}{{ page.url }}" >Tweet</a>
   {% endif %}
```

参考サイト
----------
- [5分でできる簡単 Octopress セッティング - 酒と泪とRubyとRails](http://morizyun.github.io/blog/octopress-hatena-disqus-new-tab/)
Deviseでメールアドレス以外のカラムをログイン認証に利用する


例えばアカウント名(accountカラム)で認証を行いたい場合はuserモデルに以下を追加する。

```ruby:models/user.rb
devise :authentication_keys => [ :account ]
```

さらにアカウント名、もしくはメールアドレスのどちらかで認証したい場合は入力値を受け取るための適当なattributeを追加し、self.find_first_by_auth_conditionsをオーバーライドすることで実現できる。

```ruby:models/user.rb
devise :authentication_keys => [ :login ]

attr_accessor :login

def self.find_first_by_auth_conditions(warden_conditions)
  conditions = warden_conditions.dup
  if login = conditions.delete(:login)
    where(conditions).where(["account = :value OR email = :value", { :value => login }]).first
  else
    where(conditions).first
  end
end
```
Railsのバリデーションで配列のサイズを制限する方法


Storyモデルのバリデーションを行う。
Storyがhas_many:taggings なとき、1つのstoryが持てるtaggingsの数を制限したい。

# 方法1: Sexy Validationを使う

taggingsはArrayなので、lengthメソッドあるいはsizeメソッドでサイズを知ることができる。だからもしかしてvalidatesで:lengthが使えるんじゃないかなーと思っていたら、

**使えた。**

```story.rb
  validates :taggings, :length => {
    :maximum   => STORY_TAGGINGS_LIMIT_SIZE,
    :too_long  => "タグ数が限界を超えました！　限界タグ数は%{count}です！"
  }
```

とすればバリデーションは完成。

なお、タグづけの方法は

- Railscasts#382 http://railscasts.com/episodes/382-tagging?language=ja&view=asciicast
- Railscasts#258(Revised) http://railscasts.com/episodes/258-token-fields-revised?view=asciicast

を参考にして作った。この場合は、taggingsを直接入力しないので

```story.rb
  validates :tag_ids, :length => {
    :maximum   => STORY_TAGGINGS_LIMIT_SIZE,
    :too_long  => "タグ数が限界を超えました！　限界タグ数は%{count}です！"
  }
```

のように、validatesの引数は:tag_idsや:tag_listに変えることになる。

# 方法2: 独自validate_eachメソッドを作る方法

上記のSexy Validationを使う方法がシンプルでよいのだけど、ほかの方法もある。
当初はvalidatesの:lengthオプションがarray相手に使えることを知らなかったので、以下の手法を用いた。

app/modelディレクリにsize_in_array_validator.rbというファイルを作る。

```size_in_array_validator.rb
class SizeInArrayValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if value.size > STORY_TAGGINGS_LIMIT_SIZE
      record.errors.add(attribute, "too much!")
    end
  end
end
```

modelディレクトリに入れれば自動的に読み込まれる。
app/model/story.rbの中に、以下のコードを入れる。

```story.rb
validates :taggings, :size_in_array => true
```

これでバリデーションが動いた。

参考：Railsで任意のValidateを設定するには？ QA@IT http://qa.atmarkit.co.jp/q/2508

## 不可解なエラー
独自validate_eachメソッドを作ったところ、Rspec 2.13.0 + Factory Girl 4.2.0でのエラーが発生した。

```
$ rspec
```

したら、

```
.../gems/activerecord-3.2.13/lib/active_record/validations.rb:56:in `save!': Validation failed: Email already exists. (ActiveRecord::RecordInvalid)
```

で、factory_girlがFactoryGirl.create(:story)を作る際になぜかsequenceが動かない……？　という状況になった。

独自バリデーションが原因な気がしたのでコメントアウトした。

```story.rb
# validates :taggings, :size_in_array => true
```

rspecをやりなおすと、エラーは発生しなかった。
どうしてこうなったのか本当によくわからない。
Sexy Validationを使えばこのエラーは発生しない。
rbenv で Ruby 2.0.0 をインストールするときに並列コンパイルする


```
$ MAKE_OPTS="-j 4" rbenv install 2.0.0-p0 
```

`MAKE_OPTS` 環境変数で `-j` と並列処理数を渡せばいい。

空港で

「コンパイル終わらないから Mac 閉じれないなり～」

って言ってたら mrkn に教えてもらった。
topcoder srm過去約300回の出題傾向

調べてみたのでメモ

topcoderのproblem archiveから
SRM577以前の約300回、TCOも含む


div1 easy
----------
[84, 'SimpleMath']
[79, 'SimpleSearch']
[79, 'Iteration']
[61, 'BruteForce']
[60, 'Greedy']
[44, 'Math']
[37, 'Simulation']
[33, 'StringManipulation']
[31, 'DynamicProgramming']
[25, 'Search']
[18, 'GraphTheory']
[17, 'Sorting']
[10, 'Geometry']
[8, 'StringParsing']
[6, 'Recursion']
[2, 'Encryption/Compression']
[1, 'AdvancedMath']


div1 medium
---------------
[109, 'DynamicProgramming']
[78, 'Math']
[55, 'GraphTheory']
[46, 'SimpleMath']
[46, 'Greedy']
[41, 'BruteForce']
[38, 'Search']
[29, 'SimpleSearch']
[29, 'Iteration']
[25, 'StringManipulation']
[21, 'Simulation']
[18, 'Recursion']
[14, 'Geometry']
[11, 'StringParsing']
[11, 'Sorting']
[5, 'AdvancedMath']
[2, 'Encryption/Compression']



div1 hard
-----------
[132, 'DynamicProgramming']
[93, 'Math']
[82, 'GraphTheory']
[48, 'Search']
[31, 'BruteForce']
[30, 'Greedy']
[29, 'Geometry']
[26, 'SimpleMath']
[21, 'Simulation']
[16, 'Sorting']
[16, 'SimpleSearch']
[16, 'Iteration']
[14, 'Recursion']
[11, 'StringManipulation']
[9, 'AdvancedMath']
[5, 'StringParsing']
[5, 'Encryption/Compression']
assert.deepEqual使用時の留意点

node.jsとmochaの組み合わせてテストしていた時に気づいたこと。

assert.deepEqualについて。
オブジェクトの最下位層まで一致しているか確認してくれるのがassert.deepEqual。
例えばこんな感じのオブジェクトが対象となるテスト。

```javascript
var example = {
  apartment: 'mansion111',
  room: {
    resident: 'Hanako',
    age: '26',
    properties: '',
    attr: {id: '1294'}
  }
};
```

こんなオブジェクトとassertしてくれるのがdeepEqual。
気づいた点が1つ。厳密な比較(===の比較)ではないということ。
まあ`assert.strictEqual`と`assert.Equal`があるわけだから'strict'がなかったら厳密な比較じゃないの当たり前じゃんって言われたらそうなのですが。。。

厳密比較でないため、上の`example`オブジェクトのageは'26'で文字列で、数値の26と比較するしてもエラーは発生しない（テストが成功する）。

実際にassert.jsのコードも読んでみると

```javascript
  // 7.4. Other pairs that do not both pass typeof value == 'object',
  // equivalence is determined by ==.
  } else if (typeof actual != 'object' && typeof expected != 'object') {
    return actual == expected;
}
```

ってなっている。

もしassert.deepEqualを使ってテストする場合は念のため頭の片隅に置いておくとよいかも。
vimでjavaのプロパティファイルを編集する

投稿が遅くなりましたが、この記事は[Vim Advent Calendar 2012](http://atnd.org/events/33746)の148日目の記事です。
前日はthincaさんによる、[意外と知られていないdiffに関する機能](http://d.hatena.ne.jp/thinca/20130426/1366910837)でした。

さて今日の話題は、javaのプロパティファイルをvimから編集しやすくする、という話になります。
(本当はneocomplcacheとclang\_complete、javacompleteを併用する際にハマったことについて書こうとしてたんですが、またハマったため予定変更しました。)
javaで文字列リソースを外部ファイルにまとめたいとき、一般的にはプロパティファイル(拡張子が.propertiesなファイル)が使われます。
実際のコーディングでは、java.util.ResourceBundleやjava.util.Propertiesといったクラスを用いて、プロパティファイルから読み込んだ文字列を利用するかと思います。

プロパティファイルを編集するとき困惑するのが、ascii文字しか含めることができない点です。
(仕様上、utf8を含めることができますが、ascii文字のみにしておいたほうが無難な気がします。)
なのでプロパティファイルに日本語を書きたい場合は、ユニコードエスケープした形式でascii文字のみに変換をかけます。
具体的には次のようになります。

```jproperties:example
# この日本語が
hoge=ほげ！
# このようにエスケープされる
hoge=\u307b\u3052\uff01 
```

一応、jdkに標準添付されている`native2ascii`というツールを使えば、一発で変換してくれます。
そのため、executable('native2ascii')ならば、プロパティファイルを読み込んだ後に`%!native2ascii -reverse`、書き込む前に`%!native2ascii`を必ずきっちりと実行しておけば、日本語のプロパティファイルが楽に書けることでしょう。
`\u307b`というエスケープされた形式で編集するのもありではありますが、おすすめはしません。

いちいち、プロパティを編集する度に、`%!native2ascii -reverse`や`%!native2ascii`を実行するのは、忘れそうで非常に怖いです。
なので、プラグイン作りました。

[vim-edit-properties](https://github.com/KamunagiChiduru/vim-edit-properties)

※初プラグインなので、どなたか添削していただけると、大変嬉しいです。

機能としては`native2ascii`でバッファに対してフィルタかけるだけです。
v0.3から、native2asciiコマンドに依存しなくなりました。
今後、追加したい機能としては、

    * 今開いているプロパティファイルと、他のロケール用のプロパティファイルとが持つキーを比較し、差分を表示する
    * 他のロケール用のプロパティファイルに、簡単に移動できるようにする
        * 実装しました。`:help edit-properties-unite-interface`
    * プロパティファイル群に対してのgrep
        * 実装しました。`:help :EditPropsGrep`

あたりを考えています。

以上、自作プラグインの紹介でした。

まとめると、vimでプロパティファイルを編集するには、

    * 読み込み後に`%!native2ascii -reverse`を、書き込み前に`%!native2ascii`を実行する
    * vim-edit-propertiesを使う(単なるマ)

です。

これでeclipseを使わなくてはいけない理由が1つ減り、vimに移行しやすくなったのではないでしょうか。
ここまで読んで頂いて、ありがとうございました。
メソッドを定義したスコープの変数が見たい

http://dev.activebasic.com/egtra/2012/05/24/488/
の通りなんだけれども、

```ruby
o=[1,2,3] # このオブジェクトに追加したメソッド内で

a=3 # この値を参照したい。

# 普通に書いてみた
def o.foo
  puts "foo: %d"%a
end

o.foo # => `foo': undefined local variable or method `a' for [1, 2, 3]:Array (NameError)
```

という事で、普通に書いたらダメだということがわかった。

で。

上記のリンクから得られた情報を元に、書いてみた。

```ruby
class Object
  def def_method_block( sym )
    (class << self; self; end).class_eval do
      define_method( sym ) do |*x|
        yield *x
      end
    end
  end
end

o=[1,2,3] # このオブジェクトに追加したメソッド内で
a=3 # この値を参照したい。

def m; "method_m"; end

o.def_method_block( :bar ) do |x|
 puts "#{x} a=#{a}  m=#{m}"
end

o.bar( "bar-1") #=> bar-1 a=3  m=method_m
a="changed!"
m="value_m"
o.bar( "bar-2") #=> bar-2 a=changed!  m=method_m

def n0; "method_n0"; end
def n1; "method_n1"; end

def add_baz( r )
  b=123
  n0="value_n0"
  r.def_method_block( :baz ) do |x|
   puts "#{x} b=#{b}  n0=#{n0}  n1=#{n1}"
  end
  r.baz( "baz-1") #=> baz-1 b=123  n0=value_n0  n1=method_n1
  n1="value_n1"
  r.baz( "baz-2") #=> baz-2 b=123  n0=value_n0  n1=method_n1
end

add_baz( o )
o.baz( "baz-3" ) #=> baz-3 b=123  n0=value_n0  n1=method_n1
b="brand-new b"
o.baz( "baz-4" ) #=> baz-4 b=123  n0=value_n0  n1=method_n1
```

目的は達成。

しかし、よく見ると分かる通り気持ち悪い。

まず、bar-2。
a の方は新しい変数の方を見るのに、m の方は依然としてメソッドを見ている。

たぶん、一番気持ち悪いのは baz-2 の部分。
n0, n1 はそのスコープ内では両方とも文字列を指しているはずなのに、追加されたメソッド内では、n1 だけが外側のスコープのメソッドを指している。

しかしまあ、なるほどそうするしかないよね、と思う。