OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsとUnix系でgnuplotのスクリプトを使い回す

#はじめに
WindowsでもUnix系OS(Mac・Linuxなど)でもgnuplotをインストールしていて作業を行いたい場合、スクリプトファイルを使いまわしたい時があります。Unix系OSでUTF-8のエンコーディングで書かれたスクリプトをWindows上で実行すると日本語部分が見事に文字化けします。Windows版のgnuplotではデフォルトでShift-JISとなっているからです。<del>いい加減UTF-8に対応しろこのクソOS</del>そこで、Windowsでも無理やりUTF-8で書かれたgnuplotスクリプトファイルを実行する方法を紹介します。

#スクリプトファイルの手直し
まず、スクリプトファイルに次の1文を加えます。場所はラベルなどで日本語が登場する箇所より前ならどこでも構いませんが、1行目を推奨します。

```gnuplot
set encoding utf8
```

#制限事項
WindowsでUTF-8のスクリプトファイルを実行する際には次のような制限があります。

- フォント名は使用する端末全てにインストールされているものに限定し、**英語で指定しなければならない**。(例: IPAゴシック→`IPAGothic`)
- 出力ファイル名・読み込みファイル名などのパスに日本語など**非ASCII文字は一切含んではいけない**。(Windows版gnuplotは`set encoding`で文字コードを指定してもファイル名などはShift-JIS固定となります)

これらを守らないと文字化けやそれによるエラーの原因になります。
Mac環境でPython3のインストール


ハマったのでメモ
ほとんど[こちら](http://qiita.com/spyc/items/73d1295f8b3dde3b49ca)を参考にさせていただきましたm(_ _)m

##環境
- OSX 10.10.5
- HomeBrewインストール済み

##手順

```bash
brew instal pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
pyenv install —list#最新版チェック
pyenv install 3.5.1
```

「zipimport.ZipImportError: can't decompress data; zlib not available」
となってインストールできなければ以下で解決できたっぽい。（[参考](http://apple.stackexchange.com/questions/71106/install-wine-via-homebrew-problem-with-zlib)）

```bash
brew rm libpng
brew install libpng --universal
brew install wine --with-gcc
```


インストールできたら

```bash
# バージョン切り替え
pyenv global 3.5.0
pyenv rehash
# 確認
python --version

# pipインストール
easy_install pip
# 確認
pip list
# パッケージ確認
pip freeze
# パッケージ書き出し
pip freeze > pip_packages.txt
# パッケージ読み込み（バージョン省略で最新版をインストール）
pip install -r pip_packages.txt
```
Swift2で録音と再生ができる簡易レコーダーを作ってみた


# やってみたこと
音をリアルタイムでモニタリングしてほげほげするアプリを作るために、「とりあえず録音と再生をできるようになろう！」とネットで調べながら、サンプルアプリを作ってみました。
録音してそれを再生する最低限の機能しか作ってません。状態に応じてのボタン表示を変更とかもしてないです。


# この記事が参考になるかもしれない人たち
* とりあえずswiftで録音と再生をやってみたい
* Button配置してActionやOutletなんてお茶の子さいさい

# こんなものができます
![image](https://qiita-image-store.s3.amazonaws.com/0/57284/cb1be277-e2bd-e65d-e8f9-863ecdcfddbc.png)



# ソースコードを若干解説
ソースコードにコメント追加しただけの解説です。
もし不明点あれば遠慮無くこの記事へのコメントでご質問ください。

```
//
//  ViewController.swift
//  AVRecorderSample
//
//  Created by yokoyama.tatsuya on 2016/02/13.
//  Copyright © 2016年 yokoyama.tatsuya. All rights reserved.
//

import UIKit
import AVFoundation

class ViewController: UIViewController {

    // file操作をするときに役立つNSFileManager
    // 録音したファイルをDocmentsディレクトリに保存しています。
    // 他にもtmpディレクトリやLibrary/Cachesディレクトリなんかがあるので、
    // 興味あればググってください
    let fileManager = NSFileManager()
    var audioRecorder: AVAudioRecorder?
    var audioPlayer: AVAudioPlayer?
    let fileName = "sample.caf"
    
    @IBOutlet weak var recordButton: UIButton!
    @IBOutlet weak var playButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.setupAudioRecorder()
    }

    // 録音ボタンを押した時の挙動
    @IBAction func pushRecordButton(sender: AnyObject) {
        audioRecorder?.record()
    }
    
    // 再生ボタンを押した時の挙動
    @IBAction func pushPlayButton(sender: AnyObject) {
        self.play()
    }

    // 録音するために必要な設定を行う
    // viewDidLoad時に行う
    func setupAudioRecorder() {
        // 再生と録音機能をアクティブにする
        let session = AVAudioSession.sharedInstance()
        try! session.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try! session.setActive(true)
        let recordSetting : [String : AnyObject] = [
            AVEncoderAudioQualityKey : AVAudioQuality.Min.rawValue,
            AVEncoderBitRateKey : 16,
            AVNumberOfChannelsKey: 2,
            AVSampleRateKey: 44100.0
        ]
        do {
            try audioRecorder = AVAudioRecorder(URL: self.documentFilePath(), settings: recordSetting)
        } catch {
            print("初期設定でerror出たよ(-_-;)")
        }
    }
    // 再生
    func play() {
        do {
            try audioPlayer = AVAudioPlayer(contentsOfURL: self.documentFilePath())
        } catch {
            print("再生時にerror出たよ(´・ω・｀)")
        }
        audioPlayer?.play()
        
    }
    // 録音するファイルのパスを取得(録音時、再生時に参照)
    // swift2からstringByAppendingPathComponentが使えなくなったので少し面倒
    func documentFilePath()-> NSURL {
        let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) as [NSURL]
        let dirURL = urls[0]
        return dirURL.URLByAppendingPathComponent(fileName)
    }
    
    
}


```

# guthubにもあげてます
https://github.com/tatsuya-yokoyama/AVRecorderSample
国会会議録検索システム検索用API

#はじめに
国立国会図書館は明治時代からの国会議事録を全て保存しているそうです。
そして、近年の議事録は家庭のパソコンからでも検索できます。

- [国立国会図書館](http://kokkai.ndl.go.jp)
- [議事録簡易検索](http://kokkai.ndl.go.jp/cgi-bin/KENSAKU/swk_srch.cgi?SESSION=7049&MODE=1)

#本題
検索システムのAPIも公開されています。返戻データはXMLです。
[国会会議録検索システム検索用APIについて](http://kokkai.ndl.go.jp/api.html)

そんなわけで、とりあえず最小限の例を書いてみたところ。
検索用語の発言を過去1年間分、XMLで取得できるリンクを生成します。

こんなコードでは簡易検索を使った方が便利ですが、この程度で出来るなら偉い人は色々と展開できるんじゃないかと。

```html:HTML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<script src="lib.js"></script>
<title>国会議事録検索</title>
</head>
<body>
<form>
<input type="text" id="WORD" size="30" maxlength="20"/>
<button type="button" id="GO">URI生成</button>
</form>
</body></html>
```
```js:lib.js
const LIB = {};

LIB.uri = function (word) {
  'use strict';
  const toDb = function(num) {
    num = num.toString();
    if (num.length === 1) {
      num = '0' + num;
    }
    return num;
  };
  const period = (function () {
    const now = new Date();
    const year = now.getFullYear();
    const days = '-' + toDb(now.getMonth() + 1) + '-' + toDb(now.getDate());
    const Dold = (year - 1) + days;
    const Dnow = year + days;
    return 'from=' + Dold + '&' + 'until=' + Dnow;
  }());
  const base = 'http://kokkai.ndl.go.jp/api/1.0/speech?';
  return base + encodeURIComponent('any=' + word + '&' + period);
};

LIB.getXml = function () {
  'use strict';
  const ns = 'http://www.w3.org/1999/xhtml';
  const word = document.getElementById('WORD').value;
  const aElm = document.createElementNS(ns, 'a');
  aElm.setAttribute('href', LIB.uri(word));
  aElm.appendChild(document.createTextNode(word));
  const pElm = document.createElementNS(ns, 'p');
  pElm.appendChild(aElm);
  const bElm = document.getElementsByTagNameNS(ns, 'body').item(0);
  bElm.appendChild(pElm);
};

LIB.addEvent = function () {
  'use strict';
  LIB.button = document.getElementById('GO');
  LIB.button.addEventListener('click', LIB.getXml, false);
  window.removeEventListener('DOMContentLoaded', LIB.addEvent, false);
};

(function () {
  'use strict';
  document.addEventListener('DOMContentLoaded', LIB.addEvent, false);
}());
```
vimtutor覚書


自分はまだまだ初心者だけど、早くコードが書けるように
少しでもキーボードでできる範囲を増やしたかったので、
[vim-mode](https://github.com/atom/vim-mode)プラグインを使ってAtomエディタでライトにVimコマンドを使うのもありかなーと考えてvimtutorを触ってみました。

vimが入っていればターミナルで`vimtutor`と打つだけで始められるのでお手頃だし、動かしながら覚えられるので便利です。

一通りやって、その中でも特に使いそうなものを頻度別にまとめました。(あくまで「Atom上で使ってる僕が個人的に使いそうなもの」なので悪しからず！)




##頻繁に使いそう

| command | result |
|--------|--------|
|     h, j, k, l   | 左, 下, 上, 右に移動       |
|i|インサートモード|
|a|追加でインサートモード|
|o|次の行を追加してインサートモード|
|O|前の行を追加してインサートモード|
|u|undo|
|ctrl+r|redo|
|x|カーソル上の文字を削除|
|dd|行を削除|
|w|単語を移動(単語の前にカーソル)|
|e|単語を移動(単語の後にカーソル)|
|0|行の先頭に移動|
|$|行末に移動|

##使いそう
| command | result |
|--------|--------|
|gg|最初の行に移動|
|G|最後の行に移動|
|ctrl-f|次のページへ移動|
|ctrl-b|前のページへ移動|
|r|カーソル上の文字を置き換える|
|R|複数文字を置き換える|
|dw|単語の末尾まで削除|
|cw|単語の末尾までを変更|
|%|対応する{}[]に移動|
|p|(直前の操作対象を)ペースト|
  
  
##オペレータとモーション
補足として、Vimはオペレータとモーションを組み合わせて多彩な操作が可能となっています。オペレータは4つなので覚えておきましょう

| オペレータ | 機能 |
|--------|--------|
|d|削除(delete)|
|y|コピー(yank)|
|c|変更(change)|
|g|移動(go)|

これにモーションと回数を組み合わせて操作を行うことができます。
`dw`や`cw`などがそうですね。w(word=単語)への操作をしています。これに回数を組み合わせて、`2wd`や`2cw`とすると2単語の削除や変更が行えます。


##最後に
保存や検索などはAtomでの使用を考えているので使わないかなーと考えて今回は省略しました。
vimtutorで最低限は覚えられたので、少しずつ使っていこうと思います。Atomで適度にVimを使えるのは初心者が慣らしていくためには良さそうな気がしますね！
Vagrant up 時に発生したエラーの対処法

# 発生したエラー


```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'base' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Box file was not detected as metadata. Adding it directly...
==> default: Adding box 'base' (v0) for provider: virtualbox
    default: Downloading: base
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

Couldn't open file /Users/***/vagrant/base
```

どうやら　vagrant init の時に box を指定していなかったらしい．

# 対処法

一旦 Vagrantfile を削除してから作成しなおす．

```
$ rm Vagrantfile
$ vagrant init CentOS7
$ vagrant up
```

これで無事仮想マシンを起動できました．

# 参考資料
http://stackoverflow.com/questions/23874260/error-when-trying-vagrant-up
メールアドレスのパスワードを強力にするPostfixAdmin

PostfixAdminでメールアドレス作成時に設定できるパスワードを複雑にして強力にしたり、または数字だけの簡単パスワードでも設定できるようにする。

[環境]
CentOS Linux release 7.2.1511 (Core)
Postfix Admin 2.92
dovecot 2.2.10
PHP version 5.4.16
Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
5.5.44-MariaDB


/var/www/postfixadmin/config.inc.php
↓ここらへんを調整する

```
$CONF['password_validation'] = array(
    '/regular expression/' => '$PALANG key (optional: + parameter)',
    '/.{5}/'                => 'password_too_short 5',      # minimum length 5 characters
    '/([a-zA-Z].*){3}/'     => 'password_no_characters 3',  # must contain at least 3 characters
    '/([0-9].*){2}/'        => 'password_no_digits 2',      # must contain at least 2 digits
);
```
制限時間内にクリックがない場合に関数を実行する


デモ：http://jsrun.it/mo4_9/O6xf/

1度クリックするとタイマーがスタート。
制限時間内にクリックし続ける限り、中の関数は実行されない。
ここでは2秒間クリックがなくなった時点で、関数を実行している。

```Javascript:Javascript
var timer,
	count = 0,
	time_limit = 2000; // 制限時間

$('.timer_btn').on('click', function(){
	
	count++;

	clearTimeout(timer); // いったん解除
	timer = setTimeout(timer_func, time_limit); // 時限スタート

	function timer_func(){
		alert(count + "回！");
		count = 0;
	}

});
```
golang コーディングテストで使うメソッド・テクニックまとめ


##空白なし入力受け付け

```:go
package main

import "fmt"

func main() {
   var hoge string
   fmt.Scan(&hoge)
   fmt.Println(hoge)
}

```

##空白あり入力受け付け

```:go
package main

import (
    "os"
    "fmt"
    "bufio"
)

func main() {
    sc := bufio.NewScanner(os.Stdin)
    var s string
    if sc.Scan() {
	s = sc.Text()
    }
    fmt.Println(s)
}

//複数回使う場合はメソッド化

func Scanner() []string {
	sc := bufio.NewScanner(os.Stdin)
	var s string
	if sc.Scan() {
		s = sc.Text()
	}
	slice := strings.Split(s, " ")
	return slice
}


```

###型変換(文字列=>数値)

```:go

package main

import (
    "fmt"
    "strconv"
)

func main() {
    foo := "1"
    bar, _ := strconv.Atoi(foo)
    fmt.Println(bar)
}

```

###型変換(数値=>文字列)

```:go

package main

import (
	"fmt"
	"strconv"
)

func main() {
	val := strconv.Itoa(123)
	fmt.Println(val)
}

```

###型チェック

```:go
package main

import (
	"fmt"
	"reflect"
)

func main() {
	val := "hoge"
	v := reflect.ValueOf(val)
	fmt.Println(v.Type())
}

```

###置換

```:go

package main

import (
    "fmt"
    "strings"
)

func main() {
    var hoge := "2016 07 07"
    hoge = strings.Replace(hoge, " ", "/", -1)
    // 第4引数は「-1」の場合はすべて置換、「1」の場合は初めに一致した要素を置換
    fmt.Println(hoge)
}

```

###文字列を分割して配列を返す

```:go

package main

import (
    "fmt"
    "strings"
)

func main() {
    s := "a b c d e"
    slice := strings.Split(s, " ")
    fmt.Println(s)
}
```

###フォーマット変更

```:go

package main

import (
	"fmt"
)

func main() {
	ans := []int{ 0, 0 }
	answer := fmt.Sprintf("%d %d", ans[0], ans[1])
	fmt.Println(answer)
}

```

###forループ(その１)

```:go

package main

import "fmt"

func main() {
	slice := []int{1, 2, 3, 4, 5}
	for i := 0; i < len(slice); i++ {
	  fmt.Println(slice[i])
	}
}
```

###forループ(その２)

```:go

package main

import "fmt"

func main() {
	slice := []int{1, 2, 3, 4, 5}
	for _, v := range slice {
	  fmt.Println(v)
	}
}

```
Mac でソースコードから Ansible 2.X (最新版)をインストール


# 前提条件
* git
* Python 2.6 以上

# 環境
* Mac OS X Yosemite 10.10.2

# 手順

* Github のリポジトリからソースコードをクローンする．

```
git clone https://github.com/ansible/ansible.git
```

* Ansible をインストールするための環境設定スクリプトを実行する．

```
source ./hacking/env-setup
```

* Ansible に必要なソフトウェアをインストールする．

```
sudo easu_install pip
sudo pip install paramiko PyYAML Jinja2 httplib2 six
```

* git のサブモジュールを読み込む．

```
git submodule update --init --recursive
```

* Ansible をインストールする．

```
sudo make install
```

* バージョンを確認する．

```
ansible --version
```

# 参考資料
* http://docs.ansible.com/ansible/intro_installation.html
mruby-cliに付属のmingw32-w64でスレッド関連のDLLをスタティクリンクしておく

# 背景

OpenCVを使ってWebカメラの表示ができるmrbgemの[mruby-webcam](https://github.com/kjunichi/mruby-webcam)をmruby-cliでビルド可能にした際に分かった。

# Windowsでlibwinpthread-1.dllがないエラーを回避する

```rb
spec.linker.flags_before_libraries << "/usr/#{build.host_target}/lib/libwinpthread.a"
```

と、libwinpthread.aをスタティクリンクしておくことで、dllがないエラーを回避できた。

# 関連記事

- [外部のライブラリに依存するmrbgemを使ってもmruby-cliでワンバイナリを作成できるようにした](http://abrakatabura.hatenablog.com/entry/2016/02/14/144922)
Yokohama.rb Monthly Meetup #65 memo



# Time と Date と DateTime

## strftime の %Z

Time#strftime の %Z は、プラットフォーム依存らしい。

まずは Ruby 2.3 with MacOS X

```ruby:ruby2.3
Time.now.strftime("%Z %z")
#=> "JST +0900"
Date.new(2016,1,1).strftime("%Z %z")
#=> "+00:00 +0000"
DateTime.new(2016,1,1).strftime("%Z %z")
#=> "+00:00 +0000"
```

続いて、 Ruby 2.2 with Windows 10 

```ruby:ruby2.2x64
Time.now.strftime("%Z %z")
#=> "東京 (標準時) +0900"
Date.new(2016,1,1).strftime("%Z %z")
#=> "+00:00 +0000"
DateTime.new(2016,1,1).strftime("%Z %z")
#=> "+00:00 +0000"
```

Time#strftime のみ、プラットフォーム依存っぽい。

## strftime の %U と、%G %V

%U は、年で区切ってから、その年の何週目か。年末と年始は違う週になる。

年末と年始にまたがる週を同じ週として扱いたい場合は、%V を使う。その文脈での年は、%G になる。

またがる週がどちらの年になるのかは、多い方になるらしい。

たとえば下表の通り。

|入力|%U|%G|%V|
|:--|:--|:--|:--|
|2014年12月31日|52|2015|01|
|2015年1月1日|00|2015|01|
|2015年12月31日|52|2015|53|
|2016年1月1日|00|2015|53|

2014年12月31日 は、`%U` の文脈では、2014年の52週目だけど、 `%G` `%V` の文脈だと2015年の第1週になるということ。

`%U` は 0から始まるけど、 `%V` は 1 から始まる。罠っぽい。

## JavaScript の strftime

JavaScript には strftime がないのが辛いらしい。
momentJS を使えばいいらしい。

## yday と %j

`Time.yday` は、1月1日 は 1 になる。0から始まるのではない。罠っぽい。
`strftime` の `%j` も同様。

```ruby:ruby2.3
Time.local("2016/1/1").yday
#=> 1
Time.local("2016/1/1").strftime("%j")
#=> "001"
```

## Date#leap?

`Date.new( 1500 ).leap?` は、`true` になる。1500年はグレゴリオ暦じゃないので。
すごい。

## 末日

`new` で第三引数に -1 を入れるとその月の末日になる。
第二引数に -1 を入れると、その年の末月になる。
0 を入れたらエラー。

```ruby:ruby2.3
Date.new( 2016,1,-1).strftime # 1月の末日
#=>"2016-01-31"

Date.new( 2016,-1).strftime # 末月の1日
#=> "2016-12-01"
Date.new( 2016,-1,-1).strftime # 末月の末日
#=> "2016-12-31"
Date.new( 2016,-1,12).strftime # 末月の12日
#=> "2016-12-12"

Date.new( 2016,1,0).strftime
#=>ArgumentError: invalid date
Date.new( 2016,0,1).strftime
#=>ArgumentError: invalid date
```

微妙な仕様。

##和暦から西暦

`Date.parse` は、JISX0301 というものに従ってパースしてくれる。
`Date` を JISX0301形式に変換するのは、`jisx0301` というメソッド。

```ruby:ruby2.3
Date.parse( "H28.2.13" ).strftime
#=> "2016-02-13"
Date.parse( "2016.2.13" ).jisx0301
#=> "H28.02.13"
Date.parse( "3000.2.13" ).jisx0301
#=> "H1012.02.13"
```

はるか未来は全て平成。

明治6年1月1日より前は、明治にならない。これも JISX0301 に従った仕様らしい。

```ruby:ruby2.3
Date.parse( "1873.1.1" ).jisx0301
#=> "M06.01.01"
Date.parse( "1872.12.31" ).jisx0301
#=> "1872-12-31"
```

しかし、`"M1.1.1"` のような、明治5年以前を表す文字列のパースは可能。

```ruby:ruby2.3
Date.parse( "M1.1.1" ).jisx0301
#=> "1868-01-01"
```

## 祝日

holiday_jp などを使えば良い。

## 引数のない strftime

|メソッド|結果|
|:--|:--|
|Time.utc(2016,1,1).strftime|ArgumentError: wrong number of arguments (given 0, expected 1)|
|DateTime.parse("2016.1.1").strftime|"2016-01-01T00:00:00+00:00"|
|Date.parse("2016.1.1").strftime|"2016-01-01"|

バラバラ。
そういうもんか。
rubyインストールメモ(CentOS7)

# 目的
**rbenv**を利用してCentOS7に**ruby**をインストールする。

# 手順

 - yumアップデートとruby-buildの推奨環境設定、gitインストール

```
$ sudo yum update
$ sudo yum install -y gcc bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel
$ sudo yum install -y git
```

 - **rbenv**と**ruby-build**をインストール

``` 
// ソースのクローン
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
// パスを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc 
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
// バージョン確認
$ rbenv --version
rbenv 1.0.0-16-gd6ab394
```

- **ruby**のインストール

```
// rbenvでインストールできるバージョン一覧確認
$ rbenv install --list

// ruby2.3.0をインストール
$ rbenv install 2.3.0
```

 - **ruby**バージョンの選択
インストールしただけでは使いえない状態で、バージョンを選択する必要がある。

```
// インストールされているrubyバージョンリスト確認
$ rbenv versions
  2.3.0
// バージョンを選択(rbenv localを使えばディレクトリ固有でバージョンを指定可能)
$ rbenv global 2.3.0
$ rbenv versions
* 2.3.0 (set by /home/vagrant/.rbenv/version)
```


- (おまけ)`Bundler`インストール

```
$ gem install bundler
```


# 参考
 - [rbenv/ruby-build Suggested build environment][rbenvofficial]
 - [rbenv を利用した Ruby 環境の構築](http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)
 - [rbenv wiki](http://ruby.studio-kingdom.com/rbenv)

[rbenvofficial]:https://github.com/rbenv/ruby-build/wiki#suggested-build-environment
口コミサイトの点数と単価の関係

「**口コミサイトの点数は，単価が高いと事前の期待値が高い分低くなりやすく，安いと逆に高くなりやすい**」
と言っている人がいたので確かめてみました．

逆に，**高いお金を払ったときほど，支出を正当化する認知バイアスが働くのでは？**と思った次第です．

## データ
- グルメサイトのスコアと予算
  - 都内に限定
  - ディナーに限定
  - 予算が幅をもつときは最低金額
- 標本の大きさ：10000

## 結果

![price_score.png](https://qiita-image-store.s3.amazonaws.com/0/52533/95e2f1d6-2e72-2974-94e4-3d3011e7d518.png)


```console
Call:
lm(formula = score ~ price, data = src)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.90321 -0.19760  0.07802  0.15538  0.89540 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3.366e+00  3.185e-03 1056.91   <2e-16 ***
price       1.860e-05  5.575e-07   33.35   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2353 on 9998 degrees of freedom
Multiple R-squared:  0.1001,	Adjusted R-squared:    0.1 
F-statistic:  1112 on 1 and 9998 DF,  p-value: < 2.2e-16
```

やはり単価が高いほどスコアが高くなる傾向があるようです．

一般化線形モデルを使う場合，スコアを0〜1に正規化して，応答変数がベータ分布に従うと仮定するのが良いのでしょうか？

```console
Call:
betareg(formula = score ~ price, data = src)

Standardized weighted residuals 2:
    Min      1Q  Median      3Q     Max 
-3.4628 -0.8374  0.2806  0.6340  4.8823 

Coefficients (mean model with logit link):
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) 7.156e-01  3.010e-03  237.76   <2e-16 ***
price       1.938e-05  5.497e-07   35.25   <2e-16 ***

Phi coefficients (precision model with identity link):
      Estimate Std. Error z value Pr(>|z|)    
(phi)   94.290      1.327   71.04   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Type of estimator: ML (maximum likelihood)
Log-likelihood: 1.632e+04 on 3 Df
Pseudo R-squared: 0.1228
Number of iterations: 8 (BFGS) + 2 (Fisher scoring) 
```

## 居酒屋

単一のカテゴリの中で比較すると結果が変わってくるかもと思い，対象を居酒屋に限定してみました．
標本の大きさは2000です．

![price_score_izakaya.png](https://qiita-image-store.s3.amazonaws.com/0/52533/d9d3c593-05b8-f7ea-5970-30d70d611d5a.png)

```console:
Call:
lm(formula = score ~ price, data = src)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.39076 -0.20677  0.03257  0.19190  0.77612 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3.280e+00  1.031e-02 318.215  < 2e-16 ***
price       1.711e-05  2.842e-06   6.021 2.05e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2119 on 1998 degrees of freedom
Multiple R-squared:  0.01782,	Adjusted R-squared:  0.01733 
F-statistic: 36.25 on 1 and 1998 DF,  p-value: 2.055e-09
```

同じ傾向でした．
[改編]Swiftを使ってPaizaの問題を解く

Paizaの問題をSwiftで解こうと思った際、
分からなかったポイントがあったので、共有します。

[2016.5.17追記]
単体でswiftのファイルを作成してもXcode上の補完機能が、全く効かないため
Command Line Toolsを使う方法を追記し、修正させていただきました。

## 1. Command Line Toolsを使ったプロジェクトを作成する

xcodeを起動し、cmd + shift + N かランチャーのメニューから
新しいprojectを作成し、
OS X > Command Line Toolを選択します。

![commadLineTools.png](https://qiita-image-store.s3.amazonaws.com/0/30423/2c62c78e-7017-8adc-d9fc-65bec120cd34.png)

これでちゃんとコードの補完が効きます。
![hokan.png](https://qiita-image-store.s3.amazonaws.com/0/30423/e883512c-8bd4-90c4-4e97-c1c443f2e93f.png)


## 2. 標準入力を受け取る

```swift
let input_line = readLine()!
```
で、OK。(swift2.0)
標準出力は普通にprint

## 3. デバッグする
ターミナルを開いて、コマンドを叩くか

```bash
swift test.swift
```

cmd + Rでbuildしたあとに、デバッグコンソールエリアにテキストを入力しても
標準入力を取得しつつ、デバッグができます。

![](http://i.giphy.com/l396Usvx6AeHCwNbi.gif)


## 4. 文字列をsplitする
Paizaの問題にはめちゃくちゃ空白区切りの文字列をsplitする問題が多いです。
Swift(2.0)には```componentsSeparatedByString```という関数があるので、それを使います。

```swift
let input_line = readLine()!
let arr = input_line.componentsSeparatedByString(" ")
```

## 参考URL
readLine() in playgrounds
https://forums.developer.apple.com/thread/37057

以上です。
これで、Paiza解答用の基本的な環境は整ったかと思います。
Mac OSXでDocker Toolboxのアンインストール

Docker Toolboxを最新版に入れなおしたくて、アンインストールする方法を探したら、
公式リポジトリにアンインストール用のシェルスクリプトが置いてあった。
これを流したらキレイにアンインストールできた。

https://github.com/docker/toolbox/blob/master/osx/uninstall.sh

何が起きるのかはシェルスクリプトの中身を見た方が早い。大して長くないので。

使い方はgit cloneしてきて、実行するだけ。

```bash
$ git clone git@github.com:docker/toolbox.git
$ cd toolbox
$ sudo osx/uninstall.sh
Password:
Remove all Docker Machine VMs? (Y/N): Y
machine does not exist, assuming it has been removed already
Successfully removed default
Removing Applications...
Removing docker binaries...
rm: /usr/local/bin/docker-machine-driver*: No such file or directory
Removing boot2docker.iso
All Done!
$ 
```
Emacs の ruby-mode でマジックコメントを自動挿入しない設定

ファイルの1行目にマジックコメント

```ruby
# -*- coding: utf-8 -*-
```

が自動挿入される設定は、

```elisp
(setq ruby-insert-encoding-magic-comment nil)
```

で取り消すことができる。

# 設定する理由
[Ruby 2.0 からデフォルトのスクリプトエンコーディングが UTF-8 に変更された](http://magazine.rubyist.net/?0041-200Special-note#l3)。
したがって、UTF-8 を用いて下位互換を考える必要のない Ruby スクリプトにはマジックコメントを入れる必要はない。
電子工作 > UART 3.3V, 5V変換基板 > Raspberry Piには不要のようだ

## やったこと

~~ESP8266(Vcc:3.3V)とRaspberry Pi Zero(Vcc:5V)の間でUART通信するとき、レベル変換をしないといけない。~~

<font color=red>(2016/02/14追記)
どうもRaspberry PiのGPIOには3.3Vを入れることになっているようだ。
</font>
http://qiita.com/7of9/items/d46441653e0dcf5f2800

<font color=red>
ということは、以下の回路はRaspberry Piで使うことはなさそう。
</font>

<hr>
関連　http://qiita.com/7of9/items/bb63c5b9d1e2e69d0cf9

上記のリンクの２つめのclock 100kHzの例の回路を実装してみた。

なお、使用部品は [Upverterの回路図](https://upverter.com/7of9/320a835ec5071390/5V_3p3V_levelConverter_160213/
)を参照。この回路図は上記のリンクの回路をほとんどそのまま使わせていただいている。
動作確認のためGNDのチェックピンを追加している。

## 写真

### 部品面
コネクタはコネクタ４ピンを水平に見た時に左から以下となるように実装した。

- Vcc
- TX
- RX
- GND

コネクタ(4ピン)はストレートピンヘッダのI型(20ピン)を大きめのニッパで４ピンだけ切り取ったもの。

![PiZero.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/369df6be-b17f-8a8d-96d4-7fff0cbdfcb5.jpeg)

### ハンダ面

- 赤い線: 不明 (いただきもの)
- 青い線: ジュンフロン線 ETFE 0.26mm L-50
- 黒い線: AWG28

赤い線と青い線の扱いはAWG30のワイヤストリッパーが必要。

赤い線と青い線は直角に曲げた時に形がそのままホールドされるので使い勝手が良い。

![DSC_0077.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/da3b8890-ecc7-2927-7339-ad57b31eec30.jpeg)

### 5V TX から 3.3V RX

3.3V側のRXで電圧を測った。1.987Vになった。
3.3V程度になるわけではないのか、実装ミスか?
スレッショルド電圧は1.6V程度であれば、一応大丈夫なのだろうか?

写真の構成としては左から

- モバイルバッテリー
- USBコネクタ基板 [Qiita記事](http://qiita.com/7of9/items/fe7d3bd8d1b164b4f25f#%E5%86%99%E7%9C%9F)
- 5V -> 3.3V 電圧変換基板 [Qiita記事](http://qiita.com/7of9/items/eebf2bb5a32d1ed4f510)
- ブレッドボード
- 今回のUART 3.3V,5V変換基板

![DSC_0072.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/284ea710-3c59-376a-901a-e7ba49ab48c7.jpeg)

### 3.3V TXから5V RX

5V側のRXで電圧を測った。4.51Vなので十分だろう。

![DSC_0074.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/22a417cb-3cfc-3784-a885-8afd4ec7996a.jpeg)
QtのVisual Studio-addinにハマった話

「おいおい・・・うそやろ・・・」ってとこでつまずいたので，書き記しておきます・・・

# 注意
今回，設定したのはVisual Studio2013（VS2013）用のアドインです．
VS2015とかはインストール方法から変わってるので，別途ハマり要素があるかもです．

Qtのバージョンは5.5.1で64Bit版を使用しています．

# Qtアドイン
Visual Studio2013用のアドインは，[ここ](http://www.qt.io/download-open-source/#section-2)の「その他のダウンロード」から落とすことができます．
インストールはNext連打で入ります．

Qtアドインをインストール後にVS2013を起動すると，「Qt5」というタブが一つできていると思います．
![Gt5.jpg](https://qiita-image-store.s3.amazonaws.com/0/104675/f2a550f2-daf4-a07c-cb31-923f09adcd61.jpeg)

# Qtプロジェクトの作成
上のタブから[ファイル]→[新規作成]→[プロジェクト]とクリックすると，ウィンドウが立ち上がります．
ここで，「Qt5 Project」を選択します．
横のウィンドウに「Qt Application」と表示されるので，選択します．
![Qt5_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/104675/71ac786d-178f-6f4e-2aae-1f63e92ff1a2.jpeg)
あとは，ウィンドウ下の[名前]のところにプロジェクト名を入力して，[OK]を押して作成します．

次に，Qtの設定ウィンドウが立ち上がるので，適当に設定していきます．
![Qt5_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104675/ceaf371e-1ef2-c224-a375-6810152e8143.jpeg)
［次へ］を押すと，Project Settingsの項目に移動します．
Qtの機能で使用したい機能があれば，ここでチェックを入れます．
![image](https://qiita-image-store.s3.amazonaws.com/0/104675/11accfb9-b35f-38d6-9562-3b61771788da.png)
［次へ］を押すと，Genetated Classの項目に移ります．
ここはデフォルトでいいと思います．
［Finish］を押すと，プロジェクトが生成されます．

# ここからが本題
さて，設定も済んだし，カチャカチャ打って動かすか～と思って，ハマりました・・・
ビルドすると，以下のエラー文が・・・
![error.png](https://qiita-image-store.s3.amazonaws.com/0/104675/efce39ae-b7d8-6b32-a228-20e3cf875b2c.png)

えぇ・・・バージョンが違うってどういうことやねん・・・
となったんですが，設定が足りなかっただけでした・・・OTL

![image](https://qiita-image-store.s3.amazonaws.com/0/104675/69d310ef-d20d-4294-b0cc-78cef387fafb.png)
上図のように［Qt5］→［Qt Project Settings］を選択します．

下の図のウィンドウが立ち上がります．
![image](https://qiita-image-store.s3.amazonaws.com/0/104675/505ece32-bb7a-d178-7de5-5762e90334d0.png)
ここの[Version]の項目がデフォルトだとエラーが出ます．
［Version］の項目を開くと，［msvc2013_64］という項目が出てきますので，設定します．
![image](https://qiita-image-store.s3.amazonaws.com/0/104675/29c20cb2-53da-ac9c-af87-365849cb2dbd.png)

これだけ・・・ほんとこれだけでした・・・OTL
Swiftでarray.permutation


## permutation

ちょっとした探索を書いている時に, ふとpermutationが欲しくなったのでメモ.

```swift:
let a = [1,2,3]
a.permutaion(2)
// => [[1, 2], [2, 1], [1, 3], [3, 1], [2, 3], [3, 2]]
```

という感じのものが欲しかったので検索. [ExSwift](https://github.com/pNre/ExSwift)に欲しいものを見つけた. ただこれはSwift 2.0に対応していなかったので少し修正. 

https://github.com/takeo-asai/math-puzzle/blob/master/problems/array_ex.swift

combinationもrepeatedPermutationもあったので一緒に抜き出してきた.

```swift:
let a = [1,2,3]
a.combination(2)
// => [[1, 2], [1, 3], [2, 3]]
a.repeatedPermutation(2)
// => [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
```

簡単な全探索ならこれでさくっとかけるようになった.

## おまけ

Swiftには標準でPermutationGeneratorなるものがある. しかしPermutationSequenceはない. 期待に胸を膨らませて実行.

```swift:
let a = [1, 2, 3]
var p = PermutationGenerator(elements: a, indices: [1, 2, 0])
p.next()
// => Optional(2), =a[1]
p.next()
// => Optional(3), =a[2]
p.next()
// => Optional(1), =a[0]
p.next()
// => nil
```

違うそうじゃない...
javascriptでconsoleにオブジェクト、XML、JSONを出力する

##はじめに
javascriptでconsoleにログや取得した情報を出力して内容を確認するときにはよくconsole.log()を利用しますが、オブジェクトだと[object object]となってしまいます。

オブジェクトなどをconsoleに出力したい場合の方法です。
WordpressからRSSで記事を取得してhtmlに表示したいなどといった場合に利用できます。

##objectの出力
console.dir(OBJ);

##XMLの出力
console.dirxml(XML);

##jsonの出力
console.log(JSON.stringify(JSON));
IIS7以上で新しくなった部分のアーキテクチャ紹介

## 概要
IISアーキテクチャについて[紹介しているページ](http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture)を日本語でまとめてみました。


## Introduction
IIS7.0以上では下記を含んだ request processing architecture を提供しています。

- Windows Process Activation Serive(WAS)によりHTTP/HTTPS以外のプロトコルも利用可能
- モジュール追加/削除のカスタマイズが可能なエンジン
- IISとASP.NET の統合request processing パイプライン を提供

## IIS Components
下記の機能が存在する

- Protocol Listeners
　Protocol Listenersは特定のプロトコルのリクエストを受け取るための基本的な機能。例えば、ブラウザからリクエストを受け付け、そのリクエストをIISに送り、処理させる。その後、クライアントにレスポンスを返す。(HTTP/HTTPSについてはHTTP.sysが提供される。その他のプロトコルについては、Windows Communication Foudation(WCF)のような技術を利用する。

- Hypertext Transfer Protocol Stack(HTTP.sys)
　HTTP/HTTPS用のProtocol Listener。下記の利点がある。
  - kernel-modeでキャッシング。リクエストをキャッシュし、ユーザーモードにスイッチすることなくレスポンスを返す。
  - カーネルモードでリクエストをキューに保持する。リクエストはカーネルが直接正しいワーカープロセスに送られるので、コンテキストスイッチによるオーバーヘッドが少なくなる。もし利用可能なワーカープロセスがない場合、ワーカープロセスがリクエストを取得するまでキューに保持される。
  - リクエストのpre-processing(前処理)とセキュリティフィルタリング

- World Wide Web Publishing Service (WWW service)
 IIS7.0以上では、WWWサービスが２つのサービスに分けられる。これら２つのサービスは同じSvchost.exe プロセスでローカルシステムとして実行される。かつ、同じバイナリーを共有する。
 - WWW Service
 - Windows Process Activation Service (WAS)

- WWW Service
WWW Serviceはワーカープロセスを管理しない。HTTP.sysの設定を担当し、設定が更新された際にWASに伝える


- Windows Process Activation Service (WAS)
　アプリケーションプールの設定とワーカープロセスを管理する。ちなみにWASはWWW Serviceなしでも稼働可能。例えばHTTPを待ち受ける必要がなければ WCF listener adapterとしてNetTcpActivatorを利用し稼働させることができる。WCFについては[こちら](http://go.microsoft.com/fwlink/?LinkId=81261)を参照。

- Module in IIS
IISはユーザーが自由にコンポーネントを追加、削除できるWeb Server Engineを含んでいる。
例えばキャッシュモジュールやロギングモジュール等。

- Request Processing in IIS
統合されたアプローチでリクエストを処理するために、IISとASP.NETはパイプラインの組み合わせを呼び出す。
新しいアーキテクチャでは特定のタスクを処理するためのnativeモジュールとmanagedモジュールで構成される。
これによりもともとはmanaged codeのみ可能だったが、全てのタイプのファイルが使用可能である。
また、この構成はIISとASP.NETの重複している機能を除去する設計となっている。例えば、クライアントがmanagedファイルをリクエストした際に、サーバは統合されたパイプラインの中で適切な認証モジュールをコールする。
前のバージョンのIISでは、IISのパイプラインとASP.NETのパイプラインでそれぞれ認証プロセスをコールしていた。

- Application Pools in IIS
Application Poolは複数のアプリケーションがあった場合にアプリケーションが他のアプリケーションに影響されるのを防ぐためにアプリケーション単位で分けられる。Integrated ModeかClassic Modeで動作する。
 - Integrated application pool mode
   IISとASP.NETの統合パイプラインでのアーキテクチャを利用可能
 - Classic application pool mode
   IISとASP.NETはそれぞれ単独で動作する

- HTTP Request Processing in IIS
 1.clientのブラウザーからリクエストを送信。送信されたリクエストをHTTP.sysが受け取る
 2.HTTP.sysがconfiguration store から設定を取得するためにWASにコンタクトする。
 3.WASはconfiguration store(applicationHost.config)からconfiguration情報をリクエストする。
 4.WWW Serviceがapplication pool や サイト設定を受け取る。
 5.WWW Serviceは上記の情報を利用してHTTP.sysの設定を更新する。
 6.WASがワーカープロセスをスタート。
 7.ワーカープロセスがリクエストを処理し、HTTP.sysにレスポンスを返す。
 8.clientがレスポンスを受け取る。

個人的に意味があまりわかってない部分もありますので、意味が違う部分はご指摘おねがいします。
IIS8.5、IIS10についてはまた今度。
YouTube動画を静止画に変換して機械学習のマエショリスト

## 機械学習の元データに大量の静止画が欲しい

機械学習の元データに大量の静止画が欲しいってケースがあるのですが、画像検索だとそんなに量がないんですね。なので、動画から静止画を切り出すことで静止画を大量に入手する。相手はコンピュータなので、ちょっとでもアングルが変わると、そりゃ新しい画像として学習しなおしてくれるに違いないと。

## YouTubeの動画のダウンロード

youtube-dl というツールがあるので、それを使います。

インストール

```shell-session
brew install youtube-dl
```

Pythonとかffmepegとかが依存モジュールっぽいです。

youtube-dlは、ダンロードする前に、「この動画はどの形式でダウンロードできるかねー」ってことを調べることができます。

```shell-session
$ youtube-dl -F https://www.youtube.com/watch?v=Gwsa09JWoac
[youtube] Gwsa09JWoac: Downloading webpage
[youtube] Gwsa09JWoac: Extracting video information
[info] Available formats for Gwsa09JWoac:
format code extension resolution  note 
249         webm      audio only  DASH audio , opus @ 50k
250         webm      audio only  DASH audio , opus @ 70k
171         webm      audio only  DASH audio , audio@128k
140         m4a       audio only  DASH audio , m4a_dash container, aac  @128k
251         webm      audio only  DASH audio , opus @160k
160         mp4       144p        DASH video , video only
133         mp4       240p        DASH video , video only
134         mp4       360p        DASH video , video only
135         mp4       480p        DASH video , video only
136         mp4       720p        DASH video , video only
137         mp4       1080p       DASH video , video only
264         mp4       1440p       DASH video , video only
266         mp4       2160p       DASH video , h264, video only
17          3gp       176x144     
36          3gp       320x240     
5           flv       400x240     
43          webm      640x360     
18          mp4       640x360     
22          mp4       1280x720    (best)
```

一番したに「best」ってのがあって、それが一番「おすすめ」ってことです。1280×720の解像度ですね。解像度表記の1080pは縦の解像度が1080なのでもっと解像度が高い。ただし、断りとして「video only」とあるので音声はついてない。ちなみにサンプルは、少女時代とKARAとGirlsDayの動画です。

ここではちょっとだけ気合を入れて、1080pでダウンロードしてみます。

```
$ youtube-dl -f137 https://www.youtube.com/watch?v=Gwsa09JWoac
```
-f の後に先ほどのフォーマット一覧に出てきたIDを指定して、YouTubeのファイル名を入れます。

これで、ローカルにダウンロードされますが、8分の動画で518MBなのでかなり大きなデータ。かなりの大きさですね。

##動画から静止画を切り出すのはffmepg

```
$ ffmpeg -i 動画ファイル.mp4  -r 1 -f image2 %06d.jpg
```
-r は一秒間に切り出す枚数
-f image2 %06d.jpg はjpeg形式で、000001.jpgを連番で書き出しなさいよ

これで、ズラーっと静止画ができあがり。

![スクリーンショット 2016-02-13 17.51.51.png](https://qiita-image-store.s3.amazonaws.com/0/53489/ea42aaf3-89fe-073d-464b-736f0c3d3966.png)

あとは、これを、OpenCVにかけて「ひとが写ってる」などの判定をしながら無駄な写真を排除したりするんだけど、それはまた今度。
AWS Lambdaで標準で利用できるモジュール一覧

# はじめに

AWS Lambdaではnode_moduleを利用する場合は、モジュールをzip化してアップロードする必要があります。
しかし、一部のモジュールはLambdaで標準的に提供されています。
そこでAWS Lambdaで標準利用できるモジュールを調べて見ました。

# npmコマンドでの調査

とりあえず、npmコマンドでモジュール一覧を取得してみようとしましたが
残念ながらnpmコマンドにはパスが届いておらず実行できませんでした。

```js:index.js
var exec = require('child_process').exec;

exports.handler = function(event, context){
    exec('npm list', function(err, stdout, stderr){
        console.log(stdout);
        context.done(err, stdout);
    });
};
```

```json:stdout
{
  "errorMessage": "Command failed: /bin/sh: npm: command not found\n",
  "errorType": "Error",
  "stackTrace": [
    "",
    "ChildProcess.exithandler (child_process.js:658:15)",
    "ChildProcess.emit (events.js:98:17)",
    "maybeClose (child_process.js:766:16)",
    "Socket.<anonymous> (child_process.js:979:11)",
    "Socket.emit (events.js:95:17)",
    "Pipe.close (net.js:466:12)"
  ]
}
```


# lsコマンドでの調査

次にlsコマンドで調べて見ました。
node_modulesフォルダは/usr/libにあったので、その中を確認してみました。

```js:index.js
var exec = require('child_process').exec;

exports.handler = function(event, context){
    exec('ls /usr/lib/node_modules', function(err, stdout, stderr){
        console.log(stdout);
        context.done(err, stdout);
    });
};
```

そしたら、なんとビックリ空っぽでした。どんなモジュールがあるかは秘密なんですね。

# requireで調査

そこでrequireを入れて見てシコシコと少しずつ確認していきました。
2016年2月13日現在、以下のモジュールがインストールしているのがわかりました。
余りインストールされているものは多くはないですが、aws-sdkが標準ではいっているので
Lambdaを使って、AWS環境を設定したいというニーズには対応できそうです。
auroraをRDSで採用したので、ぜひともmysqlモジュールは入れて欲しいですね。
あ、あとoauth。

## インストールされているもの
- aws-sdk
- child_process
- crypto (2016.3.19 added)
- fs
- http
- https
- os (2016.10.16 added)
- querystring (2016.3.7 added)
- sax (aws-sdk/node_modules/sax)
- xml2js (aws-sdk/node_modules/xml2js)
- xmlbuilder (aws-sdk/node_modules/xmlbuilder)
 
## インストールされていないもの
- express
- gulp
- mysql
- npm
- oauth
AutodocのGrape用拡張機能追加するgemをつくった



APIのドキュメント作りの便利なライブラリとして、r7kamuraさんが公開されている[Autodoc](https://github.com/r7kamura/autodoc)というgemがあります。
こちらは、テストケースからrequest, response, specの情報を使ってドキュメントを生成するというもので、実際の動作とドキュメントに差異がなくなるため、かなり重宝しております。

しかし、そのAPIのパラメータの定義部分をWeaksParameterによって定義された情報を介して取得していたので、
現在APIの作成に使っているGrapeのライブラリには対応しておりません。

そこでこちらをGrapeのparamsに対応できないものかなと思い、AutodocのGrape用のgemを作成しました。


作成したライブラリはこちらです。
[kei-p/autodoc-grape](https://github.com/kei-p/autodoc-grape)

## Grapeのparame から AutodocのParameter sectionを生成

Grapeでのパラメータは以下のように定義するようになっています。

```rb
params do
  requires :id, type: Integer, desc: 'Status id.'
end
get do
  Item.find(params[:id])
end
```

こちらから、ライブラリを使うと下記のようなmarkdownが得られます。

```md
### Parameters
* id Integer (required)
```

### 仕組み
GrapeのAPIを介して通信すると、`request.env["rack.routing_args"][:route_info]`に`Grape::Route`が格納されており、こちらからparamsの定義情報を取得できます。

```rb
request.env["rack.routing_args"][:route_info]
=> #<Grape::Route:0x007fd309795ed0
 @options=
  {:params=>
    {"id"=>{:required=>true, :type=>"Integer"},
     "hash"=>{:required=>false, :type=>"Hash"},
     "hash[attr]"=>{:required=>true, :type=>"String"}},
   :prefix=>"api",
   :version=>nil,
   :namespace=>"/items",
   :method=>"GET",
   :path=>"/api/items/:id(.json)",
   :compiled=>/\A\/api\/items\/(?<id>[^\/.?]+)(?:\.json)?\Z/,
   :settings=>
    {:description=>
      {:params=>
        {"id"=>{:required=>true, :type=>"Integer"},
         "hash"=>{:required=>false, :type=>"Hash"},
         "hash[attr]"=>{:required=>true, :type=>"String"}}},
     :declared_params=>[:id, {:hash=>[:attr]}]}}>
```

この情報を使って、ドキュメントのパラメータ情報を作成しています。

## 最後に
Grapeのparamsの定義方法はいろいろあるのですが、この`Grape::Route`の`:params`から取得できる情報に制限があるため現状は対応しているものは、

* required
* values
* default
* description

となっています。

今のところ自分のAPIでは事足りているのですが、`regexp`や`allow_blank`といった他の定義にも対応できそうであれば、対応していきたいところです。

もし方法ご存知の方いましたら、PRよろしくお願いします！
Cask、Emacsの管理

ちょっとruby環境を整えようとsmart-compile.elを導入してみたところ

```
(require 'smart-compile)
(define-key ruby-mode-map (kbd "C-c c") 'smart-compile)
(define-key ruby-mode-map (kbd "C-c C-c") (kbd "C-c c C-m"))
```

とか書いても何故かロードされませんでした。
で、よくよく見てみるとhomebrew経由で入れたEmacsが

```
% brew info emacs
emacs: stable 24.5, devel 25.0-dev, HEAD
GNU Emacs text editor
https://www.gnu.org/software/emacs/
/Users/kakikubo/brew/Cellar/emacs/24.4 (3,922 files, 108.9M)
  Built from source with: --cocoa
/Users/kakikubo/brew/Cellar/emacs/24.5 (3,923 files, 109M) *
  Built from source with: --with-cocoa
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/emacs.rb
==> Dependencies
Build: xz ✔, pkg-config ✘
.
.
```

複数存在していて、私が普段起動していたのは24.5だったのでした。
smart-compile.elはCask経由でこちらにインストールされていた為ロードエラー、て事だったので思い切って古いバージョンを削除

```
% brew cleanup emacs
Removing: /Users/kakikubo/brew/Cellar/emacs/24.4... (3,922 files, 108.9M)
==> This operation has freed approximately 108.9M of disk space.
```

で、caskで24.4側にインストールされていたelispが多々あるので、これを諸々更新という名目で24.5側にインストールする事に

```
kakikubo@kair ~/.emacs.d % cask install && cask update
Making version-control local to yasnippet-autoloads.el while let-bound!
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/yasnippet-20160131.948/yasnippet-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/with-editor-20160128.1201/with-editor-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/web-mode-20160212.538/web-mode-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/use-package-20160209.1633/use-package-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/swift-mode-20160124.236/swift-mode-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/smartparens-20160211.1437/smartparens-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/shell-pop-20160208.148/shell-pop-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/quickrun-20160202.1841/quickrun-autoloads.el
Wrote /Users/kakikubo/.emacs.d/.cask/24.5.1/elpa/projectile-20160210.905/projectile-autoloads.el
```

これですっきりして、smart-compileも使えるようになりましたと。
json_encode における JSON_UNESCAPED_UNICODE に PHP5.3 で対応する

# はじめに

- [日本語をunicode変換しないでjson_encodeする方法](http://qiita.com/shogo807/items/f68dde0d1fe7c07b8939#comment-47a0fa7f3116fbaf7de4)

こちらの記事で題目について議論していたのですが，コメントが長く続いてしまって読みにくいので要点だけまとめておきます． @sounisi5011 さんご指摘ありがとうございました．

# 実装

個人的に一番スッキリしていると感じるものを載せておきます．

```php
function raw_json_encode($input, $flags = 0) {
    $fails = implode('|', array_filter(array(
        '\\\\',
        $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
        $flags & JSON_HEX_AMP ? 'u0026' : '',
        $flags & JSON_HEX_APOS ? 'u0027' : '',
        $flags & JSON_HEX_QUOT ? 'u0022' : '',
    )));
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
    $callback = function ($m) {
        return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
    };
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}
```

- `\uXXXX` にマッチする文字列を `&#xXXXX;` 形式に変換し，`html_entity_decode` で復元します．
- `\\`は**`\u`よりも優先的に**無視します．
- `JSON_HEX_TAG`が指定されたとき，`\u003C`:`<` または`\u003E`:`>`を無視します．
- `JSON_HEX_AMP`が指定されたとき，`\u0026`:`&` を無視します．
- `JSON_HEX_APOS`が指定されたとき，`\u0027`:`'` を無視します．
- `JSON_HEX_QUOT`が指定されたとき，`\u0022`:`"` を無視します． 

# 動作確認

```php:PHP&#32;7.0
<?php

function raw_json_encode($input, $flags = 0) {
    $fails = implode('|', array_filter(array(
        '\\\\',
        $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
        $flags & JSON_HEX_AMP ? 'u0026' : '',
        $flags & JSON_HEX_APOS ? 'u0027' : '',
        $flags & JSON_HEX_QUOT ? 'u0022' : '',
    )));
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
    $callback = function ($m) {
        return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
    };
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}

$data = ['あ\い\\u26A0う\\\\u26A0え\\u26A0お', '<x>& \' "</x>'];
$options = JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT;

echo 'json_encode:                 ', json_encode($data, JSON_UNESCAPED_UNICODE), "\n";
echo 'raw_json_encode:             ', raw_json_encode($data), "\n";

echo "\n---\n\n";

echo 'json_encode:                 ', json_encode($data, JSON_UNESCAPED_UNICODE | $options), "\n";
echo 'raw_json_encode:             ', raw_json_encode($data, $options), "\n";
echo 'raw_json_encode (redundant): ', raw_json_encode($data, JSON_UNESCAPED_UNICODE | $options), "\n";

/*

json_encode:                 ["あ\\い\\u26A0う\\\\u26A0え\\u26A0お","<x>& ' \"<\/x>"]
raw_json_encode:             ["あ\\い\\u26A0う\\\\u26A0え\\u26A0お","<x>& ' \"<\/x>"]

---

json_encode:                 ["あ\\い\\u26A0う\\\\u26A0え\\u26A0お","\u003Cx\u003E\u0026 \u0027 \u0022\u003C\/x\u003E"]
raw_json_encode:             ["あ\\い\\u26A0う\\\\u26A0え\\u26A0お","\u003Cx\u003E\u0026 \u0027 \u0022\u003C\/x\u003E"]
raw_json_encode (redundant): ["あ\\い\\u26A0う\\\\u26A0え\\u26A0お","\u003Cx\u003E\u0026 \u0027 \u0022\u003C\/x\u003E"]

*/
```
windows の mingw 環境から chocolatey を `sudo cinst vlc` のように使いたい人のための `sudo` の作り方

# 背景

「やむを得ず windows を使っている」ような人々には `cmd` や `powershell` は何かと不便なので `cygwin` または `mingw` を入れて使っている事が多い（と思います）。

しかし、「管理者権限で実行」を使いたい場合にわざわざマウスぽちぽちの世界や win + R などから実行したくはありません（と思っている事でしょう）。例えば windows の一般アプリのパッケージ管理として受け入れられた `chocolately` も通常一般に紹介される使用方法としては管理者権限で `cinst` しましょうという事になっていますし、`sudo` で済ませたいわけです。

# 方法

cygwin の `.zshrc` なり mingw なりの `.bashrc` なりに簡単な `function` で作る:

```bash
function sudo()
{
  command=$1
  shift
  powershell -Command Start-Process -Verb runas ${command} { $@ }
}
```

## 使い方

`source ~/.bashrc` なり mintty を再起動するなりして `alias` が有効になった状態で:

```bash
sudo choco install vlc
```

とか、

```bash
sudo cinst ack
```

とか。

もちろん、`sudo cmd` として管理者権限の `cmd` を起動するだけといった事もできるようになる。楽で良い。

# References

- [みむらの手記手帳 - Windows で sudo なことをする。](http://mimumimu.net/blog/2014/12/11/windows-%E3%81%A7-sudo-%E3%81%AA%E3%81%93%E3%81%A8%E3%82%92%E3%81%99%E3%82%8B%E3%80%82/)
- [Tumbling Dice - 【PowerShell】他プロセスの実行方法まとめ](http://outofmem.hatenablog.com/entry/2015/07/12/161527)
Dockerで2つのコンテナをリンクさせていたが片方をrmして、再びlinkさせようとした時の対処メモ


#立ち上げたコンテナ

1. CentOSのScalaコンテナ
2. MySQL

これらをそれぞれ以下のコマンドで立ち上げます
CentOS側からMySQLコンテナを見ている感じですね

```
# MySQLコンテナ
docker run --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql

# Scalaコンテナ
docker run -it -p 80:8080 --link mysql-container:mysql-container --name centos-scala takashioshikawa/scala-2.11.7

```


これでcentos-scalaコンテナの中から

```
mysql -u root -h mysql-container -p
```

とすればmysql-containerのmysqlに接続できます


#mysql-containerをrmして再び同じコマンドでrunしてcentos-scalaからMySQL接続してみる

一旦両方のコンテナをstopしてmysql-containerだけはrmで削除します

```
docker rm mysql-container
```

そして同じコンテナを作成してcentos-containerから接続してみます

```
# MySQLコンテナ再作成
docker run --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql

# Scalaコンテナ起動
docker start centos-scala

# Scalaコンテナコンソール接続
docker attach centos-scala
```


そしてcentos-scalaからMySQL接続しようとすると
`mysql-container`なんて知らないよというようなメッセージが出てきてMySQLコンテナが認識されていない状態となっていました


#mysql-containerをcentos-scalaに再認識させる

Docker的に良い方法とは思えませんが以下の方法で解決しました

centos-scala側のhostsを書き換えてmysql-containerを認識させてしまう。

手順

1.mysql-containerの情報を調べる

```
docker inspect mysql-container
```

で色々情報が出てくると思います

見るべき情報は

```
"Hostname": "1315a21875bc(ここの値は変わります)"
"IPAddress": "172.17.0.2(ここの値は変わります)"
```

`Hostname`と`IPAddress`の値が大事です


2.centos-scala内の`/etc/hosts`を編集する

mysql-containerの情報をhostsの中に書いてあげます

```a:etc/hosts
172.17.0.3      ef1f1942c80f
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 1315a21875bc mysql-container # ここを追記
```

`IPAddress Hostname コンテナ名 `

を記述すると

```
mysql -u root -h mysql-container -p
```

で繋がるようになりました



##参考
[Docker: コンテナの連結](http://qiita.com/t-yotsu/items/e0277d545b4ddeeb44d6 "Docker: コンテナの連結")
PHPStorm で PHPUnit のテストをステップ実行する

概要
=====

PHP で PHPUnit のテストがうまく通らず、PHPStorm でステップ実行したくなることがたまにあります。

しかしながら、PHPStorm の PHP Remote Debug はブラウザ経由でないと、動きません。

と、思っていましたが PHPStorm でやれる方法が判ったので設定方法を共有します。

~~なので、無理やり画面を作って、PHPUnit を実行する方法を取ったら、まあ上手くいったので覚書ついでに共有してみます。~~ (2016--216 k-hottaさんからの指摘でさらに良い方法にたどり着いたので修正しました。)

さらに良い方法をご存知の方がいらっしゃいましたら是非コメントください。

前提環境
==========

- PHPStorm を使っている。
- vagrant を使っており、 php はゲストサーバ側にある。
  （つまりリモートデバッグは可能。）
- テストしたい部分には Web 経由で表示する画面がない。

PHPStromの設定方法
=================

### [SFTPの設定]

- `Settings` の `Build, Execution, Deployment` > `Deployment` で `+` を押す。
- `Add Server` 画面がポップアップするので `name`  を `vagrant` 、`Type` を `SFTP` に設定して `OK`。

例:
![image](https://qiita-image-store.s3.amazonaws.com/0/29899/e23ce76a-f656-7b52-7408-efa5ca6e71cd.png)

- `Connection` タプに vagrant との接続設定を書く。`Root path` にソースのルートを書いておくと後が楽(末尾に `/` はつけない)。

例:
![image](https://qiita-image-store.s3.amazonaws.com/0/29899/e817d20a-9ddd-fba0-2172-c0b49b894dcb.png)


- `Mappings` タブは下記のように書く:
    - `Local path` にはローカルのプロジェクトのディレクトリを書く。
    - `Deployment path on server 'vagrant'` には、リモートのプロジェクトのディレクトリを、前述の `Root path` からのパスを `/` から初めて書く。

例:
![image](https://qiita-image-store.s3.amazonaws.com/0/29899/84572b96-4343-6a23-86a2-38eda1ec1741.png)

### [PHPのInterpreterの設定]

- `Settings` の `Languages & Freamworks` > `PHP` に `Interpreter` という項目があり、この `...` を押す。
- `Interpreters` という画面がポップアップするので、`+` を押して `Remote...` を追加する。
- `SSH Credentials` を選び、接続情報を入力し、`OK`。
- さらに `OK` して、`Interpreters` に `Remote PHP ～` がセットされたことを確認して `OK`。

### [リモートの PHPUnit の設定]

- `Settings` の `Languages & Freamworks` > `PHP` > `PHPUnit` で `+` を押す。
- プルダウンが出るので `By Remote Interpreter` を選ぶ。
- 下記のように設定して `OK` を押す。

![image](https://qiita-image-store.s3.amazonaws.com/0/29899/1c64074f-de20-9266-11de-9afbfa0d28c8.png)


### [CakePHP2 なら Edit Configuration のデフォルト設定]

※CakePHP2.x でないならこの項目は不要です。

- [k-hottaさん](http://qiita.com/k-hotta) の [アダプタ(コードの欄に書いてあるソース)](http://qiita.com/k-hotta/items/d31e217cb81ddce85007) を保存する。
- `Run` > `Edit Configurations...` メニューを選ぶ。
- `Defaults` の中の `PHPUnit` を選ぶ。
- `Interpreter Options` で `-f リモートサーバ上での上記アダプタへのフルパス` を設定する。


### [テスト実行]

初回なら、

- テストしたいファイルで右クリック。
- メニューから `Debug クラス名` を選択する。

これでテスト実行されます。

２回目からは、![image](https://qiita-image-store.s3.amazonaws.com/0/29899/f6315e14-3874-c524-d02c-c213372b5d00.png) を選んで ![image](https://qiita-image-store.s3.amazonaws.com/0/29899/aefe494a-acb4-65e8-5aa3-6b92c949d874.png) を押せばOKです。



無理やり画面作って動かす場合
============================

上記の方法があれば不要ですが、まあ、何かの役に立つかもしれないので、残しておきます。

```php
<?php
//テストしたいクラスを読み込みます(今回はこの中で autoloader.php を読み込んでいます。)
require_once __DIR__ . '/test/FooTest.php'; 

//テストしやすくするためにエラーが画面に表示されるようにしておきます(既になっていれば不要)
ini_set('display_errors', '1');

//単体テストのクラスを生成
$case = new FooTest();

//データプロパイダのデータを取得し、ループする
$data = $case->provider_suspending();
foreach ($data as list($a, $b, $c)) {
    //試したいテストを実行する
    $case->testテストメソッド($a, $b, $c);
}
```

手順

1. 上記を適当な場所に置く。
2. httpd.conf で新しいバーチャルドメインを作成し、上記のファイルをパスを通しておく。
3. hosts でドメインが通るようにしておく。
4. httpd 再起動。

以上。
Railsでtable内の要素をソートしたい

Userオブジェクトをソートしてクラス変数に入れる(2016-02-15修正)

```ruby:user.rb
・・・
VALID_SORT_COLUMNS = %w(name nickname)
def index
  sort = params[:sort] if VALID_SORT_COLUMNS.include?(params[:sort])
  @users = User.order(sort)
end
・・・
```

ソートのパラメータとして，nameを渡す


```html+erb:index.html.erb
．．．
<table>
  <tr>
    <th>
      <%= link_to "Name", sort: "name" %>
    </th>
  </tr>
  <% users.each do |user| %>
  <tr>
    <td>
      <%= user.name %>
    </td>
  </tr>
</table>
．．．
```


# 修正
## 2016-02-15
SQLインジェクションを考慮したコードに修正 (@jnchito さんよりコメントいただきました)

修正後の`user.rb`

```ruby:user.rb
・・・
VALID_SORT_COLUMNS = %w(name nickname)
def index
  sort = params[:sort] if VALID_SORT_COLUMNS.include?(params[:sort])
  @users = User.order(sort)
end
・・・
```

`修正前のuser.rb`

```ruby:user_old.rb
・・・
def index
  @users = User.order(params[:sort])
end
・・・
```
RailsでBootstrapを使いたい


app/assets/stylesheets/application/application.cssをapplication.css.scssに変更
別途スタイルシートを定義してもいい．
SCSSとGemfileにBootstrapの記述を追加する

```application.css.scss
@import "bootstrap";
@import "bootstrap-sprockets";
```

```Gemfile
・・・
gem 'bootstrap-sass',       '3.2.0.0'
gem 'sass-rails',   '5.0.2'
gem 'coffee-rails', '4.1.0'
・・・
```

プラグインの更新

	bundle install
HerokuでのRuby on Rails メモメモ

##Herokuって
Salesforceが提供している無料で使えるPaaS環境

##Railsアプリケーションの作成

	rails new test_app


##アプリで用いるプラグインの編集	
ローカル環境では，sqlite3を使用し，HerokuではPostgreSQLを使う設定にGemfileを変更．Herokuではsqlite3が使えないため．

```Gemfile
・・・
group :development, :test do
  ・・・
  gem 'sqlite3'
end
・・・
group :production do
  gem 'pg'
end
```
プラグインのインストール

	bundle install
	
##Gitの設定

リポジトリの作成

	git init
	
ステージする(次回コミット対象にする)
	
	git add .
	
コミットする

	git commit -m "Initialize repository"
	
##GitHubの設定

Githubをoriginという名前でpush先に指定
		
	git remote add origin git@github.com:YusukeHarada/test_app.git

GitHubにpushする
	
	git push
	
##Herokuの設定

Herokuへアプリケーションの登録
	
	heroku create
	
Herokuへのpush

	git push heroku master
	
##scaffoldを使ったアプリケーション作成
UserデータのCRUDアプリケーションを作成する．

	rails generate scaffold name:string email:string

マイグレーションしてDBを作成する

	rake db:migrate

変更ファイルをステージする	

>もしローカル環境で実行したい場合は，
	# rails serverで実行可能．

	git add .
	
コミットする	
	
	git commit -m "Create application"
	
GitHubへプッシュ	
	
	git push
	
Herokuにプッシュ	
	
	git push heroku master
	
Herokuのアプリケーションをマイグレーション	
	
	heroku run rake db:migrate
	
アップロードしたアプリケーションを開く	
	
	heroku open