OmniAICreator/Qiita-1.07M huggingface dataset:
AWS OpsWorksでオートスケールのTimeBase,LoadBaseをつかう

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

[AWS OpsWorks](http://aws.amazon.com/jp/opsworks/)を使ってオートスケールを組み立てようと思い、用意されているスケール対応インスタンスタイプを調べてみました。


![inst01.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/2d9fe749-cd2b-2a90-eadc-1d58e758073f.jpeg "inst01.jpg")


ちなみにOpsWorksはCloudWatchのメトリクスと連携しているのでどのインスタンスでも`AutoHeal`オプションを使うことができます。Statusが何かおかしかったらインスタンスを作りなおしてくれるナイス機能です。


## 24/7

普通のレギュラーなインスタンスで、常時上がりっぱなしのインスタンスです。
通常はこのタイプを一つ用意して、`TimeBase`， `LoadBase`を増やしていく感じでしょう。

ただ、レイヤ内に`24/7`が１つもない状態で他のタイプがある場合は最低1台になるようにどれかが上がってくるようです。実は不要かもしれませんね。


## Time based instance

１時間単位で起動・停止の状態をスケジュールできるインスタンスです。**時間はUTC**で指定するので、お間違えの無いよう。

設定のUIはこんなかんじです、薄いのは曜日別設定アリ、濃い緑は`Everyday`のスケジュールです。

![time_base01.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/db489f61-cca5-79c9-ac76-1778c892457c.jpeg "time_base01.jpg")


設定後、UP指定の時間帯になったらStop状態だったインスタンスが勝手に上がって来ました。

![time_base02.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/1350845e-1cc3-ab0b-26f7-fb0dc5f0b44a.jpeg "time_base02.jpg")

デプロイまで完了したらELBに勝手に参加します、便利やなあ。


## LoadBased

CloudWatchとのメトリクス連携真骨頂ですね。
レイヤ内のインスタンスの**平均負荷状況**に閾値を設定し、指定時間内にその状態だったらインスタンスを起動します。

ルールはこんな感じです。

- ５分高負荷状態が続いたらインスタンス起動
- 10分低負荷になったらインスタンス停止
- 一度に任意の台数を追加・停止可能

![LBI01.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/fdb0af8a-df9b-fb28-1e05-5974abe4070b.jpeg "LBI01.jpg")




### 負荷をかけてみる

LoadBasedインスタンスを追加した後閾値を40%まで下げて、レイヤ内の1台でCPUベンチをまわしてみました。

丁度yumに`sysbench`があったのでぶっ放します。


```shell:sysbench_loop
$ while /bin/true ; do sysbench --num-threads=4 --test=cpu run ; done
```


![sysbench_agent.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/37f60b9c-597c-1497-e331-dd3bc72a3c7f.jpeg "sysbench_agent.jpg")


インスタンス2つのうち、1つが100％ベッタリになっているのでレイヤの平均負荷も良い具合に50％です。

![monitoring01.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/6901acd1-e859-438b-34e3-0d340b0ca488.jpeg "monitoring01.jpg")


では5分ほど待ってみます。

## 勝手にインスタンスが起動

![load03.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/9919cbea-558e-18f5-ed59-e337b4c085bc.jpeg "load03.jpg")


おお、レイヤの負荷に控えのインスタンスが駆けつける※様子が見られました！

※インスタンスストアでやると手軽ですが流石に遅いです、EBSにして一回くらい起動しておくとパッケージインストールなどを省けるぶんそこそこ早いかと思います。


### 平均負荷が軽減

3台目のインスタンスが起動したので、レイヤの平均負荷は狙い通り33％となりました、もちろんELBに参加してくれています。

![load04.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/4ee7db4a-7931-bbb5-28f4-c851ca33ff08.jpeg "load04.jpg")



## 終わりに

こういったオートスケールに対応するには、アプリケーション側の対応はもちろん、アプリケーションが動作するプラットフォームを、サーバに一切触らず構築する仕組みへの理解が大事になってきます。

今回試したのはStaticなWebサイトの配信だったので全く考える余地は無かったのですが、起動・デプロイ・後片付け・停止のサイクルをしっかり管理できるようなレシピを作るスキルを磨いていかないといけないですね。
herokuのログをリアルタイムでみる

herokuのログを見るときは `heroku logs` で見ることができますがログをみるのにいちいちコマンドを叩くのがめんどくさいときはオプションで `--tail`をつける。

`heroku logs --tail`

これで吐き出されたログを絶えず見ることができる
Backbone.jsメモ

### App全体を制御するEventsを継承したやつで、複数のViewを制御する
	
> [【後編】Backbone.jsでつくるMVPなUIパターン【スクロールスパイ】 ｜ Developers.IO](http://dev.classmethod.jp/ria/backbone-js-mvp-ui-scroll-spy-2/)

> [I am mitsuruog: Backbone.jsともっと仲良くなるためのヒント](http://blog.mitsuruog.info/2013/04/backbonejs.html)


### Viewはコンポーネント単位でつくる

> [フロントエンドJavaScriptにおける設計とテスト](http://hokaccha.github.io/slides/javascript_design_and_test/)


### ユーザの操作 → Collection、Modelの変更 → Viewのレンダリング の順番
	
> [I am mitsuruog: Backbone.jsともっと仲良くなるためのヒント](http://blog.mitsuruog.info/2013/04/backbonejs.html)


### Viewが管理するCollectionやModelのイベントハンドリングにはlistenTo()をつかう

> [I am mitsuruog: Backbone.jsともっと仲良くなるためのヒント](http://blog.mitsuruog.info/2013/04/backbonejs.html)


### on(), off()
`model/collection`から`view`に対して呼び出す

### listenTo(), stopListening()
`view`から`model/collection`に対して呼び出す
Jenkinsでrvmを使おうとするとエラー


# エラー内容　その１
```console
+ rvm use
/tmp/hudson1166277874546094993.sh: line 3: rvm: command not found
Build step 'Execute shell' marked build as failure
Finished: FAILURE
```
JenkinsのRVMプラグインやJenkinsサーバへRVMをインストールしているにもかかわらず上記エラーが発生する。
以下のログが出力されているし、RVMは認識されてるはずだと思うのだが、自作のシェルはRVMを認識してくていない。

```console
[workspace] $ bash -c " source /usr/local/rvm/scripts/rvm && rvm use --install --create 1.9.3 && export > rvm.env"
Using /usr/local/rvm/gems/ruby-1.9.3-p429
```
よくよく調査してみると、PATHにRVMが追加されていなかった。なんで？

```console
+ env
~(省略)~
PATH=/sbin:/usr/sbin:/bin:/usr/bin
```

# エラー内容　その２
PATHにRVMのパスを追加してみたが、今度は別のエラーが発生した。が、RVMは認識してくれるようにはなった。

```console
+ PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/rvm/bin
+ export PATH
```

```console
+ rvm use
RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for a example.
```

# 対処方法
デフォルトのシェルはshで動作するため、.bashrc等の読み込みができていなかったみたい。なので、bashで起動するためシバン（#!/bin/bash）を追加してあげればOK。あとは、.bash_profileの読み込みを追加。

```console
#!/bin/bash
source ~/.bash_profile
bundle install
```

p.s.
これに１週間悩み苦しみました・・・。
秘密鍵と公開鍵の覚書


# id_rsaとid_rsa.pub
id_rsa => 秘密鍵
id_rsa.pub => 公開鍵

# config
秘密鍵を複数扱うときに便利。接続するホストと秘密鍵を紐付ける。

# known_hosts
初回接続の際に、接続する側（クライアント）の当該ファイルに、接続される側（サーバ側）の公開鍵がコピーされる。

# authorized_keys
接続される側（サーバ側）の当該ファイルに、接続する側（クライアント側）の公開鍵をコピーしておくことで、パスワードを入力せずにログインすることが可能

# ssh-addとssh-agent
ssh-add => ssh-agentデーモンのメモリに秘密鍵を登録する。
ssh-agentが起動しない場合、以下のコマンドを実行することでssh-agentが起動する。

```bash
eval `ssh-agent`
```

# ssh-keygen
RSA認証のキーの組み（秘密鍵を公開鍵）を作成する。

# その他
JenkinsのGitリポジトリを設定しようとすると認証エラーかなんかで設定できなかった。原因は、known_hostsに公開鍵の登録がなかったため。別途アクセスをし、known_hostsへ公開鍵を登録したら、Jenkinsでgitリポジトリを無事登録することができました。
正規表現の`.`でハマった話

JavaScriptの正規表現には（というかどの正規表現にも）`.`というメタ文字があります。これは大抵「任意の一文字にマッチ」と説明されていて、僕も今までそういうものだと思っていました。
ですが、どうも違ったみたいです。

こんなコードを書いたとします。

```javascript
var
c_src = 'int main(){\n printf("Hello, World");\n}';
/*
int main(){
 printf("Hello, World");
}
*/

console.log(c_src.match(/^(\w+)\s+(.*)$/).slice(1));
```

C言語のプログラムになっている文字列から、返り値となる部分と引数以降を取り出すイメージです（もちろん実際にそんなことしようと思ったらもっとちゃんと構文解析しなければいけませんが…）。

このプログラムの結果として期待するのは、

```
['int', 'main(){\n printf("Hello, World");\n}']
```

という出力です。

しかし実際に実行してみるとどうなるでしょうか？

こうなるはずです。

```
TypeError: Cannot call method 'slice' of null
```

`null`の`slice`ってメソッドは呼べないよー、ってことです。Java風にいうとNullPointerExceptionです。ぬるぽがっ！

なぜこうなるのでしょうか？

Javacriptの`String#match`メソッドは正規表現のマッチに失敗した場合`null`を返します。
つまり先ほどのエラーは、あの正規表現ではあの文字列に対してマッチしないということになります。

どうしたものか…。
ふと、`m`というフラグが存在することを思い出して、もしやとつけてみました。

```javascript
console.log(c_src.match(/^(\w+)\s+(.*)$/m).slice(1));
```

実行してみます。

```
['int', 'main(){']
```

今度はマッチしました！
が、期待する出力と違います。

なぜだ…。

そろそろ訳が分からなくなってきたので[MDN](https://developer.mozilla.org/ja/docs/JavaScript/Guide/Regular_Expressions)を見てみます。（※強調は編集者による）

>. (小数点)__ 改行文字以外__のどの 1 文字にもマッチします。
> 例えば `/.n/` は `"nay, an apple is on the tree"` の `'an'` や `'on'` にはマッチしますが、`'nay'` にはマッチしません。

__改行文字以外__！！
な、なんだってえぇ！

なぜわざわざ改行を省くんだ…。

しかし、この仕様はRubyとかでもあるみたいです。

ひとまずこんな風に書き換えて対処しました。

```javascript
console.log(c_src.match(/^(\w+)\s+((?:.|\n)*)$/).slice(1));
```

と`.`の部分を`(?:.|\n)`と書き換えています。__[訂正:2013/05/27]__不要な部分にmフラグを立てていたものを消しました。

もしかしたら`(?:.|\n|\r)`にしたほうがいいこともあるかもしれません。

もっとうまい方法があったら教えていただけると嬉しいです。

__[追記:2013/05/27]__

コメントで @chick307  様、 @ktty1220 様に教えて頂きました。このようにすればいいみたいです。

```javascript
//こう
console.log(c_src.match(/^(\w+)\s+([\s\S]*)$/).slice(1));

//もしくはこう
console.log(c_src.match(/^(\w+)\s+([\w\W]*)$/
```

なぜ`[\w\W]`か`[\s\S]`なのかというと、それぞれ「英数字と英数字以外」、「空白文字と空白文字以外」という意味あいになり、結果的に全ての文字にマッチするからです。
（正規表現はメタ文字を大文字にすると意味が反対になることが多いです）
logger コマンド

# logger
logger -ip [facility].[priority]  [message]

```bash
logger -ip local0.emerg  'hello world'
```
# option

|引数  |説明                                                                      |
|:----:|:------------------------------------------------------------------------:|
|-i    |各行に logger プロセスのプロセス ID を記録 　　　　　　　　　　　         |
|-s    |システムログに記録したメッセージを標準エラー出力にも出力                  |
|-f    |指定したファイルの内容を記録                                              |
|-p    |メッセージを指定した優先度 (priority) で登録 デフォルトは ‘user.notice’ |
|-t　  |ログを出力する各行に、指定した tag を共に記録                             |
|-usock|組み込みの syslog ルーチンの代わりに sock で指定されたソケットに出力      |
|-d    |このソケットへのストリーム接続ではなく、データグラムを使う                |
|--    |引数の終わり                                                              |

# facility

|code|facility |対象ログ                                      |
|:--:|:-------:|:--------------------------------------------:|
|   0|kern     |カーネル                                      |
|   1|user     |ユーザープロセス                              |
|   2|mail     |メールサービス                                |
|   3|daemon   |各種デーモン                                  |
|   4|auth     |認証（非推奨、authprivが推奨）                |
|   4|security |認証（非推奨、authprivが推奨）                |
|   5|syslog   |syslog内部メッセージ                          |
|   6|lpr      |プリンタサービス                              |
|   7|news     |ニュースサービス                              |
|   8|uucp     |uucp転送を行うプログラム                      |
|   9|cron     |cron                                          |
|  10|authpriv |認証                                          |
|  11|ftp      |ftp                                           |
|  16|local0   |任意の用途                                    |
|  17|local1   |任意の用途                                    |
|  18|local2   |任意の用途                                    |
|  19|local3   |任意の用途                                    |
|  20|local4   |任意の用途                                    |
|  21|local5   |任意の用途                                    |
|  22|local6   |任意の用途                                    |
|  23|local7   |任意の用途                                    |

# priority

|code|priority |内容                                          |
|:--:|:-------:|:--------------------------------------------:|
|   0|panic    |非常に重大なメッセージ、                      |
|   0|emerg    |システムが落ちるような状態                    |
|   1|alert    |緊急に対処すべきエラー                        |
|   2|crit     |致命的なエラー                                |
|   3|err      |一般的なエラー                                |
|   4|warn     |警告                                          |
|   5|notice   |通知                                          |
|   6|info     |情報                                          |
|   7|debug    |デバッグ情報                                  |
.gitignore の設定を反映させる


すでにリポジトリに ignore ファイルを追加していると、
キャッシュが残っており .gitignore ファイルの内容が反映されない。

なので、キャッシュを消してあげよう。

```Bash:.gitignore
git rm -r --cached .
git add .
git commit -m ".gitignore is now working"
```
Eclipse for Mac セットアップ


主にAndroid用。

Eclipseインストール後に設定する項目について。
これだけ抑えておけば割と快適になるはず。

##行番号の表示
General > Editors > TextEditors

**・Show line numbers**
なんでこれがデフォルトでオフなのか。

##formatter
コードの整形はformatterに任せてしまう。
以下のサイトにある`android-formatter.xml`をダウンロード。
[https://android.googlesource.com/platform/development.git/+/master/ide/eclipse](https://android.googlesource.com/platform/development.git/+/master/ide/eclipse)

ダウンロードしたら設定を開いてxmlをimportする。
Java > Code Style > Formatter
`Import…`ボタンを押してxmlを選択して完了。

##補完アクション
Java > Editor > Content Assist

**・Auto activation delay**
補完ウィンドウが出るまでの時間
20 (0.02秒 ほぼ即時) とかにしておくとすぐ表示されて快適
ここは好みの問題かも。
デフォルトは200 (0.2秒)

**・Auto activation triggers for Java**
補完ウィンドウが表示されるキー
アルファベット全部入れとくと、何を入力しても補完が表示される感じ。
`.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`
とか設定してる。

##保存時のアクション
Java > Editor > Save Actions

**・Perform the selected actions on save**
保存時に補完してくれる

**・Format source code**
ソースコードのフォーマットを行なってくれる

**・organize imports**
不要なimportを削除してくれる

##文字コード
General > Workspace

**・Text file encoding**
`Other`を選択して`UTF-8`を入力

デフォルトがSJISなのはなんでだ。。。

##ソースを見れるようにする

###android.jarのソースを見る

android.jarを右クリック > Properties
SDKのソースが入っているディレクトリを選択
`/Applications/android-sdk-macosx/sources/android-17`
これで見れるはず。

###android-support-v4.jarのソースを見る
jarのPATH
`プロジェクト/libs/android-support-v4.jar`

以下のファイルを作成
`プロジェクト/libs/android-support-v4.jar.properties`

ファイルの内容は以下。

```
src=<SDKのPATH>/extras/android/support/v4/src
```

```例
src=/Applications/android-sdk-macosx/extras/android/support/v4/src
```

###その他のライブラリ

Gsonのjarを以下に保存していた場合
`プロジェクト/libs/gson-2.2.3.jar`

sourceのjarを以下に保存する
`プロジェクト/libs/src/gson-2.2.3-sources.jar`

以下のファイルを作成
`プロジェクト/libs/gson-2.2.3.jar.propeties`

内容は以下

```gson-2.2.3.jar.properties
src=./src/gson-2.2.3-sources.jar
```

##個人的に必須な設定

General > Keys
Filterに`tab`と入力
`Next Tab` には `Control + 右`
`Previous Tab` には `Control + 左`
これで複数タブを開いていても、`Control + 左右`でタブの切り替えができる。
App Store申請時のXcodeでValidation Errorが出る問題（UDIDについて）


最近、UDIDを使ったアプリは申請に通らなくなりました。
なので、XcodeからArchiveして申請する時には、uniqueIdentifierを取得しているところを探して、UUIDに変更する必要があります。

探すには、ターミナルを起動して、cdでプロジェクトのディレクトリへ行き、

「find . | grep -v .svn  | grep "\.a" | grep -v "\.app" | xargs grep uniqueIdentifier」

を実行するとマッチしてくれます。

参考URL
http://stackoverflow.com/questions/16489079/apps-are-not-permitted-to-access-the-udid-and-must-not-use-the-uniqueidentifier
FuelPHP で transaction を利用する

FuelPHP で transaction を利用する方法。

## Orm 利用時には save メソッドの第2引数に true を利用したらいい

```PKGPATH/orm/classes/model.php
<?php
// (略)
	public function save($cascade = null, $use_transaction = false)
```

ってなってる。

## 自前の処理( DB::query とか)で利用するとき

```php
<?php
// (略)
        $use_transaction = true;
        if ($use_transaction)
        {
            $db = \Database_Connection::instance();
            $db->start_transaction();
        }
// (略)
        try {
            // (略)
            $use_transaction and $db->commit_transaction();
        } catch (\Exception $e) {
            // (略)
            $use_transaction and $db->rollback_transaction();
        }
```

みたいにしたらいい。
Homebrew の superenv

* [Homebrew 0.9.3](https://github.com/mxcl/homebrew/wiki/Homebrew-0.9.3)

Homebrew 0.9.3 から、`superenv` という仕組みが導入されていた模様。上記 wiki ページにはだいたい以下のようなことが書かれている。

* 実行時の環境変数 PATH は無視され、Homebrew によって再構築される
  * `/usr/local/Library/ENV/4.3:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin`
* `/usr/local/Library/ENV/4.3` は `superbin` と呼ばれる特別な `bin` パス
  * `Formula` からメソッドとして使用することができる
  * 環境によっては `/usr/local` は `brew --prefix` で読み替えること
* ビルドに関係する環境変数を消す
* `superbin` にあるコンパイラを使う
* `superbin` の詳細は `Library/Homebrew/superenv.rb` を参照
* コマンド実行時に `--env=std` オプションをつけることで `superenv` を回避可能

ニッチなツールをインストールするために自分で `Formula` を書くとか、だいぶ昔に書かれた野良 `Formula` を使うときとか、そういう時に影響がでそうな話。
組み込み関数の挙動をdeckorate拡張で置き換える

deckorate拡張は
https://github.com/t3rmin4t0r/deckorate
から落とせます。phpizeして実行すると

```php
<?php
use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator;

class User
{
    private $name = 'john';
    private $password;

    public function getName()
    {  
        return $this->name;
    }
}
        
if (deckorate("json_encode", '__json_encode')) {
    function json_encode($value, $options = 0) {
        if (is_object($value)) {
            $value = (new ClassMethodsHydrator)->extract($value);
        }

        return __json_encode($value, $options);
    }
}

var_dump(json_encode(new User)); // string(15) "{"name":"john"}"
```
http://www.php.net/manual/ja/function.runkit-function-redefine.php
に対する利点？？　小さいとか？
Rails4.0.0.rc1でutf8mb4対応がされている件

2013/05/28 追記
なぜかエラーが出るのでコードを追ってみたら、どうやら該当箇所はまだ呼ばれないらしい。
何気にRails 4.0.0 (unreleased) とも書いてあった。
テストコードを参考に、config/initializersに適当なファイルを作成、その中で

```ruby
ActiveRecord::Base.connection.initialize_schema_migrations_table
```

と書いてやると、utf8mb4チェックが走った。
本リリースには乗ってほしいな。

以下本文

iOSの絵文字をMySQLで扱うためには、utf8mb4設定をしなければならない。
Rails、MySQL環境でutf8mb4を利用するためには、文字コードの設定だけでなく、
http://qiita.com/items/7ac0c32c5264eac2b8bb
のような対応が必要だった。

Rails4 rc1がリリースされたことを知り、色々触っていたらこの件について対応がされているのを見つけた。
該当コミットはこちら
https://github.com/rails/rails/commit/8744632fb5649cf26cdcd1518a3554ece95a401b

文字コードがutf8mb4の場合、デフォルトで作成されるユニークインデックスはlimitオプションが自動的に設定される。
なので、lib/active_record/schema_migration.rbの中身を書き換えたりしなくても良い。
ただし、自前で作成するユニークインデックスは自動でlimitが設定されないので、

```ruby:20130525000000_add_index_to_users.rb
add_index :users, :email, unique: true, length: { email: 191 }
```

のように指定してやる必要はある。
ゆるふわgit ～とりあえず世代バックアップとして利用する～

# 対象
+ とりあえずgitを使ってみたい
+ ソースコードじゃないエクセルとかワードのファイルなんかを世代バックアップしたい
+ gitを知らなくても許されるのは小学生までだよねー　という生意気なやつを諌めたい
+ 「いつバージョン管理をはじめるの？今でしょ？」　と流行が終わるまでにいう側にまわりたい

という人向けです。
windows版のSource Treeを利用しますが、mac版の人もがんばればなんとかなるかもしれない。
linux派の人は多分gitとか目を瞑っていも使えるはずなのでスルー。

*注意：バックアップしたいファイルに巨大なファイルが含まれる場合、下記の手順はあまり有用ではないことがありますので注意してください*
どの程度から有用でなくなるのかは実行する環境によりますので、大体10M以上のファイルが多かったら怪しい、程度で考えてもらえればいいと思います。

# 目的
### ひとつのフォルダをgitでまるまる管理して、世代バックアップ的に利用する

この例では`C:\Users\hoge\Documents\backup`以下を全てバックアップすると仮定

## 1. source tree をインストール(gitもついてくる)
 [Source Tree](http://sourcetreeapp.com/) のページからSource Tree をダウンロードしてインストール
### インストール時に注意する箇所
+ git は embedded version を選ぶ (version 0.9.3.0 では一番上にあることを確認)
+ 途中で入力するユーザ名とメールアドレスには、絶対公開しちゃいけないやつは設定しない。(あとからでも変えれるので最悪適当なものでも・・・(´・ω・｀))
+ `Install global ignore file?` は　No
+ ssh clientは`Use Putty / Plink`
+ `Need hosting for your repositories?` は気にせずfinish

## 2. gitで管理するための設定を行う(Source Tree上での操作)

+ 左上の`Clone / New` をクリック
+ 開いたwindowの `Create New Repository` タブをクリック
+ `Destination Path` にバックアップしたいフォルダのパスを入れる

![st_clone_new.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/beca48e6-66ac-022d-785f-ac5703820616.jpeg)

## 3. 最初のバックアップを行う(コミット)
`backup.txt` `backup2.txt` をバックアップ対象に追加

+ 左上の`commit`をクリック
+ 開いたwindowの `Working Copy Changes` に表示されているファイルを`Staged Changes`にドラッグアンドドロップで移動させる(CTRL+a で全ファイルの選択が可能)
+ 数が多いと時間がかかるので全ファイルが`Staged Changes`に移動し終わるまで待つ
+ `Commit message` に`1st Commit` と入力
+ 右下の`Commit` をクリック

![st_commit1.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/cdbdf1b0-e384-b000-5f8f-d8870124bda7.jpeg)
![st_commit2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/36b8a229-ff7b-1d9e-1aca-a12b8a62b4f9.jpeg)

## 4. 以降の作業をバックアップをする
`backup3.txt の追加`、 `backup.txtの編集`

+ 基本的に 3 と同じ手順。`Commit message`に作業内容を書いておくと、あとから復元するときに楽になる。

![st_commit3.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/393e2425-7b0a-4bb3-8b22-a10829b11beb.jpeg)

![st_commit4.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/7bc974aa-0a94-5195-4507-4315905e3276.jpeg)

## 5. 復元する
### 1st コミットの直後の`backup.txt`を復元したい場合
#### *注意* 
復元を行うと管理下のファイルが全て、復元先として指定したコミットの状態に上書きされるので、
`まだよくわかんないーい` という場合は手動で必要なファイルのバックアップ、またはフォルダ全体のバックアップをとってから実行してください

+ 左側に表示されている`Branches `の中にある`master`をクリック
+ `1st commit` の左側にある　○　をダブルクリック。 
    + ファイルを上書きするけどいい？　と言った感じのアラートが表示されるので問題なければYes
    + 左側の`○`が`◎`になり、左側に`HEAD` という表示が追加され、HEADの左上にチェックマークが付いていることを確認。

![restore1.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/8800979a-1462-8717-f653-abba67fdb73e.jpeg)

+ `backup.txt`を手動でデスクトップ辺りにコピー
+ 左側に表示されている`Branches `の中にある`master`をダブルクリック
    + `HEAD`が消え、`master`の左上にチェックマークが付いていることを確認

![restore2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18789/da9220d7-ccc1-b29b-863e-d22882732a81.jpeg)

# まとめ
すでにソースコード管理にバリバリgitを使っている人から見ると、
`バックアップから復元するために念の為に手動バックアップを勧める`
とか、
`チェックアウトでコマンドライン使えば一発のにそれを使わないなんて信じられない！`
という

#### 正直ないわー　この使い方はないわー

という使い方ですが、とりあえずgitになれるための手順ということで。

というか僕はこんなかんじでやってgitに慣れました！
Xamarin.Android で Fused Location Provider(など)を使う

Xamarin.Android は [Java ライブラリから C# のラッパを生成する機能](http://docs.xamarin.com/guides/android/advanced_topics/java_integration_overview/binding_a_java_library_(.jar) がとっても強力(Binding というみたい)なので、Fused Location Provider や Geofencing など、Google I/O 2013 で発表された新機能が入った google-play-service.jar も使えるはずだ、と思い試してみました。

## monodroid-samples をベースに

Xamarin.Android のサンプル集 [monodroid-samples](https://github.com/xamarin/monodroid-samples) に、既に Google Map v2 を使うサンプルがあり、これが Google Play Service を使っているので、これを参考にします。

これね → [MapsAndLocationDemo_v2](https://github.com/xamarin/monodroid-samples/tree/master/MapsAndLocationDemo_v2) 、使い方は、

* [Xamarin.Android で Google Maps Android API v2 を使う - Experiments Never Fail](http://amay077.github.io/blog/2013/03/05/xamarin-android-using-google-maps-android-api-v2/)

をどうぞ。

## Binding の設定をいじる

Android SDK の Google Play Service をアップデートしても、Xamarin 側ですぐに ``LocationClient`` などが使えるわけではないです。
プロジェクト GooglePlayServices で、ラップする package などを設定しているため。

その設定は ``Transform/Metadata.xml`` にあるので、これを以下のように設定します。

```xml:Metadata.xml
<metadata>
	<remove-node path="/api/package[@name='com.google.android.gms.maps']/class[@name='GoogleMapOptionsCreator']" />
	<remove-node path="/api/package[@name!='com.google.android.gms.maps' 
		and @name != 'com.google.android.gms.maps.model' 
		and @name != 'com.google.android.gms.common'
		and @name != 'com.google.android.gms.location']" />
	<remove-node path="/api/package[@name='com.google.android.gms.maps.model']/class[contains (@name, 'Creator')]" />
	<remove-node path="/api/package[@name='com.google.android.gms.location']/class[contains (@name, 'Creator')]" />
		
	<attr path="/api/package[@name='com.google.android.gms.maps']" name="managedName">Android.Gms.Maps</attr>
	<attr path="/api/package[@name='com.google.android.gms.maps.model']" name="managedName">Android.Gms.Maps.Model</attr>
	<attr path="/api/package[@name='com.google.android.gms.common']" name="managedName">Android.Gms.Common</attr>  
	<attr path="/api/package[@name='com.google.android.gms.location']" name="managedName">Android.Gms.Location</attr>  
	
  	<attr path="/api/package[@name='com.google.android.gms.maps.model']/class[@name='MarkerOptions']/method[@name='position']" name="managedName">SetPosition</attr>
	<attr path="/api/package[@name='com.google.android.gms.maps.model']/class[@name='MarkerOptions']/method[@name='snippet']" name="managedName">SetSnippet</attr>
	<attr path="/api/package[@name='com.google.android.gms.maps.model']/class[@name='MarkerOptions']/method[@name='title']" name="managedName">SetTitle</attr>
</metadata>
```

``com.google.android.gms.location`` を各所に追加しています。変更前は [こちら](https://github.com/xamarin/monodroid-samples/blob/master/MapsAndLocationDemo_v2/GooglePlayServices/Transforms/Metadata.xml) 。

これだけで OK。(がここにたどり着くまでに半日くらいかかったorz)

## 使う

これでリビルドすると、この GooglePlayServices を参照しているプロジェクトで、``Android.Gms.Location.LocationClient`` などが使えるようになります。（Xamarin Studio を再起動しないとコード入力補完(Inteli先生 というのか？) に認識されないみたいですが。）
Bundlerを使ったRubyGemsの依存関係管理


## Bundlerとは
BundlerはRuby on Railsで標準採用されている、RubyGemsの依存関係管理ソフトウェアです。
SinatraやピュアなRuby(NonFramework)など、Ruby系であれば使うことが出来ます。
Ruby on Rails専用なわけではありません。

## Bundlerのインストール

```bash:Bash
gem install bundler
```
これをターミナルで実行すればOKです。
railsなどを既に入れている人はたぶん入ってるかとは思います。
2度実行しても別段害はないです。

## Bundlerの使い方

まだプロジェクトのディレクトリがない場合はディレクトリを作成しましょう

```bash:Bash
mkdir myapp
cd myapp
```

Gemfileと言われるファイルを作成します。
このファイルに、使用するRubyのGemを記載します。

```bash:Bash
bundle init
vi Gemfile
```
```bundle init``` はGemfileが存在しない場合は新しく作成してくれるbundlerのコマンドです。

Gemfileの中身です。
sourceはほぼ必ず書く事になると思うので、書いて下さい。
3行目以降は、使用するGemを書きます。

```Gemfile
source 'https://rubygems.org'

gem 'sinatra'
gem 'sinatra-reloader'
```

sinatraを使うプロジェクトの場合は、
``` gem 'sinatra'``` を記載、使って下さい。
``` gem 'sinatra-reloader'``` はsinatraをオートリロードするgemです。rubyファイルを編集した際にその内容を自動適用してくれます。

そして、このコマンドを、このディレクトリ内(Gemfileがあるディレクトリ)で実行して下さい。

```bash:Bash
bundle install
```

Gemfileに記載したgemと、そのgemを使うために必要なgemがインストールされます。

```bash:Bash
bundle update
```

とすると、gemのバージョンなどを上げてくれます。
ただし、Gemfile内で

```bash:Bash
gem "sinatra", "~> 1.4.2"
```

といったように、gemのバージョンを指定していると、アップデートされず、そのバージョンのgemが使用されます。

Bundlerの使い方自体はこんなかんじです。

## 試しに Sinatra Frameworkを使ったアプリでBundlerを使ってみます
先ほどのフォルダにファイルを作成します。

```bash:Bash
touch myapp.rb
vi myapp.rb
```

```ruby:myapp.rb
require 'sinatra'
require 'sinatra/reloader'

get '/hi' do
    "Hello World!"
end
```

上記のファイル構造(myappディレクトリ)
myapp.rb
Gemfile
Gemfile.lock (隠しファイル。```bundle install```すると作成、更新されます)


``` http://localhost:4567/hi ``` にアクセスすると、Hello World!と表示されると思います。
bundlerでsinatraがインストールされたおかげで、sinatraをrequire出来ているのです。

## エラーになったら？
bundle install や アプリ起動時などにエラーになることがあります。
その場合はエラー文に従って下さい。

この2つはよく出ます。

- 足りないgemがあるからインストールしてね
  - 足りないgemを```gem install```するか、Gemfileに追記して```bundle install```して下さい
- 既に同じgemの古いバージョンが入ってるよ
  - この場合は古いgemをuninstallして下さい
  - gem uninstall 対象のgem名
  - どのバージョンを削除するか聞かれるので、全てを選択して、新しく再度bundle installやgem installするか、いらないバージョンを選択して下さい

installは出来てるけど、アプリケーション内でrequire氏忘れていることなどもちょくちょくあります。sinatra-reloaderもですが、gemの名前とrequireするものの名前が違うこともあります。正しいrequire名は、rubygemsなどから見られるgemの説明サイト(大抵の場合はGithubに飛ぶ)から確認して下さい。


一応、このコマンドで、gemがインストール済みかを調べる事ができます。

```bash:Bash
gem list | grep gemの名前
```

## まとめ

Bundlerはとっても便利なので、ぜひ使いましょう！
gem installではなく、bundle installを使うようにしましょう。

補足: Herokuなどは、GemfileとGemfile.lockがないとデプロイ出来ないですし。
SourceTree for Windowsを使ってみた。

最近macでgitを使い始めた。
個人で使う分にはリモートリポジトリも必要なく簡単に導入できて非常にありがたい。
特にSourceTree を使えばコマンドラインを知らなくてもなんとなく操作ができてしまう。

これをwindowsもできないかなとぐぐってみると．．．
あるじゃないですか。

ということで、忘れないように初期導入についてmemoを残しておく。

1 まずclone/newボタン押す。
![WS000123.JPG](https://qiita-image-store.s3.amazonaws.com/0/23424/db4ba03b-c85b-d85b-c0a0-68e52410107e.jpeg)

2 create new repositoryタブを選択
![WS000131.JPG](https://qiita-image-store.s3.amazonaws.com/0/23424/fa2d3046-c9da-fee4-7c57-8d6339499ca7.jpeg)

3 管理したいフォルダを選択
![WS000132.JPG](https://qiita-image-store.s3.amazonaws.com/0/23424/3bdb6aff-c64d-e1a5-e00b-8624d1a1378b.jpeg)

4 選択後の画面。例ではフォルダに2つファイルが存在する。
![WS000133.JPG](https://qiita-image-store.s3.amazonaws.com/0/23424/d0b13bc9-0f9f-8b7a-d265-5dc046deedbb.jpeg)

5　commitボタンを押す。初回コミットです。
![WS000134.JPG](https://qiita-image-store.s3.amazonaws.com/0/23424/4cb7dcdb-9ff9-d2ba-cb93-dca309ac0b3c.jpeg)

6　stage changeにコミットしたファイルを移動。コミットメッセージを記入してcommitボタンを押す。
![WS000135.JPG](https://qiita-image-store.s3.amazonaws.com/0/23424/018dd995-264a-62a7-7e2f-bbb5ffff3124.jpeg)

7 初回の作業完了
![WS000136.JPG](https://qiita-image-store.s3.amazonaws.com/0/23424/f909ae89-c3b7-7b0d-eac4-8cf8bb6fa276.jpeg)

git初心者＆きちんとマニュアル読んだわけでないので間違いあるかもしれません。
間違いあったらご指摘いただけるとありがたいです。

あと気になるのはシフトjisのファイルが画面上文字化けしてるってこと。
windowsのsoure treeで管理したいのはvisualstudioのプロジェクトなので特に問題ないのかなと思うのですけど、後々問題になったら嫌だなぁ。
ctagsでPro*CファイルをC++ファイルとして認識させる方法

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20130525/1369485049">サクラエディタからctagsでPro*Cファイルにタグジャンプしたい。 - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20130525/1369485049"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20130525/1369485049" alt="はてなブックマーク - サクラエディタからctagsでPro*Cファイルにタグジャンプしたい。 - 大人になったら肺呼吸" border="0" /></a>
vimのブロック選択とインデントを使ってコメントを整形する。

例えば各行に書いてあるコメントのインデント位置を調整したい場合

```適当なコメント.cpp
  std::cout << "◆お菓子" << std::endl;     // 適当なコメント
  Singleton* obj = Singleton::getInstance();   // 適当なコメント
  obj->Introduce();
  obj->setName("妖精さん");   // 適当なコメント
  obj->Introduce();
```

まずは調整したい行を`V`などで範囲選択して置換。

```何の変哲もない置換.txt
今回はコメントの「//」を目印に置換。置き換える先はタブ文字なり、半角スペースなり任意で。
ただし、一番長い行よりもコメントが後ろに来る位十分に割り当てます。
:'<,'>s/\/\//                      \/\//
```

これを実行すると

```置換後のテキストはこうなる.cpp
  std::cout << "◆お菓子" << std::endl;                           // 適当なコメント
  singleton* obj = singleton::getinstance();                         // 適当なコメント
  obj->introduce();
  obj->setname("妖精さん");                         // 適当なコメント
  obj->introduce();
```

その後、インデントを揃えたい位置にカーソルを持って行き`<C-v>`で縦にブロック選択します。
今回は分かりやすいように`#`をブロック範囲の反転表示と見立てています。
（ブラウザのフォント等によって`#`の位置がズレて表示されますが縦一直線と思ってください。）

```こんな感じの範囲にする.cpp
  std::cout << "◆お菓子" << std::endl;         #                 // 適当なコメント
  Singleton* obj = Singleton::getInstance();   #                    // 適当なコメント
  obj->Introduce();
  obj->setName("妖精さん");                     #   // 適当なコメント
  obj->Introduce();
```

ここで**ブロック選択の範囲がインデントを揃えたい行だけに表示されていることが重要**です。
コードの部分を選択範囲に含めてしまうと、この後のインデント操作が間違って適用されるので注意。

選択範囲が決まったらブロックで表示が反転している状態で`<`コマンドでインデントを行います。
適用する際は十分に大きいインデント量`100<`などを適用してください。
（ブラウザのフォントによっては`//`の位置がズレて表示されますが揃ってるものとしておいてくださいorz）

```調整用のインデント適用後.cpp
  std::cout << "◆お菓子" << std::endl;         // 適当なコメント
  Singleton* obj = Singleton::getInstance();  // 適当なコメント
  obj->Introduce();
  obj->setName("妖精さん");                     // 適当なコメント
  obj->Introduce();
```

すると**ブロック範囲よりも左側にはインデントが適用されませんので**選択した位置でコメントが揃います。
underscoreのeachではbreakが出来ない

```javascript
var res = 0;
var nums = [1,2,3,4,5,6,7,8,9];

$.each(nums, function(i, v) {
  res = v;
  if (res === 5) {
    return false;
  }

  return true;
});

console.assert(res === 5);

_.each(nums, function(v, i) {
  res = v;
  if (res === 5) {
    return false;
  }

  return true;
});

console.assert(res === 9);

// _.someでbreak
_.some(nums, function(v, i) {
  res = v;
  if (res === 5) {
    return true;
  }

  return false;
});

console.assert(res === 5);

// _.everyでbreak
_.every(nums, function(v, i) {
  res = v;
  if (res === 5) {
    return false;
  }

  return true;
});

console.assert(res === 5);
```
nginx + foreverで、Webアプリ管理らくらく


最近、websocket(socket.io)をけっこう重点的に使ってます。

仕事以外でも先日アプリを書いてみて、公開してみよーと思ったのですが、
なるほど、apacheはwebsocket使えないんすね。

- [ApacheとNode.jsを共存させてWebSocketも通す [俺の備忘録]](http://o.inchiki.jp/obbr/50)

node-http-proxyを導入するのもなんだか面倒くさそうだったので、
いいかげんに自鯖をnginxに乗り換えることに。
現状でもnodeアプリばっかりで、ProxyPassだらけだったし。

### 環境
- さくらVPS
- CentOS

- [このころ](http://qiita.com/items/3bcdb59ab362923e640f)から変わってない

## nginx、最新版がほしい

最初は何も考えずに、「yum install nginx」でインストールしたんですが、
これで落ちてくるのは、なかなかの旧型nginxらしい。websocketつかえない!

ので、rpmを公式から落としてきてのインストールになります。

- [CentOS-6へ最新版のnginxを3分でインストールする方法 - Y-Ken Studio - 日々クリエイション](http://d.hatena.ne.jp/yoshi-ken/20120205)

あとはwebsocket使いたいアプリの設定に、3行ほど追加するだけ。

- [Nginxの最新安定版がWebSocketのリバースプロキシに対応したそうなので試してみた - きたけーTechブログ](http://kitak.hatenablog.jp/entry/2013/04/27/180255)

```
  location / {
    proxy_pass http://hogehoge;
    allow all;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  } 
```

楽! 素敵! 超はやい!

## sites-available / sites-enabledで管理したい

以前、触っていたdebian系のサーバーでは、

- /etc/nginx.conf で include /etc/nginx/sites-enabled/* しておく
- /etc/nginx/sites-available にアプリごとの設定を置く
- アプリを有効化したいときは、availableからenabledへsymlinkを張る

という構成になっていたので、これを真似してみた。

もちろんapacheでもちゃんと管理すればそうできるんですが、
アプリごとに独立した設定・管理がしやすいnginxは素敵です。

## nodeアプリ追加の流れ

また、nodeアプリはぜんぶforeverで管理・daemon化しているので、こちらもらくちん。

nodeのwebアプリを追加するときの流れは、いまこんな感じ。

1. 開発する。(portは決めておく)
2. サブドメイン切っておく (たとえば、hogehoge.fnobi.com)
3. git通して、プロジェクトをサーバー上へ (たとえば、~/service/hogehoge)
4. foreverを使って起動。 (```forever ~/service/hogehoge/app.js```)
5. nginxの設定追加。(たとえば /nginx/sites-available/hogehoge.fnobi.com)
6. symlink (```ln -s /nginx/sites-available/hogehoge.fnobi.com /nginx/sites-enabled/```)
7. nginx再起動 (```sudo /etc/init.d/nginx restart```)

ふむ、だいぶすっきり、分りやすくなった気がするけれど、
もっと効率化もできそう。
CreateJSのEventDispatcherでlistenerが真値を返すとそれ以降のlistener呼び出しがキャンセルされる

[2013-05-25時点でのCreateJSのEventDispatcher](https://github.com/CreateJS/EaselJS/blob/f807a2428071263efe5eb6ad5f8e6ce6650546be/src/easeljs/events/EventDispatcher.js)はlistenerが真値を返すと（同一ループ内の）それ以降のlistener呼び出しをキャンセルするようになっている。

以下のコードでは、2番目のlistenerが呼ばれない。

```javascript:createjs-eventdispatcher.js
var A = function() {};

createjs.EventDispatcher.initialize(A.prototype);

var a = new A();

a.addEventListener('a', function() {
	console.log(1);
	return true;
});
a.addEventListener('a', function() {
	console.log(2);
});

a.dispatchEvent('a');
```

これって一体どういう意図なんだろうか…？

CoffeeScriptではfunctionの最後の値が自動的にreturnされるので多くの場合、明示的に`false`を返さなくてはいけない。ハマった。
ボタン押したらサンキューという音声と共にハートマークがでるような動きを付けたい。jQueryとjQuery UIで。

#ボタン押したらサンキューという声と共にハートマークが上に飛びでるようにしたい

したい。インタラクションがあるのって楽しい。
押したらアクションがある。

[mikubook.com](http://mikubook.com/)に、FAVEというボタンがあるが、押すとミク様がサンキューと言ってくれる。
とても心が温まるし、テンにも昇る気持ちだ。

実装が難しいと思ったけど、jQuery、jQuery UIのおかげで簡単なお仕事。

#サンプル

[サンプルページはここ](https://dl.dropboxusercontent.com/u/614755/thankyou/thankyou.html)。
ボタンを押すとサンキューという音声とハートマークが上に飛び出る。

## 動き
こんな感じ。

![thankyou.gif](https://qiita-image-store.s3.amazonaws.com/0/3985/b4e70a59-94b9-60d3-e1fb-7b6ca959792d.gif)

# 解説

main.jsの内容

```javascript:main.js
$(document).ready(function() {
    $("button").click(function() {
      var _that = this;
      var audio = new Audio("thankyou.wav");
      if ($("img[name=heart]")){
        $("img[name=heart]").remove();
      }
      var heart = $("<img>").attr({
        name: "heart",
        src: "heart.png",
        width: "24px",
        height: "24px"
      });

      $(document.body).append(heart);

      $(heart).load(function() {
        audio.play();
        heart.position({
          my: 'center',
          at: 'center',
          of: $(_that)
        });

        $(heart).animate({
          opacity: 0.10,
          top: "-=100"
        }, 800, function() {
          $(heart).remove();
      });
    });
  });
});
```

なんのことはなく、簡単に実装できる。jQuery及びjQuery UIは良い。読み出さないといけないファイルサイズがアレな気もするが...

1. img要素を作成し、ハートマーク画像をsrc属性に設定する。
2. 初期位置は画像よ見出し後にボタンの中心位置に移動させる。
3. 画像を読み出したらthankyou.wavを再生する。
4. アニメーションはanimateメソッドで、半透明度は0.10、
5. 画像位置は100px x軸方向に上部まで移動、800ミリ秒間の間にアニメーションさせる。
6. 終了したら要素そのものを削除する。

そんな流れ。

thankyou.wavは[Audacity](http://audacity.sourceforge.net/?lang=ja)を使って自分の声をピッチ高めたり速度早めたりして加工した。
vimで検索条件に一致する行を加工する方法

ログファイルなど大量のテキストを加工する場合に置換だけでは不十分なケースがたまにありますが
加工したい行を検索条件で指定できる場合 global コマンドが役に立ちます。

```例えばこんなログ.log
May 20 00:00:00 test-main kernel: (guest)aaaaa
May 20 00:00:00 test-main kernel: (guest)bbbbb
May 20 00:00:00 test-main kernel: (root)aaaaa
May 20 00:00:00 test-main kernel: (guest)ccccc
May 20 00:00:00 test-main kernel: (root)bbbbb
May 20 00:00:00 test-main kernel: (guest)ddddd
May 20 00:00:00 test-main kernel: (root)ccccc
May 20 00:00:00 test-main kernel: (guest)eeeee
```

このログに対してrootに関する行だけ取り除きたい、といった場合、

```vimのコマンドモードでこんな風に入力する.txt
:[範囲]global/検索条件/Exコマンド
といったglobalコマンドを実行。
今回は範囲を「%(ファイル全体)」検索条件を「root」やりたい処理を「d(削除)」
globalは省略でgだけに出来るので(ヘルプ :h :global 参照)、それらを踏まえて
:%g/root/d
```

とやるとrootの行だけ削除されます。
**逆に条件に一致しない**というのがやりたければ

```条件を反転して実行する.txt
「!」をつけることで反転。rootを含まない行だけ削除したい、といった場合は
:%g!/root/d
```

のようにします。
リトルエンディアンの16進ダンプを整数にする

## 課題
`"a1b2c3d4"` のような文字列を `0xd4c3b2a1` (つまり、3569595041 ) のような整数に変換したい。
つまり、入力は 32bit 整数の、リトルエンディアンマシンにおけるメモリダンプ。
出力は、その整数。符号なし。

## ruby による実装例と逡巡

とりあえず

```ruby
def foo(s)
  s.scan(/../).reverse.join.to_i(16)
end
```

と、

```ruby
def bar(s)
  [s.to_i(16)].pack("N").unpack("V")[0]
end 
```

を最初に思いついた。
前者は正規表現があるのがなんとなく不満で、後者は配列操作が入っているのがなんとなく不満。

かといって、scan を避けて each_slice を使うと

```ruby
def baz(s)
  s.chars.each_slice(2).to_a.reverse.join.to_i(16)
end
```

長いし、途中で配列の配列になっているのがちょっと鬱陶しい。`to_a` が必要なのもくやしい。
pack / unpack をやめて、まじめにビット操作をすると

```ruby
def hoge(s)
  a=s.to_i(16)
  0.step(31,8).inject(0){|o,i|o+(((a>>i)&255)<<(24-i))} 
end
```

もっと長い。

話としては美しくない気もするけど

```ruby
def fuga(s)
  4.times.map{|i|s[6-i*2,2]}.join.to_i(16)
end
```

辺りが落としどころか。

## 今回の教訓

`map` や `inject` に比べると、`each_with_object` の綴りは長すぎる。

## 補足

関数名がいい加減ですいません。
Rubygemsのススメ | Rubyに慣れていない初心者さんへ

## Rubygemsとは？

> RubyGemsは、Ruby言語用のパッケージ管理システムであり、Rubyのプログラムと（"gem" と呼ばれる）ライブラリの配布用標準フォーマットを提供している。
gemを容易に管理でき、gemを配布するサーバの機能も持つ。
[Wikipedia : RubyGems](http://ja.wikipedia.org/wiki/RubyGems)

要は、Ruby言語で書かれたプログラムをより便利にするためのツール(ライブラリ)が簡単に使えるように配布されている場所、機能です。
使ってみないとわからないと思うので、使ってみましょう！

## Rubygems にある ActiveSupport を使ってみよう
### 今から1時間前の時間を調べて表示する(Rubygemsを使わない場合)
こんなコードで、

```1_hour_ago.rb
# 現在時刻
p Time.now
# 1時間前(60秒*60分)の時刻
p Time.now - 60*60
```

下記のような結果が得られます。

```
2013-05-25 17:24:13 +0900
2013-05-25 16:24:13 +0900
```
実行時間と、その1時間前の時間ですね。
Ruby言語では標準で時間の引き算(秒単位)が出来るので、こんなに簡単なコードで時間の引き算が出来るんです。

### 今から1時間前の時間を調べて表示する(Rubygemsを活用する場合)

```1_hour_ago.rb
# Rubygemsを使用することを明示
require 'rubygems'
# ActiveSupportを使用することを明示
require 'active_support'
# ActiveSupportに含まれる時間系の拡張機能(ライブラリ)を使用することを明示
require 'active_support/time'

# 現在時刻
p Time.now
# 1時間前(60秒*60分)の時刻
p 1.hours.ago
```

どうでしょうか？
```Time.now - 60*60``` よりも ```1.hours.ago``` の方が分かりやすく無いですか？
```Time.now - 1.hour``` などでも大丈夫です。
分かりやすいと思う方を使ってください。

RubyGemsで配布されている「ActiveSupport」というライブラリを使っています。

### Ruby on RailsはRubygemsを沢山使っているFramework
ActiveSupportはRubygems上で配布されている、Ruby言語用のライブラリです。
時間だけでなく、他にも色々な機能があります。ActiveSupport便利！
Ruby on RailsといったFrameworkではActiveSupportが標準でrequireされていますので、「Railsすごい便利！と言っている方に話を聞いてみたら、実はActiveSupportの事だった」と言ったケースもままあるかなというほどです。

たとえば、オブジェクトがからかどうか判別する
```object.blank?``` といったコマンドも、
```require 'active_support/core_ext'```
すれば使えます。つまり、Railsの機能ではなく、ActiveSupportの機能なわけです。

ActiveRecordなど、その他のライブラリーも沢山標準装備して、整えた結果が、Ruby on RailsというFrameworkだったりするわけです。


## Rubygemsには他にも便利なツールがたくさんある
Railsに標準装備されていない、RubyGemもたくさんあります。

- TwitterのAPIをRubyから超簡単に実行できるgem(ライブラリー)
[RubyGems : twitter](http://rubygems.org/gems/twitter)

- データの管理画面を自動生成するgem(ライブラリー)
[RubyGems : ActiveRecord](http://rubygems.org/gems/activerecord)
こちらは、RubyOnRailsでしか使えない(Rubyのみでは使えない)仕様です。

### 注意事項 : ライセンス
一応、ライセンスが「自由に使って良い」ものでないかどうかだけ、ホームページなどでご確認ください。ほとんどは

> Active Record is released under the MIT license.

と言った風に書いてあると思います。MITライセンスは自由に使ってOKです。

## その他のgem(ライブラリ)の探し方
- [RubyGems](http://rubygems.org/)
  - こちらのサイトで探せます
  - 日本語NGです。欲しい機能の類似の英単語などを駆使して探しましょう。
  - ただし、タイトルぐらいしか検索に引っかからなかったりするため、基本は、Googleで日本語や英語で検索するのが良いです。
- [StackOverflow](http://stackoverflow.com/)
  - プログラマ用QAサイトです。
  - 結構、「Best way to …」といった感じで、こういった実装をしたいんだけどどうするのがベスト？って質問にgemが紹介されていたりします。
- [Google](http://www.google.co.jp)
 - 英語、日本語で頑張って検索してみてください。

## まとめ
 - rubyを使ってる人はたくさんいるので、オープンソースライブラリがたくさんあるので、ガンガン使いましょう。
 - 機能を実装しようと思った時に、それがオープンソースライブラリで既にあるかどうか、探すようにしましょう
 - 探す時は、Googleで英語で探すのがオススメです。行き着く先はたいていRubyGems.orgです。
class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)のメモ


ナイーブベイズ
離散な特徴を学習させる(intが必須)

```
alpha:float, optional -> スムージングparameter(defaultは1.0)
fit_prior:boolean -> class prior probabilitiesを使うかどうか
class_prior:array-like, size=[n_classes] -> Prior probabilities of the classes
```

example

```
import numpy as np
# 0~5の間の乱数、サイズは6*100のarray([[1番目の100こ],…,[6番目の100こ]])
X = np.random.randint(5, size=(6, 100)) # 教師データ
Y = np.array([1,2,3,4,5,6]) # クラス -> X[0]はクラス1, X[2]がクラス3のような
from sklearn.naive_bayes import MultinomialNB
# ナイーブベイズクラス
clf = MultinomialNB()
#学習
clf.fit(X, Y) # MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True) が返ってくる
print(clf.predict(X[2])) # -> 3が帰ってきたらOK
```

メソッドメモ

fit(X,Y)
学習器の生成
X -> 教師データ,sparseな配列。sample数 * 特徴数となる
Y -> クラス, X[0],X[2]がクラス1, x[1]がクラス2に分類されるみたいな

get_params()
パラメーター取得({'alpha': 1.0, 'class_prior': None, 'fit_prior': True}みたいな)

predict(X)
分類を実行
X -> 横幅が特徴数のarray
返り値 -> どのclassに分類されるか

predict_log_proba(X)
各々の分類確率(log)
返り値 横幅がクラス数で要素がlog(確率)のarray

predict_proba(X)
上記のlogなしver

score(X,y)
精度の平均
fitと同じ
Pythonスクリプトからjarファイル中のクラスを直接importする

Pythonスクリプトからjarファイル中のクラスを直接importする方法です。

CLASSPATHに依存しないので、JavaとJythonが動く環境があれば
PythonとJavaの連携を簡単にパッケージ化することが可能になります。

例えば、PythonでJavaの遺産とSQLiteを同時に使いたい時などに便利です。
Jythonは標準モジュールでSQLiteをサポートしていないのでJDBCドライバが必要ですが、
直接PythonスクリプトからJDBCドライバのjarファイルを読み込めるようにすれば、
必要なファイルを放り込むだけでPythonからJavaクラスとSQLiteを使用できます。

## sys.pathをいじる

```python:test.py
import.sys
sys.path.append("/path/to/hogehoge.jar")
import Hogehoge
```
で動くよ！という情報がありましたがダメでした。
単にパスを通すだけじゃなくて、そのなかのクラスを読み込まなければいけないようです。


## ClassPathHacker

ClassPathHackerというのがひとつの解決法らしいです。
http://www.jython.org/jythonbook/en/1.0/appendixB.html#working-with-classpath

以下、sqliteのJDBCドライバをjythonから呼び出す一例です。

```python:test2.py
from java.lang import Class
from java.sql import DriverManager

class classPathHacker:
    import java.net.URLClassLoader

    def addFile(self, s):
        sysloader = self.java.lang.ClassLoader.getSystemClassLoader()
        sysclass = self.java.net.URLClassLoader
        method = sysclass.getDeclaredMethod("addURL", [self.java.net.URL])
        method.setAccessible(1)
        f = self.java.io.File(s)
        method.invoke(sysloader, [f.toURL()])

c = classPathHacker()
c.addFile("/path/to/sqlite-jdbc.jar")
jdbc_url = "jdbc:sqlite:/path/to/database.db"
driver = "org.sqlite.JDBC"
Class.forName(driver).newInstance()
con = DriverManager.getConnection(jdbc_url)
# 以下ごにょごにょ
```

よくわかりませんが、URLClassLoader.addURLを無理矢理アクセス可能にして
クラスを読み込んでるみたいです。
flipを使って束縛する引数の順番を入れ替える

関数に部分適用を行う際、引数の順番を入れ替えたいときがある。

hoge(arg1, arg2)
という関数に対してarg1より先にarg2を束縛したい。その場合はfilpを使うと便利


```javascript
//カリー化関数
function curry( orig_func ) {
        var ap = Array.prototype,
        args = arguments;
        
        function fn() {
                ap.push.apply( fn.args, arguments );
                
                return fn.args.length < orig_func.length
                ? fn
                : orig_func.apply( this, fn.args );
        };
        
        return function() {
                fn.args = ap.slice.call( args, 1 );
                return fn.apply( this, arguments );
        };
};


//引数のフリップ
function flip(fn) {
  return function() {
    var args = Array.prototype.slice.call(arguments);
    // flip arguments when called
    return fn.apply(this, args.reverse());
  };
};


//出力関数　
function Log($obj, str){
    $obj.html(str);
}


//引数をフリップさせることで、jQueryオブジェクトが無くても先に文字列を関数に束縛できる
var cLog = curry(flip(Log) , 'test'); 
//jQueryオブジェクトを関数に渡す
cLog($('body'));

```
jQueryでクリックされた要素が何番目か取得する


イベントリスナーのコールバックの中でクリックされた要素が何番目の要素か知りたい!
そういうときに役立つTipsです。

```html
<ul>
  <li class="some-item">hoge</li>
  <li class="some-item">foo</li>
  <li class="some-item">bar</li>
</ul>
```

こんな感じのHTMLがあり、`li.some-item`要素がクリックされたときに何番目の要素かをjQueryを使って知りたいとします。
そんなときはjQueryの`index`メソッドを使いましょう。

```javascript
$('li.some-item').on('click', function(){
  var index = $('li.some-item').index(this);

  console.log(index + 'th item clicked!');
});
```

簡単ですね!
インデックスは配列と同じで`0`から始まるということに注意してくださいね。

__参考文献__

- [jQuery API Documenatation | .index()](http://api.jquery.com/index/)
Xmonad のウィンドウ選択を dmenu インターフェイスで行う

以下のコマンドを使えば，dmenu のリストにウィンドウの一覧が表示され，選択したウィンドウにフォーカスすることができる．

```
$ wmctrl -a "$(wmctrl -l | awk '{print $4}' | dmenu)"
```
CentOS 6.3にVim 7.3をインストールする


CentOS 6.3のyumでインストールできるVimが7.2系なので最新版の7.3系をソースからインストールします。

## 方針
以下の方針でインストールします。

- /usr/local/bin/vim にインストールする(--prefixオプション)
- 日本語(マルチバイト)に対応する(--enable-multibyteオプション)
- ほとんどの機能を有効にしてコンパイルする(--with-featuresオプション)
- スクリプト言語インターフェースは利用しない(--enable-xxxxinterpオプション)

## 準備

最新のソースコードを入手するために[mercurial](http://mercurial.selenic.com/)を使います。アーカイブファイル(tar)をダウンロードしてパッチを当てる方法もありますが、バージョン管理を使うほうが楽なので、リポジトリからチェックアウトします。

```bash:bash
$ yum install mercurial
```

などで`hg`コマンドが使える状態にしておいてください。

また、コンパイルのために必要なパッケージをインストールします。

```bash:bash
$ yum install ncurses-devel
```

## 1. ソースコードを入手する

[vimのリポジトリ]("https://vim.googlecode.com/hg/")から最新のソースコードをチェックアウトします。

```bash:bash
$ cd /usr/local/src
$ hg clone https://vim.googlecode.com/hg/ vim
```

特定のリビジョン(バージョン)が使いたい場合はさらに以下のコマンドを実行してください。

```bash:bash
$ cd /usr/local/src/vim

# tagの確認
$ hg tags

# 7.4.20を使いたい場合
$ hg update v7-4-020
```

## 2. コンパイル & インストール

必要なオプションを付けてコンパイルし、インストールします。

```bash:bash
$ cd /usr/local/src/vim
$ ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local
$ make
$ make install
```

## 3. 動作確認

```bash:bash
$ vim
```


## 参考
- [install vim 7.3 on centos, debian, arch etc.](https://gist.github.com/cfddream/1150782)
- [CentOSでVim7.3をビルド、インストールする - でぶろぐ](http://hnsta.hateblo.jp/entry/2012/01/19/013226)
Xmonad でコマンドラインからウィンドウを操作する

xmonad.hs に以下のような設定を加えれば，wmctrl が使える．

```hs
import XMonad
import XMonad.Hooks.EwmhDesktops

main = xmonad $ ewmh defaultConfig {
       ...
```

挙動がおかしい操作もあるが，ウィンドウのフォーカス程度であれば十分使用可能．
VMWareのゲストイメージ媒体拡張方法

# VMWareのゲストイメージ媒体拡張方法
<a href="http://gparted.sourceforge.net/livecd.php">GParted -- Live CD/USB/PXE/HD</a>

## 経緯
VMWareで仮想イメージを管理していたのですがいろいろ詰め込んでいっぱいになってしまったのでディスクイメージを拡張することとなりました。その手順などメモします。

## ディスク拡張
メニューから仮想マシンの設定を編集する→ハードディスク→ユーティリティ→拡張
で容量を設定してください。拡張すると未割り当て領域として仮想OSに追加されます。
しかしこのままではOSに認識されないため、ゲストのほうで未割り当て分をマージする作業が発生します。WindowsVista以降ではディスクの拡張がゲスト起動後直接できます（標準搭載の機能でマージできます）。

・WindowsVista以降
コントロールパネル→管理ツール→コンピュータの管理→ディスクの管理
で開くと未割り当て領域があるのでそれをマージします。
操作自体は単純なため割愛します。設定後、リブートすると適応されています。


・Linuxの場合
ライブCD系のディストリから本領域にマージするのが簡単だったので今回はこれにしました。他に方法がわかる方、おしえてください。


## BIOS起動
VMWareではブートするスピードが速いのでF2などで起動媒体を選択するのがほぼ無理です。
そのため、設定ファイルを直接エディタで書き換えます。仮想マシンの構成ファイル (.vmx)をテキストエディタで開き、以下の文字を追加してBIOSでのブートを指定します。


```xml:

bios.forceSetupOnce = "TRUE"

```

これにより、次に仮想マシンを起動するときに、自動的に BIOS が起動します。その後、この構成オプションは FALSE に戻ります。仮想マシンで BIOS を起動する場合は、毎回オプションを TRUE に設定する必要があります。 また、重要なことはVMWareがROMを開いた状態でテキストエディタで編集をかけると、VMWare側が元に戻そうとすることがあるので必ず、読み込まない状態で修正をかけてください。

修正後、VMWare側で読み込み直し、ゲストのCD設定でディスクイメージにライブCDを指定します。ゲストを立ち上げるとBIOSが立ち上がるので、ブートの優先順位をHDDよりCDを上にします。＋キーで優先順位が変わります。F10で変更点を保存しブートします。


## ディスク領域拡張
今回は、GPartedのディスクユーティリティで領域を拡張しました。
他のブートCDでも可能です。またVista以前のWindowsでもこれでいけます。
対象のパーテーションに鍵アイコンが表示されているとロックしてある意味なのでまずそれを右クリックからDeactivateにして解除します。すると本体を未割り当て領域にマージできるようになります。他のライブCDでもだいたいこんな感じだと思います。


## おわり
容量を追加してもディスクイメージはひとつとして認識されていました。
逆に小さくする場合はよくわかりません。
VineLinuxで簡単LAMP環境構築

# VineLinuxで簡単LAMP環境構築
<a href="http://vinelinux.org/">VineLinux</a>

## なぜ、VineLinux？
開発ディストリビュータが日本のため、パッケージをインストールすればデフォルトで日本語最適化がほどこされています。設定ファイルをとくにいじらなくても動作に問題ないなどのメリットがあります。UTF-８がデフォだったと思います。Ubuntu ServerやCentなどではMySQLあたりの言語設定をしなくてはいけないので文字化けが発生する場合があります。当方数年前にやったことなので現在は不明ですが、基本海外のディストリビューションだと、細かな箇所がローカライズされておらず、構築した後から、修正箇所をググったりします。その点、Vineはローカライズを細かい箇所までチューニングされているため大変便利です。また、パッケージ管理にapt-rpmに対応しているため、依存関係で躓くことがありません。動作リソースも少なく、Ubuntuほどかかりません。しかも、RPM系のCentの知識が役に立つというメリットがあります。なにより検索した際の情報量が多いので初めてサーバーを構築しやすい点があげられます。更新もUbuntuなどにくらべ頻繁でないのでバージョンの差異を感じず構築できます。



インストールコマンドは、

```sh:

# apt-get install php5 php5-apache2 php5-pear MySQL-server MySQL-client
# /sbin/update-alternatives --config apache2

# chkconfig apache2 on
# chkconfig mysql on

```

apt-get update を最初にしておきます。
続いてLAMPをインストール。
続いて、apache2 MPM の設定コマンド（/sbin/update-alternatives --config apache2）で
* 2 /usr/sbin/apache2.prefork

を設定してworkerからpreforkに変更してください。
これをしないと環境によってはPHPが動作しないようです。
またchkconfigで各サービスに登録してサーバー立ち上げ時に自動で起動するようにします。


## 日本語ディレクトリの変更
SSHなどでログインすると日本語が文字化け、かつcdでの遷移が面倒なのでプリセットされている日本語ディレクトリを以下のコマンドで英語表記に切り替えます。


```sh:

$ LANG=C xdg-user-dirs-gtk-update
# LANG=C xdg-user-dirs-gtk-update

```


## おわり
初期設定ではUTF-８に設定されているため、文字コードを変更したい場合などはそのつど設定ファイルを書き換えてください。PHP、MySQL、Apacheなどの文字コードが統一されてないと化けるのでこの点の手間だけでも踏まえると最初からローカライズされているVineLinuxはとても使いやすいと思います。
Cucumberでテストを書くときのポイント

## はじめに
* Cucumberでテストを書く場合、featureファイルとstepファイルをそれぞれ工夫する必要がある
* ここではこんな風に工夫して書いたらいいよと思うものを書き残していく

## featureファイルの工夫
* ①同じようなシナリオを複数書くような場合、シナリオアウトラインを使う

```
# シナリオだけで書く場合
シナリオ: Facebookにログインする
　前提 "Facebook"にログインできるアカウントを用意する
　もし "Facebook"のログインページを表示する
　かつ ログインする
  ならば "Facebook"にログインできる

シナリオ: Twitterにログインする
　前提 Twitterにログインできるアカウントを用意する
　もし "Twitter"のログインページを表示する
　かつ ログインする
  ならば "Twitter"にログインできる

-------------------------------------------------------

# シナリオアウトラインで書く場合
シナリオアウトライン: SNSにログインする
　前提 "<SNS>"にログインできるアカウントを用意する
　もし "<SNS>"のログインページを表示する
　かつ ログインする
  ならば "<SNS>"にログインできる

　例:
　　|SNS     |
　　|Facebook|
　　|Twitter |
```

* ②表(table)を使う
 * featureファイルの見易さをあげるワザの1つ
 * 受け取ったtableはstepファイルからtable.hashesで取り出せる

```
# 表を使わないで書く場合
もし 某サービスに"1MB"の"PNG"ファイルを"2"つアップロードする
かつ 某サービスに"5KB"の"JPG"ファイルを"3"つアップロードする

# 表を使って書く場合
もし 某サービスにファイルをアップロードする:
　| ファイルサイズ | ファイルの種類 | アップロード数 |
　| 1MB　　　　　　| PNG　　　　　 | 2　　　　　　　|
　| 5KB　　　　　　| JPG　　　　　 | 5　　　　　　　|
```

## stepファイルの工夫
* ①キーワードだけ違う似たようなステップを定義する場合は、正規表現のマッチングを使う
 * 1つのステップで書ける

```ruby
# (例１)
# 正規表現を使わずベタに書く場合
When /^Facebookにログインする$/ do
end

When /^twitterにログインする$/ do
end

# 正規表現でのマッチングで書く場合
When /^"([^\"]*)"にログインする$/ do |sns|
end

-------------------------------------------------------

# (例２)
# 正規表現を使わずベタに書く場合
When /^Facebookにアカウント登録されているユーザを準備する$/ do
end

When /^Facebookにアカウント登録されていないユーザを準備する$/ do
end

-------------------------------------------------------

# 正規表現でのマッチングで書く場合
When /^Facebookにアカウント登録されてい(る|ない)ユーザを準備する$/ do |regist|
end
```

* ②50音順で定義する
 * どこに書いたか迷子にならなくて済む
 * 似たようなキーワードを使って書いたステップが近くにあるとステップの追加/変更も楽チン
* ③hookを利用する
 * hookは以下のように書くとシナリオやステップの前後に処理を挟める
 * hookはfeatures配下ならどこでも定義できるけど、features/support/hooks.rbに書くのがおすすめらしい

```ruby
# Before : シナリオの前
# After : シナリオの後
# AfterStep : ステップの後

Before do
  puts "シナリオの前にする処理"
end

Before("@hoge") do # タグ指定もできる
  puts "指定したタグがついたシナリオの前にする処理"
end
```

* ④できるだけ小さなステップを作る
 * ボリュームのあるステップ作ってしまうと手を加えないとこのままでは使えないという事態が発生する
 * 小さなステップにしておけば、そのまま使いたい時も新たなステップを定義したい時もコピペだけで済む
 * 再利用性が高いという特性を活かす最大のポイント

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください