OmniAICreator/Qiita-1.07M huggingface dataset:
scheme で等価述語の例

勉強中でよく忘れてしまうのでメモ

```scheme
(equal? (list 1 2 3) (list 1 2 3))  ; => #t
((lambda (p) (eq? p p)) (cons 1 2)) ; => #t
(eq? 'example 'example)             ; => #t
(eqv? 1 1)                          ; => #t
(eqv? 1 1.0)                        ; => #f
(= 1 1.0)                           ; => #t
(char=? #\a #\a)                    ; => #t
(string=? "example" "example")      ; => #t
(char-ci=? #\a #\A)                 ; => #t
(string-ci=? "example" "EXAMPLE")   ; => #t
(not #f)                            ; => #t
```
等価述語以外の述語

```scheme
(pair? '(1))                        ; => #t
(null? '())                         ; => #t
(list? (list))                      ; => #t
(boolean? #f)                       ; => #t
(symbol? 'example)                  ; => #t
(number? 1)                         ; => #t
(char? #\a)                         ; => #t
(string? "string")                  ; => #t
(odd? 1)                            ; => #t
(even? 2)                           ; => #t
(zero? 0)                           ; => #t
(char-alphabetic? #\a)              ; => #t
(proper-list? '(1 2))               ; => #t
(proper-list? '(1 . 2))             ; => #f
(any odd? '(1 2))                   ; => #t
(any odd? '(2 4))                   ; => #f
```
iTerm2のTriggerの正規表現で後方参照

- [iTerm2で特定文字列をハイライトやGrowl通知する](http://qiita.com/items/1958)

上記の例の様に `[\w:]+Error` が表示されたら Growl に通知されるようにした。この時多くの正規表現実装と同じように `\0` でマッチした文字列を Growl に渡すことができた。例えば、下の画像のように `\0 Occured` とした状態で `SyntaxError` という文字列が iTerm2 上に出たら `SyntaxError Occred` と Growl で通知される。ついでに `()` でグループ化してやれば `\1` などで参照することもできた。

![](https://img.skitch.com/20120310-prxiqjp9b2gs38bt7ds8ud5c1q.png)
Vundleで管理しているプラグインをアップデートする

`BundleInstall!` コマンドを使う（末尾の!を忘れずに）

```
:BundleInstall!
```

特定のプラグインのみをアップデートする場合は、引数にそれを与える

```
:BundleInstall! Shogo/unite.vim
```
ctags で CoffeeScript のタグを生成

~/.ctags に以下を追加

```
--langdef=coffee
--langmap=coffee:.coffee

--regex-coffee=/class ([A-Za-z.]+)/\1/c,class/
--regex-coffee=/^([A-Z][a-z].*)[ \t]*=/\1/n,namespace/
--regex-coffee=/^[ \t]*([A-Z][a-zA-Z]*)/\1/c,class/
--regex-coffee=/^[ \t]*([A-Za-z]+)[ \t]*=.*->.*$/\1/f,function/
--regex-coffee=/^[ \t]*([A-Za-z]+)[ \t]*:.*->.*$/\1/m,method/
--regex-coffee=/^[ \t]*([ \t][a-z]+)[ \t]*=.*$/\1/v,var/
--regex-coffee=/^[ \t]*(@[A-Za-z]+)[ \t]*=.*$/\1/i,ivar/
```
iTunesライブラリファイルを読み込んで再生回数が0回の曲数をカウントする

iTunesのライブラリファイル（iTunes Library.xml）を読み込んで、再生回数が0回の曲数をカウントする。

```perl:count.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Mac::iTunes::Library;
use Mac::iTunes::Library::XML;

my $library = Mac::iTunes::Library::XML->parse( 'iTunes Library.xml' );

my $count=0;
my %items = $library->items();
while (my ($artist, $artistSongs) = each %items) {
    while (my ($songName, $artistSongItems) = each %$artistSongs) {
        foreach my $song (@$artistSongItems) {
            if (!defined($song->playCount())) {
                $count++;
            }
        }
    }
}

printf("%5d / %5d\n", $count, $library->num());
```
PHP5.4のビルトインウェブサーバーを起動するシェル

いちいち ```php -S hostname:port``` 打つのめんどくさいって人向け

```shell:start_php_server.sh
#!/bin/sh

if [[ $(php -r "echo version_compare(PHP_VERSION, '5.4.0', '<') ? 0 : 1;") -eq 0 ]]; then
	echo "PHP version must be 5.4.0 or later."
	exit 1
fi

php -S 0.0.0.0:8080 -t /path/to/document_root
```
golang最新版のgo toolで go run hello.go

コマンド体系に破壊的な仕様変更があった
今まであったgoinstallや6gや8gはなくなって、主にgoというコマンドに集約されてる。


最新版をいれる

```
$ hg clone -u weekly https://go.googlecode.com/hg/ go
$ cd go
$ cd src
$ cd ./all.bash
...
$ export PATH=$PATH:~/go/bin
$ which go
/Users/mzi/go/bin/go
```

ハローワールド

```go:hello.go
package main
import "fmt"

func main(){
	fmt.Printf("Hello, world\n")
}
```


スクリプト言語のように実行する。
 
```
$ go run hello.go
Hello, world
```


プロジェクトで実行したい場合は go buildなどを使う。あとで書く。
【解決済】closure libraryからgoog.net.Jsonpを使ってtwitter anywhereを読み込む方法


```javascript:closure_twitter_anywhere.js
goog.provide('test.Twitter');
goog.require('goog.net.Jsonp');

/** @constructor */
test.Twitter = function() {
  var jsonp = new goog.net.Jsonp("http://platform.twitter.com/anywhere.js");
  jsonp.send();
};
goog.addSingletonGetter(test.Twitter);
test.Twitter.getInstance();

```

####参考情報
美しいけどサンプルのない公式ドキュメント(英語)
http://closure-library.googlecode.com/svn/docs/class_goog_net_Jsonp.html
質問した
http://goo.gl/4kK3L
本体のソースコード
http://closure-library.googlecode.com/svn/docs/closure_goog_net_jsonp.js.source.html
Closure::bind()を使ってprivate変数をすっぱ抜く

    <?php

    /**
     * http://jp2.php.net/manual/ja/closure.bind.php
     *
     * @author Katsuhiro Ogawa
     */

    class Wozozo
    {
        private $secret = 'happy';
    }

    $wozozo = new Wozozo();
    //$wozozo->secret;
    // -> Fatal error: Cannot access private property Wozozo::$secret

    $moriyoshi = Closure::bind(function() {
        return $this->secret;
    }, $wozozo, 'Wozozo');

    var_dump($moriyoshi());
PHP 5.4.0 では、Class::{expr}() がサポートされました

動的にあおいちゃんを呼ぶ。

```php:
<?php
/**
 * PHP 5.4.0 では、Class::{expr}() がサポートされました
 * こういうこと
 */

class Miyazaki
{
    public static function aoi()
    {   
        echo "aoi!", PHP_EOL;
    }   
}

function getAoiMethod()
{
    return 'aoi';
}

Miyazaki::aoi();
Miyazaki::{getAoiMethod()}();
```
リンク切れのシンボリックリンクを一括削除

```sh
find . -xtype l | xargs rm
```

上記を実行するとパスがスペースを含んでいる場合にスペースで区切られてしまい、そんなファイルは存在しないとエラーが発生します。

正しくはコメントをご確認ください。
Mint12の64bit版でgitのcloneに失敗する場合の対処法

Vundleでvimのプラグインがインストールできずかなりの時間を費やしてしまった。
下記サイトの方法で対応可。

[httpプロキシ経由でgitリポジトリをhttpsプロトコルから取得する時の注意(Ubuntu)](http://d.hatena.ne.jp/ike-dai/20120216/1329402680)
rootで処理を行うシェルスクリプト

シェルの途中でルートパスワードを入力させて、それ以降をルートで実行するためには以下のようにするとできます。

```

#!/bin/bash

Passwd()
{
        su root -c "$0 '#'"
}

Root_exe()
{
        #execute commands as root
}

if [ "$1" = '#' ]; then
        Root_exe || exit $?
else
        Passwd || exit $?
fi
```
Play(scala) on herokuからデータベースを使う方法

herokuのdbは使わない　amazonのrds使う
amazonのrdsはdbのインスタンスを作ってsecurity groupの設定をする
play側は、下記のファイルについて、usr,pwd,host,databaseをそれぞれ書き換える

```
#project/conf/application.conf
db=mysql://user:pwd@host/database

```

取り急ぎぐぐってみつけた参考資料たち
http://www.delicious.com/puriketu/heroku+play+scala
javascriptで生Ajax

HTTP GET/POST だけのためにライブラリ使うのはオーバーという場合に。
（古いブラウザまでは対応していない）

```javascript
// Usage:
// httpRequest( url, {
//     type: method name,
//     success: callback (optional),
//     data: map of params (optional),
// } );

function httpRequest (url, opt) {
    function throwExeption () {
        throw new Error('Usage: httpRequest(url, { type: method [, success: cb, data: params ] })');
    }
    if (!opt) throwExeption();
    var params = opt.data;
    var cb     = opt.success;
    var method = opt.type;
    if (!method) throwExeption();

    var req = new XMLHttpRequest();
    req.open(method, url, true);
    req.onreadystatechange = function() {
        if (req.readyState === 4) {
            if (req.status === 200) {
                if (cb) cb(req.responseText);
            } else {
                throw new Error("fetch failed: (" + req.status + ") " + url);
            }
        }
    };
    if (/post/i.test(method)) {
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        var data = '';
        for (var name in params) if (params.hasOwnProperty(name)) {
            data += encodeURIComponent(name) + "=" + encodeURIComponent(params[name]) + "&";
        }
        req.send(data);
    } else {
        req.send(null);
    }
}

```
google calendar apiでカレンダーにhtmlを埋め込む方法

コメント欄でSinraptor@githubさんが解説してくれています(未検証)。

####やりたいこと
カレンダーの中から予定を選択>予定の詳細の中にリンク(ボタンが望ましい)がある>それを押すとどこかにリクエストを投げる
文字列連結ベンチ

~~~ {haskell}
{-# LANGUAGE OverloadedStrings #-}                                                   
                                                                                     
import Data.Monoid                                                                   
import Blaze.ByteString.Builder as B                                                 
import Blaze.ByteString.Builder.Char.Utf8 as BT                                      
import qualified Data.ByteString.Char8 as BS                                         
import qualified Data.Text as T                                                      
import qualified Data.Text.Encoding as T                                             
import Criterion.Main                                                                
                                                                                     
concatBT :: [T.Text] -> T.Text
concatBT = T.decodeUtf8 . B.toByteString . mconcat . map BT.fromText                 
                                                                                     
concatBB :: [BS.ByteString] -> BS.ByteString                                         
concatBB = B.toByteString . mconcat . map B.fromByteString                           
                                                                                     
main :: IO ()                                                                        
main = defaultMain                                                                   
  [ bench "String"       $ nf   concat   $ replicate 1000 ("hello" :: String)        
  , bench "blaze (Text)" $ whnf concatBT $ replicate 1000 ("hello" :: T.Text)        
  , bench "blaze (BS)"   $ whnf concatBB $ replicate 1000 ("hello" :: BS.ByteString)
  ]                                                                                  
~~~

結果：

~~~
warming up
estimating clock resolution...
mean is 1.427688 us (640001 iterations)
found 6395 outliers among 639999 samples (1.0%)
  6056 (0.9%) high severe
estimating cost of a clock call...
mean is 37.01206 ns (12 iterations)
found 1 outliers among 12 samples (8.3%)
  1 (8.3%) high mild

benchmarking String
mean: 71.54872 us, lb 71.11242 us, ub 72.54105 us, ci 0.950
std dev: 3.221645 us, lb 1.745424 us, ub 6.485196 us, ci 0.950
found 5 outliers among 100 samples (5.0%)
  3 (3.0%) high mild
  2 (2.0%) high severe
variance introduced by outliers: 42.508%
variance is moderately inflated by outliers

benchmarking blaze (Text)
mean: 93.39355 us, lb 92.54418 us, ub 94.62662 us, ci 0.950
std dev: 5.182060 us, lb 3.906787 us, ub 7.223113 us, ci 0.950
found 7 outliers among 100 samples (7.0%)
  4 (4.0%) high mild
  3 (3.0%) high severe
variance introduced by outliers: 53.465%
variance is severely inflated by outliers

benchmarking blaze (BS)
mean: 25.15464 us, lb 24.74210 us, ub 26.21941 us, ci 0.950
std dev: 3.155812 us, lb 1.518559 us, ub 6.576698 us, ci 0.950
found 12 outliers among 100 samples (12.0%)
  3 (3.0%) high mild
  9 (9.0%) high severe
variance introduced by outliers: 86.249%
variance is severely inflated by outliers
~~~
foo()[0] のように、関数の返り値を配列として扱えるようになりました。

> foo()[0] のように、関数の返り値を配列として扱えるようになりました。

http://php.net/manual/ja/migration54.new-features.php

使い所としてはこんなかんじかな

```php
<?php

$string = 'foo,bar';

// PHP 5.3 
echo reset(explode(',', $string)); // "foo"

// PHP 5.4
echo explode(',', $string)[0]; // "foo"
```
複数オブジェクトの逆順並べ


```jquery_indices_object_reverse.js
$(function(){
  // same class name jQuery object
  $('div.some_class');
  // these reverse indices jQuery object
  // Once get indexed objects to array, 
  // Then use Array.reverse() to descending order.
  // At last, convert array object to jQuery object.
  $($('div.some_class').get().reverse());
});
```
Node書くならEventEmitterについて知っとくべし

Nodeの組み込みモジュール・サードパーティモジュール問わず広く使われるのが `EventEmitter` オブジェクト。
これはNodeで使われるデザインパターンの筆頭みたいなものなので、知っておかねばならない。

ドキュメント: [Events](http://nodejs.org/api/events.html)

ブラウザ上のJavaScriptで `addEventListener` を使ってイベントドリブンの開発を行うが、Node上でそれを行うのための機能を提供するのが `EventEmitter`。
例えば次のように使う

```js
var EventEmitter = require('events').EventEmitter;

function asyncFunc() {
  var ev = new EventEmitter;
  console.log('in asyncFunc');
  setTimeout(function () {
    ev.emit('done', 'foo', 'bar');
  }, 1000);
  return ev;
}

var async = asyncFunc();
async.on('done', function(arg1, arg2) {
  console.log(arg1, arg2);
})
```

これを実行すると `in asyncFunc` と表示された1秒後に `foo bar` と表示される。

Nodeを使うと非同期処理が多くなるが、コールバックを受け取る設計では、複数の関数を実行したい時面倒くさい。
そこでコールバックを受け取る代わりに `EventEmitter` を返すようにする。一回だけしか実行されないなら `once` を使うといい。

```js
var ev = new EventEmitter;

ev.on('data', function(data) {console.log('on', data);});
ev.once('data', function(data) {console.log('once', data);});

ev.emit('data', 1);
// => on 1
// => once 1
ev.emit('data', 2);
// => on 2
// once は実行されない
```

組み込みモジュールで `EventEmitter` を使っているものは非常に多い。非同期処理がからむモジュールは基本的にみな使っていると言って過言でない。
サードパーティだと例えば [Socket.IO](http://socket.io) が同様のインタフェースを用いている。
配列の転置


```ruby:transpose.rb
# Array#transpose
a = [[1,2,3],[4,5,6],[7,8,9]]
a.transpose
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

# same return 
a[0].zip(*a[1..-1])
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```
ssh鍵の鍵指紋を表示

`ssh-keygen -l -f 鍵ファイル` で可能．鍵は公開鍵秘密鍵どちらでもOK(もちろん同じ鍵ペアだと同じ結果が帰って来る)．

```shell-session
$ ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub
1024 29:3f:e1:d7:12:9e:9b:47:07:77:6e:3d:98:87:ba:63 /etc/ssh/ssh_host_dsa_key.pub (DSA)
$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 31:3a:2d:90:c5:21:ef:bd:a9:d9:a3:f9:00:48:e0:fc /etc/ssh/ssh_host_rsa_key.pub (RSA)
$ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 1a:b9:16:84:a7:86:0f:b3:e3:e8:42:3f:bc:55:c3:20 /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)
$ ssh-keygen -l -f ~/.ssh/id_dsa.pub
1024 ac:19:5e:fb:62:22:0a:af:67:29:d0:f1:75:fa:94:59 /home/mk/.ssh/id_dsa.pub (DSA)
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
2048 68:91:c3:a0:58:22:d8:13:7a:07:06:9f:a7:b8:ec:01 /home/mk/.ssh/id_rsa.pub (RSA)
$ ssh-keygen -l -f ~/.ssh/id_ecdsa.pub
256 0b:fb:21:45:d6:a0:7d:57:02:24:9b:d3:ed:c7:c6:23 /home/mk/.ssh/id_ecdsa.pub (ECDSA)
```

ssh-agent に登録しているものは以下のコマンドで確認可能

```shell-session
$ ssh-add -l
2048 b3:83:65:00:3b:54:20:15:57:ec:6b:d7:f8:78:8c:9f mk@x210s (RSA)
 :
```

Hash Visualization の表示には `v` option を付与する．

```shell-session
% ssh-keygen -vlf id_ed25519.pub
256 c8:de:fd:ad:b6:64:9b:bd:14:8a:09:60:b7:f0:bf:fb  mk@x220 (ED25519)
+--[ED25519  256--+
|                 |
|                 |
|      + .        |
|     o * .       |
|      o S     .  |
|     . . + o . . |
|      . . = + .  |
|           =.*   |
|          o+Eo+. |
+-----------------+
```

追記)
OpenSSH 6.8/6.8p1 から規定値の鍵指紋アルゴリズムと表示形式が変わった．
- 旧 : MD5/hex
- 新 : SHA256/base64
そして`-E`オプションでアルゴリズムが指定できるようになった
※ssh-keygen --help より
> 
       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]

※man より
> 
     -E fingerprint_hash
             Specifies the hash algorithm used when displaying key fingerprints.  Valid options are: “md5” and “sha256”.  The default is “sha256”.

OpenSSH 6.8p1 で実行．SHA256/base64 で表示される．頭の方にアルゴリズムが付くように．visual の方もアルゴリズムが入るように．

```shell-session
% ~/usr/local/openssh-6.8p1/bin/ssh-keygen -l -v -f /etc/ssh/ssh_host_ecdsa_key
256 SHA256:pDZReijOXeDXAE0IgYb5E+DHgbyvClEllKCs499RI54 root@x220(ECDSA)
+---[ECDSA 256]---+
|+*+++oo=+        |
|*o*o...=.o       |
|.=o+. = = .      |
|.o+o o B         |
|+ ..o.=oS        |
|.o ...+..        |
|...  E           |
|... . .          |
|o  . .           |
+----[SHA256]-----+
```

`-E` オプションを使い`MD5/hex`で表示

```shell-session
% ~/usr/local/openssh-6.8p1/bin/ssh-keygen -l -v -E md5 -f /etc/ssh/ssh_host_ecdsa_key
256 MD5:e8:d0:53:e7:34:59:e9:77:3a:e7:8d:8a:a9:f6:91:84 root@x220(ECDSA)
+---[ECDSA 256]---+
|            ..   |
|           o.    |
|        . =.     |
|     . o = .. . .|
|    . + E o  . o |
|     o . . .  o .|
|      .   o    =.|
|        .  +  . o|
|       ..o+ ..   |
+------[MD5]------+
```

OpenSSH 6.8/6.8p1 以前が廃れるまで併記したほうが良いのかもしれない．


追記2)
`OpenSSH 7.2`で`ssh-keygen`に標準入力と複数の鍵の格納されたファイルが扱える機能が入る予定．リリースされたら再度確認して[blog](http://matoken.org/blog/)に書く予定．

- [OpenSSH 7.2で入る予定のssh-keygenの標準入力と複数の鍵の格納されたファイルの扱いのメモ 標準入力の場合公開鍵のみ ``` $ sudo…](https://plus.google.com/u/0/+KenichiroMATOHARA/posts/XspBE26nv55 "OpenSSH 7.2で入る予定のssh-keygenの標準入力と複数の鍵の格納されたファイルの扱いのメモ 標準入力の場合公開鍵のみ ``` $ sudo…")
autoで何が起きたのかわからないときに

autoのように高度な機能を持ったtacticを使用した時に、
何が起きたのかわかないということがよくあると思います。

そのようなときはtactic名の前にinfoをつけることで、
具体的にどのようなtacticが適用されたのかを見ることができます。
rails-erdでRailsのモデルを図にする

graphvizをインストール。

```sh
yum -y install graphviz-devel 
```

rails-erdをインストール。

```sh
gem install rails-erd
```

使用するプロジェクトのGemFileに追記。

```ruby
group :development do
  gem 'rails-erd'
end
```

```sh
bundle install
```

出力。

```sh
rake erd
```
PDOで1xNのデータをDBから取得するなら

1xNって表現でいいのか自信ありませんが、要は`SELECT txt FROM Hoge`みたいなSQLで取ってこれる、1行あたりカラム数が1のデータのことです。
PDOで素直にPDO::FETCH_NUMで取ってくると、

```php
<?php
$pdo = new PDO('...');
$stmt = $pdo->query('SELECT txt FROM Hoge');
var_dump($stmt->fetchAll(PDO::FETCH_NUM));

//[ [txt1], [txt2], [txt3], ... ]
```

配列の配列になってしまい、冗長です。

こんなとき、FETCH_COLUMNでfetchすると、カラムを一つだけ取ってくるようになるので、配列が1段消えて扱いやすくなります。

```php
<?php
$stmt = $pdo->query('SELECT txt FROM Hoge');
var_dump($stmt->fetchAll(PDO::FETCH_COLUMN, 0));

//[ txt1, txt2, txt3, ... ]

//こうしてもOK
$stmt = $pdo->query('SELECT txt FROM Hoge');
$stmt->setFetchMode(PDO::FETCH_COLUMN, 0);
var_dump($stmt->fetchAll());
```

FETCH_COLUMNの引数は0から始まるカラムの番号です。
「もっと見る」でページングしたらpushStateしてほしい

Qiitaに限った話ではなく、AutoPagerize-likeなページングを実装しているサイトがそうなっていてほしいのですが。

ページ送りして数ページ先まで読んだあと、別のページに進み、また戻ってきた場合、最初のページに戻されます。

現在のページ数もわかりませんし、またページ数を指定することもできなさそうですから、うっかりヒストリ移動をしてしまうととても悲しいです。
httpclientを使ってRubyで簡単POST

HTTPClientのインスタンスにURLと送りたいもののハッシュを渡すだけ
ファイルの添付もファイルハンドラ渡すだけ

```Ruby
require 'httpclient'
@c = HTTPClient.new()
res = @c.post('http://example.com', {:title => 'あああ', :image => open('path_to_file','r')})
```
組データに対する hashCode() の実装はどのようにすればいいですか？

二つ組のデータで、(a, b) == (b, a) としたいとき、hashCode() の実装はどのようにすべきでしょうか？
今はこんな風にやっています。

```java:MyCouple.java
public class MyCouple {
	private final String left;
	private final String right;
	
	public MyCouple(String left, String right) {
		this.left = left;
		this.right = right;
	}
		
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof MyCouple) {
			MyCouple obj2 = (MyCouple) obj;
			return ( this.left.equals(obj2.left) && 
					 this.right.equals(obj2.right) ) 
					|| ( this.left.equals(obj2.right) && 
					     this.right.equals(obj2.left) ); 
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		// これは邪道？
		return left.hashCode() + right.hashCode();
	}
}
```

これは邪道でしょうか？なにか問題が起こりますか？
また、推奨されるやり方があれば教えてください。
扇形と点の当たり判定

AS3版

```actionscript:AS3
public function hitTestArcPoint(cx:Number, cy:Number, rad:Number, startAng:Number, endAng:Number, px:Number, py:Number):Boolean {
	var dx:Number = px - cx;
	var dy:Number = py - cy;
	var sx:Number = Math.cos(startAng);
	var sy:Number = Math.sin(startAng);
	var ex:Number = Math.cos(endAng);
	var ey:Number = Math.sin(endAng);
	if(sx * ey - ex * sy > 0) {
		if(sx * dy - dx * sy < 0) return false; // second test
		if(ex * dy - dx * ey > 0) return false; // third test
		return true; // all test passed
	} else {
		if(sx * dy - dx * sy > 0) return true; // second test
		if(ex * dy - dx * ey < 0) return true; // third test
		return false; // all test failed
	}
}
```

Java版

```java:Java
public boolean hitTestArcPoint(float cx, float cy, float rad, float startAng, float endAng, float px, float py) {
	float dx = px - cx;
	float dy = py - cy;
	float sx = (float) Math.cos(startAng);
	float sy = (float) Math.sin(startAng);
	float ex = (float) Math.cos(endAng);
	float ey = (float) Math.sin(endAng);
	if(sx * ey - ex * sy > 0) {
		if(sx * dy - dx * sy < 0) return false; // second test
		if(ex * dy - dx * ey > 0) return false; // third test
		return true; // all test passed
	} else {
		if(sx * dy - dx * sy > 0) return true; // second test
		if(ex * dy - dx * ey < 0) return true; // third test
		return false; // all test failed
	}
}
```

・最初に円で判定をする (first test)
・次に開始角に対して直線で判定する (second test)
・最後に終了角に対して直線で判定する (third test)

どれか一つでも外れれば接触なしと判定します。
円の判定にはお馴染みピタゴラスの定理、
直線の判定には差分ベクトルの外積を使いました。
ただし角度が180度を超えていると正しく判定できないので条件を反転しています。

面積の小さい順に並べておくとささやかな高速化になります。
Modelのプロパティだけ取得する（仮）

**（追記：ActiveRecordの場合はコメントにあるやつを使ってください**

上手に取れないしゴミもはいるけどとりあえず

```Ruby
Post.instance_methods.grep(/=$/).each{|m| puts m.to_s.delete(':').delete('=')}

#=>
name
email
title
body
```
ウンコIEは連想配列でお役所仕事

IEはこういうのを読まずにエラーを吐きます。
4行目の一番後ろに、もう要素がないのに「,」をつけてるからです。

```javascript:エラーを吐きます
var people = {
	"0" : { "name":"Revin" },
	"1" : { "name":"Revot"},
	"2" : { "name":"Rebjn"},
};
```

死ねーーーーーーーーーーーーーーーーッ！！！！！！！
text.hamlで空行（改行）をいれる

RailsでビューをhamlにしているとActionMailerが使うテンプレートもhamlになるのだけど、それで改行を入れたいという話。

`\`(バックスラッシュ)をいれればよい

```haml
こんにちは
/
さようなら
```

といれれば

```
こんにちは

さようなら
```
となる

see also : http://stackoverflow.com/questions/6014116/rails-haml-line-breaks-in-text-mail
依存せず簡単にリクエスト

```php:依存せず簡単にリクエスト
<?php
$url = 'http://revinx.net/';
$postdata = array(
	'mode' => 'test'
);
$options = array('http' => array(
    'method' => 'POST',
    'content' => http_build_query($postdata),
));
$contents = file_get_contents($url, false, stream_context_create($options));
?>
```
ページ内のチェックボックスの状態を一斉に変更するブックマークレット

自分用メモとして転載：[全てチェックを入れるブックマークレット【JavaScript】 - Programming Magic](http://www.programming-magic.com/20080122235436/)

ニコニコ動画で、マイリスト内の動画を全部移動するなどの際に、全動画を一括チェックする機能がないためひとつひとつチェックする必要があった。非常に面倒だったので、探していた。

```javascript:すべてチェックを入れる
javascript:(function (){var inputs = document.getElementsByTagName('input');for(var i=0; ; i++){for (var j=0; j < inputs.length; j ++) {var e = inputs[j];if (e.type == 'checkbox')e.checked = true;}if(i < window.frames.length){try {inputs = window.frames[i].document.getElementsByTagName('input');}catch(e){}}else{break;}}})();
```

```javascript:すべてチェックを外す
javascript:(function (){var inputs = document.getElementsByTagName('input');for(var i=0; ; i++){for (var j=0; j < inputs.length; j ++) {var e = inputs[j];if (e.type == 'checkbox')e.checked = false;}if(i < window.frames.length){try {inputs = window.frames[i].document.getElementsByTagName('input');}catch(e){}}else{break;}}})();
```

```javascript:すべて切り替える
javascript:(function (){var inputs = document.getElementsByTagName('input');for(var i=0; ; i++){for (var j=0; j < inputs.length; j ++) {var e = inputs[j];if (e.type == 'checkbox')e.checked = !e.checked;}if(i < window.frames.length){try {inputs = window.frames[i].document.getElementsByTagName('input');}catch(e){}}else{break;}}})();
```
TitaniumStudioで[新規ファイル追加]=>[command + Z]でファイル削除される

[新規ファイル追加]のあとエディターにフォーカスしていない状態で[command + Z]すると[新規ファイル追加]の取り消しになるよ。作業して保存していてもファイルごと消えてしまうよ。

[command + shift + Z]で戻せるけど、エディターにフォーカスしていると勘違いしていた場合何が起こったかわかりづらいから気をつけて下さい。バージョン管理、まめなcommitは必須ですね。

以上、教訓
requireで新たなファイルを読み込む場合Project Cleanが必要

新たにhoge.jsというファイルを読み込んだ場合、"Script Error = Couldn't find module: hoge."というエラーが出る。一度ProjectをCleanすればOK

```js:require.js
require("hoge");
```

また以下のように、新たなファイル"images/foo.png"を追加して読み込んだ先で表示させても反映されない。これも一度ProjectをCleanすればOK

```js:hoge.js
var hoge = Ti.UI.createView({
	backgroundImage:"images/foo.png"
});
グラフに日本語表示させるための設定

Mac OS X においてグラフに日本語を表示させるためには、フォントの設定を適切をする必要がある。

`.Rprofile` に下記設定を追記すると、いい感じで日本語を表示させることができる。

```R:.Rprofile
setHook(packageEvent("grDevices", "onLoad"), function(...){
        if(.Platform$OS.type == "windows")                     
            grDevices::windowsFonts(sans ="MS Gothic",
                                    serif="MS Mincho",           
                                    mono ="FixedFont")
        if(capabilities("aqua"))   
            grDevices::quartzFonts( 
                                   sans =grDevices::quartzFont(  
                                                               c("Hiragino Kaku Gothic Pro W3",
                                                                 "Hiragino Kaku Gothic Pro W6",
                                                                 "Hiragino Kaku Gothic Pro W3",
                                                                 "Hiragino Kaku Gothic Pro W6")),
                                   serif=grDevices::quartzFont( 
                                                               c("Hiragino Mincho Pro W3",
                                                                 "Hiragino Mincho Pro W6",
                                                                 "Hiragino Mincho Pro W3",
                                                                 "Hiragino Mincho Pro W6")))
        if(capabilities("X11"))
            grDevices::X11.options( 
                                   fonts=c("-kochi-gothic-%s-%s-*-*-%d-*-*-*-*-*-*-*",
                                           "-adobe-symbol-medium-r-*-*-%d-*-*-*-*-*-*-*"))
            grDevices::pdf.options(family="Japan1GothicBBB")
            grDevices::ps.options(family="Japan1GothicBBB")})
       
attach(NULL, name = "JapanEnv")
assign("familyset_hook", function() { 
       winfontdevs=c("windows","win.metafile", "png","bmp","jpeg","tiff", "RStudioGD")
       macfontdevs=c("quartz","quartz_off_screen", "RStudioGD")
       devname=strsplit(names(dev.cur()),":")[[1L]][1]
       if ((.Platform$OS.type == "windows") && (devname %in% winfontdevs)) par(family="sans")
       if (capabilities("aqua") && devname %in% macfontdevs) par(family="sans")
}, pos="JapanEnv")
setHook("plot.new", get("familyset_hook", pos="JapanEnv"))
setHook("persp", get("familyset_hook", pos="JapanEnv"))
```
AWSのRDSのお値段(実績)

実験用にちょこっと使うって感じではない。あるいは設定が悪いのか。
これならec2上にデータベース構築した方が安そうだ。

###アジアパシフィック（東京）地域 （Region)
Amazon RDS Storage
####$0.12 per 1 million I/O requests	 
203,421 IOs	 
$0.02
####$0.12 per GB-month of provisioned storage	 
2.493 GB-Mo	 
$0.30
####$0.12 per RDS Small Instance hour (or partial hour)	 
Amazon RDS for MySQL Community Edition
371 Hrs	 
$44.52
####合計
$44.84
xoops-watch-template.php - XOOPS Cubeモジュール開発ツール時にテンプレートを自動でアップデート

XOOPS Cubeのモジュール開発で一番めんどくさい作業といえば、テンプレートの更新。
いちいち手動でモジュールアップデートを実行しないといけません。

開発者仲間からどうにかならないの？と言われたので、
テンプレート更新を検知したらモジュールアップデート自動でやってくれるコマンドラインツールを作りました。
https://github.com/suin/xoops-watch-template
quickrunの言語ごとのコマンドの設定には関数も使える

例えば以下の設定を

    ("python" . ((:command . "python") (:compile-only . "pyflakes %s")
                 (:description . "Run Python script")))

以下のような感じに変えても動く

    ("python" . ((:command . (lambda () (print "hey") "python")) (:compile-only . "pyflakes %s")
                 (:description . "Run Python script")))

現在のファイルパスや状況に合わせてコマンドのパスなどを変えることができる。
各種IDEでVimのキーバインドを使用するためのプラグイン

[VisualStudio 2010 - VsVim](http://code.msdn.microsoft.com/windowsdesktop/VisualStudio2010-tips-b4885a57)

[Xcode - XVim](http://programming.jugglershu.net/softwares/xvim.html)
Railsのconfig/route.rbで別サイトにリダイレクトさせる際の注意点

Railsのroute設定では別URLへのリダイレクトを記述できるが、ちょっとしたpitfallがあるので書いておく

リダイレクト記述は下記のようになる

```ruby:routes.rb
 get "foo/:id" => redirect("http://othersite.com/foo/%{id}",:status => 301 )
```


ここで問題はこの記述を書く位置である。若干Railsのバグっぽい挙動があり、例えばlink_toなどのハッシュ型のリンク記述でidがあると上記とマッチしてしまうという現象がある。

つまり


```erb
<%= button_to "POST",:controller => "bar",:action => "foo",:id => 12  %>
```

のようなリンクがある場合、下記のようにリダイレクトのものが先にくると、困ったことにそれにマッチしていると認識されるようである

```ruby:route.rb
get "foo/:id" => redirect("http://othersite.com/foo/%{id}",:status => 301)
post "foo/:id" => "foo#bar"
```

結果としては意図しない外部サイトへのリダイレクトに遭遇することとなる。

よって外部サイトのredirectはroute.rbの最後に書くのが安全そうである。

ちなみにroutingのテストはfunctionalsテストとして下記のように書ける

```ruby:foo_controller_test.rb
assert_routing "/foo/123",{:controller =>"bar",:action =>"foo",:id => "123"}
assert_routing {:method => :post,:path => "/foo"},{:controller => "bar",:action => "foo"}
```
現時点ではredirectを持つroutingのテスト方法は不明([stack overflowで質問中](http://stackoverflow.com/questions/9852478/assert-routing-with-redirection))だが、それ以外だけでも丁寧に書いておけば妙なハマりを未然に防げるだろう。
ec2でスクレイピング

不精してローカルでスクレイピングしがちだけど、長時間スクレイピングする場合はec2を使ってnohupで実行させている。nohupを使うと、ssh接続を切っても実行し続けてくれる。コマンドの後ろに&をつけるとバックグラウンド実行になる。
ec2を使うのは、自宅のネットワークだと不安定だったりするし、スクレイピングを走らせるとパソコンを移動させることができなくなるから。普段phpを使うことはないんだけど、スクレイピングだけはphpでやっている(セキュリティとかあんまり気にしないし、書き捨ての場合が多いのでメンテとか全然考えない)。
php使いの人にはおなじみなんだろうけど、とにかくfile_get_contentsとfile_put_contentsが強力すぎる。そしてなによりググったときのヒット率がやばい。あと、スクレイピングにphpを使う理由として、スクレイピングが得意な友人がphp使いだったというのも大きい。自分がスクレイピングのときに使うライブラリはhtmlsql。正規表現で済む場合は正規表現を使う。


```sh:nohup.sh
nohup php foo.php > bar.txt &
```

phpをec2にインストールしただけではmb_languageが使えないので、下記のコマンドを叩いてインストールする必要がある。

```sh
yum install php-mbstring
```
PDOにPEAR_DB形式のDSNを渡しても大丈夫なように

PDOとPEAR_DBを共存させると、DSNを複数回か書かなくてはいけなくて不便です。
そこで一括で扱えるようにします。

ポイントはPDOはExtends出来るという点。
```php:myPDO.php
<?php 
class SQLDB extends PDO{
}
```
PDOはExtendsしてオーバーライド出来るのです、胸熱。

これを利用してPEAR_DB形式のDSNを解釈するようにします。


```php:myPDO.php
<?php
class SQLDB extends PDO{
    public $database_name;
    public $DSN;
    public $USER;
    public $PASS;
    public function __construct($DSN,$USER=null,$PASS=null){
        if($this->is_pear_db_style_dsn($DSN)){
            list($DSN,$USER,$PASS) = trans_pear_db_DSN_to_pdo_dsn($DSN);
        }
        if($USER=null||!$PASS=null){
            throw new Exception("USER/PASSがnullです。".
            "DBのユーザー名とパスワードを省略するときは、空文字 PASS=''を与えて下さい ");
            exit;
        }
        parent::__construct($DSN,$USER,$PASS);
        $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->DSN  = $DSN;
        $this->USER = $USER;
        $this->PASS = $PASS;
    }
    //PEAR DB 形式のDSNか判定する。
    public function is_pear_db_style_dsn($dsn){
        //PEAR DSNは、URL形式なのでURL形式でパースして、結果がNULLでなければ、
        //PEAR::DB形式と断定
        return array_key_exists("hash", $parse_url($dsn));
    }
    //PEAR DB 形式のDNSをPDO形式に変えてしまう
    public function trans_pear_db_DSN_to_pdo_dsn($DSN){
        $dsn = $DSN;
        $hash = parse_url($dsn);
        $dsn_array = array();
        $dsn_array["driver"] = $hash["scheme"];
        $dsn_array["host"] = $hash["host"];
        $dsn_array["db_name"] = str_replace("/","",$hash["path"]);
        $dsn_array["user"] = $hash["user"];
        $dsn_array["pass"] = $hash["pass"];
        //var_dump($hash);
        //var_dump($dsn_array);exit;
    
        $PDO_DSN = "{$dsn_array['driver']}:host={$dsn_array['host']};dbname={$dsn_array['db_name']}";
        $PDO_DB_USER = $dsn_array["user"];
        $PDO_DB_PASS = $dsn_array["pass"];
        return array(
            "DSN"         => $PDO_DSN,
            "USER" => $PDO_DB_USER,
            "PASS" => $PDO_DB_PASS,
        );    
    }
    
}
```
php-build をインストールして pear を使う方法

[php-build](https://github.com/CHH/php-build) は、複数バージョンのPHPのダウンロード・展開・コンパイル・インストールまでをコマンドひとつで行えるツールです。拡張やPEARライブラリの管理などを行う ```pyrus``` がインストール時に同梱されるため、pearコマンドはインストールされません。

ここでは、```pyrus``` ではインストールできない ```pecl``` ライブラリを使うために、 ```pyrus``` を無効にし、 ```pear``` を使えるようにする方法を紹介します。

* Ubuntu環境での手順です

## 1. php-build のインストール

ソースコードをチェックアウトする: 

```
cd
git clone git://github.com/CHH/php-build
cd php-build/
```

install.shに[バグ](https://github.com/CHH/php-build/pull/49)があるので修正する:

```
vim install.sh 
```

下記の行を消す:

```
chmod -R 0777 "$LOG_DIR"
```

```php-build``` のインストールを実行する:

```
sudo ./install.sh
```

インストールできたか確認する:

```
php-build --definitions
```

PHPのバージョンが羅列されればOK。


## 2. 定義ファイルをバージョン管理下に置く

定義ファイルは ```/usr/local/share/php-build/definitions/``` にあり、```php-build``` 実行時に定義ファイルの場所を指定することはできないようなので、定義ファイルのディレクトリを git でバージョン管理する:

```
cd /usr/local/share/php-build/definitions/
sudo git init
sudo git add -A
sudo git commit --message "first commit"
```

## 3. pyrusを無効にし、pearを有効にする

PHP-5.3.0の定義ファイルを編集する:

```
sudo vim 5.3.10
```

下記のようにする:

```
with_pear
install_package "http://www.php.net/distributions/php-5.3.10.tar.bz2"
```

開発環境であればxdebugの行は残しても構わない。pryusの行はバッティングするので必ず消すこと。また ```install_package``` より上に ```with_pear``` を記述する必要がある。

編集した定義ファイルをコミットする:

```
sudo git commit --message "5.3.10: disalbe pryus and enable pear" --all
```

## 4. PHP をビルド&インストールする

インストール先のディレクトリを作る:

```
cd ~
mkdir ~/php-versions
```

```phpenv``` などを使っている場合は、作る必要なし。

PHPをビルドするのに必要なパッケージをインストールする:

```
sudo aptitude install build-essential bison re2c libxml2-dev zlib1g-dev \
libcurl4-openssl-dev libjpeg62-dev libpng12-dev libfreetype6-dev libt1-dev \
libmcrypt-dev libreadline-dev libtidy-dev libxslt1-dev
```

PHP-5.3.10 をインストールする:

```
php-build 5.3.10 /home/suin/php-versions/5.3.10
```

※第二引数 ```prefix``` は絶対パスにしないとうまくいかないので注意。

インストールされたバージョンを確認する:

```
~/php-versions/5.3.10/bin/php -v
```

```
~/php-versions/5.3.10/bin/pear version
```

以上
RailsによるアジャイルWebアプリケーション開発 第4版  メモ



#列追加、削除時のマイグレーションの名前

p111より。
以下のようにするとTABLEとした箇所をRailsがテーブル名として認識してくれる。

```
add_XXX_to_TABLE
remove_XXX_from_TABLE
```

#モデルのfind_by_hogeメソッドについて

p112より。

```
Active Record は定義されていないメソッドの呼び出しを認識すると、
そのメソッドがfind_byという文字列で始まり列の名前で終わっていると見抜きます。
そして動的にファインダメソッドを作成し、それをクラスに追加します。
```

#マイグレーションのメソッド

p113より。

```ruby
# db:migarte、db:rollback時によきに計らって処理してくれる
def change
end

# rake db:migrate時に実行される
def up
end

# rake db:rollback時に実行される
def down
end
```

#xxx_path、xxx_urlのどちらを使うべきか？
p120より

リダイレクトの場合はxxx_url、それ以外の場合はxxx_path。
xxx_urlはhttp://～、xxx_pathは/xxxのような値が返される。

#部分テンプレート

p127より。

```
、部分テンプレートをレンダリングするメソッドにはコレクション
（collection）を渡すことができ、そのメソッドはコレクション内の各項目に対して 1 回ずつ自動的
に部分テンプレートを呼び出す、
```

```
デフォルトでは、レンダリング対象のオブジェクトと同じディレクトリに配置し、
テーブル名と同じ名前にします。ただし、部分テンプレートと通常テンプレートの名前を区別するため
Rails はファイルの検索時に部分テンプレートの名前の先頭に自動的にアンダースコア（ _ ）を追加します。
```

```
部分テンプレートの内部では、テンプレート名と同じ名前の変数を使って現在のオブジェクトを参照できます。
```

#Ajax

p132からp133より。

リンクを生成するなどの処理で引数の:remoteにtrueを設定。

```ruby
button_to 'カートに入れる', line_items_path(product_id: product),
remote: true
```

該当のメソッドにJs形式の応答を追加。

```ruby
format.js
```

JavaScript用のテンプレートを追加。
.html.erbが通常のHTMLテンプレートで.js.erbがJavaScript用のテンプレート。
ファイル名はメソッドと同じにする。

```create.js.erb
$('#cart').html("<%= render @cart %>")
```
優先順位付きで文字コードを推定する

まずいところ、もっといい方法があったら教えてください。

```
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;

my $e = guess_encoding("あいうえお");
if (ref $e) {
   print $e->name;
}
else {
   print "Guess failed.\n";
}
sub guess_encoding {
  my $s = shift;
  my $enc = Encode::Guess::guess_encoding($s);
  if (not ref $enc) {
    my $names = ["utf8", "euc-jp", "shiftjis", "7bit-jis"]; # 優先順位
    foreach my $name (@$names) {
      if (index($enc, $name) >= 0) {
        $enc = Encode::find_encoding($name);
        last;
      }
    }
    return if not ref($enc); # 失敗したらundef
  }
  return $enc;
}
```
ActiveRecordを単体で使う

たまによくつかうのでメモ

```ruby
require "active_record"

ActiveRecord::Base.establish_connection(
  :adapter=>"mysql2",
  :host  =>"localhost",
  :database =>"blog_development",
  :username=>"dankogai",
  :password=>"kogaidan",
  :encoding=>"utf8"
)

class Post < ActiveRecord::Base
end

Post.all #=> postsテーブルのレコードすべて
```
vim設定

プラグイン関連以外のvimrcの設定

```.vimrc
"---------------------------------------------------------------------------
" Vi互換をオフ
set nocompatible

"---------------------------------------------------------------------------
" 行数を表示
set number
" 新しい行のインデントを現在行と同じにする
set autoindent
" バックアップ取らない
set nobackup
" 他で書き換えられたら自動で読み直す
set autoread
" スワップファイル作らない
set noswapfile
" バックアップファイルを作るディレクトリ
" set backupdir=$HOME/vimbackup
" バックアップをとる場合
"set backup
" バックアップファイルを作るディレクトリ
"set backupdir=~/backup
" スワップファイルを作るディレクトリ
"set directory=~/swap
" スワップファイル用のディレクトリ
" set directory=$HOME/vimbackup
" ファイル保存ダイアログの初期ディレクトリをバッファファイル位置に設定
" set browsedir=buffer
" クリップボードをWindowsと連携
set clipboard=unnamed
" タブの代わりに空白文字を挿入する
set expandtab
" 変更中のファイルでも、保存しないで他のファイルを表示
set hidden
" インクリメンタルサーチを行う
set incsearch
" タブ文字、行末など不可視文字を表示する
set list
" listで表示される文字のフォーマットを指定する
" set listchars=eol:~,tab:>\ ,extends:<
" Tab、行末の半角スペースを明示的に表示する
" set listchars=tab:^\ ,trail:~
set listchars=tab:>\ ,trail:~
" シフト移動幅
set shiftwidth=4
" 閉じ括弧が入力されたとき、対応する括弧を表示する
set showmatch
" 検索時に大文字を含んでいたら大/小を区別
set smartcase
" 新しい行を作ったときに高度な自動インデントを行う
set smartindent
" 行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする。
set smarttab
" ファイル内の <Tab> が対応する空白の数
set tabstop=4
" カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
" 検索をファイルの先頭へループしない
set nowrapscan
" Windowsでディレクトリパスの区切り文字に / を使えるようにする
set shellslash

" 保存時に行末の空白を除去する
autocmd BufWritePre * :%s/\s\+$//ge
" 保存時にtabをスペースに変換する
autocmd BufWritePre * :%s/\t/  /ge
" 日本語入力をリセット
" autocmd BufNewFile,BufRead * set iminsert=0
" タブ幅をリセット
autocmd BufNewFile,BufRead * set tabstop=4 shiftwidth=4

"---------------------------------------------------------------------------
" ;でコマンド入力( ;と:を入れ替)
noremap ; :
noremap : ;

" Shift+hjklで移動量を大きく
noremap H 3h
noremap J 3j
noremap K 3k
noremap L 3l

"---------------------------------------------------------------------------
" CTRL-hjklでウィンドウ移動
nnoremap <C-j> ;<C-w>j
nnoremap <C-k> ;<C-k>j
nnoremap <C-l> ;<C-l>j
nnoremap <C-h> ;<C-h>j

"---------------------------------------------------------------------------
" バッファの移動
nmap <C-p> ;bp<CR>
nmap <C-n> ;bn<CR>

" Escの2回押しでハイライト消去
nmap <ESC><ESC> ;nohlsearch<CR><ESC>

"---------------------------------------------------------------------------
" カーソル行をハイライト
  set cursorline
  " カレントウィンドウにのみ罫線を引く
  augroup cch
    autocmd! cch
    autocmd WinLeave * set nocursorline
    autocmd WinEnter,BufRead * set cursorline
  augroup END

:hi clear CursorLine
:hi CursorLine gui=underline
highlight CursorLine ctermbg=black guibg=black
```
現在いるディレクトリがgit等のVCSで管理されているかチェック&ブランチ名取得

zshで．

```sh
$ autoload -Uz vcs_info
$ vcs_info # $vcs_info_msg_0_ にVCSの種類とブランチ名が入る
$ echo $vcs_info_msg_0_
 (git)-[master]-
$ echo $VCS_INFO_backends # チェック可能なVCS
bzr cdv cvs darcs fossil git hg mtn p4 svk svn tla
```
CSV を文字コード変換しつつロード

```ruby
CSV.foreach(filename, encoding: "Shift_JIS:UTF-8") do |row|
  # …
end
```

だが、未定義文字があるとエラーに。

`Kernel#open` だと

```ruby
open(filename, "rb:Shift_JIS:UTF-8", undef: :replace) do |f|
  # …
end
```

のように、`String#encode` と同じオプションが渡せるが、CSV ではここにオプションを渡すすべはない。

よって `Kernel#open` と併用する。

```ruby
open(filename, "rb:Shift_JIS:UTF-8", undef: :replace) do |f|
  CSV.new(f).each do |row|
    # ...
  end
end
```
Backbone.js試す#2 RESTfulじゃない環境で使う

```Backbone.emulateHTTP = true;``` って書いておけば、PUTとDELETEはPOSTメソッドで行われるようになるらしい。

> ## emulateHTTP
>
>```
>Backbone.emulateHTTP = true 
>```
>
>If you want to work with a legacy web server that doesn't support Backbones's default REST/HTTP approach, you may choose to turn on Backbone.emulateHTTP. Setting this option will fake PUT and DELETE requests with a HTTP POST, setting the X-HTTP-Method-Override header with the true method. If emulateJSON is also on, the true method will be passed as an additional _method parameter.
>
>```
>Backbone.emulateHTTP = true;
>
>model.save();  // POST to "/collection/id", with "_method=PUT" + header.
>```

http://documentcloud.github.com/backbone/
Backbone.js試す#1 - とりあえずサンプルをローカルで動かしてみる

Backbone.jsの[TODOアプリ](https://github.com/jeromegn/localtodos)のサンプルをローカルで動かしてみます。ローカルで完結しているので、サーバの設定などは不要。

```sh
git clone https://github.com/jeromegn/localtodos.git
python -m SimpleHTTPServer 8000
```

ブラウザで http://localhost:8000/ を開く。

以上。
ハッシュから任意のキーをもつ要素だけを取り出す

APIを呼ぶ場合など余計な要素を削除したい場合
下記コードはname,emailというキー以外の要素を削除する例

```Ruby
filter= %w[name email]
current_user = { 'name' => 'toyoshi', 'email' => 'test@example.com', 'tel' => '00000000'}
current_user.select { |key,_| filter.include? key }

#=> { 'name' => 'toyoshi', 'email' => 'test@example.com'} # telが消えた
```
ハッシュをオブジェクトのプロパティにする方法

openstructライブラリを使う
http://doc.ruby-lang.org/ja/1.9.3/class/OpenStruct.html

```Ruby
require 'ostruct'
obj = OpenStruct.new({'name'=>'toyoshi')
obj.name #=> "toyoshi"
obj.email = 'toyoshi@example.jp'
obj.email #=> 'toyoshi@example.jp'
```
rmコマンドが怖い人向け: 削除しないでゴミ箱に移動するシェルスクリプト

```rm -rf``` を実行して、「本当は消したくなかったファイルを消してしまった」、「消したけど元に戻したいのに後の祭り」なんて経験は誰しも一度はあるんじゃないでしょうか。

そんな人向けの、```del``` コマンド。このコマンドは、Window のエクスプローラやMacのFinderのように、削除したファイルを一旦ゴミ箱に移動することで、いざというときに復旧できるすべを残してくれます。

```alias "rm=del"``` とかしておくと安心です。本当に物理削除したいときは ```\rm -f ...``` で行えます。

```sh:del
#!/bin/sh

SCRIPT_NAME=$(basename $0)

setup_trash_dir() {
	[[ $TRASH_DIR ]] && trash_dir=$TRASH_DIR || trash_dir="$HOME/.Trash"
}

print_help() {
	echo "Safe delete command."
	echo
	echo "  Usage:"
	echo "    \$ $SCRIPT_NAME <files…>"
	echo
	echo "  Trash box directory:"
	echo "    $trash_dir"
	
	if [[ ! $TRASH_DIR ]]
	then
		echo
		echo "    You can specify the trash box as the environment variable \$TRASH_DIR."
	fi
	
	exit 1
}

make_new_trash_box() {

	trash_dir=$trash_dir/$(date +%y%m%d.%H%M%S)

	suffix=""
	number=0
	while [ -e $trash_dir$suffix ]
	do
		suffix=".$number"
		number=$(expr $number + 1)
	done
	trash_dir=$trash_dir$suffix
	
	mkdir $trash_dir
}

check_file_exists() {

	has_error=0

	for filename in "$@"
	do
		if [ ! -e "$filename" ]
		then
			echo "$SCRIPT_NAME: delete $filename: No such file or directory" >&2
			has_error=1
		fi
	done

	[[ $has_error -eq 1 ]] && exit 1
}

remove_files() {
	for filename in "$@"
	do
		dest_filename=$trash_dir/$(basename "$filename")
		
		suffix=""
		number=0
		while [ -e "$dest_filename$suffix" ]
		do
			suffix=" - copy $i"
			number=$(expr $number + 1)
		done
		
		mv -vi "$filename" "$dest_filename$suffix"
	done
}

setup_trash_dir

if [ $# -eq 0 ]
then
	print_help
fi

make_new_trash_box
check_file_exists "$@"
remove_files "$@"
```
適当なファイルサイズのダミーファイルを作るシェル


## mkfileコマンドを使う場合(Mac)

```
mkfile 20g sparseFile
```

## ddコマンドを使う場合

```dd``` コマンドを使ってダミーファイルを作る方法はよく知られているけど、引数とかが思い出せないのでカプセル化したシェルスクリプトを書いた。

```dummy-file.sh 10m``` とかやると、10メガバイトのファイルができる。

```sh:dummy-file.sh
#!/bin/sh

print_help() {
	name=$(basename $0)
	echo "A script for creating sized dummy files."
	echo 
	echo "  Usage:"
	echo
	echo "    $name [size]"
	echo "    $name [size] [filename]"
	echo 
	echo "  Example1: Make 32MB file as '32m'"
	echo 
	echo "    \$ $name 32m"
	echo 
	echo "  Example2: Make 10MB file as 'foo.zip'"
	echo 
	echo "    \$ $name 10m foo.zip"
	exit 1
}

make_file() {
	dd if=/dev/zero of=$1 bs=$2 count=1
}

case $# in
	1)
		make_file $1 $1
		;;
		
	2)
		make_file $2 $1
		;;
	
	*)
		print_help
		;;
esac
```
NSDictionaryの中身を全部取り出すときは

``` [dictionary keyEnumerator] ```を使う。

```

NSDictionary *dictionary = [NSDictionary dictionaryWithObject:@"hoge" forKey:@"fuga"];
for (id key in [dictionary keyEnumerator]) {
    NSLog(@"Key:%@ Value:%@", key, [dictionary valueForKey:key]);
}

```
RubyにおけるIPアドレスの正規表現

正規表現でIPアドレスをマッチしたくなる時があるが、
一から厳密な正規表現を書くのが面倒な場合は、

```
require 'resolv'
```
して

```
Resolv::IPv4::Regex
```
を使用すればよい。
配列か連想配列か判定する

PHPは連想配列と配列の区別がないので、判別したい場合はこんなコードが必要。

```php
<?php
if (array_values($arr) === $arr) {
  echo '$arrは配列';
} else {
  echo '$arrは連想配列';
}
```

```php:具体例
<?php
/**
 * 添え字が0から連続する数値(=配列とみなせる)ときにtrue
 */
function is_vector(array $arr) {
  return array_values($arr) === $arr;
}

$arr1 = ['a','b','c'];   //配列
$arr2 = ['a'=>'a', 'b'=>'b']; //添字が文字なので配列とは言えない
$arr3 = ['a', 2=>'b', 1=>'c'];  //添え字の順番がおかしいので配列とは言えない

var_dump(is_vector($arr1)); //true
var_dump(is_vector($arr2)); //false
var_dump(is_vector($arr3)); //false
```

array_values()は連想配列のキーを数値に振りなおしてくれる関数です。配列の場合はarray_values()を作用させても元のままになりますので、作用前の配列と比較することで判定が可能です。

http://d.hatena.ne.jp/fbis/20091112/1258002754
こちらに書いてあるように素直にforeachでキーを調べていってもいいのですが、配列が単純な場合は、array_valuesを使ったワンライナーでも同等の速度になるようです。

配列の要素数が多い、配列の要素が複雑、などの場合はforeachで調べた方が速くなります。
プログラミングRuby 1.9 言語編 メモ

#initializeメソッドについて
p28より。

```
initialize は特殊なメソッドです。BookInStock.new を呼び出して新しいオブジェクトを生成す
ると、Ruby はいくらかメモリを割り当て、そこに初期化されていないオブジェクトを保持します。そし
て、そのオブジェクトの initialize メソッドを呼び出します。その際、newに渡された引数をすべて
initialize に渡します。
```

```ruby

class BookInStock
	def initialize(isbn, price)
		@isbn = isbn
		@price = Float(price)
	end
end

book = BookInStock.new("12345", 500)
p book
#<BookInStock:0x000000021e8b40 @isbn="12345", @price=500> 

```

#属性の読み書き
p32より。

```ruby

#読み取り専用
attr_reader :isbn
#読み書き可
attr_accessor :price

```

#仮想属性　

p32より。

```ruby
class BookInStock
   attr_accessor :price
   def initialize(price)
     @price = price
   end
   def price_in_cents=(cents)
     @price = cents / 100.0
   end
 end

book = BookInStock.new(20)  

p book.price
#20

book.price_in_cents = 2000 
p book.price
#20

```


#変数名とクラス、定数名

p17より。
変数名の先頭の文字でスコープが異なる。
また、クラス、定数名は大文字始まりで大文字区切り。

```ruby
#ローカル
hoge

#グローバル
$hoge

#インスタンス
@hoge

#クラス
@@hoge

#クラス、定数名
HogeHoge

```

#シンボル

p19より。

```
シンボルとは、事前に宣言する必要がなく、なおかつ一意であることが保証される定数名のことです。
```

```ruby
:hoge
```

#privateメソッドについて

p37より。

```
明示的なレシーバを指定して呼び出すことはできません。レシーバは常に自分自身(self)です。
```

#アクセス制御の記法

p37〜38より。

```ruby
class Hoge
  # 何も指定しない場合はpublic
  def hoge1
  end

  protected
  def hoge2
  end

  private
  def hoge3
  end

  public
  def hoge4
  end
end

class Hoge
  def hoge1
  end

  def hoge2
  end

  def hoge3
  end

  def hoge4
  end

  # まとめて指定することも可能
  public :hoge1
  protected :hoge2
  private :hoge3 :hoge4
end
```

#変数について

p39〜41より。

```
変数はオブジェクトでしょうか。
Ruby では、答えは「ノー」です。変数は単にオブジェクトへの リファレンスにすぎません。
オブジェクトは大きなプール(多くの場合ヒープ)の中に浮かんでおり、変数によって参照されます。
```

```ruby
hoge1 = "hogehoge"
hoge2 = hoge1

p hoge1
#hogehoge

p hoge2
#hogehoge

hoge1[0] = "f"

p hoge1
#fogehoge

p hoge2
#fogehoge

# freezeメソッド他から変更できないようにできる
hoge1.freeze
```

#配列の添字

p43〜44より。

配列にはマイナスの添字もある。

```ruby
arr = [1, 2, 3]

for hoge in 0..(arr.count - 1) do
  p arr[hoge]
end

#1
#2
#3

#負数の添字
for hoge in (arr.count * -1)..-1 do
  p arr[hoge]
end

#1
#2
#3
```

範囲を指定することも可能。

```ruby
arr = [1, 2, 3]
p arr[1..2]

# [2, 3]
```

開始位置と個数を指定することも可能。

```ruby
arr = [1, 2, 3]
p arr[1, 2]

# [2, 3]
```
Emacsで現在行や選択範囲を簡単に複製するためのduplicate-thing.el

行や範囲のコピー＆ペーストを一手で出来るようにしました。
![コピー前](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120321/20120321001639.png) 
![コピー後](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120321/20120321001641.png) 
## インストール
下記のS式を評価(C-xC-e)して下さい。

```lisp:install.el
;; auto-install
(auto-install-from-url "https://raw.github.com/ongaeshi/duplicate-thing/master/duplicate-thing.el")
```

## .emacs.d/init.el
好きなキーを割り当てて下さい。

```lisp:init.el
(require 'duplicate-thing)
(global-set-key (kbd "M-c") 'duplicate-thing)
```

詳しい使い方は[コチラをどうぞ](http://d.hatena.ne.jp/tuto0621/20120321/1332329935)
webviewでローカル(アプリ内)の画像を表示する

```objc
[webView.mainFrame loadHTMLString:htmlContent baseURL:[[[NSBundle mainBundle] resourceURL] absoluteURL]];
```

のようにして，Resourceのhtmlファイルで指定してやればいい．

```html
<img src="hello.png" />
```

absoluteURLを忘れると，XXX.appまでのパスになってしまうので注意．
Qiita Chrome 拡張の最近の機能追加

前回: [Qiitaの通知を表示できるChrome拡張を作った](http://qiita.com/items/cc30710256da2427c974)

- [Chrome Web Store - qiita-notifications](https://chrome.google.com/webstore/detail/hcnchocfgcldaldkchelnhpidgmfaocc)
- [taka84u9/qiita-notifications](https://github.com/taka84u9/qiita-notifications)

何気に version 0.3.3 まできた Qiita Chrome 拡張に最近追加された機能の紹介。
Chrome使ってる方はよければ使ってみて下さい。

##最近投稿されたアイテムを表示できるようになりました

ユーザへの通知に加えて最近投稿されたアイテムが表示できるようになりました。
Qiita の UI にある「フォロー中」「すべての投稿」タブの内容が表示されます。
下の画像だと分かりませんが、前回 qiita-notifications で表示した後に投稿されたアイテムに関しては、背景が緑色になるので、どこまで読んだか人目で分かるようになっています。
(追記)二枚目の画像みたいになります

![](https://img.skitch.com/20120321-cc3iw9uq59mkfax8r4jtqe2m8k.jpg)

![](https://img.skitch.com/20120321-gkf42ypea6irtcchhsmkjx4p2b.jpg)

##日本語対応

日本語対応しました。Chromeの言語設定が `ja` の時、日本語で表示されます。
メニューボタン以外の日本語化したバージョンはリリースして間がないので、既にインストール済みの方の場合は自動的にバージョンが上がるまでしばらく待ってください。

![](https://img.skitch.com/20120321-f94djdd2srqhx7kdetgxtr6nqf.jpg)
104キーボードでminttyを使う際のyamyの設定ファイル

```.mayu
include "104.mayu"

# Ctrl + SpaceでIMEをトグル
key C-Space = $ToggleIME

# mintty上の設定
window Terminal /mintty\.exe/ : Global
	# vim用にEscを押したらIMEをオフ
	key U-Esc = Esc &SetImeStatus(off)
```
ムダ知識をあなたに

コンパイルできる

```java:URLInCode.java
public class URLInCode {
	public static void main(String[] args) {
		http://qiita.com/search?utf8=%E2%9C%93&q=Java\u000d
		return;
	}
}
```

これはコンパイルできない

```java:URLInCode.java
public class URLInCode {
	public static void main(String[] args) {
		http://qiita.com/search?utf8=%E2%9C%93&q=\u000dJava
		return;
	}
}
```
タイムスタンプを→日付に変換しながら tail とか


```php:tt:
#!/usr/bin/php
<?php
while($line = fgets(STDIN)) {
    // now: 1326356996
    // 6年前~14年後くらいまで大丈夫
    echo preg_replace_callback(
        '/ (1[2-7]\d{8}) /',
        function ($m) use ($argv) {
            $ts = $m[1];
            $dt = new \DateTime('@' . $ts);
            $dt->setTimeZone(new \DateTimeZone(isset($argv[1]) ? $argv[1] : 'Asia/Tokyo'));
            return ' ' . $dt->format('Y-m-d H:i:s') . ' ';
        },
        $line
    );
}
```

で、適当に実行権限あたえてpathとおして

```
$ cat hoge.txt | tt
```
とかしてる

```
$ tail -f /path/to/log | tt 'UTC'
```
とか。
[test]世界測地系を日本測地系に変換する

test投稿も兼ねて世界測地系を日本測地系に変換するコード。
逆は調べてない。

```php:test_hoge.php
$lat = $lat + $lat * 0.00010696  - $lng * 0.000017467 - 0.0046020;
$lng = $lng + $lat * 0.000046047 + $lng * 0.000083049 - 0.010041;
```