OmniAICreator/Qiita-1.07M huggingface dataset:
CentOSのOpenSSLのバージョンと脆弱性対応の関係を調べる

## はじめに

最近もOpenSSLの脆弱性が報告されました。どのバージョンでどの脆弱性に対応しているかはOpenSSLの[リリースノート](https://www.openssl.org/news/openssl-1.0.1-notes.html)に記載されています。

ただ、CentOSのリポジトリはなぜかバージョン表記が異なるため、この表が使えません。ということで確認方法を調べました。

## CentOSでの確認方法

rpmコマンドで確認が可能です。

``` 

#export LANG=C
#rpm -q --changelog openssl

* Wed Oct 15 2014 Tom<C3><A1><C5><A1> Mr<C3><A1>z <tmraz@redhat.com> 1.0.1e-30.2
- fix CVE-2014-3567 - memory leak when handling session tickets
- fix CVE-2014-3513 - memory leak in srtp support
- add support for fallback SCSV to partially mitigate CVE-2014-3566
 (padding attack on SSL3)

* Fri Aug 15 2014 Tom<C3><A1><C5><A1> Mr<C3><A1>z <tmraz@redhat.com> 1.0.1e-30
- add ECC TLS extensions to DTLS (#1119800)

* Fri Aug 08 2014 Tom<C3><A1><C5><A1> Mr<C3><A1>z <tmraz@redhat.com> 1.0.1e-29
- fix CVE-2014-3505 - doublefree in DTLS packet processing
- fix CVE-2014-3506 - avoid memory exhaustion in DTLS

....以下省略
```
一世を風靡した Heartbleedの脆弱性は[CVE-2014-0160](https://www.openssl.org/news/vulnerabilities.html#2014-0160)で、
上では省略していますが、

```
* Mon Apr 07 2014 Tom<C3><A1><C5><A1> Mr<C3><A1>z <tmraz@redhat.com> 1.0.1e-23
- fix CVE-2014-0160 - information disclosure in TLS heartbeat extension
```

に含まれています。

何か勘違いがあればおしらせください。

ではでは。
Tera Term マクロで公開鍵認証SSH

以下は EC2 インスタンスに SSH する例。
pem ファイルを ppk 形式に変換しなくていいのはうれしい。

```
HOSTADDR = 'ec2-www-xxx-yyy-zzz.ap-northeast-1.compute.amazonaws.com'
USERNAME = 'ec2-user'
KEY_FILE = 'C:\path\to\keyfile\default.pem'
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=publickey /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /keyfile='
strconcat COMMAND KEY_FILE
connect COMMAND
end
```
Ubuntuでknife-soloをインストールするときにエラー

ubuntuでknife-soloをインストールしようとして下記のエラーが出てしまいました。

    Building native extensions.  This could take a while...
    ERROR:  Error installing knife-solo:
    	ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.1 extconf.rb
    mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

    extconf failed, exit code 1

    Gem files will remain installed in /var/lib/gems/2.1.0/gems/libyajl2-1.1.0 for inspection.
    Results logged to /var/lib/gems/2.1.0/extensions/x86-linux/2.1.0/libyajl2-1.1.0/gem_make.out

下記を実行で解決
`sudo apt-get install ruby2.1-dev`

ネット上で　sudo apt-get install ruby-dev　とすれば解決と書いてあったが、実行しても*ruby-dev は既に最新バージョンです*と出るのみ。
もっと調べたところ　ruby2.1-dev　も必要だったようです。

ちなみにこれでbundleのエラーも出なくなりました。
iterm2でtmuxのバッファスクロールが出来るようにする！！


##概要
便利なtmuxなわけですが、一点だけ不便な点があります。ソレはがマウスでスクロールできない！
設定すれば出来るようになるわけですが、macでやる場合少し複雑で手間取ったのでメモを残しておきます。

##設定
linuxなどでは以下の設定を.tmux.confに書き加えるだけで出来るようです。

```
set-window-option -g mode-mouse on
# 親端末のTERMがxtermの場合
set -g terminal-overrides 'xterm*:smcup@:rmcup@'
```

#macでは動かない！
スクロールできないというより、画面全体が動いてしまう感じです。
これはterminalやiTermの問題らしいので、そっちらの設定が必要になってきます。

自分はiTerm2を使っているのでそちらの設定を載せていきます。
terminalについては[MacのTerminalでtmuxスクロールをするか](http://opamp.hatenablog.jp/entry/20111106/1320572057)を参照するといいと思います。

#iTerm2の設定
調べたところ、```Enable xterm mouse reporting```をチェックすれば解決するらしいらしいですが、自分の環境ではすでにチェック済みでした。

```Enable xterm mouse reporting```は```Preference -> Profiles -> Terminal```にあります。

そこで```Save lines to scrollback when an app status bar is present```をチェックすれば動くようになりました！バンザイ！

![](https://www.dropbox.com/s/a66a7h5qo4hvvpt/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014_11_06_22_57.png?dl=1)
PHPでベイジアンフィルタを書いてみた


勉強のため、PHPでベイジアンフィルタを書いてみました。下記のサイトを参考にしています。スムージングとして、単語の出現回数に1を足しています。アルゴリズムはリンク先の解説が正確だと思うので、割愛しますが、手計算での計算と結果は合っているので、多分正しく動作しているかと。
●参考：
第3回　ベイジアンフィルタを実装してみよう　http://gihyo.jp/dev/serial/01/machine-learning/0003?page=2

P(word|cate)を求める時の分母になるカテゴリの全単語出現回数（`getAllWordNumCate($cate)`）を都度計算しているので、無駄がありますが、分かりやすさを優先してそのままにしています。


```php:Classifer.php
<?php

error_reporting(E_ALL & ~E_NOTICE);

/**
 * Classifier
 *
 * @package
 * @author kure
 */
class Classifier {

    private $cc = array();
    private $fc = array();

    private function getwords($doc) {
        return array_unique(preg_split("/\\W/", $doc));
    }

    /**
     * 
     * @param type $doc
     * @param type $cate
     */
    public function train($doc, $cate) {
        $this->cc[$cate] ++;
        $words = $this->getwords($doc);
        foreach ($words as $v) {
            $this->fc[$v][$cate] ++;
        }
    }

    /**
     * 
     * @param type $cate
     * @return type
     */
    private function cateProb($cate) {
        $total = 0;
        foreach ($this->cc as $v) {
            $total = $total + $v;
        }
        return $this->cc[$cate] / $total;
    }

    /**
     * 
     * @param type $word
     * @param type $cate
     * @return type
     */
    private function getWordNumCate($word, $cate) {
        foreach ($this->fc as $key => $value) {
            if ($key === $word) {
                return $value[$cate] + 1;
            }
        }
    }

    /**
     * 
     * @param type $cateSelected
     * @return type
     */
    private function getAllWordNumCate($cateSelected) {
        $total = 0;
        foreach ($this->fc as $key => $value) {
            foreach ($value as $cate => $num) {
                if ($cate === $cateSelected) {
                    $total = $total + $num;
                }
            }
        }
        return $total;
    }

    /**
     * P(word|cat)
     * @param type $word
     * @param type $cate
     * @return type
     */
    private function wordCateProb($word, $cate) {
        return $this->getWordNumCate($word, $cate) / $this->getAllWordNumCate($cate);
    }

    /**
     * P(doc|cat) = P(word1|cat)P(word2|cat)...
     * @param type $doc
     * @param type $cate
     * @return type
     */
    private function docCateProb($doc, $cate) {
        $wordArr = $this->getwords($doc);
        $wordProbArr = array();
        $wordProbTotal = 1;
        foreach ($wordArr as $word) {
            $wordProbTotal = $wordProbTotal * $this->wordCateProb($word, $cate);
        }
        return $wordProbTotal;
    }

    /**
     * P(cat|doc) = P(doc|cat)P(cat)
     * @param type $doc
     */
    public function classify($doc) {
        foreach ($this->cc as $cate => $num) {
            echo $cate . ": " . $this->cateProb($cate) * $this->docCateProb($doc, $cate) . "\n";
        }
    }

}

$c = new Classifier();
$c->train("I have", "bad");
$c->train("I donnot", "good");
$c->train("I know", "bad");
$c->classify("I");
```

```lang:実行結果
bad: 0.5
good: 0.33333333333333
```
ffmpeg の colorchannelmixer が windows で期待通りに動作しない ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい 

ffmpeg には簡単な色効果を動画につけるフィルター機能があります。colorchannelmixer って言います。これがどうやら windows 版（手元はwin7 64bit）では期待通り動作しないようです。

困った :cry: 

```bash
ffmpeg -i sample.mp4 -filter_complex "colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3" grayscale.mp4
```

グレースケールに変換するフィルターはこんな感じなんですが（※ドキュメントそのまま）、Linux（Ubuntu）では期待通りの動画ができますが、Winだと変な色の砂嵐みたいな動画が出来上がるわけです。

なんでだろうなぁぁ・・・ :tractor: 何とかせねば
Gemfury 関連記事 #gemfury

# Gemfury 関連記事 #gemfury

更新日: 2014/11/06 22:21:45

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Gemfury  gemfury gem で Gemfury のリポジトリをコマンドライン経由でサクサク操作する #gemfury](http://qiita.com/tbpgr/items/288bbbeba76c7b9bd208)|2014/11/06 22:20:36|0|
|2|[Gemfury  クラウドパッケージリポジトリ Gemfury に build した gem を公開する方法 #gemfury](http://qiita.com/tbpgr/items/00daad487767dde1af62)|2014/10/31 22:41:13|0|
|3|[Gemfury  クラウドパッケージリポジトリ Gemfury の登録、疎通確認まで #gemfury](http://qiita.com/tbpgr/items/7298faf1242370bde2ce)|2014/10/31 22:38:41|0|
|4|[Ruboty  Gemfury に登録した Private な Gem を利用した Ruboty を Heroku にデプロイして、 Slack と連携する #ruboty #gemfury #slack](http://qiita.com/tbpgr/items/8819a93ffea317171b3d)|2014/10/31 22:47:52|1|
Elixir Module | Namespace and Nesting #elixir

# Elixir Module | Namespace and Nesting

## 概要
Elixir の Module が持つ Namespace の役割と Nesting について。

## Namespace
Elixir のモジュールは Namespace の役割を果たします。
モジュール外からモジュールの関数を利用する場合は `SomeModuleName.function_name` のように記述します。
モジュール内からモジュールの関数を利用する場合はモジュール名を省略できます。

~~~
defmodule SomeModule do
  def hoge do
    "hoge" <> hige
  end

  def hige do
    "hige"
  end
end

IO.puts SomeModule.hoge
~~~

* 出力

~~~
hogehige
~~~

## Nesting
モジュールはネストすることができます。
ネストしたモジュールを書く場合、 `defmodule` をネストさせる方法と、
ドットでつないで一気に記述方法があります。

~~~
defmodule ParentA do
  defmodule ChildA do
    def hoge do
      "hoge1"
    end
  end

  defmodule ChildB do
    def hoge do
      "hoge2"
    end
  end
end

IO.puts ParentA.ChildA.hoge
IO.puts ParentA.ChildB.hoge

defmodule ParentB.ChildA do
  def hoge do
    "hoge1"
  end
end

defmodule ParentB.ChildB do
  def hoge do
    "hoge2"
  end
end

IO.puts ParentB.ChildA.hoge
IO.puts ParentB.ChildB.hoge
~~~

* 出力

~~~
hoge1
hoge2
hoge1
hoge2
~~~

## 関連
* [Elixir Modules](http://qiita.com/tbpgr/items/23ea8ee7d2ce8fee2aed)
* [Elixir Attribute](http://qiita.com/tbpgr/items/f0407cab26f2859cfba3)
コンソールから Embedded Document の Array の各要素を更新する


Array を更新するための Operator はいろいろとあるものの、$ を使用しても条件にマッチする `first element` しか更新できない。

条件にマッチする要素全てを同時に更新するためには、forEach を使って行う。

```mongo
db.collection.find(
    { "arrays" : { $size: 2 }
).forEach( function(doc) {
    doc.arrays.forEach(function(element) {
      element.hoge = 'hige'
    })
    
    db.arrays.save(doc);
})
```

深い Embedded Document でも対応できるけど、なかなか面倒。
VMWarePlayerでVine6.2をGUIインストールするときの注意点

VMWarePlayerでVine6.2をインストールしようとした時に下記のようなメッセージが出て、テキストモードでのインストールになってしまった。

>You do not have enough RAM to use the graphical installer. Starting test mode.

メモリをデフォルト256MBのまま動かしたからで、メモリを512MBにしたらGUIインストールが始まった。
過去のcommitの状態に戻したいときのgitコマンド

過去のcommitの状態に戻したい！そんな時に。
今回は過去のキャンペーンページのスクショを撮りたかったので戻しました。

例) 
3dae98kz(コミット)の状態と同じ 
past_campaignPage ブランチを作りたい場合

git checkout 3dae98kz -b past_campaignPage
USB接続できないArduinoにソースを書き込むとき


例えば[Arduino Pro Mini](http://www.arduino.cc/en/Guide/ArduinoProMini)という基板にUSBの差し込み口がないやつや、Arduino Nanoなどを使用したい場合は秋月などで買える以下の様なUSBシリアル変換器が必要です。

![FT232](http://i.gyazo.com/b4ffbe4c6a32960f732ae57053555495.png)

[ＦＴ２３２ＲＬ　ＵＳＢシリアル変換モジュール: 半導体 秋月電子通商 電子部品 ネット通販](http://akizukidenshi.com/catalog/g/gK-01977/)

## Install USB Serial Driver

秋月のやつの場合はFTDIというチップを使っているので、以下のサイトからドライバーをダウンロードしてインストールする必要があります。

[FTDI Driver Download Page](http://www.ftdichip.com/Drivers/VCP.htm)

2つファイルが入ってますが「FTDIUSBSerialDriver_10_4_10_5_10_6_10_7」の方ならYosemiteでも大丈夫です。

またマイクロUSBではなく、ミニUSBが必要なので一緒に買っておくといいでしょう。

## 配線

![DFRduino](http://i.gyazo.com/2c34586631518b38fb30c2f32dc514ea.png)

[DFRduino Pro Mini V1.3(16M5V328)](http://www.dfrobot.com/index.php?route=product/product&product_id=696)

例えば一緒に秋月で買ったArduino Pro Mini互換のDFRduino Pro Miniにプログラムの書き込みを行ってみます。

![haisen](https://lh5.googleusercontent.com/-lGgB32PSMNg/VFihXm-jeBI/AAAAAAAAuno/ogcWOA-AizE/w1036-h778-no/IMG_0563.JPG)

配線はなれると同じようなやつなら全部なんとなくでつなげるようになります。

対応表は以下

| Arduino     | シリアル変換器 |
|:------------|:------------|
| VCC | VIO |
| GND | GND |
| RXI | TXD |
| TXD | RXD |
| DTR | 写真の左下のPIN |

TとRは反転して接続する、くらいに覚えておくといいでしょう。

## 書き込み

これでArduino IDEから書き込めるようになります。

メニューのツール＞マイコンボードから以下のようにArduino Pro or Pro Miniを選択しましょう。

![maicon](http://i.gyazo.com/c57a7bd5bf7b6a6590bb594fcfb1ddf7.png)

これで書き込めるはずです。
Linux MintでRuby 2.1.5をソースコードからコンパイルしてインストール

Ruby 2.1.5をソースコードからコンパイルしてインストールするのに、はまったのでメモ。環境は Linux Mint 17 “Qiana” Cinnamon (64-bit) です。たぶんUbuntuでも、同様の手順でインストールできるかと思います。

**2014年11月14日　Ruby 2.1.5でも同様の手順でインストール可能なことを確認しました。したがって、文章中の「2.1.4」を、「2.1.5」へと機械的に置換しました。**

当然ですが、ターミナルでの作業になります。

まず、何はともあれRubyの公式サイトから ruby-2.1.5.tar.gz をダウンロードしてきて、アーカイブを解凍します。

```
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz
$ tar -xvzf ruby-2.1.5.tar.gz
```

次に、`cd ruby-2.1.5` で `./configure` とやりたいところですが、これでは失敗します（以下の記事が参考になりました。ありがとうございます： [UbuntuでRals3.2.3　(4) はじめてのRubyGemsは・・・失敗。さあどうする？](http://supportdoc.net/topic/linux/ubuntu-ror4.html)）。

というわけで、まずは、

```
$ sudo apt-get install zlib1g-dev libncurses5-dev libyaml-dev libssl-dev libsqlite3-dev
```

してやります。

これが終わったら、次に、`cd ruby-2.1.5/ext/zlib` して、

```
$ ruby extconf.rb --with-zlib-include=/usr/include -with-zlib-lib=/usr/lib
```

と打ち込みます。そうするとこんなエラーが出て怒られますが、

![Ruby-2.1.4_Compile_Install_1.png](https://qiita-image-store.s3.amazonaws.com/0/58457/40e85050-dbc4-df42-4426-5cb630815152.png)

`ruby1.9.1-dev`（`ruby-dev`でもOKみたいですが）をインストールすればOKらしいので、

```
$ sudo apt-get install ruby1.9.1-dev
```

します。ここで、もう一回、

```
$ ruby extconf.rb --with-zlib-include=/usr/include -with-zlib-lib=/usr/lib
```

しますと、こうなるはずです。

![Ruby-2.1.4_Compile_Install_2.png](https://qiita-image-store.s3.amazonaws.com/0/58457/5dabef89-3be0-f0d2-dab4-d4b029bd379c.png)

ここまで来れば、あとは `ruby-2.1.5` に移動して、

```
$ CC=clang ./configure --prefix=/usr
$ make
$ sudo make install
```

すればOKです（gccでなくclangなのはご愛嬌）。お疲れ様でした。
なお、インストールしたRubyをアンインストールするときは、

``` 
$ cat ruby-2.1.5/.installed.list | xargs rm
```

で、OKらしいです。絶対に最後の`rm`に-rをつけてはいけません。私はうっかりこれをやってしまい、Linux Mintを再インストールする羽目になりました。
Swiftのextensionの挙動をゆる〜く確認してみた


githubに公開されているライブラリーのソースコードを確認すると、
自分がSwiftの基本的な文法で理解できてないものが多いので、
学習のメモとしてまとめてみます。
今回は、extentionの挙動を、継承も踏まえて確認してみました。

まずは、使用するクラスの定義をします。

```
// 基本となるクラス
class Food {
    func show() -> String {
        return "food"
    }
}

// Foodを拡張したクラス
extension Food {
	// 追加したメソッド
    func aging() -> String {
        return "aging food"
    }
	// 全く同じインターフェースのメソッドは追加できず、
	// コンパイルエラー(Invalid redeclaration of show())となる
    //func show() -> String {
    //   return "extended food"
    //}

	// これは可能
    func show(with: String) -> String {
        return "food with \(with)"
    }
}

// Foodを継承したRiceクラス
class Rice : Food {
	// ただのoverride
    override func show() -> String {
        return "rice"
    }

	// ↓のようなコンパイルエラーとなります。
	// Declarations from extensions cannot be overridden yet
    //override func aging() -> String {
    //    return "override aging food"
    //}
}
```

ここでは、Foodを拡張させて、aging()を追加してみました。
なお、show()に関しては、上記のように追加できるものもあれば、できないものもあります。
そして、Riceでaging()をoverrideすると、コンパイラーにおこられます。
まだoverrideできないよという意味らしく、yetの意味が気になりますね。今後サポートされるのでしょうかね。
そもそもデザインパターン的にありえないとかそういう観点もあるのかもしれませんが、勉強不足にてちょっとわからないです。

次は、実際にメソッドを実行してみます。

```
var food = Food()
println(food.aging()) // aging food
println(food.show()) // food
println(food.show("sweet sauce")) // food with sweet sauce

var rice = Rice()
println(rice.aging()) // aging food
println(rice.show()) // rice
println(rice.show("curry")) // food with curry
```

という感じの挙動になります。
Foodを拡張させてaging()を追加させたことで、aging()が実行できるようになりました。
もちろん、Foodを継承したRiceも拡張されていて、
aging()やshow(with:String)が実行できます。
Riceのaging()は、上でも説明しましたが、overrideできず親クラスのメソッドとなります。

今日はこんなところで失礼します。
実際に上にソースコードをPlaygroundにコピペして実行し、
色々いじってみることを強くおすすめします。
おそらくその方が理解が深まると思います。
picojsonを使用してHTTP(POST)通信する


picojsonを使用して、JSONフォーマットのデータをPOSTでサーバーに送信します。

```cpp:POST送信
auto request = new cocos2d::network::HttpRequest();
request->setUrl("http://xxxx/login.php");
request->setRequestType(cocos2d::network::HttpRequest::Type::POST);
request->setResponseCallback(CC_CALLBACK_2(LoginScene::callbackHttpRequest, this));
request->setTag("Login");

picojson::object obj;
obj.insert(make_pair("account_name", picojson::value(m_pEditBoxAccountName->getText())));
obj.insert(make_pair("password", picojson::value(m_pEditBoxPassword->getText())));

picojson::value val(obj);
std::string json = val.serialize();
request->setRequestData(json.c_str(), json.length());

auto httpClient = cocos2d::network::HttpClient::getInstance();
httpClient->enableCookies(nullptr);
httpClient->send(request);
```

サーバーでは、POSTされた生データをJSONフォーマットにデコードします。

```php:サーバ側PHP
<?php
$postData = file_get_contents("php://input");
$inputData = json_decode(stripcslashes($postData));

// テスト（送信データをそのまま返す）.
header('Content-type:application/json');
echo json_encode($inputData);
```

picojsonでサーバーからのJSONデータを取得します。

```cpp:受信
void LoginScene::callbackHttpRequest(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response)
{
	if (response->isSucceed()) {
		// dump data.
//		std::vector<char> *buffer = response->getResponseData();
//		printf("Http Test, dump data: ");
//		for (unsigned int i = 0; i < buffer->size(); i++)
//		{
//			printf("%c", (*buffer)[i]);
//		}
//		printf("\n");
		
		// json.
		std::vector<char> *buffer = response->getResponseData();
		const char *data = reinterpret_cast<char *>(&(buffer->front()));
		picojson::value v;
		std::string error;
		picojson::parse(v, data, data + strlen(data), &error);
		CCASSERT(error.empty(), error.c_str());
		
		picojson::object &obj = v.get<picojson::object>();
		std::string &name = obj["account_name"].get<std::string>();
		std::string &password = obj["password"].get<std::string>();
		CCLOG("name:%s password:%s", name.c_str(), password.c_str());
	}
	else {
		CCLOG("HttpRequest failed");
	}
}
```

このようにすれば、サーバーとの通信でいろいろできるようになります。

以上
Context Oriented Programmingを考察して素人が思うこと


プログラミングパラダイムの違いは、何を中心に整理するか、の違いです。

-

こんにちは！！
手続き、関数、オブジェクトが繋がっていることについては以前記事にまとめましたが、世の中ではいろんなパラダイムが提唱されているようです！
その中でもうん？と思ったContext Oriented Programmingについて考えてみました。

#COPとは？
読みが同じでも、文脈によって意味が決定することがよくあります。
例えば、

「マック買おうぜ」

といった場合、お昼時か、Win機で黒い画面叩いてるときかで意味が異なります。

この例のように、呼び出し元の状況に応じて中の動作がかわるのがCOPです。

しかし、これは目新しい概念なのでしょうか？
オブジェクト指向プログラミングではStrategyパターン、関数型プログラミングではクロージャ。
このように、「外から中の動作を動的に変更する」方法は昔から存在します。

ですが、COPが特異なのは、オブジェクト（あるいは関数）を横断して振る舞いを変化させる点です。

たとえば、DBの参照先を動的に変えたい!
でもDAO層なんかないよ！！DatabaseオブジェクトにSQLぶっこんでるよ！！SQLぶっ込んでるコードは星のようにちらばってるよ！！という状況だと非常に欲しいですよね（突っ込みは無しで……）

先の方法が縦のカスタマイズなら、こちらは横のカスタマイズです。つまり、先のパラダイムを置き換える物ではなくて、組み合わせて使うことができるものなのです。

COPのメインコンポーネントはLayerと呼ばれる物です。これにContext（変化させたい実装）をまとめて詰め込んで、Activate（これから使うよという宣言）することによってScope内でのみ切り替えます。疑似言語で書くとこんな感じでしょうか。

activate お昼時
  call マック買おうぜ
\> おっいいね！！

activate Winの黒い画面と格闘中
call マック買おうぜ
\> 高いよ！！

#でもそれって…
Aspect Oriented Programmingを思い出しますよね(AspectJとか)
実際、AOPの系譜になるらしいです。

そして、COPの実装に必要な機能を言語レベルで提供しているものもあります。

##AspectJ
adviceをプラガブルにするようにコードを書けば、可能なようです(run-time weaving)。

##Common Lisp
普通はレキシカルスコープの言語ですが、必要に応じてダイナミックスコープも扱えます。さらにその実装はDeep Bindingのため、定義した部分のスコープを出ると前の値が見えます。上手く使えばCOPの実装に使えそうです。
他のダイナミックスコープ言語も可能かもしれません。

##Ruby
2.1で入った例のあれです、Refinementです。モンキーパッチを飼いならす方法ですが、これはほとんどCOP実装と言っていいかもしれません。

##JavaScript
prototypeベースの継承をしている場合限定ですが、prototypeを実行時にいじることで実現できます。でも多分v8さんが悲鳴を上げます。
動的にクラス定義をいじれる言語は、ライブラリレベルでCOPを実装可能でしょう。

以上です！！AndroidでAspectJ使ってみたくなってきました（使えるのかな？）よいプログラミングライフを！！！
YosemiteにしたFluid.appでGmailがグダグダになってるのをなおす

# Fluidって？

Fluid - Turn Your Favorite Web Apps into Real Mac Apps.
http://fluidapp.com/

GmailとかWebサイトをアプリ化するやつです。べんり。無料。

# YosemiteにしたらFluidのUserAgentが変更になってて、グダグダになる


## グダグダ例

* ヘッダがダサくなってる
* 添付ファイルを開けなくなってる

## UserAgentの設定方法

![20141106202722.png](https://qiita-image-store.s3.amazonaws.com/0/2631/d3660d93-b01f-8b25-4cc6-71c470084af5.png)

~~ここからChromeに設定すればOK~~
最近はSafariにしておけばOK！Chromeに設定するとバグります！

ウェ～イ！！！！！ウェウェウェウェ～～～～～～～イ！！！！！！！
RailsでValidationを行わずDBにデータを挿入する方法



saveメソッドに`validate: false`を渡せばOK

以下、例

```
user = User.new(name: "itkrt2y", email: "itkrt2y@example.com")
user.save(validate: false)
```

コンソールからバリデーションに沿わない特殊なデータ（例えば、管理者ユーザーとか）作るのとかに便利そう

また、update系メソッドにもバリデーションするものしないものあるけど、ここでは割愛
iOS8 (Safari8) で "クレジットカードを読み取る" に対応する


iOS Safari 8 からクレジットカード番号をカメラで読み取れるようになりました。

下図のようにカード番号の入力フォームにフォーカスした時に `クレジットカードを読み取る` が表示されます。

この `クレジットカードを読み取る` を選択できるようにするには少しだけHTMLに手を加える必要があります。

![safari8_creditcard_scan.png](https://qiita-image-store.s3.amazonaws.com/0/8091/2a2d949a-fcc5-0c8f-5252-05dea09181f5.png "safari8_creditcard_scan.png")

## クレジットカード入力フォームであることを明示する

Safariがクレジットカードの入力フォームと認識するには幾つかのルールがあるようです。
`input` タグに対して `name` や `id` を指定することで認識してくれます。

- name="addCreditCardNumber"
- name="cardNumber"
- name="cardnumber"
- id="cardNumber"

`name` を変更するとサーバサイドへのパラメータに影響するので今回は `id` 指定でいくことにしました。

```
<input type="text" id="cardNumber" name="cc_number">
```

これだけです。簡単ですね。

## さいごに

まだまだカメラの精度がいいとは言えないように思いますがHTMLを少し編集するだけでクレジットカードスキャンの機能が使えるのはとても便利ですね。

手元のカードが悪いのか `有効期限` は読み取ってくれませんでした。

## 参考

[When Scan Credit Card option is available on iOS8 Safari? - Stack Overflow](http://stackoverflow.com/questions/25163891/when-scan-credit-card-option-is-available-on-ios8-safari)
子Nodeの数を再帰的に全て数える(cocos2dx v3.2 以降)

ただ1階層下にある子Nodeの数を数えたいだけなら、以下のようにするだけ

```cpp
auto childrenNum = node->getChildren().size();
```

ある Node にぶら下がっている NodeTree 全てを再帰的に数えたいなら、 `enumerateChildren` を使えば出来た(cocos2dx v3.2 以降!)

```cpp
auto rootNode = cocos2d::Node::create();

auto child1 = cocos2d::Node::create();
auto child2 = cocos2d::Node::create();

auto grandChild1 = cocos2d::Node::create();
auto grandChild2 = cocos2d::Node::create();

rootNode->addChild(child1);
rootNode->addChild(child2);

child1->addChild(grandChild1);
child1->addChild(grandChild2);

/**
 *  Node構成は以下のようになってる
 *  
 *  rootNode
 *    + child1
 *      + grandChild1
 *      + grandChild2
 *    + child2
 */
```

上記のような構成の場合、`rootNode->getChildren().size()` の結果は `2` になる。
孫Nodeも含めて `4` を取得するためには、以下のような処理で実現できた。

```cpp
int countChildrenRecursively(cocos2d::Node* rootNode) {
    int count = 0;
    rootNode->enumerateChildren("//.*", [&count](cocos2d::Node*) -> bool {
        count++;
        return false;
    });
    return count;
}

int childrenCount = countChildrenRecursively(rootNode); // 4になるはず
```

`enumerateChildren` の第一引数には探したいNodeの `name` を指定するんだけど、
頭に `//` を加える事で検索が Recursive になる。
`name` 部分には正規表現が使えるので、`//.*` と指定すれば Recursive に全てのNodeが対象になる。
argumentsの簡単な使用例

js勉強中です。
argumentsの使い方を教えてもらったのでメモ。
<br>
例えば

```js:js
var sum = function (a,b,c,d,e) {
  return a + b + c + d + e;
}
sum(1,2,3,4,5);
```
このとき引数が100個とかになると大変
そんなときにargumentsを使うと便利

```js:js
var sum = function(){
  var total = 0;
  for (var i=0 ; i<arguments.length ; i++){
    total += arguments[i];
  }
  return total;
}
sum(1,2,3,4,5,.....,100);
```

とか

```js:js
var sum = function(){
  var total = 0;
  var args = Array.prototype.slice.call(arguments);
  for (var i=0 ; i<args.length ; i++){
    total += args[i];
  }
  return total;
}
sum(1,2,3,4,5,.....,100);
```
<br><br>

以下宿題

```js:js
sum(1,2,3,4,5,"test",[]);
```

みたいに文字列とか配列が入ったときに、
足さないようにconstructorを使ってなんとかする
Git rebaseでコンフリクト時のcheckoutオプションの--theirsと--ours

`Git rebase`でコンフリクトが発生した際の`git checkout --theirs`と`git checkout --ours`でどちらが適用されるのかよくわからず、適当にやったら失敗してしまったのでメモ。

###やりたい事
これを

    　　   ／ーーcーーd　
    　　 ／　　　　　 ^
    　 ／　　　　　BranchB
    ーoーーaーーb
    　　　　　  ^
    　　　　　BranchA

こうしたい

    ーoーーaーーbーーc'ーーd'
    　　　　　  ^　　　　　^
    　　　　 BranchA　　BranchB
ただし、aの変更とcの変更で、一部のファイルにて同じ箇所の修正を行っているが、aの方の変更をすべて適用したい。

###とりあえずやってみた
同じ箇所の修正を行っているため

    git checkout BranchB
    git rebase BranchA
と行うとコンフリクトが発生しrebase動作が一時停止する。

ここで、BranchAに存在するaの変更をすべて適用したかったので、「BranchBにいたから`git checkout --theirs hoge.txt`でしょ」として`git add hoge.txt`して`git rebase --continue`。
しかし最終的に出来てきたのはBranchBのcの変更をすべて適用した結果であった。

###やりたい事をやるためには

結論としては、コンフリクトが発生してrebaseの元(BranchA)を適用する際には、`git checkout --ours hoge.txt`とするべきであった。

動作を見た結果、おそらく以下のようになっている。

1. rebaseの元となるブランチ(master)に現在のBranchを移す
1. rebaseされるブランチ(BranchA)との共通コミット(o)から順次変更を取り込む
1. 最後のコミット(d)まで取り込んだら、rebaseされるブランチ(BranchA)の指す先を取り込んだところ(d')に変更する。

ユーザが操作する段階のカレントブランチからの視点では、`git merge`と`git rebase`とはコンフリクトが発生した際の`--theirs`と`--ours`の指定が逆になるので注意する必要がある。

###最後に

git rebaseの一つ一つのコミットを反映する出力を見ていればわかったはずですが、まじめに見ていなかった自分が悪いんですね。次からは気をつけて、明日またrebase作業します。
HomeBrewでフォントも管理する


HomeBrewを使うと，OSXのパッケージを管理できる．さらに[homebrew-cask](http://caskroom.io/)を使うと，Google Chromeのように`.dmg`として配布されるアプリケーションもインストールできる．

で，このhomebrew-caskには，フォントをインストールするための[homebrew-fonts](https://github.com/caskroom/homebrew-fonts)というCaskが存在する．

[Brefileが非奨励になった](https://github.com/Homebrew/homebrew/issues/30815)ため，パッケージは各々のシェルスクリプトで管理していると思う．例えば，以下のようなスクリプトを書いておけば，お気に入りのフォントもパッケージと同様に管理しておくことができる．


```bash:brew.sh
#!/bin/bash

# Add repository
brew tap caskroom/fonts

# fonts
fonts=(
    font-m-plus
    font-source-code-pro
    font-clear-sans
    font-roboto
)

# install fonts
echo "installing fonts..."
brew cask install ${fonts[@]}
```

このスクリプトを実行すると，フォントのダウンロードと，`~/Library/Fonts`への配置までやってくれる．

ダウンロード可能なフォントは，[ここ](https://github.com/caskroom/homebrew-fonts/tree/master/Casks)から確認できる．

## 参考

- [Hacker's Guide to Setting up Your Mac](http://lapwinglabs.com/blog/hacker-guide-to-setting-up-your-mac)
- [tcnksm/dotfiles](https://github.com/tcnksm/dotfiles)
Bashでviバインドの適用

タイトルのままです。
Bashでviをコマンド時に利用する方法を記述します。
コマンドは簡単で下記の通りです。
>$ set -o vi

上記コマンドを入力した後、Escapeコマンドを入力すれば、viモードに切り替わります。
例えば、bを押すと前の単語に移動することが確認できます。
>ls -lhtr | grepp **t**xt
>ls -lhtr | **g**repp txt


また通常のモードへの切り替えはEscapeコマンドをもう一度押すと切り替わります。
これで、コマンド間違えたときの矢印を連打しなくて済みますね：）
sqlite メモ



## 設定

$HOME/.sqliterc に設定を書いておくと、毎回 .header on とか
打たなくて良い。


```
.headers on
.mode line
```

mode は column, line などが指定可。


## 外部SQL文の読み込み


```
$ sqlite3 mydatabase.db < create.sql
```


## 大量のデータを突っ込む

auto commit みたいなのOFFにしないととても遅い。
begin してがーっとinsert, commit すると早い。

65000レコードで、下記のような感じ。

auto commit on: 72.91 sec
auto commit off: 15.99 sec


## TSVファイルのインポート

```
sqlite> .separator "\t"
sqlite> .import data.tsv table_name
```

## TSVファイルへのエクスポート

```
sqlite> .header off        /* ヘッダは表示しない */
sqlite> .mode tabs         /* TABに */
sqlite> .output hoge3.tsv  /* 出力先変更 */
sqlite> select * from table_name;
```

http://d.hatena.ne.jp/elm200/20071214/1197613850

## その他

.help すればだいたい分かる。
rails breadcrumbs_on_railsのメモ



[breadcrumbs_on_rails](https://github.com/weppos/breadcrumbs_on_rails)についての自分向けのメモです。

```ruby
#Gemfile
getm 'breadcrumbs_on_rails'
```

```ruby

#controller

class HomeController < ApplicationController
  add_breadcrumb "root", :root_path
  add_breadcrumb "home", :home_path

  def index
  end

  def menu1
    add_breadcrumb "menu1", :home_menu1_path # ここはもっと簡略化できるはず
  end

  def menu2
    add_breadcrumb "menu2", :home_menu2_path
  end

end
```


```slim
# slim
ol.breadcrumb
  = render_breadcrumbs tag: :li, separator: '>'
```
Python で Project Euler #3「最大の素因数」

[Problem 3 「最大の素因数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203)

> 13195 の素因数は 5, 7, 13, 29 である.
> 600851475143 の素因数のうち最大のものを求めよ.

```py:Python
target = 600851475143

x = target
i = 2
prime_factors = []
while x > 1:
  if x % i == 0:
    prime_factors.append(i)
    x = x / i
  else:
    i += 1

result = max(prime_factors)
print result
print result == 6857
print prime_factors
```

```:結果
6857
True
[71, 839, 1471, 6857]
```
IE6 mouseoverするとボタンの背景が消えるエラー解決策

# 問題
ここにmouseoverするとopacity 0.75がかかるボタンがあります。（jsでopacity指定）
IE6で見たとき、mouseoverするとボタンが消えてしまう現象をどうにかしてほしい。

```
	width: 150px;
	height: 37px;
	border: none;
	background-image: url("/common/○○/img/○○.png");
	background-repeat: no-repeat;
	background-position: 0 -50px;
	cursor: pointer;
	*border-width: 0;
```

## 解決策

IEではopacityが使えない。filterを使います。
ただ、今回はopacity指定はjsでやっていて、js触るの禁止で、
cssで直すしか道がない場合の解決策です。
mouseoverすると消えてみえるのは、opacityが0になっていると思われるので、
opacityを100％にします。

```
*filter: alpha(opacity=100) !important;      /* ie 6 7 */
```

だが、それだけだとmouseoverでボタンは消えたままでした。
hasLayoutをtrueにする必要があり、*zoom:1を足しました。


```
	width: 150px;
	height: 37px;
	border: none;
	background-image: url("/common/○○/img/○○.png");
	background-repeat: no-repeat;
	background-position: 0 -50px;
	cursor: pointer;
	*border-width: 0;
	*zoom: 1;
	*filter: alpha(opacity=100) !important;
```


これで消える現象はなくなりました。


### 参考：

Internet Explorer でフォームボタンの背景画像が表示されない
http://www.ilovex.co.jp/blog/system/webconsulting/internet-explorer.html

CSSで半透明にできるOpacityプロパティとIEでの問題について
http://blog1.erp2py.com/2011/04/cssopacityie.html
Funs can now be given names（funに名前が付けられるようになりました）

Erlang OTP 17.0のリリースページに次のような文言があります。

* Funs can now be given names

URL: [Erlang OTP 17.0 has been released](http://www.erlang.org/news/73)

しれっと書かれていますが、これは何ができるようになったのか。

サンプルがあまりなかったので自分で書くことにしました。

先に要約しておくと「fun（無名関数）に名前が与えられるようになる」ということです。 _（僕の中では、「無名とは！？」という気持ちですが、何かいい用語はあるのでしょうか…？「有名関数」？）_

よくある階乗のコードを関数ではなく無名関数で書くことにします。

```erlang
1> Fact = fun Fact (0, Acc) -> Acc;
1>            Fact (N, Acc) when N > 0 -> Fact(N-1, N*Acc)
1>        end.
#Fun<erl_eval...>
2> Fact(10, 1).
3628800
3> 
```

表題の仕様の追加で、上のように、funに名前が付けられるようになり、その無名関数内でその関数を使うことができるようになります。

ちなみに同じことを **R16B03** でやると、

```erlang
1> Fact = fun Fact (0, Acc) -> Acc;
1>            Fact (N, Acc) when N > 0 -> Fact(N-1, N*Acc)
1>        end.
* 1: syntax error before: '('
1> 
```

と怒られてしまいます。

**R16B03** で同じようなことをやろうとすると、関数を一つ引数で取る必要があります。

```erlang
1> Fact = fun (_, 0, Acc) -> Acc;
1>            (Fun, N, Acc) when N > 0 -> Fun(N-1, N*Acc)
1>        end.
#Fun<erl_eval...>
2> Fact(Fact, 10, 1).
3628800
3> 
```

以上！
NMatrixをUbuntu14.04 LTSにインストールする

現在開発中のRuby製データフレーム、[Mikon](https://github.com/domitry/mikon)のインストールには[NMatrix](https://github.com/SciRuby/nmatrix)が必要。

NMatrixのインストールにつまづく場合、以下を試すこと。

```
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get --purge remove liblapack-dev liblapack3 liblapack3gf
$ gem install nmatrix -- --with-opt-include=/usr/include/atlas
```

以上。
The Snack Sound Toolkit を Mac OS X 10.9 上の python で使う

# はじめに

音声に関係する研究者の中でも極一部の人にしか興味はないと思いますが，[WaveSurfer](http://www.speech.kth.se/wavesurfer/)という音声分析ツールで使われている[Snack Sound Toolkit](http://www.speech.kth.se/snack/)をMac OS X 10.9上のPythonで使おうというときの導入の方法です．

# Snackのインストール

## Tcl/Tkの導入

SnackはTcl/Tkにバインドされており，Pythondで利用する場合はPythonからTkを介してSnackを叩くという形になります．兎にも角にもTcl/Tkが導入されていないことには話しになりません．
OSX標準でTcl/Tkは入っているはずなのですが，その状態ではソースからのビルドが出来なかったのでHomebrewのtcl-tkパッケージで改めて導入を行います．

```bash
% brew tap Homebrew/dupes
% brew install tcl-tk 
```

## PythonをTcl/Tk対応にする

既にPython導入済みであっても，導入時にTcl/Tk対応にしていない場合は再インストールの必要があるようです．

```bash
% brew install python --with-brewed-tk
```

## Snackのビルドとインストール

[公式サイト](http://www.speech.kth.se/snack/)からアーカイブをダウンロードして展開します．

### ソースコードの修正

まず，generic/jkCanvSpeg.c にビルド時にエラーの原因となる部分があるので修正します．
具体的には39行目付近の

```cpp:jkCanvSpeg.c
#ifndef Solaris
```

から始まる TkPutImage の宣言がビルドの邪魔になるようです．
全体をスキップするように以下のように変更します．

```cpp:jkCanvSpeg.c(変更後)
#if 0
```

### ビルドとインストール

いよいよビルドとインストールです．unixフォルダ内で作業します．

```bash
% ./configure --with-tcl=/usr/local/opt/tcl-tk/lib --with-tk=/usr/local/opt/tcl-tk/lib LDFLAGS=-L/usr/local/opt/tcl-tk/lib CPPFLAGS=-I/usr/local/opt/tcl-tk/include --disable-stubs
% make
% make DESTDIR=/usr/local/opt/tcl-tk install
```

### Pythonパッケージのインストール

Pythonパッケージのインストールは至ってシンプルです．pythonフォルダ内で作業します．

```bash
% python setup.py install
```

# 使い方

基本的には doc フォルダ内にある python-man.html に従って利用します．
ただし，音声の録音や再生はできず，分析に限られると思います（未確認）．

## 初期化

全ての処理を行う前に以下の処理を行います．

```py
from Tkinter import *
root = Tk()

import tkSnack
tkSnack.initializeSnack(root)
```

## Soundオブジェクトの作成と音声ファイルの読み込み

以下の処理でSoundオブジェクトを作成し，データとしてtest.wavの内容を読み込みます．

```py
mysound = tkSnack.Sound()
mysound.read("test.wav")
```

## 各種分析

### パワースペクトル，対数パワースペクトル

パワースペクトル，対数パワースペクトルをリストとして取得します．
開始位置は start オプションで指定します．窓幅やFFTサイズなどもオプションで指定できるようです．詳細はマニュアルを参照のこと（と言ってもあまり詳しく載っていない）．

```
sp = mysound.powerSpectrum()
lsp = mysound.dBPowerSpectrum()
```

### ピッチ（F0; 基本周波数）

10ミリ秒毎のF0値をタプルとして取得します．
F0が計算できないところでは0が入ります．

```py
f0list = mysound.pitch()
```

### パワー

ピッチ同様10ミリ秒毎のパワー値をタプルとして取得します（単位は不明）．

```py
pwlist = mysound.power()
```

### フォルマント

10ミリ秒毎（f0やパワーと出てくる要素数が若干異なるので厳密には違うかも？）のフォルマントの推定値をタプルとして取得します．
要素自体もタプルとなっており，デフォルトでは8つの値を持っています．
マニュアルによると前半の4つがフォルマント位置，後半の4つが各フォルマントの帯域幅を表すそうです．

```py
fmlist = mysound.formant()
```
【Sublime Text】 デフォルトで使用する改行コードを指定する

デフォルトで使用する改行コードを指定します。
system : システムの既定のコード
windows : CR+LF
unix : LF

Preferences > Settings - User 
上記をひらいてください。

## 例

```
"default_line_ending": "system",
```

上記がデフォルトの表示です。
全てファイルの改行コードをLFに揃えたい場合は、

```
"default_line_ending": "unix",
```

と変えてください。

また、
メニューの[表示]>[改行コード]で改行コードの確認と変更ができる他、
Preferences > Settings - Userに"show_line_endings": trueと追記（または変更）すると、
ステータスバーからも確認と変更が出来るようになります。
Railsのrendar json:配列を、includesでネストさせる



# **概要**

Railsのrendar json:でだす配列を構造として以下の様な感じにネストさせたい。
userは何人かいて、todoがuserに紐づくデータです。


```
user: [{
    id: 1,
    name: aaaa,
    todo: [
        {id: 1, name: aaaaaaa, del: 1},
        {id: 2, name: eeee, del: 1},
        {id: 3, name: ccccc, del: 0},
        {id: 4, name: hhhhh, del: 0},
        {id: 5, name: kkkkk, del: 0},
    ]
},
{
    id: 2,
    name: aaaa,
    todo: [
        {id: 6, name: jjj, del: 1},
        {id: 7, name: ee, del: 1},
        {id: 8, name: gggg, del: 0},
    ]
},
{
    id: 3,
    name: aaaa,
    todo: [
        {id: 9, name: aaaaaaa, del: 1},
        {id: 10, name: eeee, del: 1},
        {id: 11, name: ccccc, del: 0},
        {id: 12, name: hhhhh, del: 0},
    ]
}
]
```


# **userを配列にする**

userは、取ってきたいユーザーidで繰り返す。

```rb
      users = []
      users.each do |target_ids|
        team_member_info.push(User.where(id: target_ids)[0])
      end

      render json: users.to_json
```


# **userに紐づくtodoを配列に組み込む**

検索するとき、includesを使います。to_jsonの方にはオプションをつけてあげます。
これにてtodoがuserの配列の中に組み込まれて、お目当ての配列になりました。

```rb
      users = []
      users.each do |target_ids|
        team_member_info.push(User.includes(:todos).where.(id: target_ids, "todos.deleted" => 0)[0])
      end

      render json: users.to_json(:include => :todos)
```


[akinomaeni](http://qiita.com/akinomaeni)さんに教わりました。いつもありがとうございます。
Selenium で Chrome の User-Agent を変更する方法

```rb:sample
user_agent =
    "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25"

driver = Selenium::WebDriver.for :chrome,
                                 :switches => %W[--user-agent=#{user_agent}]
```
【SublimeText】stylusでコロンありを標準設定にしたい

# はじめに
Sublime Text3にstylusプラグインを入れています。
(https://github.com/billymoon/Stylus)
色々便利なプラグインですが、
元々のCSS文法を生かして書きたいとき（現在の案件がそうなんです）
自動でプロパティとの間にコロン・セミコロンを無くされるのは困るため、
設定を変えました。
CSSからstylusにスムーズに移行したいですね。

# ここで設定します

preferences > Package Settings > Emmet >Settings -User

上記を開いて、以下を記入してください。

```
{

	"preferences": {
		"stylus.valueSeparator": ": ",
		"stylus.propertyEnd": ";"
	}
}
```

他にもカスタマイズできるので、見てみてください。
http://docs.emmet.io/customization/preferences/


参考：
https://github.com/sergeche/emmet-sublime/issues/210
RailsでViewのプロトタイピングを支援するGem ViewDataを作った


> Github halenohi/view_data
> https://github.com/halenohi/view_data

## こゆうものです

controllerからviewに渡すインスタンス変数を差し替えて、あたかもモデルが実装済みかのように振る舞います

FactoryGirlライクなDSLでデータを定義するのが特徴です

ただしモデルの ```attribute``` に相当する部分の命名とデータ形式に制限はありません
このGemではそれを```Node（ノード）```と呼んでいます。そしてノードが集まった１つの塊を```Data (データ)```と呼んでいます

__app/view_data/posts/_post.rb__

```
ViewData.define do
  data :post do
    title 'Awesome Post'
    body 'far far away long time ago...'
  end
end
```

__app/view_data/posts/index.rb__

```
ViewData.define do
  data :posts do
    collection :post, length: 3
  end
end
```


postデータにはtitleノードとbodyノードを定義しました。
postsデータにはpostデータを配列で３つ内包するように定義しました。

このように```app/view_data/posts/index.rb```と```app/view_data/posts/_post.rb```というファイルを作成しておくと、```app/views/posts/index.html.erb```をrenderする際に ```@posts``` を定義したデータで差し替えることができます。

差し替えると言ってもcontrollerで先に ```@posts``` をセットしていなくても大丈夫です

view内ではモデルのインスタンスのように扱えます

__app/views/posts/index.html.erb__

```
<% @posts.each do |post| %>
	<div>
		<h1><%= post.title %></h1>
		<p><%= post.body %></p>
	</div>
<% end %>
```

### 関連オブジェクトをシミュレートすることもできます

例えば Post が has_many :comments な関連を持つような場合このように定義します

__app/view_data/posts/_post.rb__

```
ViewData.define do
  data :post do
    title 'Awesome Post'
    body 'far far away long time ago...'

    comments do
      collection :comment, length: 3
    end
  end
end
```

__app/view_data/comments/_comment.rb__

```
ViewData.define do
  data :comment do
    body 'StarWars is my favorite movie!'
  end
end
```

先述にも出てきましたがノードのブロック内で ```collection``` というメソッドを使うと指定した名前からデータファイルを探してデータを拾ってきてくれます

データ名に ```:comment``` を指定すると自動で ```app/view_data/comments/_comment.rb``` を探すようになっています

もちろんview側では関連モデルのように扱えます

```
<% @posts.each do |post| %>
	<div>
		<h1><%= post.title %></h1>
		<p><%= post.body %></p>

       <div>
         <% post.comments.each do |comment| %>
           <p><%= comment.body %></p>
         <% end %>
       </div>
	</div>
<% end %>
```

### メソッドチェーンでも問題ありません

画像のアップロード等をしている場合 ```image.url(:thumb)``` といった感じでメソッドをチェーンして値を取り出す場合もありますよね。
その場合は以下のように定義します

```
ViewData.define do
  data :post do
    title 'Awesome Post'
    body 'far far away long time ago...'

    image.url 'http://sample.com/example-default.jpg'
    image.url(:thumb) do
      image.url.sub(/default/, 'thumb')
    end
  end
end
```

割とそのまま書けるといった感じです。
ノードの定義でブロックを使うとそれ以前に定義したノードの値を取り出すことができます。
上記の場合、画像名の```default```を```thumb```置き換えるだけで先に定義した```image.url```ノードの値を再利用しています

またお気づきかもしれませんが、引数によって返す値を切り替えることも可能です。


## なぜ作ったか

サーバーサイドとクライアントサイドの作業が分担されていて、別々のコンテキストで作業が進む場合の問題を解決したいと思いました

rubyでWebフロントエンドのプロトタイピングといえば __Middleman__ が主流かと思いますが、出来上がったコードをviewテンプレート化する際にミスったりする可能性はゼロではありません

また、単純に __テンプレート化__ という作業がDRYではありません。

「プロトタイピングして作ったviewがそのまま実際のモデルで動く」というのがコンセプトです

※ 注）僕はMiddleman好きです :)

あとはシングルページなアプリケーションを作る際にjbuilderとこのgemを組み合わせれば簡単にダミーjson apiが作れると思います。

例えばデザイナーさんでも積極的にRailsの開発に参加していければいいですね！

## まだ開発中

とりあえずGemfileにgithub指定してインスコすれば動きますが、いろいろ機能が足りていない（Configurationが無い）とかバグも沢山あるし、ドキュメントも無いしテストも不完全です

「エイやっ！」で作って「動いた！」という段階です

もし興味持って頂ける人がいたらダメ出しとかもらえるととても嬉しいです
csvを読んでelasticsearchのバルクインサート用のjsonに整形する

# csvを読んでelasticsearchのバルクインサート用のjsonに整形する

elasticsearchにバルクインサートする時、
データのjson1行につきコマンドのjsonを1行追加しないとならないので。

see also:
http://blog.johtani.info/blog/2014/04/24/usage-stream2es/

_stream2es_ だと一気に登録までしてしまうので、
変換の時点で一度確認したかったので書いてみた。

## 中身は

1行目にヘッダ。
それ以降がデータ。

エスケープなどは[__RFC4180__](http://www.kasai.fm/wiki/rfc4180jp) っぽい感じ。

```text:items.txt
"item_id","title","description","price","url","image_url"
"11111","たいとる","でぃすくりぷしょん","1000","http://example.com/item/11111","http://example.com/11111.jpg"
"22222","たいとる2","でぃすくりぷしょん2","2000","http://example.com/item/22222","http://example.com/22222.jpg"
```

## 変換

rubyの__CSV__クラスがちゃんとcsv読んでくれるので、これを使うことにした。

が、パースにけっこう時間がかかるみたいなので、
大量の件数(百万件単位とか)扱う時は速度面で不安がある。

```rb:cmd2json.rb
#!/usr/bin/env ruby

require 'csv'
require 'json'
require 'securerandom'

line = STDIN.gets.chomp
csv = CSV.new(line)
header = csv.to_a[0]

INDEX = "test"
TYPE  = "type1"

CSV(STDIN).each_with_index do |row, i|
  index = { "index" =>
    { "_index" => INDEX, "_type" => TYPE, "_id" => SecureRandom.uuid }
  }
  puts JSON.dump(index)

  hash = Hash[header.zip row]
  puts JSON.dump(hash)
end
```

```bash:bash
cat items.txt | ./csv2json.rb > items.es.json
```

## esに登録

で、こう。

```bash:bulk.sh
curl -s -XPOST localhost:9200/_bulk --data-binary @items.es.json
```

## プロトタイプ

最初

1. csv => json
1. json => elasticsearch登録用のjson

ってやってみたけど、別に一気にやっちゃってもいいじゃん、
ってことで上記の形に落ち着いた。

`2.` の部分はbashでも書いたので、一応それも。
要 [_jq_](http://stedolan.github.io/jq/) 。

1行ごとに _jq_ 2回叩くので、
件数が多くなってくるとプロセスの起動と破棄コストがけっこう馬鹿にならなくなってくるため、あまりオススメはしない。
10万件くらい流し込んだだけでもけっこう時間かかった。

```bash:cmd2es.sh
#!/bin/bash

set -u

_INDEX=$1
_TYPE=$2

while read -r line; do
    _ID=`uuidgen`
    cat <<EOD | jq -c .
{
    "index" : {
        "_index" : "$_INDEX",
        "_type" : "$_TYPE",
        "_id" : "$_ID"
    }
}
EOD
    echo $line | jq . -c
done
```

```bash:bash
cat items.json | ./cmd2es.sh foo bar > items.es.json
```
Chef-solo：レシピの中でChef実行中のユーザー名を使う


### ホームディレクトリにgitからClone
```ruby
git "/home/#{node['current_user']}/dotfiles" do
  repository "https://github.com/okisanjp/dotfiles.git"
  revision "master"
  user node['current_user']
  group node['current_user']
  action :sync
end
```

私の場合、いつもec2-user:ec2-user想定なのでグループにもcurrent_user使っています。
FTPサーバにログインするとき毎回ユーザとパスワードいれるのが面倒だったので


参照：http://kaworu.jpn.org/kaworu/2007-11-11-1.php

これの通りにやりました。

```.netrc
machine         ftp.example.com
login           ftpuser
password        security-issue
```

あとは

```
$ftp ftp.example.com
```

でかんたんろぐいん。
Userがログインしている時としていない時でルーティングを変える【Rails + Devise】

```rb:config/routes.rb
Rails.application.routes.draw do

  # Userログイン時
  authenticated :user do
    root :to => "dashboard#dashboard", :as => "user_authenticated_root"
  end

  # User非ログイン時
  root "top#index"

end
```

非ログインを示す`unauthenticated`メソッドも用意されています。

[Class: ActionDispatch::Routing::Mapper — Documentation for plataformatec/devise (master)](http://www.rubydoc.info/github/plataformatec/devise/master/ActionDispatch/Routing/Mapper)
IntelliJ IDEAでserialVersionUIDを生成する

# 設定

IntelliJ IDEAの`Preference` / `Settings`から`Editor` - `Inspections`を選択し、`Serialization Issues`の`Serializable class without 'serialVersionUID'`にチェックを入れます。

こんな感じ。
![idea_serialversionuid.JPG](https://qiita-image-store.s3.amazonaws.com/0/6092/dba51a0f-076c-7b72-69c0-4163eaaa91cb.jpeg)

# serialVersionUIDを生成する

実際にSerializableインタフェースを実装するクラスを作成し、クラス名上で`Alt + Enter`で`Show Intention Actions`を表示すると、以下の様に`Add 'serialVersionUID' field`という選択肢が出てきます。

![idea_serialversionuid_gen.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/eea9b99e-9ac4-b570-6eec-6e0d72d7bdea.jpeg)

選択すると、（そりゃそうなんだけど) `serialVersionUID`のフィールドを作成してくれます。
![idea_serialversionuid_generated.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/5bb2cf61-6fab-7d5b-29a9-d6fd9a001701.jpeg)

# 参考
* [java - IntelliJ Idea generating serialVersionUID - Stack Overflow](http://stackoverflow.com/questions/12912287/intellij-idea-generating-serialversionuid)
EC2 に EBS を増設する

## (1) EC2 と EBS を Attach

/dev/sdf として Attach したとする。
sdf 部分は変化するので注意。

## (2) Manual で Mount

```
mkdir /var/hoge/fuge
mkfs -t ext4 /dev/sdf
mount /dev/sdf /var/hoge/fuge
```

## (3) Fstab で自動 Mount するよう設定

```
vim /etc/fstab
/dev/sdf /var/hoge/fuge ext4 defaults 1 1
```
Swift でログ出力


どうやるのがいいのか悩みつつ、ログ出力用クラス内にクラスメソッドとして用意してみました。

# Logger クラスの作成

```Logger.swift
import Foundation

class Logger{
    class func log(message: String,
        function: String = __FUNCTION__,
        file: String = __FILE__,
        line: Int = __LINE__) {
            var filename = file
            if let match = filename.rangeOfString("[^/]*$", options: .RegularExpressionSearch) {
                filename = filename.substringWithRange(match)
            }
            println("Log:\(filename):L\(line):\(function) \"\(message)\"")
    }
}
```
## 説明

ログ出力時に、ファイル名、メソッド名、行を付加して出力しています。ファイル名を出力する際に __FILE__ を使っていますがフルパス表示は冗長だと思ったのでファイル名のみ出力するにしました。

# 使い方

```
Logger.log("hogehoge")
```

# 結果

コンソールに下記のように出力されます。

```
Log:ViewController.swift:L10:viewDidLoad "hogehoge"
```

# 最後に

ログレベルが指定できたほうがいいとは思いますがまずはこれを使っています。

こうやったほうがいいぜ、などあればコメントいただけるとうれしいです。
DjangoのQuerySet.delete が発行するクエリ

Djangoの `QuerySet.delete()` を実行した時に実際に、発行されるクエリがちょっと想定と違ったので、メモ。Django1.7、データベースはMySQLで確認しています。

#### 準備

- 以下のようなmodels.pyを用意。

```books/models.py
from django.db import models


class Author(models.Model):
    name = models.CharField(max_length=100)


class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author)

```

- テストデータを用意。

```python
>>> from books.models import *
>>> a1 = Author.objects.create(name='Alice')
>>> a2 = Author.objects.create(name='Bob')
>>> Book.objects.create(title='book1', author=a1)
>>> Book.objects.create(title='book2', author=a1)
>>> Book.objects.create(title='comic1', author=a2)
>>> Book.objects.create(title='comic2', author=a2)
```

#### 実験

`QuerySet.delete()` をいろいろな条件で実行してみた。

- 単にfieldで絞り込む場合

```python
>>> Book.objects.filter(title='comic1').delete()

DELETE FROM `books_book` WHERE `books_book`.`title` = 'comic1';
```

 素直に`DELETE FROM テーブル WHERE 条件` だった。


- 外部テーブルを参照する場合
 
```python
>>> Book.objects.filter(author__name='Bob').delete()


SELECT `books_book`.`id` FROM `books_book` INNER JOIN `books_author` ON ( `books_book`.`author_id` = `books_author`.`id` ) WHERE `books_author`.`name` = 'Bob';
DELETE FROM `books_book` WHERE `books_book`.`id` IN (11, 10);

```

`SELECT id FROM テーブル INNER JOIN ... WHERE 条件` してから
`DELETE FROM テーブル WHERE id IN (...)` していた。

- 親テーブルをdeleteする場合

```python
>>> Author.objects.all().delete()

SELECT `books_author`.`id`, `books_author`.`name` FROM `books_author`;
DELETE FROM `books_book` WHERE `books_book`.`author_id` IN (7, 8);
DELETE FROM `books_author` WHERE `books_author`.`id` IN (8, 7);
```

`SELECT id FROM 親テーブル INNER JOIN ... WHERE 条件`してから、子テーブルの関連するレコードをDELETEして、その後親テーブルのレコードをDELETE。
[ここ](http://docs.djangoproject.jp/en/latest/topics/db/queries.html#topics-db-queries-delete)曰く、

> Django は、オブジェクトを削除する際に、通常 SQLでいう ON DELETE CASCADE 制約をエミュレートします。すなわち、 削除対象のオブジェクトを指すような外部キーを持つ全てのオブジェクトも 同時に削除されるのです。

とのこと。リンク先の例ではインスタンスのdeleteメソッドだけど、QuerySetでも同じような動作になるようだ。

#### まとめ

外部テーブル参照したり、親テーブルの場合、想定通りの動作か確認しておいたほうがいい。

deleteに限らず、ORM経由で操作するときはどんなクエリになるか確認しておいたほうが良さげ。
BareリポジトリからWorkingディレクトリを取得する方法


## はじめに
業務であるプロジェクトのソースを見せてくれと言ったら、Bareリポジトリをもらい、そこからソースを引っこ抜くのに少し苦労したのでメモしておく。

## もらったもの

```cmd:tree_bare_repo
$ tree xxxx.git
xxxx.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-commit.sample
│   ├── post-receive.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── 00
<省略>
│   ├── info
│   └── pack
│       ├── pack-xxxx
<省略>
└── refs
    ├── heads
    │   ├── yyyyy
    │   ├── master
    │   └── zzzzz
    └── tags

```

## Bareリポジトリとは
[Bareリポジトリとは](http://www.nekotricolor.com/blog/2013/05/01/961/ Bareリポジトリとは)に書いてある通りで以下。

* Bareリポジトリ: Workingリポジトリを持たない管理用リポジトリ(.git)のみ持つリポジトリ
* No-Bareリポジトリ: Workingリポジトリと管理用リポジトリ両方を持つリポジトリ

## Workingディレクトリ取得
なんということはなく、いつも中央リポジトリにしているように以下のコマンドを実行すればよい。

```cmd:git_clone
$ mkdir -p work
$ cd work
$ pwd
/tmp/work
$
$ git clone /tmp/xxxx.git
Cloning into 'xxxx'...
done.
$ ls -1 xxxx/
apps
build.properties
build.xml
Capfile
chef
config
CONTRIBUTING.md
index.php
lib
plugins
README.md
vendors
webroot
$
```

## おわりに
この作業に結構時間を取られてしまった。
完全な勉強不足。

おしまい。
.jspをfindbugs

eclipseとか使えよって話かもしれませんが、コマンドツールでjspソースファイルをfindbugsにかけてみました。
tomcatを使ってる前提です。

手順としては、

1. .jspを実行してtomcatに.javaに変換してもらう。
1. tomcatに変換してもらった.javaを持ってくる。
1. javacでコンパイル
1. classファイルをめでたくfindbugsで解析

です。

※javacする時のクラスパスは適宜調整してください、サンプルでつくった.jspではこのクラスパスでコンパイルできました。

##シェルスクリプト
```shell-session

JAVA_HOME=/～/java/jdk**/
CATALINA_HOME=/～/tomcat/apache-tomcat-***
FINDBUGS_HOME=/～/findbugs-*

SOURCE="1.*"
TARGET="1.*"

#tomcatのworkからファイルを持ってきます。パスは適宜直してください。
cp ${CATALINA_HOME}/work/Catalina/localhost/～～/org/apache/jsp/～～/jsp/*.java .

#コンパイルします。
${JAVA_HOME}/bin/javac -deprecation -source ${SOURCE} -target ${TARGET} -encoding UTF-8 -Xlint:all -classpath "${CATALINA_HOME}/lib/servlet-api.jar:${CATALINA_HOME}/lib/jsp-api.jar:${CATALINA_HOME}/lib/el-api.jar:${CATALINA_HOME}/lib/jasper.jar" *.java > result.txt 2> err.txt

#コンパイルエラーを確認
cat err.txt

#findbugにかけます！
java -jar ${FINDBUGS_HOME}/lib/findbugs.jar -textui HELLO_jsp.class > bugs.txt

#解析結果を表示
cat bugs.txt
```
Capistrano 3 でディレクトリ作成時のumaskを指定する

capistrano側で`set`しても認識しない。SSHKitにダイレクトに指定しないとダメだ。

```rb:deploy.rb
SSHKit.config.umask = '002'
```

ちょっとしたプルリクで直るのでどなたか頼んだ！
挿入ソートをJavaScriptで実装してみる

[Wikipediaの挿入ソート](http://ja.wikipedia.org/wiki/%E6%8C%BF%E5%85%A5%E3%82%BD%E3%83%BC%E3%83%88 "挿入ソート")のC言語サンプルをそのままちょくやくしただけ。

キモはwhile部分。挿入したい要素以外の要素を後ろにずらし、x[j - 1] > tmpの時点で終了して要素をそこにぶっこむ。

```js
function isort(x) {
  for (var i = 1; i < x.length; i++) {
    var tmp = x[i];
    if (x[i - 1] > tmp) {
      var j = i;

      while (j > 0 && x[j - 1] > tmp) {
        x[j] = x[j - 1];
        // console.log("tmp: ", tmp, "x[j]: ", j, x[j]);
        j--;
      }
      x[j] = tmp;
    }
  }
  return x;
}
console.log(isort([4,3,5,2,1]));
```
Linuxコマンドは単語の意味を理解するとグッと身近なものになる


新人の頃、ファイルの中身を確認するために`cat`コマンドを使ったら怒られました。当時は`less`や`view`なんてコマンドがあるのも知りませんでしたし、周りも`cat`で中身を見ていたのでそれが当たり前だと思っていました。

まぁ、でもそれもそのはず、`cat`は`catenate`の略で連結するという意味があります。というわけで、多分普段よく使っているであろう17コマンド(+2オプション）の意味を調べてみました。

2014/11/18追記
`cd`, `pwd`の追記を行い19コマンドになりました。また、@Fool_Yahooman が[他の17コマンドの解説をコメント](http://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02#comment-0a071645c5c09bfb7a31)してくださっているのでこちらも是非。

|command|complete expression                           |meaning          |
|:----- |:---------------------------------------------|:----------------|
|man    |manual                                        |マニュアル         |
|cat    |catenate / concatenate                        |連結する           |
|tail   |                                              |後部              |
|(-f)   |follow                                        |追いかける         |
|cp     |copy                                          |コピー             |
|mkdir  |make directory                                |ディレクトリ作成     |
|rm     |remove                                        |削除               |
|(-rf)  |recursive, force                              |再帰的に、強制的に   |
|rmdir  |remove directory                              |ディレクトリ削除     |
|mv     |move                                          |移動               |
|cd     |change directory                              |ディレクトリ変更     |
|ls     |list                                          |リスト             |
|pwd    |print working directory                       |作業中ディレクトリ表示 |
|bg     |background                                    |バックグランド、後面 |
|fg     |foreground                                    |前面              |
|ps     |process status                                |プロセスステータス   |
|grep   |globally search a regular expression and print|全体から正規表現に一致する行を検索し表示する|
|du     |disk usage                                    |ディスク使用量      |
|df     |disk free                                     |ディスク空き容量    |
|chown  |change owner                                  |オーナ変更         |
|chmod  |change mode                                   |モード変更         |