OmniAICreator/Qiita-1.07M huggingface dataset:
さくらのレンタルサーバでデータベースを自動的にバックアップして、いざというときに復元する


#背景
下記はさくらのレンタルサーバの、「データベースの設定」の注意事項です。ご覧のとおり、データベースを削除した場合、 __復旧できない__そうです。

![スクリーンショット 2014-06-24 22.13.01.png](https://qiita-image-store.s3.amazonaws.com/0/46544/8728a269-74ce-d497-5abc-78cdf48bb2d5.png "スクリーンショット 2014-06-24 22.13.01.png")

このデータベースの __管理ツール__ですが、下記のような UI で、老眼の進んだ私は管理ツールにログインしようとして、時々まちがえて「削除」をクリックしそうになるのですが、 __今日、ついに本当に間違えて削除してしまいました ^^;;;__ 

![スクリーンショット 2014-06-24 22.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/46544/9d3d954d-d5b5-065e-d4ad-2f320d81cda4.png "スクリーンショット 2014-06-24 22.53.10.png")


- [ライブスター証券「データベースサーバ上の全てのデータを削除してしまいました」](http://fesoku.net/archives/5026968.html)
- [間違って10万人の顧客DB消しちまったwwwwwwww - MC ...](http://mc.matome-complate.com/archives/3673068.html)
- [データベース消しちゃいました。](http://ma9no.com/?p=6)

なんか世の中、「データベース消しちゃった」系の事故が頻発してますね。徹夜作業中に delete * (while句なしで) してしまって、朝イチの飛行機で北海道に逃げる、という話も読んだことが有る気がします ^^;;; truncate だったかな？

もちろん、^^;;; なんて冷や汗で笑ってられるのは、 __データベースのバックアップを定期的にとってある__からでして、データベースというものは消えてしまうのが自然、とぐらいに考えて、多重化するなり、Dynamo DB にするなり、もしくは __バックアップの取得を自動化しましょう__

# バックアップ取得の自動化
MySQL のバックアップは mysqldump コマンドで取得します。
下記のシェルで２世代までとってます
下記で「アカウント」「パスワード」「データベース」は、みなさんの環境でのさくらのアカウントとパスワード、及び作られたデータベースの名前に置き換えてください

```BASH:mysqldump.sh
cd /home/アカウント
mv dump.sql dump.old.sql
/usr/local/bin/mysqldump -Q -h mysql419.db.sakura.ne.jp -uアカウント -pパスワード データベース名 > dump.sql 2> dump.error.txt
```

次に、このシェルを下記のように cron で例えば毎時0分にとるように設定します。ちなみにエメラルド色のブロックで消してある部分は私のアカウント名になりますので、皆様のアカウントで置き換えてください。別の場所においてもよいですが、ホームディレクトリがわかりやすいと思います

![スクリーンショット 2014-06-24 22.55.36.png](https://qiita-image-store.s3.amazonaws.com/0/46544/ccabf3d3-c2a0-00da-5208-442a08b5853b.png "スクリーンショット 2014-06-24 22.55.36.png")

これで、一時間毎に dump.sql と、さらに一時間前の dump.old.sql のが取得されます。特に問題がおきなければ dump.error.txt は 0バイトのままです

#バックアップからの復元
復元は、ものすごく簡単です。まず、FTP で dump.sql をダウンロードしておきます
つぎに、管理ツールで消してしまったデータベースと同じ名前の空のデータベースを作ります



![スクリーンショット 2014-06-24 23.02.13.png](https://qiita-image-store.s3.amazonaws.com/0/46544/266fb6c1-f0a1-4aa4-2773-28a75ab3ddbc.png "スクリーンショット 2014-06-24 23.02.13.png")

作ったデータベースを管理ツールで開き、「 __インポート__」を選択、インポートするファイルとして先ほどダウンロードしておいた dump.sql を指定し、「 __部分インポート__」のチェックボックスを __外し__ 右下の「 __実行する__」をクリックします

__これだけで、消してしまったデータベースは復活します__

![スクリーンショット 2014-06-24 23.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/46544/cbf299be-910a-ec81-894b-b8f98ecaa1cb.png "スクリーンショット 2014-06-24 23.39.25.png")


#感想
いやぁ、正直焦りましたというか、本当になんか意識がすーっとなくなるような感覚になりました ^^;;;
本当に __とっててよかったバックアップ__
ApacheのログのTimeZoneがおかしい時

```bash:+0400だと！？
[24/Jun/2014:17:11:52 +0400]
```

/etc/localtimeの設定がミスっている。

```bash:
# mv /etc/localtime{,.bak}
# ln -s /usr/share/zoneinfo/Japan /etc/localtime
# reboot
```

```bash:+0900にできた。
[24/Jun/2014:22:38:35 +0900]
```
Visual Studioのビルド時にプロセスが実行したままで失敗するのを何とかする

ビルド前イベントでプロセスを終了させます
終了させるプロセスのイメージ名はプロジェクトごとに書きかえてください

## C# 

メニュー > プロジェクト > プロパティ > ビルド イベント > ビルド前に実行するコマンド ライン

```
taskkill /f /im Test.exe || exit /b 0
```

![cs.png](https://qiita-image-store.s3.amazonaws.com/0/19593/cec0592e-3573-3bd1-f52e-88cca5191ea2.png)

## C++

メニュー > プロジェクト > プロパティ > 構成プロパティ > ビルド イベント > ビルド前イベント > コマンド ライン

```
taskkill /f /im Test.exe || exit /b 0
```

![cpp.png](https://qiita-image-store.s3.amazonaws.com/0/19593/ec22485d-758f-2882-6e9d-02ef26b0eda5.png)
apitraceを使ってみる(まだよくわかっていない)


## 導入

たぶんhomebrewでQtが入っていないとうまくいかないかも

```console
$ git clone git@github.com:apitrace/apitrace.git
$ cd apitrace
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ make install
```

```console
$ apitrace
```

で何かしらメッセージが出れば成功

## 実行

適当なプログラムをapitrace経由で実行してみる

- `--api`は、`gl`か`glsl`を指定する模様。
- `--output`で上の階層を指定しているのは、glfwの仕様で初期化時に`*.app/Contents/Resources/`が作業パスになる為。そうすると `dump.trace`に結果が出力される。

```console
$ apitrace trace --api=gl --output=../../../dump.trace  ./graphicsExampleDebug.app/Contents/MacOS/graphicsExampleDebug
```

## 観測
上で出力したtraceファイルを開いてみる。`qapitrace`コマンドでGUIが立ち上がる。

```console
$ qapitrace ./dump.trace
```

![Screen Shot 2014-06-24 at 22.15.18.png](https://qiita-image-store.s3.amazonaws.com/0/38051/21afcc2d-46fd-0f2a-fafd-0ea1f0f93558.png "Screen Shot 2014-06-24 at 22.15.18.png")

こんな感じ。見た所OpenGLのコマンドがガリガリ書かれている模様。

CPU/GPU内で実行されている処理のプロファイリングをしたり、任意の地点でのGLコンテクスト内部状態を見たりとかができる臭い。

![Screen Shot 2014-06-24 at 22.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/38051/dc9adec2-2767-8d3c-e6c4-91aabae74548.png "Screen Shot 2014-06-24 at 22.18.05.png")

traceした結果はプレイバックできたり、シェーダー、テクスチャものぞけるみたい。

## 結果
クソ便利そう
codeigniter で認証機能を付けるための参考リンク


# やりたかったこと
codeigniter でSNSみたいなのを、さくっと作りたいな〜と思っているので、ライブラリとか調べてみました。

# 比較
Codeigniterにはどんな認証ライブラリがいいの？
いくつか比較してあります。

http://stackoverflow.com/questions/346980/how-should-i-choose-an-authentication-library-for-codeigniter/476902#476902



# 通常ログイン機能

##tank Auth
http://qiita.com/shori0917/items/786f84c518d6e353aedf

http://program-drum.blogspot.jp/2012/04/codeignitertankauth.html

http://konyukhov.com/soft/tank_auth/
https://github.com/TankAuth/Tank-Auth

##community auth
http://community-auth.com/



# ソーシャル連携ログイン

##Hybridauth
facebook, twitter 等のアカウントを利用してログインできる。

http://hybridauth.sourceforge.net/

http://webcake.no003.info/webdesign/hybridauth.html

##opauth
http://opauth.org/

英語だけど、この記事が分かりやすそう。
http://www.sitepoint.com/integrating-open-authentication-using-opauth/

## facebook sdk
http://core-tech.jp/gijutsublog/2013/05/08/1401
http://manablog.org/codeigniter-fb-login/

# まとめ
普通のログイン認証をつくるならTank Auth が定番で、一番使えるみたい。ソーシャル連携させる時は、どうするのかな。
envconsulのビルド方法と動作確認

## 概要
現時点で envconsul バイナリは配付されておらず、動作の確認を行うには、Go 言語のコードを取得し、ビルドする必要があります。以下、ビルドし、簡単にテストするまでの手順をまとめます。

## envconsul とは？
`envconsul` は、環境変数の取得・設定を行うためのツールです。 Consul のキーバリュー・ストア（ 以下 KVS ）と連携し、リモートの KVS 上のデータを参照したり、データの変更をトリガに任意のコマンドを実行する事ができます。[envconsul](https://github.com/hashicorp/envconsul) の開発を行っているのは、Vagrant や Serf、Consul を提供している Hashicorp 社です。

## 事前準備
予め、各 OS 環境において、Go 言語の開発環境が必要です。
次に、Consul と連携する必要があるので、Consul のセットアップと、HTTP インターフェースを有効化する必要があります（デフォルトで、Port 8500 が利用出来ます）。

## envconsul のビルド
README 等には特に書かれていませんが、`consul-kv` も別途必要になります（先に envconsul をビルドしようとしても、エラー 「watch.go:13:2: cannot find package "github.com/armon/consul-kv」が表示されてしまいます）。
また、作業にあたり、環境変数が `export GOPATH="$HOME/go"` と指定されているものとして、以下進めます。

作業用のディレクトリを作成します。

```
$ mkdir -p ~/go/src/github.com/armon
$ cd ~/go/src/github.com/armon
$ git clone git@github.com:armon/consul-kv.git
```
これで、consul-kv のコードが展開されます。

次に envconsul のコードを取得します。以降の作業場所は、どこでも構いません。
```
$ cd ~/src/
$ git clone git@github.com:hashicorp/envconsul.git
$ cd envconsul
$ go build
```
ビルドが終わると、作業ディレクトリ内に `envconsul` のバイナリが作成されます。

実行すると、次のようにヘルプが表示されます。

```
$ ./envconsul
Usage: envconsul [options] prefix child...

  Sets environmental variables for the child process by reading
  K/V from Consul's K/V store with the given prefix.

Options:

  -addr="127.0.0.1:8500": consul HTTP API address with port
  -dc="": consul datacenter, uses local if blank
  -errexit=false: exit if there is an error watching config keys
  -reload=false: if set, restarts the process when config changes
  -sanitize=true: turn invalid characters in the key into underscores
  -upcase=true: make all environmental variable keys uppercase
```

## 動作テスト

`envconsul` の書式は、次の通りです。

```
$ envconsul -addr="ホスト名:ポート番号" prefix名 実行コマンド
```
`prefix名` とは、Consul の KVS 上の `キー名` の事です。また、オプションで `-reload` で、KVS の対象キーの値が変更したタイミングで、指定した実行コマンドに新しい環境変数を引き渡します。

Prefix に当たるデータは、Consul の WebUI から作成します。`http://ホスト:8500/` にアクセスすると、UI が表示されます。上のメニューの `Key/Value` を押して、画面を切り替えます。

次に、'Create Key' で`test/enabled`、値を`false`として、`create`を押します。これは、prefix `test` の、キー（環境変数） `enabled` に対する値が `true` であるという指定です。

このデータを envconsul で参照するには、次のようにします。

```
$ envconsul -addr="sakura1.pocketstudio.net:8500" test env | grep ENABLED
ENABLED=true
```

このあとは、WebUI で値を変えると、その情報が反映することが確認できます。

次は、`-reload` を試します。以下のコマンドを実行した後、再び WebUI で値を操作すると、そのタイミングでコマンドが実行できます。

```
$ envconsul -addr="sakura1.pocketstudio.net:8500" -reload test /bin/sh -c "
uptime; /bin/sleep 1d"
 22:15:51 up 90 days,  2:15,  1 user,  load average: 0.36, 0.52, 0.49
 22:15:58 up 90 days,  2:15,  1 user,  load average: 0.31, 0.50, 0.49
 22:16:01 up 90 days,  2:15,  1 user,  load average: 0.31, 0.50, 0.49
```
この例では uptime を実行しましたが、任意のプログラムを実行させることができます。また、環境変数の値も、reload 時には、常に最新のものを引き渡せすことが可能です。

## 参考
* envconsul
 * https://github.com/hashicorp/envconsul
* Twelve-Factor Applications with Consul - HashiCorp
 * http://www.hashicorp.com/blog/twelve-factor-consul.html
rspec雑感

# rspec雑感

## 入門書として参考になる書籍

###  Everyday Rails - RSpec による Rails テスト入門
https://leanpub.com/everydayrailsrspec-jp

* テストは信頼できるものであること
* テストは簡単に書けること
* テストは簡単に理解できること

何か学びたいことがあるときは、Webサイトや電子書籍からコピー&ペーストするのではなく、自分でコードをタイピングした方が良い

### パーフェクトRuby on Rails
http://gihyo.jp/book/2014/978-4-7741-6516-5

## スペックの高速化

springを使う

https://github.com/rails/spring

http://qiita.com/yanap/items/70e30ba49d5456100faa

## 書き方のひな形的なのがほしいとき

https://recompile.net/posts/how-to-write-unit-test-with-rspec.html

* フォーマット

```rb
describe 'テスト対象' do
  context '状態' do
    describe 'テスト対象メソッド' do
      context '与える入力' do
        it '期待する出力'
      end
    end
  end
end
```

上記のひな形で書くこと意識づけて書くとitに書く説明も完結になり
.rspecに--format documentationを設定して実行したときにわかりやすいスペックになる

## expect記法のマッチャーに何があるかわからなくなったとき

https://github.com/rspec/rspec-expectations#rspec-expectations--

## specの書き方でベストプラクティス的な書き方がわからなくなったとき

http://betterspecs.org/jp/

## モックとスタブについて

スタブは、あるオブジェクトのメソッドが呼び出された時に、特定の戻り値を返すようにしたい場合に使う。
モックは、あるオブジェクトのメソッドがある引数で呼ばれたときに、特定の戻り値を返すようにしたい場合に使う。

https://github.com/rspec/rspec-mocks
http://nabewata07.hatenablog.com/entry/ruby/rspec/mocks2-14/syntax-and-spy
http://morizyun.github.io/blog/rspec-model-controller-ruby-rails/
go getしたライブラリをIntelliJ IDEAの補完候補に追加するには


SDKのclasspathに$GOPATH/srcを追加する必要がある。

0. File -> Project Structure を開く
0. +ボタンから$GOPATH/srcにあたるディレクトリをclasspathに追加する
0. File -> Invalidate Caches / Restart -> Invalidate and Restart を選択

IntelliJの再起動が完了したら補完候補に追加されているはず。

![スクリーンショット 2014-06-24 21.49.26.png](https://qiita-image-store.s3.amazonaws.com/0/15757/cb6a10af-720d-9ab6-d055-ceaf701d3fe2.png "スクリーンショット 2014-06-24 21.49.26.png")
dropbox/json11でC++でJSONを扱う

# 概要

[dropbox/json11](https://github.com/dropbox/json11)はC++11対応のJSONライブラリで，初期化リストなどを使っていい感じに書けます．例えば，

```json
{
    "name": "Nana Mizuki",
    "age": 34,
    "songs": [
        "ETERNAL BLAZE",
        "innocent starter"
    ]
}
```

というJSONは，json11では


```cpp
json11::Json json_dayo = json11::Json::object {
    {"name" , "Nana Mizuki"},
    {"age"  , 34},
    {"songs" , Json::array { "ETERNAL BLAZE", "innocent starter" } },
};

```

のように書けます．いい感じです．使い方は`test.cpp`を見ればわかるかと思います．


## std::istreamからJsonオブジェクトに

JSONをパースしてjson11のオブジェクトにするには，`json11:Json::parse`関数を使いますが，引数が`std::string`か`const char*`となっています．文字列で与えるということです．

`std::istream` (cinとかifstreamとか)からオブジェクトを作るにはストリーム→文字列→Jsonオブジェクトという流れになります．例えば

```cpp
std::string buf, tmp;
while(std::getline(is,tmp) buf += tmp;          //isはstd::istream
json11::Json json = json11::Json::parse(buf);
```

とか書いとけばいけます

# g++でのコンパイル

使い方の例が書いてある`test.cpp`が同梱されていますが，`Makefile`を見るとコンパイラが`clang++`になっているので，
ここでは`g++`で`make`する場合の注意を書きます．

- `Makefile`を次のように書き直す

    ```Makefile
    test: json11.cpp json11.hpp test.cpp
      g++ -O -std=c++11 json11.cpp test.cpp -o test -fno-rtti -fno-exceptions
    ```

- `test.cpp`に次を追記

    ```test.cpp
    #include "cstring.hpp"
    ```
  - `cstring`をincludeしないと，`test.cpp|92 col 66| error: 'memcmp' was not declared in this scope`とか言われます．

- `test.cpp`の`void parse_from_stdin()`という関数がうまく機能しないので，次のように書き換える．
  - before

    ```test.cpp
    string buf;
    while (!std::cin.eof()) buf += std::cin.get();
    ```
  - after

    ```test.cpp
    string buf;
    string tmp;
    while (std::getline(std::cin, tmp)) buf += tmp;
    ```
  - cin.getって位置文字ずつとるしなんかヤダなぁ・・・
[Backbone.js] 外部ファイル化したHTMLテンプレートを動的に読み込む

## 作成動機
 * jsRenderとかjquery.templateとか使うさいに、HTMLテンプレートファイルを外部化したかったので。
 * Backbone.jsに内包したかったので。

## Model の定義

```coffeescript:sample.model.coffee
class ModelBase extends Backbone.Model
  defaults:
    ds:       "/" #← 必要性はあまりないです
    webroot:  "/project/app"
    apiroot:  "/project/api"
    tmplroot: "/js/template"
    resJson:  []
    resTmpl:  ""

  urlRoot: (type) ->
    switch type
      when "web"  then @get "webroot"
      when "api"  then @get "apiroot"
      when "tmpl" then @get "tmplroot"
      else             @get "ds"


class TemplateModel extends ModelBase
  defaults: ->
    _.defaults {}, _.result ModelBase.prototype, "defaults"

  url: ->
    @urlRoot("web") + @urlRoot("tmpl") + @urlRoot() + @get("tmpl") + ".tmpl"

  sync: (method, model, options) ->
    params = _.extend
      async:    false
      url:      @url()
      dataType: "text"
      , options
    Backbone.sync method, model, params

  parse: (res) ->
    resTmpl: res
```

## View の定義
インクルードされるテンプレート要素のidを``tmpl_[file_name]``としています。


```coffeescript:sample.view.coffee
class TemplateView extends Backbone.View
  el: "body"

  initialize: ->
    @listenTo @model, "change:resTmpl", @render

  render: ->
    # jsRender を使う場合
    @$el.append '<script id="tmpl_' + @model.get("tmpl") + '" type="text/x-jsrender">' + @model.get("resTmpl") + '</script>'
    # jquery.template を使う場合はtype="text/x-jquery-tmpl"としてください

  load: (_f) ->
    @model.set tmpl:_f
    @model.fetch()
```

## インスタンス生成
この場合、``sample_list.tmpl``というテンプレートがインクルードされ
idは、``#tmpl_sample_list``となります。

```coffeescript:sample.default.coffee
mLoader = new TemplateModel
vLoader = new TemplateView model:mLoader
tmpl = [
  'sample_list'
]
vLoader.load t for t in tmpl
```

## HTML
JavaScriptを読み込みます。

```html:sample.html
<script src="jquery.min.js"></script>
<script src="underscore-min.js"></script>
<script src="backbone-min.js"></script>
<!-- <script src="jquery.tmpl.js"></script> -->
<script src="jsrender.min.js"></script>
<!-- 以下、読み込み順序大切 -->
<script src="sample.model.js"></script>
<script src="sample.view.js"></script>
<script src="sample.default.js"></script>
```


## テンプレートファイル
拡張子を``TemplateModel``で指定した拡張子と揃える。（自分の場合は``.tmpl``）
テンプレートファイルを格納するディレクトリは、``/project/app/js/template/``です。

```html:sample_list.tmpl
<!-- jsRender の場合 -->
  <h4>検索結果 <span class="text-xs text-muted">{{:total_count}}件</span></h4>
  <ul>
{{for data_list}}
    <li>[{{:user_number}}] {{:user_name}}
{{/for}}
  </ul>
```

## 動き
 * ページが読み込まれると、``body``要素の最後にテンプレートファイルがインクルード（アペンド）されます。
 * テンプレートが複数ある場合は、``sample.default.coffee``の配列``tmpl``に、テンプレートファイル名を列挙するだけです。


## 今後の展望
Backbone.js のプラグインとして実装してみたいです。
RuboCop | Style/ClassLength

# RuboCop | Style/ClassLength

## 概要

RuboCopの「Style/ClassLength」警告について。

クラスの長さをチェックします。
デフォルトは100行。
また、コメントを数えるかどうか設定可能です。
デフォルトはコメントは数えません。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|CountComments|boolean|コメントを数えるか|false|
|Max|数値|クラスの文字数|100|

## ClassLength

各設定値（デフォルト, 任意の値）での検証結果をまとめます。

## デフォルト検証
### 検証プログラム

class_length_default.rb

~~~ruby
# Hoge
class Hoge
  def b
    'b'
  end

  def c
    'c'
  end

  def d
    'd'
  end

  def e
    'e'
  end

  def f
    'f'
  end

  def g
    'g'
  end

  def h
    'h'
  end

  def i
    'i'
  end

  def j
    'j'
  end

  def k
    'k'
  end

  def l
    'l'
  end

  def m
    'm'
  end

  def n
    'n'
  end

  def o
    'o'
  end

  def p
    'p'
  end

  def q
    'q'
  end

  def r
    'r'
  end

  def s
    's'
  end

  def t
    't'
  end

  def u
    'u'
  end

  def v
    'v'
  end

  def w
    'w'
  end

  def x
    'x'
  end

  def y
    'y'
  end

  def z
    'z'
  end

  def aa
    'aa'
  end

  def ab
    'ab'
  end

  def ac
    'ac'
  end

  def ad
    'ad'
  end

  def ae
    'ae'
  end

  def af
    'af'
  end

  def ag
    'ag'
  end

  def ah
    'ah'
  end

  def ai
    'ai'
  end
end
~~~

### 実行結果

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
ClassLength:
  CountComments: false  # count full line comments?
  Max: 100
~~~

~~~bash
$ rubocop class_length_default.rb
Inspecting 1 file
C

Offenses:

class_length_default.rb:2:1: C: Class definition is too long. [102/100]
class Hoge
^^^^^

1 file inspected, 1 offense detected
~~~

## 任意の値で検証
### 検証プログラム

class_length_specific.rb

~~~ruby
# Hoge
class Hoge
  def b
    # test
    # test
    # test
    # test
    # test
    # test
    # test
    # test
    'b'
  end
end
~~~

### 実行結果 no_braces の場合

.rubocop.yml

~~~yaml
ClassLength:
  CountComments: true  # count full line comments?
  Max: 10
~~~

~~~bash
$ rubocop class_length_specific.rb
Inspecting 1 file
C

Offenses:

class_length_specific.rb:2:1: C: Class definition is too long. [11/10]
class Hoge
^^^^^

1 file inspected, 1 offense detected
~~~
Rails4になってcsvが出力しやすくなった

Railsでcsvファイル出力とか調べても model でCSV出力用のto_csvメソッド作ってcontorllerで respond_to format.csv して出力するようなのしかみつからんかった。
http://railscasts.com/episodes/362-exporting-csv-and-excel?language=ja&view=asciicast


```ruby:user.rb
require 'csv'
class User < ActiveRecord::Base
  def self.to_csv
    CSV.generate do |csv|
      csv << column_names
      all.each do |model|
        csv << model.attributes.values_at(*column_names)
      end
    end
  end
end
```

```ruby:user_controller.rb
def index
  respond_to do |format|
    format.html
    format.csv { send_data User.to_csv }
  end
end
```

でも csvとか出力の範疇だしそれわざわざ modelにもたせてごちゃごちゃさせるのやだし urlを扱おうとするとmodel に ``` include Rails.application.routes.url_helpers ```  とか書く必要も出てくるし死にたくなる。

Rails4から viewテンプレートとして .erb .haml .builder みたいな感じで .ruby 拡張子が使えるようになったのを利用して

```ruby:show.csv.ruby
require 'csv'
CSV.generate do |csv|
  csv << column_names
  all.each do |model|
    csv << model.attributes.values_at(*column_names)
  end
end
```

みたいにview側にロジックを移してcsv整形してやれば出力をviewに統一できるしmodelに無茶させないので保守もしやすいし世界が平和になる
scikit-learn で TF-IDF を計算する

[昨日](http://qiita.com/ynakayama/items/300460aa718363abc85c)触れた TF-IDF を求めるコードを実装します。機械学習については例によって scikit-learn を使います。

このような既知の計算については自力で実装するより完成度の高いライブラリを利用するべきでしょう。これにより車輪の再発明を避ける、品質を担保するという狙いがあります。

事前準備として、ホームディレクトリの docs ディレクトリに処理対象となる自然言語の文書を格納します。


```py3
import os
import MeCab
from sklearn.feature_extraction.text import TfidfVectorizer

home = os.path.expanduser('~')
target_dir = os.path.join(home, 'docs')
token_dict = {}

def tokenize(text):
    """ MeCab で分かち書きした結果をトークンとして返す """
    wakati = MeCab.Tagger("-O wakati")
    return wakati.parse(text)

# ひとつひとつファイルを読み込んで
# ファイル名に対して語彙群のディクショナリを生成する
for subdir, dirs, files in os.walk(target_dir):
    for file in files:
        file_path = os.path.join(subdir, file)
        shakes = open(file_path, 'r')
        text = shakes.read()
        lowers = text.lower()
        token_dict[file] = lowers

# scikit-learn の TF-IDF ベクタライザーを使う
tfidf = TfidfVectorizer(tokenizer=tokenize, stop_words='english')
tfs = tfidf.fit_transform(token_dict.values())

print(token_dict)
print(tfs.toarray())
```

索引文字列を抽出したのち既存のライブラリに突っ込めば TF-IDF が求まります。

## 参考

TfidfVectorizer
http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#sklearn.feature_extraction.text.TfidfVectorizer

特徴量(素性)を作るときのメモ + scikit-learnにちょっと触る
http://sucrose.hatenablog.com/entry/2013/04/19/014258
capybaraでJavaScriptを実行する

Ajaxのエンドツーエンドテストを書く際など、思うように望んだ状態を作り出せず、直接JavaScriptを実行できれば楽なのに・・・というケースがたまにあると思います。
capybaraのexecute_scriptを使えば任意のJavaScriptを実行できます。

```ruby
page.execute_script "alert('bar');"
```

これを利用すれば、disabledやreadonlyになっているフォームに強引に値を送り込めます。

```ruby
page.execute_script "$('#foo').val('forced post message');"
```

通常、このように現実と乖離したテストを書くべきではありませんが、セキュリティ上の問題をテストするのには便利かも知れません。

以上はCapybara.javascript_driver = :poltergeistで確認していますが、selenium等のドライバで動作するかどうかは不明です。
（動作したら教えてくれると嬉しいです）
mac os x mavericksをクリーンインストールして。

##はじめに
単なる個人的な覚え書きです。


##データバックアップ
TimeMachineで外付けHDにバックアップを取った。

##OSのクリーンインストール
いったん電源を落とす。
Option + R を押しながら電源ボタンを長押し。
メニューが表示されるので
ディスクユーティリティでディスク消去
再インストールでOS再インストール
Apple IDの登録とかあるけどまあそこはよしなに。

##ネイティブアプリのインストール
homebrew-caskを試そうとしたけど、もともとそんなにインストールしてた量が多くないのと、caskのリストにあんま持ってるやつがなかったので、App Store ややブラウザ経由でぽちぽち入れたよ。iterm2とかchromeとか。

##シェル
oh-my-zshをいれた。あとで設定変更するけど、先にgitを入れてホームディレクトリのdotfilesをバージョン管理したいので、とりあえずここではインストールのみ。

##git
git とうつとコマンドラインツールがいるよ！っていわれ
コマンドラインツールのインストールとgitのインストールが実行された。
コマンドラインツールえ、先にXcodeいれなくてもだいじょぶなんだ。
GitはApple Git-48とかいうやつが入った。だいじょぶかしら。

```
$ git --version
git version 1.8.5.2 (Apple Git-48)
```

##ホーム
ホームでgit初期化したあと、gitignoreを作成

```shell-session:gitignore
/*
/.*

!/.gitignore
!/.vim
!/.vimrc
!/.oh-my-zsh
!/.zshrc
!/.zsh_aliases
...

```

##homebrew
homebrewいれた。適当。brewfileを作っておけばよかった。

##その他
特に直近で開発のタスクがないので、構成が固まってない。
構成が固まったものがあれば、次回はboxenとか使いたい。
Tips エディタ 配列フィールドの超簡単なソート


Unityの配列フィールドに複数のオブジェクトをぶち込むと、全然ソートされずによくわからん順番になるのですが。
OnValidateメソッドで、ソートしてあげれば簡単！ということに気づきました。

```C#:SampleUnityPropertySort.cs

using UnityEngine;
using System.Collections;
using System.Linq;

public class SampleUnityPropertySort : MonoBehaviour {
	
	public Sprite[] sprites;
	
	void OnValidate() {
		sprites = sprites.OrderBy(sprite => sprite.name).ToArray();
	}
}

```
node.jsのORM - sequelize get started

# 事前準備
## Expressパッケージを用意する


```
cd /path/to
express -e appName  ※１
cd appName
npm install
```

注）※１を/path/to/appName でやらないこと

## sequelizeモジュールをインストールする
```
npm install --save sequalize
```



# sequalizeでDB操作する
## sequelizeをrequireする
```
var Sequelize = require('sequelize');
```

## テーブルを定義する
```
// MySQLに接続
var sequelize = new Sequelize('express', 'root', null, {
  host: "localhost",
  port: 3306
});

// テーブル定義する
var User = sequelize.define('User', {
  name: Sequelize.STRING
});
```


## sequelizeでテーブルを作る
```
sequelize
  .sync({force: true})
  .complete(function(err) {
    if (!!err) {
      console.log('An error occured while creating the table:', err);
    }else {
      console.log('It worked!');
    }
  });
```

## sequelizeでINSERTする
```
User
  .create({
    name: 'UserB'
  })
  .complete(function(err, user) {
    if (!!err) {
      console.log('The instance has not been saved: ' + err);
    } else {
      console.log('We have persisted instance now');
    }
  });
```

## sequalizeでSELECTする 
```
User
  .find({ where: { name: 'UserA' } })
  .complete(function(err, UserA) {
    if (!!err) {
      console.log('An error occurred while searching for UserA:', err);
    } else if (!UserA) {
      console.log('No user with the username "UserA" has been found.');
    } else {
      console.log('Hello ' + UserA.name + '!');
      console.log('All attributes of UserA:', UserA.values);
    }
  });
```
Mining of Massive Datasets Chap. 4.3 Filtering Streams

[Mining of Massive Datasets](http://infolab.stanford.edu/~ullman/mmds.html)の4.3節の概要を書きます。

- ストリームの中から集合を見つける
- メモリーに載り切らない時どうするか？
  - Bloom filteringでしょ！

## 4.3.1 A Motivating Example
- メールアドレスの中からスパムと登録されたアドレスをdropしたい
- 最大10億個のメールアドレスの集合Sを仮定する
- ストリームはメールアドレスと、メール自身のペアとする
- 全メールアドレスをメモリに保持するのは辛いし、ディスクアクセスもしたくない

- Bloom filteringの基本は、bit arrayで集合Sの要素を表現する
- 要素に対して、k個のhash関数を通した値を保持しておく
- streaming dataに対してhash関数を書けて、全ての値が0になったらspamとして捨てる
- hashの衝突で、ざっくり1/8くらいはfalse positiveが発生するが、7/8殺せるなら問題ない

## 4.3.2 The Bloom Filter

Bloom filterの構成要素は以下からなる。

1. 0で初期化された、n-bitのarray
2. ハッシュ関数 h_1, h_2, ..., h_k。 "key"となる値をn個のbucketに保管し、n bitのbit-arrayを作る
3. m個の値を持った集合S

集合Sのkey Kに対して、h_i(K)を計算して対応するbitについて、bit-arrayに1を立てる

[ここ](http://www.perl.com/pub/2004/04/08/bloom_filters.html)のFigure. 1-4がわかりやすい

## 4.3.3 Analysis of Bloom Filtering

原理上、false positiveが発生してしまう。
その確率は、bit-arrayを持つ数でコントロールできる。

- x個のダーツの的とy本のダーツがあったとする
- どのダーツも当確率で的に当たるとする
- いくつの的に1本以上のダーツが当たるか？

ある的にダーツが1本も当たらない確率は (x-1)/x
y本のダーツがある的にあたらない確率は

$$ \left(\frac{x-1}{x} \right)^y = \left(1-\frac{1}{x} \right)^{x \left( \frac{y}{x} \right)} $$

1.3.5 の近似より、εが小さい時
$$ (1-ε)^{1/ε} = 1/e $$
とかけるので

$$ e^{-y/x} $$

になる。

example 4.3はわかりやすい例

実際の問題だと、
集合S は要素を m 個持っていて、bit-arrayはn-bit、k個のハッシュ関数を仮定する。
的の数はx = n,  ダーツの数は y=kmとなり
0のままのbitの数は 
$$ e^{-km/n} $$

全部1が立つfalse positiveなケースは
$$ 1-e^{-km/n} $$
ハッシュの数を増やすと
$$ \left( 1-e^{-km/n} \right)^{k} $$

## 4.3.4 Exercises for Section 4.3
省略
保存時に勝手にclang-formatする

表題の通り、現在編集中の`*.[ch]pp`ファイルを保存時に自動的clang-formatで整形します

.vimrcに以下を追加します

```vim
function! s:clang_format()
  let now_line = line(".")
  exec ":%! clang-format"
  exec ":" . now_line
endfunction

if executable('clang-format')
  augroup cpp_clang_format
    autocmd!
    autocmd BufWrite,FileWritePre,FileAppendPre *.[ch]pp call s:clang_format()
  augroup END
endif
```

システムにclang-formatがインストールされていればvim側はプラグイン等一切必要ありません。

2014/6/25追記
不具合を修正しました。
以前のバージョンは現在の編集情報を廃棄するので注意してください。
詳しくは[編集履歴](http://qiita.com/termoshtt/items/00552cbd776348f75750/revisions)を確認してください。
MySQL5.5でOLAP用のメモリチューニング例

#想定する利用状況

物理メモリ16GB
同時接続セッション数は通常1、まれに2
利用はINNODBが中心
テーブルサイズは1GB～5GBが多い

# my.cnf
```
[mysqld]
# global
innodb_buffer_pool_size=12G
max_heap_table_size=1G
tmp_table_size=1G

# session
sort_buffer_size=256M

# disk
innodb_log_file_size=1G
```

# 各項目の解説

## innodb_buffer_pool_size

一言で言うとread cacheの大きさ。全メモリの70%くらいが良いとされる

## innodb_log_file_size

write cacheで、インデックス酷使したINSERTのパフォーマンスに関わる。「MySQLで大量データのインサートが遅い」場合に増やすことを検討する。

http://nippondanji.blogspot.jp/2009/01/innodb.html
http://dsas.blog.klab.org/archives/50860867.html

show engine innodb staus等でinsert速度を調べ、遅い場合にこれを増やす。

## sort_buffer_size

ファイルソートの高速化に使われるので多めに。
show processlistでfile sortと表示されている時間が長い場合にこれを増やす

## max_heap_table_size, tmp_table_size

テンポラリテーブルに使われる。サブクエリなどで使われるので多めに。
show processlistでwrite to tmpと表示されている時間が長い場合にこれを増やす

# まとめ
OLAP用のメモリ設定の例が見当たらなかったため、決定版というより、ここに書いておけば諸先輩方から暖かいご批判をいただけるのではないかと思い、たたき台として書いた次第。sort_buffer_size, max_heap_table_size, tmp_table_sizeあたりは、用途によっては」もうちょっと多くしても良いかもしれない。
iOS 7時代でもGame Centerで"今日"と"今週"のランキングを確認できた

iOS 7のGame Centerやアプリのランキングから"今日"と"今週"が見れなくなってました。
直近のアクティブユーザーを確認するのに重宝していたので残念に思っていました。

何気なくMacのGame Centerを起動してみたら(OS X 10.9.3)、なんと"今日"、"今週"、"すべて"がちゃんと在りました。

知っている方には今更と思いますが、かなり嬉しかったので共有します。
WordPress、複数カテゴリを指定

WordPress、複数カテゴリを指定
==========


■about
----------

WordPress、複数カテゴリを指定
get_posts() 関数のカテゴリ引数の「category__and」に、カテゴリIDを配列で指定する。




■code
----------

```php:php
$get_posts_args = array(
//23,25を選ぶ
    'category__and' => array( 23,25 ),
//ID60を選ばない
	'cat' => -60,
    'numberposts' => 2,
    'order' => 'DESC',
);
```




■reference
----------

ID指定した複数カテゴリ全てに属する投稿記事を新着順リスト表示
http://alphasis.info/2011/07/wordpress-function-get_posts-category__and/
WordPress、特定のカテゴリーを除外

WordPress、特定のカテゴリーを除外
==========


■about
----------

WordPress、特定のカテゴリーを除外
get_postsの引数に入れるカテゴリーを扱うcatにカテゴリーIDを設定します。




■code
----------

```php:php
$get_posts_args = array(
//23,25を選ぶ
    'category__and' => array( 23,25 ),
//ID60を選ばない
	'cat' => -60,
    'numberposts' => 2,
    'order' => 'DESC',
);
```




■reference
----------

特定のカテゴリーを除外して表示する方法｜WordPressテーマカスタマイズ
http://wpcos.com/?p=8150
git でメジャーじゃないけどあれっとなったときに検索もしづらいコマンドを気づき次第アップしていくページ

### ローカルにfetchしたリモートのブランチで、リモートで削除済みのブランチを削除

```
git remote prune origin
```

### リモートのブランチを削除
```
git push origin :{branch_name}
```
もとネタは、下記のコマンドで、空のlocal_branchをpushすることで、remoteのbranchを（結果的に）
削除するという仕組み.メッセージに deleted とかでるんだから、git remote delete とかあってもいいのになあ
```
git push {local_branch}:{remote_branch}
```

### ローカルで pull request を処理するときの一連の流れ
```
# git fetch で remote ブランチを取得
git fetch [pull request を投げてきた人のaccount]

# pull request 用のブランチを作成 ブランチ名は仮に pr_branch とします
git checkout -b pr_branch

# remote ブランチを確認
git branch --remote

# merge
git merge [pull request を投げてきた人のaccount/branch名]

# マージ成功！ conflict(´・ω・`)した場合は別途解決する

# master にもどる
git checkout master

# pr_branch を merge
git merge pr_branch

# pull request 用の branchはもういらないので、削除
git branch -d pr_branch

# 忘れずに(｀・ω・´) push!!
# ちなみに、git push した時点で GitHub 側の pull request も閉じられます
git push

# remote で削除済みの不要なブランチをローカルから削除
git remote prune origin
```
イシューにブランチを紐づけてpull-requestを出す

hubコマンドをインストールしておいて、このコマンドを実行

```shell-session
hub pull-request -i $ISSUE_NUMBER -b $BASE_COMMIT -h $REQUEST_BRANCH
```


例

```shell-session
hub pull-request -i 7 -b timedia -h is0007
```

関連情報
http://qiita.com/kyanny/items/170a188a87925f81ae86
別のリポジトリのコミット履歴を取り込む

あるgitリポジトリの特定のディレクトリに別のgitリポジトリのコミット履歴をそのままとりこみたいときのやり方

http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories

```shell-session
git remote add -f Bproject /path/to/B
git merge -s ours --no-commit Bproject/master
git read-tree --prefix=dir-B/ -u Bproject/master
git commit -m "Merge B project as our subdirectory"
git pull -s subtree Bproject master # なくてもいい
```
windows8 ストアアプリでHTML/JSからC#/C++のAPIは呼び出せる？

windows8.0及び8.1向けにストアアプリを作成する場合、
開発言語を選択する必要があります。

* XAML(C# + C++)
* HTML(JS)

UI部分はXAMLかHTMLのどちらかしか使えません。

しかし、WIndows Runtime Component化してしまえば、
HTML/JSからC#/C++で作成したAPIを呼び出すことが可能です。

例えば、下記のような構成が可能です。
[HTML/JS ストアアプリ] - [C# windows runtime component]

※過去に作ったC++/Cのnativeライブラリなども、windows runtime component化することにより、
　C#やJSから呼び出しが可能になります。
※ただし、windows runtimeを作成する場合、型制限などがあるため、
　注意してAPIを作る必要があります。

下記の記事が見やすいと思います。
http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/08/13/windows-metro.aspx

windows runtime componentはwindows8アプリを作る上では非常に強力に使えると思いますので、
ぜひ使ってみてください。
Scala 2.11 + sbt-builldinfo + IntelliJ IDEA で "BuildInfo is already defined as case class BuildInfo"

Scala 2.11 で sbt-buildinfo を使っていて terminal から sbt でビルドする分には問題ないのに IntelliJ IDEA 上からコンパイルすると以下のような謎のエラーが必ず出るようになります（Scala 2.10.4 では起きない）。

```
Error:(4, 13) BuildInfo is already defined as case class BuildInfo
case object BuildInfo {
            ^
```

調べたところ、どうやらこれは IDEA のデフォルトのコンパイラ設定が Scala 2.11 にうまく対応できていない？ためのようで「Preferences > IDE Settings > Scala > Incremental compilation by」で「IntelliJ IDEA」ではなく「SBT incremental compiler」を選択すると回避できます。

![Screen Shot 2014-06-24 at 16.05.56.png](https://qiita-image-store.s3.amazonaws.com/0/19163/a3935783-9ec7-d4fa-c9e2-f51e7d63ad8e.png)

他にも影響が出そうな内容なので、そのうち直るかもしれませんけど。
npm便利帳

## nom command

* npmでインストールしたモジュール一覧

> npm [-g] ls --depth=0

* package.jsonへ依頼を追加する

> 直接にdependenciesキーに追加するか
> npm install express --save    // dependenciesに追加
> npm install express --save-dev  // devDependenciesに追加

* path関連の調査

> npm bin [-g]   // node_modulesどこにインストールされている
> require で探すモジュールのパスは global.module.paths の中に入っています.
> デフォルトではカレントディレクトリから下りながら全てのディレクトリの node_modules が登録されています.
> それに加えて NODE_PATH 環境変数の中にあるモジュールを探しに行きます.
> [モジュール読み込みの仕組み](http://phiary.me/npm-node-js-require-module-memo/)

**npm gov web**
https://www.npmjs.org/doc/

**npm root -g**
global node_modules path

**npm info pkg_name**
npm information

**npm link pkg_name**
link global module to local
http://www.infoq.com/cn/articles/msh-using-npm-manage-node.js-dependence
docker commitコマンドでイメージを作成するときCMDとEXPOSESを指定する方法

試し（目的なし）をしました。

`Dockerfile`の場合カスタマイズは簡単ですが、`docker commit`はそんなこと出来ないでしょうか？

調べたところ、今の段階ではまだ出来そうです。

```
docker commit -run='{"CMD":["/usr/bin/redis-server"], "PortSpecs": ["6379"]}' c4be1df52810 liubin/redis:manually
```

`-run`に幾つのものを指定できます。

ただ、Docker1.0ではこのオプションは非推奨になったので、使わない方がいいと思います。
DockerコンテナのIPを取得する方法（docker inspectコマンド編）

昔のバージョンはこういう方法が流行っていましたが、

```
docker inspect 49ddbb6b8e91 | grep IPAddress | cut -d '"' -f 4
```

最新のDockerでは`inspect`コマンドに'-f'というオプションが追加したらしい。下記は[マニュアル](https://docs.docker.com/reference/commandline/cli/#inspect)からの抜粋。

```
Usage: docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]

Return low-level information on a container/image

  -f, --format=""    Format the output using the given go template.
```

すなわち、IPアドレスはこうのように取得出来ます。

```
docker inspect -f "{{ .NetworkSettings.IPAddress }}" $ID
```

`-f`オプションは自由度の高い[text/template](http://golang.org/pkg/text/template/)となっているため、思う通りなんでもカスタマイズできると思います。
/tmp の代わりに Dir.tmpdir 相当を使う

ブロックの中では単純には set できないので lambda を使ったり capture を使ったり入っていないかもしれない ruby コマンドは使わずに printenv を使ったり工夫した。

```ruby:config/deploy.rb
set :tmp_dir, -> {
  tmpdir = nil
  on roles(:all) do
    tmpdir = capture('printenv TMPDIR || printenv TMP || printenv TEMP || echo /tmp').chomp
  end
  tmpdir
}
```
CarrierwaveでS3にアップロードさせるとき、キャッシュもS3に置く

rubyで画像アップロード機能を作成するには様々なgemがありますが、carrierwaveが一番お手軽でわかりやすいので一番使っています。
carrierwaveではストレージを自由に選択できるので、ストレージをfogにすればS3との連携も簡単にできます。

以下の例は管理しているrailsアプリケーションのストレージをfogにする設定です。

```ruby:config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.cache_dir = "#{Rails.root}/tmp/uploads"

  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => 'YOUR ACCESS KEY',
    :aws_secret_access_key  => 'YOUR SECRET',
    :region                 => 'ap-northeast-1'
  }

  config.storage = :fog
  config.fog_directory = "PATH_TO_DIRECTORY"
  config.fog_public = true
  config.fog_authenticated_url_expiration = 60
end
```

この設定だけでS3にアップロードしたデータを登録できるので簡単です。

しかし、複数サーバをロードバランサ配下に置いている場合、キャッシュファイルが各サーバの片方にしか置かれないので、ページ遷移した際にキャッシュファイルが正常に受け継がれないことになってしまいます。
キャッシュファイルを共有するためにnfsサーバを用意するといった[解決策](http://shakezoomer.com/?p=740)もあるのですが、今回はキャッシュもS3に置くようにしてみます。

githubにあがっているcarrierwaveは、キャッシュをS3にすることが可能になっているので、こちらをGemfileに記入します。

```ruby:Gemfile
gem 'fog'
gem 'carrierwave',github: 'carrierwaveuploader/carrierwave'
```

そして、carrierwaveのconfigファイルに以下の1行を追加します。

```ruby:config/initializers/carrierwave.rb
  config.cache_storage = :fog
```

これでキャッシュストレージの向き先をAWSにすることができました。
S3を利用して、ファイルをアップロードする機能があるアプリケーションをスケールさせる場合のキャッシュファイルの扱いが、だいぶ楽になると思います。
ちなみにファイルストレージもキャッシュも自由に変更することができるので、自前のストレージエンジンを利用するのも可能です。

追記：

現在はgemにあがっているものでもcache_storageの設定ができるようです。
Mac OS Xでkitchen-docker

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

[portertech/kitchen-docker](https://github.com/portertech/kitchen-docker "portertech/kitchen-docker") がMac内だけでも使える。


## boot2dockerの準備

Macなのでboot2dockerでホストVMを作ります。

```bash:
$ boot2docker start
Waiting for VM to be started...
...........
Started.
Auto detection of the VM's IP address.
To connect the Docker client to the Docker daemon, please set:
     export DOCKER_HOST=tcp://:xxxx
```

通常のDocker使用では`export DOCKER_HOST=tcp://:xxxx`でdocekrコマンドからホストVMを意識せずに使えます。
Macでkitchen-dockerする場合、コンテナへのSSH接続に`boot2docker`で作成したホストVMを対象にとりたいので、IPアドレスを指定します。

### IPアドレスを付けてエクスポート

`boot2docker ip`でホストVMのアドレスを取得。

```bash:
$ boot2docker ip

The VM's Host only interface IP address is: 192.168.59.yyy
```


くっつけてエクスポートしましょう。

```
export DOCKER_HOST=tcp://192.168.59.yyy:xxxx
```

アドレス省略時、kitchenコマンドはssh接続時に`127.0.0.1:${sshd用にフォワードしたポート}`に行くのでコンテナ作成はできますが、続きができません。


## `.kitchen.local.yml`で上書きマージ

Test-Kitchenの設定を`.kitchen.local.yml`で差分だけ作ります。
環境変数にもあることだし、ERBとして使い回しましょう。

```yaml:.kitchen.local.yml
---
driver:
  name: docker
  binary: /usr/local/bin/docker
  socket: <%= ENV['DOCKER_HOST'] %>

platforms:
  - name: ubuntu-12.04
    driver_config:
      image: ubuntu:12.04
    run_list:
      - recipe[ubuntu]
      - recipe[apt]
```

ではconvergeと。


```bash:
$ kitchen converge

-- snip --

        "Ports": {
            "22/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "49153"

-- snip --

       Waiting for 192.168.59.xxx:49153...  ## ここが127.0.0.1宛になって止まる

-- snip --

$ kitchen list
Instance                  Driver  Provisioner  Last Action
default-ubuntu-1204       Docker  ChefZero     Converged

$ uname -v
Darwin Kernel Version 13.2.0: Thu Apr 17 23:03:13 PDT 2014; root:xnu-2422.100.13~1/RELEASE_X86_64
```

できました。
動作検証用クレジットカード番号のメモ

動作検証用クレジットカード番号の個人的なメモ。

# Master Card

- 5555555555554444
- 5105105105105100

# Visa

- 4111111111111111
- 4012888888881881

# JCB

- 3530111333300000
- 3566002020360505

# Diners Club

- 30569309025904
- 38520000023237

# American Express

- 378282246310005
- 371449635398431
- 378734493671000（コーポレート）

# Discover

- 6011111111111117
- 6011000990139424

# 備考

- 有効期限は未来の日付にする（システムによるかも）
- カード名義は何でもOK
- セキュリティコードは何でもOK

# 参考
- テスト環境で使用できるクレジットカードの情報 | WebPay: 開発者向けクレジットカード決済サービス  
https://webpay.jp/docs/mock_cards
- ECサイトの動作テストに使える、クレジットカードのテスト番号一覧 | Webクリエイターボックス  
http://www.webcreatorbox.com/tech/creditcard-test-numbers/
Rubyで暗号化、復号化

　アルゴリズムの本を読んでいて、文字列をポケベルの数字列で暗号化、またポケベルの数字列から文字列に復号化する、というものが載っていたので自分で、コードを書いてみました。
　ハッシュの値からキーを求めるメソッドを使ったことがなかったので、勉強になりました。
　濁点、半濁点は全角で別に打つ必要があることも、ポケベルを使ったことのない自分は知りませんでした。
　これからも簡単なものでも気が向いたらコードを書いていこうと思っています。
　またよりよい方法があったら指摘、お願いします。
　簡単なコードですので解説は省略します。


```rb:pocketbell.rb
# -*- coding: utf-8 -*-

class PocketBell
  def initialize
    @table = {
      "あ" => "11", "い" => "12", "う" => "13", "え" => "14", "お" => "15",
      "か" => "21", "き" => "22", "く" => "23", "け" => "24", "こ" => "25",
      "さ" => "31", "し" => "32", "す" => "33", "せ" => "34", "そ" => "35",
      "た" => "41", "ち" => "42", "つ" => "43", "て" => "44", "と" => "45",
      "な" => "51", "に" => "52", "ぬ" => "53", "ね" => "54", "の" => "55",
      "は" => "61", "ひ" => "62", "ふ" => "63", "へ" => "64", "ほ" => "65",
      "ま" => "71", "み" => "72", "む" => "73", "め" => "74", "も" => "75",
      "や" => "81", "（" => "82", "ゆ" => "83", "）" => "84", "よ" => "85",
      "ら" => "91", "り" => "92", "る" => "93", "れ" => "94", "ろ" => "95",
      "わ" => "01", "を" => "02", "ん" => "03", "゛" => "04", "゜" => "05",
    }
  end

  def encryption(string)
    string.split(//).each do |char|
      puts @table[char]
    end
  end

  def decryption(string)
    string.scan(/\d\d/).each do |char|
      puts @table.key(char)
    end
  end
end

pocket_bell = PocketBell.new

pocket_bell.encryption("あいうえお")
puts
pocket_bell.decryption("1112131415")
puts
pocket_bell.encryption("あんこ゛う")

# >> 11
# >> 12
# >> 13
# >> 14
# >> 15
# >> 
# >> あ
# >> い
# >> う
# >> え
# >> お
# >> 
# >> 11
# >> 03
# >> 25
# >> 04
# >> 13
```
VisualStudio2017覚え書き

VisualStudioのエディタに半ページスクロールってないのかな？

# ユーザー設定データの削除

```
devenv /resetuserdata
```

## ユーザーデータの場所

C:\Users\ユーザー名\AppData\Local\Microsoft\VisualStudio


# Find in Solution Explorer

エディタで開いているファイルがソリューション　エクスプローラーのどこにあるか教えてくれる。

タブの右クリックメニューから「Find in Splution Explorer」を選択。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/35364/e499ce45-4d12-5ff5-2c2a-32b87f6b10a3.png)


https://github.com/tunnelvisionlabs/FindInSolutionExplorer

#Visual Studio 2010のCodeMaid
最新のCodeMaidはVisual Stdudio 2010をサポートーしない
ダウンロード先https://github.com/codecadwallader/codemaid/releases/download/v0.8.1/CodeMaid_v0.8.1.vsix

# .cppと.hの切り替え
CodeMaidインストール
「CodeMaid.SwitchFile」コマンドに任意のキーをバインドする

# VisualStudioの正規表現
http://msdn.microsoft.com/ja-jp/library/2k3te2cs(v=vs.90).aspx

#Visual Studio color schemes
デフォルトの配色が気に入らない

 [http://studiostyl.es/](http://studiostyl.es/)から適当にダウンロード。
とりあえず[これ](http://studiostyl.es/schemes/coding-instinct-theme)

「ツール」→「設定のインポートとエクスポート」
「選択された環境設定をインポート」を選択して「次へ」
現在の設定を保存するか上書きするか選んで「次へ」
「参照」からダウンロードしたファイルを選択して「次へ」
「完了」
WordPress、検索フォーム値、全角スペースを半角スペースに置換

WordPress、検索フォーム値、全角スペースを半角スペースに置換
==========




■about
----------

WordPress、検索フォーム値、全角スペースを半角スペースに置換
WordPress複数ワード半角スペース仕様を全角スペースも対応する。
submit時に置換関数実行。



■code
----------

```JavaScript:JavaScript
function rep(){
  if(document.getElementById('sval').value.indexOf("　")!=-1){
    document.getElementById('sval').value=document.getElementById('sval').value.replace(/　/g," ");
  }
  return true;
}
```

```html:html
<form method="get" action="" onsubmit="return rep()">
<input type="search" id="sval" placeholder="検索 …" value="" name="s" title="検索:">
<input type="submit" value="検索">
</form>
KeePassでパスワード管理する

# はじめに

膨れ上がる一方のパスワードをセキュアに管理するためには、パスワード管理ソフトがベターです。
いろいろありますが、KeePassというOSSがシンプルでよいです。
寄付ウェアです。

## May KeePass be used in a company?
refs: http://keepass.info/help/base/faq.html

Yes. KeePass is free software and you don't have to pay any fees. You may freely use KeePass under the terms of its license (1.x, 2.x).

But of course, if you like KeePass, donations are always greatly appreciated.

# インストールする

ここからダウンロードします。Professional Editionでよいでしょう。

```
http://keepass.info/download.html
```

# 設定する

KeePassを起動して、マスターパスワードを設定します。
これが漏洩すると、全パスワードが危険にさらされるので、弱いパスワードにしたり、メモったりしてはいけません。

エクスプローラみたいな画面が開いたら、好きな場所でAdd Entryして、管理したいサイトのTitle/User name/URLを設定します。

項目  | 説明
----- | ----
Title | 対象のログインページの< title >～< /title >で記載されている文字列です。これを設定すると、Hot keyによる自動入力が可能になります。
User name | 自動入力されるユーザー名です。
Password | 自動入力されるパスワードです。Add Entry時に自動生成されますが、任意の文字列に変更することが可能です。また、Repeatの右端にある鍵ボタンを押下し、Open Password Generatorを選択すると、パスワードの自動生成方法を変えることができます。
URL | ログインページを指定します。

# ユーザー名・パスワードを自動入力する

対象のログインページを開きます。
KeePassの対象のエントリを選択し、CTRL-Uでオープンします。

ユーザー名を入力するテキストボックスをクリックします。
CTRL+ALT+Aを入力すると、ユーザー名とパスワードが自動入力されます。

ユーザー名とパスワードの入力フィールドの移動はタブで行なっているので、タブで遷移できない場合は、そのままでは自動入力はできません。
設定を変更することで可能になります。
山本山（回文）２

　以前よりはコンパクトになった気がする！！（ArrayListに頼ってる所は変わらないけどね！！）前回分からなかったのは、自分として結構思う所があるので、克服出来る様にまずは他の問題できちんと正解できるようにしたいです！

```java:
import java.util.*;
public class Main {
	boolean isPalindrome(ArrayList<Character> s) {
		for(int r = 0; r < s.size()/2; r++) {
			if(s.get(r) != s.get(s.size() - 1 - r)) return(false);
		}
		return(true);
	}
	
	int find(String s) {
		ArrayList<Character> list = new ArrayList<Character>();
		for(int r = 0; r < s.length(); r++) {
			list.add(s.charAt(r));
		}
		if(isPalindrome(list)) return(list.size());
		boolean flag = false;
		int less = 0;
		while(!flag) {
			list.add(s.length(), s.charAt(less++));
			flag = isPalindrome(list);
		}
		return(list.size());
	}
	
	void doIt() {
		String s = "abab";
		String s2 = "abacaba";
		String s3 = "qwerty";
		String s4 = "abdfhdyrbdbsdfghjkllkjhgfds";
		
		System.out.println(find(s4));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}

```

ただこれ、回文作れない文字列の入力は想定されていないので、例外投げちゃうかと思います。
Swiftで現在日時を取得し、様々なスタイルで出力する方法


# 開発環境
* Xcode 6 Beta
* Mac OS X 10.9.3

# 実行環境
* iOS Simulator (iPhone5s / iOS 8.0)


# コード（USロケールの場合）
```swift
let now = NSDate() // 現在日時の取得
let dateFormatter = NSDateFormatter()

dateFormatter.locale = NSLocale(localeIdentifier: "en_US") // ロケールの設定

dateFormatter.timeStyle = .NoStyle // 時刻のスタイルの設定
dateFormatter.dateStyle = .NoStyle // 日付のスタイルの設定
println(dateFormatter.stringFromDate(now)) // -> 出力されない

dateFormatter.timeStyle = .ShortStyle
dateFormatter.dateStyle = .ShortStyle
println(dateFormatter.stringFromDate(now)) // -> 6/24/14, 11:01 AM

dateFormatter.timeStyle = .MediumStyle
dateFormatter.dateStyle = .MediumStyle
println(dateFormatter.stringFromDate(now)) // -> Jun 24, 2014, 11:01:31 AM

dateFormatter.timeStyle = .LongStyle
dateFormatter.dateStyle = .LongStyle
println(dateFormatter.stringFromDate(now)) // -> June 24, 2014 at 11:01:31 AM GMT+9

dateFormatter.timeStyle = .FullStyle
dateFormatter.dateStyle = .FullStyle
println(dateFormatter.stringFromDate(now)) // -> Tuesday, June 24, 2014 at 11:01:31 AM Japan Standard Time

dateFormatter.timeStyle = .NoStyle // 時刻だけ表示させない
dateFormatter.dateStyle = .FullStyle
println(dateFormatter.stringFromDate(now)) // -> Tuesday, June 24, 2014
```

# コード（JPロケールの場合）
```swift
let now = NSDate() // 現在日時の取得
let dateFormatter = NSDateFormatter()

dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") // ロケールの設定

dateFormatter.timeStyle = .NoStyle // 時刻のスタイルの設定
dateFormatter.dateStyle = .NoStyle // 日付のスタイルの設定
println(dateFormatter.stringFromDate(now)) // -> 出力されない

dateFormatter.timeStyle = .ShortStyle
dateFormatter.dateStyle = .ShortStyle
println(dateFormatter.stringFromDate(now)) // -> 2014/06/24 11:14

dateFormatter.timeStyle = .MediumStyle
dateFormatter.dateStyle = .MediumStyle
println(dateFormatter.stringFromDate(now)) // -> 2014/06/24 11:14:17

dateFormatter.timeStyle = .LongStyle
dateFormatter.dateStyle = .LongStyle
println(dateFormatter.stringFromDate(now)) // -> 2014年6月24日 11:14:17 JST

dateFormatter.timeStyle = .FullStyle
dateFormatter.dateStyle = .FullStyle
println(dateFormatter.stringFromDate(now)) // -> 2014年6月24日火曜日 11時14分17秒 日本標準時

dateFormatter.timeStyle = .NoStyle // 時刻だけ表示させない
dateFormatter.dateStyle = .FullStyle
println(dateFormatter.stringFromDate(now)) // -> 2014年6月24日火曜日
```

# enumの省略記法

* .NoStyle
* .ShortStyle

などは、enumの省略記法で書いている。

本来は、enum型である「NSDateFormatterStyle」を先頭に付けて、

* NSDateFormatterStyle.NoStyle
* NSDateFormatterStyle.ShortStyle

と書く。

ただし、今回は、代入先であるNSDateFormatterクラスのインスタンスの

* timeStyleプロパティ
* dateStyleプロパティ

が、NSDateFormatterStyle型で宣言されているため、「NSDateFormatterStyle」部分を省略することができる。

# 参考文献

[Foundation Framework Reference - NSDate](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/)

[Foundation Framework Reference - NSDateFormatter](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/)

[The Swift Programming Language - Enumerations]
(https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-XID_185)
Androidアプリ作成時に出会う用語



設定時の用語|意味
:--|:--
Application Name|ユーザーが見るアプリの名前（日本語可）
Project Name|エクリプスが認識するプロジェクト名兼ディレクトリ名
Package Name|名前空間名。アプリをインストールするアンドロイド内で唯一である必要があるため、(Javaでの規則と同じように)ドメインを逆にしたものが推奨される。
Target SDK|動作テストをした中で最新のバージョンを表す
Minimum Required SDK|アプリが動作する最低バージョンを表す。これ以前のものにはインストールできない。
Compile With|最新のものを指定する（古いものだと新しい機能が付けれない）
Theme|UIのスタイルをあらわす


APIレベルはマニフェストから変更できるよ！

```
<uses-sdk android:minSdkVersion="integer"
          android:targetSdkVersion="integer"
          android:maxSdkVersion="integer" />
```

APIレベルは
[シェア率（２０１４年６月）](http://juggly.cn/archives/118537.html)をを確認して、[バージョンとAPIレベルの対応](http://developer.android.com/intl/ja/guide/topics/manifest/uses-sdk-element.html#ApiLevels)をみて決めよう！
（今はMinimun:8、他二つ最新がデフォルト）
メモ: Google Domains (beta)を申し込んでみた

[Googleと同じDNSが使えて機能満載の独自ドメイン登録サービス「Google Domains」開始へ - GIGAZINE](http://gigazine.net/news/20140624-google-domains/)

* 料金は1年間12ドル(約1200円)を予定しています。

[Google Domains](http://domains.google.com/about/)

![スクリーンショット 2014-06-24 11.18.12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dd302216-31ba-38a3-6d2b-16678b3a5a3f.png)

![スクリーンショット 2014-06-24 11.18.23.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bfb6f1b8-4bbb-d9f2-e752-9e361e766080.png)

![スクリーンショット 2014-06-24 11.18.39.png](https://qiita-image-store.s3.amazonaws.com/0/25728/67d379d7-b24a-1b1a-4555-8c37e2b12caa.png)

ワクテカして待つ
WordPress、is_home()とis_front_page()の違い

WordPress、is_home()とis_front_page()の違い
==========


■about
----------

WordPress、is_home()とis_front_page()の違い




■reference
----------

is_home()とis_front_page()の違いって何？ | 図解WordPress
http://100-art-toe.sakura.ne.jp/zukai-wp/503
Mac で bash でも peco-history を使いたい

こんな感じで上手くいくようです。

```bash:.bashrc
export HISTCONTROL="ignoredups"
peco-history() {
  local NUM=$(history | wc -l)
  local FIRST=$((-1*(NUM-1)))

  if [ $FIRST -eq 0 ] ; then
    # Remove the last entry, "peco-history"
    history -d $((HISTCMD-1))
    echo "No history" >&2
    return
  fi

  local CMD=$(fc -l $FIRST | sort -k 2 -k 1nr | uniq -f 1 | sort -nr | sed -E 's/^[0-9]+[[:blank:]]+//' | peco | head -n 1)

  if [ -n "$CMD" ] ; then
    # Replace the last entry, "peco-history", with $CMD
    history -s $CMD

    if type osascript > /dev/null 2>&1 ; then
      # Send UP keystroke to console
      (osascript -e 'tell application "System Events" to keystroke (ASCII character 30)' &)
    fi

    # Uncomment below to execute it here directly
    # echo $CMD >&2
    # eval $CMD
  else
    # Remove the last entry, "peco-history"
    history -d $((HISTCMD-1))
  fi
}
bind '"\C-x\C-r":"peco-history\n"'
```

<del>また、以下のように直接標準のものと差し替えても問題無いようです。</del>
<del>bash は eval を使ってヒストリの実行は出来ますが、zsh とは違い、コマンドラインに書き戻すことが出来ないので、以下の設定はしない方が良さそうです。</del>

```bash
bind '"\C-r":"peco-history\n"'
```

追記：
コメント欄にも書きましたが、最新の修正で確実に履歴の最後に選択されたコマンドが追加されるので、peco 終了後、直接 eval で実行するよりも ↑で履歴を手繰った方が安全でかつ、修正も出来るという結論に達しました。
なので、`"\C-r"` を差し替えても問題無いですね。

<ins>追記：
`(osascript -e 'tell application "System Events" to keystroke (ASCII character 30)' &)`
で ↑ をコンソールに送るようにしたので、目標の動作に達した感じです。</ins>
SwiftでRangeからArrayを取得する


`(1..100).toArray()`みたいな感じでできれば良かったんですが、このようなメソッドは用意されておらず。

しかたないのでキャストします。

```swift
let array = (Array<Int>)(1...100)

//あとは自由にArrayとして操作する
println array.map{ $0 * 10 }
```
Gitで編集済みファイルをignoreする

Gitでファイルを編集してから.gitignoreに追加しても無視されないので、`git update index`でgit上は編集してないと見なす。

ディレクトリ

~~~
git update-index --assume-unchanged ignore-dir-name/
~~~

特定のファイル

~~~
git update-index --assume-unchanged dirname/filename.json
~~~
php、strstr()、文字列が最初に現れる位置を見つける

php、strstr()、文字列が最初に現れる位置を見つける
==========


■about
----------

文字列が最初に現れる位置を見つける




■code
----------

```php:php
if ( strstr( $current_url , '/url/' ) ){ echo 'current'; }
```




■reference
----------

PHP: strstr - Manual
http://php.net/manual/ja/function.strstr.php
capistrano 3 書き方

Ruby on Rails4で動いているサイトの、複数台のwebサーバに最新ソースを適用して、更新があれば再起動させたくなりましたので、capistranoのコードを書きました。

```/config/deploy.rb
namespace :apache do
  task :deploy do
    on roles(:web) do
      within "git管理下のディレクトリ" do
        puts '> git pull'
        out = capture(:git, "pull")
        puts out
        if out != 'Already up-to-date.' 
          puts '> sudo service apache2 restart'
          puts capture(:sudo, "service apache2 restart")
        end
      end
    end
  end
end
```


webサーバの定義は、環境ごと(staging.rb,production.rbなど)に別ファイルで定義しております。

```/config/deploy/staging.rb
 :
role :web, %w{hoge.com fuga.com}
 :
```

これをJenkinsに登録して、Jenkinsから実行することでタスクの実行者の履歴を残しています。


そもそもcapistranoのタスクの記述言語がわからず悩みましたが、なんとか動きました。
cd できないできない :tired_face: と思っていたら、within で行けるのですねー。 :smiley: