OmniAICreator/Qiita-1.07M huggingface dataset:
javascriptで文字列の描画幅を取得する方法

文字列の長さに応じてフォントサイズを縮小したり、省略表示したりできないかと思って調べてみました。
canvasのmeasureText()を使う方法と、DOMのoffsetWidthの値を使う方法があるようです。

1. canvasを使う方法

　HTML5のcanvasを使いますので、canvas要素に非対応なIE8以前ではexcanvas.jsが必要です。

　IEとexcanvasのバージョンの組み合わせ次第で動かない可能性もあります。

手順：
(1)まずHTML中にcanvasを用意する

```html
<canvas id="canvas" width="0" height="0" style="visibility:hidden;position:absolute;"></canvas>
```

Firefox9ではstyleでdisplay:none;としても大丈夫でしたが、IE+excanvasでは駄目だったので、hidden指定のうえ、positionをabsoluteにして浮かせておきます。

(2)幅を測定する処理は以下のように記述します。

```javascript
function strWidth(str) {
  var canvas = document.getElementById('canvas');
  if (canvas.getContext) {
    var context = canvas.getContext('2d');
    var metrics = context.measureText(str);
    return metrics.width;
  }
  return -1;
}
```

context.font = でフォントの指定も必要ですね。

2. DOMのoffsetWidthの値を使う

こちらを参考にしました。→http://d.hatena.ne.jp/Psychs/20070525/1180077269

手順：
(1)まずHTML中に測定に使用するspanを用意する

```html
<span id="ruler" style="visibility:hidden;position:absolute;white-space:nowrap;"></span>
```

折り返しが発生すると測定結果が狂うのでwhite-space:nowrap;にした方がいいです。
必要に応じてフォントなどの条件指定も。

(2)幅を測定する処理は以下のように記述します。（jQuery使用してます）

```javascript
function strWidth(str) {
  var e = $("#ruler");
  var width = e.text(str).get(0).offsetWidth;
  e.empty();
  return width;
}
```

私の環境(Firefox9)ではどちらの方法でも同じ値が取得できました。
最初、違う値が出たので「あれ？」と思ったら、フォントを合わせるのを忘れてました……。
続々: Growlが暴走したときに自動的に再起動するスクリプト

どうも前回のスクリプトだと、openを叩いたときに権限の問題でおこられるのでsudo -u harajune を追加した

````
#!/bin/bash

PID=$(ps ax | grep Growl.app | grep -v grep | awk '{print $1};')

OPEN="sudo -u harajune open"

if [ -z "$PID" ]; then
    $OPEN -j -a Growl
    logger -p user.notice -t growl_cron "Growl restarted on $(date)"
    exit
fi

CPU_USAGE=$(top -pid $PID -l 2 -s 5 -stats cpu | tail -n1 | cut -d"." -f1)
if [ "$CPU_USAGE" -gt 80 ]; then
    killall Growl
    $OPEN -j -a Growl
    logger -p user.notice -t growl_cron "Growl restarted on $(date)"
fi
````
Node.jsからPHPのプロセスを呼び出す - JSONでやりとり編

# node.js側の実装

Node.jsのAPIだけでやってます。
PHPをコマンドラインで呼び出します。

```js:icallyou.js
var util  = require('util');
var spawn = require('child_process').spawn;
var php   = spawn('php', ['callme.php']); // $ php callme.php と同じ意味

var data = {
	'foo': 'something',
	'bar': 'something',
};

php.stdin.write(JSON.stringify(data)); // 標準入力としてPHPに渡す
php.stdin.end(); // PHPさん、標準入力終わったよ

php.stdout.on('data', function (data) {
	console.log('stdout: ', JSON.parse(data));
});

php.stderr.on('data', function (data) {
	console.log('stderr: ', JSON.parse(data));
});

php.on('exit', function (code) {
	console.log('phpプロセスが終了しました: ステータスコード: ' + code);
});

// ↓エラーなパターン

var php2   = spawn('php', ['callme.php']);
var data = 'なんか変なデータ';

php2.stdin.write(JSON.stringify(data));
php2.stdin.end();

php2.stdout.on('data', function (data) {
	console.log('stdout: ', JSON.parse(data));
});

php2.stderr.on('data', function (data) {
	console.log('stderr: ', JSON.parse(data));
});

php2.on('exit', function (code) {
	console.log('php2プロセスが終了しました: ステータスコード: ' + code);
});
```

# PHP側の実装

php://stdinで標準入力を取得できます。

```php:callme.php
<?php

$stdin = file_get_contents('php://stdin');

$data = json_decode($stdin, true);

// var_dump($data);

if ( is_array($data) === false )
{
	echo json_encode(array(
		'status'  => 'error',
		'message' => 'フォーマットに誤りがあります。JSONの配列で送ってこいｺﾞﾙｧ',
	));
	exit(1);
}
else
{
	echo json_encode(array(
		'status'  => 'success',
		'message' => 'OKです',
	));
	exit(0);
}
```

# 実行してみる

```bash
$ node icallyou.js 
stdout:  { status: 'success', message: 'OKです' }
stdout:  { status: 'error',
  message: 'フォーマットに誤りがあります。JSONの配列で送ってこいｺﾞﾙｧ' }
phpプロセスが終了しました: ステータスコード: 0
php2プロセスが終了しました: ステータスコード: 1
```
Rails/ERBで部分テンプレート毎にheadの内容を変える

```erb:layout.html.erb
...
<head>
  <%= yield :header %> 
</head>
```

```erb:index.html.erb
<% content_for :header do -%> 
  <meta property="og:title" content="title" /> 
  <meta property="og:description" content="description" /> 
<% end -%>
...
```
Railsでデプロイ環境に合わせてrobots.txtを出力するコントローラ


```ruby:robots_controller.rb
class RobotsController < ApplicationController
  def index 
    render_text = File.read "#{::Rails.root}/public/robots.#{::Rails.env}.txt"
    respond_to do |format|
      format.text { render :text => render_text, :layout => false }
    end
  end
end
```
robots.deployment.txt robots.staging.txt robots.production.txt を作成し
デプロイ後 robots.txt にアクセスするとデプロイ毎の robot.txt が取得できる
MySQLのUNIONの便利な使い道 

```mysql
CREATE TABLE news (
	title VARCHAR(255),
	category VARCHAR(50),
	date DATE
);
```

```mysql
INSERT INTO news 
VALUES 
	('政治ニュース1', 'seiji', '2012-01-21'),
	('政治ニュース2', 'seiji', '2012-01-22'),
	('政治ニュース3', 'seiji', '2012-01-23'),
	('経済ニュース1', 'keizai', '2012-01-21'),
	('経済ニュース2', 'keizai', '2012-01-22'),
	('経済ニュース3', 'keizai', '2012-01-23'),
	('エンタメニュース1', 'entame', '2012-01-21'),
	('エンタメニュース2', 'entame', '2012-01-22'),
	('エンタメニュース3', 'entame', '2012-01-23'),
	('コラム1', 'koramu', '2012-01-23'),
	('コラム2', 'koramu', '2012-01-24');
```

上記のデータに対して「最新ニュースを5件表示したい」という要望があったとする。
その場合、単純に次のクエリになる。

```
mysql> SELECT * FROM news ORDER BY date DESC LIMIT 5;
+---------------------------+----------+------------+
| title                     | category | date       |
+---------------------------+----------+------------+
| コラム2                   | koramu   | 2012-01-24 |
| コラム1                   | koramu   | 2012-01-23 |
| エンタメニュース3         | entame   | 2012-01-23 |
| 経済ニュース3             | keizai   | 2012-01-23 |
| 政治ニュース3             | seiji    | 2012-01-23 |
+---------------------------+----------+------------+
```

さらに、追加要件として「コラムは最新1件を必ず表示する」があったとする。
そして、いやらしくも「時系列順に表示されること」という内容。

この処理をやろうとすると、PHPで別々のクエリを発行してあとでマージ＆ソート、
なんていうことになりそうだけど、UNIONを使うと簡単に取れる。

```
mysql> (SELECT * FROM news WHERE category != 'koramu' ORDER BY date DESC LIMIT 4)
    -> UNION
    -> (SELECT * FROM news WHERE category = 'koramu' ORDER BY date DESC LIMIT 1)
    -> ORDER BY date DESC;
+---------------------------+----------+------------+
| title                     | category | date       |
+---------------------------+----------+------------+
| コラム2                   | koramu   | 2012-01-24 |
| 政治ニュース3             | seiji    | 2012-01-23 |
| エンタメニュース3         | entame   | 2012-01-23 |
| 経済ニュース3             | keizai   | 2012-01-23 |
| 経済ニュース2             | keizai   | 2012-01-22 |
+---------------------------+----------+------------+
```
MySQLのwait_timeoutとthread_cache_sizeについて

ごくたまにアプリケーション側でエラーが出てアプリケーション側は終了しているのに、MySQLへのconnectionがそのまま残っていて、芋づる式にconnectionが溢れて行きサービスに繋がらなくなることが起きます。

根本的原因のアプリケーション側を直すべきなのですが、MySQL側でconnectionを長時間保持して欲しくない場合の設定を調べました。

デフォルトでは

```
wait_timeout = 28,800
```

となっており、8時間となっています。
これでは長すぎるので、my.cnfに以下を追記します。

```my.cnf
wait_timeout = 15
```

ただ、こうするとアイドル時間の合計が15秒を超えるとconnectionが切られるので、毎回threadを生成したりconnectしたりするオーバーヘッドが大きくなってしまうようなので、以下を設定します。

```my.cnf
#thread_cache_size = 8    
thread_cache_size = 100  
```

thread_cache_sizeのデフォルトは8です。
(thread_cache_sizeの値はどれくらいが良いのかまだ分かっていませんが、max_connectionに合わせるのが良いのでしょうか？)

また、MySQLを再起動せずに反映させるためにmysqlのコンソールで

mysql>SET GLOBAL wait_timeout = 15;
mysql>SET GLOBAL thread_cache_size = 100;

と設定します。


これで、死んでるconnectionもどんどん破棄していってくれて、thread生成のオーバーヘッドも大きくならない、はずです。

間違っていたらご指摘お願い致します。
--bareじゃないレポジトリにpushする

デフォルトでは--bareじゃないレポジトリにpushしようとすると怒られる。自分一人の開発だとがんがんpushしても問題ないケースがある。
non-bareへのpushを許すには、リモートのレポジトリ上で

```sh
% git config receive.denyCurrentBranch ignore 
```

を実行する。
A successful Git branching modelから重要なとこを抽出

Git使うなら絶対に一度は読んだ方がいい良エントリ

- [A successful Git branching model](http://nvie.com/posts/a-successful-git-branching-model/)
- [日本語訳](http://keijinsonyaban.blogspot.com/2010/10/successful-git-branching-model.html)

理屈は本文読めということで、ルール的な箇所を抽出

#ブランチの種類

1. メインブランチ
2. サポートブランチ

サポートブランチはさらに3種類に分類される

#メインブランチ

- メインブランチはmasterとdevelopの二つ
- この二つは常に存在するし、削除しない
- masterでの開発は一切しない
- developで開発してmasterにマージするのが大きな流れ

#サポートブランチ

- フィーチャーブランチ
- リリースブランチ
- ホットフィックスブランチ
- 用が済めば削除される

##フィーチャーブランチ
- developから分岐してdevelopにマージされる
- 命名規則は特に無し（他の種類のブランチと区別がつくように）
- 個々の機能を実装する
- originにはpushしない

###フィーチャーブランチの一生

```sh
$ git checkout -b myfeature develop
$ # 機能の開発
$ git commit -m 'Implement myfeature'
$ git checkout develop
$ git merge --no-ff myfeature # --no-ffフラグでマージして
$ git branch -D myfeature # 開発が終了したブランチは削除する
$ git push origin develop
```

`--no-ff`フラグについては本文参照

##リリースブランチ
- developから分岐してmasterにマージされる
- デプロイ用の変更を開発環境に反映したければdevelopにもマージする
- 命名規則は`release-*`
- 機能開発はしない
- デプロイの準備をする

###リリースブランチの一生

```sh
$ git checkout -b release-1.2 develop # version1.2のためのリリースブランチ
$ # リリースのための作業
$ git commit -m 'Version 1.2'
$ git checkout master
$ git merge --no-ff release-1.2
$ git tag -a 1.2
$ git branch -D release-1.2
```

##ホットフィックスブランチ
- masterから分岐してdevelopとmasterにマージされる
- 本番環境発覚したバグなどに対応する
- 命名規則は`hotfix-*`
- 機能開発ではない

###ホットフィックスブランチの一生

```sh
$ git checkout -b hotfix-1.2.1 master
$ #バグフィックス
$ git commit -m 'Fixed severe production problem'
$ # バージョンを一つ上げる
$ git commit -am 'Version 1.2.1'
$ git checkout master
$ git merge --no-ff hotfix-1.2.1
$ git tag -a 1.2.1
$ git checkout develop # もしリリースブランチがあれば、そっちにマージ
$ git merge --no-ff hotfix-1.2.1
$ git branch -D hotfix-1.2.1
```
NetworkStream.Read()は読み込むデータが無い場合デフォルトで処理をブロックする

NetworkStream.Read()はsynchronousなメソッドなのでブロックするのは問題無い。
問題があるのは[MSDNリファレンス](http://msdn.microsoft.com/ja-jp/library/system.net.sockets.networkstream.read.aspx)の次のくだり。

>読み取りに使用できるデータがない場合、Read メソッドは 0 を返します。

**嘘です。**返しません。

NetworkStreamはReadTimeout/WriteTimeoutというプロパティがあって、
同期Read/Writeがブロックする時間の上限がここに設定してある。
で、[リファレンス](http://msdn.microsoft.com/ja-jp/library/bk6w7hs8.aspx)によると

>既定値は Infinite で、読み取り操作がタイムアウトしないことを示します。

となっている。

ちなみにこのReadTimeout/WriteTimeoutを設定すれば、設定時間経過後に処理が戻るが
タイムアウトした事を示すIOExceptionが投げられるので処理がなんとも書きづらい。
Expressでmultipart/form-dataの値を取得する

app.jsのexpress.bodyParserに保存ディレクトリを指定

```javascript:app.js
app.use(express.bodyParser({uploadDir:'./tmp'}));
```

あとはpostを受信したい関数で残りのパラメータを取得できます。

```javascript:app.js
app.post('/items', function(req, res) {
    console.log(req.body);
    console.log(req.files);
    res.send('DONE', 200);
});
```
ItemizedOverlayでArrayIndexOutOfBoundsException になる時は

下記の両方を実行したら治った。

//populateの直後にmapView.invalidate()を呼ぶ
http://groups.google.com/group/android-developers/browse_thread/thread/b0fa8f6335ea5d77

//setLastFocusedIndex(-1)をpopulate()の前にコールする。
http://misapon.blogspot.com/2010/11/itemizedoverlay-arrayindexoutofboundsex.html
CLでpackageに別名を強引に付ける方法

無駄にパッケージを作ることを許容するのであれば、空のパッケージを作ってexternal symbolをimportしてexportするだけで実現可能です。

スコープを区切らない (区切れない) ので、ファイル単位で別名を使いたい場合などには一応使えます。

```package-synonym.lisp
(eval-when (:compile-toplevel :load-toplevel :execute)
  (defpackage :pkgctl-work) )

(defmacro begin-qualified-package (target-package synonym &optional import-all)
  (let ((pkg (find-package target-package))
        (pkgkey (intern (string target-package) :keyword))
        (curpkgname (package-name *package*))
        (synonymkey (intern (string synonym) :keyword))
        (sym (cl:gensym)) )
    `(cl:eval-when (:compile-toplevel :load-toplevel :execute)
       (cl:in-package :pkgctl-work)
       (cl:defpackage ,synonym (:use ,pkgkey))
       (cl:in-package ,synonymkey)
       (cl:when ,import-all
         (cl:do-all-symbols (,sym ,pkg)
           (cl:when (cl:eq (cl:symbol-package ,sym) ,pkg)
             (cl:import ,sym ,synonymkey) )))
       (cl:do-external-symbols (,sym ,pkg)
         (cl:export ,sym ,synonymkey) )
       (cl:in-package ,curpkgname)
       (cl:find-package ,synonymkey) )))

(defmacro end-qualified-package (synonym)
  (let ((synonymkey (intern (string synonym) :keyword)))
    `(cl:eval-when (:compile-toplevel :load-toplevel :execute)
       (cl:delete-package ,synonymkey) )))
```
リダイレクト先に適応されるlayout

ログインしていないユーザに対してリダイレクトで、ログインページに飛ばすときに、不用なheaderとかを外したかったので、ログインページ用のlayoutを専用に作ったのですが、そのレイアウトを

```ruby
render :file => 'redirect_page', :layout => 'layout_name'
```

で適応させました。
redirect先のcontrollerの指定actionをずっと触っていて時間を食いました。
・redirectした場合、layoutはredirect前のものを適応させられてしまうため、action単位でのlayoutが使えなかった。
・redirect先のcontrollerの設定が間違っていただけで、本当はredirect先のcontrollerの設定だけでなんとかなるはずだった。
のいずれが原因だったかわかりませんが。。。
[Clojure]年俸1000万の会社の試験問題

2011/09/28 17:34: yoshihiro503

 4種類のアルファベット "A,C,G,T" から成るn文字の文字列のうち、
"AAG"という並びが含まれる文字列を全て列挙するプログラムを書きなさい。
ただし、nは3以上の整数とし、文字列内に同じアルファベットが出現しても構わないものとし、
出力順序は問わないものとします。
http://alpha.cgios.net/alpha/cgios

(use 'clojure.contrib.combinatorics)
(defn solve [n]
  (filter #(re-find #".*AAG.*" %) (for [c (selections '(A C G T) n)] (apply str c))))
IPythonのプロンプトを起動時に'>>>'に変更する設定

0.12では, doctest_modeというマジックコマンドでプロンプトを'>>>'に変更できる.

    In [1]: %doctest_mode
    Exception reporting mode: Plain
    Doctest mode is: ON
    >>>

毎回打つのは面倒なので,起動時に自動で変更するように,以下のエイリアスを定義する.

    alias ipy='ipython -ic "%doctest_mode"'

なお0.12より以前のバージョン(もっと前かも)では, 'ipython -cl'で同様の処理ができていたようです.
setInterval、setTimeOut は function をそのまま渡せる。

setIntervalでぐぐると多くの例が関数呼び出しをわざわざ文字列にして渡しているが、普通に関数を渡せる。しかも文字列だとevalしないといけないからパフォーマンス上もよくない。何でこの風習が広がっているか謎。多分、ググルと上の方にあるからだろう。

```javascript
setInterval('doSomethingPeriodically()', 1000);
setTimeOut('doSomethingAfterFiveSeconds()', 5000);
```

```javascript
setInterval(doSomethingPeriodically, 1000);
setTimeOut(doSomethingAfterFiveSeconds, 5000);
```

[JavaScript Performance Best Practices - Nokia Developer Wiki](http://www.developer.nokia.com/Community/Wiki/JavaScript_Performance_Best_Practices#Pass_functions.2C_not_strings.2C_to_setTimeout.28.29_and_setInterval.28.29)
a 要素は URL 分離属性を持っているので自分で算出しなくていい。

a 要素は URL 分離属性である protocol, host, port, hostname, pathname, search, hash を属性として持っているので、hrefの文字列からどのドメイン向けかとか地味にかなり面倒な算出をしなくていい。

[a 要素 - テキストレベルの意味づけ - HTML要素 - HTML5 タグリファレンス - HTML5.JP](http://www.html5.jp/tag/elements/a.html)
Azure WCF: an AddressFilter mismatch at the EndpointDispatcher.

from [this thread](http://social.msdn.microsoft.com/Forums/en-AU/wcf/thread/bd7c6310-22b4-42da-9e2a-3a9ae17c6919)

AzureのWeb roleとかWorker roleとかはAzureプロジェクト上のRolesの設定から
TCPとかHTTPとかの接続を待ち受けるEndpointを定義できて、それをWorker role側コード上から

```
RoleInstanceEndpoint Endpoint 
  = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
```

みたいな感じで読めるわけだけど、このコードで得られるポート番号が設定で決めたポートと異なる場合がある。
これは、Azureでは外部にポートを開くのはロードバランサであって、Roleが走るマシンは実際はロードバランサから接続を仲介してもらう為。

これはまだいいんだけど、WCFを使ってこのWorker roleと通信しようとしたとき、こんな例外を拾う事がある。

```
The message with To '...' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.
```

これはサービスコントラクトのAddressFilterModeがデフォルトでAddressFilterMode.Exact（アドレスが厳密に一致しないとメッセージを受け付けない）になってる為。

EndpointにバインドしたサービスコントラクトにをAddressFilterMode.Anyをつけてやればいい。

```
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
```

普通にアドレスtypoしてもこの例外は飛んでくるからこの例外見たらまずtypoを疑うのが正解かも。
JavaScriptでfilter

JavaScriptで配列の要素をフィルターする方法。例えば値が正のものだけを取り出したいとか。

JavaScript 1.6なら、ずばりfilterメソッドがある。
古いブラウザの場合はjQueryのgrepメソッドという、ちょっと分かりにくい名前のメソッドで同じことが出来る。

```JavaScript
var nums = [-1, 2, 0, 3];
// JavaScript 1.6+
var pos1 = nums.filter(function(v) {
  return v > 0;
});
// jQuery
var pos2 = $.grep(nums, function(v) {
  return v > 0;
});
```
install emacs23.3b on amazon-linux(ec2)

At first,I tried to install emacs23.1 but it failed with weird error which seemed that the makefile generated by configure script was in wrong format. I googleg that and found some guys tell that might have some illegal white spaces or tabs. Then I tried emacs23.3b. It worked.

emacs23.3b needs ncurses. So,install ncureses-devel before installing it.
`$ sudo yum install ncurses-devel`

Then did, as always.

```
$ wget http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-23.3b.tar.gz
$ tar xfvz emacs-23.3b.tar.gz
$  ./configure && make && sudo make install
```
XOOPSのユーザテーブルのパスワードとメールアドレスを書き換えるクエリ

稼働中のサイトをローカルでテストするときに、パスワードを書き換えたり、メール誤送信を防ぐためにメールアドレスを書き換えるときに使うクエリ。

```mysql
SELECT TABLE_NAME INTO @user_table FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database() AND TABLE_NAME LIKE '%_users';
SET @update_query = CONCAT('UPDATE ', @user_table, ' SET pass = md5("test"), email = CONCAT(uid, "@localhost") ');
PREPARE stmt FROM @update_query;
EXECUTE stmt;
```

制限事項：```LIKE "%_users"``` でユーザテーブルを探すので、1データベースに _users で終わるテーブルが一つであること。
ハイフン区切りのワードを選択しやすくする

```vim:.vim/ftplugin/css.vim
" * での検索や text-object 等での選択時に - で切らない
setlocal iskeyword& iskeyword+=-
```

セレクタの命名規則にはハイフン区切り、アンダースコア区切り、キャメルケース等ありますが
デフォルトの設定ではハイフン区切りのワードを選択しづらいため、命名規則にハイフン区切りを採用する場合には
`iskeyword` にハイフンを追加すれば色々と捗る。
Titanium 1.8.0.1 でZipFile 0.1.21 モジュールを使う際の注意点

2012/1/23日現在
[ZipFile github](https://github.com/TermiT/ZipFile)のReadme内のHow to useでtiapp.xml へ設定するモジュールのバージョンが 0.1.20 になっているので下記のように設定する

```xml:tiapp.xml
...
<modules>
  <module platform="iphone" version="0.1.21">zipfile</module>
</modules>
```

Titanium 1.7 以降パスがURI形式になり、``Ti.FileSystem.applicationDataDirectory``の指す場所も変更された様だが、ZipFile モジュールは新しいパスの仕様に初期の状態では対応していないため

```coffeescript:app.coffee
applicationDataDirectory =
    ((Ti.Network.decodeURIComponent Ti.Filesystem.applicationDataDirectory)
        .replace 'file://localhost', '')
        .replace '/Documents/', ''
...
```

の様に変数を作り利用すると良い
寿司が落ちてくるやつ

```java:sushi.pde
import org.jbox2d.p5.*;
import org.jbox2d.common.*;
import org.jbox2d.collision.*;
import org.jbox2d.dynamics.*;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.joints.*;
import org.jbox2d.dynamics.contacts.*;

Physics physics;
Body circle;
class UserData {
  PImage img;
}
UserData data;
PImage toro_img, engawa_img, kappa_img, anago_img;

void setup() {
  size(800, 500);
  imageMode(CENTER);
  toro_img = loadImage("sushi2.png");
  engawa_img = loadImage("engawas.png");
  kappa_img = loadImage("kappa.png");
  anago_img = loadImage("anago.png");
  frameRate(60);
  InitScene();
}
void draw() {
  background(255);
  if(frameCount < 300) {
  if (frameCount % 30 == 0) {
    createSushi(300, 50, toro_img);
    createSushi(370, 50, kappa_img);
    createSushi(450, 50, engawa_img);
  } else if (frameCount % 20 == 0) {
    createSushi(310, 50, anago_img);
  } else if (frameCount % 10 == 0) {
    createSushi(320, 50, toro_img);
    createSushi(450, 50, engawa_img);
  } else if (frameCount % 5 == 0) {
    createSushi(320, 50, toro_img);
  }
  }
  physics.setRestitution(random(0,0.9)); 
}

void mousePressed() {
  createSushi(mouseX, mouseY, toro_img);
}
void createSushi(int X, int Y, PImage img) {
  circle=physics.createCircle(X, Y,20);
  data = new UserData();
  data.img = img;
  circle.setUserData(data);
  circle.setAngularVelocity(random(-10,10));
}

void keyPressed() {
  physics.destroy();
  physics = null;
  InitScene();
}



void InitScene() {
  float gravX = 0.0;                 
  float gravY = -100.0;
  float AABBWidth = 2*width;   
  float AABBHeight = 2*height;
  float borderBoxWidth = width;      
  float borderBoxHeight = height;
  float pixelsPerMeter = 30;
  physics = new Physics(this, width, height,
		              gravX, gravY,
			      AABBWidth, AABBHeight,
			      borderBoxWidth, borderBoxHeight,
			      pixelsPerMeter);

  //physics = new Physics(this, 800, 500);
  
  physics.setDensity(1.0f);
  physics.setCustomRenderingMethod(this, "custom");
  
}

void custom (World w) {
  smooth();
  for (Body circle = physics.getWorld().getBodyList(); circle != null; circle = circle.getNext())
  {
    org.jbox2d.collision.Shape shape;
    for (shape = circle.getShapeList(); shape != null; shape = shape.getNext())
    {
      if (shape.getType() == ShapeType.CIRCLE_SHAPE)
      {
        fill(0,0,0,0);
        stroke(0,0,0,0);
        sushiDraw(circle, shape);
      }
    }
  }
}

void sushiDraw(Body body, org.jbox2d.collision.Shape shape) {
  CircleShape circle = (CircleShape) shape;
  Vec2 center = circle.getLocalPosition();
  Vec2 wpoint = physics.worldToScreen(body.getWorldPoint(center));
  float radius = physics.worldToScreen(circle.getRadius());
  ellipse(wpoint.x,wpoint.y,radius*2,radius*2);
  if(radius == 20)
  {
    pushMatrix();
    translate(wpoint.x+1,wpoint.y+1);
    //rotate(random(-10,10));
    UserData data = (UserData) body.getUserData();
    image(data.img,0,0);
    popMatrix();
  }
}
```
CoffeeScriptでPythonのインタラクティブシェルやRubyのirbのようなのを起動する

```sh
% coffee
coffee>
```

で起動。改行したい場合は末尾に￥を入れる

```coffeescript
coffee> a = ->
[Function]
coffee> a()

coffee> a = -> \
......>   'hoge'
[Function]
coffee> a()
'hoge'
```
Zshで快適な補完ライフを送るために欠かせないもの

zsh付属のincremental-complete-wordを使いづらく感じる方は以下の2つがかなり合うのではないかと思う。

# incr.zsh
こんな感じに補完してくれる。
 ![incr](http://gist.github.com/raw/414589/a3f9c30c464823eb7c46eb41558ed68ad99961c5/auto-fu.gif "incr")
参考：http://d.hatena.ne.jp/hchbaw/20100526/1274886125

# zaw.zsh
anything.el / unite.vim ライクな検索ができる。
参考：http://u7fa9.org/memo/HEAD/archives/2011-02/2011-02-22_1.rst
gitolite: レポジトリのルートディレクトリ変更

gitサーバ管理者視点。

**$HOME/.gitolite.rc**にレポジトリのルートディレクトリが定義してあるのでそれをいじる。
ドキュメントによると[.gitolite.downを置いて](http://qiita.com/items/1827)から作業するといいみたい。

```bash
$REPO_BASE="repositories";
```

を

```bash
$REPO_BASE="/var/git/repos";
```
とか。絶対パスでも相対パスでもOK。
相対パスの場合は$HOME以下のディレクトリを指定可能。

設定を変えたらレポジトリ本体を移動させるのを忘れずに。

```bash
mv $HOME/repositories/* /var/git/repos/
```
gitolite: 一時的にすべてのpushを拒否する

gitサーバ管理者視点。

レポジトリのバックアップを取る時等、git pushされたら困る時、
gitolite管理者アカウントの$HOME以下に**.gitolite.down**ファイルを置くと、
ファイルがある間は全てのgit pushが拒否される。

git pushをしようとした側からは**.gitolite.down**の中身がエラーメッセージとして通知される。

```bash
cd $HOME
echo "git server denied your push request as making back up. Sorry!" > .gitolite.down
``` 

コミットしてみよう

```console
gitolite@alpha:~/gitolite-admin/conf$ git commit -a
[master 1d1fd5a] removing test project
 Committer: gitolite <gitolite@alpha.(none)>

 1 files changed, 0 insertions(+), 2 deletions(-)
gitolite@alpha:~/gitolite-admin/conf$ git push
Enter passphrase for key '/home/gitolite/.ssh/id_rsa':

                ***** ABORTING *****
       git server denied your push request as making back up. Sorry!
fatal: The remote end hung up unexpectedly
```

エラーメッセージfatalの部分はconfusableな気がするけど…。

一応**.gitolite.down**を消したらちゃんとpushが通る事を確認する。

```console
gitolite@alpha:~/gitolite-admin/conf$ cd ..
gitolite@alpha:~/gitolite-admin$ cd ..
gitolite@alpha:~$ rm .gitolite.down
gitolite@alpha:~$ cd gitolite-admin/
gitolite@alpha:~/gitolite-admin$ git push
Enter passphrase for key '/home/gitolite/.ssh/id_rsa':
Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (10/10), 1.10 KiB, done.
Total 10 (delta 1), reused 0 (delta 0)
To gitolite@localhost:gitolite-admin
   92b183e..1d1fd5a  master -> master
```
クラス階層表示

クラス階層をstderrに表示する

    void printClassHierarchy(id object)
    {
	    NSMutableArray *names = [NSMutableArray array];
	    Class objClass = [object class];
	    Class rootClass = [NSObject class];
	    while(objClass != rootClass) {
		    [names addObject:NSStringFromClass(objClass)];
		    objClass = [objClass superclass];
	    }
	    [names addObject:NSStringFromClass(rootClass)];
	
	    int i = 0;
	    for(NSString *name in [names reverseObjectEnumerator]) {
		    fprintf(stderr, "%*s%s\n", i++ * 4, " ", [name UTF8String]); 
	    }
    }
ブログの人気記事を見るブックマークレット

このあいだyaottiさんに見せびらかしたら思いのほか気に入っていただけたのでshare。

まず、以下のJavaScriptをブラウザのブックマークに登録する。（ページURLの欄にそのまま突っ込む）

```
javascript:%28function%28%29%7Bwindow.open%28%27http%3A%2F%2Fb.hatena.ne.jp%2Fentrylist%3Fsort%3Dcount%26url%3D%27%2Blocation.href%29%3B%7D%29%28%29%3B%0D
```

これを、たとえば http://d.hatena.ne.jp/yuku_t で実行すると、そのブログの記事をブックマーク数降順にソートしたページに飛べる。
（注意点としては、ブログのトップページで実行する必要があるということ。）
CSS SelectorをXPathに変換するコマンド

XPath書けないけれど、ライブラリの制約などの理由でXPathを書かざるを得ないときはたまにあると思う。そういうときはこのコマンドでCSS SelectorをXPathに変換すると便利。

```perl:selector2xpath
#/usr/bin/env perl
# Usage: selector2xpath <CSS Selector>

use strict;
use warnings;
use HTML::Selector::XPath 'selector_to_xpath';

my $selector = shift || exit;
print selector_to_xpath($selector), "\n";
```

これのPerlスクリプトをパスの通った場所に selector2xpath と名前を付けて保存して、実行権限を与えて source ~/.(zsh|bash)rc すれば終了。
なお、HTML::Selector::XPathが入っていない場合はCPANから入れる必要あり。
Controller の名前の最後に数字を入れると RoutingError になる

````sh
$ rails g contoller hoge_1 index
````

````ruby
  match 'hoge_1' => 'hoge_1#index'
````

と設定して /hoge_1 にアクセスすると

````ruby
Routing Error
uninitialized constant Hoge1Controller
````

になる。なんで？
バイト数をキロバイト・メガバイト・ギガバイトなどの書式に変換する関数

```php
<?php
/**
 * バイト数をフォーマットする
 * @param integer $bytes
 * @param integer $precision
 * @param array $units
 */
function formatBytes($bytes, $precision = 2, array $units = null)
{
	if ( abs($bytes) < 1024 )
	{
		$precision = 0;
	}

	if ( is_array($units) === false )
	{
		$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
	}

	if ( $bytes < 0 )
	{
		$sign = '-';
		$bytes = abs($bytes);
	}
	else
	{
		$sign = '';
	}

	$exp   = floor(log($bytes) / log(1024));
	$unit  = $units[$exp];
	$bytes = $bytes / pow(1024, floor($exp));
	$bytes = sprintf('%.'.$precision.'f', $bytes);
	return $sign.$bytes.' '.$unit;
}
```

使い方

```php
<?php
var_dump(formatBytes(1)); // 1 B

var_dump(formatBytes(1024)); // 1 KB

// 少数を出す
var_dump(formatBytes(1024, 2)); // 1.00 KB

// 単位の文言をカスタマイズ
var_dump(formatBytes(1024, 2, array('バイト', 'キロバイト', 'メガバイト'))); // 1.00 キロバイト
```

```php:PHPUnit用テストコード
<?php
class FormatBytesTest extends PHPUnit_Framework_TestCase
{
	/**
	 * @dataProvider data4testFormatBytes
	 */
	public function testFormatBytes($expect, $bytes, $precision, $units)
	{
		$actual = formatBytes($bytes, $precision, $units);
		$this->assertSame($expect, $actual);
	}
	
	public static function data4testFormatBytes()
	{
		return array(
			array('1 B', 1, 0, null),
			array('-1 B', -1, 0, null),
			array('-1 KB', -1024, 0, null),
			array('-1.0 KB', -1024, 1, null),
			array('1.5 KB', 1536, 1, null),
			array('1.50 KB', 1536, 2, null),
			array('10 バイト', 10, 0, array('バイト')),
			array('1 ギガバイト', 1073741824, 0, array('バイト', 'キロバイト', 'メガバイト', 'ギガバイト')),
		);
	}
}
```
uninitialized constant Delayed::DelayProxy::Job

delayed jobがエラーを吐くようになったので調べてみたら

> delayed_job doesn't work (rails 3.1.3)
> http://stackoverflow.com/questions/8932240/delayed-job-doesnt-work-rails-3-1-3

stackoverflowで解決。

> collectiveidea / delayed_job
> https://github.com/collectiveidea/delayed_job

gituhubに書いてあるとおりGemifileに書いて

```ruby:Gemfile
gem 'delayed_job_active_record'
```

```sh:console
bundle install
```

で解決！
コマンドラインからXcodeのビルド&実行

http://sakito.jp/emacs/emacsobjectivec.html#id14 を参考に，ビルド&実行をするスクリプト．

```sh:xcode-build-run 
#!/usr/bin/env osascript
tell application "Xcode" to activate
tell application "System Events"
     tell process "Xcode"
          key code 15 using {command down} # 15: R
     end tell
end tell
```
DEPRECATION WARNING: attr_accessor_with_default is deprecated. Use Ruby instead!.

rails3.1にしたら出たワーニング。

> How to do attr_accessor_with_default in ruby? 
> http://stackoverflow.com/questions/7052509/how-to-do-attr-accessor-with-default-in-ruby

属性のデフォルト値を設定したかったら、after_initializeでやってね。ってことみたい。
Railsで複数DBに接続

意外と簡単みたい。

database.ymlに
新しいdatabaseの接続情報を記述して、
modelの中で

```models/hoge.rb
class Hoge < ActiveRecord::Base
establish_connection "new_database"
```

と指定するだけでいいみたい。
http://www.gesource.jp/weblog/?p=634
DEPRECATION WARNING: primary_key_name is deprecated and will be removed from Rails 3.2 (use foreign_key instead).

> Rails3.1.1でDEPRECATION WARNINGが頻発した http://wp.gessy0129.com/rails3-1-1でdeprecation-warningが頻発した/2012/01/12/

これで解決しました。
railsでYAMLからseedを読み込む

マスタとか流し込みたいときはこんな感じでやってます。
依存関係とかある場合を考慮していないです。

マスタで依存関係あるようなデータってあまりないかな？っと。

```ruby:db/seed.rb
[Hoge, Fugo].each do |c|
  yml = File.read("#{Rails.root}/db/seeds/#{c.to_s.tableize}.yml")
  list = YAML.load(yml).symbolize_keys
  list[c.to_s.tableize.to_sym].each do |r|
    c.create do |t|
      r.each do |i, v|
        t.send "#{i}=", v
      end
    end
  end
end

=begin
hoges:
  -
    id: 1
    name: 'hoge'
  -
    id: 2
    name: 'hogehoge'
=end
```
F#で素数の無限シーケンスを作る

F#に初挑戦。
最初はなんかC#っぽいF#になってたのだが、
yield! と seq {for .. do if ... then ...} を覚えたので、
関数型っぽくなってきた気がする。

もとにしたのはHaskellのワンライナー。

```hs:primes.hs
primes = 2:f [3,5..] where f (x:xs) = x:f [y | y <- xs, mod y x /= 0]
```

*   F#の配列は固定長。 [|1; 2; 3;|]
*   F#のリストは正格評価。 [1; 2; 3;] あるいは [1..3] と書く。
*   F#のシーケンスは遅延評価だけど、Haskellのリストとは結構違う。
    一番違うのは、コンスセルではないこと。実態はIEnumerable&lt;T&gt;。headとtailに分けてパターンマッチできないらしいので注意。

    なんだかいろいろ書き方がある。
    個々の要素をシーケンスにするには、seq [1; 2; 3;] 。
    範囲指定なら seq {1..3} または seq [1..3] または {1..3} 。
    yieldを含む場合は seq { yieldを含む式 } または seq [ yieldを含む式 ] 。

    シーケンス式の中でシーケンスをyieldするには、yield! とやるといいらしい。

```fsharp:primes.fs
open System

let primes = 
    let odds = Seq.initInfinite (fun i -> 2 * i + 1)
    let rec f src =
        let (x, xs) = (Seq.head src, Seq.skip 1 src)
        seq {yield x; for i in f xs do if i % x <> 0 then yield i}
    seq {yield 2; yield! f (Seq.skip 1 odds)}

let list = primes |> Seq.take 10 |> Seq.toList

printfn "%A" list
```

ちなみに、シーケンスじゃなくて遅延リストが欲しい人は、F# PowerPackのLazyListを使うといい。
ある文字列が配列に含まれているかどうか

zsh である文字列が配列に含まれているかどうかを調べるには、
配列添字の r フラグが使える。

```sh
% ary=(foo fooo foooo fooooo)
% [[ -n ${ary[(re)fo]} ]] && echo 'found' || echo 'not found'
not found
% [[ -n ${ary[(re)fooo]} ]] && echo 'found' || echo 'not found'
found
```

パターンで検索するときは e フラグをつけない。

```sh
% [[ -n ${ary[(r)fo*]} ]] && echo 'found' || echo 'not found'
found
% [[ -n ${ary[(re)fo*]} ]] && echo 'found' || echo 'not found'
not found
```

http://zsh.sourceforge.net/Doc/Release/Parameters.html#Subscript-Flags
RecursiveTreeIteratorでtreeコマンドを実装

treeコマンドだって簡単に書ける、そうPHPならね。
Iteratorは拡張性を確保する手段として面白いです。
http://jp2.php.net/manual/ja/class.recursivetreeiterator.php

オプションのパースが面倒だったので-a(dotfileも表示) -d(ディレクトリだけ表示) -L(再帰レベル指定) しか対応してないです。
実行権限を与えて`./tree.php`などのように実行すると、現在のディレクトリがアスキーアートでツリー表示されます。

```php:tree.php
#!/usr/bin/env php
<?php
/**
 * treeコマンドのPHP5.3による実装例。
 */
namespace Tree;

//iterator類は名前が長いので短縮
use RecursiveDirectoryIterator as RDI,
    RecursiveFilterIterator as RFI,
    RecursiveTreeIterator as RTI;

$opt = getopt('adL:');

$di = new RDI('.');

// -a で"."から始まるファイルも表示。 --------------
// 通常は"."をフィルタする
if (!isset($opt['a'])) {
    $di = new DotFilter($di);
}
class DotFilter extends RFI {
    function accept() {
        $fname = $this->current()->getFilename();
        return $fname[0] !== '.';
    }
}

// -d で ディレクトリのみにフィルタ -----------------
if (isset($opt['d'])) {
    $di = new \ParentIterator($di);
}

$rti = new RTI($di, RTI::BYPASS_CURRENT);
// デザインを少し変更。Unix風
$rti->setPrefixPart(RTI::PREFIX_END_LAST, '`-');
$rti->setPrefixPart(RTI::PREFIX_RIGHT, '- ');

// -L n で深さを指定
if (isset($opt['L'])) {
    $rti->setMaxDepth((int)$opt['L'] - 1);
}

foreach ($rti as $file) {
    echo $rti->getPrefix();
    echo $file->getFilename();
    echo PHP_EOL;
}

```

大事なのはforeachたった１つでこれが実現できていることですね。
js->coffee移行にあたって考えたこと

個人製作のシステムのjsをcoffeeに完全移行したのでその雑感を書きます。あくまでも個人的な感想です。感じ方は人それぞれです。

ちなみに僕は勉強を兼ねて手で移行させましたが、js2coffeeというツールを使うと自動で変換してくれるらしいです。

#先に結論

coffeeの方がいいと思う。

よくある批判に「js書けばいいじゃん」というのがあるけど、極端な話、「アセンブラ書けばいいじゃん」と高級言語が出てきた頃に言ってた人と主張の方向性は似てると思う。極端すぎるけど。

jsには落とし穴がいっぱいある。慣れてもたまにはまる。`var`を忘れたり「関数の頭で全部の`var`を列挙する」というプラクティスに従ってたら、冗長になって管理するコスト高くなったり。

coffeeを使うとそういう余計な問題を意識しなくてよくなるのはとても大きい。

しかもjsでできることの全てをcoffeeでできる。工夫が必要になる場面もあるけど。

#coffeeの方がイイ点

##データサイズ

もともと19KB程度あったjsファイルをcoffeeで書きなおしたところ、9KBになった。

このことから、普通にjsを書くよりcoffeeを書く方が圧倒的に少ないタイプ量で済むこと分かる。

また、生成されるjsファイルの大きさを見たところ15KBくらいだった。ただし、もとのjsにはドキュメントがついていたことを考えると、それほど大きな差はないと思われる。

ゆえに、jsコードが膨張する心配も無いと僕は結論づけた。

##開発スピード

上でも書いたように、タイプ量が減るということは開発スピードが上がることを意味する。

個人開発なので、開発コストは少しでも小さくしたかったので、これは以外と大きいと思った。

##クラス

prototypeベースの継承は理解すれば問題無いけれどなんだかんだ言ってクラスベースの方が個人的にしっくりくる。

おれおれクラス実装しているのよく見るけど、ライブラリ毎の微妙な違いとかいちいち考えるの面倒じゃないですか。

coffeeだと`class`という専用の構文で書くから、ぱっと見で定義が把握しやすい。

##インデント言語

Pythonistaですから

##ファイル分けが簡単

即時無名関数内にjsを定義するとプライベート関数とか使えて便利だけど、ソースコードをファイル単位で分割して管理するのがやりにくい。ファイルをまたがって使いたいような関数はグローバルにおかないと行けないから、少なくとも一つはグローバル空間を汚染しないといけなくなる。

```js
// code1
(function() {
this.namespace.hoge = function () {};
// 本当はprivateにしたくても、code2で使うにはグローバルに置かざるをえない
}).call(this);
```

```js
// code2
(function() {
this.namespace.hoge(); 
}).call(this);
```

でもcoffeeならそういう問題がない。

```shell
$ cat src/coffee/* | coffee -sp > src/js/main.js
```

追記：こんなことしなくても、coffeescriptが標準で方法を準備してくれている。http://qiita.com/items/1831

`cat`で結合してから`coffee`に渡すだけでよかったりする。つまり

```coffeescript
# code1
hoge ->
```

```coffeescript
# code2
hoge()
```

を`cat`して

```coffeescript
# code1
hoge ->
# code2
hoge()
```

コンパイルすれば以下のようにjsが生成される

```js
(function () {
  var hoge;
  hoge = function () {};
  hoge();
}).call(this);
```

分かるようにグローバルを汚染すること無くファイルをまたいでプライベート関数を共有できている。

Rails3.1を使ってるとフレームワークの方が同じようなことをしてくれるらしい。

余談：まーjsでもcatでファイルをまたいだプライベートの共有できますけどね。つまり

```js
(function() {
```

```js
var hoge;
hoge = function () {};
```

```js
hoge();
```

```js
}).call(this);
```

みたいにファイルを分割すれば。でも気持ち悪いことこの上ない。特に最初と最後のファイルが醜悪過ぎる。

##学習コスト

今回僕は、coffeeを初めて触った。19KBのjsコードを手で変換するのに2時間弱かかり、その時に調べながらcoffeeへの変換を行った。

jsに関する事前知識が充実していたので、習得が早かったのもあるが、jsを一から勉強するのに比べればcoffeeの学習コストは小さいと感じた。

Pythonistaなのでリスト内包っぽく配列を書けるのが嬉しい。

###初学者にはcoffeeの方が優しそう

せっかく書いたから残すけど、あまり重要でないから読み飛ばしてOK

jsには初学者がよく躓く落とし穴が沢山あるが、その際たる例がcallback関数における`this`の挙動だと思う。

coffeeでは「どんな場面でも`=>`を使えばよい」という一言でだいたい片が付く。「毎回`var self = this`って書いて、`this`の代わりに`self`を書けばいい」と教えるよりはましだと思う。

for-in文を知った初学者がやりがちな間違いとして、配列をinで回すという失敗もcoffeeなら「配列ならin、オブジェクトならofだよ」で済む。

あとjsでイディオム的に書かれる

```js
for (var prop in obj) if (obj.hasOwnProperty(prop) {
    var val = obj[prop]
    // doSomething
}
```

`hasOwnProperty`が何故必要か教えるのは面倒だし、タイプ量多くて嫌だけどcoffeeなら

```coffeescript
for own prop, val of obj
    # doSomething
```

のように「とりあえず`own`てつけとけ」で済む。

#coffeeの悪い点

##書ける人が少ない

現状は。Railsさんの力でこれから先は分からないと思う。

それに学習コストは低いからそれほど問題とは思えない。

##jsレベルでのデバッグがしんどい

これが一番問題な気がする。が、自分自身まだ直面したことないからよく分からない

##コンパイルが必要

自動化すればいい、というだけの話ではある。
最長循環小数を求める

@fumievalさんの[このツイート](https://twitter.com/#!/fumieval/status/159466836398841857)に触発されてやってみました。

1/xが循環小数のとき、循環部分ができるだけ長くなるような素数xを見つけます。

```haskell:longestRecurringDecimal
primes = 2:f [3,5..] where f (x:xs) = x:f [y | y <- xs, mod y x /= 0]

ones = 11:(map (\x-> x*10+1) ones)

longestRecDec m n [] = ((m*9) `div` n, n, length $ show m)
longestRecDec m n (p:ps)
   = let l=f p ones in
     if l>m then longestRecDec l p ps
            else longestRecDec m n ps
     where f x (y:ys) = if y `mod` x==0 then y
                                        else f x ys

longestRecurringDecimal n
   = longestRecDec 1 1 (takeWhile (<n) $ drop 3 primes) 
```

longestRecurringDecimal nが本体で、nより小さい素数で、一番循環部分が長い物を探します。
戻ってくるのは、巡回列、見つかった素数、巡回列の長さ、のタプルです。

以下実行結果のサンプル：

```ghc:
*Main> longestRecurringDecimal 1000
(10172939979654120040691759918616480162767039674465920651068158697863682604272634791454730417090539165818921668362156663275686673448626653102746693794506612410986775178026449643947100712105798575788402848423194303153611393692777212614445574771108850457782299084435401831129196337741607324516785350966429298067141403865717192268565615462868769074262461851475076297049847405900305188199389623601220752797558494404883011190233977619532044760935910478128179043743641912512716174974567650050864699898270600203458799593082400813835198372329603255340793489318413021363173957273652085452695829094608341810783316378433367243133265513733468972533062054933875890132248219735503560528992878942014242115971515768056968463886063072227873855544252288911495422177009155645981688708036622583926754832146490335707019328585961342828077314343845371312309257375381485249237029501525940996948118006103763987792472024415055951169888097660223804679552390640895218718209562563580874872838250254323499491353,983,982)
```

簡単に解説すると、1/99...9（9がm個）は循環小数として、00...01（0がm-1個の後に1）の繰り返しなるので、hという数が循環列として循環する数はh/99...9の形になります。これが1/nという形だから、nは99...9を割り切らなければいけません。そのようなできるだけ長い99...9を見つけるという問題になります。99...9=9*11...1だから、素数pについて、pが11...1を割りきるような最長な11...1を探していきます。
配列の中で重複している値とそのキーを返す関数

```php
<?php
/**
 * 重複しているのを返す
 * @param array $array
 * @return array
 */
function detectDuplication(array $array)
{
	$duplications = array();

	foreach ( $array as $index => $value )
	{
		if ( is_integer($value) === false and is_string($value) === false )
		{
			$array[$index] = strval($value);
		}
	}

	foreach ( $array as $value )
	{
		$duplications[$value] = array();
	}

	foreach ( $array as $index => $value )
	{
		$duplications[$value][] = $index;
	}

	foreach ( $duplications as $value => $indexes )
	{
		if ( count($indexes) < 2 )
		{
			unset($duplications[$value]);
		}
	}

	return $duplications;
}
```

```php
<?php
$array = array('red', 'red', 'blue', 'green', 'red'); // redが３つありますね
$duplications = detectDuplication($array);
var_dump($duplications);
/*
array(1) {
  ["red"]=>
  array(3) {
    [0]=>
    int(0)
    [1]=>
    int(1)
    [2]=>
    int(4)
  }
}
*/
```

```array_count_values(array input)``` は重複の有無は数からわかるけど、どのキーが重複しているかわからないので作ってみた。
ctagsで正しくJsの関数の定義元にジャンプする

~/.ctags　に設定を書けば解決した。

```
--langdef=js
--langmap=js:.js
--regex-JavaScript=/([A-Za-z0-9._$\(\)]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/m,method/
--regex-JavaScript=/([A-Za-z0-9._$\#\(\)]+)[ \t]*[:][ \t]*([A-Za-z0-9._\-\#\'\"]+)[ \t]*/\1/p,property/
--regex-JavaScript=/([A-Za-z0-9._$\#\(\)]+)[ \t]*[:][ \t]*([A-Za-z0-9\'\"._\-\#\(]+)[ \t]*\{/\1/p,property/
--regex-JavaScript=/var ([A-Za-z0-9._$\#]+)[ \t]*[=][ \t]*([A-Za-z0-9._'"\$\#\[\{]+)[,|;]/\1/v,variable/
--regex-JavaScript=/([A-Za-z0-9._$\#]+)[ \t]*[=][ \t]*([A-Za-z0-9._'"\$\#]+)extend\(/\1/c,class/

--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/,object/
--regex-js=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/,function/
--regex-js=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\(([^)])\)/\1/,function/
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/,array/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^"]'[^']*/\1/,string/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^']"[^"]*/\1/,string/
```
Gitでn番目のコミットハッシュを取得するワンライナー

cherry-pickを使う際のお供に.
gitpythonが使えるなら素直にそっちを使った方がよいかも.
そもそもPythonで書く意味はあまりない…

    python -c "n = 1; import re ;from subprocess import Popen, PIPE;import sys; sys.stdout.write([commit.split(' ')[1] for commit in re.split('\n*', Popen(['git', 'log'], stdout=PIPE).communicate()[0]) if commit.startswith('commit ')][n])" | pbcopy

(追記) subprocessモジュールを使わないでsys.stdinを使用したバージョン.こっちの方がまだ少しは書きやすい.

    git log | python -c "import sys; word = 'commit '; n = 0; p = lambda x: sys.stdout.write(x); l = [line.replace(word, '') for line in sys.stdin if line.startswith(word)]; p(l[n])" | pbcopy
【要望】ソースコード埋め込み、コードハイライト言語にDartの追加

Qiitaに以下の機能が欲しいです。

- Qiitaに書いたソースコードを他のWebページ・ブログなどへ埋め込むためのHTMLコードを生成
- コードハイライト言語へのDartの追加

ご検討よろしくお願いします。
Androidでスマホサイトのリンクを押した時につくオレンジ枠を消す

iOSは-webkit-tap-highlight-colorが使えるが、Androidは使えない。
Androidだとリンクやボタンを押した時、リンク領域にオレンジ色の枠がつく。
これは、タップ時のハイライトカラーを透明にすることで解消できる。
ただし、枠を消したままにするとタップしたのかわかりずらいので、CSSで押した時に色を変えるなどしよう。

#iPhone
a { -webkit-tap-highlight-color:#dcb4dc; color:#8867a8; }

#Android
a { -webkit-tap-highlight-color:rgba(0, 0, 0, 0)!important; }
ActionFormでsetDependsByArray()に指定できる制約を拡張する方法

ActionForm の プロパティの setDependsByArray に指定できる制約をお手軽に追加する方法はあるのかな。カスタム制約を定義するには、たぶんクラス1個作る必要あるよね

XCube_DependClassFactory::factoryClass($dependName) ってのがあった。

XCube_{HogeHoge}Validatorってクラスがあると、それが制約として働くみたい

カスタム制約くらすは　XCube_Validator インターフェイスを継承しておけばいいみたい

でも、名前空間がXCubeだから、カスタム制約クラスをモジュールに作れない（規約的に

そうなるとXCube_FieldPropertyクラスを継承して、FieldPropertyから自分の名前空間に引きずり込まないといけないし

それかんがえると、validateHogeHoge()をActionFromに作ったほうが楽チンだな
has_many_through　の実装をMongoidでどうすればいいか分からなかったので調べた

```ruby
class User
  include Mongoid::Document
  has_many :appointments
end


class Appointment
  include Mongoid::Document
  belongs_to :physician
  belongs_to :patient
end


class Patient
  include Mongoid::Document
  has_many :appointments
end



```
どうしても無名関数だと困る場合

CoffeeScriptで関数を定義すると必ず無名関数で定義される

```coffeescript
hoge = ->
```

```js
var hoge;

hoge = function () {};
```

基本的にこれで問題ないけど、無名関数だと困る場合がたまにある。具体的にはコンストラクタの名前にアクセスしたい場合。

```js
hoge = function() {};
h = new hoge();
h.constructor.name // => ""

function hoge() {}
h = new hoge();
h.constructor.name // => "hoge"
```

このような場面で無名関数でなく有名関数（？）を強制的に使いたい場合もclassを使えばできる。というか、コンストラクタとして使うのだからclassを使えというのは、至極当たり前な感じもする。

```coffeescript
class hoge
h = new hoge
console.log h.constructor.name
```

```js
hoge = (function() {

  function hoge() {}

  return hoge;

})();

h = new hoge();
console.log(h.constructor.name) // => "hoge"
```

さらに余談で、何故僕がこんな重箱の隅の問題にはまったかというと、gjstestというjsのテストフレームワークを使おうとして、コンストラクタの名前が空だと、結果をhtmlに出力した時にバグが生じるためでした。
iTerm2でsvn diffをちょっと見やすくする。


![a Image](http://img.skitch.com/20120206-8yrwmwebxkknjkcrtypiqyk9gr.jpg)
iTerm2でsvn diffしたときに、サラっと色づけして見やすくする。
<http://qiita.com/items/1958>と同じ感じに設定。
Preference > Profiles > Advanced > Triggers を編集する。
TeXで集合を内包表記で綺麗に書く

よくあるがあまりマクロを見かけない, 集合の内包表記.

```TeX:set.sty
\def\defset#1#2{%
  \settoheight\@tempdima{$#1$}
  \settoheight\@tempdimb{$#2$}
  \ifdim \@tempdima<\@tempdimb
    \@tempdimc=\@tempdimb
  \else
    \@tempdimc=\@tempdima
  \fi
  \left\{ \> #1 \left\vert \rule{0pt}{1.1\@tempdimc} \right. #2 \> \right\}
}
\def\extdefset#1{%
  \settoheight\@tempdima{$#1$}
  \left\{ #1\rule{0pt}{2\@tempdima} \right\}
}
\let\set\extdefset
```

```TeX:set.tex
$ f^{-1}(y) = \defset{ x \in X }{ f(x) = y } $
$ \defset{ (f,g) \in (X^Y)^2 }{ f(x) = g(x) } $
```

などの様に使う. どちらかが大きくなるとそれに伴って { | } が大きくなってくれる.
然し同じ様に\setを定義しようとすると上手くいかない. 何故...
document.createTextNode に&nbsp;を入れる方法

```javascript
document.createTextNode("&nbsp;")
```

自動的にエスケープされるので "&nbsp ;"という文字が表示されてしまう。
こういう時はユニコードエスケープ形式を使えば良い。

```javascript
document.createTextNode("\u00a0")
```

他の文字参照もこの方法でできるが、ユニコードエスケープ形式に置換しておかないといけない。

[adding non-breaking spaces in createTextNode [Archive] - CodingForums.com の BrainJarさん参照](http://www.codingforums.com/archive/index.php/t-6252.html)
sugar.jsの便利な拡張メモ

http://sugarjs.com/

プロトタイプを拡張するもの。日本語文字列の拡張ばかりが話題になっていたが、便利なユーティリティ系も豊富。

基本的にプロトタイプを拡張する場合は、他にプロトタイプを拡張するものと競合しないことを確認し、かつ使用していることを明言すること。自分がエンドユーザーであるならば無制限に使って構わないが、プラグイン作成に混ぜるのは、それが本当に必要でない限り控えること。

## 定義
nodeでもクライアントでも使える。nodeの場合はnpmで。

## おまじない ##

```
Object.extend()
```

これを呼ぶことでObjectクラスそのものをsurag.jsで定義されたObjectに拡張される。
つまり、Object.keys({a:'a'}) という呼び方が可能なのだが、{a:'a'},keys() のようにも呼べるようになる。

なお、引数としてオブジェクトを渡すと、そのクラスのみ拡張された状態になる。

## Object.watch ##
プロパティの変更が行われると実行される関数を定義することが出来る

```
coffee> obj = {a:'a','b':'b'}

coffeee> Object.watch obj,'a',(prop,oldval,newval)->console.log prop,oldval,newval

coffee> obj
{ b: 'b', a: [Getter/Setter] }

coffee> obj.a = 'big brother is watching you!'
a a big brother is watching you!
'big brother is watching you!'
```

## Object.merge ##

プロパティを混ぜる
どちらをベースにするかは第三引数できまる

```
coffee> Object.merge {a:1,b:1},{a:2,c:1}
{ a: 2, b: 1, c: 1 }
coffee> Object.merge {a:1,b:1},{a:2,c:1} ,false
{ a: 1, b: 1, c: 1 }
```

衝突時の挙動を関数で定義する

```
coffee> Object.merge {a:1,b:1},{a:2,c:1},(key,a,b)->a+b
{ a: 3, b: 1, c: 1 }
```

ここで紹介したのは一部。
あとで適当に書き足す
あるファイルに使われている関数を数えて返す

メソッドとかクラスも引っかかっちゃうけどまあいいや。 実行してもいいような場合は ```get_defined_functions()``` のほうがいいかも。

```php
<?php
$filename = '/path/to/file.php';
$contents = file_get_contents($filename);
$tokens = token_get_all($contents);

$functions = array();

while ( count($tokens) > 0 )
{
	$token = array_shift($tokens);

	if ( $token[0] !== T_STRING )
	{
		continue;
	}

	$isFunction = false;

	while ( count($tokens) > 0 )
	{
		$_token = array_shift($tokens);
		
		if ( $_token[0] === T_WHITESPACE )
		{
			continue;
		}
		else
		{
			if ( $_token[0] === '(' )
			{
				$isFunction = true;
			}
		
			break;
		}
	}
	
	if ( $isFunction === true )
	{
		$functions[] = $token[1];
	}
}

$functions = array_count_values($functions);
arsort($functions);
print_r($functions);
```
閏年かどうかを判定する

今年は閏年ですね。2012年にちなんで、閏年かどうかを判定する方法を２点ほど。

```php

<?php

// まじめに計算する方法
function isLeapYear($year)
{
	return ( ( $year % 4 === 0 and $year % 100 !== 0 ) or $year % 400 === 0 );
}

$years = range(2000, 2012);

foreach ( $years as $year ) {
	echo $year, ' ', var_export(isLeapYear($year), true), PHP_EOL;
}

// 2月29日があるかを判定する方法
function isLeapYear2($year)
{
	return checkdate(2, 29, $year);
}

$years = range(2000, 2012);

foreach ( $years as $year ) {
	echo $year, ' ', var_export(isLeapYear2($year), true), PHP_EOL;
}
```

とういうことで、item ID 2012 ゲト ⊂（゜Д゜⊂｀つ≡≡≡ズザー
kmyaccとPHPでオレオレプログラミング言語を作る - 環境構築編

githubからkmyaccを取ってくる

```
$ git clone https://github.com/moriyoshi/kmyacc-forked.git
Cloning into kmyacc-forked...
remote: Counting objects: 76, done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 76 (delta 14), reused 76 (delta 14)
Unpacking objects: 100% (76/76), done.
```

```
$ cd kmyacc-forked/
```

インストール先は自分のところだけにしたいので変更する

```
$ vim src/Makefile 
```

```text
PREFIX = /usr/local を
PREFIX = /Users/suin に書き換える
```

/Users/suin/bin と /Users/suin/lib を作る (なければ)

```
$ mkdir ~/bin ~/lib
```

~/binにパスが通ってるか確認

```
$ echo $PATH
/Users/suin/bin:/Applications/MAMP/bin/php5.2/bin:/Applications/MAMP/Library/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
```

make & make install

```
$ make
cd src; make all
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"'   -c -o yacc.o yacc.c
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"'   -c -o grammar.o grammar.c
grammar.c: In function ‘intern’:
grammar.c:106: warning: cast from pointer to integer of different size
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"'   -c -o token.o token.c
token.c: In function ‘raw_gettoken’:
token.c:331: warning: control reaches end of non-void function
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"'   -c -o lalr.o lalr.c
lalr.c: In function ‘cmpprec’:
lalr.c:707: warning: control reaches end of non-void function
lalr.c: In function ‘item2pnum’:
lalr.c:170: warning: control reaches end of non-void function
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"'   -c -o misc.o misc.c
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"'   -c -o genparser.o genparser.c
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"'   -c -o compress.o compress.c
cc -Wall -O2 '-DPARSERBASE="/Users/suin/lib/kmyacc"' yacc.o grammar.o token.o lalr.o misc.o genparser.o compress.o -o kmyacc
```

```
$ make install
cd src; make install
install -d /Users/suin/bin
install -s kmyacc /Users/suin/bin
install -d /Users/suin/lib
install -d /Users/suin/lib/kmyacc
install kmyacc.c.parser /Users/suin/lib/kmyacc
install kmyacc.java.parser /Users/suin/lib/kmyacc
install kmyacc.js.parser /Users/suin/lib/kmyacc
install kmyacc.pl.parser /Users/suin/lib/kmyacc
install kmyacc.py.parser /Users/suin/lib/kmyacc
install kmyacc.php.parser /Users/suin/lib/kmyacc
install kmyacc.as.parser /Users/suin/lib/kmyacc
install kmyacc.hsp.parser /Users/suin/lib/kmyacc
```

とりあえず実行してみる

```
$ kmyacc
KMyacc - parser generator ver 4.1.4
Copyright (C) 1987-1989,1992-1993,2005,2006  MORI Koichiro

Usage: kmyacc [-dvltani] [-b y] [-p yy] [-m model] [-L lang] grammar.y
```

文法ファイルをコンパイルしてみる

```
$ kmyacc -m ~/lib/kmyacc/kmyacc.php.parser sample/calc.phpy 
```

できあがった calc.php を実行してみる

```
$ /usr/bin/php sample/calc.php
1+2+3
6
^C
```

できたー＼(^o^)／


* /Users/suin などはご自分の環境に合わせて読み替えてください。
array_filter()と組み込み関数でフィルタリングする

## 0を取り除くっぽい処理

もし、0以上の自然数という前提があれば使えるかも？

```php
<?php
$array = array(-1.5, -1, -0.5, 0, 0.5, 1, 1.5);
var_dump(array_filter($array, 'intval'));
/*
array(4) {
  [0]=>
  float(-1.5)
  [1]=>
  int(-1)
  [5]=>
  int(1)
  [6]=>
  float(1.5)
}
*/
```

## 空白文字からなる要素を取り除く

```php
<?php
$array = array('', "\n", "\t", ' ', 1, 'foo');
$array = array_map('trim', $array);
var_dump(array_filter($array, 'strlen'));
/*
array(2) {
  [4]=>
  string(1) "1"
  [5]=>
  string(3) "foo"
}
*/
```

## 存在しないファイルをリストから取り除く

```php
<?php
touch('foo.txt');
$array = array('foo.txt', 'bar.txt', 'baz.txt');
var_dump(array_filter($array, 'file_exists'));

/*
array(1) {
  [0]=>
  string(7) "foo.txt"
}
*/
```
SUM関数を加算演算子（＋）に変換する

こんな関数を標準モジュールに追加した後、ワークシート側で"=Decompose(数式が書かれたセル)"とやる

```vbnet:TEST.BAS
Function Decompose(c As Range) As String
    Dim f, f1, f2, s1, s2 As String
    Dim r As Range
    Dim i As Integer
    f = c.Formula
    f1 = Left(f, 5)
    f2 = Right(f, 1)
    If f1 <> "=SUM(" Or f2 <> ")" Then
        Decompose = ""
        Exit Function
    End If
    s1 = Mid(f, 6, Len(f) - 6)
    For Each r In Range(s1)
        If s2 <> "" Then
            s2 = s2 & "+"
        End If
        s2 = s2 & r.Address(False, False)
    Next
    Decompose = "=SUM(" & s2 & ")"
End Function
```