OmniAICreator/Qiita-1.07M huggingface dataset:
Git でリポジトリ内のサブディレクトリ同士をマージする

git-svn で標準レイアウトではない Subversion リポジトリを管理しているとき、サブディレクトリ同士をマージしたくなることがあるのでメモしておく。

簡単に言えば、「2つのサブディレクトリ a と b をマージ」するためには、「『サブディレクトリ a の中身を b の中身で置き換えたブランチ』を作って元々のブランチとマージ」すればよい。

リポジトリに以下のディレクトリがあるとする。ディレクトリの中には適当にいくつかファイルがあると考える。

~~~
$REPO/hoge_a/
$REPO/hoge_b/
~~~

hoge_b/ は、ある時点で hoge_a/ からコピーして作られたとする。その後 hoge_a/ に変更 A が、 hoge_b/ には別の変更 B が加えられてそれぞれコミットされた。この hoge_a/ に hoge_b/ をマージしたい。どうすればいいか？

このようなときは、歴史を遡って、 hoge_a/ に変更 A ではなく変更 B を加えたブランチを作ればいい。そうすれば「hoge_a/ に変更 A を加えたブランチ」と「hoge_a/ に変更 B を加えたブランチ」のマージに持ち込める。

1\. まず hoge_b/ が作られたコミットを探してチェックアウトする。この時点では hoge_a/ と hoge_b/ の中身は同じ。

~~~
git checkout -b hoge_a+B ${hoge_b が作られたコミット}
~~~

2\. master の hoge_b/ の中身を hoge_a+B の hoge_a/ にコピーしてコミットする。

~~~
# インデックスの hoge_a/ を消す
git rm -r --cached hoge_a/
# インデックスの hoge_a/ に master の hoge_b/ の中身を読み込む
# つまり、 hoge_a/ に変更 B を適用する
git read-tree --prefix=hoge_a/ master:hoge_b
# インデックスだけが更新された状態なので、インデックスをワーキングツリーにチェックアウトする
git checkout .
# コミット
git commit
~~~

これで hoge_a/ に変更 B を加えたブランチが作れた。あとは普通にマージすればいい。

~~~
git checkout master
git merge --squash hoge_a+B
~~~
tmuxで自動的にセッションを張る、あるいはアタッチ


```shell
if [ -z $TMUX ]; then
  if $(tmux has-session); then
    tmux attach
  else
    tmux
  fi
fi
```

tmuxのセッションの中にいる場合、$TMUXという環境変数がセットされる。
また、has-sessionコマンドはtmuxのセッションが存在しているかどうかを終了コードで確認するのに使える。
TextMate で Ruby のヒアドキュメントをシンタックスハイライト


TextMate の Ruby Bundle では、ヒアドキュメントの開始・終了文字列に応じてシンタックスハイライトされる。

```ruby
query = <<-SQL
  -- ここが SQL としてシンタックスハイライトされる
  SELECT * FROM users;
SQL
```

Ruby Bundle の言語設定 (アイコンが L のやつ) の中で下記のように設定されている。

```
{	name = 'string.unquoted.embedded.js.ruby';
	contentName = 'text.js.embedded.ruby';
	comment = 'heredoc with embedded javascript and intented terminator';
	begin = '(?><<-("?)((?:[_\w]+_|)(?:JS|JAVASCRIPT))\b\1)';
	end = '\s*\2$';
	beginCaptures = { 0 = { name = 'punctuation.definition.string.begin.ruby'; }; };
	endCaptures = { 0 = { name = 'punctuation.definition.string.end.ruby'; }; };
	patterns = (
		{	include = '#heredoc'; },
		{	include = 'source.js'; },
		{	include = '#interpolated_ruby'; },
		{	include = '#escaped_char'; },
	);
},
```
begin の正規表現で言語を判別、patterns の 2 つめの include で言語を指定している。

include には、Bundle の言語設定の最初に現れる、scopeName の値を指定してやればいいみたい。
ワンラインPSR-0準拠クラスオートローダー

[シンプルなPSR-0準拠クラスオートローダー](http://qiita.com/items/2774)を無理やり1行にして焼き直した。

```php
<?php
// PHP 5.1.2 ~ PHP 5.2.x
spl_autoload_register(create_function('$c', '@include_once strtr($c, "\\_", "//").".php";'));

// PHP 5.3.0 or later
spl_autoload_register(function($c) { @include_once strtr($c, '\\_', '//').'.php'; });
```

Link

* [Qiita 13行のシンプルなPSR-0準拠APCクラスローダー](http://qiita.com/items/157d14e467e31ad561d0)
ページ読み込み時の関数呼び出し

外部ファイルに定義した関数をページ読み込み時に呼び出す方法のメモ

###呼び出す関数
load()

###方法1：失敗
```HTML
<body onload="load()">
</body>
```
これじゃ、load関数呼び出せなかったorz

###方法2：成功
```Javascript
<script>
	window.onload = function(){ load();}
</script>
```
これでload関数呼び出せた(´∀｀)

##参考URL

+ [javascriptによるページ読み込み時のイベント](http://liginc.co.jp/programmer/archives/201)
メソッド呼んだら呼び出し元からも return したい！ (出来なくてほんの少し困ってる)

```ruby
def super_return
  # how can i implement here?
end

def f
  p 'a'
  suepr_return
  p 'b'
end

f
#=> "a"
```

こういうことって例外を使わずに出来ない？

```ruby
def super_return
  yield
end

def f
  p 'a'
  super_return do
    return
  end
  p 'b'
end

f
#=> "a"
```

これなら出来るけど一々 do return end とか書かなくてもいいような方法があるなら知りたいです．
surround.vimの拡張

デフォルトのsurround.vimでは、囲み文字で囲まれた文字を削除する場合は、「di'」、「di"」の様に囲み文字を指定する必要がある。

### di"
`"Hello World"` → `""`
### di'
`'Hello World'` → `''`

自動的に囲み文字を判別してくれて、削除してくれたら便利だな、と思ったので、スクリプトを書いてみた

```
nnoremap ci :call <SID>ExSurround("ci")<CR>
nnoremap di :call <SID>ExSurround("di")<CR>
function! s:ExSurround(cmd)
    let pattern = "'\"{[("
    let front = strpart(getline("."), 0, col("."))
    let max = -1
    for pat in split(pattern, '.\zs')
        let pos = strridx(front, pat)
        if pos > max
            let max = pos
        endif
    endfor
    if max >= 0
        let sorround = strpart(front, max, 1)
        call feedkeys(a:cmd . sorround, 'n')
    endif
endfunction
```

### di
`"Hello World"` → `""`
`'Hello World'` → `''`

対応している文字は'、"、{、[、(

※もっと良い書き方があったら押して下さいー。
"フォロー中のタグ"に登録しているタグの更新をまとめるRSSを作……ろうとしたが上手くいかない

+ [特定タグやユーザーの新着投稿のフィード配信を開始しました #Qiita - Qiita](http://qiita.com/items/9c0a57ad98a511e566ed)
+ [QiitaのRSS #Qiita - Qiita](http://qiita.com/items/a38570f5f920871537d6)

>必要なのはパーソナライズされたRSSであって、ユーザーやタグのRSSではない気がする。

……じゃあ"フォロー中のタグ"に登録してるタグに投下された投稿まとめたRSS feed作ればいいじゃん!って事で、Yahoo! Pipesで頑張ってみたが、上手くいかない。

作成途中のPipe: [Pipes: Qiita user following tags feed (WORKAROUND)](http://pipes.yahoo.com/pipes/pipe.info?_id=65435fea4b573cb16b94d200ce0096d0)

2つ目のloopで各タグのRSSが取得出来ない理由がよく分からない……
誰か助言を……

----
一番最初の投稿がこんなんで良いんだろうかと思いつつ
Pythonのコンパイル時にgcc-4.2を使用する(MacOS)

llvm-gcc-4.2 だと幾つかのテストが失敗するようなのでgcc-4.2でコンパイルした.
CPPFLAGSでgcc-4.2用のヘッダファイルの場所を明示してやる.(やらない場合,コンパイルエラーになった.)
環境によっていろいろ違う可能性あり.

    pythonbrew install --configure="CC=/usr/bin/gcc-4.2 CXX=/usr/bin/g++-4.2 CPPFLAGS='-I/Developer/SDKs/MacOSX10.6.sdk/usr/lib/gcc/i686-apple-darwin10/4.2.1/include'" 2.7.3
Inverse FizzBuzz

何やら流行っているようなので書いてみた。

<http://www.jasq.org/2/post/2012/05/inverse-fizzbuzz.html>

~~~ {haskell}
import Control.Monad
import Data.List
import Data.Maybe

iFizzBuzz :: [String] -> Maybe (Int, Int)
iFizzBuzz inp = listToMaybe . map snd . sort $ do
  start <- [1..15]
  let (pos, fbs) = unzip . take (length inp) $ do
        x <- [start..]
        let fizz = x `mod` 3 == 0
            buzz = x `mod` 5 == 0
        guard $ fizz || buzz
        return (x, (if fizz then "fizz" else "") ++ (if buzz then "buzz" else ""))
  guard $ inp == fbs
  return (last pos - head pos, (head pos, last pos))

main = print . iFizzBuzz . words =<< getContents
~~~
指定した深さのHashを返す

```ruby
def recursive_hash(max_depth=nil, default_value=nil, depth=0)
  depth += 1

  Hash.new do |h, k|
    h[k] =
      if max_depth && max_depth.to_i <= depth
        default_value
      else
        recursive_hash(max_depth, default_value, depth)
      end
  end
end
```

以下のようにつかいます。

```
>> h = recursive_hash #=> {}
>> h[:a] #=> {}
>> h[:a][:b] #=> {}
>> h[:a][:b][:c] #=> {}

>> h = recursive_hash(3) #=> {}
>> h[:a] #=> {}
>> h[:a][:b] #=> {}
>> h[:a][:b][:c] #=> nil

>> h = recursive_hash(2, 0) #=> {}
>> h[:a] #=> {}
>> h[:a][:b] #=> 0
>> h[:a][:b]
```
逆FizzBuzz問題 解きなおし

問題は http://d.hatena.ne.jp/matarillo/20120515/p1

周期7のテーブルなんか作らなくても、1..15の範囲の中で解探索して最短のものを選べばよかったんですね。
問題文にもあるとおり、IsFizzBuzzとToFizzBuzzで数字をFizzBuzzに変換して、入力と一致しているかを確かめていっています。

```c#:Program.cs
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        WriteInverseFizzBuzz(new[] { "fizz" });
        WriteInverseFizzBuzz(new[] { "buzz" });
        WriteInverseFizzBuzz(new[] { "fizz", "buzz" });
        WriteInverseFizzBuzz(new[] { "buzz", "fizz" });
        WriteInverseFizzBuzz(new[] { "fizz", "buzz", "fizz" });
        WriteInverseFizzBuzz(new[] { "fizz", "fizz" });
        WriteInverseFizzBuzz(new[] { "fizz", "fizz", "buzz" });
        WriteInverseFizzBuzz(new[] { "buzz", "fizz", "buzz" });
    }

    static void WriteInverseFizzBuzz(string[] input)
    {
        string input2 = string.Join(",", input);
        string output2 = string.Join(",", InverseFizzBuzz(input));
        Console.WriteLine("{0} -> {1}", input2, output2);
    }

    static bool IsFizzBuzz(int number)
    {
        return (number % 3 == 0 || number % 5 == 0);
    }

    static string ToFizzBuzz(int number)
    {
        bool m3 = (number % 3 == 0);
        bool m5 = (number % 5 == 0);
        return
            (m3 && m5) ? "fizzbuzz" :
            (m5) ? "buzz" :
            (m3) ? "fizz" :
            null;
    }

    static Tuple<int, int> Inverse(string[] input, int start)
    {
        int n = start;
        foreach (string element in input)
        {
            while (!IsFizzBuzz(n)) n++;
            if (element != ToFizzBuzz(n)) return null;
            n++;
        }
        return Tuple.Create(start, n);
    }

    static int[] InverseFizzBuzz(string[] input)
    {
        var list = Enumerable.Range(1, 15)
            .Select(x => Inverse(input, x))
            .Where(x => x != null);

        if (list.Count() == 0) return new int[0];

        var range = list
            .OrderBy(x => x.Item2 - x.Item1)
            .First();

        return Enumerable.Range(range.Item1, range.Item2 - range.Item1)
            .ToArray();
    }
}
```

結果

```
fizz -> 3
buzz -> 5
fizz,buzz -> 9,10
buzz,fizz -> 5,6
fizz,buzz,fizz -> 3,4,5,6
fizz,fizz -> 6,7,8,9
fizz,fizz,buzz -> 6,7,8,9,10
buzz,fizz,buzz ->
```
クイックソート


```haskell:qsort.hs
qsort pred [] = []
qsort pred (x:xs) = qsort pred [i|i<-xs,pred i x] ++ [x] ++ qsort pred [i|i<-xs,not(pred i x)]

-- 昇順
qsort (<=) [5,3,1,2,4,6,3,4,6] -- [1,2,3,3,4,4,5,6,6]
-- 降順
qsort (>) [5,3,1,2,4,6,3,4,6] -- [6,6,5,4,4,3,3,2,1]
```
sl

![sl コマンド実行結果](http://24.media.tumblr.com/tumblr_m43potAtfd1qz64n4o1_1280.png)

`ls` のタイポすると発動する有名なジョークコマンド。丁寧にも INT シグナルをフックして捨ててるので、Ctrl+C で中断できない。 

走り去る列車をゆっくり見て落ち着きましょう。

```
$ man sl
SL(6)                                                                                                       SL(6)



名称
       sl - キータイプを矯正します。

形式
       sl [ -alFe ]

解説
       sl は、高度に発展した、キータイプ矯正を目的とするアニメーションプログラムです。SLは蒸気機関車のことです。

       次のようなオプションがあります。

       -a     なにかアクシデントがあったようですね。助けを求める人々が悲痛です。

       -l     小さくなります。

       -F     飛びます。

       -e     Ctrl+C で途中で止めることを許します。

関連事項
       ls(1)

バグ
       カレントディレクトリの内容が表示されることがあります。

著者
       豊田 正史<toyoda@isea.is.titech.ac.jp>



4.2 Berkeley Distribution                          Jan 24, 2001                                             SL(6)

```
コマンドの実行結果とかをvimで閲覧する

diffコマンドで差分を色付きで見たい場合とかに使います。
bashとかzshなら動作するはず

```bash
$ diff -uw a.txt b.txt
```

`<(command)`プロセス置換を使ってコマンドの処理結果をvimに渡します

```bash
$ vim <(diff -uw a.txt b.txt)
```

## リモートのファイル内容をcatコマンドで出力して、ローカルのvimで開く

```bash
$ vim <(ssh user@remote cat a.txt)
```

## ローカルのファイルとリモートサーバのファイルの差分をvimで閲覧する

```bash
$ vim <(diff -uw a.txt <(ssh user@remote cat a.txt))
```
Octopressのプレビューにthinを使う

`rake preview`した際にデフォルトだとWEBrickが立ち上がり、Ubuntuだとなんだかやたらと表示が遅かったので、thinを使うようにしました。

Gemfileの`group :development do`ブロックに下記を追加します。

```
gem 'thin'
```

`bundle install`をします。

```
$ bundle install
```

`rake preview`の代わりに下記を実行します。

```
$ thin start
```

デフォルトのポートは3000番なので、http://x.x.x.x:3000/ にアクセスします。

本当は`rake preview`で使うサーバをthinに変更できるといいのですが、調べてみてもその方法がみつけられなかったです。まあ、とりあえずはこれで運用していこうかと思います。
ListPaging プラグインを使って、Ext.List に 'もっと見る' ボタンでのページングを実装する 

サーバ側のAPIは、取得開始レコード及び取得件数を指定するパラメータを定義しておく。また、返却するJSONに、全部でレコードが何件あるかのパラメータを定義しておく。
例：Books の一覧を返すAPI。start,end で取得レコードの開始地点と件数を指定している。帰ってくるJSONの、total に、対象レコードの全件の件数が記載されている。

http://example.com/api/books.json?start=0&end=20

```json
{
    "total": 345, // 全部で345件のレコードがある
    "books": [
        {
            "id": 1, 
            "name": "サルでもわかるSenchaTouch", 
            "isbn": "978-4-309-999999-8", 
            "picture": "https://example.com/images/p1336894847146_82", 
            "time": "2012-05-13 16:42:28.354824"
},…20件分つづく
]
```

Model は通常のケースと同じ

```coffeescript:model/Books.coffee
Ext.define "MyApp.model.Book",
  extend: "Ext.data.Model"
  config:
    fields: [
       name: "id"
       type: "int"
     ,
       name: "name"
       type: "string"
     ,
       name: "isbn"
       type: "string"
     ,
       name: "picture"
       type: "string"
     ,
       name: "time"
       type: "auto"
    ]
```

Store には、pageSize を追加する

```:coffeescript:store/Books.coffee
Ext.define 'MyApp.store.Book'
  extend: 'Ext.data.Store'
  config:
    model: 'Ezuko.model.UserPicture',
    pageSize: 20
    autoLoad: true
    proxy:
      type: "ajax"
      url: "http://example.com/api/books.json"
      reader:
        type: "json"
        rootProperty: "books"
```

View

```coffeescript:view/BookList.coffee
Ext.define "MyApp.view.BookList",
  extend: "Ext.List"
  xtype: "booklist"
  id: 'booklist'
  config:
    itemTpl:'<div class="item"><a href="{url}">{name}</a></div>'
```

コントローラーから Store をセットする際に、ListPaging plugin を追加する

```coffeescript:controller/Main.coffee
  bookstore =  new MyApp.store.Book();
  view = new Ext.Container
    layout: 'card'
    items: [
      xtype:'booklist'
      store: bookstore
      limit: 20
      plugins: [
        xclass: 'Ext.plugin.ListPaging'
        loadMoreText: 'もっと見る'
      ]
     ]
  MyApp.Viewport.push view

```

これだけでOK！
本番用apkとテスト用apkで処理を切り替える方法



```java:Sample.java
	public boolean isDebuggable() {
        PackageManager manager = getPackageManager();
        ApplicationInfo appInfo = null;
        try {
            appInfo = manager.getApplicationInfo(getPackageName(), 0);
        } catch (NameNotFoundException e) {
            return false;
        }
 
        int debuggableFlag = appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE;
        return (ApplicationInfo.FLAG_DEBUGGABLE == debuggableFlag);
    }
```

使う時

```java
if (isDebuggable()){
  // テスト時の処理
}else{
  // 本場の処理
}
```
Ubuntu Serverをセットアップする


## 公開鍵を登録する

ssh-copy-idを使うのが楽。

```sh:ローカル
ssh-copy-id ubuntu-server-10.04
```


## GitHubにサーバの公開鍵を登録

```:リモート
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
```


## セットアップ・スクリプトを走らせる

```sh:setup-ubuntu-server.sh
#!/bin/sh

echo 'Refresh packages'
dpkg -l > default_packages
sudo apt-get update
sudo apt-get upgrade

echo 'Install tools'
sudo apt-get install -y screen zsh git-core curl wget

echo 'Clone dotfiles from GitHub'
mkdir -p $HOME/works
git clone --recursive git@github.com:aereal/dotfiles.git $HOME/works/dotfiles

echo 'Make dotfiles symlink on $HOME'
for f in \
  .gemrc .gitconfig .gitignore .irssi .proverc \
  .pryrc .psqlrc .re.pl .screen .screenrc \
  .zsh.d .zshrc .zshenv; do
  ln -s $HOME/works/dotfiles/$f $HOME/
done

echo 'Change default shell to zsh'
chsh -s `which zsh`

echo 'Install rbenv'
curl -L https://raw.github.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

echo 'Install dependencies'
rbenv bootstrap-ubuntu-10-04

echo 'Install Ruby 1.9.3 p194'
CONFIGURE_OPTS=--enable-shared rbenv install 1.9.3-p194
rbenv rehash; rehash

echo 'Update gems'
gem update --system
gem update

echo 'Install Bundler'
gem install --pre bundler

```

 * 次のパッケージをインストール
   * zsh
   * screen
   * git-core
   * curl
   * wget
 * dotfilesをcloneしてきてsymlinkをはる
   * サブモジュールもinit && update
 * ログインシェルをzshに
 * rbenvをインストール
 * rbenvでRubyのインストールに必要なライブラリをインストール (bootstrap-ubuntu-10-04)
 * Ruby 1.9.3p194をインストール
 * RubyGemsとプリインストールされているgemをアップデート
 * Bundlerをインストール

```:ローカル
scp setup-ubuntu-server.sh ubuntu-server-1004:
ssh -t ubuntu-server-1004 'sh setup-ubuntu-server.sh'
```


## どうして自動化したがるの?

zsh以外のシェルを使おうとは思っていない (慣れの問題)。
しかしzshをインストールするまで、インタラクティヴシェル上でコマンドを入力した場合、zshのヒストリに残らない。
ヒストリは財産であるので、失われるのは渡し難い。

そこで操作を記録、永続化するためにシェルスクリプトを用いる。
できるだけローカルから `ssh-copy-id` や `scp` などを駆使して、どこかしらのzshのヒストリに残るようにする。

chef-soloなどのツールもあるが、大袈裟すぎるのとそれら自体をインストールするためにけっきょく他の手段を使わなければいけないため、最初からシェルスクリプトのみを用いることに。
date から、'x minutes ago' へ変換する snipet


```javascript
// This utility function takes a date and returns a representation in words.
var timeAgoInWords = function(date) {
    try {
        var now = Math.ceil(Number(new Date()) / 1000),
            dateTime = Math.ceil(Number(new Date(date)) / 1000),
            diff = now - dateTime,
            str;

        if (diff < 60) {
            return String(diff) + ' seconds ago';
        } else if (diff < 3600) {
            str = String(Math.ceil(diff / (60)));
            return str + (str == "1" ? ' minute' : ' minutes') + ' ago';
        } else if (diff < 86400) {
            str = String(Math.ceil(diff / (3600)));
            return str + (str == "1" ? ' hour' : ' hours') + ' ago';
        } else if (diff < 60 * 60 * 24 * 365) {
            str = String(Math.ceil(diff / (60 * 60 * 24)));
            return str + (str == "1" ? ' day' : ' days') + ' ago';
        } else {
            return Ext.Date.format(new Date(date), 'jS M \'y');
        }
    } catch (e) {
        return '';
    }
}
```

Sencha Touch の examples/pullrefresh/app.js に書いてあった
【質問】【解決済み】NokogiriのSAXパーサーで処理命令をハンドリングしたい

　RubyGemの[Nokogiri][nokogiri]のSAXパーサーを使ってパースする時に、XML処理命令（processing instruction）を処理する方法を知っている人がいたら、教えてください。

[nokogiri]: http://nokogiri.org/

　`Nokogiri::XML::SAX::Parser.parse`に独自定義のドキュメントクラスを渡してパースしたいと思っています。

https://gitorious.org/rss/nokogiri/blobs/master/lib/rss/nokogiri.rb
から抜粋・一部改変します。

```ruby:rss/nokogiri.rb
  class NokogiriListener
    def xmldecl version, encoding, standalone
      super(version, encoding, standalone == 'yes')
    end

    def start_document
    end

    def end_document
    end

    def start_element(name, attrs = [])
    end

    def end_element(name)
    end

    def start_element_namespace(name, attributes = [], prefix = nil, uri = nil, ns = [])
      name = [prefix, name].compact.join(':')
      attrs = {}
      attributes.each do |attr|
        key = [attr.prefix, attr.localname].compact.join(':')
        attrs[key] = attr.value
      end
      ns.each do |(prefix, uri)|
        key = ['xmlns', prefix].compact.join(':')
        attrs[key] = uri
      end

      tag_start name, attrs
    end

    def end_element_namespace(name, prefix = nil, uri = nil)
      name = [prefix, name].compact.join(':')

      tag_end name
    end

    def characters(string)
      text(string)
    end

    def comment(string)
    end

    def warning(string)
    end

    def error(string)
      raise NotWellFormedError.new(string) if string =~ /Entity '.*' not defined/
    end

    def cdata_block(string)
      text(string)
    end
  end

  parser = Nokogiri::XML::SAX::Parser.parse(NokogiriListener)
  parser.parse(xml_data)
```

　上のクラスにXML処理命令を扱うメソッドを追加して何らかの処理をしたいのですが、やり方が分かりません。

　よろしくお願いします。
jQueryでタグの表示/非表示切り替えを行う

なぜか苦戦して悔しかったので晒してみる。

```html
<input type="radio" id="yRadio" value="0">表示</input>
<input type="radio" id="yRadio" value="1">非表示</input>

<div id="yDiv">非表示させたい！</div>
```

divタグの表示、非表示の切り替えを
ラジオボタンの選択で行うという動きをjQueryでやろうとしたのです。

```javascript:jQuery1
// イベント発火
$('input[id=yRadio]').change( function(){
    if ($('input[id=yRadio]:checked').val() == 1) {
        // 表示させないから…と思ってまず書いたのはこちら
        $('yDiv').remove();
    }
});
```

divタグの削除はできたけど、また表示させるにはどうすればいいんだ？
というところで手詰まり状態に。

add関数でタグ追加？？
もしかしてページ自体リロードした方がいいの？？
とか色々考えたんですが、結局こうなりました。

```javascript:jQuery2
// イベント発火
$('input[id=yRadio]').change( function(){
    if ($('input[id=yRadio]:checked').val() == 0) {
        // 表示
        $('yDiv').toggle(true);
    }
    else {
        // 非表示
        $('yDiv').toggle(false);
    }
});
```

しかも今[リファレンス](http://semooh.jp/jquery/api/effects/toggle/_/)を見直したら、
toggleは「表示状態にあるものを非表示にし、非表示状態にあるものは表示状態に」するので
こう書くのが正解かもしれないです。

```javascript:jQuery3
$('input[id=yRadio]').change( function(){
    // 表示・非表示切り替え
    $('yDiv').toggle();
});
```

ちゃんと調べろよって話ですが…。
jQueryって便利ですね…。
RSSライブラリーでREXMLを使う時とNokogiriを使う時のベンチマーク

```ruby
require 'benchmark'
require 'open-uri'
require 'rss'
require 'rss/nokogiri'

uri = 'http://ja.wikipedia.org/w/index.php?title=%E7%89%B9%E5%88%A5:%E6%9C%80%E8%BF%91%E3%81%AE%E6%9B%B4%E6%96%B0&feed=atom'
xml = open(uri) {|f| f.read}

Benchmark.bmbm do |x|
  x.report 'REXML from URI' do
    uri = URI('http://ja.wikipedia.org/w/index.php?title=%E7%89%B9%E5%88%A5:%E6%9C%80%E8%BF%91%E3%81%AE%E6%9B%B4%E6%96%B0&feed=atom')
    RSS::Parser.parse open(uri), true, true, RSS::REXMLParser
  end
  x.report 'Nokogiri from URI' do
    uri = URI('http://ja.wikipedia.org/w/index.php?title=%E7%89%B9%E5%88%A5:%E6%9C%80%E8%BF%91%E3%81%AE%E6%9B%B4%E6%96%B0&feed=atom')
    RSS::Parser.parse open(uri), true, true, RSS::NokogiriParser
  end
  x.report 'REXML from memory' do
    RSS::Parser.parse xml, true, true, RSS::REXMLParser
  end
  x.report 'Nokogiri from memory' do
    RSS::Parser.parse xml, true, true, RSS::NokogiriParser
  end
end
```

    Rehearsal --------------------------------------------------------
    REXML from URI         0.550000   0.000000   0.550000 (  2.712987)
    Nokogiri from URI      0.170000   0.000000   0.170000 (  3.078010)
    REXML from memory      0.540000   0.000000   0.540000 (  0.544707)
    Nokogiri from memory   0.120000   0.000000   0.120000 (  0.122050)
    ----------------------------------------------- total: 1.380000sec
    
                               user     system      total        real
    REXML from URI         0.560000   0.020000   0.580000 (  2.653760)
    Nokogiri from URI      0.180000   0.000000   0.180000 (  3.760438)
    REXML from memory      0.530000   0.000000   0.530000 (  0.534338)
    Nokogiri from memory   0.100000   0.000000   0.100000 (  0.102664)
RubyMotion 1.4にアップデートしよう！


RubyMotionが1.4にアップデートされてます．

`$ sudo motion update`しましょう．

変更履歴は↓

    = RubyMotion 1.4 =

    * Added support for the compilation of .xcdatamodeld and .storyboard resource
      files. Thanks Ian Phillips, Andrew Vega and Michail Pishchagin.
    * Fixed a bug when the build system would fail in case the resources dir does
      not exist. Thanks Watson.
    * Fixed a bug in the Xcode project vendoring code when header files at
      different directory levels would not be properly handled. This also fixes
      the motion-cocoapods gem. Thanks Eloy Duran.
    * Added a way to start the simulator in retina mode by setting the `retina'
      environment variable to `true' (other values will be considered false).
      For example: `rake retina=true'. Thanks Marcin Maciukiewicz for the idea.
    * Fixed an ABI bug in the way we compile Ruby methods overloading Objective-C
      methods returning small C structures that can fit in a 64-bit integer.
      Thanks Kristoph Cichocki-Romanov for the report.
    * Added support for the iOS 4.3 SDK.
    
## .xcdatamodeldと.storyboardのコンパイルに対応．
以前書いた[エントリ― STORYBOARDを使ってRUBYMOTIONで開発する方法](http://pochixpochi.blogspot.jp/2012/05/storyboardrubymotion.html)のibtoolで.storyboardを.storyboardcにコンパイルする必要がなくなりますね．


## resourcesディレクトリが無くてもrakeに失敗しなくなる
githubとかに上がってるのでresourcesが含まれていないのがありますけど，それをgit cloneしてrakeして失敗するのがなくなりますね．
(あれって.gitignoreにresourcesを入れてるんですかね)
→ 空ディレクトリをgitが省くそうです

## 他ライブラリ読み込み関連
XCodeプロジェクト形式で引っぱってくるときにヘッダファイルが他のディレクトリにあった時にハンドリングできなかったのが修正された．

cocos2dでハマってた問題を解決できるかも？あとでやってみよう．

## retina simulatorサポート
`rake retina=true`でretina simulatorが立ち上がるよ

## ABIバグ修正
ObjCのメソッドをRuby側でオーバーロードして64bit inttegerに収まる小さいCの構造体を返すときのバグ修正らしい

## iOS 4.3 SDKサポート
[rubymotion] rake specをカラフルにしよう！


![](https://lh3.googleusercontent.com/-i-36UEH1H1s/T6_Myv_1m1I/AAAAAAAAAZk/-jGU9jUlXSU/F45FE6D0-B302-438F-ABBE-3E67018268CD.jpg)

RubyMotionはBaconというテストフレームワークを使っています．
RSpecとの違いがよく分からない．

    $ rake spec
とやると，`spec`以下のテストが実行されるっぽいです．

ところが，普通に

    $ motion crate redgreen
    $ cd redgreen
    $ rake spec
とやると，ビルドされてシミュレータが立ち上がりテストが実行されますが，白黒です．
![](https://lh4.googleusercontent.com/-MaF986VQLXQ/T6_MzjUWnKI/AAAAAAAAAZs/0kTlIiLoETE/25518394-DF4D-4FC5-A0AD-FC1AAB8C3DCE.jpg)

そこで，`spec`フォルダで一番初めに読み込まれる .rbの中でカラー表示にさせるスクリプトを実行させれば，カラー表示になるようです．
（そのため， `00***.rb`のような名前にすれば良いようです．）

RedGreenというrake specをカラフルにするライブラリがあるらしいのですが，それをRubyMotion用にアレンジしたものがgithubで公開されています．

[rm-redgreen](https://github.com/mdks/rm-redgreen)

spec/00-redgreen.rb
app/app.rb
app/kernel.rb
app/rm-ansiterm.rb
app/string.rb
を自分のとこに持ってくれば使えます．

先程の`motion create`しただけのやつにコピーして再度テストをすると，このようになります．

カラフルになりましたね．
![](https://lh5.googleusercontent.com/-2YNpuBaKr6E/T6_M3QeAYUI/AAAAAAAAAaM/h5NFJ1YEO2g/8C43CDC6-042C-4899-9532-BDD6890057ED.jpg)

デフォルトのテストはWindowがあるのを調べるテストなので，実装を書いてGreenにしましょう．

`./app/app_delegate.rb`
 
    class AppDelegate
      def application(application, didFinishLaunchingWithOptions:launchOptions)
        @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
        true
      end
    end

テストを再実行します．

    $ rake spec

Greenになりました．
![](https://lh6.googleusercontent.com/-qQcnS4YpH98/T6_M2qdo6qI/AAAAAAAAAaE/NvQU_ZKe9qc/D3BC7FB7-D043-4EA1-AB2F-DB837A7632FA.jpg)

`./spec/00-redgreen.rb`の`style = :focused`となっている部分を`style = :full`とすると長めのログが出ます．
![](https://lh4.googleusercontent.com/-iXVNZArvvxU/T6_M0ixSIsI/AAAAAAAAAZ0/f3_Irg2MqM8/CCDD4D42-D3EB-405B-BA59-9BED5C685ECD.jpg)
![](https://lh6.googleusercontent.com/-ImTqn7jZiR8/T6_M11kTpsI/AAAAAAAAAZ8/-fVYGOMWifM/8A8B0EBF-3173-486C-AD54-EE1BAAB49511.jpg)
Storyboardを使ってRubyMotionで開発する方法


![](https://lh6.googleusercontent.com/-ptxn4wJhqOc/T69nu2xHtLI/AAAAAAAAAYY/JKxXu3OAsYE/B6AD8776-C7D5-4F4A-A9AA-A8143868D413.jpg)

RubyMotionでもStoryBoardが使えるらしいので，試してみた．

# ひな形作成

    $ motion create SB
    $ cd SB


# XcodeでStoryboardを作成
おもむろにXCodeを開きます．

`File>New>File`で`iOS>User Interface>Storyboard`を選びます．
![](https://lh4.googleusercontent.com/-mLcH1PENo2w/T69nyXr7yTI/AAAAAAAAAY4/RT_Q6EIAjIY/6335FCDB-E334-486F-9A97-C62A4212F9CE.jpg)

## 初めに表示されるViewControllerを作成

UIViewController設置．
![](https://lh4.googleusercontent.com/-A3bJEOrvzrE/T69n2eaXo3I/AAAAAAAAAZM/gMeA45JyTv4/C59A9802-25A6-4A66-B8B7-F247989BD60B.jpg)
Identifierを`First`とか付けます．
![](https://lh6.googleusercontent.com/-m0viQeqlxi8/T69nv3v32qI/AAAAAAAAAYg/RR6q5pe4rRg/655CD9E6-3C77-4930-95CD-D71E1CCEAFD1.jpg)
UILabelとUIButtonを追加します．

## Segueで遷移する先のViewControllerを作成
もう一つUIViewController設置．
![](https://lh5.googleusercontent.com/-pzw1VqoabCw/T69n3leryQI/AAAAAAAAAZY/wpds7icQfMk/3D867F91-1A11-442A-9E71-EE5F0475A81C.jpg)
Identifierを`Second`とか付けときます．


## Segueの設定
`First`に配置したButtonを，Ctrlを押しながら引っ張って`Second`のViewControllerへ繋ぎます．
Storyboard Seguesの設定が出るので，`Modal`とかを選ぶ．
![](https://lh3.googleusercontent.com/-XX9-8SPsWAg/T69n1E6_nlI/AAAAAAAAAZI/R9xnsie7vnE/26CE3AAA-C5FE-4209-9C35-AF20533C15B3.jpg)

![](https://lh5.googleusercontent.com/-7zTj7o1d3dQ/T69nwxc2G2I/AAAAAAAAAYk/eEjmStwoOlA/78C994F8-EFE6-4643-93FD-1D8F1EBB5050.jpg)

## Storyboardの保存
`Cmd+s`でStoryboardを`resources/Storyboard.storyboard`とか名前を付けて保存します．

# storyboardのコンパイル

    $ ibtool --compile resources/Storyboard.storyboardc resources/Storyboard.storyboard

# コーディング
`app/app_delegate.rb`を書く．
Storyboardからロードします．

    class AppDelegate
      def application(application, didFinishLaunchingWithOptions:launchOptions)
        @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
        @sb = UIStoryboard.storyboardWithName('Storyboard', bundle: nil)
        rvc = @sb.instantiateViewControllerWithIdentifier("First")
        @window.rootViewController = rvc
        @window.rootViewController.wantsFullScreenLayout = true
        @window.makeKeyAndVisible
        true
      end
    end


ちなみに，Buttonの動作を変えたい場合などは，`First`と付けたUIViewControllerをCustom Classに変更してUIViewControllerを継承したクラスを作成して，`prepareForSegue:sender:`で遷移前に処理を行うとか，UIButtonの`addTarget:sender`とかにselectorを登録して処理を行うとかします．

# コンパイルして実行
      $rake
とすれば，Simulatorが立ち上がります．
設置したButtonを押せばSecondのViewへ切り替わります．

![](https://lh4.googleusercontent.com/-XyNt1C6cfKo/T69nxjkqNrI/AAAAAAAAAYs/V4i7HQ9rDV8/8619164C-B90D-4D8F-913F-ED11086D700A.jpg)

![](https://lh5.googleusercontent.com/-4ugWozivZrg/T69nziIvs3I/AAAAAAAAAZA/HYZfkyB-WEQ/22854A71-7125-43CF-802C-7630629537F5.jpg)
[RubyMotion] InterfaceBuilderと合わせて使って楽をしよう


![catch](https://lh4.googleusercontent.com/-_NT2-Tz_5I4/T6vRbwXZyHI/AAAAAAAAAXM/nYYnYrq0AWQ/8B0A2DB1-E3D7-4847-A0EF-006C171E8B43.jpg)
RubyMotionはいいんだけど，UIをコードで作るのはめんどくさい．
そのため，InterfaceBuilderで作りたい．

RubyMotionの進化が早くて，もう1.3のアップデートが来てます．
このエントリーは1.3にアップデートしてからやってね．

    $ sudo motion update

やってみます．まずはひな形作成．

    $ motion create IB
    $ cd IB

`app/app_delegate.rb` を編集します．

    class AppDelegate
      def application(application, didFinishLaunchingWithOptions:launchOptions)
      	@window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
      	@window.rootViewController = NSBundle.mainBundle.loadNibNamed(
      		'MyView', 
      		owner: self,
      		options: nil).first
      	@window.rootViewController.wantsFullScreenLayout = true
      	@window.makeKeyAndVisible
        true
      end
    end
こんな感じで，MyViewっていうNibを読み込んでやることにします．

おもむろにXCodeをたちあげて，（すでに開いている人は開いてるProjectを閉じろ！）File>New>File(Cmd + N)を選んで新規ファイル作成する．
iOSのUser InterfaceのEmptyを選んで，`resources/MyView.xib`として保存する．

このままだと，ただの方眼紙なので，オブジェクトを追加していきます．

ObjectLibrary(Cmd+Shift+Alt+3)からViewControllerを追加．
![viewcontroller](https://lh4.googleusercontent.com/-NJi7vxGoKU0/T6vRejaSSwI/AAAAAAAAAXk/NANN6sYn43s/75A106D3-E836-4771-A3B2-23F0711E9F75.jpg)

CustomClassの所で，`MyViewController`とする．
![](https://lh6.googleusercontent.com/-9WOU446JvMM/T6vRZBfeFOI/AAAAAAAAAW8/8EttpBF8QbM/C3CE5E58-2F05-48FB-8EAF-0E8C400B86CE.jpg)

ObjectLibraryからViewを追加．
![](https://lh5.googleusercontent.com/-F13DxPSNxEw/T6vRczq6fNI/AAAAAAAAAXQ/ZhLWZFvZ8HI/62F0D7FB-D117-4FED-8CBC-65AEC3ECC194.jpg)
ObjectLibraryからButtonとLabelを追加．

![](https://lh3.googleusercontent.com/-lXNWDyg3b3s/T6vRYFzTWvI/AAAAAAAAAW0/7MpGkaUa3a4/386D9AF1-8520-41B6-975D-02D2D80A777A.jpg)

この部分が重要で、それぞれのTagに1とか2とかつけます
![](https://lh6.googleusercontent.com/-Ror1NoaBxkM/T6vRfzELJRI/AAAAAAAAAXs/iQi_iMXKNh8/40DC78B0-948E-4DCE-804F-EC366856DC31.jpg)
保存して終了．

次に`app/my_view_controller.rb`を作成します．

    class MyViewController < UIViewController
    	def viewDidLoad
    		@button = view.viewWithTag 1
    		@label = view.viewWithTag 2
    		@button.addTarget(
			self, 
			action:'onClicked', 
			forControlEvents:UIControlEventTouchUpInside)
	end

	def onClicked
		@label.text = "Clicked"
	end
    end

1のTagを付けたのをbuttonとして，クリックのイベントをonClickedメソッドに登録．
2のTagを付けたのをlabelとして，クリックされた時に変更したりするようにしました．

    $ rake
でビルドしてシミュレータが立ち上がります．
![](https://lh6.googleusercontent.com/-O4MoAszjcnA/T6vRaVj5WmI/AAAAAAAAAXE/rptfrEs0b9A/624D2637-6D50-4DF1-9001-C0505A3B0B25.jpg)
押します．

変わります！
![](https://lh5.googleusercontent.com/-3DmRBCOWUjs/T6vRdl7j0xI/AAAAAAAAAXY/5cnHlb61Lbw/658F46A6-8C07-485C-A589-6E32327BD13F.jpg)

出来ました！
[RubyMotion] NSError ** とかを引数に取るメソッドを使う時どうすればいいか


iOS SDK 使ってると，こんな感じのコードがよくあります．

    NSHTTPURLResponse *res;
    NSError *error;
    NSURL *url = [NSURL URLWithString:@"http://google.com"];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&error];

最後の`[NSURLConnection sendSynchronousRequest: returningResponse: error:]`の部分で，`(NSHTTPURLResponse**)`とか`(NSError**)`とかを引数に取ります．

この場合は，RubyMotionで書くとこうなります．

    err_ptr = Pointer.new(:object)
    res_ptr = Pointer.new(:object)
    url = NSURL.URLWithString("http://google.com")
    req = NSURLRequest.requestWithURL(url)
    data = NSURLConnection.sendSynchronousRequest(
    	req, 
    	returningResponse:res_ptr,
    	error:err_ptr)
    
    @label.text = res_ptr[0].statusCode.to_s
簡単に言うと，`(NSError**)`とかを渡す所になっているメソッドは，Pointerのインスタンスを渡してあげて，`error = err_ptr[0]`とかしてデリファレンスして使ってやるといいです．
SQLiteのインデックス名はデータベースレベルでユニーク


Rails 3.2.2
SQLite 1.3.6

---

ローカルでtest:unit動かしてたら急にこんなエラー
要するにindexの名前がかぶってるよ！って怒っている

```sql:
SQLite3::SQLException: index name_unique already exists
```

Mysqlばかり使っていたので最初意味が分からなかったが、
要するに

Mysqlはindex名はテーブル単位でユニークだけど、
SQLiteの場合は**データベース単位でユニーク**だよって話。

---

僕はRailsのMigrationは使っていなくて、
[Mysql Workbench](http://www-jp.mysql.com/products/workbench/)を使ってDB設計をやってる。

なので、テストの時はデータベースから

```bash:
bundle exec db:schema:dump
```

をしていたのでおかしくなったのかな？
普通にmigrationを生成してそっちでやってる人は詰まらないところかも。

---

今回は手動でインデックス名を変えて対応したけど、
これどうしようもないかなーあー
matlabでのクラス生成（handleクラスと値クラスの比較）

matlabでクラスを設計する際，handleクラスを継承するかどうかで振る舞いが全く異なるものになる．
今回はそれを簡単に考察してみます．

## まずはhandle継承版

```testclass.m

classdef testclass < handle
    properties
        input
    end
    methods
        % constructor
        function obj= testclass(varargin)
            if(nargin==1)
                obj.input=varargin{1};
            else
                obj.input=0;
            end
        end
        % normal method
        function [] = func(varargin)
            obj=varargin{1};
            obj.input=obj.input+1;
        end
    end
    methods(Static)
        % static method
        function [] = func_stat(varargin)
            obj=varargin{1};
            obj.input=obj.input+1;
        end
    end
 end
```

実行してみます．

``` 
>> test=testclass(1)

test = 

  testclass handle

  Properties:
    input: 1

  Methods, Events, Superclasses
```

```
>> test.func
>> test

test = 

  testclass handle

  Properties:
    input: 2

  Methods, Events, Superclasses
```

インスタンス中のプロパティがちゃんとインクリメントされました．

静的メソッドの場合，引数にて陽にインスタンスを指定する必要があります．

```
>> test.func_stat
Index exceeds matrix dimensions.

Error in testclass.func_stat (line 23)
            obj=varargin{1};
 
>> test.func_stat(test)
>> test

test = 

  testclass handle

  Properties:
    input: 3

  Methods, Events, Superclasses
```

インスタンス中のプロパティがちゃんとインクリメントされました．

余談ですが，静的メソッドはインスタンス無しでも実行可能です．

```
>> testclass.func_stat
Index exceeds matrix dimensions.

Error in testclass.func_stat (line 23)
            obj=varargin{1};
 
>> testclass.func_stat(test)
>> test

test = 

  testclass handle

  Properties:
    input: 4

  Methods, Events, Superclasses
```

## handleクラスを継承しない場合

```testclass.m
classdef testclass %< handle ハンドルをコメントアウトしてみます．
   ...  （省略）
end
```

```
>> test=testclass(1)

test = 

  testclass handle

  Properties:
    input: 1

  Methods, Events, Superclasses
```

```
>> test=testclass(1)

test = 

  testclass

  Properties:
    input: 1

  Methods

>> test.func
>> test

test = 

  testclass

  Properties:
    input: 1

  Methods
```

インクリメントされません．
この場合，メソッドの出力に入力のインスタンスを指定する必要があります．

```
        % normal method 2
        function [obj] = func2(varargin)
            obj=varargin{1};
            obj.input=obj.input+1;
        end
```

```
>> test=testclass(1)

test = 

  testclass

  Properties:
    input: 1

  Methods

>> test.func2

ans = 

  testclass

  Properties:
    input: 2

  Methods

>> test=test.func2

test = 

  testclass

  Properties:
    input: 2

  Methods

```

handleクラスを継承した方がスマートに書けますね．
Octopressのテーマを適用する

以下のURLの一覧からテーマを選びます。[preview]からテーマのイメージを確認できます。

https://github.com/imathis/octopress/wiki/List-Of-Octopress-Themes

テーマが決まったらテーマ名のリンクから、そのテーマのgitリポジトリのURLを取得して、ローカルにcloneしまず。それからテーマをインストールしてコンテンツを生成します。

例えば、octopress-bootstrapの場合はプロジェクトのディレクトリに移動して下記のようにします。

```
$ git clone https://github.com/barmstrong/octopress-bootstrap.git .themes/octopress-bootstrap
$ rake install['octopress-bootstrap']
$ rake generate
$ rake deploy
```
「The RSpec Book」の「22. WebratとSeleniumを使ったブラウザの自動化」が本の通りでは動かないのの回避


サンプルコードの`automated_browser/01/Gemfile`には

```ruby
group :development, :test do
  gem "rspec-rails", "2.0.0"
  gem "cucumber-rails", "0.3.2"
  gem "webrat", "0.7.2"
  gem "database_cleaner", "0.5.2"
  gem "selenium-client", "1.2.18"
end
```

とバージョン指定されていますが、このまま実行すると…

```
ERROR - Failed to start new browser session, shutdown browser and clear all session data
org.openqa.selenium.server.RemoteCommandException: timed out waiting for window 'null' to appear
  :
	at org.openqa.jetty.util.ThreadPool$PoolThread.run(ThreadPool.java:534)
2012-05-15 15:45:13 +0900 selenium-client received failure from selenium server:
requested:
	cmd=getNewBrowserSession
	1=*firefox
	2=http://localhost:3001
	3=
	4=
received:
	"Failed to start new browser session: Error while launching browser"
	called from /Users/foobar/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:68:in `timeout'
```

とか言われて動かない（-ω-）

Webratが内部にselenium-server.jarを持っていて、それを実行しているのだけど、試しに最新のselenium-serverをダウンロードし、直接実行しつつ`rake cucumber`すると…

```
Exception in thread "main" java.net.BindException: Selenium is already running on port 4444. Or some other service is.
 :
```

などと言われるのだけど起動したselenium-server.jarを使って動く！

とりあえず、Webratの使用しているバージョンのselenium-server.jarを置き換えるという強引な手で回避。

```
cd ~/.rvm/gems/ruby-1.9.3-p194\@rspecbook/gems/webrat-0.7.2/vendor/
wget http://selenium.googlecode.com/files/selenium-server-standalone-2.21.0.jar
mv selenium-server.jar selenium-server.jar.ORG
ln -s selenium-server-standalone-2.21.0.jar selenium-server.jar
```
Kobito のダウンロードがうまくいかない


````shell-session
$ curl -O http://kobitoapp.com/download/Kobito_v1.0.6.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 52 2923k   52 1529k    0     0  19554      0  0:02:33  0:01:20  0:01:13  6012
curl: (18) transfer closed with 1427209 bytes remaining to read
````

### その後

wget したらとれました。 1:20 くらいで一旦切断される気がする。
経路上のだれかさんのせいかしら？

````shell-session
$ wget http://kobitoapp.com/download/Kobito_v1.0.6.zip
--2012-05-15 16:02:03--  http://kobitoapp.com/download/Kobito_v1.0.6.zip
Resolving kobitoapp.com... 75.101.163.44, 174.129.212.2, 75.101.145.87
Connecting to kobitoapp.com|75.101.163.44|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2993516 (2.9M) [Application/octet-stream]
Saving to: `Kobito_v1.0.6.zip.1'

49% [==================>                    ] 1,485,219   13.5K/s   in 82s     

2012-05-15 16:03:26 (17.8 KB/s) - Connection closed at byte 1485219. Retrying.

--2012-05-15 16:03:27--  (try: 2)  http://kobitoapp.com/download/Kobito_v1.0.6.zip
Connecting to kobitoapp.com|75.101.163.44|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 2993516 (2.9M), 1508297 (1.4M) remaining [Application/octet-stream]
Saving to: `Kobito_v1.0.6.zip.1'

100%[+++++++++++++++++++===================>] 2,993,516   16.7K/s   in 68s     

2012-05-15 16:04:35 (21.8 KB/s) - `Kobito_v1.0.6.zip.1' saved [2993516/2993516]
````

One more try.

````shell-session
$ wget http://kobitoapp.com/download/Kobito_v1.0.6.zip
--2012-05-15 16:07:53--  http://kobitoapp.com/download/Kobito_v1.0.6.zip
Resolving kobitoapp.com... 174.129.212.2, 75.101.145.87, 75.101.163.44
Connecting to kobitoapp.com|174.129.212.2|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2993516 (2.9M) [Application/octet-stream]
Saving to: `Kobito_v1.0.6.zip'

47% [=================>                     ] 1,407,027   9.86K/s   in 76s     

2012-05-15 16:09:10 (18.0 KB/s) - Connection closed at byte 1407027. Retrying.

--2012-05-15 16:09:11--  (try: 2)  http://kobitoapp.com/download/Kobito_v1.0.6.zip
Connecting to kobitoapp.com|174.129.212.2|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 2993516 (2.9M), 1586489 (1.5M) remaining [Application/octet-stream]
Saving to: `Kobito_v1.0.6.zip'

97% [++++++++++++++++++===================> ] 2,922,595   13.8K/s   in 76s     

2012-05-15 16:10:28 (19.4 KB/s) - Connection closed at byte 2922595. Retrying.

--2012-05-15 16:10:30--  (try: 3)  http://kobitoapp.com/download/Kobito_v1.0.6.zip
Connecting to kobitoapp.com|174.129.212.2|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 2993516 (2.9M), 70921 (69K) remaining [Application/octet-stream]
Saving to: `Kobito_v1.0.6.zip'

100%[++++++++++++++++++++++++++++++++++++++>] 2,993,516   25.2K/s   in 2.8s    

2012-05-15 16:10:33 (25.2 KB/s) - `Kobito_v1.0.6.zip' saved [2993516/2993516]

````
対象ファイルでマッチした単語を手軽に置き換える方法


sedコマンドの-iオプションを使うと出来る

```sh:
sed -i -e 's/old_word/new_word/' target_file_path
```

ex) sshのポート番号を12345に書き換える

```sh:
sed -i -e 's/Port 22/Port 12345/' /etc/ssh/sshd_config
```
何が何でもindex.phpにアクセスさせる


mod_rewriteにて、ディレクトリがあろうが、ファイルがあろうが、兎に角 index.php にアクセスさせる方法

```mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On

# Rewrite all for index.php
RewriteBase /
RewriteCond %{REQUEST_URI} !^/index.php.*$ [NC]
RewriteRule ^(.*)$ /index.php%{REQUEST_URI} [L]
</IfModule>
```
JQuery Ajax Events


## Local events

`$.ajax()` のオプションでハンドラを渡すパターン。

````
 $.ajax({
   beforeSend: function(){
     // Handle the beforeSend event
   },
   complete: function(){
     // Handle the complete event
   }
   // ......
 });
````

## Global events

全 DOM 要素に送られてくる event。 bind() でハンドラをくっつける。

````
 $("#loading").bind("ajaxSend", function(){
   $(this).show();
 }).bind("ajaxComplete", function(){
   $(this).hide();
 });
````

ref. http://docs.jquery.com/Ajax_Events
Android：XMLレイアウトから呼び出せる自作View



サンプルとして簡易TextViewを作ってみました。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, MyActivity"
            />
    <com.example.MyTextView xmlns:app="http://hoge/app"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            app:text="Hello MyTextView."
                            app:textSize="48"
                            app:textColor="#FFFF0000"
                            app:background="#FFFFFFFF"/>

</LinearLayout>
```

```java:MyTextView.java
package com.example;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class MyTextView extends View {
    private static final int BACKGROUND_COLOR = 0;
    private static final int TEXT_COLOR=Color.WHITE;
    private static final int TEXT_SIZE = 12;
    private String text="no data";
    private Paint paint;

    public MyTextView(Context context) {
        super(context);
        paint=makePaint(TEXT_COLOR, TEXT_SIZE);
        setBackgroundColor(BACKGROUND_COLOR);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        final String NAME_SPACE = "http://hoge/app";
        text=attrs.getAttributeValue(NAME_SPACE,"text");
        int fontColor = attrs.getAttributeIntValue(NAME_SPACE, "textColor", TEXT_COLOR);
        setBackgroundColor(attrs.getAttributeIntValue(NAME_SPACE,"background",BACKGROUND_COLOR));
        paint=makePaint(fontColor,(attrs.getAttributeIntValue(NAME_SPACE,"textSize",TEXT_SIZE)));
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawText(text,0,-paint.getFontMetrics().top,paint);
    }

    private Paint makePaint(int fontColor,int size) {
        Paint paint=new Paint();
        paint.setAntiAlias(true);
        paint.setTextSize(size);
        paint.setColor(fontColor);
        return paint;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int y=(int)(paint.getFontMetrics().bottom-paint.getFontMetrics().top);
        setMeasuredDimension((int) paint.measureText(text),y);
    }
}
```
mat2cell vs forループ

mat2cell駆使してたらえらい遅いことに気がついたので，簡単な実験をしてみた．
ランダムな正数の入ったN*1の行列をN*1 個のcellに分割する（N=1e1,1e2,...,1e7）．
ご指摘等ありましたらよろしくお願いします．

```matlab:mat2cell-vs-for.m
t1=zeros(7,1);
t2=t1;
for n=1:7
    N=10^n;
    a=randi(N,N,1);
    % mat2cell
    tic
        out=cell(N,1);
        out=mat2cell(a,ones(N,1));
    t1(n)=toc
    %
    % for
    tic
        out=cell(N,1);
        for i=1:P
            out{i}=a(i);
        end
    t2(n)=toc
end
% visualization
plot(1:7,[t1,t2])
legend({'mat2cell','for-loop'})
set(gca,'XTickLabel',{'1e1','1e2','1e3','1e4','1e5','1e6','1e7'})
xlabel('Vector size')
ylabel('Elapsed time (sec)')
```

実験結果
Mac Pro (Mid 2010)
OS: 10.7
processor: 2 x 2.66GHz 6-Core Intel Xeon
mem: 16GB
Matlab 2012a

t1 =
    0.0008
    0.0006
    0.0047
    0.0437
    0.4256
    4.2257
   43.2572


t2 =
    0.0003
    0.0000
    0.0002
    0.0014
    0.0187
    0.1723
    1.4863

![結果](https://p.twimg.com/As6cbHZCQAANkac.png)

コード的にはmat2cellのが断然きれいなのだけど，データのサイズが大きくなると計算時間は比較にならないようです．分割数を変えた場合や，分割サイズを可変にした場合どうなるかについては，未検証…
自前のクラスのインスタンスを NSUserDefaults なんかで保存して置きたいとき


##自前のクラスでNSCodingプロトコルを採用する
encodeWithCoder と initWithCoder を以下のように実装する。


```objectivec:Hoge.h

@interface Hoge:NSObject <NSCoding>

@end

```

```objectivec:Hoge.m

@implementation Hoge {
	NSString *_hoge;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:_hoge forKey:@"hoge"];
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self){
        _hoge = [aDecoder decodeObjectForKey:@"hoge"];
    }
    return self;
}

@end

```


##インスタンスをシリアライズして NSUserDefaults に保存する
シリアライズする時は `[NSKeyedArchiver archivedDataWithRootObject:(id)id]` を使う。

```objectivec:Save.m

@implementation Save 

	- (void)save{
		Hoge *_hoge = [[Hoge alloc] init];
		NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_hoge];
		NSUserDefaults *userDefaults = [NSUserDefaults 	standardUserDefaults];
		[userDefaults setObject:data forKey:@"hoge"];
		[userDefaults synchronize];
	}

@end

```


##NSUserDefaultsからインスタンスを取り出してデシリアライズする
デシリアライズする時は `[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data]`を使う。

```objectivec:Load.m

@implementation Load 

	- (void)load{
		NSUserDefaults *userDefaults = [NSUserDefaults 	standardUserDefaults];
		NSData *data = [userDefaults dataForKey:@"hoge"];
		Hoge *_hoge = [NSKeyedUnarchiver unarchiveObjectWithData:data]
	}

@end

```
Inverse Fizzbuzz (FizzBuzzの逆関数)

（追記）もっと簡潔になるように解き直しました。→ http://qiita.com/items/6a0774443413c71c09d9

問題は http://d.hatena.ne.jp/matarillo/20120515/p1

私の答えは、範囲内の解をすべてリストアップしています。

解が1つでよい場合は、offsetsと掛け合わせずに、shortestsの先頭の配列だけ返せばよいです。
そうすれば、メソッドの引数からstartとendを削除できます。

```c#:Program.cs
using System;
using System.Linq;
using E = System.Linq.Enumerable;

class Program
{
    static void Main()
    {
        var result = InverseFizzBuzz(new[] { "fizz", "fizz", "buzz" }, 1, 100);
        foreach (var a in result)
        {
            Console.WriteLine(string.Join(",", a));
        }
    }

    static Tuple<int,string>[] table = E.Zip(
        new[] { 0, 3, 5, 6, 9, 10, 12},
        new[] { "fizzbuzz", "fizz", "buzz", "fizz", "fizz", "buzz", "fizz" },
        (x, y) => Tuple.Create(x, y)).ToArray();

    static int FromIndex(int index)
    {
        return (index / 7 * 15) + table[index % 7].Item1;
    }

    static bool IsMatch(int index, string value)
    {
        return table[index % 7].Item2 == value;
    }

    static int[][] InverseFizzBuzz(string[] input, int start, int end)
    {
        var list = from index in E.Range(0, 7)
                   let indices = E.Range(index, input.Length)
                   let tuples = E.Zip(indices, input, (x, y) => Tuple.Create(x, y))
                   where tuples.All(x => IsMatch(x.Item1, x.Item2))
                   let rStart = FromIndex(tuples.First().Item1)
                   let rEnd = FromIndex(tuples.Last().Item1)
                   select E.Range(rStart, rEnd - rStart + 1).ToArray();

        var lookup = list
            .Select(x => new { Value = x, Length = x.Length })
            .ToLookup(x => x.Length)
            .OrderBy(x => x.Key);

        var shortests = (lookup.Count() > 0)
            ? lookup.First().Select(x => x.Value)
            : E.Empty<int[]>();

        var oStart = start / 15;
        var oEnd = end / 15;
        var offsets = E.Range(oStart, oEnd - oStart + 1).Select(x => x * 15);

        var withOffsets = from x in shortests
                          from y in offsets
                          where (start <= x.First() + y) && (x.Last() + y <= end)
                          select x.Select(z => y + z).ToArray();

        return withOffsets.ToArray();
    }
}
```
Symfony2でデストラクタを使用したらcache:clearで呼び出された


Symfony2でバッチ処理を実行するコンソールコマンドを作成したときのこと。
このクラスでは__destruct関数を使用して終了処理を実装したのだけど、
コンソールコマンドでキャッシュをクリアした際にFatal Errorを吐いてしまった。

原因はよくわからないのだけど、cache:clearの最後にこのクラスの__destruct関数が
呼び出されてしまっているようなので、__destructを使わない形に書きなおした。
エラーメッセージを見る限り__destruct内の実装次第でエラーは出ないと思うけど、
とりあえず__destructの使用は控えることにした。