OmniAICreator/Qiita-1.07M huggingface dataset:
remap関数の汎用性は異常

```c:
static double remap(double value, double inputMin, double inputMax, double outputMin, double outputMax)
{
    return (value - inputMin) * ((outputMax - outputMin) / (inputMax - inputMin)) + outputMin;
}
```

コピペで使えます。
例えば

```c:
for(int i = 0 ; i < 100 ; ++i)
{
    double t = remap(i, 0, 99, 0, 1); // t は 0 -> 1 を線形にイテレーションする 
}
```

とか、UISliderの0~1の値を  100~50　にするのなんかもすごくスッキリ書けます

staticつけて内部結合にして使うもよし、
つけないで外部結合にして使い回すのもよし。
php-qiita: Qiita API PHPライブラリ


Qiita APIをPHPで扱うためのライブラリを作りました。GitHubで公開しています。

* https://github.com/suin/php-qiita : PHP用ライブラリ
* http://qiita.com/docs : APIドキュメント

## 機能

今のところ

* 認証
* `api()` メソッドで情報取得・投稿などの各種APIを叩く

くらいのことはできます。

curl拡張が必須です。

## インストール

[Composer](https://github.com/composer/composer)経由でインストールします。

まず `composer.json` ファイルに下記を記述します:

```json
{
	"require": {
		"suin/php-qiita": "dev-master"
	}
}
```

composerを走らせてインストールします:

```
$ composer install
```

最後に、あなたのプロダクトで `vendor/autoload.php` をインクルードします:

```
require_once 'vendor/autoload.php';
```


## 使い方

```php
<?php
$qiita = new Qiita(array(
	'username' => 'suin',
	'password' => 'p@ssW0rd',
));

try
{
	// ユーザ情報の取得
	$user = $qiita->api('/users/suin');

	// 投稿の実行
	$createdItem = $qiita->api('/items', 'POST', array(
		'title' => 'Qiita APIからのテスト投稿',
		'tags' => array(
			array('name' => 'Qiita'),
		),
		'body' => 'テスト投稿',
		'private' => false,
	));
}
catch ( Exception $e )
{
	error_log($e);
}
```

## License

php-qiita is licensed under the MIT License - see the LICENSE file for details
UISearchBar カスタマイズ

UISearchBar（NaviBar っぽい背景の検索フィールド）を OS X みたいに自由に使いたいけど、iOS はNaviBar を想定しているのか枠付きであり、邪魔に思った。自作するのもめんどくさい、なんとかならんか。

**あまり良いやり方ではない** が、サブビューを掘っていけば背景となっている View にアクセスできるので、透過なり背景画像なりを変えてやれば良い。

UISearchBar を xib で配置した場合、スコープバー（検索オプション用の SegmentedControl）が勝手に裏側に用意されていることがあるので注意。

```objectivec:ObjC
for (UIView *subview in searchBar.subviews)
{
	// UISearchBar の背景 View "UISearchBarBackground" を特定
	// UISearchBarBackground は UIImageView のサブクラスらしい
	if ([subview isKindOfClass:[UIImageView class]])
	{
		// UIImage を渡せばそれが背景になる. nil なら背景が消える
		[(UIImageView*)subview setImage:nil];
	}
	
	// テキストフィールドを特定、カスタマイズ
	// UISearchBarTextField は UITextField のサブクラスらしい
	if ([subview isKindOfClass:[UITextField class]])
	{
		// UIImage を渡せばそれが検索フィールドの背景になる. nil なら背景が消える
		[(UITextField*)subview setBackground:nil];
	}
}
```
ransackでカラム値がnullのものを検索 

ransackでカラム値がnullのものを検索する場合はカラム名_nullをtrueにして検索すればよい。カラム名_is_nullとかしてた。

チェックボックスにチェックをいれるとnameカラムがnullのものを検索する場合は以下のような感じ。

```
<%= f.check_box :name_null %>
```
【メモ】FuckingInternetExplorer【アンチIE】

[自分のサイト](http://www.aoisensi.info)にIEユーザーを減らす(?)ための記述をしたのでメモ


```html:index.html
<!--[if IE]>
	<SCRIPT LANGUAGE="JavaScript">
		<!--
			setTimeout("location.href='fuckie.html'",0);
		//-->
	</SCRIPT>
<![endif]-->
```


```html:fuckie.html
<!DOCTYPE html>
	<html>
		<head>
			<title>
				Fucking InternetExplorer!!
			</title>
			<SCRIPT LANGUAGE="JavaScript">
				<!--
					setTimeout("location.href='http://www.google.com/chrome'",3000);
				//-->
			</SCRIPT>
		</head>
		<body>
			<b style="font-size: 100px;">
				Fucking InternetExplorer!!
			</b>
		</body>
	</html>

```

ちょろめのDLページに自動的に飛びます
HTTPS 用ディレクトリが別のレンタルサーバで WordPress を HTTP/HTTPS 両方に対応させる


特殊なケースですが、WebArena の SuiteX などでは HTTPS 用のディレクトリが別のディレクトリになっており、そのままですと一つの WordPress で HTTP/HTTPS 両方に対応することができません。そこで、シンボリックリンクを使います。

関係のないものを省くと、こんな感じのディレクトリ構成です。ここでは `home` が HTTP 用のディレクトリ、`ssl/home` が HTTPS 用のディレクトリです。

```
├── home
└── ssl
    └── home
```

まず [WordPress を専用ディレクトリに配置する](http://wpdocs.sourceforge.jp/Giving_WordPress_Its_Own_Directory)必要があります。ここでは `wordpress` という名前に WordPress のファイル（wp-config.php など）が入っているとします。

```
├── home
│   ├── .htaccess
│   ├── index.php
│   └── wordpress
└── ssl
    └── home
```

まず `home/.htaccess` と `home/index.php` を `ssl/home/` にコピーします。

その後 `ssl/home/wordpress` から `home/wordpress` 宛にシンボリックリンクを貼ります。WebArena の SuiteX のように SSH でアクセスできない場合は、適当な場所に PHP ファイルを置いてブラウザからアクセスします。用が済んだら消しましょう。

```symlink.php
<?php system('ln -s /path/to/home/wordpress /path/to/ssl/home/wordpress'); ?>
```

すると、こんな感じになります。

```
├── home
│   ├── .htaccess
│   ├── index.php
│   └── wordpress
└── ssl
    └── home
        ├── .htaccess
        ├── index.php
        └── wordpress (-> home/wordpress)
```

これで HTTP/HTTPS どちらでアクセスしてもエラーなく表示されるはずです。
CSSのクラス名について

結論を先に言うとTwitter Bootstrapのハイフン区切りに従うといいんじゃね？

```
model-feature { ...snip... }
model-feature-list { ...snip... }
```

とかとか。モデル名をプレフィックスにして、どの機能の体裁を整えるのか？そしてそれはリストなのかどうなのか？
キャメルケースとかスネークケースとかはないなーという感じ。
特に理由はないけど強いて言うなら、どっちもシフトキーに指を伸ばさないとダメだから。

「いやいや、それはねーよ」って人はコメントください
メールがスパム扱いされる場合の対応

昔々記事を書いてドメインが消失したのが残念との報告を受けて再度投稿します。

配送メールがスパム扱いになりますよ！という連絡を受けてブラックリストに乗ってしまう例が時々見受けられます。自分はそんな事していないと思うのにという方は、postfix等メール送出情報の設定が正しく行われているか再確認してください。

postfixで一番多いミスが、メール送信元の設定です。ここはFQDNなので省略ドメイン名やlocalhost等でフォルトで設定していると spamhaus.org のブラックリスト登録範囲になります。spamhaus は、大手企業や google mail でもスパム対応のリストに使用しているのですが、その spamhaus が連携している CBL では、postfixの設定がきちんとしているかをチェックしています。ここで送信元が正規ドメイン名称（ FQDN）であるかの判定が行われます。

詳しくはこちら
http://cbl.abuseat.org/

自サイトのIPが登録されているかや解除は以下URLで調べられます。
http://cbl.abuseat.org/lookup.cgi

実際に登録されてしまったら、設定を正しくしてからこのサイトに行って登録解除を行って下さい。
Net_Qiita

何番煎じになるのか分かりませんが、
とりあえずPHP用のラッパを作り始めてみました。

https://github.com/t-ishida/Net_Qiita

現状は単なるcurlのラッパのようなものです。
テストも余り網羅的ではありません。

仕様も、もうちょっとQiitaに特化したりしていくつもり。
tagsのところをJSONにしたりとか。

> ※現状、投稿の作成(POST /items) で、headerに"Content-Type: application/JSON"を付けて投 稿すると500、付けないと「tags must be an array of hashes.」で悩んでる中です。
> ちょっと、また夜にでもリトライします

↑ 仕様を誤解していた模様。driverに記述されていてる形で投稿すれば大丈夫なはず
配列をたった一行で CSV に変換


```php
foreach ($array as $values) fputcsv(STDOUT, $values);
```


配列をCSVとして出力する際に、意外と面倒なのがフィールド値のエスケープです。値の中にあるダブルクォートや改行などを適切にエスケープしなければなりません。そんなときは fputcsv() を使いましょう。

＞例

```php
$csv = array(
   array('1111', '1111', '1111', '1111'),
   array('2222', '2222', '2222', '22,22'), // カンマ混在
   array('3333', '3333', '3333', "33\n33"),// 改行混在
   array('title' => 'タイトル', // 連想配列
          'name'  => '名",前',// ダブルクォート,カンマ混在
          'hoge'  => 'ほげ',
          'fuga'  => 'ふが'),
   …
);

header("Content-Type: application/octet-stream");
foreach ($csv as $fields) fputcsv(STDOUT, $fields);

```

＞出力

```
1111,1111,1111,1111
2222,2222,2222,"22,22"
3333,3333,3333,"33
33"
タイトル,"名"",前",ほげ,ふが
```

CSVの制御文字が正しくエスケープされているのがわかります。
連想配列はキーを無視して値のみ使用されるので、DBから取得した値のCSV出力などで楽になるでしょう。

Excel でもちゃんと表示されます。
![test.csv](http://resources.qnote.jp/qiita/fputcsv-1.png)
Qiita.vim 作りました!

https://github.com/mattn/qiita-vim

## これは何か

vim から qiita を操作出来ます。github の gist をお使いで、gist-vim をご存知の方であれば良く似たインタフェースだと思って下さい。

# 使い方

## 投稿

```
:Qiita
```

で現在開いているバッファを qiita に投稿します。

- 先頭行がタイトル
- 以下のテキストが本文

になります。

## 一覧

```
:Qiita -l
```

で自分のアイテム一覧

```
:Qiita -l cho45
```

で cho45 のアイテム一覧になります。

## 更新

一覧でエンターを押すとアイテムが開きます。そのバッファで `:w` と書き込むと、アイテムが更新されます。

## 削除

アイテムを開いた状態で

```
:Qiita -d
```

を実行すると削除されます。

## CtrlP インタフェース

CtrlP というプラグインをお使いの方であれば

```
:CtrlPQiita
```

で一覧が絞り込めます。

## unite インタフェース

unite.vim をお使いの方であれば

```
:Unite qiita
```

で同様の一覧が表示されます。

![](http://go-gyazo.appspot.com/9de4bcb00d28b935.png)

## API

qiita.vim は API ライブラリでもあります。詳しくは

```
:help qiita
```

を参照下さい。
RailsでjsやcssなどassetsファイルへのGETでログが見辛い場合の対処法

railsのログでStarted GET "/assets/application.js?body=1" などjsやcssへのGETが表示されて、実際にみたいGETやPOSTが流れてしまうのを回避するには、initializerで下記の設定をすればOKらしい。
今まで知らなかった。。。

```config/initializers/quiet_assets.rb
Rails.application.assets.logger = Logger.new('/dev/null') 
Rails::Rack::Logger.class_eval do 
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0 
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end 
  end 
  alias_method_chain :call, :quiet_assets 
end 
```

https://github.com/rails/rails/issues/2639#issuecomment-2252326
複数の画像ファイルを一括縮小


もともと正方形の画像を 50x50 の正方形にするには。縮小してぼやけるのを補正している。元のファイルを上書きするので注意。

```shell
$ mogrify -resize 50x50 -unsharp 2x1.4+0.5+0 -quality 100 *.jpg
```

参考
http://d.hatena.ne.jp/weblinuxmemo/20090929/p1
インデックス断片化の状況を表示する


SQLServerでインデックスの断片化を確認するSQLです。
最終列にREBUILDするためのSQLも出力させていますが、テーブルロックさせずに実行したい場合は以下のようにONLINEオプションを指定する必要があります。

```sql
ALTER INDEX インデックス名 on テーブル名 REBUILD with ONLINE=ON;
```

```sql:FragmentationInfo.sql
with index_stat as (
    select *
    from sys.dm_db_index_physical_stats(DB_ID(N'AdventureWorks'), NULL, NULL, NULL, NULL)
)
select
     C.schema_id 
    ,A.object_id table_id
    ,B.object_id index_id
    ,C.name schema_name
    ,A.name table_name
    ,B.name index_name
    ,D.avg_fragmentation_in_percent
    ,'ALTER INDEX [' + B.name + '] ON [' + C.name + '].[' + A.name + '] REBUILD;'
from sys.tables as A 
    inner join sys.indexes as B on (B.object_id = A.object_id)
    inner join sys.schemas as C on (C.schema_id = A.schema_id)
    inner join index_stat  as D on (D.object_id = B.object_id AND D.index_id = B.index_id)
where A.type='U'
order by D.avg_fragmentation_in_percent DESC;
```
UbuntuユーザーがCentOSをインストールしてみた

\#isucon の環境が CentOS で、入れ替えにミスって起動しなくなってもサポート無いらしいので、 Debian/Ubuntu ユーザーが CentOS で実験環境を構築してみました。

##isoイメージのダウンロード
http://www.centos.org/modules/tinycontent/index.php?id=32 から日本にあるミラーサーバーのどれかを選び、右側にある HTTP のリンクを開きます。とりあえず http://ftp.iij.ad.jp/pub/linux/centos/ を選びました。
バージョンごとのディレクトリがずらっとならんでいるので一番あたらしい 6.3 を選び、 isos/x86_64 と進みます。いくつかあるので Debian の時の癖で netinst を選びましたが、 minimal にしたほうが良かったかもしれません。

##仮想環境の構築
VMware Fusion で CentOS 64bit を選び、CDイメージを選択して仮想マシンを作ります。カスタマイズしてディスクを64GBにしておきました。
起動してチュートリアルどおり進めばいいのですが、インストール元を指定する画面が出てきた場合はURLという項目を選択し、 http://ftp.iij.ad.jp/pub/linux/centos/6.3/ と手で入力する必要がありました。
そのあとはいきなりインストール画面がGUIになってびっくりです。

##最初の起動
インストールが終わると再起動を要求されるので再起動します。インストール時に設定した root のパスワードでログインし、おもむろに ``yum update`` しておきます。
その間に参考になりそうなサイトをググって、 http://centossrv.com/centos5-init.shtml を見つけました。
yum-updatesd と mail コマンドがないのでこのページ通りには活きませんでしたが、それを無視して SELinux の停止などをやっておきます。

##その他の設定
とりあえず絶対必要なものを入れておきます。後から必要な物が見つかるたびに追加しますが。

```sh
yum install man python-devel vim-enhanced gcc-c++ openssh-clients
```

依存関係で perl がインストールされました。 minimal だと perl もインストールされないんですね…
色々と実験する場合、fdの数の制限のデフォルト値が1024だと足りなすぎます。最近の Ubuntu はデフォルトが4096になってたりしますが、ケチる必要は無いので 65536 にしておきます。 ``/etc/security/limits.conf`` を開いて

```limits.conf
* hard nofile 65536
* soft nofile 65536
```

しておきます。

##sshの設定
デフォルトだとパスワード認証が有効になっていたので、パスワード認証でログインし、authorized_keys を設定してから ``/etc/ssh/sshd_config`` を編集してパスワード認証をオフにします。

##感想
コマンドが見当たらない時に Ubuntu だとインストール候補のパッケージ一覧を表示してくれるのですが、 CentOS だとそれがなくて何をインストールしたらいいのか判りませんでした。
でも、 ``yum search scp`` とかしたらなんとなくわかるので、きっとこれが正しい方法なんだと思います。
qiita apiの"Tags must be an array of hashes."というエラーを解消する方法


下記のpythonのコードでqiita apiを叩くと"Tags must be an array of hashes."というエラーが返ってくる。

```python
{"error":"Tags must be an array of hashes."}
```




```python
# -*- coding:utf-8 -*-

import urllib
reqdata = {}
reqdata['title'] = 'qiita first post'
reqdata['tags'] = [{'name':'qiita'}]
reqdata['body'] = 'first post'
reqdata['private'] = 0
reqdata['twitter'] = 0
reqdata['token'] = TOKEN
params = urllib.urlencode(reqdata)
url = 'https://qiita.com/api/v1/items'
print urllib.urlopen(url,params).read()#これでPOST
print url+params
```


##パラメータデコード前
body=first+post&tags=[{'name':+'qiita'}]&twitter=0&title=qiita+first+post&private=0&token=TOKEN

##パラメータデコード後
body=first post&tags=[{'name': 'qiita'}]&twitter=0&title=qiita first post&private=0&token=TOKEN
qiita apiのAccess-Control-Allow-Originヘッダーにワイルドカードを指定するかjsonp用のjsを公開するかして欲しい


できれば前者でお願いしたいです。実装も楽です。jsから直叩きしてえ。
あるいは私のドメインだけ指定してくれてもいいです。

実装方法
http://blog.livedoor.jp/dankogai/archives/51502865.html
mongoDB の ObjectId はタイムスタンプや連番の数字を保持している


[ドキュメント](http://www.mongodb.org/display/DOCS/Object+IDs)によれば、mongoDB の Object ID は以下の情報から成っているそうです。

- 4 byte: タイムスタンプ
- 3 byte: マシン名（ホスト名やネットワークアドレスなどのハッシュ）
- 2 byte: pid
- 3 byte: 連番の数字

これらにどうやってアクセスするのかと思って `ObejctId` のプロパティを見てみると・・・。

```js
var oid = db.foo.find()[0]._id;
for (var k in oid) { print(k); }
// str
// tojson
// isObjectId
// getTimestamp
// equals
```

`ObjectId#getTimestamp()` は `ISODate` を返してくれます。これまでタイムスタンプを別に保存したりしていましたが、場合によってはこっちを使えば良さそうです。

また、連番の数字は最後の 3 byte。16 進数で 6 桁。`ObjectId#str` の最後の 6 文字です。必要であればこんな感じで取得できます。

```js
var sequence = parseInt(oid.str.substr(18), 16);
```
Qiitaの投稿をGitHubにバックアップ

[この](http://qiita.com/items/a98dffc4b1ad095898b1 "original")記事を見てなるほど
と思いシェルスクリプト版を作ってみた

### オリジナルとの違い

* シェルスクリプトで書かれている
* githubにコミットされるのは差分or新規
* カレントディレクトリの内容を削除せず上書き
* デバッグモードの場合、githubに自動コミットしない

### 使い方

オリジナルからコピー

0. まず、自分のGitHubに新規にリポジトリを作成します。
	* "Repository Name"を「Qiita」に。(別の名称でも構わないですが、以降適宜読み替えて下さい)
	* "Initialize this repository with a README"のオプションをチェック。
	* "Create Repository"をクリック。
0. Macにクローン。
	* "Clone in Mac"ボタンをクリック。
0. 次のコマンドを実行。

```sh
$ cd ~/github/Qiita
$ curl -s https://raw.github.com/toshikiw/qiita/master/tool/update.sh|sh
```

### スクリプト解説

[GitHub](https://github.com/toshikiw/qiita/blob/master/tool/update.sh)にもアップされています。
基本はオリジナルと同じ処理。
バックアップ対象もオリジナルと同じ。
コメントはなるべくオリジナルから拾ってきています。
mdファイル名にスペースが入っているとgitが上手くファイルを拾えないのでファイル名(つまりタイトル)からスペースを除去しています。

↓の様に引数を何か付けるとgitへのコミットを行いません

```sh
$ sh update.sh DEBUG
```

以下ソース

```sh:update.sh
#!/bin/sh


#ファイル名のサニタイズ関数
sanitize() {
 t1=$(echo "$1"|sed -e 's,<[^>]*>,,g') #strip_tags
 t1=$(echo "$t1"|sed -e 's/[\~\`\!\@\#\$\%\^\&\*\=\+{}\\|;:\"\,\<\.\>\/\?]+//g' -e "s,[']+,,g") #str_replace
 echo "$t1"|sed -e 's, ,,g' #スペースを削除
}

DEBUG="$@"
DIR=$PWD
DB_FILE=$HOME/Library/Kobito/Kobito.db
SQLITE3=/usr/bin/sqlite3
MSG='Automatic Update'
SQL_SELECT_ID='select ZUID  from ZITEM where ZUID is not null and ZPRIVATE = 0 ORDER BY ZPOSTED_AT DESC;'
SQL_SELECT_TITLE_AND_URL='select ZURL,ZTITLE  from ZITEM where ZUID = '
SQL_SELECT_BODY='select ZRAW_BODY from ZITEM where ZUID = '

#1レコードずつファイルに保存
MD="Posts on Qiita\n=====\n\n"
echo "Collecting your posts from Kobito...\n"
for zuid in $($SQLITE3 $DB_FILE "$SQL_SELECT_ID"); do
 SQL="$SQL_SELECT_TITLE_AND_URL '$zuid'";
 TAU=$($SQLITE3 $DB_FILE "$SQL");
 URL=$(echo $TAU|cut -d"|" -f 1);
 TITLE=$(sanitize "$(echo $TAU|cut -d"|" -f 2-)");
 SQL="$SQL_SELECT_BODY '$zuid'"
 $SQLITE3 $DB_FILE "$SQL" > "$DIR/${TITLE}.md"
 echo "* $TITLE url: $URL";
 MD="$MD* [$TITLE]($URL \"see on Qiita\")\n"
done

#目次がわりのREADME.mdを作成
echo $MD > "README.md"

#デバックモードを追加
if [ -z "$DEBUG" ]; then
 #GitHubにコミット
 echo "\nConnecting to GitHub...\n"
 git add -u *.md
 UNTRACKED=$(git status -s -uall *.md|grep -v '^M'|tr -d "?")
 if [ -n "$UNTRACKED" ]; then
   git add $UNTRACKED
 fi
 git commit -m "$MSG"
 git push origin master
fi
```
特定のディレクトリの@2xの画像リストから、@2xではない画像を作成するシェルスクリプト

##@2x.png 画像をのこしたまま、.png 画像を作成する
```
for f in *@2x.png; do convert -geometry 50% $f  "${f%@2x.png}.png"; done
```

##retain用の画像に@2xをつける。
```
for f in *.png ; do mv $f ${f%.png}@2x.jpg ;done
```

imagemagickが入っていること前提です..
PidginでCampfireに接続する方法

会社でチャットツールがCampfireに移行したのだけれど、デスクトップLinuxでCampfireにつなげられるクライアントアプリにめぼしいものがない。（他のみんなはマカーなので我関せずという顔）
Snakefireというのを探してきて、PyQt環境を整えつつ苦労して入れるも、Gnome Keyring関係でなんか怒られる。

途方にくれてたときに、Ubuntu系にプリインストールされているPidginにCampfire用のプラグインが作成されているのを発見。
https://github.com/jrfoell/campfire-libpurple

ただしコードがGithubに置いてあるだけなので、自力でビルド、インストールが必要で、さらに設定にも一癖あった。READMEすらなかったので、その覚え書きを残しておく。

```bash:Pidginの開発環境をインストール
$ sudo apt-get install pidgin-dev
```

```bash:Githubからソースコードをダウンロードしてビルド、プラグインディレクトリにインストール
$ git clone https://github.com/jrfoell/campfire-libpurple.git
$ cd campfire-libpurple/
$ make
$ sudo cp libcampfire.so /usr/lib/pidgin
```

Pidginを起動、
**アカウント ＞ アカウントの管理 ＞ 追加**

> 基本
>> プロトコル: Campfire
>> ユーザ名: _USERNAME_
>> ホスト名: _YOUR_SUBDOMAIN_.campfirenow.com
>
> 拡張
>> API token: _My infoページの「API authentication token」_
>> Retrieve # msgs on join: 10
>
> プロキシ
>> プロキシの種類: グローバルなプロキシを使う

を設定。

**仲間 ＞ チャットに参加 ＞ ルームの一覧**
から、チャットルームを追加したり参加したりできる。
Cucumberで、Helperのメソッドを使う方法

cucumberのstep_definitionで、dom_id(model)とか使いたかったので調べてみた。
結構簡単だった。

```ruby:features/support/env.rb
World(ActionController::RecordIdentifier)
```

末尾にこんな感じで書いておけば、Worldにincludeしてくれるので、
step_definitionで普通に呼べるようになる。
カンマ区切りで複数同時に書ける。
メソッド名の衝突には注意かな。
nested object formsのcheckbox使用例

nested object formは以下のrailscast動画を見れば把握できます

- [#196 Nested Model Form Part 1](http://railscasts.com/episodes/196-nested-model-form-part-1)
- [#197 Nested Model Form Part 2](http://railscasts.com/episodes/197-nested-model-form-part-2)

チェックボックスを使用するときはちょっとめんどくさかったのでメモ

## 基本

### Article model

```ruby
class Article < ActiveRecord::Base
  attr_accessible :articles_categories_attributes

  has_many :categories, :through => :articles_categories
  has_many :articles_categories, :dependent => :destroy

  accepts_nested_attributes_for :articles_categories, :allow_destroy => true
end
```

### ArticlesCategory model

```ruby
class ArticlesCategory < ActiveRecord::Base
  attr_accessible :article_id, :category_id

  belongs_to :article
  belongs_to :category
end
```

### Category model

```ruby
class Category < ActiveRecord::Base
  attr_accessible :name

  has_many :articles, :through => :articles_categories
  has_many :articles_categories, :dependent => :destroy
end
```

## view、update method

### view

```erb
<% Category.all.each do |category| %>

  <% check_flag = @article.articles_categories.any? { |articles_category| articles_category.category_id == category.id } %>

  <%= check_box_tag "article[articles_categories_attributes][][category_id]", category.id, check_flag %>
  <%= category.name %>
<% end %>
```

### update method

```ruby
def update
  ArticlesCategory.transaction do
    @article = Article.find(params[:id], :lock => true)
    @article.articles_categories.clear
    @article.update_attributes!(params[:interview_article])
  end
    flash[:notice] = 'Article was successfully updated.'
    redirect_to :action => 'index'
    rescue ActiveRecord::RecordInvalid
    render :action => 'edit'
end
```
spork + redis-rb でのエラー対処: "Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking."


## 問題

redis-rb gemsを2.2から3.0.1にアップデートしたとき，sporktを使ってspecを走らせると以下のようなエラーが出た．

> Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.

## 原因

redis-rb 3以降では，forkしたときに親と子でredisのコネクションを共有していると例外を投げるようになったらしい．
ref: https://github.com/redis/redis-rb/blob/master/lib/redis/client.rb#L277

## 対処
sporkがforkしたときに再度コネクションを確立するように`Spork.each_run`内に以下のようなコードを書く．

```ruby:spec_helper.rb
Spork.each_run do
  # This code will be run each time you run your specs.
  load Rails.root.join('config/initializers/redis.rb')
end
```

```ruby:config/initializers/redis.rb
$redis = Redis.new(:host => 'localhost', :port => 6379)
$redis.ping
```

$redis.pingしてるのは[Redis接続をチェックしてからRailsサーバー起動](http://qiita.com/items/68f8150e43d0b0111213)にあるハック

Unicornでも同じように，

- before_forkで`$redis.quit`
- after_forkでRedisコネクションを作成

という処理が必要．
audioタグでmp3再生をfirefox等で対応させる

こんなかんじで再生したかったら

```
<audio src="hogehoge.mp3" preload="none" controls>can not open audio file</audio>
```

ヘッダー内に以下を追加。

```
<script type="text/javascript" src="http://api.html5media.info/1.1.4/html5media.min.js"></script>

```
ALAssetsLibraryChangedNotification

マルチタスクが当然の現在では、アセットを使うアプリはアセットの変更通知を受け取ったほうがいいと聞いて、
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAssetChanged:) name:ALAssetsLibraryChangedNotification object:nil];
と通知を受け取ることにした

しかしながら、どうもこのコールバックの中の挙動がおかしい。
と調べてみると、どうもメインスレッドでは呼ばれていないようだ。
なので、
dispatch_async(dispatch_get_main_queue(), ^{
});
とGCDをつかってメインスレッドに引っ越すのが正解のようだ。
もちろんスレッドに影響されない処理ならこんなことしなくても問題ないし、
重たい処理を外に書いておいて、メインスレッドでやらねばならぬものは、メインで、
という調整はしてもいいはずだ

神経質な人は[NSThread isMainThread]で確かめて分岐、というのもいいだろう
ScriptApp.newTriggerでatHourの前にevery***は必須？らしい

日本時間朝５時に時間トリガーを設定しようとしてハマったのでメモ。

``` javascript:setTrigger.gs
function setTrigger(){
  ScriptApp.newTrigger("myFunction")
    .timeBased()
    .atHour(5)
    .create();
}
```

条件で朝５時に一回だけ起動する予定だったのがなぜか起動しない。。。

うむむ。

デバッグしてみたところ、どうやらnewTriggerのところで止まってしまうらしい。。
Timezoneの設定なのかと悩んでいろいろ試してみた結果、everyDays(1)を挟むことで使えるようになるみたい。。。

``` javascript:setTrigger.gs
function setTrigger(){
  ScriptApp.newTrigger("myFunction")
    .timeBased()
    .inTimezone("JST")
    .everyDays(1)
    .atHour(5)
    .create();
}
```

トリガーは１回きりなのでmyFunction内でScriptApp.deleteTrigger()メソッドで削除で対応。
ActiveRecordでunsigned型をサポートしてないのが気になる

MySQLのほうから来た人だと`id`みたいなシーケンス値や`hoge_count`みたいなカウント保持するカラムはunsigned intで定義するのが普通な気がするのですが、ActiveRecord::Migrationではunsignedをサポートしていません。
かるく調べた限りだと、unsignedをサポートしてるのってMySQLぐらいらしく、PostgreSQLはサポートしてないしSQLite3はスキーマ定義のときにunsignedって書いてもエラーにならないけど完全に無視されてて余裕でマイナスの値を保持できてしまう。
そういう背景があってunsignedを扱いたいという要件はActiveRecordやRailsにおいてはエッジケースだという見解らしく、当面ActiveRecordでunsignedがサポートされる見込みはないのかもしれません。
そこで、[activerecord-unsigned-column](https://github.com/kamipo/activerecord-unsigned-column)というActiveRecord::Migrationでunsigned型を扱えるやつを作りました。

```ruby:Gemfile
gem 'activerecord-unsigned-column', :git => 'git://github.com/kamipo/activerecord-unsigned-column.git'
```

こうやってGemfileに書いてbundle installしてrake db:migrateすると

```ruby:db/migrate/20121009024024_create_tweets.rb
class CreateTweets < ActiveRecord::Migration
  def change
    create_table :tweets do |t|
      t.references :user
      t.string :text
      t.unsigned :retweets_count, :default => 0
      t.unsigned :favorites_count, :default => 0

      t.timestamps
    end
    add_index :tweets, :user_id
  end
end
```

```
CREATE TABLE `tweets` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned DEFAULT NULL,
  `text` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `retweets_count` int(10) unsigned DEFAULT '0',
  `favorites_count` int(10) unsigned DEFAULT '0',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
```

いい感じにunsignedが扱えます！これでMySQLの人も安心ですね！
Haskell で Kleene閉包

与えられた集合 A の要素よりなるすべての有限リストが欲しい場合があります．このようなリスト集合はしばしば A のクリーネ閉包( http://ja.wikipedia.org/wiki/クリーネ閉包  ）と呼ばれ, A* と書かれます．A のクリーネ閉包から空リストを取り除いたものを A+ と書くことがあります．Aが空でなければ A* は無限集合ですが Haskell では無限リストとして表現できます．

```haskell:kleene.hs
kleeneStar :: [a] -> [[a]]
kleeneStar xs = [[], xs] ++ [ y:zs | zs <- kleeneStar xs, y <- xs]

kleenePlus = tail . kleeneStar
```

使用例

```console
Prelude> :l kleene.hs
[1 of 1] Compiling Main             ( kleene.hs, interpreted )
Ok, modules loaded: Main.
*Main> take 30 $ kleeneStar "ab"
["","ab","a","b","aab","bab","aa","ba","ab","bb","aaab","baab","abab","bbab","aa
a","baa","aba","bba","aab","bab","abb","bbb","aaaab","baaab","abaab","bbaab","aa
bab","babab","abbab","bbbab"]
*Main> take 30 $ kleenePlus "ab"
["ab","a","b","aab","bab","aa","ba","ab","bb","aaab","baab","abab","bbab","aaa",
"baa","aba","bba","aab","bab","abb","bbb","aaaab","baaab","abaab","bbaab","aabab
","babab","abbab","bbbab","aaaa"]
*Main> take 50 $ kleeneStar "abc"
["","abc","a","b","c","aabc","babc","cabc","aa","ba","ca","ab","bb","cb","ac","b
c","cc","aaabc","baabc","caabc","ababc","bbabc","cbabc","acabc","bcabc","ccabc",
"aaa","baa","caa","aba","bba","cba","aca","bca","cca","aab","bab","cab","abb","b
bb","cbb","acb","bcb","ccb","aac","bac","cac","abc","bbc","cbc"]
*Main>
```

幾らか重複が見られますが，そこそこ使えるのではないかと思います．


面白い点
１．`kleeneStar xs` の定義には再び `kleeneStar xs` が現れています．
２． リスト内包表記の順番を間違えると大変なことに…．

二番目の点についての具体例．

```haskell
kleeneBad :: [a] -> [[a]]
kleeneBad xs = [[], xs] ++ [ y:zs | y <- xs, zs <- kleeneBad xs]
```

のように定義するとまったく使い物になりません：

```console
*Main> take 30 $ kleeneBad "ab"
["","ab","a","aab","aa","aaab","aaa","aaaab","aaaa","aaaaab","aaaaa","aaaaaab","
aaaaaa","aaaaaaab","aaaaaaa","aaaaaaaab","aaaaaaaa","aaaaaaaaab","aaaaaaaaa","aa
aaaaaaaab","aaaaaaaaaa","aaaaaaaaaaab","aaaaaaaaaaa","aaaaaaaaaaaab","aaaaaaaaaa
aa","aaaaaaaaaaaaab","aaaaaaaaaaaaa","aaaaaaaaaaaaaab","aaaaaaaaaaaaaa","aaaaaaa
aaaaaaaab"]
```
ActiveRecordのデフォルトのインデックス名が長いのが気になる

たとえばActiveRecordで`users`テーブルの`email`カラムにインデックスを張ると、デフォルトのインデックス名が`index_users_on_email`みたいな冗長な名前になるのがうざいのでデフォルトはもっとすっきりさせることにする。

```ruby:config/initializers/ar_simple_index_name.rb
ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters

    # simple index name
    module SchemaStatements
      def index_name_with_simple(table_name, options)
        if Hash === options && options[:column]
          Array.wrap(options[:column]) * '_and_'
        else
          index_name_without_simple(table_name, options)
        end 
      end 
      alias_method_chain :index_name, :simple
    end 

  end 
end
```

こうしとくと`users`テーブルの`email`カラムにインデックスを張ると、デフォルトのインデックス名は`email`になって、`tiger`カラムと`bunny`カラムの複合キーのデフォルトのインデックス名も`tiger_and_bunny`とすっきりしていい感じになる。
Mac(OS X Mountain Lion)で、flvをmp4へ変換

flvをmp4に変換したいだけだったのに、ffmpegをビルドしようとしたらやたらと色んなポイントでつまずいたので、メモとしてまとめてみた。


#gccとかのインストール
Mac OS X Mountain Lionだと、デフォではgccすら入ってない。
Xcodeをインストールし、Preferences -> Downloadsに進み「Command Line Tools」をインストール
（参考）http://memo.yomukaku.net/entries/UaLbzhE

#autotoolsのインストール
Xcode4.3以降だと、autotools（automake, autoconf）が入ってない。
（参考）http://null.ly/post/18379534073/xcode-4-3-autotools

```
$ sudo port install automake
$ sudo port install autoconf
```

#FAACのビルド
libfaacを先にビルドする。
http://www.audiocoding.com/downloads.html
ここからソースを手に入れてビルド。

```
$ ./bootstrap
$ ./configure
$ make
$ sudo make install
```

#FFmpegのビルド
FFmpegをビルドする。
下記の下の方にFFmpeg Releasesがあるのでそこから取ってくる。
http://ffmpeg.mplayerhq.hu/download.html

```
$ ./configure --enable-libfaac --enable-nonfree  --disable-yasm
$ make
$ sudo make install
```

ffmpeg の配布条件による制限のためnonfreeのオプションが必要になる。
（参考）http://mobilehackerz.jp/archive/wiki/index.php?%BA%C7%BF%B7FFmpeg#e916d53d

#実行用のシェルスクリプト
変換用のシェルスクリプトを作成する。
実行時のオプション指定が色々めんどいのでshを作っておく。

```flv2mp4.sh
#!/bin/bash
## input file
FILE="$1"
FILE_NAME=`basename "${FILE}" '.flv'`
## convert with ffmpeg
ffmpeg -threads 2 -i "${FILE}" -vcodec mpeg4 -acodec libfaac "${FILE_NAME}".mp4
exit 0
```

（参考）http://d.hatena.ne.jp/griffith181/20090218/1234939669

***
これでようやくflvからmp4への変換が一発で出来るようになった。
何だかMountain LionやXcode4.3以降では、基本的なツール（gccとかautomakeとか）が入ってなかったりして、色々と最初の準備が面倒なことに今さら気がついた。
確かにXcodeとかeclipseとか使ってる限りは関係ないけど、どういう意図なんだろう。。。
第四回オフラインリアルタイムどう書くの解答例(Haskell)

ブロックの位置関係（距離）から判別するという鍋谷さんのアイディア（ http://qiita.com/items/a2d6f70241b9e80ab17d の2つ目）に感銘を受けて。Haskellで書いてみました。

```haskell:
import Data.Char
import Data.List

c2i = subtract 48.ord

dist x0 y0 x1 y1 = (x1 - x0) ^ 2 + (y1 - y0) ^ 2

str2pos (x0:y0:',':x1:y1:',':x2:y2:',':x3:y3:[]) =
  [(c2i x0, c2i y0), (c2i x1, c2i y1), (c2i x2, c2i y2), (c2i x3, c2i y3)]

pattern = unwords.map show.sort.pattern'.str2pos
  where
    pattern' [] = []
    pattern' ((x, y):ps) = (foldl (\xs (x1, y1) -> (dist x y x1 y1):xs) [] ps) ++ pattern' ps

solve x = case pattern x of "1 1 1 2 4 5" -> "L"
                            "1 1 1 4 4 9" -> "I"
                            "1 1 1 2 2 4" -> "T"
                            "1 1 1 1 2 2" -> "O"
                            "1 1 1 2 2 5" -> "S"
                            _             -> "-"

main = getContents >>= putStrLn.unlines.map solve.lines
```
ファイル変更時に node アプリを再起動する


`nodemon` を使います。`node` と違い実行するファイルの拡張子が必要です。

```shell
$ npm install nodemon -g
$ nodemon app.js
```

API トークンなんかを .env に書いている場合は、別の Procfile を用意します。

```Procfile
web: node app
```

```Procfile_dev
web: nodemon app.js
```

`foreman` の `-f` オプションで Procfile を指定できます。

```shell
$ foreman start -f Procfile_dev
```
crontabはバックアップ取って置いた方が安心ですね

crontabを編集する場合は

```
crontab -e
```

よりも
crontab形式で記述したファイルを引数で渡してあげる方が安心ですね。
こんな風に

```
crontab crontab.bak
```

crontab.bakの中身はこんな感じに。ついでにcron設定のメモも残しておくと良い。

```bash
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=''

#設定可能な数値
#分 0-59
#時 0-23
#日 1-31
#月 1-12
#曜日 0-7 (0または7は日曜日）
#
#実行時間指定方法
#リスト  	0,10,20,30  分フィールド指定した場合は0,10,20,30分に実行します。
#範囲 	1-5         月フィールドで指定した場合、1,2,3,4,5月に処理を実行します。
#共存 	1,6,9-11     時間フィールドで指定した場合、1時、6時、9時、10時、11時に処理を実行します。
#間隔 	*/10       分フィールドで指定した場合、10分間隔で処理を実行します。「/」の後ろに指定した値の間隔で処理を実行します。

# エラー出力をメール送信させない
# 1>/dev/null 2>&1

# m h dom mon dow command
#00 1 * * * /hoge/no/fuge
#
```
element.classList

結構便利。

* [対応状況](http://caniuse.com/#search=classList)
* [polyfill](https://github.com/remy/polyfills)

```js
var element = document.querySelector('#menu');
var classList = element.classList;

console.log(classList instanceof DOMTokenList);

//disabledクラスの存在確認
classList.contains('disabled');
//disabledクラスを加える
classList.add('disabled');
//disabledクラスを取り除く
classList.remove('disabled');
//いわゆるトグル。あれば取り除き、無ければ加える。
classList.toggle('disabled');
```
既存レポジトリに git-flow 導入


まず git-flow のインストール。

```shell
$ brew install git-flow
```

master 以外のブランチがない場合は、develop 用のブランチを作っておいてから `git flow init` するだけ。feature 用のブランチがある場合は、後で `git branch -m bar feature/bar` とかすればいいのではないかと思います。

```shell
$ git branch develop
$ git flow init

Which branch should be used for bringing forth production releases?
   - develop
   - master
Branch name for production releases: [master] 

Which branch should be used for integration of the "next release"?
   - develop
Branch name for "next release" development: [develop] 

How to name your supporting branch prefixes?
Feature branches? [feature/] 
Release branches? [release/] 
Hotfix branches? [hotfix/] 
Support branches? [support/] 
Version tag prefix? [] 
$ git status
# On branch master
nothing to commit (working directory clean)
$ git branch
  develop
* master
$ git flow feature
No feature branches exist.

You can start a new feature branch:

    git flow feature start <name> [<base>]

$ git flow feature start foo
Switched to a new branch 'feature/foo'

Summary of actions:
- A new branch 'feature/foo' was created, based on 'develop'
- You are now on branch 'feature/foo'

Now, start committing on your feature. When done, use:

     git flow feature finish foo

$ git branch
  develop
* feature/foo
  master
```

参考
https://gist.github.com/538326
Dispatchクラスのメモ


[Getting started with GCD in MacRuby & Rubymotion - Mateus - Welt](http://seanlilmateus.github.com/blog/2012/05/31/getting-started-with-grand-central-dispatch-in-macruby-and-rubymotion/)を読んだ際のメモ。

##アプリケーションのメインのキューを取得

```ruby
Dispatch::Queue.main
```

##並列処理用のキューを取得

```ruby
Dispatch::Queue.concurrent
Dispatch::Queue.concurrent('hoge')
```

優先度を指定することも可能。

```ruby
Dispatch::Queue.concurrent(priority=:default)
Dispatch::Queue.concurrent(priority=:low)
Dispatch::Queue.concurrent(priority=:high)
```

##カスタマイズされたキューを取得

自身で実行順序などが予想できる場合に使う？

```ruby
Dispatch::Queue.new('hoge')
```


##同期で処理を実行

```ruby
Dispatch::Queue.concurrent.sync {p 'hoge'}
```

##非同期で処理を実行

```ruby
Dispatch::Queue.concurrent.async {p 'hoge'}
```

##指定時間後に処理を実行

```ruby
# .0を付けなくても動いた
# 単位は秒
Dispatch::Queue.concurrent.after(5.0) {p 'hoge'}
```

##指定回数分処理を実行

```ruby
Dispatch::Queue.concurrent.apply(5) {|i| p i}
```

##キューを操作する

```ruby
q = Dispatch::Queue.concurrent('hoge')
# 一時停止
q.suspend!
p q.suspended?
# => true
# 再開
q.resume!
p q.suspended?
# => false

```

##複数のキューの終了を待つ

キューを管理する``Dipatch::Group``なるクラスの配下に``Dispatch::Queue``を所属させる感じ。

```ruby
group = Dispatch::Group.new
hoge = Dispatch::Queue.concurrent
fuga = Dispatch::Queue.concurrent

hoge.async(group) { p 'hoge'}
fuga.async(group) { p 'fuga'}

group.wait
```

##キューの終了時に処理を実行する

```ruby
group = Dispatch::Group.new
hoge = Dispatch::Queue.concurrent

hoge.async(group) { p 'hoge'}
group.notify(hoge) {p 'hoge complete'}

```

``wait``と``notify``を同時に使った場合、``wait``以降の処理の後、``notify``で指定した処理が実行されてるっぽいけど詳細は不明。

##Barriers

[Dancing with GCD Group and Barriers - Mateus - Welt](http://seanlilmateus.github.com/blog/2012/06/03/dancing-with-gcd-group-and-barriers/) にある下記のサンプルを動かしてみたけど自身の環境ではコメントにあるような動作にならず結果は``""``だった。

```ruby
queue = Dispatch::Queue.concurrent('com.company.application.task')
@i = ""
queue.async { @i += 'a' }
queue.async { @i += 'b' }
queue.barrier_async { @i += 'c' }
p @i #=> either prints out 'abc' or 'bac'
```
pythonでUTF8のテキスト処理


python2.x系は、strオブジェクトとunicodeオブジェクトが別々なのでややこしい。
いろいろ調べているうちにこんな感じになった。
python3.x系はテキストはunicode処理されるので、もっと簡単らしい。

MacOS X 10.6.8
Python 2.6.1

```python:
# coding: UTF-8

import codecs
import string
import re

f_in  = codecs.open('test.txt', 'r', 'utf-8')
f_out = codecs.open('test_out.txt', 'w', 'utf-8')

lines = f_in.readlines() #読み込み
lines2 = []
for line in lines:
	line = string.replace(line,u'テキスト',u'text') #テキスト置換
	line = re.sub(r'(\d)(?=(\d{3})+(?!\d))', r'\1', line) #正規表現置換
	lines2.append(line) #別リストにする
else:
	f_out.write(string.join(lines2,'')) #書き込み
	f_in.close()
	f_out.close()
```

```text:test.txt
これはサンプルテキストです。
3桁ごとにカンマを入れます。
iPad mini 36800円
```

```text:test_out.txt
これはサンプルtextです。
3桁ごとにカンマを入れます。
iPad mini 36,800円
```

追記：
python3.3でも動くコードを書いた。
結局、python3でもcodecsモジュールは使うし、
replaceはstrオブジェクトの関数でやるのと、u''リテラルを使わないだけ？

```python:
from __future__ import unicode_literals
```

を追加すると、u''リテラルがなくても全ての文字列をunicodeとして扱うので、
python2.6でも普通に動く。現時点ではそれが一番いいかも。

```python:
# coding: UTF-8
from __future__ import unicode_literals # <-文字列を全てunicodeとして扱う。3系では必要なし
import codecs
import re

f_in  = codecs.open('test.txt', 'r', 'utf-8')
f_out = codecs.open('test_out.txt', 'w', 'utf-8')

lines = f_in.readlines() #読み込み
lines2 = []
for line in lines:
    line = line.replace('テキスト','text') #テキスト置換
    line = re.sub(r'(\d)(?=(\d{3})+(?!\d))', r'\1,', line) #正規表現置換
    lines2.append(line) #別リストにする
else:
    f_out.write(''.join(lines2)) #書き込み
    f_in.close()
```
d3.selection について


[d3](http://d3js.org/) の `enter()` などの意味や selection の中身がよくわからなかったので調べてみました。それにしても d3 のドキュメントの充実っぷりは半端ないですね。

## selection とは

d3 の全ての基本が [d3.selection](https://github.com/mbostock/d3/wiki/Selections) です。基本的には DOM 要素の入った配列（の入った配列）ですが、`data()`, `append()` などのメソッド（d3 では operator と呼ばれている）がついており、DOM 要素に対していろいろな操作をすることができます。

```html
<body>
  <p>Hello, World!</p>
  <p>Hello, World!</p>
  <p>Hello, World!</p>
</body>
```

```js
var p = d3.select('body').selectAll('p');

console.log(p instanceof d3.selection);
// true

for (var k in p) if (p.hasOwnProperty(k)) {
  console.log(k);
}
// 0

for (var k in p[0]) if (p[0].hasOwnProperty(k)) {
  console.log(k, p[0][k]);
}
// 0 <p>​Hello, World!​</p>​
// 1 <p​​​>​Hello, World!​</p>​
// 2 <p​​​>​Hello, World!​</p>​
// parentNode <body>​…​</body>​
```

## selection のネスト

`selectAll()` を一回呼んだだけだと、なぜか一個だけ配列の入った配列です。入れ子状の DOM に対して `selectAll()` を二度呼ぶと一階層繰り上がり、一番上の配列の要素が複数になります。

```html
<table>
  <tr><th>Wow</th><td>Hello</td></tr>
  <tr><th>Wow</th><td>Hello</td></tr>
  <tr><th>Wow</th><td>Hello</td></tr>
</table>
```

```js
console.log(d3.selectAll('tr'));
// [Array[3]]

console.log(d3.selectAll('tr').selectAll('td'));
// [Array[1], Array[1], Array[1]]
```

参考 [Nested Selections](http://bost.ocks.org/mike/nest/)

## data() と selection join

`data()` を使うと selection　にデータを関連づけることができます。具体的には、各 DOM 要素に `__data__` プロパティが設定されます。また、その際 selection から update, enter, exit という三種類の subselection（？）が生まれます。

- update selection は、要素とデータ両方揃った分の配列。`data()` の返り値はこれです。要素を更新するのに使います。
`enter()` と `exit()` メソッドがついており、それぞれ下の二つを返します。
- enter selection は、要素よりもデータの方が多かった場合に余った分のデータ（を格納したオブジェクト）の入った配列。要素を新しく追加するのに使います。
- exit selection は、データよりも要素の方が多かった場合に余った分の要素の入った配列。不要になった要素を削除するのに使います。

```js
var updating = d3.select('body').selectAll('p')
  .data([4, 8, 15, 16, 23, 42]);

console.log(updating instanceof d3.selection);
// true

for (var k in updating) if (updating.hasOwnProperty(k)) {
  console.log(k);
}
// -> 0
// -> enter
// -> exit

for (var k in updating[0]) if (updating[0].hasOwnProperty(k)) {
  console.log(k, updated[0][k]);
}
// 0 <p>​Hello, World!​</p>​
// 1 <p​​​>​Hello, World!​</p>​
// 2 <p​​​>​Hello, World!​</p>​
// 3 null
// 4 null
// 5 null
// parentNode <body>​…​</body>​
```

enter selection はこんな感じです。

```js
var entering = updating.enter();

console.log(entering instanceof d3.selection);
// false

for (var k in entering) if (entering.hasOwnProperty(k)) {
  console.log(k);
}
// 0

for (var k in entering[0]) if (entering[0].hasOwnProperty(k)) {
  console.log(k, entering[0][k]);
}
// 0 null
// 1 null
// 2 null
// 3 Object
// 4 Object
// 5 Object
// update [<p>​Hello, World!​</p>​, <p>​Hello, World!​</p>​, <p​>​Hello, World!​</p>​, null, null, null]
// parentNode <body screen_capture_injected=​"true">​…​</body>​
```

なお `entering[0][3,4,5]` に入っている `Object` は `__data__` プロパティにデータを格納しています。

exit selection は enter selection と同じような感じなので省略します。

一見面倒な仕組みですが、大きなメリットがあります。

- 変更がある度に全てを書き換えるのではなく、必要な分だけ書き換えるので、パフォーマンスの向上が期待できる
- 要素の追加や削除にアニメーションをつけられる

参考
[Thinking with Joins](http://bost.ocks.org/mike/join/)
JREに同梱のcom.sun.net.httpserverを使ってHTTPのテストをする方法

もちろんJettyでもいいんだけど、
JREしか使いたくない場合は以下のようにすると、
テストコードの中でHttpServerを作ってレスポンスの受け側のテストが出来ます。

```java:MyTests.java
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static org.junit.Assert.*;

import org.junit.Test;
import com.sun.net.httpserver.*;

public class MyTests {
        @Test
        public void httpServer_API_test() throws Exception {
              HttpServer httpServer = HttpServer. create( new InetSocketAddress("localhost" ,8080),8080);
              ExecutorService httpThreadPool = Executors. newFixedThreadPool(1);
              httpServer.setExecutor(httpThreadPool);
              httpServer.createContext( "/" ,new HttpHandler(){
                      @Override
                      public void handle(HttpExchange exc) throws IOException {
                           final String response = "Hello HTTP Server" ;
                           exc.sendResponseHeaders(200, response.length());
                           OutputStream os = exc.getResponseBody();
                           os.write(response.getBytes());
                           os.close();
                     }
              });
              httpServer.start();
               // TODO:なんやらかんやらテスト
              httpServer.stop(1);
              httpThreadPool.shutdownNow();
       }
}
```

上記は、ポートが既に使われているとか例外処理とか知ったこっちゃないコードなので、
コピペには注意してください。
第四回オフラインリアルタイムどう書くの解答例(Prolog)

根性で書いてみました。ぜーはーぜーはー。
ちょっとだけPrologがわかってきた気がします。

考え方はC++版 ( http://qiita.com/items/3d148710b250061f5dbc ) と同じです。

```prolog:

str2pos([X00, Y00, C, X01, Y01, C, X02, Y02, C, X03, Y03], [[X10, Y10], [X11, Y11], [X12, Y12], [X13, Y13]]) :-
    X10 is X00 - 48, Y10 is Y00 - 48,
    X11 is X01 - 48, Y11 is Y01 - 48,
    X12 is X02 - 48, Y12 is Y02 - 48,
    X13 is X03 - 48, Y13 is Y03 - 48.

normalize([[X00, Y00], [X01, Y01], [X02, Y02], [X03, Y03]], [[X10, Y10], [X11, Y11], [X12, Y12], [X13, Y13]]) :-
    min_member(Xmin, [X00, X01, X02, X03]), min_member(Ymin, [Y00, Y01, Y02, Y03]),
    X10 is X00 - Xmin, Y10 is Y00 - Ymin,
    X11 is X01 - Xmin, Y11 is Y01 - Ymin, 
    X12 is X02 - Xmin, Y12 is Y02 - Ymin, 
    X13 is X03 - Xmin, Y13 is Y03 - Ymin.
normalize([_,_,_], [ [0,0], [0,0], [0,0], [0,0] ]). 
normalize([_,_],   [ [0,0], [0,0], [0,0], [0,0] ]). 
normalize([_],     [ [0,0], [0,0], [0,0], [0,0] ]). 

tetromino([ [0, 0], [0, 1], [0, 2], [1, 2] ], 'L') :- !.
tetromino([ [0, 0], [0, 1], [1, 0], [2, 0] ], 'L') :- !.
tetromino([ [0, 0], [1, 0], [1, 1], [1, 2] ], 'L') :- !.
tetromino([ [0, 1], [1, 1], [2, 0], [2, 1] ], 'L') :- !.
tetromino([ [0, 0], [0, 1], [1, 1], [2, 1] ], 'L') :- !.
tetromino([ [0, 0], [0, 1], [0, 2], [1, 0] ], 'L') :- !.
tetromino([ [0, 0], [1, 0], [2, 0], [2, 1] ], 'L') :- !.
tetromino([ [0, 2], [1, 0], [1, 1], [1, 2] ], 'L') :- !.
tetromino([ [0, 0], [1, 0], [2, 0], [3, 0] ], 'I') :- !.
tetromino([ [0, 0], [0, 1], [0, 2], [0, 3] ], 'I') :- !.
tetromino([ [0, 0], [1, 0], [1, 1], [2, 0] ], 'T') :- !.
tetromino([ [0, 0], [0, 1], [0, 2], [1, 1] ], 'T') :- !.
tetromino([ [0, 1], [1, 0], [1, 1], [2, 1] ], 'T') :- !.
tetromino([ [0, 1], [1, 0], [1, 1], [1, 2] ], 'T') :- !.
tetromino([ [0, 0], [0, 1], [1, 0], [1, 1] ], 'O') :- !.
tetromino([ [0, 0], [0, 1], [1, 1], [1, 2] ], 'S') :- !.
tetromino([ [0, 1], [0, 2], [1, 0], [1, 1] ], 'S') :- !.
tetromino([ [0, 1], [1, 0], [1, 1], [2, 0] ], 'S') :- !.
tetromino([ [0, 0], [1, 0], [1, 1], [2, 1] ], 'S') :- !.
tetromino(_,                        '-') :- !.

solve([]).
solve([S0|SS]) :- str2pos(S0, P0), sort(P0, P1), normalize(P1, P2), tetromino(P2, R2), writeln(R2), solve(SS).

result :- see('testpattern.txt'), read(SS), seen, solve(SS).
```

```txt:testpattaern.txt

[ "55,55,55,55",
  "07,17,06,05",
  "21,41,31,40",
  "62,74,73,72",
  "84,94,74,75",
  "48,49,57,47",
  "69,89,79,68",
  "90,82,91,92",
  "13,23,03,24",
  "24,22,25,23",
  "51,41,21,31",
  "64,63,62,65",
  "49,69,59,79",
  "12,10,21,11",
  "89,99,79,88",
  "32,41,43,42",
  "27,16,36,26",
  "68,57,58,67",
  "72,62,61,71",
  "25,24,15,14",
  "43,54,53,42",
  "95,86,76,85",
  "72,73,84,83",
  "42,33,32,23",
  "66,57,67,58",
  "63,73,52,62",
  "76,68,77,67",
  "12,11,22,01",
  "05,26,06,25",
  "03,11,13,01",
  "11,20,00,21",
  "84,95,94,86",
  "36,56,45,35",
  "41,33,32,43",
  "75,94,84,95",
  "27,39,28,37",
  "45,34,54,35",
  "24,36,35,26",
  "27,27,27,27",
  "55,44,44,45",
  "70,73,71,71",
  "67,37,47,47",
  "43,45,41,42",
  "87,57,97,67",
  "49,45,46,48",
  "63,63,52,72",
  "84,86,84,95",
  "61,60,62,73",
  "59,79,69,48",
  "55,57,77,75" ].
```
GSONでは抽象クラスを使うときには注意が必要

モデルとして抽象クラスを使うとぬるぽします。
[前回の投稿](http://qiita.com/items/7818d6dbee4f97c496f3)を
少し加工して、MyClassを抽象クラスとして定義します。

```groovy:gson_class_nullpo.groovy
package jp.eiya.aya.gson

public abstract class MyClass{
  private String id=null
  private int value=0
  public MyClass(String i,int v){
    id=i
    value=v
  }
  public String getID(){return id}
  public int getValue(){return value}
}
```

抽象クラスなので、変数testに格納するオブジェクトは、
匿名クラスのオブジェクトとしてインスタンス化します。

```groovy:gson_test_nullpo.groovy
import com.google.gson.*
import jp.eiya.aya.gson.MyClass

def gson = new Gson()
def test=new MyClass("test" , 1){} // 匿名クラスをインスタンス化
def json=gson.toJson(test) // jsonはnullになる
assert(json == /{"id":"test","value":1}/) // 失敗
MyClass test2 = gson.fromJson(json,MyClass.class) // test2はnullになる
assert(test2.getID() == "test") // ぬるぽ
assert(test2.getValue() == 1) // ぬるぽ
```

すると、上記のようにjsonやtest2がnullになります。
とくに例外は出ません。

ちょっと気をつけて方がいいみたいですね。
うっかりモデルを抽象クラスとして定義した場合、ぬるぽにやられてしまいます。
omniauth_twitter から signed request 用の authorize ヘッダをつくる方法

他の人の役に立つとは思いませんが、試行錯誤して twitter API で画像をアップロードできたときのメモ

ユーザーが twitter oauth でログインして、 session[:token], session[:token_secret] が得られている前提。

~~~:ruby
strategy = OmniAuth::Strategies::Twitter.new(nil)
strategy.options[:client_options][:site] = "https://upload.twitter.com"
token = OAuth::AccessToken.new(strategy.consumer, session[:token], session[:token_secret])
#req = strategy.consumer.create_signed_request(:post, "/1/statuses/update.json", token, {}, "status=hello")
req = strategy.consumer.create_signed_request(:post, "/1/statuses/update_with_media.json", token, {}, {})
p req["authorization"]
~~~

そうすると、こんな感じの出力が得られる

~~~
"OAuth oauth_nonce=\"XYH56inAaw3gfgxbvMuykLL7lPXYwfRN8bqtjAc95mM\", oauth_signature=\"11E4iBWWembT93IOl%2FI4TPixFa4%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1349611873\", oauth_token=\"...\", oauth_version=\"1.0\""
~~~

それを curl で使う場合は

~~~:shell
curl -v -H "Expect:" -H "Authorization: OAuth oauth_nonce=\"GL0jIqjh8orkPEPH8zaSpossTAKiM12XQpXYVE\", oauth_signature=\"no1ZNzX9CpYQ5OQOxm09b9XvXfM%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1349614664\", oauth_token=\"...\", oauth_version=\"1.0\"" -F status=hello2 -F "media[]=@upload.png" https://upload.twitter.com/1/statuses/update_with_media.json
~~~
GSON試した

例えば、以下の様なモデルのクラスを定義する。

```groovy:gson_test_class.groovy
package jp.eiya.aya.gson

public class MyClass{
  private String id=null
  private int value=0
  public MyClass(String i,int v){
    id=i
    value=v
  }
  public String getID(){return id}
  public int getValue(){return value}
}
```

そうすると、GSONの使い方は下みたいになる。

```groovy:gson_test.groovy
import com.google.gson.*
import jp.eiya.aya.gson.MyClass

def gson = new Gson()
def test=new MyClass("test" , 1)
def json=gson.toJson(test)
assert(json == /{"id":"test","value":1}/)
MyClass test2 = gson.fromJson(json,MyClass.class)
assert(test2.getID() == "test")
assert(test2.getValue() == 1)
```

Jsonからモデルに戻すことが出来るのが便利だね。

もうちょっと色々試してみようかな。
EclipseでPlayframework 2.xのセットアップをする


##プロジェクトの作成
プロジェクトを作成したいディレクトリまで移動した後に、

```Bash
play new project名
```

を実行します。ここで指定したproject名はそのままディレクトリ名になります。その後、

>What is the application name?

と聞かれます。こちらはplayコマンド実行したあとに表示されるプロジェクト名です。ここは、先ほど入力したproject名が入力された状態で表示されているので、特に変更する必要はないでしょう。

>Which template do you want to use for this new application? 
  1 - Create a simple Scala application
  2 - Create a simple Java application
  3 - Create an empty project

最後に、作成するプロジェクトの種類を選択します。ここではJavaのプロジェクトを作成するので「2」を入力します。

>OK, application taskal is created.

これで完成です。

##Eclipseのプロジェクトファイルを生成する
なんか1系の古い記事だと eclipsify project名とかになってますが、2系だとprojectのディレクトリまで移動するだけで、プロジェクト名は指定しません。また、デフォルトだとplayやそれに関連するソースが見られないので、with-source=trueを指定してjarファイルを落としてくる必要があります。

```Bash
play
[xxx] $ eclipsify with-source=true
```
これで下準備完了です。

##Eclipseにインポートする
eclipse側でFile > Import > Existing Projects into Workspaceでおk

##デバッグモードを使えるようにする
もし、まだPlayが起動している状態なら一度 Ctrl + Dで抜けます。そして、以下のコマンドを実行します。

```
play debug run
```

次に、Eclipseで虫アイコンの横の三角をクリック > Debug Configurations… > Remote Java Applicationを選び下記の様に設定します。

Name: Play Debugなど自分が分かりやすいものを
Project: Browseして利用するプロジェクトを選びます
Connection Type: そのままで
Connection Properties
Host : localhost
Port : 9999

これで完了です。
第四回オフラインリアルタイムどう書くの解答例(Rubyで３つ)

第四回オフラインリアルタイムどう書くの解答例。
問題は
http://nabetani.sakura.ne.jp/hena/ord4tetroid/
当日より前に事前に書いておいた実装３つ。

---

まずは、最初に書いたもの

```ruby
#!ruby
def rot(d)
    [d[1], -d[0]]
end

def count( axs, c, d )
    ( 4.times.inject([d]){ |a,b| 
        a+[rot(a.last)]
    }.map{ |i|
        c.zip(i).map{ |x| x.inject( &:+) }
    } & axs ).count
end

def key( input )
    axs=input.split(",").map{|xy| xy.to_i.divmod(10) }.uniq
    axs.map{ |i|
        count( axs, i, [1,0] )*10+count( axs, i, [1,1] )
    }.sort.join("-")
end

def solve( input )
    case key(input)
    when "10-11-20-21" then "L"
    when "10-10-20-20" then "I"
    when "11-11-12-30" then "T"
    when "21-21-21-21" then "O"
    when "11-11-21-21" then "S"
    else "-"
    end
end

DATA.each{ |line|
    /(?<num>\#\d+)\s+(?<input>[\d,]+)\s+(?<expected>\S)/=~line
    actual=solve(input)
    print "%s %s -> %s"%[num,input,actual]
    print "**EXPECTED** : "+expected unless actual==expected
    puts
}

__END__
#1  55,55,55,55 -
#2  07,17,06,05 L
```

例によって、テストデータは本当は 50件あるけど、ここでは省略。

注目点の8近傍を調べたらわかるよね、というアイディア。
ペントミノだとうまくいかない。

---

```ruby
#!ruby
def dist( a, b )
    a.zip(b).map{ |i,j| (i-j)**2 }.inject( &:+ )
end

def solve( input )
    a=input.split( ',' ).map{ |i| i.to_i.divmod(10) }.sort.uniq
    return '-' unless a.size==4
    d=a.size.times.map{ |fst|
        fst.times.map{ |snd|
            dist( a[fst], a[snd] )
        }
    }.flatten.sort.join
    case d
    when '111245' then 'L'
    when '111449' then 'I'
    when '111224' then 'T'
    when '111122' then 'O'
    when '111225' then 'S'
    else
        '-'
    end
end
```

`DATA.each` 以降は最初のと同じなので省略。
与えられた点の間の距離（平方根を省略して、距離の自乗）をまとめると判別できるよね、というアイディア。
これでうまくいくのはなぜかと問われるとちょっと窮する。

---

```ruby
#!ruby

def s(a)
    mins = [0,1].map{ |xy| a.map{ |i| i[xy] }.min }
    pat = a.map{ |i| [ i[0]-mins[0], i[1]-mins[1] ].join }.sort.flatten.join(",")
    case pat
    when '00,01,02,12' then 'L'
    when '00,10,20,30' then 'I'
    when "01,10,11,21" then 'T'
    when "00,01,10,11" then "O"
    when "01,10,11,20" then "S"
    else
        nil
    end
end

def sy(a)
    s(a) || s( a.map{ |i| [i[0], -i[1]] } )
end

def sxy(a)
    sy(a) || sy( a.map{ |i| [-i[0], i[1]] } )
end

def solve( input )
    a = input.split(',').map{ |i| i.to_i.divmod(10)}.sort.uniq
    return '-' unless a.size==4
    sxy(a) || sxy(a.map( &:reverse )) || '-'
end
```

回転したり鏡像反転したりするのも書いておこうということで書いたもの。
当日頂いた回答はパターンの方を回しておくものが多かったけど、これは入力の方を回している。
まあ、回しているんじゃなくて x軸反転・y軸反転・xy入れ替え の三つを組み合わせて実現してる。
メソッド名がグダグダですいません。
Sublime Text 2にSmarty用シンタックスハイライトを追加

Sublime Text 2はデフォルトの状態では、Smarty用のシンタックスハイライトを持っていないので、追加する方法。

[Sublime Forum • View topic - Is there a Smarty plugin for Sublime Text?](http://www.sublimetext.com/forum/viewtopic.php?f=3&t=885#p15642)でtitoさんが書いている内容そのまま。



## HTML.tmLanguageからsmarty部分をアンコメントする
'%APPDATA%\Sublime Text 2\Packages\HTML\HTML.tmLanguage'( <- WIndowsの場合)を開き、'smarty'で検索すると、以下の様な感じでコメントアウトされているので、これをアンコメントする。

```
<!--
    <dict>
        <key>include</key>
        <string>#smarty</string>
    </dict>
-->
```

## textmateのsmarty用シンタックスファイルをダウンロードして配置
textmateのsmarty用シンタックスファイル

* http://svn.textmate.org/trunk/Bundles/PHP%20Smarty.tmbundle/Syntaxes/Smarty.plist

を'%APPDATA%\Sublime Text 2\Packages\User\Smarty.tmLanguage'に配置。

以上で終了。

なお、デフォルトのカラースキーマだとちゃんと表示されないけど、"twilight"なら大丈夫だよ、とのこと。

自分が使っている、PhixパッケージのPhix Darkも大丈夫な様子。