OmniAICreator/Qiita-1.07M huggingface dataset:
rbenv で ruby2.0.0-p0 のインストール


## Upgrade ruby-build
まずは ruby-build を upgrade する。

```bash
% brew unlink ruby-build
% brew upgrade ruby-build
% ruby-build
ruby-build 20130224
usage: ruby-build [-k|--keep] [-v|--verbose] definition prefix
       ruby-build --definitions
```

```bash
% rbenv install -l
...
2.0.0-p0
...
```
で ruby 2.0.0-p0があることを確認。

## Install Ruby 2.0.0-p0
```bash
% CONFIGURE_OPTS="--with-opt-dir=/usr/local" rbenv install 2.0.0-p0
Downloading ruby-2.0.0-p0.tar.gz...
Downloading ruby-2.0.0-p0.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
Installing ruby-2.0.0-p0...
Installed ruby-2.0.0-p0 to /Users/ONDA/.rbenv/versions/2.0.0-p0
```

これでインストールできているので 2.0.0-p0 を有効にする。

```bash
% rbenv local 2.0.0-p0
% ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.1]
```

インストール完了。

ちなみに以下でも大丈夫。

``` bash
% RUBY_CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 2.0.0-p0                                 [ ~] 
Downloading ruby-2.0.0-p0.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
Installing ruby-2.0.0-p0...
Installed ruby-2.0.0-p0 to /Users/ONDA/.rbenv/versions/2.0.0-p0
% rbenv local 2.0.0-p0
% ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.1]
```

## OpenSSL::SSL::SSLError
証明書の問題でエラーがでたら以下のようにして対処すればいいみたい。
[homebrew で入れた openssl を使って Ruby をコンパイルすると SSL 利用時に証明書エラーが発生する場合の対応](http://qiita.com/items/12457815d5cee3723b97)

```bash
% brew install curl-ca-bundle
% cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
```

## おわりに
阿鼻らなかった。
for文を回すときのi,jの名前をひと工夫すると、間違いが起きにくくなる

[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](http://www.amazon.co.jp/gp/product/4873115655/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873115655&linkCode=as2&tag=theuntitled-22)がとても良い感じなのでシェア。例えば以下のコードは配列から行列を作るコードだが、afterのようにfor文を回すときのi,jの名前をひと工夫すると、間違いが起きにくいコードに生まれ変わる。

```coffeescript:before
  _putShuffleMatrix: ->
    a = []
    a = @_putShuffleArray()
    b = []
    for i in [0...@height]
      b[i] = []
      for j in [0...@width]
        b[i][j] = a[i * @width + j]
    return b
```

```coffeescript:after
  putShuffleMatrix_: ->
    shuffleArray = []
    shuffleArray = @putShuffleArray_()
    shuffleMatrix = []
    for height_i in [0...@height]
      shuffleMatrix[height_i] = []
      for width_j in [0...@width]
        shuffleMatrix[height_i][width_j] =
        shuffleArray[(height_i * @width) + width_j]
    return shuffleMatrix
```


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
プロジェクト管理 - テスト管理

テスト管理
============

堅実なテストは、品質・リファクタリングによる保守性の向上に欠かせない条件です。
言語を問わず、テストを書くことは非常に重要ですが、この重要性を他者に伝えるのは難しいです。
プロジェクトにおいてこの重要性を共通認識とするには、実際にプログラミングがどれほど早くなるかを経験させることが重要です。
ここではテストの自動化による恩恵を記述していきます。

単体テスト
-----------

* **テストを完全に自動化して、その結果もテストにチェックさせる。**

  javaの場合はjUnitを利用してテストコードを記述し、後述するCI(Continuous Integration)を使ってコンパイルと同時にテストを実行させます。
  自動化することでテストのチェックに割く時間が短縮され、バグの発見が迅速になります。

* **テストをきっちり書くことでバグ検出に絶大な威力を発揮する。**

  テストをきっちりと書くことと頻繁にテストを行うことで、コードの修正時に紛れ込んだバグの発見が容易になります。
  これは、バグ検出・原因の特定が早くなり、ミスを起こしやすい箇所を意識することができます。
  
* **テストを頻繁に実行する。**
  
  コードの修正ごとに実装者がテストを行うのはもちろんですが、プロジェクトのテストコードすべてを1日に一度は行うようにCIで設定しましょう。
    
* **バグ報告を受けたら、まずそのバグを明らかにする単体テストを書く。**

  バグの報告を受けた場合、現象を再現できるデータを用意し確認します。その後、現象を修正する前にテストコードを記述しましょう。
  バグのスコープを絞り込む必要があるか、関係す津不具合があるようであれば、複数のテストを記述します。
  単体テストは、バグを突き止めるのにも、再度同じようなバグが単体テストをすり抜けないことを保証することにも役立ちます。
      
* **実行できない完全なテストより、実行できる不完全なテストのほうがまし。**

  テストを追加する際、対象のクラスがなすべきことをまず調べます。それから不具合を起こしそうなテストするようにしましょう。
  フィールドのsetter/getterのテストなど、単純なものは書かないほうがよいです。これは、たくさんのテストを書こうとするあまり、必要なテストを書き漏らしてしますからです。
  単純でバグのなさそうな箇所のテストを多く記述するよりも、少なくてもバグの潜んでいそうな条件のテストの方が重要ということです。
      
* **失敗の恐れのある境界条件を考えて集中的にテストする。**

  境界条件は得に重要なテストとなるので必ず記述するようにしましょう。
  日付範囲などはバグが発生しやすく、また、意図していない処理となる可能性が高いです。テストをしっかりと書くことで未然に防ぐことができます。
      
* **例外のテストをわすれないこと。**

  例外が発生する箇所のテストも記述するようにしましょう。
  例外の発生箇所の妥当性を意識でき、本当に例外を発生させる必要がある箇所なのか考えることができます。
      
* **テストでバグがみつからなくても、テストを書くことをやめてはならない。**

  テストからバグがみつからなくても、テストは書きましょう。
  リファクタリングが必要になったとき、広範囲に影響がありそうな修正を行う際に、テストがあることで安心して修正できるためです。
  
*参考文献*

[リファクタリング―プログラムの体質改善テクニック](http://www.amazon.co.jp/gp/product/4894712288/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=pulps-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4894712288)

Continuous Integration
-----------------------

    jenkinsの説明(省略)

Selenium
----------

    Seleniumの説明(省略)
プロジェクト管理 - バージョン管理

バージョン管理
===============

コンパイルエラーコミット
---------------------------

基本的にコンパイルエラーが出た状態でコミットすることはしてはいけない。
機能が分化されていたとしても、コンパイルエラーが出ていると他のメンバーの作業に影響がでるからです。
意識して、あるいは、無意識にコンパイルエラーをコミットするケースがあります。
意識してコミットしなければいけない場合は、必ずメンバーに周知しましょう。この際は、理由や完了予定時刻も周知しましょう。

**意識的なコンパイルエラーコミット**

* 影響範囲が広い機能を修正した。
* O/Rマッパーの使用時に影響範囲の広いエンティティの変更をした。

**無意識のコンパイルエラーコミット**

* コミット漏れがあった。自身の環境ではコンパイルが通っているので、気づかなかった。
* subversionのexternalsを使用していて、内包されているパッケージから内包している側のクラス呼び出しをしてしまった。
* ソースコードの修正を行ったが、別プロジェクトとなっているtestパッケージに修正を行わなかった。

上記のような理由でコンパイルエラーコミットがなされる場合があるが、気がついたら互いに教え合える環境を作ることも重要である。
また、HudsonなどContinuous Integrationを使用し、エラーに目を光らせておくことは効果的である。

コミットコメント
-------------------------

TracやRedmineなどBTSとチケット連携しているような場合も含め、コミットコメントの重要性をきちんとメンバーが認識し、プロジェクト内に一定のルールを作るべきです。
コミットコメントをつけることにより、誰がどういう意図でソースコードを編集したかがわかり、コンフリクトの発生時やタグを切る際に非常に有用な情報となります。
コミットコメントがかかれていない場合、変更の意図をソースの差分から追わなければいけなくなります。

**コミットコメントで書くべきこと**

* なぜその問題の解決が必要だったのかの簡単な説明
* 影響範囲
* 削除したものがあれば、その説明
* 他の関連するリビジョンやタグへの参照
* TracやRedmineを連携している場合、チケット番号
* 簡潔に書くこと

コンフリクト(競合)
----------------------

同一ファイルの同一箇所で競合が発生する例として下記が考えられる。

**競合の例**

* 2人の開発者が同時にバグを発見し、両者がともに修正を行った。
* 2人が追加しようとしている機能で共通のクラスが使われていて、両者がともにフィールドを追加した。

競合による弊害として、手動のマージ作業が発生し開発効率は悪くなること、手動マージのミスによるデグレがある。
また、バージョン管理ツールの知識が低いメンバーがいる場合、競合について教育しておかないとオーバーライドしてしまう可能性もある。
上記の問題の根本的な要因は、コミュニケーションの問題であることが多い。
プロジェクトの立ち上げ時に、競合についてのプロジェクトルールを策定することは重要である。

**競合発生時のルールの例**

* オーバーライドしてコミットは絶対しない
* 必ず当事者同士でマージ確認を行う。
* 次回のチーム会議(振り返り)で競合の原因を議論しコミュニケーションの改善方法を話し合う。

*参考文献*

[Subversion実践入門—達人プログラマに学ぶバージョン管理](http://www.amazon.co.jp/gp/product/4274066134/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=pulps-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4274066134)
[達人プログラマー―ソフトウェア開発に不可欠な基礎知識 バージョン管理/ユニットテスト/自動化](http://www.amazon.co.jp/gp/product/475614599X/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=pulps-22&linkCode=as2&camp=247&creative=1211&creativeASIN=475614599X)
プロジェクト管理 - バグレポートの書き方

バグレポートの書き方
==========

バグを正しく管理していく上で、バグレポートを正しく書くことは必要不可欠です。
バグを直してもらうために、バグレポートを登録することになりますが、このレポートが意味不明なものでは目も当てられません。
どのようなバグが見つかり、どのように直すべきなのかが簡潔に過不足なく記述されている必要があります。意味不明なレポートは開発を混乱させます。
たとえ自分で登録して直すことになるバグであったとしてもレポートは正しく記述すべきです。なぜなら、あとから必要が生じてレポートを見たときに、ソースコードに対してどんな変更を行ったのかがわからなくなってしますからです。
チームで開発しているなら、当然、他のメンバーを困惑させる要因となります。正しいバグレポートを書くことで不要なトラブルを避け、開発の生産性を向上させることができます。

**漠然とした以下のようなバグレポートを書かない**

  * 日本語としておかしい
  * レポート内容が極端に短い
  * 1つの文章が長すぎる
  * 表現が抽象的

    例 : 「～だったかもしれない」
  * 必要な情報が示されていない

    例 : 「再現手順」「発生箇所」
  * 漠然としたバグレポートの弊害

    * 課題の振り分けや優先度管理に支障がでる
    * 開発者が混乱し、報告者への質問の手間が増える
    * 報告者の意図していない箇所が修正される
    * バグの発生箇所の特定が難しくなる
  
**よいバグレポートを書くには**

  * レポートを読む相手のことを考えて書く
  * 簡潔に書く
  * 論理的に書く
  * 現象・再現手順を明解に書く

**あらかじめフォーマットを決めておく**

  ::
     
    【タイトル】
    【報告者】
    【優先度】
    【現象】
    【再現手順】
    【修正方針】
    
**タイトルを見ただけで、内容が把握できるように工夫する**

  例::
  
    ・ 【××画面】検索ボタン押下時エラー
    ・ 【××画面】削除済みのデータが一覧に表示されている
    ・ 【優先度:緊急】すべての画面でスタイルシートが摘要されていない
    
**再現手順の書き方**

  例::
  
    1. ××画面を表示する
    2. ××のテキストフィールドに21文字入力する
    3. ××ボタンを押下するとエラー画面が表示される

**投稿前に文章を読み返し、誤字脱字・文章が伝わりやすいかを確認する**

**まとめ**

  * 読み手の気持ち・状況を考えて書く
  * 簡潔に書く
  * タイトルを見て内容が想像できる
  * 再現手順が正確
  * 修正方針が明確
  * 複数のエラーが混在せず、問題の切り分けができている
  * 投稿前に読み返す

*参考文献*

[実践バグ管理―プロジェクトを成功に導くための](http://www.amazon.co.jp/gp/product/4883376354/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=pulps-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4883376354)
プロジェクト管理 - リフレクションメモ

リフレクション(振り返り)
=========

プロジェクトは、効率化に向けた改善を継続して行うことが重要です。改善を行うのに有効な、「振り返り」の準備と実施について記述しています。
振り返りとは、1週間か2週間に一度ほどの頻度でチームメンバーが集まって、問題や改善を話し合うことでプロジェクトの効率化を図ります。
改善に向けた自由な意見を引き出し、コミュニケーションの向上を計り、だらだらと時間をかけずに行うためには準備が必要です。
また、実施の際に留意しておくべきことも記述しています。

準備
------------------

振り返りを有意義なものとするには準備が必要です。
振り返りのイテレーション期間内で問題が発生した場合、記録として残さないと、「振り返りのときに言おうと思っていたけど、いい忘れた。」ということになりかねません。
問題を記録し、メンバー内で共通の議題として事前に認識しておくということは、振り返り実施時に多くの意見がでることにつながります。
また、司会者・書記をきめておくことも重要です。ここでは事前に準備しておくべきことを記述します。
  
1 司会・書記を決める。
  
  司会・書記をメンバー内で順番に行うことで、スキルアップにつながり、振り返りへの取り組み意識も向上します。
  初めて担当するメンバーは緊張するかもしれませんが、事前準備をしっかりして挑むようにしましょう。
  
2 振り返り用のテンプレートを設置する。
  
  メンバーの誰でも記述できる下記の例のようなテンプレートをwikiなどに設置しましょう。
  事前に問題を記述しておくことで、議論の焦点が明確になります。また、司会担当者は問題・連絡事項を積極的に記述するようにメンバーに語りかけましょう。     
    
  *※テンプレート例*
    
  :実施予定日: 2011/04/01 15:00 ～ 16:00
  :司会: ○○ 
  :書記: ×× 
  :問題: 
      
    1. SVNでオーバライドするミスがあった。
    2. 仕様書のフォーマットが決まっていない。
    3. わかりにくいバグレポートが多い。
      
  :連絡事項:

    1. ●●のプラグインを作成しました。
    2. テストパッケージの構成を決めました。
  
実施
--------

| 振り返りにおける各メンバーの対立や葛藤を解消しながら、組織として一体感を引き出すためには事前準備だけでなく、
| 各メンバーに合わせた臨機応変な体応力も必要となります。司会担当はこういった点にも配慮する必要があります。

* 消極的なメンバー
  
  * 普段からおとなしいメンバー
  
    * ポストイットを事前に配布して発言の代わりに記入してもらう。
    * 必要に応じて指名して発言を求める。
    
  * 普段はよく話すが振り返りではおとなしいメンバー
  
    * ポストイットを事前に配布して発言の代わりに記入してもらう。
    * 必要に応じて指名して発言を求めるが、最初から指名するのは避けた方がよい。
    
  * 振り返りに協力的ではないメンバー

    * 「こんな考え方もあると思いますが、それについてどう考えますか？」と誰かの違憲を引き合いに出して質問する。
    * このタイプの人の発言にはじっくり耳を傾けて聞く必要がある。
      
* 議論を混ぜ返すメンバー

  * 「ちょっとまって」「いや、そもそもさぁ」「その前に一つ質問してもいい」と議論に割って入ってくる特徴がある。
  * フリップチャートのポイントに当てはめて説明を試みる。
  * 議論が二転三転しないようにホワイトボードなどで整理しながら議論を進める。
  
* 自分の立場に固執するメンバー

  * 多数意見に埋もれてしまわないように気をつける。
  * 時間がかかるようであれば、次回の振り返りに議題を持ち越す

*参考文献*

[実務で役立つ プロジェクトファシリテーション](http://www.amazon.co.jp/gp/product/4798110817/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=pulps-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4798110)
英語の形態素解析TreeTagger[java]でやってみた。

TreeTaggerのインストールは、この辺りで（直に叩く場合perlが必要みたい）
http://funoisan.blog.fc2.com/blog-entry-4.html
僕はこんな感じで導入しました。（eclipse使ってます）
http://d.hatena.ne.jp/ZAORIKU/

この２つのサンプルをくっつけたら動きましたという内容です。
http://code.google.com/p/tt4j/
http://code.google.com/p/tt4j/wiki/Usage
軽いメモなのでリンク先を参照してください。

treetaggerフォルダはcドライブ直下
パラメータファイルも以下の位置に必要
/treetagger/lib/english.par　

サンプル文字列は、メインの頭の方のここでいれてます。
 String str="I've been to America. I bought leaves";

```java:
package org.annolab.tt4j;

import static java.util.Arrays.asList;

import java.text.BreakIterator;
import java.util.ArrayList;
import java.util.List;

public class Example {
        public static void main(String[] args) throws Exception {
                // Point TT4J to the TreeTagger installation directory. The executable is expected
                // in the "bin" subdirectory - in this example at "/opt/treetagger/bin/tree-tagger"
                //System.setProperty("treetagger.home", "/opt/treetagger");
           	    System.setProperty("treetagger.home", "/treetagger");// ここに本体が必要　\treetagger\bin\tree-tagger.exe　これのことのようです。
        	    TreeTaggerWrapper tt = new TreeTaggerWrapper<String>();
        	    
                String str="I've been to America. I bought leaves";//サンプル
                List<String> sampleStr  = tokenize(str);
        	    
                try {
                        //tt.setModel("/opt/treetagger/models/english.par:iso8859-1");
                	    tt.setModel("/treetagger/lib/english.par:iso8859-1");// ここにpar パラメータファイルなるものが必要
                        tt.setHandler(new TokenHandler<String>() {
                                public void token(String token, String pos, String lemma) {
                                        System.out.println(token + "\t" + pos + "\t" + lemma);
                                }
                        });
                        //tt.process(asList(new String[] { "This", "is", "a", "test", ".", "I","bought","the","car",".","I've","bought","a","car","."}));
                        tt.process(sampleStr);
                }
                finally {
                        tt.destroy();
                }

                
        }
        
        public static 
        List<String> tokenize(
                        final String aString)
        {
                List<String> tokens = new ArrayList<String>();
                BreakIterator bi = BreakIterator.getWordInstance();
                bi.setText(aString);
                int begin = bi.first();
                int end;
                for (end = bi.next(); end != BreakIterator.DONE; end = bi.next()) {
                        String t = aString.substring(begin, end);
                        if (t.trim().length() > 0) {
                                tokens.add(aString.substring(begin, end));
                        }
                        begin = end;
                }
                if (end != -1) {
                        tokens.add(aString.substring(end));
                }
                return tokens;
        }
}
```
Higher order function

----

##Introduction
There are two characteristics in higher order function.

* Accept a function as a parameter
* Return a function

##Popularity
Higher order function is now implemented in many programming launguage, such as **Ruby**, **javascript**,**Haskell**, especilly it is heavily used in jQuery(A javascript library). In Java, there is no higher order function, but you can wrap the higher oreder function in an annoymous inner class.

**jQuery**

**click** is the higher order function, where the function alert a dialog is the parameter passed in 

```javascript
    $("#target").click(function() {
      alert("Handler for .click() called.");
    });
```
**Ruby**

There are many higher order function in Array of Ruby, such as each, map, inject but these methods come from the Enumerable mixin.

```ruby
    (1..2).each do |num|
      puts num
    end

    %w{jason sam}.map { |name|  name }
```


##The Usage of higher order function
#####Reduce control structure
#####Simplify design pattern
#####Abstract programming in another aspect

#Reference
[What are some interesting uses of higher-order functions?](http://stackoverflow.com/questions/5792769/what-are-some-interesting-uses-of-higher-order-functions)
acts_as_versionedを使う

化石のようなライブラリだけど、他によさそうなのが見つからなかったので使う。
案の定Rails3で使おうとしてうまく動かなかったのでメモ

```ruby:Gemfile
gem 'acts_as_versioned_rails3'
```

```ruby
class Entry < ActiveRecord::Base
  acts_as_versioned_rails3 
end
```

今時のRailsではもう誰も使ってなさそう・・・。
クロージャって何? どこがオブジェクト指向と似てるの? をRubyで説明するために書いたコード

タイトルの通り。

人にコードだけ見せて書き捨てるのももったいない気がしたので、説明を加筆して公開。

 * わからないところがあったら質問ください
 * 誤りや語弊のある表現があれば突っ込みください

オブジェクト指向とは何か、と語りはじめるとたいへん長い話になり、僕は議論できるほど理解を深めてないので **「諸説あるが」** で済ませるとして、ここではRubyのクラスベースオブジェクト指向プログラミング、つまりC++風の抽象データ型に基くOOPの話になります。 *乱暴だなあ* 。

```ruby
class A
  def initialize (arg)
    # インスタンス変数(メンバ変数)定義
    # これは同じインスタンスのメソッドの中からしか参照できない
    @x = arg.upcase
  end

# メソッド定義
  def call
    # インスタンス変数@xの値を取り出す
    return @x
  end
end

# 定数に函数を代入してる
B = ->(arg){
  # 函数定義の中で変数定義
  x = arg.upcase
  # Bが呼びだされると、このfuncが新たに生成される
  func = ->{
    # この函数の中からは変数xを参照できる
    # むしろxは、Bの函数定義内からしか参照できない=閉ぢてる=クロージャ
    return x
  }
  return func
}

# インスタンス生成
a1 = A.new("foo")
# メソッド呼び出し
p a1.call

# インスタンス生成みたいなもの
b1 = B.("foo")
p b1.call

### aとa2, bとb2が新しい別のインスタンスであることを確認

# インスタンス生成
a2 = A.new("bar")
# メソッド呼び出し
p a2.call

# インスタンス生成みたいなもの
b2 = B.("baz")
p b2.call
```

 * `a1` と `a2` の `@x` と、 `b1` と `b2` から見た `x` は、それぞれ別物。
 * `B` 内部の `x` は、この場合 `func` からしか参照することができない
   * `B` と名前を付けられた函数定義が、変数のスコープを作ってる
   * 函数定義によって閉ぢたスコープができるから **クロージャ(閉包)** って呼ばれる
   * `x` の中身は外部から参照したり破壊されたりしないので *隠しておける*
   * これってつまり一般にオブジェクト指向の特徴の一つだと呼ばれることがある **「隠蔽」だよね**
 * `A` の `@x` はインスタンスのメソッドからしか参照・操作できない (*建前、裏技あり*)
    * でも `A` のなかに `def x; @x; end` とか `def x= (arg); @x = arg; end` みたいなメソッドを定義すれば `a.x = "foo"` みたいに C# のプロパティと似たようなことができる
    * でもって、 `attr_accessor :x` と書けば、上記の定義とまったく同じものを省略することができる。ぐぐれ。
    * Ruby の世界では `x=` は一つのメソッド名。なのに `a.x = "foo"` とか書けちゃう。ふしぎふしぎ。
 * 僕は JavaScript とか Scheme とか素人だけど、たいへんお世話になってます
 * Python はクロージャを作りにくかった(上のコードを素直に移植してもうまくいかない)んだけど、Python 3 では `nonlocal` が追加されたので作りやすくなりました
 * Ruby でもクロージャは使へるけど、ふつうは素直にクラスを使って表現するべき
 * でも最近仕事で PHP は [変数のスコープがファイルローカルじゃない](http://php.net/manual/ja/language.variables.scope.php) ときいて、クロージャを作って `call_user_func` で呼び出す必要があった (しろめ)

補足
----

 * Ruby の `->(){ ... }` は函数オブジェクトを作成する構文
   * `lambda{ ... }` って書いてもほとんど同じなので、文脈によって読みやすさ、かっこよさで選んで良い
 * ( *あとでまた書く* )

合せて読まれたい
--------------

そして突っ込みが欲しい

 * [ラムダ式で学ぶクロージャとDSL #Ruby #ラムダ式 #JavaScript #DSL - Qiita](http://qiita.com/items/a40b2a9c1f7768abd3bb)
 * [カリー化ってなぁに? をRubyから。 - DT戦記(zonu_exeの日記)](http://d.hatena.ne.jp/zonu_exe/20110910/1315669228)
 * [Rubyでのカリー化、をまじめに。 - DT戦記(zonu_exeの日記)](http://d.hatena.ne.jp/zonu_exe/20110911/1315754365)
 * [Ruby vs Python! ～def vs def～ - DT戦記(zonu_exeの日記)](http://d.hatena.ne.jp/zonu_exe/20111205/1323096647)
ZabbixでApacheのモニタリング

UserParameterだとパラメータ毎に取得タイミングがずれるので、zabbix_sender方式に変更しました。

以下のスクリプトはZabbixに登録しているホスト名とhostnameで取得できるホスト名は一致しているのが前提です。違う場合は`hostname` の部分を適宜変更してください。

```sh:/usr/local/sbin/send_apache_stat_to_zabbix.sh
#!/bin/sh
zabbix_server=${Your_zabbix_server_or_proxy_address_here}
my_zabbix_hostname=`hostname`
interval_seconds=60

while :
do
  curl -s 'http://127.0.0.1/server-status?auto' | awk '
BEGIN {FS=": "}
$1=="Total Accesses" {
  print "'$my_zabbix_hostname'", "apache.total_accesses", $2
}
$1=="Total kBytes" {
  print "'$my_zabbix_hostname'", "apache.total_kilobytes", $2
}
$1=="BusyWorkers" {
  print "'$my_zabbix_hostname'", "apache.busy_workers", $2
}
$1=="IdleWorkers" {
  print "'$my_zabbix_hostname'", "apache.idle_workers", $2
}
' | zabbix_sender -z $zabbix_server -s $my_zabbix_hostname -i -
  sleep $interval_seconds
done
```

 ```:/etc/init/send_apache_stat_to_zabbix.conf
start on runlevel [12345]
stop on runlevel [^12345]
respawn
exec /usr/local/sbin/send_apache_stat_to_zabbix.sh
```

```apache:/etc/httpd/conf.d/server-status.conf
ExtendedStatus On

<VirtualHost *:80>
    ServerName localhost
    <Location /server-status>
        SetHandler server-status
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>
</VirtualHost>
```
NSRegularExpression iOSで使う正規表現


文字列中にある英語のみテキスト色を変更する正規表現のサンプルです。
前回の[NSAttributedString](http://qiita.com/items/30ee7a851aea0447db06)を利用しています。

![SS](http://f.cl.ly/items/360E0t433f1O2N3k3U2C/スクリーンショット_2013_02_25_1_58-2.png)

```objectivec:NSRegularExpressionSample.m
- (void)drawRect:(CGRect)rect
{    
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:@"iPhone 3GS以降のどのiPhoneにも、臭素系難燃剤（BFR）やポリ塩化ビニル（PVC）は使われていません。これには私たちの最新のiPhoneであるiPhone 5も含まれます。事実、AppleのBFRやPVCの不使用に関する基準は、業界で最も厳格なものの一つです。しかも私たちは、サプライヤーに対しても同じ基準を求めています。クパチーノにあるAppleの研究所では、製品を個別の部品と素材に分解し、その後、蛍光X線分光やイオンクロマトグラフィーなどの様々な方法でそれらを検査します。この方法によって、Appleが販売するあらゆる製品がAppleの環境基準を満たしているかどうかを確認できるのです。"];
    
	/* 全体のフォントサイズを指定 */
    [attrStr addAttribute:NSFontAttributeName
                    value:[UIFont systemFontOfSize:20.f]
                    range:NSMakeRange(0, attrStr.length)];
    
    /* 正規表現で一致する全てのNSRangeを取得する */
    NSError *error = nil;
    // アルファベットを指定
    NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"([a-zA-Z]*)" options:0 error:&error];
    if (error == nil) {
        NSArray *arr = [regexp matchesInString:attrStr.string options:0 range:NSMakeRange(0, attrStr.length)];
        for (NSTextCheckingResult *match in arr) {
			// 一致する範囲の色設定
            [attrStr addAttribute:NSForegroundColorAttributeName
                            value:[UIColor redColor]
                            range:[match rangeAtIndex:1]];
        }
    }
    [attrStr drawInRect:rect];
}
```
##NSRegularExpression

注意点は、NSStringと正規表現の2つのエスケープが混在することです。
例えば、「\*」をエスケープする場合、正規表現では「\\*」となります。
しかしNSStringには「\\*」というエスケープはない為

	Unknown escape sequence '\*'

の警告が出ます。(まぁ無視しても正規表現は正常に機能してますが)
この警告を外すには「\」をNSStringでのエスケープをすればよいので「\\\\」になり、全体では「\\\\*」となります。

##NSTextCheckingResult

正規表現の一致結果を持っています。
rangeAtIndex:0 は全体の一致を、
rangeAtIndex:1 ()内の一致する範囲になります。
*※ 複数の()を指定した場合1以降*

	[例]
	対象: AppleからiPhone 3GSが発売
	正規表現: @"i([a-zA-Z]*) 3GS)"
	rangeAtIndex:0 → iPhone 3GS
	rangeAtIndex:1 → Phone
【助けて】さくらのサーバーだとIE9以降でwebfontが文字化けする


結論から言うと、[解決した](#解決策)のですが、そもそも対応があってるのかわからないので、もっとよいやり方がありましたら教えていただけると、丸２日間「IEシネ！IE死ね！」と叫び続けて憔悴しきった僕の心が救われます。

## webfontのクロスドメイン問題

そもそも、webfont使う時にまずこの対策をしとかないとダメなんですが、どうやらさくらのサーバーでは効かないというのが今回の問題の発端。通常のクロスドメイン対策はこちら。
[IE9以降でwebfontが文字化けする原因と解決策](http://qiita.com/items/5e026ca2f1e4ca9eb16e)

ようするにHTTPのレスポンスヘッダに`Access-Control-Allow-Origin`を加える処理（`Header set`）をapacheにさせてるということですね。

が、問題が発生。

## さくらのサーバーでは`header`が使えない

[Header使える？ | .htaccess < Wiki | さくらのレンタルサーバ非公式FAQ](http://faq.sakuratan.com/wiki/wiki.cgi?.htaccess#i10)

>たぶん使えない。ヘッダを追加したい場合はCGIやPHPで出力するか、他の代替手段を考えてみる。

![](http://t0.gstatic.com/images?q=tbn:ANd9GcRwVRXGwflZFYdzXqUeSTHJWyNsZ3aOd1TiDGumHkrGlnqQwTy1)

クソ野郎ぉ！！！！！！！！

てことで、phpで強引にheaderを書き換える方向で。

## フォントファイルへのアクセスをphpでプロキシする

このあたりを読んでみていろいろ試した結果動いたコードが以下。

- [さくらインターネットでmod_rewriteを使う](http://a4p.me/archives/166)
- [mod_rewriteについて質問です（多分）。 現在「さくらのレンタル.. - 人力検索はてな](http://q.hatena.ne.jp/1139320383)
- [杉浦とホームページ製作～ＵＲＬを書き換えろ！「.htaccessに書く場合の注意」](http://www.nurs.or.jp/~sug/homep/rewrite/rewrite15.htm)
- [How to Embed Webfonts Properly and How to Solve the Ambiguous "CSS3111: @font-face encountered unknown error"  - Marin Bezhanov](http://www.marinbezhanov.com/web-development/16/how-to-embed-webfonts-properly-and-how-to-solve-the-ambiguous-css3111-font-face-encountered-unknown-error/)


<a name="解決策" id="解決策">

```.htaccess
<FilesMatch "\.(ttf|otf|eot|woff)$">
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
</FilesMatch>

AddType application/vnd.ms-fontobject .eot
AddType font/ttf .ttf
AddType font/otf .otf
AddType font/woff .woff

RewriteEngine on
RewriteBase /
RewriteRule (.*).(eot|eot#iefix|ttf|otf|woff)$ assets/fonts/proxy.php?url=$1.$2 [L]

```

```proxy.php
<?php
header("Access-Control-Allow-Origin: *");
readfile($_GET['url']);
?>
```


1. 通常の手順も一応書いとく（もちろんさくらでは動かない）
2. `AddType`はなくても大丈夫かも（未確認）
3. `RewriteBase /`も必ず書く
4. `RewriteRule フォントファイル プロキシまでの絶対パス`
5. `.htaccess`をフォントディレクトリに配置


注意点は、

- RewriteRuleでプロキシまでの絶対パスの最初を`/`はじまりにしちゃうとダメ
- 最後の改行だ無いとダメ

僕は、`assets/fonts/`以下にフォントをまとめてごそっと入れてるのですが、なかには階層がネストしたものもあるけど、とりあえず
`assets/fonts/`直下に`.htaccess`と`proxy.php`置いとくだけでいけました。


ともかく解決して良かった…
Macの起動時間を調べる

Macの起動時間を調べるにはuptimeコマンドを使用する。

``` 
$ uptime
 0:41  up 7 days,  3:16, 2 users, load averages: 1.54 1.30 0.93
```

ちなみにログインやリブート、シャットダウンの履歴を調べるにはlastコマンドを使用する。

```
$ last
kimitaka  ttys000                   Sun Feb 17 21:27   still logged in
kimitaka  console                   Sun Feb 17 21:27   still logged in
reboot    ~                         Mon Feb 18 06:25 
（略）
kimitaka  console                   Wed Feb  1 06:02 - 07:33  (01:30)
reboot    ~                         Wed Feb  1 15:00 
shutdown  ~                         Wed Feb  1 02:54 

wtmp begins Wed Feb  1 02:54
```
自分でコンパイルしたRubyをrbenvで管理する(Mac OS X, Ubuntu)


通常はruby-buildもセットで使えば楽でいいのだけど、例えばruby2.0出た！　入れてみよう！　あ、ruby-buildがまだだ・・・。という理由ですぐに試せないという人が居たとすると悲しいので、自分でやってみた手順をメモしました。

# 準備
まず、rbenvを使えるようにします。
どうせ使うので、ruby-buildも入れておきます。

## Ubuntu
apt-getでrbenvインストール可能ですが、gitで入れたほうが良いです。

```bash
$ sudo apt-get instlal git
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

環境変数PATHに, ~/.rbenv/binを追加します。
そして、~/.bashrc とか ~/.zshrcに

```bash
eval "$(rbenv init -)"
```
を追記しておきます。

rubyのビルドに必要なパッケージを入れておきます。

```bash
$ sudo apt-get install libssl-dev libxml2-dev libxslt1-dev libyaml-dev libreadline-dev zlib1g-dev
```
このくらい入れとけば大丈夫です。

新しいバージョンのrubyが出た時は、以下のコマンドでruby-buildを更新するとインストール出来るようになっているかもしれません。

```bash
$ cd ~/.rbenv/plugins/ruby-build
$ git pull origin master
```

## Mac OS X
Homebrewは導入済みとします。

```bash
$ brew install rbenv ruby-build
```

Mac10.9以降の場合、特に追加でパッケージを入れておかなくてもrubyビルド可能です。

新しいバージョンのrubyが出たら以下を実行すればインストール出来るようになっているかもしれません。

```bash
$ brew update
$ brew upgrade ruby-build
```

# 本題
ここから本題のruby-buildを使わないインストール手順です。
UbuntuもMacも同じ手順でいけるはず。

```Bash
$ wget ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
$ tar xzvf ruby-2.0.0-p0.tar.gz
$ cd ruby-2.0.0-p0
$ ./configure --prefix=$HOME/.rbenv/versions/2.0.0-p0
$ make
$ make install
```

※hoge にはユーザー名を

これで $HOME/.rbenv/versions 以下にruby2.0がインストールされたはず。

```Bash
$ rbenv versions
  system
  1.9.2-p290
  1.9.3-p194
  1.9.3-p327
* 1.9.3-p374 (set by /Users/hoge/.rbenv/version)
  2.0.0-p0
  2.0.0-preview1
  2.0.0-rc2

$ rbenv global 2.0.0-p0
$ rbenv rehash
$ ruby -v
ruby 2.0.0p0 (2013-02-24) [x86_64-darwin12.2.1]
```

これで自分でビルドしたRubyがrbenvで管理出来る状態になったと思います。

あとは、[私がRubyをインストールしたとき確認すること - 絶対R領域](http://d.hatena.ne.jp/tech-kazuhisa/20130116/1358322666)を参考に、ハマリ易そうなところが大丈夫か見ておきます。

```Bash
$ irb
irb(main):001:0> require 'openssl'
true
irb(main):002:0> require 'zlib'
true
irb(main):003:0> require 'psych'
true
```

良さそうですね！
Rubyのopensslの証明書が見つからない時ってどうすればいいの？


```
Faraday::Error::ConnectionFailed: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
```

### 1.証明書の置き場所を調べる
homebrew経由か、MacPortsかで変わる

```
$ ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'
"/usr/local/etc/openssl/cert.pem"
```

### 2.証明書をダウンロードして指定の場所に置く。

```
$ curl -O http://curl.haxx.se/ca/cacert.pem
$ mv cacert.pem /usr/local/etc/openssl/cert.pem
```

homebrewを使っているなら以下のやりかたの方がいいかも。

- [homebrew で入れた openssl を使って Ruby をコンパイルすると SSL 利用時に証明書エラーが発生する場合の対応](http://qiita.com/items/12457815d5cee3723b97)
zshの履歴でコマンド実行時刻を見れるようにする


historyコマンドで-dを指定するとコマンドを実行した時刻が表示できる。年月日も見たい場合は-f。

```sh:
$ history -d
...
 8464  18:17  emacs .zshrc
 8465  18:19  less .zsh_history
```

　
このままだと現在のセッションで実行したコマンドの時刻しか見れないので、.zsh_historyに実行時刻を記録するよう設定を追加する。

```bash:.zshrc
setopt extended_history #share_historyでもOK
```

　
この設定を加えると、.zsh_historyに実行コマンドと合わせてタイムスタンプが記録されるようになる。


```sh:.zsh_history
$ tail -3 .zsh_history
echo foobar
emacs .zshrc
: 1361702407:0;tail -3 .zsh_history
```

これで閉じたセッションで実行したコマンドもhistoryで時刻を確認できるようになる。
iPhoneのカメラで撮影した写真をカメラロールへ保存する


iPhoneのカメラでの写真撮影は UIImagePickerController を利用する。また、撮影した写真をカメラロールへ撮影するには UIImageWriteToSavedPhotosAlbum 関数を利用する。

## カメラを起動

UIImagePickerControllerを使ってカメラを起動する。

```
- (IBAction)takePhoto:(id)sender {
    // 1. カメラを起動する
    UIImagePickerController *imagePicker;
    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePicker.delegate = self;
    [self presentViewController:imagePicker
                       animated:YES
                     completion:nil];
}
```

## 写真をカメラロールに保存

撮影が完了したら UIImagePickerControllerDelegateのimagePickerController:didFinishPickingMediaWithInfo: がコールバックされるので、UIImageWriteToSavedPhotosAlbum 関数でカメラロールへ保存する。

```
// 2. 撮影が完了した場合
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // 撮影した画像を取得し、
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    // カメラロールに保存する
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    // カメラを閉じる
    [self dismissViewControllerAnimated:YES completion:nil];
}
```
i.nicovideo.jp APIとgetthumbinfo APIの比較

## レスポンスXMLの違いを表にまとめた

| 項目 | http://i.nicovideo.jp/v3/video.array?v=sm3393520,sm5909863 | [http://ext.nicovideo.jp/api/<br/>getthumbinfo/sm3393520](http://ext.nicovideo.jp/api/getthumbinfo/sm3393520) |
|:--|:--|:--|
|video_id| sm3393520 | sm3393520 |
|title| 【アイドルマスター＋麻雀】im@s 雀姫伝　第一話 前編 | 【アイドルマスター＋麻雀】im@s 雀姫伝　第一話 前編 |
|description  | 「何故プレイ動画にしなかったのか」と何度も自分に呪詛を投げかけつつ、悪戦苦闘の末に生まれた手探りPremiere動画です。`<br />`技術的に未熟な点は追って覚えますので、生暖かい目で冷酷に見守って頂ければ幸いです。`<br />` … | 「何故プレイ動画にしなかったのか」と何度も自分に呪詛を投げかけつつ、悪戦苦闘の末に生まれた手探りPremiere動画です。技術的に未熟な点は追って覚えますので、生暖かい目で冷酷に見守って頂ければ幸いです。... |
| length_in_seconds | 667 |  |
|length||11:07|
|size_high||39289914|
| size_low | 33276193 | 33276193 |
| movie_type | mp4 | mp4 |
| thumbnail_url | http://tn-skr1.smilevideo.jp/smile?i=3393520 | http://tn-skr1.smilevideo.jp/smile?i=3393520 |
| upload_time | 2008-05-22T16:13:17+09:00 |  |
| first_retrieve | 2008-05-22T07:23:27+09:00 | 2008-05-22T07:23:27+09:00 |
| default_thread | 1211408607 |  |
| view_counter | 375883 | 375883 |
|comment_num||7780|
| mylist_counter | 9326 | 9326 |
|last_res_body||ぶひぃぃぃぃぃぃいい 初見 定期的に巡回してしま ありがとうござ...|
|watch_url||http://www.nicovideo.jp/watch/sm3393520|
|thumb_type||video|
|embeddable||1|
|no_live_play||0|
| option_flag_ichiba | 0 |  |
| option_flag_community | 0 |  |
| option_flag_comment_type | 0 |  |
| option_flag_adult | 0 |  |
| option_flag_mobile | 0 |  |
| option_flag_economy_mp4 | 1 |  |
| option_flag_middle_video | 0 |  |
| thread | `<id>1211408607</id>`<br>`<public>1</public>`<br>`<num_res>7780</num_res>`<br>`<community_id/>` |  |
| tags |  `<tag_info>`<br>　`<tag>アイドルマスター</tag>`<br>　`<area>jp</area>`<br>`</tag_info>`<br>`<tag_info>…</tag_info>` ||
|tags domain="jp"|| `<tag category="1" lock="1">`<br>　`アイドルマスター`<br>`</tag>`<br>`<tag lock="1">…</tag>` |
| user_id |  | 43787 |


### 個人的に気になるポイント

- descriptionでhtmlタグが入っている。改行の場所が分かるように！！！！！
- 再生時間の形式が秒数になってる
- コメント数がthreadの中に入ってる
- i.nicovideo.jp APIは複数件同時に取得できる
- "最大件数"は恐らく無い。20秒でタイムアウトして0件を返してくる模様。200件くらいなら安定して動くかもしれない。ただ、20秒もかかるようなリクエストを頻繁に投げるのは怖い…
- user_idが取れないのが個人的に痛い
- i.nicovideo.jp APIは用途が分からない項目が多い。option_flag_adultとかニコニコ動画で使うの…？　まだ検索しても情報があまり無い模様…
iOSアプリで「〜日前」表示

対象日時のunixタイムスタンプをを渡すと
「〜日前」「〜時間前」「〜分前」表示に変換

```objc:
- (NSString *)_displayDate:(int)timestamp
{
    NSDate *now = [NSDate date];
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval)timestamp];
    NSTimeInterval passed = [now timeIntervalSinceDate:date];
    int min = passed / 60;
    if (min <= 1) {
        return @"1分前";
    }
    if (min < 60) {
        return [NSString stringWithFormat:@"%d分前", min];
    }
    int hour = min / 60;
    if (hour < 24) {
        return [NSString stringWithFormat:@"%d時間前", hour];
    }
    int day = hour / 24;
    return [NSString stringWithFormat:@"%d日前", day];
}
```
CocoaPodsで入れたライブラリのドキュメントをDashで見る


* AppleDocを入れる
* pod installする
* DashのPreference→Docsets→でリロードすると、ドキュメントが出てくる

----

はじめに
----

XCodeの標準ドキュメントビュアーよりも軽くて速い[Dash](https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?l=en&mt=12)を使ってます。これ動作が軽いので重宝しています。

一方CocoaPodsを使ってライブラリを組み込んだりしてますが、このライブラリのドキュメントも検索させたかったのでやってみました。簡単でした。

AppleDocを入れる
----
まずはAppleDocを入れます。今回初めてHomeBrewを使ってみました。

```sh:
macmini% brew install appledoc 
Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.
==> Downloading https://github.com/tomaz/appledoc/tarball/v2.1
Already downloaded: /Library/Caches/Homebrew/appledoc-2.1.tgz
==> xcodebuild -project appledoc.xcodeproj -target appledoc -configuration Release clean install SYMROOT=build DSTROOT=b
 /usr/local/Cellar/appledoc/2.1: 17 files, 900K, built in 13 seconds
macmini% 
```
MacPortsが入ってるので怒られてますが気にしません。
homebrewは"自家製ビール"ということらしいので、ターミナルにビールが出てきたりします。おちゃめですね。
![](http://yfrog.com/scaled/landing/860/21ua.png)


pod installする
----
appledocがインストールされていると、pod install時にドキュメントが生成され、~/Library/Developer/Shared/Documentation/DocSets/以下に配置されます。

```sh:
macmini% pwd
/Users/tak/Library/Developer/Shared/Documentation/DocSets
macmini% ls -la
total 0
drwxr-xr-x  8 tak  staff  272  2 24 18:20 .
drwxr-xr-x  3 tak  staff  102 11  4 00:02 ..
drwxr-xr-x  3 tak  staff  102 11  4 00:21 com.apple.ADC_Reference_Library.DeveloperTools.4_5.docset
drwxr-xr-x  3 tak  staff  102 11  4 00:50 com.apple.adc.documentation.AppleOSX10_8.CoreReference.docset
drwxr-xr-x  3 tak  staff  102 11  4 00:37 com.apple.adc.documentation.AppleiOS6.0.iOSLibrary.docset
drwxr-xr-x  3 tak  staff  102  9 26 21:32 org.cocoapods.CocoaLumberjack-1.6.docset
drwxr-xr-x  3 tak  staff  102  9 26 21:32 org.cocoapods.libffi-3.0.11.docset
drwxr-xr-x  3 tak  staff  102  9 26 21:32 us.pandamonia.BlocksKit-1.8.1.docset
macmini% 
```

DashのPreference→Docsets→でリロード
----
Dashの環境設定の「DocsSets」でリロードすると、上で生成されたDocsSetを見れるようになります。
![](https://www.evernote.com/shard/s3/sh/6d857a2c-fecf-4c26-9bd3-410731bcdb3a/d2a33181d1623b927debad3a7483be56/res/e22d63a1-f80d-49b6-a27c-191384b8c497/skitch.png?resizeSmall&width=832)

![](https://www.evernote.com/shard/s3/sh/e0b8310d-044b-411c-8179-ca4dd7f1a942/2dddaab545f7206c27a05cc95a1ae89e/res/1aa0699b-cc21-486a-b8aa-07c9e87dc492/skitch.png?resizeSmall&width=832)
opencv2.4でピクセル単位で画像の値を変更する方法(モノクロ版)

```C++:hoge2.cpp
//8ビットモノクロ画像を作成
cv :: Mat img(Size(100,100),CV_8U,cv::Scalar(0));

// 変更する箇所
int x = 100;   
int y = 100;  

// 変更操作
img.ptr<uchar>(y)[x]=255;
```

[参考]http://taishoh-lab.net/blog/?p=95
テーブルに長い文字列を入力した場合(fixed)

この問題は解決しました。

------

テーブルに長い文字列入れたら記事のエリアをはみ出してる。

英数字の場合のみ？

|test|test|
|:--|:--|
|test|http://www.amazon.co.jp/gp/product/B00960YR3Q/ref=bb1_dev_ta1?ie=UTF8&nav_sdd=aps&pf_rd_m=AN1VRQENFRJN5&pf_rd_s=center-1&pf_rd_r=1GE8SEM5GQT48EAM3K0C&pf_rd_t=101&pf_rd_p=125818709&pf_rd_i=489986&dummy=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|


|test|test|
|:--|:--|
|test|アイエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエエ！？|
ニコニコ動画のsearch API仕様整理

##リクエスト形式

`http://ext.nicovideo.jp/api/search/${検索タイプ}/${検索文字列}${パラメータ}`

※ニコニコ動画にログインしてないと利用できない。

## 検索タイプ

${検索タイプ}でキーワード検索かタグ検索かを指定する。

| 値 | 意味 | サンプル |
|:--:|:--|:--|
|search|キーワード|http://ext.nicovideo.jp/api/search/search/iM@S%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=f&order=d|
|tag|タグ（完全一致）|http://ext.nicovideo.jp/api/search/tag/iM@S%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=f&order=d|

## 検索文字列
検索したい文字列を指定。

## パラメータ

### mode
詳細不明。知らなくても使える！

### page
ページ番号。1〜50。

51ページ以上は取得できない。

### sort

ソート項目を指定。

| 値 | 意味 | サンプル |
|:--:|:----|:--------|
| n | new_commentか? 最新のコメント | http://ext.nicovideo.jp/api/search/search/im@s%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=n&order=d |
| v | view_counter 再生数 | http://ext.nicovideo.jp/api/search/search/im@s%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=v&order=d |
| m | mylist_counter マイリスト | http://ext.nicovideo.jp/api/search/search/im@s%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=m&order=d |
| r | num_res コメント数 | http://ext.nicovideo.jp/api/search/search/im@s%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=r&order=d |
| f | first_retrieve 投稿日時 | http://ext.nicovideo.jp/api/search/search/im@s%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=f&order=d |
| l | length 再生時間 | http://ext.nicovideo.jp/api/search/search/im@s%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=l&order=d |

### order
昇順か降順かを指定。

|値|意味|サンプル|
|:--:|:--|:--|
|d|desc 降順|http://ext.nicovideo.jp/api/search/search/iM@S%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=f&order=d|
|a|asc 昇順|http://ext.nicovideo.jp/api/search/tag/iM@S%E6%9E%B6%E7%A9%BA%E6%88%A6%E8%A8%98?mode=watch&page=1&sort=f&order=a|

## 結果
JSON形式で返ってくる。

32件ずつ。


`結果の詳細についてはまた時間がある時にでも…`
synchronize.jsの注意点

```sync_test.js
var sync = require('synchronize');

sync.fiber(function() {
  try {
    sync.await((function(defer) {
      console.log("await 1 start");
      setTimeout(function() {
        console.log("await 1 end");
        try {
          sync.await((function(defer2) {
            console.log("await 2 start");
            setTimeout(function() {
              console.log("await 2 end");
              defer2(null, 'ok');
            }, 1000);
          })(sync.defer()));
          console.log("await 2 over");
          defer(null, "ok");
        }
        catch(e) {
          console.log("await 2 error", e);
          defer(e, null);
        }
      }, 1000);
    })(sync.defer()));
  } catch(e) {
    console.log("await 1 error", e);
  }
  console.log("await 1 over");
});
```

```
% node sync_test.js
await 1 start
await 1 end
await 2 error [Error: no current Fiber, defer can'b be used without Fiber!]
await 1 error [Error: no current Fiber, defer can'b be used without Fiber!]
await 1 over
```

await中、再帰的とは言わないまでも、ネストした処理は書けないってことか。
多分fiberの限界なんだろうなぁ。。。
Emacs で文字の大きさを一時的に変更する C-x C-0

ワークショップや勉強会などで Emacs のライブデモをプレゼンすることがよくありますが，普段使っている設定のままスクリーンに映しても文字が小さすぎて後ろの人が読めません状態になってしまいます．そんなときには `text-scale-adjust` コマンドを使って，バッファの文字を大きくしましょう．

使い方は簡単．デフォルトでは `C-x C-0` がこのコマンドにバインドされているので，このキーを押します．すると，

    +,0,- for further adjustment:

というメッセージがミニバッファに表示されるので，それを確認したら，`+` 連打で文字を大きくしていきます．ちょっと大きくし過ぎたと思ったら，`-` 連打．もとに戻したいと思ったら `0` を押します．そして，丁度よい大きさになったところで `C-g` して抜けましょう．

## まとめ

+ 文字の大きさを一時的に変更するには `text-scale-adjust`
+ デフォルトでは `C-x C-0`
  - `+` 連打→拡大
  - `-` 連打→縮小
  - `0` → 元に戻す

## 余談

フォントが悪いのか `0` と `O` の区別がつきにくいのですが，`C-x C-0` の `0` は数字のゼロです．
Angular - 概念综述


## 启动期

以下描述解释了一个简单的 Hello World! 应用的启动过程：

1. 浏览器加载 HTML 并解析成 DOM

2. 浏览器加载 `angular.js` 脚本

3. Angular 等待 `DOMContentLoaded` 事件

4. Angular 寻找 `ng-app（指令）`，这个指令界定了应用程序的作用范围（边界）

5. `ng-app` 中指定的 `Module`（如果有的话）被用来配置 `$injector（注入器）`

6. `$injector` 用于创建 `$compile（编译器）` 服务以及 `$rootScope（根作用域）`

7. `$compile` 服务用于编译 DOM 并将其连接至 `$rootScope`

8. `ng-init（指令）` 将 "World" 这个字符串赋值给当前作用域下的 `name` 属性

9. `{{ name }}（插入型表达式）` 将 `name` 属性插入 DOM，生成 "Hello World!"

![启动过程](http://docs.angularjs.org/img/guide/concepts-startup.png)

### 源代码
```html
<!DOCTYPE html>
<html ng-app>
	<head>
		<script scr="angular.js"></script>
	</head>
	<body>
		<!-- 这里只是范例，实际上通常都是在 controller 里进行赋值而不是在这里 -->
		<p ng-init="name='World'">Hello {{ name }}!</p>
	</body>
</html>
```

## 运行期

以下内容描述了 Angular 如何与浏览器的事件回圈进行交互：

1. 浏览器的 `event-loop（事件回圈）` 等待一个事件的到达；一个事件可能是一次用户交互，也可能是一个计时器，或者是网络事件（比如来自服务器的响应）

2. 事件的回调函数执行，这将进入 JavaScript 的语境（也就是 context，或称“上下文环境”）。回调函数可以修改 DOM 的结构

3. 一旦回调函数执行完毕，浏览器离开 JavaScript 语境，并根据 DOM 的变化重新渲染视图

![运行期](http://docs.angularjs.org/img/guide/concepts-runtime.png)

上图右边显示出 Angular 通过提供自己的事件处理回圈机制来改变 JavaScript 的执行流程，这种机制将 JavaScript 语境分成两部分：传统的执行语境和 Angular 的执行语境。只有应用于 Angular 执行语境的操作才能受益于 Angular 的数据绑定（data-binding），异常处理（Exception handling），属性监视（property watching），等等……也可以通过使用 `$apply()` 来进入 Angular 的执行语境。

要注意的是在绝大多数地方（控制器，服务），`$apply()` 已经通过指令（指令用来处理事件）被调用了（简言之，在 Angular 的执行语境下，没有必要显式调用它）。只有在需要执行自定义的事件回调函数，或是在处理第三方库的回调之时才需要显式调用 `$apply()`。

1. 通过调用 `scope.$apply (stimulusFn)` 进入 Angular 的执行语境。`stimulusFn` 既是你想要在 Angular 执行语境下做的一切事情。

2. Angular 执行 `stimulusFn()`，通常这会改变应用程序的状态

3. Angular 进入 `$digest loop`，这个回圈本身由两个更小的回圈组成，一个用来处理 `$evalAsync queue`，另一个用来处理 `$watch list`。`$digest loop` 不断地迭代直到模型稳固下来，技术层面上讲就是 `$evalAsync queue` 为空并且 `$watch list` 没有侦测到任何变化的时刻

4. `$evalAsync queue` 用来安排一些特定的（需要异步执行的）工作，这里特指那些需要出现在当前堆栈帧（current stack frame）以外（执行位置），并在浏览器视图渲染之前（执行时间）的工作。这种机制常常（非 Angular）是用 `setTimeout(0)` 来实现的，但是 `setTimeout(0)` 要么会变得缓慢，要么会引起视图闪烁（因为浏览器在每一个事件结束之后渲染视图）

5. `$watch list` 保存了一组自上次迭代后可能发生了改变的表达式。在侦测到某个变动之时 `$watch` 函数即被调用，并且通常会用新值来更新 DOM

6. 一旦 `$digest loop` 完成，并离开 Angular 和 JavaScript 的执行语境之后，浏览器就紧跟着去重绘 DOM 以响应任何变化

以下是另一个解释，描述了如何实现数据绑定效果（用户在文本框输入文字）：

1. 在编译期阶段：

	1. `ng-model` 和 `input` 指令为 `<input>` 设置了一个 `keydown` 事件监听器
	2. `{{ name }}` 插值表达式产生了一个 `$watch` 用以响应 `name` 的变化

2. 在运行期阶段：

	1. 按下 'x' 键会使浏览器触发设置在 `<input>` 上的 `keydown` 事件
	2. `input` 指令捕捉了这一变化然后调用了 `$apply("name='x';")` 来更新应用程序模型（在 Angular 执行语境内）
	3. Angular 将 `name = 'x';` 应用给模型
	4. `$digest loop` 开始
	5. `$watch list` 侦测到了 `name` 属性的变化并且通知 `{{ name }}` 插值表达式（令其重新解析），最终这将转变成 DOM 的更新
	6. Angular 退出自身执行语境，继而退出 `keydown` 事件和相关的 JavaScript 执行语境

### 源代码
```html
<!DOCTYPE html>
<html ng-app>
	<head>
		<script src="angualr.js"></script>
	</head>
	<body>
		<input ng-model="name">
		<p>Hello {{ name }}!</p>
	</body>
</html>
```

## 作用域
vmplayer5にCentOS6.3をインストール

基本的にはvmplayerにcentosをインストールするときは下記のURLを参照した。

[「喫茶店プログラミング」のための環境構築(VMwarePlayer + CentOS5.5+Apache2.2.3+MySQL5.5.8+PHP5.3.5+Ruby1.8.7+おまけ) - blog@sotm.jp](http://blog.sotm.jp/20110109/portable-development-environment)

が、CentOS6のインストールインターフェースも変わっていて、ちょっと迷ったので、メモ。

netinstallの時のURLは以下を指定。

**http://ftp.riken.jp/Linux/centos/6.3/os/x86_64/images/install.img**
JQuery - 画像マウスオーバーで透過する

```js:
    /**
     * 画像をマウスオーバー/アウトでopacityを変更します。
     * @param to
     * @param back
     */
    $.fn.mouseToggleImg = function(option){
        $(this).mouseover(function() {
            $(this).fadeTo("fast", option.to);
        }).mouseout(function(){
            $(this).fadeTo("fast", option.back);
        });
    };
```
  
使い方

```js:
    $('img').mouseToggleImg({'to':0.7, 'back':1.0});
```
JQuery - 画像サムネイル

```js:
    /**
     * 画像の縦横比を変えずに画像縮小をします。
     * @param max_width 横幅最大値
     * @param max_height 縦幅最大値
     */
    $.fn.thumbnailImg = function(option){
        $(this).each(function(){
            var h = $(this).height();
            var w = $(this).width();
            var hRange = option.max_height / h;
            var wRange = option.max_width / w;
            if ( hRange > wRange && w > option.max_width) {
                $(this).attr("width", option.max_width);
            } else if (h > option.max_height) {
                $(this).attr("height", option.max_height);
            } else {
                $(this).attr({"height":option.max_height, "width":option.max_width});
            }
        }).show();
    };
```
使い方

```js:  
    $('img').thumbnailImg({'max_width':100, 'max_height':100});
```
JQuery - 画面内スムーズスクロール

```js:
    /**
     * 画面内スムーズスクロールを行います。
     * @param scldurat 移動速度 大きくするとゆっくりになります。
     */
    $.fn.smoothScroller = function(option){
        $(this).click(function() {
            if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
                var target = $(this.hash);
                target = target.length && target;
                if (target.length) {
                    var sclpos = 30;
                    var targetOffset = target.offset().top - sclpos;
                    $('html,body')
                        .animate({scrollTop: targetOffset}, {duration: option.scldurat, easing: "easeOutExpo"});
                    return false;
                }
            }
        });
    };
```

使い方

```js:
    $('input[type=button]').smoothScroller({'scldurat':100});
```
Rails 4のベータ版をシンプルにインストールする

## 概要
近々正式公開されるRails 4をデフォルト状態でセットアップしてみます。

## 要件
Rails 4のインストールを始める前に、以下のものをインストールしておきましょう。これらのインストール手順については割愛します。

- rubyのビルドに必要なパッケージ
- ruby 1.9.3
- bundler
- rubygems

<del>2.0.0-rc2でこの後の作業を実行したところ、bundlerのバージョンを上げろという面倒な指示が出てきたので、現状では1.9.3の一択だと思っています。</del>基本的にはrvmで1.9.3をインストールすれば、全て条件は揃っています。

## 手順

### Gemfileの生成

アプリケーション・フォルダを作成します。この時のフォルダ名は、自動的にアプリケーション名になるので、意味のある名前をつけてください。次にbundlerを使ってGemfileのスケルトンを生成します。とは言え、gemリポジトリがrubygems.orgに指定されているだけです。

    $ mkdir myapp && cd myapp
    $ bundle init

### BundlerによるGemのインストール
Rails 4をアプリケーション・ローカルにインストールしてみます。ほとんどのgemパッケージはこれだけでインストールされますが、いくつかは後でインストールすることになります。

    $ echo 'gem "rails", github: "rails/rails"' >> Gemfile
    $ bundle install --path vendor/bundle

### Railsアプリケーションの作成
bundleからrailsコマンドが使えるようになっています。これによってアプリケーションの雛形を生成することができます。

    $ bundle exec rails new .

上記のコマンドを実行すると、RailsデフォルトのGemfileで現状のGemfileを上書きするか？と訊かれるので上書きを選択します。何も入力しないでRETURNキーを押すだけです。

しかし、生成プログラムの最後に実行されるbundle installで失敗します。これはsass-railsとcoffee-railsの対応するバージョンがrubygems.orgのリポジトリに無いためです。Gemfile中の下記Aの記述をBのように修正します。

A

    gem 'sass-rails',   '~> 4.0.0.beta'
    gem 'coffee-rails', '~> 4.0.0.beta'

B

    gem 'sass-rails',   '~> 4.0.0.beta', github: 'rails/sass-rails'
    gem 'coffee-rails', '~> 4.0.0.beta', github: 'rails/coffee-rails'


最後にもう一度gemパッケージのインストールを実行します。

	$ bundle install --path vendor/bundle

### 生成されたアプリケーションの構成
下記のような構成のWebアプリケーションの雛形が生成されます。

	$ tree -d -L 3
	.
	├── app
	│   ├── assets
	│   │   ├── images
	│   │   ├── javascripts
	│   │   └── stylesheets
	│   ├── controllers
	│   │   └── concerns
	│   ├── helpers
	│   ├── mailers
	│   ├── models
	│   │   └── concerns
	│   └── views
	│       └── layouts
	├── bin
	├── config
	│   ├── environments
	│   ├── initializers
	│   └── locales
	├── db
	├── lib
	│   ├── assets
	│   └── tasks
	├── log
	├── public
	├── test
	│   ├── controllers
	│   ├── fixtures
	│   ├── helpers
	│   ├── integration
	│   ├── mailers
	│   └── models
	├── tmp
	│   ├── cache
	│   │   └── assets
	│   ├── pids
	│   ├── sessions
	│   └── sockets
	└── vendor
	    ├── assets
	    │   ├── javascripts
	    │   └── stylesheets
	    └── bundle
	        └── ruby
    
	43 directories

### まとめると
そんなこんなで生成されたGemfileをちょこっと編集してgistにアップしてあるので、これを使えば話が早い。railsアプリケーション生成の際にGemfileを上書きしないように気をつけましょう。

    mkdir myapp && cd myapp
	curl -OL https://gist.github.com/artifactsauce/5019345/raw/9479cf4669d54df4e8982086863a36b2f7deb049/Gemfile
	bundle install --path vendor/bundle
	bundle exec rails new .
vimで日本語ヘルプをつかう


## インストール
NeoBundleを使っています

.vimrcに

```
NeoBundle 'vim-jp/vimdoc-ja'
```

`:NeoBundleInstall`を実行すれば`:h`で日本語ヘルプが見られるようになります


## helptags

[プラグインのインストール時に、自動的に:helptagsコマンドが実行されるため、 ユーザーは何もする必要がない](http://vim-users.jp/2011/10/hack238/)のですが、もし、インストールしても日本語ヘルプが出てこない場合は次のコマンドを一回だけやってみてください

```
:helptags ~/.vim/bundle/vimdoc-ja/doc
```

コマンドを忘れちゃうのでvimrcに書いておいても

```
" vimdoc-ja　普段はコメントアウト
helptags ~/.vim/bundle/vimdoc-ja/doc
```


### 参照
http://nanasi.jp/articles/howto/help/help_ja.html

## その他

ヘルプでのキーワードへのジャンプ 
`ctrl + ]`
もとの場所にもどる
`ctrl + t`
Rで緩和制約サポートベクトルマシン

PRML 7.1.1に記載の、一部のデータの誤分類を許すようなサポートベクトルマシンを構成し、いくつかのCの値毎に、推定値、および各サンプルのラグランジュ乗数aを図示します。なお、カーネル関数は用いておらず、線形カーネル相当となります。二次計画法には、kernlabパッケージのipopを用いています。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/uniXuLHXui/15.SoftMarginSupportVectorMachine.png)

```r
library(MASS)
library(kernlab)
frame()
set.seed(0)
par(mfrow=c(2, 2))
par(mar=c(3, 3, 1, 0.1))
par(mgp=c(2, 1, 0))
xrange <- c(-4, 8)
yrange <- c(-8, 4)
x1 <- seq(xrange[1], xrange[2], .1)
x2 <- seq(yrange[1], yrange[2], .1)
x <- mvrnorm(10, c(0,1), matrix(c(2, 1, 1, 2), 2))
d1 <- as.data.frame(cbind(x, 1, 1))
x <- mvrnorm(10, c(2,0), matrix(c(2, 1, 1, 2), 2))
d1 <- rbind(d1, as.data.frame(cbind(x, 2, -1)))
x <- mvrnorm(5, c(7,-7), matrix(c(.2, 0, 0, .2), 2))
d2 <- rbind(d1, as.data.frame(cbind(x, 2, -1)))
d3 <- as.data.frame(rbind(cbind(1, 1, 1, 1), cbind(0, 1, 2, -1)))
names(d1) <- c("x1","x2","class","t")
names(d2) <- c("x1","x2","class","t")
names(d3) <- c("x1","x2","class","t")

doplot <- function(d, C) {
	N <- nrow(d)
	
	# quadratic programming
	cc <- matrix(rep(-1, N))
	hmat <- cbind(d$t * d$x1, d$t * d$x2)
	hmat <- hmat %*% t(hmat)
	ll <- matrix(rep(0, N))
	uu <- matrix(rep(C, N))
	bb <- 0
	rr <- 0
	amat <- matrix(d$t, nrow=1, ncol=N)
	sv <- ipop(cc, hmat, amat, bb, ll, uu, rr)
	a <- primal(sv)
	
	# non-support vectors (a=0)
	a[a < 1.0e-5] <- 0
	# support vectors with penalty (a=C)
	a[a > C - 1.0e-5] <- C
	
	cat("a");print(a)
	
	# derive b
	bs <- c()
	for (n in 1:N) {
		if (a[n] > 0 && a[n] < C) {
			bs <- c(bs, d$t[n] - rowSums(a * d$t * (cbind(d$x1[n], d$x2[n]) %*% t(cbind(d$x1, d$x2)))))
		}
	}
	b <- mean(bs)
	
	# plot estimates
	estimate <- function(x1, x2) {
		result <- 0
		for (n in 1:N) {
			if (a[n] != 0) {
				result <- result + a[n] * d$t[n] * (cbind(x1, x2) %*% t(cbind(d$x1[n], d$x2[n])))
			}
		}
		result <- result + b
	}
	y1 <- outer(x1, x2, estimate)
	plot(d$x1, d$x2, col=d$class, type="n", xlim=xrange, ylim=yrange)
	image(x1, x2, y1, xlim=xrange, ylim=yrange, col=terrain.colors(32), add=T)
	contour(x1, x2, y1, xlim=xrange, ylim=yrange, levels=c(-1, 0, 1), add=T)
	par(new=T)
	plot(d$x1, d$x2, pch=ifelse(a == 0, 1, ifelse(a == C, 17, 16)), col=d$class, xlim=xrange, ylim=yrange, cex=1.3)
	legend("bottomleft", legend=c("a=0","0<a<C","a=C"), pch=c(1, 16, 17), cex=1.3, y.intersp=1, bg="white")
	title(paste("C=", C))
}

doplot(d2, 0.5)
doplot(d2, 1)
doplot(d2, 2)
doplot(d2, 4)
```