OmniAICreator/Qiita-1.07M huggingface dataset:
OCMockによるクラスメソッドの置換

以前、method_exchangeImplementationsによるクラスメソッドの置換の仕方を紹介しましたが、
OCMockで2.1からクラスメソッドのモッキングが出来るようになっていたので紹介します。
ユニットテストでの利用としてはこちらの方がやりやすいです。


使い方は、OCMockのインスタンスメソッドのモッキングのやり方と一緒。
この例ではNSFileManagerのdefaultManagerを置換しています。

```Objective-C

- (void)testSome {
    id fileManager = [[OCMockObject mockForClass:[NSFileManager class]];

    [[[fileManager stub] andReturn:fileManager] defaultManager];


   // お試し
    [[fileManager expect] createFileAtPath:nil contents:nil attributes:nil];
   
    [[NSFileManager defaultManager] createFileAtPath:nil contents:nil attributes:nil];
 
    [fileManager verify];
 }

```

置換をしたいクラスメソッドと同名のインスタンスメソッドが定義されている場合は、クラスメソッドを置換しようとしている事を伝える必要があります。

```Objective-C

- (void)testSome {
    id fileManager = [[OCMockObject mockForClass:[NSFileManager class]];
    [[[[fileManager stub] classMethod] andReturn:fileManager] defaultManager];
}

```

停止の仕方は以下

```Objective-C

- (void)testSome {
    ...
    [fileManager stopMocking];
}

```

method_swizzlingしなくても良くなったので楽になりました。
CentOSのバージョンと?bitマシンかを調べる。


```bash:CUI

# バージョンを調べるよ。
cat /etc/redhat-release
# 出力＝＞ CentOS release 6.4 (Final)

# bit数を調べるよ
uname -a
# 出力＝＞ Linux サーバ名 2.6.32-358.18.1.el6.x86_64 #1 SMP Wed Aug 28 17:19:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

```


// ----------------- 参考URL
・ ディストリビューションのバージョンを調べる方法を教えてください。
http://oshiete.goo.ne.jp/qa/2393841.html

・ インストールされているCentOSが32bitか64bitかを確認
http://blog.flatlabs.net/20110509_221214/

// ----------------- 思ったこと
そういえばMacを使っててあまりbitを気にすることはなくなったような気がする。
前使っていたPCがWinXPなのも理由の一つかもしれないけれど。
railsのmailcatcherをvirtual boxで使う

### インストール
```
gem install mailcatcher
```


### 起動
```
mailcatcher --http-ip=0.0.0.0
```

### railsの設定
```rb:development.rb
  config.action_mailer.smtp_settings = {
    :address    => localhost,
    :port       => 1025
  }
```

http://${virtualboxのIP}:1080
にアクセスして画面が開けば成功。


### 注意点
- rails下のbundlerでインストールすると古いバージョンがインストールされてしまった。
- --http-ip=0.0.0.0を付けないと[http://${virtualboxのIP}:1080]にアクセス出来ない
Windows 64bitのPATH設定

バッチを記述しているときにつまづいたのでメモ書き。

``` DOS
:: 該当するフォルダが存在する場合、そのフォルダをパスに追加する
FOR /D %i IN ("C:\TEST\TES*") DO (SET PATH=%%;%PATH%)
>\Microsoft の使い方が間違っています。
```
エラーが発生します。
これは、64bitのパスでは(86x)の記述があるため、SETコマンドを囲む「()」が不適切に評価されているからです。

``` DOS
:: 修正版
FOR /D %i IN ("C:\TEST\TES*") DO SET PATH=%%;%PATH%
```
***
また、PATH内にダブルクォーテーション(")が存在すると、おかしくなるそう。
DOS実行時に一時的に消すのも手かな、と。

``` DOS
:: PATHから"を消す。
PATH %PATH:"=%
```

>参考：
>[4.基本文法 (2)if文の注意事項 〜\Microsoft の使い方が誤っています。〜 【コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ】](http://orangeclover.hatenablog.com/entry/20090903/1251988909)
Unite.vimのkey-mappingを変更する

unite実行中のkey-mappingは`<Plug>(hogehoge)`と定義されているので

```vim
autocmd FileType unite call s:unite_my_keymappings()
function! s:unite_my_keymappings()
    " fを押下でカーソル下の候補を選択状態にする
    nmap <buffer> f <Plug>(unite_toggle_mark_current_candidate)
endfunction
```

こんなかんじで出来る
1からNまでのランダムな数字を取得する


タイトルの通り、実行する度に得られる数字が異なるようにしたかった。

軽く調べてみた感じ [rand](http://docs.ruby-lang.org/ja/2.0.0/class/Random.html) を使ってるサンプルが多かった。

1から10までの数字をランダムに返す。

```ruby:sample_rand.rb
rand(10) + 1
```

このやり方よりも自分的には [sample](http://docs.ruby-lang.org/ja/1.9.2/class/Array.html) を使ったやり方の方が好きかなと。

```ruby:sample_sample.rb
[*1..10].sample
```

ただし、1からNまでのサイズの配列を作るので大きな桁の
ランダムな値を取得するにはあまり適してないかも。
画像に連番をつける


extsにnumfig.pyをいれる。

```
.. _figname:
.. figure:: filename.png
   Title of this figure.
```
と書くと、``:num:`figname` ``で番号を参照できる。
なお、`_`は使えない。
これは、内部で`-`に置き換わっている。
使わないのが無難。
タイトルを付けないと、figureにcaptionがつかないので注意。

http://sphinx-users.jp/reverse-dict/images/numbering.html
WindowsAzureWebサイトでPHP設定を変えるには.user.iniをつくる


Apacheの.htaccessで変更するPHP_INI_PERDIR以下の設定変更をWindowsAzure Webサイトで行うには ".user.ini"ファイルを作って配置します。

記述方法は .htaccess 式でなく、php.iniと同様の書き方になります。

```.user.ini
mbstring.language=Japanese
```
こんな感じ。（.htaccessだとイコールでつながずスペース区切り）

.usre.iniの読み込みはデフォルトだと5分ごとらしいんで、手っ取り早く反映するにはWebサイト再起動させるのがいいそうです。
ディストリビューション＆カーネルバージョン表示

##ディストリビューション名表示
```
# cat /etc/`ls /etc -F | grep "release$\|version$"`
CentOS release 5.6 (Final)
```

##カーネルバージョン表示
```
# uname -a
Linux xxxxxxx.xxxxx.ne.jp 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
```
SilexとDBALを組み合わせたときに実行SQLをロギングする

PHPの開発でフレームワークとして[Silex](http://silex.sensiolabs.org/)を使っている場合、
複雑なORMを使わずにSilexとセットで使いやすい[DBAL](http://www.doctrine-project.org/projects/dbal.html)を使うことが多いかもしれない。

その場合、次のようにDoctrineServiceProviderを使ってデータベース接続設定をし、
$app['db.config']でSQLLoggerを設定すると実行されたSQLのデータが蓄積されるようになる。

```php
$app->register(new Silex\Provider\DoctrineServiceProvider(), [
    'db.options' => [
        'driver'   => 'pdo_mysql',
        'dbname'   => 'db name',
        'host'     => 'your host',
        'user'     => 'user name',
        'password' => 'password',
        'charset'  => 'utf8mb4',
    ],
]);
$sqlLogger = new Doctrine\DBAL\Logging\DebugStack();
$app['db.config']->setSQLLogger($sqlLogger);
```

処理の実行後のタイミングでSQLLoggerに蓄積された実行SQLのデータを、
MonologServiceProviderなどを利用してMonologを使っている場合はMonologで、
それ以外の場合は適当に次のようにログ出力すればよい。

```php
$app->after(function() use ($app, $sqlLogger) {
    foreach ($sqlLogger->queries as $query) {
        $app['monolog']->debug($query['sql'], [
            'params' => $query['params'],
            'types' => $query['types'],
            'execution_ms' => $query['executionMS'],
        ]);
    }
});
```

それ以外にもエラー（例外）が起こったときも、
次のようにすれば最後に実行されたSQLのロギングが可能。

```php
$app->error(function(\Exception $e, $code) use ($app, $sqlLogger) {
    if ($e instanceof PDOException && count($sqlLogger->queries) > 0) {
        $executedQueries = $sqlLogger->queries;
        $lastExecutedQuery = array_pop($executedQueries);
        $app['monolog']->err($lastExecutedQuery['sql'], [
            'params' => $lastExecutedQuery['params'],
            'types' => $lastExecutedQuery['types'],
        ]);
    }
});
```

直接PDOを使うよりDBALを使う方がいろいろ仕組みが整っているので便利ですよ。
SkypeのチャットをリアルタイムにChatworkに転送するRubyスクリプト(更新:API利用版)



![Screen Shot 2013-11-20 at 12.23.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/10272/474c4435-35b5-60ee-18ef-dd11e2bbce3c.png "Screen Shot 2013-11-20 at 12.23.19 AM.png")


### 最終更新日
- 2013-12-10


# 1行概要
Skypeの会話内容を準リアルタイム（遅延10秒）でChatworkの「マイチャット」に片方向転送するRubyのデーモンスクリプト。
ChatworkAPIを利用するように変更。

# 犯行動機
会社でskypeからchatworkへの移行をすすめるにあたって、その途中の「両方使ってる」微妙な段階の苦しみを取りぞぞくために。

# 覚書
- 12/10時点でmac限定

# コード

```ruby:sk2ch.rb

require 'fileutils'
require 'sequel'
require 'faraday'


# Skypeのアカウント
SKYPE_NAME = 'skype.id'

# ChatworkのAPIトークン
CHATWORK_API_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# Chatworkに投稿するグループID(マイチャットなど)
CHATWORK_ROOM_ID = '12345678' # charwork my chat


module LastId

  DATA_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'last_id.txt')

  # 前回のSkypeのMessageIDを取得、なければSkypeDBから最新のものを取得
  def self.get
    if File.exist?(DATA_PATH)
      open(DATA_PATH).read
    else
      Skype::copy_db!
      Skype::get_last_id
    end
  end

  # ファイルにSkypeのMessageIDを保存
  def self.set(last_id)
    puts "last_id: #{last_id}"
    open(DATA_PATH, 'w') { |f| f.write last_id.to_s }
  end

end

module Skype

  TMP_DB_PATH = '/tmp/skype-main.db'

  # SkypeのDBをコピー
  def self.copy_db!
    FileUtils.copy("#{ENV["HOME"]}/Library/Application Support/Skype/#{SKYPE_NAME}/main.db", TMP_DB_PATH)
  rescue => err
    p err
    retry
  end

  # Skypeの最後のMessageIDを取得
  def self.get_last_id
    connection = Sequel.connect("sqlite://#{TMP_DB_PATH}")
    dataset = connection.fetch("SELECT id FROM Messages ORDER BY id DESC LIMIT 1")
    dataset.first[:id]
  end

  # Skypeの最近の更新の差分を取得
  def self.get_message

    last_message_id = LastId::get

    connection = Sequel.connect("sqlite://#{TMP_DB_PATH}")

    dataset = connection.fetch("SELECT Messages.id, Messages.from_dispname, Conversations.displayname, Messages.body_xml FROM Messages LEFT JOIN Conversations ON Messages.convo_id = Conversations.id WHERE Messages.id > ?", last_message_id)
    new_last_message_id = last_message_id
    dataset.each do |r|
      puts "[#{r[:from_dispname]}] #{r[:displayname]}\n\t#{r[:body_xml]}"
      yield r
      new_last_message_id = r[:id]
    end

    LastId::set(new_last_message_id)
  end

end

module Chatwork

  # ChatworkにPOST
  def self.post(text)

    conn = Faraday::Connection.new(url: 'https://api.chatwork.com') do |builder|
      builder.use Faraday::Request::UrlEncoded
      builder.use Faraday::Adapter::NetHttp
    end

    response = conn.post do |request|
      request.url "/v1/rooms/#{CHATWORK_ROOM_ID}/messages"
      request.headers = {
        'X-ChatWorkToken' => CHATWORK_API_TOKEN
      }
      request.params[:body] = text
    end

  end
end


loop {
  Skype::copy_db!
  Skype::get_message do |message|
    Chatwork::post("#{message[:displayname]} (#{message[:from_dispname]})\n#{message[:body_xml]}")

    sleep(1)
  end
  sleep(1)
}

```

## 細かい内容
- SkypeのDB（sqlite）は排他制御で読み取りすら出来ないので、強引にコピーしSQLを実行して最新の情報を取得

## 参考
[30秒でChatwork APIを使ってマイチャットに投稿する方法](http://qiita.com/tady/items/ac6de448e228a2f631db)
状態遷移テスト

状態遷移テストとは、状態遷移図・状態遷移表をもとにしたテスト。状態遷移図はオートマトンと同じようにプログラムの状態と操作による状態の遷移で表す。状態遷移表は前図を表に直したものでストップウォッチを例にすると以下のようになる。

| 遷移前   | START | STOP | RESET|
|:----------:|:--------:|:---------:|:--------:|
|待機中    |計測中 |      -      |      -     |
|計測中    |    -      |一時停止|     -     |
|一時停止|計測中 |       -      |待機中|

最左列が遷移前の状態を表しており、表中が遷移後の状態を表している。このような表を作ることにより、プログラムがどのように状態遷移するか、そして、しないかを表現できる(「-」で表している)。

この表を元に正しく遷移するか(正常系)、しないか(異常系)のテストを網羅的にすることができる。
決定性オートマトン写経


```正規表現
	\s*([0-9][0-9]*|[A-Za-z][A-Za-z0-9]*|=|==)
```

0個以上の空白に続き、整数リテラル、または、英字、または英字と数字、または「=」か、「==」と一致する

```Lexer.java
package chapA;

import stone.CodeDialog;

import java.io.IOException;
import java.io.Reader;

public class Lexer {
    private Reader reader;

    private static final int EMPTY = -1;
    private int lastChar = EMPTY;

    public Lexer(Reader r) { reader = r; }

    private int getChar() throws IOException {
        if (lastChar == EMPTY)
            return reader.read();
        else {
            int c = lastChar;
            lastChar = EMPTY;
            return c;
        }
    }

    private void ungetChar(int c) { lastChar = c; }
    public String read() throws IOException {
        StringBuilder sb = new StringBuilder();
        int c;

        do {
            c = getChar();
        } while (isSpace(c));

        if (c < 0)
            return null;
        else if (isDigit(c)) {
            do {
                sb.append((char)c);
                c = getChar();
            } while (isDigit(c));
        }
        else if (isLetter(c)) {
            do {
                sb.append((char)c);
                c = getChar();
            } while (isLetter(c) || isDigit(c));
        }
        else if (c == '=') {
            c = getChar();
            if (c == '=')
                return "==";
            else {
                ungetChar(c);
                return "=";
            }
        }
        else
            throw new IOException();

        if (c >= 0)
            ungetChar(c);

        return sb.toString();
    }

    private static boolean isLetter(int c) {
        return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z';
    }

    private static boolean isDigit(int c) { return '0' <= c && c <= '9'; }
    private static boolean isSpace(int c) { return 0 <= c && c <= ' '; }

    public static void main(String[] args) throws Exception {
        Lexer l = new Lexer(new CodeDialog());
        for (String s; (s = l.read()) != null; )
            System.out.println("-> " + s);
    }
}

```
cucumberとかrspecとか使わずWebrat単体でWebページを巡る

Webratをrequireし、Webrat::Methodsをincludeすることで、いつものように快適にウェッブサーフィンを行うことができます。

```rb
require 'pry'
require 'webrat'
require 'mechanize'

module StageSurfer
  class Core

    Webrat.configure do |config|
      config.mode = :mechanize
    end

    include Webrat::Methods

    def initialize login_page_url, user_id, password
      visit  login_page_url
      #下記はログインページの作りによって変える必要がある！
      fill_in "id", :with => user_id
      fill_in "password", :with => password
      click_button "submit"
    end

    def surf target_urls
      target_urls.each {|url| yield(url, visit(url))}
    end

  end
end

urls = STDIN.each_line.map {|line| line.chomp }
proc = eval("lambda {|url, page| #{ARGV[3]}}")
StageSurfer::Core.new(ARGV[0], ARGV[1], ARGV[2]).surf(urls, &proc)
```

上記のクラスを使って、http://your_site/contents_pageにContent-typeという文言が存在する場合は"o"を、なければ"x"を出すという場合は、下記のように呼び出します。

```shell-session
echo http://your_site/contents_page | ruby stage_surf.rb http://your_site/login_page id password 'puts "#{url}\t#{/Content-type/ =~ page.content ? :o : :x}"'
```
AngularJSの非同期処理をRxJSにつなげてみる

AngularJSでは非同期処理のAPIとしてPromise API（$q Service）が用意されています。

このPromise APIですがAngularJS v1.2でPromise/A+に準拠した形になりました。
Promise/A+の詳細については下記を参照してください。

- [Promise/A+](https://gist.github.com/OrgaChem/5903697)

AngularJSのPromise APIは非同期処理としては最小限の機能しか用意されておらず、複雑な非同期処理を書く場合は何かしらのライブラリが利用したくなります。

非同期処理のライブラリとしてはJSDeferredやjQuery.Deferredなどが有名ですが、今回はRxJSを使ってみます。

- [Reactive Extensions for JavaScript (RxJS)](http://reactive-extensions.github.io/RxJS/)

RxJSもv2.2でPromise/A+に準拠したObservable.fromPromiseが追加されたので、AngularJSのPromiseとRxJSを連携させて使うことが簡単にできるようになりました。

というわけで、AngularJSで用意されている$resource (Web APIを呼び出すためのサービス) を例にして、RxJSと連携させる方法を紹介したいと思います。
それぞれの基本的な使い方は省略するので、各種ドキュメントを参考にしてください。

## 単純な処理の比較

まずAngularJSのPromiseを使った場合と、RxJSを使った場合の単純な処理の書き方を比較してみます。

リクエストを投げて成功した場合と失敗した場合のコールバックをセットするには以下のように書きます。
これだと、Promiseを使ったほうが簡単ですね。

~~~js:Promise
var res = $resource("/hoge");
res.get().$promise
  .then(
    function(data){ alert("success: " + data); }, 
    function(err){ alert("failure: " + err); }
  );
~~~

~~~js:RxJS
var res = $resource("/hoge");
Rx.Observable.fromPromise(res.get().$promise)
  .subscribe(
    function(data){ alert("success: " + data); }, 
    function(err){ alert("failure: " + err); }
  );
~~~


1つ目のリクエストが完了したら、その結果を使って次のリクエストを呼び出す場合は以下のように。
これも、Promiseのほうがthenをつなげて書くだけなので分かりやすいですね・・・

~~~js:Promise
var res1 = $resource("/hoge");
var res2 = $resource("/fuga/:id");
res1.get().$promise
  .then(function(data){
    return res2.get({id: data.id}).$promise;
  })
  .then(
    function(data){ alert("success: " + data); }, 
    function(err){ alert("failure: " + err); }
  );
~~~

~~~js:RxJS
var res1 = $resource("/hoge");
var res2 = $resource("/fuga/:id");
Rx.Observable.fromPromise(res1.get().$promise)
  .selectMany(function(data){
    return Rx.Observable.fromPromise(res2.get({id: data.id}).$promise);
  })
  .subscribe(
    function(data){ alert("success: " + data); }, 
    function(err){ alert("failure: " + err); }
  );
~~~

## RxJSの便利なメソッド
ここからは、Promiseだけで実装しようとすると複雑になるような処理を、RxJSで書いてみたいと思います。

まず、リクエストに成功するまで最大3回リトライする処理はこんな感じで書けます。

~~~js:リトライ(RxJS)
var res = $resource("/hoge")
Rx.Observable.defer(function(){
    return Rx.Observable.fromPromise(res.get().$promise);
  })
  .retry(3)
  .subscribe(
    function(data){ alert("success: " + data); }, 
    function(err){ alert("failure: " + err); }
  );
~~~


複数のリクエストを投げて、その結果が揃うまで待ってから次の処理をするというのも簡単に書けます。

~~~js:待ち合わせ(RxJS)
var res1 = $resource("/hoge");
var res2 = $resource("/fuga");
Rx.Observable.fromPromise(res1.get().$promise)
  .zip(Rx.Observable.fromPromise(res2.get().$promise), 
    function(data1, data2){ return [data1, data2]; }
  )
  .subscribe(
    function(data){ alert("success: " + data[0] + ":" + data[1]); }, 
    function(err){ alert("failure: " + err); }
  );
~~~

今回は簡単な例ばかりを示しましたが、RxJSには非常に便利なAPIがたくさん用意されているのでぜひ使ってみてください。
Listのスクロールイベント取得と最後までスクロールしたかの判定

List自体からスクロールの変化を取得することができなかったので
ViewPortの縦スクロールの値変化をチェックして判定するよう実装してみた。
e.propertyをhorizontal～にすれば横スクロールの判定もできそう。

```flx
<fx:Script>
<![CDATA[
    protected function creationComplete(e:FlexEvent):void{
        list.scroller.viewport.addEventListener( PropertyChangeEvent.PROPERTY_CHANGE, listPropertyChangeHandler);
    }

    protected function listPropertyChangeHandler(e:PropertyChangeEvent):void{
        // スクロール位置に変更があった
        if(e.property == "verticalScrollPosition"){
            var viewport:IViewPort = list.scroller.viewport;
            if(viewport.verticalScrollPosition == viewposrt.contentHeight + list.scroller.height){
                // 最後までスクロールした
            }
        }
    }
]]>

<s:List id="list"/>
```
Java バイトコードにおけるメソッドの長さを調べる


# 計算方法

## ソースコードから計算

`javap` コマンドを実行すると、クラスファイルが逆アセンブルされ、 Java バイトコードが人間の読みやすい形式で出力される。

    javac Employee.java
    javap -c Employee.class


この出力結果であるバイトコードを見れば、各メソッドの長さを計算できる。

ちなみに、 Java バイトコードのオペーコードは 1 byte である。
複数の引数を必要とする命令もあるため、結果として1命令は複数 byte になりえる。

## Jar ファイルから計算

jar ファイルを解凍し、クラスファイルを取り出す。
そのクラスファイルを引数として指定し、 javap コマンドを実行すれば良い。

    jar xvf sample-1.0-SNAPSHOT.jar
    javap -c com/hidetai/Employee.class

# 例

```Java:Employee.java
package com.hidetai;

public class Employee
{
    private int id;

    void setId(int id) {
        this.id = id;
    }

    int getId() {
        return id;
    }
}
```

上記のコードをコンパイルし、クラスファイルを生成する。
そして、そのクラスファイルを引数として javap コマンドを実行する。

    javap -c Employee.class

すると、以下のようなバイトコードが出力される。

```Java:Employee.bc
Compiled from "Employee.java"
public class com.hidetai.Employee {
  public com.hidetai.Employee();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  void setId(int);
    Code:
       0: aload_0
       1: iload_1
       2: putfield      #2                  // Field id:I
       5: return

  int getId();
    Code:
       0: aload_0
       1: getfield      #2                  // Field id:I
       4: ireturn
}
```

この出力を見れば、例えば setId(int) メソッドは 6 byte の長さであることが分かる。


# javap

クラスファイルを逆アセンブルするコマンド。

以下のページに仕様が書いてある。

 * [javap (English version)](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html)
 * [javap (日本語版)](http://docs.oracle.com/javase/jp/7/technotes/tools/windows/javap.html)

# 参考

 * [jvm - How many bytes of bytecode has a particular method in Java? - Stack Overflow](http://stackoverflow.com/questions/11345034/how-many-bytes-of-bytecode-has-a-particular-method-in-java)
   * バイトコードの出力方法について書いてある。

 * [Javaバイトコード - Wikipedia](http://ja.wikipedia.org/wiki/Java%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89)
   * バイトコードの説明が分かりやすい。
elasticsearchのパフォーマンスをnewrelicでモニタリングする(centos)


### 事前作業
```
yum install python-setuptools
yum install python-devel
yum --enablerepo=epel install libyaml-devel
easy_install pip
```

### newrelic_plugin_agent をインストール
```
pip install newrelic_plugin_agent
```

### 必要なファイルやディレクトリの配置	
```
mkdir -p /var/log/newrelic/
mkdir -p /var/run/newrelic/
mkdir -p /etc/newrelic/
cp -p /opt/newrelic_plugin_agent/newrelic_plugin_agent.rhel /etc/init.d/newrelic_plugin_agent
chmod +x /etc/init.d/newrelic_plugin_agent
cp -p /opt/newrelic_plugin_agent/newrelic_plugin_agent.cfg /etc/newrelic/
```


### 設定
```yaml:/etc/newrelic/newrelic_plugin_agent.cfg
Application:
  license_key: ${newrelic_key}
  wake_interval: 60
  #proxy: http://localhost:8080


  elasticsearch:
    name: ${cluster_name}
    host: localhost
    port: 9200
    scheme: http

Daemon:
  user: root
  pidfile: /var/run/newrelic/newrelic_plugin_agent.pid

Logging:
  formatters:
    verbose:
      format: '%(levelname) -10s %(asctime)s %(process)-6d %(processName) -15s %(threadName)-10s %(name) -45s %(funcName) -25s L%(lineno)-6d: %(message)s'
  handlers:
    file:
      class : logging.handlers.RotatingFileHandler
      formatter: verbose
      filename: /var/log/newrelic/newrelic_plugin_agent.log
      maxBytes: 10485760
      backupCount: 3
  loggers:
    newrelic_plugin_agent:
      level: INFO
      propagate: True
      handlers: [console, file]
    requests:
      level: ERROR
      propagate: True
      handlers: [console, file]

```

### マシン起動時に起動するようにする
```
chkconfig --add newrelic_plugin_agent
```

### 起動
```
/etc/init.d/newrelic_plugin_agent start
```

### 動作確認
```
tail -f /var/log/newrelic/newrelic_plugin_agent.log
```
DynamoDB v2のbatchWriteItemsとbatchGetItemsを利用する

DynamoDBクライアントのbatchWriteItemsとbatchGetItemsを利用する
日本語のサンプルページが少ないのでエントリ作成。本稿は2013-11-19時点でのものです。
AWS SDK for Javaのバージョンは1.7です。

modelパッケージのDeleteRequestとPutRequest、WriteRequestを利用するのですが、インターフェースになっていないのでそれぞれ処理が別になるので面倒です。

## 保存と削除

保存と削除はDynamoDBClient#batchWriteItemメソッドを利用します。
WriteRequestクラスでPutRequestをラップするかDeleteRequestをラップするかの違いだけで処理の流れはほぼ同じです。PutRequestとDeleteRequestが共通インターフェースだったらまとめて記述しやすいのにと考えてしまいますが今後に期待します。

### 保存

```java:一括保存
// 一括保存する情報をテーブル名 => 条件リストに格納
Map<String,List<WriteRequest>> itemMap = new HashMap<String,List<WriteRequest>>();
// 保存リクエスト作成
PutRequest putReq = new PutRequest();
delReq.addItemEntry(fieldName, new AttributeValue().withS(value));
// 書き込みリクエストでラッピング
WriteRequest writeReq = new WriteRequest(putReq);
// 一括処理のマップに追加
itemMap.put(tableName, writeReq);
// バッチ書き込みリクエストに格納
BatchWriteItemRequest request = new BatchWriteItemRequest();
request.setRequestItems(itemMap);
// 一括処理実行
dynamoClient.batchWriteItem(request);
```

### 削除

```java:一括削除
// 一括削除する情報をテーブル名 => 削除条件リストに格納
Map<String,List<WriteRequest>> itemMap = new HashMap<String,List<WriteRequest>>();
// 削除リクエスト作成
DeleteRequest delReq = new DeleteRequest();
delReq.addKeyEntry(keyName, new AttributeValue().withS(value));
// 書き込みリクエストでラッピング
WriteRequest writeReq = new WriteRequest(delReq);
// 一括処理のマップに追加
itemMap.put(tableName, writeReq);
// バッチ書き込みリクエストに格納
BatchWriteItemRequest request = new BatchWriteItemRequest();
request.setRequestItems(itemMap);
// 一括処理実行
dynamoClient.batchWriteItem(request);
```

DeleteRequest, PutRequestを作成する部分以外は共通なのでその作成部分を共通化して抜き出せばきれいな流れで削除と保存をおりまぜて一括処理できるのでリクエスト回数を減らすのに役立ちます。

## 読み込み

複数のキーを指定して一括でGetしてみます。

```java:一括取得
BatchGetItemRequest request = new BatchGetItemRequest();
// 複数条件のリスト
List<Map<String,AttributeValue>> conditions = new ArrayList<Map<String,AttributeValue>>();
// 取得条件（ハッシュキーと必要に応じてレンジキーを指定） .. ここから必要に応じて複数回処理
Map<String,AttributeValue> cond = new HashMap<String,AttributeValue>();
cond.put(fieldName, new AttributeValue().withS(fieldValue);
conditions.add(cond);
// 条件をラッピング
KeysAndAttributes keys = new KeysAndAttributes().withKeys(conditions);
request.addRequestItemEntry(tableName, keys);
BatchGetItemResult result = this.client.batchGetItem(request);
Map<String,List<Map<String,AttributeValue>>> resulstMap = result.getResponses();
```

一括取得も含めて処理が煩雑になってしまいがちな作りかもしれません。
上記コードを含みIOをJSONに統一した簡単なWrapperをgithubにあげましたのでよろしければご参考までに。

https://github.com/mychaelstyle/mydatastore/blob/development/src/main/java/com/mychaelstyle/mydatastore/providers/AWSDynamoDB.java
Karma の "ERROR [launcher]: Cannot start Chrome"

Chrome を使ったテストの開始で次のようなエラーが出る場合。

```
ERROR [launcher]: Cannot start Chrome
        Can not find the binary C:\Users\ore\AppData\Local\Google\Chrome\Application\chrome.exe
        Please set env variable CHROME_BIN
```

Chrome が管理者権限でインストールされているためかも知れません。

下記辺りに chrome.exe があるなら、そのパスを環境変数 CHROME_BIN に設定すれば解決します。

 - C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

もしくは Chrome をアンインストールして管理者権限を使わずに再インストールすれば OK です（UAC で「いいえ」をクリック）。
PHPでprivate,protectedなstatc変数を外部からアクセス可能にしてセットし直す方法

参考：https://bugs.php.net/bug.php?id=54620

```php:ExampleControllerTest.php
public function tearDown() {
    parent::tearDown();
    $_user = (new ReflectionClass('AuthComponent'))->getProperty('_user');
    $_user->setAccessible(1);
    $_user->setValue(array());
}
```

```php:AuthComponent.php
	protected static $_user = array();
```

# 経緯

CakePHPでAuthComponentを利用するControllerのテストを書いていて認証のキャッシュにstatic変数を使っていたので、tearDownのときにセットしなおそうとしたらprotectedだったのでこのようにしました。
Underscore で 2つの配列の内容が同一化どうかをしらべる

# 目的
Underscore.js を使って、２つの配列が順番に限らず同一かを比較したい。

たとえば、

```js
x = [1, 2, 5, 3]
y = [1, 3, 2, 5]
comp(x,y) = true
```


```js
x = [1, 2, 5, 3]
y = [1, 3, 2, 4]
comp(x, y) = false
```

```js
x = [1, 2, 5, 3]
y = [1, 3, 2]
comp(x, y) = false
```

# こうやる

```js
function comp(x, y){
    return _.all(_.map(_.zip(x.sort(), y.sort()), function(pair){return pair[0] === pair[1];}));
}
```
elasticsearchの便利なプラグイン集

## インストール
```shell-session
sudo su - root

cd /usr/share/elasticsearch/
bin/plugin -install elasticsearch/elasticsearch-cloud-aws
bin/plugin -install mobz/elasticsearch-head
bin/plugin -install lukas-vlcek/bigdesk
bin/plugin -install royrusso/elasticsearch-HQ

yum install python-setuptools
easy_install esclient
easy_install argparse
```

## elasticsearch-head
```shell-session
open http://localhost:9200/_plugin/head/
```

## elasticsearch-bigdesk
```shell-session
open http://localhost:9200/_plugin/bigdesk/
```

## elasticsearch-HQ
```shell-session
open http://localhost:9200/_plugin/HQ/#cluster
```

## esclient
- [ここ参照](http://qiita.com/toyama0919/items/ccd5eb9169967db54a76)
リストを表データとして

```sql
select 1 from dual
union all
select 2 from dual;
```

 とかやっている方へ。
リスト上のデータを、行データとしてアクセスする表関数があります。
商用で使うかは微妙ですが…

```sql
select *
  from table(sql_objects(1,2,3,4,5));
```
```
COLUMN_VALUE
------------
           1
           2
           3
           4
           5
```
[Groovy] 実行時にバージョンを取得する

Groovy2.2リリース記念！

Groovyのバージョンを上げたのは良いけど既存プログラムを実行するときに本当に新しいバージョンが使われてるの？ということで実行時にGroovyのバージョンを取得する方法です。

```groovy
String version = GroovySystem.version
assert "2.2.0" == version
```
HiveでLTSVを利用する


SerDeを用意してもいいんですが、Hiveの機能でmapのdelimiterを指定できるので、それを使うとLTSVな行をmap\<string, string\>として読むことができます。

```
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\n'
    COLLECTION ITEMS TERMINATED BY '\t'
    MAP KEYS TERMINATED BY ':'
```

例えばこんな感じのテーブルを作って

```sql
CREATE EXTERNAL TABLE some_ltsv_table (
    record  map<string, string>
)
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\n'
    COLLECTION ITEMS TERMINATED BY '\t'
    MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE
LOCATION '/path/to/ltsv/dir'
;
```

/path/to/ltsv/dirにこんなltsvのファイルを入れておくと

```
a:1	b:2
a:3	b:4	c:5
```

Hiveからこんな感じに読むことができます

```
SELECT
    record
FROM
    some_ltsv_table

--
{"a":"1", "b":"2"}
{"a":"3", "b":"4", "c":"5"}
```

```
SELECT
    record['a']
FROM
    some_ltsv_table

--
1
3
```

こんな感じ。大変捗りますね。
MacVimからMarkedでMarkdownプレビューを開く

```vim:.vimrc
:command! Marked :!open -a Marked "%"
```

あとは`:Marked`と入力すると、表示中のMarkdownファイルがMarkedで開かれる。

簡単な説明:

* MarkedはMac用のMarkdownファイルをプレビューするアプリ。 $3.99
    * →[Marked - smart tools for smart writers](http://markedapp.com/)
* `command!`でコマンド登録
* `:!…`でMacのコマンドを実行
* `open -a`で任意のアプリを（使ってファイルを）開く
    * →[MacWiki - コマンド/open](http://macwiki.sourceforge.jp/wiki/index.php/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/open#-a_application)
* `%`で表示中のファイル名を取得、空白を含むものに対応するため引用符で括る

これで良いのかな？　実践Vimを読んだら知らない事だらけってくらいのVim使いなので、なんかアレなら教えてください。
バックグラウンドで、iBeaconsのイベントを受けて通信したりする

iBeacons関連。
ビーコンの領域を横断した時に発生したイベントで呼ばれるメソッド「- locationManager:didRangeBeacons:inRegion:」にリクエストを送るコードを書く

```objc
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
	// サーバにリクエスト送る
	NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
	NSURLRequest  *request = [[NSURLRequest alloc] initWithURL:url];
	NSURLConnection *aConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
	
	// 送信エラーチェック
	if (!aConnection) {
		NSLog(@"connection error.");
	}
}
```

-connectionDidFinishLoading:などは省略してます。

これだけではアプリを起動している時しか通信してくれないので、info.plistに追記をします。
![スクリーンショット 2013-11-19 17.05.35.png](https://qiita-image-store.s3.amazonaws.com/0/6688/f831bbcb-9557-e170-f4d2-c72d7548231f.png)
Required background modesにApp registers for location updatesを。

これでバックグラウンドでもビーコンのイベントで通信してくれます。
MySQLのデータを定期実行でバックアップ


サービス運用してるとバックアップ取ると思うのですが、毎回調べるので自分のブログにメモ。

backup_db.shとかで。
このシェルスクリプトをcronで定期実行するイメージです。

```shell
#!/bin/bash

TODAY=`date +%Y%m%d`
BACKUP_DIR=/data/backup/db
BACKUP_INTERVAL='+3'

for database in `mysql -uroot -N -s -e"show databases"`; do
    if [ $database == 'DB名' ]; then
        nice mysqldump -uroot --single-transaction --no-autocommit ${database} | pbzip2 -cv -p4 > ${BACKUP_DIR}/${database}-${TODAY}.sql.bz2
    fi
done

find ${BACKUP_DIR} -type f -name "*.bz2" -mtime ${BACKUP_INTERVAL} | xargs rm -Rf
```

* mysqldumpのオプション
http://open-groove.net/mysql/autocommit/
http://blog.lampetty.net/blog_ja/index.php/archives/292  

* findコマンドのmtimeオプション
http://doruby.kbmj.com/SK/20090731/find_mtime_

* findしたやつをxargsコマンドで削除
http://openlab.dino.co.jp/2008/02/20/133431188.html

* pbzip2
http://blog.cloudpack.jp/2011/08/aws-news-c1xlarge-pbzip2.html  
  
- - -   
　

ちなみにcronはこんな感じ

```crontab
0  4 * * * root sh /path/to/backup_db.sh   > /dev/null 2>&1
```
僕がiOSアプリを作るときにやってるUILabel管理

僕がやってるUILabel管理を晒します。もっとこうした方がいいよ等ございましたら、コメントしてください。
フォントと文字の色を毎回指定するのが面倒だったからこうしました。

##ファイル作成
![スクリーンショット 2013-11-19 16.29.16.png](https://qiita-image-store.s3.amazonaws.com/0/9061/3a795ec5-920d-ecb9-b89c-c55c7a707898.png "スクリーンショット 2013-11-19 16.29.16.png")
![スクリーンショット 2013-11-19 16.30.51.png](https://qiita-image-store.s3.amazonaws.com/0/9061/548d7a62-d6c7-c25d-19f4-c17a390d56ee.png "スクリーンショット 2013-11-19 16.30.51.png")

UILabelを継承したBasicLabelファイルを作ります。

##BasicLabel.h

```objectivec:BasicLabel.h
#import <UIKit/UIKit.h>

typedef enum : NSInteger{
    HeaderTitle = 0,
    NavigationMenu,
    TableCellName
}BasicLabelName;

@interface BasicLabel : UILabel
- (id)initWithName:(BasicLabelName)name;
@end
```

##BasicLabel.m

```objectivec:BasicLabel.m
#import "BasicLabel.h"

@implementation BasicLabel

- (id)initWithName:(BasicLabelName)name {
    
    self = [super init];
    if (self) {
        switch (name) {
            case HeaderTitle:{
                self.textColor = [UIColor colorWithRed:0.188 green:0.239 blue:0.314 alpha:1.0];
                UIFont *font = [UIFont fontWithName:@"HiraKakuProN-W3" size:14.0f];
                self.font = font;
                break;
            }
            case NavigationMenu:{
                self.textColor = [UIColor colorWithRed:0.427 green:0.427 blue:0.447 alpha:1.0];
                UIFont *font = [UIFont fontWithName:@"HiraKakuProN-W3" size:12.0f];
                self.font = font;
                break;
            }
            case TableCellName:{
                self.textColor = [UIColor whiteColor];
                UIFont *font = [UIFont fontWithName:@"HiraKakuProN-W3" size:14.0f];
                self.font = font;
                break;
            }
            default:
                break;
        }
    }
    return self;
}
@end
```

##使い方

```objectivec:
#import "BasicLabel.h"   //作成したBasicLabel.hを読み込む

//実際に使うとき
BasicLabel *headerLabel = [[BasicLabel alloc]initWithName: HeaderTitle];
[headerLabel setText:@"ヘッダータイトル"];
[headerLabel sizeToFit];
headerLabel.frame = CGRectMake(10, 10, headerLabel.frame.size.width, headerLabel.frame.size.height);
```
スマホでの音楽ストリーミング再生のマジックコード

## ストリーミングHack

　スマホのでの音楽再生、Ajaxやら色々ごにょごにょする際に、ユーザイベントでの音楽の初期化が必要になってくる。普通にやろうとすると、Ajaxを挟んだ音楽再生はユーザイベントが途切れるのでできないが、その前に何らかのファイルを再生をしておくとうまくいく。
　そこで、無音の短い音楽ファイルをbodyへの初回タッチイベントにて再生をさせておこう。ストリーミング形式である必要はない。` .one()`もたまに使ってあげよう。 

```js:sound.js
        sound = document.createElement((isIOS) ? 'audio' : 'video');
        $(sound).attr('id', 'video')
                .attr('width', '1')
                .attr('height', '1')
                .attr('controls', false)
                .attr('preload', 'auto')
                .attr('autoplay', true);
        $("#playerObject").append(sound);

        var source = document.createElement('source');
        $(source).attr('type', 'video/mp4').attr('src', "start.3gp");
        $(sound).html(source);
        sound.load();

        // MAGIC FUNCTION
        $("body").one("touchstart", function () {
            sound.play();
        })
```

後は、Ajaxをはさもうが再生できるようになっているはず。

### 備考

　現状、スマホの音楽のプラグイン無しでのストリーミングは動画の規格であるHLS(Apple http live streaming:Android4.0+、iOS3.0+対応)を使用する他ない。
iPhoneでは、動画は自動的に全画面化されてしまうので、Audioタグを使う。また、Androidでは、AudioタグのHLSは対応していないので、videoタグを使う。
　尚、Androidのvideoタグは標準ブラウザなどで、videoタグを1px*1pxで表示させておかないと再生されない端末もあるので、ならない場合はまずそこを疑うと良い。

　とりあえず標準ブラウザでの検証を行い、仕様を握っておくことは不可欠。chromeを推奨しましょう。標準ブラウザはすごくヤバイ。ほんとヤバイ。。。
　Android2.xはFlashのStrobeMediaPlaybackを使用する。Flashはデバイス依存ではないので、結構容易い。

# Android4系はシークが効かないよ。(爆)
[http://www.jwplayer.com/blog/the-pain-of-live-streaming-on-android/](http://www.jwplayer.com/blog/the-pain-of-live-streaming-on-android/)
アプリでも効かないよ(爆)
[http://www.slideshare.net/myatsumoto/android-22488565](http://www.slideshare.net/myatsumoto/android-22488565)

## というか色々ヤバかった。
http://www.jwplayer.com/html5/hls/
1. Starting the stream requires 3 clicks on the play button
2. Video is blown up to screen size, irregardless of aspect ratio
3. Seeking does not work in windowed mode (but works in fullscreen)
4. Browser tab crashes when attempting to go fullscreen
5. The first time the stream starts, only audio plays. After another play/pause, video shows too.
6. Toggling play/pause does not work in fullscreen (but works windowed)
R：地域メッシュコード計算プログラム for Rへのリンク

緯度経度から1～3次までの地域メッシュコードを計算したり、メッシュコードから緯度経度（コーナー4点と中央）を得られるRのコード。

http://takenaka-akio.org/etc/meshcode/r_code.html

保存したものを、sourceを使って読み込んで使う。

```
source('./mesh_lib.R')
```
R：日本測地系（TOKYO）から世界測地系（WGS84）への変換

spとrgdalパッケージを使った測地系変換。

```
# パッケージのインストール・読み込み。
install.packages("sp")
install.packages("rgdal")
library(sp)
library(rgdal)

# 変換元データの用意。
locations <- data.frame(latitude=c(35.65486), longitude=c(139.74463))

# SPデータへの変換と測地系設定
coordinates(locations) <- c("longitude", "latitude")
proj4string(locations) <-  CRS("+proj=longlat +ellps=bessel +towgs84=-146.336,506.832,680.254,0,0,0,0 +no_defs")

# 現在値の確認。
locations
SpatialPoints:
     longitude latitude
[1,]  139.7446 35.65486
Coordinate Reference System (CRS) arguments: +proj=longlat +ellps=bessel +towgs84=-146.336,506.832,680.254,0,0,0,0 +no_defs 

# WGS84への測地系変換。
locations <- spTransform(locations, CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))

# 現在値の確認。
locations
SpatialPoints:
     longitude latitude
[1,]  139.7414  35.6581
Coordinate Reference System (CRS) arguments: +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0 
```
R：日付の文字列表現を得る。

formatを使う。%OSの出力は、digits.secsの設定に依存する。
現在時刻を例にした出力は以下の通り。

```
> options(digits.secs=3)
> format(Sys.time(), "%Y/%m/%d %H:%M:%OS")
[1] "2013/11/19 15:49:05.608"
```
R：日付・時刻（POSIXct）の小数点以下の表記を変更する。

```
options(digits.secs=3)
```
digits.secsは0～6で指定可能。

```
> options(digits.secs=3)
> as.POSIXct('2013-10-10 12:55:42.233')
[1] "2013-10-10 12:55:42.233 JST"
```

現在の設定は以下で確認できる。初期値はNULL。

```
getOption("digits.secs")
```
AirStationでXFSにフォーマットしたNASをUbuntuで読み込む

BUFFALO AirStation WZR-HP-G300NHの簡易NAS機能を使ってメディアサーバーを作りました。

WZR-HP-G300NHの簡易NAS機能はFATとXFSフォーマットに対応しています。

HDDをAirStationsの管理画面からXFSでフォーマットしたところ、XFSに対応しているUbuntuから直接アクセスすることができませんでした。

```
Error mounting: mount exited with exit code 32: mount: /dev/sdb1: can't read superblock
```

- AirStationでXFSにフォーマット ⇒ Ubuntuで読み込めない
- UbuntuでXFSにフォーマット ⇒ AirStationで読み込めない

という状態です。

これに対して、xfs_repairで修復したところ、AirStationでフォーマットしたXFSをUbuntuで読み込めるようになりました。

```
$ sudo xfs_repair -Lv /dev/sdb1
```

しかし、xfs_repairは100%データを保護するわけではないので、修復する際にデータが消える可能性があるようです。注意。
VimでTextMateのようなコードスニペット(コード補完)を実装する

MacのエディタといえばTextMateやSublimetextが有名ですが、コードスニペット(コード補完)をVimでも簡単に再現できます。

## snipMate

まずsnipMateのサイトから最新版の「snipMate.zip」を適当な場所(今回は、~/Downloads)にダウンロードします。

http://www.vim.org/scripts/script.php?script_id=2540

次にターミナルで、以下のコマンドを打つと~/.vim/以下にsnipMateが展開されコードスニペット機能が使えるようになります。

```
$ unzip ~/Downloads/snipMate.zip -d ~/.vim
```

## スニペットの追加

snipMateは最初からいくつかの言語に対応していますが、足りないものは直接編集して追加します。

```
$ cd ~/.vim/snippets/
$ ls
_.snippets		mako.snippets		snippet.snippets
autoit.snippets		objc.snippets		tcl.snippets
c.snippets		perl.snippets		tex.snippets
cpp.snippets		php.snippets		vim.snippets
html.snippets		python.snippets		zsh.snippets
java.snippets		ruby.snippets
javascript.snippets	sh.snippets
```

PHPの場合は、php.snippetsを編集します。

echoのコードスニペットは「ec」と設定されていますね。

```
$ vim php.snippets
```

```
snippet ec
    echo "${1:string}"${2};
```

例えば、printのスニペットとして、こんな感じに追記すれば、

```
snippet pr
    print "${1:string}"${2};
```

pr\<tab>でprintのコードスニペットができるようになります。

![スクリーンショット 2013-11-19 12.53.43.png](https://qiita-image-store.s3.amazonaws.com/0/1818/e70336c4-2e11-6c72-2af8-b4b31bf972d5.png)
プロセスのバックグラウンド化(nohupとdisown)

## nohup

バックグラウンドのプロセスをログアウト後も持続させる場合は、nohupコマンドを使います。
&はプロセスをバックグラウンドで走らせるという意味で、エラーは$HOME以下のnohup.outに書き込まれます。

nuhupとは、「No Hung Up」からきていて、"ハングアップシグナルを無視する"ということです。

```
$ nohup test.php &[1] 25687
```

## disown

ログアウトしたいのにnohupコマンドをつけずに開始したプロセスが走り続けている場合は、disownコマンドを使います。

jobsコマンドでプロセス番号を確認し、disownでその番号を指定します。

```
$ jobs[1]+  Running        php test.php &$ disown %1
```

プロセス番号を指定しないと現在のジョブを、オプションで-a(--all)をつけると全てのジョブをデーモンプロセス化します。
Rからerb記述が含まれるyamlを読み込む

# RからRubyを呼び出す

余り綺麗な方法ではありませんが

```r
> system('ruby -e "puts 1+1"', intern=TRUE)
[1] "2"
> system("ruby script.rb", intern=T)
```

とすることでRからRubyを呼び出せます。

# erb記述の含まれるyamlを読み込む

Rには`library(yaml)`があるため通常のyamlファイルは`yaml.load_file(input)`とすることで呼び出せますが、Rubyで利用しているyamlファイルにerb記述がある場合は展開されません。
環境変数にDBの設定などを記述して、RとRubyの両方で環境に応じた接続を切り替えたい場合に少し不便です。
ちょっと無理矢理ですが楽に読み込めたので、その方法を記述しておきます。
もっと良い方法があるはずなので、知っている方は教えてくれると嬉しいです。

## `load_erb.rb`
適当にerbを読み込んで展開、表示するだけのスクリプト

```rb
require 'erb'
p ERB.new(File.read('database.yml')).result
```

## `system(script)` from R

```r
yaml.load(yaml.load(system("ruby load_erb.rb", intern=T)))

$test
$test$adapter
[1] "sqlite3"

$test$database
[1] "db/test.sqlite3"

$test$pool
[1] 5

$test$timeout
[1] 5000
```

`yaml.load`で一度パースされた文字列を再度パースすることで読み込んでいます。

わざわざ2行のスクリプトを用意せずともインラインで呼び出すのも良いと思います。

```r
eq <- "ruby -e 'require \"erb\"; p ERB.new(File.read(\"database.yml\")).result'"
yaml.load(yaml.load(system(eq, intern=T)))
```

エスケープが若干面倒で見た目が汚いですが、実用には足ります。
pathを渡せるようにするならこんな感じでしょうか。

```r
yaml.load_erb <- function(path){
 eq <- paste("ruby -e 'require \"erb\"; p ERB.new(File.read(\"", path,"\")).result'", collapse='', sep='')
 yaml.load(yaml.load(system(eq, intern=T)))
}
```

余りニーズのある領域ではなさそうですが、もっとスマートなやり方が知りたいです。
消してしまったブランチを復元する

## HEADのログを確認
```bash
$ git reflog HEAD
```

## 消してしまったブランチにチェックアウトした時の情報を確認
```bash
ハッシュ値 HEAD@{ログ番号}: checkout: moving from master to 消してしまったブランチ名
```

## 上記を元に復元
```bash
$ git branch ブランチ名 HEAD@{ログ番号}
```

http://labs.timedia.co.jp/2011/08/git-undo-999.html
http://kanakana.chu.jp/first/hiyoko/2013/04/git.html
既存のHTMLをさくっとテンプレートにする

普段HTMLをつくるときは、Jadeありきな感じになってしまっているのですが、中には既存のHTMLファイルを修正したり、ベースを他の作業者が作るときなどはJadeを使えないときもあります。

そんなとき<a href='https://github.com/donpark/html2jade' target='_blank'>html2jade</a>などを使って、Jadeに変換するのでもいいのですが、めんどくさいときはちょっとの修正でHTMLにも気軽に入れられるテンプレート・エンジンを入れたりしています。

## ECT

<a href='http://ectjs.com/' target='_blank'>ECT</a>は、キャッチコピーがFastest JavaScript template engine with CoffeeScript syntaxといってるテンプレートエンジンです。

実際、速いかどうかは計っていないですが、さくっと入れることができるので重宝しています。

<a href='https://npmjs.org/package/grunt-ect' target='_blank'>gruntのタスク</a>も公開されているので、フローにも入れやすいです。

```js:Gruntfile.js
ect: {
  develop: {

    files:[{
      src : 'path/to.html',
      dest : 'dest/path/to.html',
    },{
      src : 'path/to/some.html',
      dest : 'dest/path/to/some.html',
    }],

    variables: {
      FQDN : '<%= config.fqdn %>',
      URI : '<%= config.uri %>',
      some : 'some var'
    }
  }
},
```

ほかにもさくっと入れられるテンプレート・エンジンは色々ありますので、自分にあったものを試してみるといいかもしれません。

おしまい。
CCScrollViewでスキップ！

CCScrollViewを使ってる時に、
setContentOffsetInDuration()でアニメーション→タップでスキップしたい！って時があると思う。
その場合はsetContentOffset()を使うんだけど、
その前にscrollView->stopAllActions()だけではダメで、
scrollView->getContainer()→stopAllActions()をしてからセットでいける。


```cpp:sample.cpp
scrollView->stopAllActions();
scrollView->getContainer()->stopAllActions();
scrollView->setContentOffset(point , false);
```

これでスキップ、ジャンプも自由自在！
dockerui を試そうとしたら docker コマンドに毎回 -H を指定するのが面倒なのを解決する方法

`dockerui` の README には

`docker -d -H="192.168.1.9:4243" -api-enable-cors`

のように tcp だけ (省略した形で) 書いていますが、

`docker -d -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -api-enable-cors`

のように unix socket も同時に指定すれば両方で待ち受けるようになって、いちいち `docker` コマンドに `-H` オプションを指定しなくても良くなります。

待ち受けるのを `0.0.0.0` のように全 IPv4 アドレスにするか、特定の IPv4 アドレスだけにするかは、セキュリティとの兼ね合いなどを考えてお好みでどうぞ。
HTMLのdisplay プロパティを使う上での注意点

HTMLの要素をdisplayで制御することがよくある。
block要素をinline要素にしたり、その逆もしかり。
要素のもつ特徴はある程度そのままで、見た目上の制御を行いたいときに利用するものと認識している。

このdisplayプロパティで、少しはまったので調べた結果を取りまとめ。
そもそもdisplayは下記のページで書かれている通りの値が想定されている。

[CSS/Properties/display](http://www.w3.org/wiki/CSS/Properties/display) http://www.w3.org/wiki/CSS/Properties/display

* inline 
* block
* list-item
* run-in
* inline-block
* テーブル系(table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption)
* none
* inherit 

ただし、ブラウザの開発ツールを使って補完されるリストを見るとさらに種類がある。
ブラウザで追加しているのか、上記のドキュメントが古いだけなのかはわからないが、
Webプロダクトを参照するブラウザを限定してしまえば、さまざまな種類を使えるらしい。

しかし、ブラウザを限定できない時は基本的に、inlineとblockとrun-inを使うようにした方がよさそうであるという見解に個人的になっている。

run-inは、子要素に合わせてdisplayの値が切り替わるのでよさそう。IEもFirefoxもChromeも今の使い方の範囲では問題なさそうに見える。

inline-blockが使えるのかと思ったが、ブラウザに依存して想定通りに動作しない。
ちょっと古めだが下記の記事があった。

 http://norisfactory.com/stylesheetlab/000039.php

CSSは、簡単に組めそうなところではまる。一つのはまりポイントとしてdisplayがあるかもと考えて、取りまとめ。
Railsでapi用のcontrollerを作るときに覚えておくといいオプション

apiのconttrolerを `rails g controller hoge` で 作成すると

 assets とか helper とかが自動生成されるので、自分の場合、都度消してました。

オプションを確認してみたら

`—helper` と `—assets` オプションがあるのを先ほど知りました。

```bash
rails g controller hogs —helper false —assets false
```

で作るとhelperとassetsが自動生成されない。

viewは自動的につくられてもしょうがないのかな。

model とか 他の オプションも目を通して見よう。
DNSの更新をn時間後に確認してメール通知するワンライナー

DNSの設定を確認するのって、ちょっと待たなくちゃいけなかったりしてめんどくさくないですか？
3600秒後(1時間後)に、システムが勝手に確認してくれてメール通知してくれたら...


# 実現するワンライナー

```bash
echo "dig example.com | mail -s 'dig example.com' admin@somecompany.com" | at -v now + 1 hours
```

# 説明

コマンドを分解して説明します。

## at部分

```bash
echo "somecommand" | at -v now + 1 hours
```

atコマンドは特定の時間にコマンドを実行するコマンドです。実行するコマンドは標準入力で受け付けられるので、ここではechoで出させてパイプで受け付けてます。

at の-vオプションは何時に実行するかを表示してくれるものです。なくてもいいです。

now + 1 hoursというのは今から１時間後に与えられたコマンドを実行してほしい、というものです。他に受け付けられるフォーマットはtimespecで決まっているので、man atでtimespecを検索しましょう。

その日の特定の時刻に、という場合は以下のように設定できます。

```bash
echo "somecommand" | at -v 12:30
```

ちなみに、ちゃんと予定が登録出来たかを確認するのは、atqコマンドでできます。

## mail部分

atの前半、echoで出力していたコマンドについてです。

```bash
dig example.com | mail -s 'dig example.com' admin@somecompany.com
```

digはDNSの設定を確認するコマンドです。

mailはここではメールを送るコマンドとして使っています。本文を標準入力で受け取れるので、digの結果をパイプでつないで本文にしています。


いかがでしたか？
他にもn時間後にやっておいてほしいなーというイベントを設定できるので、色々使えるかも？
試してみてください！
Rails 4 へ移行時 Capistrano でのデプロイに失敗する件と対策

#　前提
Capistrano 2.15.4
Rails 3.2 から Rails 4 へのアップグレード

# エラー内容
以下のエラーが表示されてデプロイが止まってしまう。

```
/ruby_path/lib/ruby/gems/2.0.0/gems/capistrano-2.15.4/lib/capistrano/recipes/deploy/assets.rb:68:in `block (3 levels) in load': More than one asset manifest file was found in '/YOUR_PROJECT/shared/assets'.  If you are upgrading a Rails 3 application to Rails 4, follow these instructions: http://github.com/capistrano/capistrano/wiki/Upgrading-to-Rails-4#asset-pipeline (RuntimeError)
```

# 対策
[http://github.com/capistrano/capistrano/wiki/Upgrading-to-Rails-4#asset-pipeline](http://github.com/capistrano/capistrano/wiki/Upgrading-to-Rails-4#asset-pipeline)

原因はエラー内容に書かれているページにある通り、Rails 3 で使われている `manifest.yml` が `shared/assets` に存在するため。
Capistrano が current のアプリルートに `assets_manifest.yml` をバックアップしてくれているので、このファイルを確認後に `manifest.yml` を削除し、再度デプロイすることでデプロイできた。

# See Also
https://github.com/capistrano/capistrano/wiki/Upgrading-to-Rails-4#asset-pipeline
https://iprog.com/posting/2013/07/capistrano-errors-when-upgrading-to-rails-4
メモ: CentOS5にtigをインストール

依存関係が少なくリポジトリ登録するまでもないので以下から手動でダウンロードした。

http://pkgs.repoforge.org/tig/
http://pkgs.repoforge.org/bash-completion/

* [tig-1.2-1.el5.rf.i386.rpm](http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/tig-1.2-1.el5.rf.i386.rpm)
* [bash-completion-20060301-1.el5.rf.noarch.rpm](http://pkgs.repoforge.org/bash-completion/bash-completion-20060301-1.el5.rf.noarch.rpm)

## ~/.tigrc

* [Bindings · jonas/tig Wiki · GitHub](https://github.com/jonas/tig/wiki/Bindings)

```~/.tigrc
# Cを押してgit diffも表示
bind generic C !git commit -v
```
coda2でgitを使ってバージョン管理をする

#まずはMacPortsインストール

MacPorts

http://www.macports.org
右上に「download」のリンクがあるので、その先の本文の中にMountain LionなどのOS名の表記があるのでそれをクリックしてダウンロードしてインストール。

#次にGitインストール

次はターミナルを起動してMacPortsでGitをインストール

```
sudo port install git-core
```

以下のようなエラーが出る場合、

```
Warning: The Command Line Tools for Xcode don't appear to be installed; most ports will likely fail to build.

Warning: See http://guide.macports.org/chunked/installing.xcode.html for more information.
---> Computing dependencies for git-coreError: Unable to execute port: can't read "build.cmd": Failed to locate 'make' in path: '/opt/local/bin:/opt/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin' or at its MacPorts configuration time location, did you move it?
```

Xcodeのコマンドラインツールが入ってないということ。

Xcodeを起動してFile – Preferencesから、

Command LineツールをインストールすればOK


念のためにターミナルを再起動してGitインストール完了!

#coda2を設定

Coda2の「環境設定」の「ファイル」タブの下にある「Gitパス」にGitのパスを追加

```
/opt/local/bin/git
```
wavからm4aに変換したいけど、neroAacEnc のコマンドライン覚えるのがめんどくさい人用のシェルスクリプト

```bash:wav2m4a.sh
#/bin/bash
filename=$(basename "$1")
filename="${filename%.*}"
neroAacEnc -if "${filename}.wav" -of "${filename}.m4a" -2pass -br 96000
```

品質は適当に変えてください。

置き場所は適当に。

自分の場合は ~/Dropbox/sh/ に置いておいて
`chmod +x` したあとに `ln -s ~/Dropbox/sh/wav2m4a.sh ~/bin/wav2m4a` としてます。
こうしておけば必要なときにすぐにWindowsでもLinuxでもMacでも呼び出せるので。
`01:20:30.456`な感じの時間の文字列の差分を求める方法

```rb
require "time"
t = Time.parse("02:09:25.720") - Time.parse("01:06:35.420")
p Time.at(t).utc.strftime("%H:%M:%S.%L")
```

な感じで。 

★ `require "time"` がないと `Time.parse` が使えません。
★ `Time.utc` を呼び出しとかないと local time が呼ばれるので +9:00 されてしまいます。
★ 直接 at で gm の時間を呼び出すことはできないのでしょうか？
time-based HOTPと言ってはいけない

前回の記事はこちら [小ネタ: 2段階認証でssh](http://qiita.com/amedama/items/c0ae17a5bc33657e492d)

おさらいをすると、LinuxのPAMモジュールの一つとしてOATH認証 (Google Authenticatorとかで使われるアレ)を追加することができるのでsshで使ってみた、という話です。2段階認証がご家庭に届くまであと30進捗くらいです。

で、そこで使った(PAM認証の)pam_oathにしろ、(Apacheの)mod_authn_otpにしろ、usersfileと呼ばれるファイルを使います。これについてはきちんとした名称も仕様っぽいものはないんですが (OATHの範囲でもないようですし)、参考になる資料として以下があります。

(なお、以降私の中ではこの設定ファイルの名称を"usersfile"とすることにしました。根拠は、以下のwikiページと、あと後述するpam_oathの実装で使われているファイル名)

https://code.google.com/p/mod-authn-otp/wiki/UsersFile

```
#       HOTP/T30        - HOTP time-based token with 30 second interval and six digit OTP
#       HOTP/T60        - HOTP time-based token with 60 second interval and six digit OTP
#       HOTP/T60/5      - HOTP time-based token with 60 second interval and five digit OTP
```

ああん？？ HOTP time-based ってなんだよ？？？ (逆切れ

HOTP/T30 等はTOTPのはず……。もっとも、ここで素直にTOTPと書かない奥ゆかしさには頭が沸騰します。

参考まで、最初のプロトコルタイプに対応するpam_oath側 (liboath)の実装を拾って来ました (oath-toolkit-2.4.0)

```c:liboath/usersfile.c
static int
parse_type (const char *str, unsigned *digits, unsigned *totpstepsize)
{
  *totpstepsize = 0;
  if (strcmp (str, "HOTP/E/6") == 0
      || strcmp (str, "HOTP/E") == 0 || strcmp (str, "HOTP") == 0)
    *digits = 6;
  else if (strcmp (str, "HOTP/E/7") == 0)
    *digits = 7;
  else if (strcmp (str, "HOTP/E/8") == 0)
    *digits = 8;
  else if (strncmp (str, "HOTP/T30", 8) == 0)
    {
      *totpstepsize = 30;
      if (strcmp (str, "HOTP/T30") == 0 || strcmp (str, "HOTP/T30/6") == 0)
        *digits = 6;
      else if (strcmp (str, "HOTP/T30/7") == 0)
        *digits = 7;
      else if (strcmp (str, "HOTP/T30/8") == 0)
        *digits = 8;
      else
        return -1;
    }
  else if (strncmp (str, "HOTP/T60", 8) == 0)
    {
      *totpstepsize = 60;
      if (strcmp (str, "HOTP/T60") == 0 || strcmp (str, "HOTP/T60/6") == 0)
        *digits = 6;
      else if (strcmp (str, "HOTP/T60/7") == 0)
        *digits = 7;
      else if (strcmp (str, "HOTP/T60/8") == 0)
        *digits = 8;
      else
        return -1;
    }
  else
    return -1;

  return 0;
}
```

"TOTP"というタイプは許さないのですが、HOTP/T30等をいみじくもtotpstepsizeという変数等で扱ってるのです。紛らわしい。いやでもこのあまりに実直な実装には安心しました。ガチパーサでも使ってないかドキドキしてたのです。

そもそもHOTPと時間ベース拡張がTOTPで、HOTP自体はHMAC OTPという以上ではないようなのです。

* http://tools.ietf.org/html/rfc4226
* http://tools.ietf.org/html/rfc6238

おまけですが、usersfileのタイプ指定において既にpam_oathとmod_authn_otpで実装のズレがあるのが分かります。HOTP/T30/5 (30秒サイクルのTOTPで入力する数字は5桁、を意図)はmod_authn_otpでしか受け付けません。

ただ、手元でGoogle Authenticatorで時間ベースの設定(HOTP/T30)を使っている範囲において、両者は同じusersfileの設定行を受け付けました。つまり、1回登録して二箇所で使えます。(試行回数も1回ですけどネ)

これが何が嬉しいかというと、普通の人にはほとんど何も嬉しくありません。
Rubyでxls(Excelファイル)を簡単にパースする方法


すごく簡単でドキュメント通りな内容なのですが、非常に便利だったのでメモ。

その名もSpreadsheetというgemを使います。
https://github.com/zdavatz/spreadsheet/blob/master/GUIDE.md

```ruby
# Gemfile
gem 'spreadsheet'

```

```ruby
# vim hoge.rb
Spreadsheet.client_encoding = 'UTF-8'

book = Spreadsheet.open '/path/to/an/excel-file.xls'
sheet1 = book.worksheet 0 # スプレッドシートの1枚目を指定

sheet1.each do |row|
  # do something interesting with a row
end
```
たったこれだけです！超簡単！
配列でrowの部分にデータが入ってくるので扱いやすくてよいです。

スプレッドシートの指定の仕方はindexで指定しているのですが（なので2枚目だと1を指定すればよいです）、シート名をそのまま書いても大丈夫なようです。(ex. sheet1 = book.worksheet 'Sheet1')

また、Spreadsheet.open部分はRailsの場合だとexpand_pathとか使えなくてめんどくさそうと思ったのですが、普通にアプリルートからのパスで通りました。

なのでbatchスクリプト内で実行する際は

```ruby
book = Spreadsheet.open 'bin/batch/excel-file.xls'
```
などと書いておいて、コンソールから

```console
$ rails r bin/batch/hoge.rb
```
で大丈夫です。