OmniAICreator/Qiita-1.07M huggingface dataset:
Macのsedで改行コードを出力させる 〜改行コードの違い再確認〜


Octpressで各ブログ記事に利用していた`<!--more-->`を一括置換するときに、ハマった話。

以下のように、`<!--more-->`を置換しようとしたのが、

- `!`のエスケープ
- 改行コードの出力

でハマった。

### 置換前
```html
<!--more-->
```

### 置換後

```html
<!--more-->
{% include hogehoge.html %}
```

## `!`のエスケープ

まず、`!`は過去の実行コマンドを参照するコマンドのため、置換文字列に含まれると意図しない動きをしてしまう。

⇛　`\!` とエスケープすることで解決

## 改行コードの出力

Macのsedコマンドでは、例えば、以下のように`\n`を改行コードに置換しようと思っても、全然意図する動きにならない。

```
echo "hogehoge\nfoo\nbar" | sed 's/\\n/\n/g'
```

正しく置換させるためには、以下のようにする必要があるとのこと。

```bash
LF=$'\\\x0A'
echo "hogehoge\nfoo\nbar" | sed 's/\\n/'"$LF"'/g'
```


## CR LF CR+LFの違い

改行コードの復習も兼ねて調べておく

### キャリッジリターン(Carriage Return 復帰 : CR（0x0d))

- 行頭へ印字ヘッドあるいはカーソルを移動すること。

OS9までのMacOSは、CRを改行コードと解釈していた(裏取りなし)

### ラインフィード(Line Feed 改行 LF（0x0a))

- 次の行へ一行移動する。

UNIX環境は、LFを改行コードと解釈する
(OSXも同様)

### CRLF 0x0d0a

Windows環境は、CR LFを改行コードとして解釈する

## 実行したかったコマンド

markdownファイルの中の、`<!--more-->`タグを置換する

```
find . -name "*.markdown" | xargs sed -i '' 's/<\!--more-->/<\!--more-->'"$LF"'{% include ga.html %}/g'
```


## 参考

<a href="http://rcmdnk.github.io/blog/2014/09/21/computer-bash/" target="_blank"><img class="alignleft" align="left" border="0" src="http://capture.heartrails.com/150x130/shadow?http://rcmdnk.github.io/blog/2014/09/21/computer-bash/" alt="" width="150" height="130" /></a><a style="color:#0070C5;" href="http://rcmdnk.github.io/blog/2014/09/21/computer-bash/" target="_blank">sedで改行を出力する - rcmdnk’s blog</a><a href="http://b.hatena.ne.jp/entry/http://rcmdnk.github.io/blog/2014/09/21/computer-bash/" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://rcmdnk.github.io/blog/2014/09/21/computer-bash/" alt="" /></a><br style="clear:both;" /><br>


<a href="http://www.japanlink.co.jp/dtpjiten/ka/kaigyocode.html" target="_blank"><img class="alignleft" align="left" border="0" src="http://capture.heartrails.com/150x130/shadow?http://www.japanlink.co.jp/dtpjiten/ka/kaigyocode.html" alt="" width="150" height="130" /></a><a style="color:#0070C5;" href="http://www.japanlink.co.jp/dtpjiten/ka/kaigyocode.html" target="_blank">図解DTP用語辞典</a><a href="http://b.hatena.ne.jp/entry/http://www.japanlink.co.jp/dtpjiten/ka/kaigyocode.html" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://www.japanlink.co.jp/dtpjiten/ka/kaigyocode.html" alt="" /></a><br><span style="color: #808080;font-size: 80%;">改行コードの違い  日本語組版でいう改行は、行を改めて次の行の初めから文字を組み始めることである。しかし欧文組版では、タイプライターの操作メカニズムの制約から日本語の改行に当たる操作は２段階に分かれ、 ...</span><br style="clear:both;" /><br>

[改行コードの違いを体感してみる - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20131115/diff_cr_lf_feeling)



### メモ
find _posts/ -name "*.markdown" | xargs grep "ga.html"
_posts//2014-09-28-baseball-club-yokyo.markdown:{% include ga.html %}
_posts//2014-10-30-how-google-works.markdown:{% include ga.html%}
_posts//2014-11-16-fountain-pen-cleaning.markdown:{% include ga.html %}
_posts//2014-11-21-ted-api.markdown:{% include ga.html %}
Elixir | コマンドラインアプリケーションを作成する #elixir

# Elixir | コマンドラインアプリケーションを作成する #elixir
## <i class="fa  fa-cubes" style="font-size:1em;"></i> 概要
Elixir でコマンドラインアプリケーションを作成します
## <i class="fa  fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa  fa-file-text-o" style="font-size:1em;"></i> 仕様
* FizzBuzz アプリケーション
   * 数値が 15 の場合は FizzBuzz を返却
   * 数値が 5 の場合は Buzz を返却
   * 数値が 3 の場合は Fizz を返却
   * その他の場合は、そのままの数値を返却
* 第一引数を from, 第二引数を to とする

### <i class="fa  fa-files-o" style="font-size:1em;"></i> 手順
#### プロジェクトの作成
~~~
$ mix new clisample
~~~
#### プロダクトコードの実装
* lib/clisample.ex

~~~elixir
defmodule Clisample do
  def main(args) do
    IO.inspect(fizzbuzz(String.to_integer(List.first(args)), String.to_integer(List.last(args))))
  end

  @doc ~S"""
  FizzBuzz.

  ## Examples

      iex> Clisample.fizzbuzz(1, 15)
      [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
  """
  def fizzbuzz(from, to) when is_integer(from) and is_integer(to) do
    from..to |> Enum.map(&(fizzbuzz/1))
  end
  def fizzbuzz(_from, _to) do
    raise "invalid argument"
  end
  defp fizzbuzz(n) when rem(n, 15) == 0 , do: "FizzBuzz"
  defp fizzbuzz(n) when rem(n, 3) == 0, do: "Fizz"
  defp fizzbuzz(n) when rem(n, 5) == 0, do: "Buzz"
  defp fizzbuzz(n), do: n
end
~~~

#### mix.exs で main モジュールの設定
* lib/clisample.ex

project 関数の escript キーに対象モジュールを設定

~~~bash
$ cat mix.exs
defmodule Clisample.Mixfile do
  use Mix.Project

  def project do
    [app: :clisample,
     version: "0.0.1",
     elixir: "~> 1.0.0",
     escript: [ main_module: Clisample ],
     deps: deps]
  end

  # Configuration for the OTP application
  #
  # Type `mix help compile.app` for more information
  def application do
    [applications: [:logger]]
  end

  # Dependencies can be Hex packages:
  #
  #   {:mydep, "~> 0.3.0"}
  #
  # Or git/path repositories:
  #
  #   {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
  #
  # Type `mix help deps` for more examples and options
  defp deps do
    []
  end
end
~~~

#### プロジェクトの build を行う

~~~bash
$ mix escript.build
~~~

#### 試行
~~~bash
$ ./clisample 1 5
[1, 2, "Fizz", 4, "Buzz"]
$ ./clisample 15 30
["FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "Fizz", 22, 23, "Fizz", "Buzz", 26, "Fizz", 28, 29, "FizzBuzz"]
~~~
Macにnvm + Node.jsをインストールする

#nvmのインストール

```shell-session
$ git clone https://github.com/creationix/nvm.git ~/.nvm
```

## .bash_profileの修正
### .bash_profileを修正しておくと、Terminalの起動時にnvmが自動で読み込まれる
```text:~/bash_profile
[[ -s /Users/user/.nvm/nvm.sh ]] && . /Users/user/.nvm/nvm.sh
nvm use default
npm_dir=${NVM_PATH}_modules
export NODE_PATH=$npm_dir 
```
### ※/Users/userは、ログインユーザのHOMEディレクトリに置き換える

```shell-session
$ nvm install stable
```

## stableバージョンをいつでも使えるようにする
```shell-session
$ nvm alias default stable
```

# 一度Terminalを終了して、もう一度立ち上げる
-> ちゃんとパスが通ったか確認しましょう。

```shell-session:Terminal起動時のメッセージ
Now using node v0.10.33
```
バージョンが出力されればOK!

## バージョンを確認する
```shell-session
$ node -v
v0.10.33
```
Docker 関連記事 #docker

# Docker 関連記事 #docker

更新日: 2015/09/30 23:08:27

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Atlas + Packer + Docker + Vagrantで複数コンテナをのせたVMを作成する](http://qiita.com/tbpgr/items/0509f4c534afd6a2d084)|2015/09/14 23:10:25|16|
|2|[Docker Hubのpush / pullを試す](http://qiita.com/tbpgr/items/1a86e16eaa9af74fbdaa)|2015/09/08 22:56:26|3|
|3|[Docker  Images #docker](http://qiita.com/tbpgr/items/9276887b213003aa84eb)|2014/11/26 21:58:26|1|
|4|[Docker  Linking Containers #docker](http://qiita.com/tbpgr/items/174a96429587bf321e0b)|2014/11/27 22:31:23|4|
|5|[Docker  Vagrant + Itamae で Docker の Hello world #docker #itamae #vagrant](http://qiita.com/tbpgr/items/d27845082dd49c36142f)|2014/11/25 22:32:34|7|
|6|[Docker  docker run の -v オプションでホストの任意のパスをコンテナの任意のパスにマウントする](http://qiita.com/tbpgr/items/5ff706ce2c62bffafd88)|2015/09/30 23:07:41|0|
|7|[Docker  基本操作コマンドについて #docker](http://qiita.com/tbpgr/items/5370bf6bc945c3cf3ec0)|2014/11/25 22:35:16|4|
|8|[Docker  基礎 と VM との違いについて #docker](http://qiita.com/tbpgr/items/77b4bdf3031d7057ce0c)|2014/11/25 22:30:17|5|
|9|[Docker ＋ Itamae でレシピ作成の試行錯誤を 高速化 #itamae #docker](http://qiita.com/tbpgr/items/0f2545779b015e34e777)|2014/12/24 23:42:00|43|
|10|[Packer buildでDocker HubにDocker Imageを保存するやいなやpullしてcowsayする](http://qiita.com/tbpgr/items/4c4099bd21bfc24003e8)|2015/09/10 01:09:50|4|
|11|[PackerでDocker Imageを作成してcowsayする](http://qiita.com/tbpgr/items/97e926f17f52743fbb3f)|2015/09/02 22:58:06|5|
|12|[Vagrant + CoreOS + Docker + Itamae で使い捨ての Ruby 2.2.0 環境を構築する #ruby #vagrant #docker #itamae](http://qiita.com/tbpgr/items/9c274ac03309d1eb0411)|2014/12/27 01:30:06|32|
|13|[Vagrant AWS Provider で EC2 上に CoreOS のインスタンスを作成し、 Ubuntu 14.04 LTS のコンテナを乗っけて、 SSH で接続可能に。](http://qiita.com/tbpgr/items/7f19bd120395776bd9d4)|2014/12/05 22:54:00|2|
|14|[Vagrant で Windows 上の VirtualBox に CoreOS のインスタンスを作成し、 Ubuntu 14.04 LTS のコンテナを作成し、 SSH で接続可能にする #vagrant #coreos #docker](http://qiita.com/tbpgr/items/800ad117e234b38f0a80)|2014/12/05 22:56:39|14|
|15|[docker-composeで複数のコンテナをyamlファイルで管理し、最後にcowsayする](http://qiita.com/tbpgr/items/7f7de0b8e518453df482)|2015/09/10 01:14:57|4|
Docker | Vagrant + Itamae で Docker の Hello world #docker #itamae #vagrant

docker
itamae
vagrant

# Docker | Vagrant + Itamae で Docker の Hello world #docker #itamae #vagrant
## <i class="fa  fa-cubes" style="font-size:1em;"></i> 概要
Vagrant + Itamae で Docker の Hello world まで疎通させます
## <i class="fa  fa-cube" style="font-size:1em;"></i> 構成
OS: Ubuntu 1404 ( vagrant box 'box-cutter/ubuntu1404')
Vagrant 1.6.5
Itamae v1.0.8

## <i class="fa  fa-files-o" style="font-size:1em;"></i> 手順
### 作業ディレクトリの作成
~~~bash
$ mkdir docker_sample
$ cd docker_sample
~~~

### Vagrantfile のひな形を生成
~~~bash
$ Vagrant init -m
$  ls -F | grep Vagrantfile
Vagrantfile
~~~

### Vagrantfile の編集
~~~ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "dockersample" do |web|
    web.vm.provider :virtualbox do |vb|
      vb.name = "dockersample"
    end
    web.vm.hostname = "dockersample"
    web.vm.box = "box-cutter/ubuntu1404"
  end
end
~~~

### Itamae のレシピ( docker.rb )を作成

~~~ruby:docker.rb
execute "apt-get update" do
  command "sudo apt-get update"
end

package 'docker.io' do
  action :install
end

execute "enable tab-completion of Docker commands in BASH" do
  command <<-COMMANDS
#!/bin/bash
source /etc/bash_completion.d/docker.io
  end
end

execute "install apt-transport-https" do
  command <<-COMMANDS
[ -e /usr/lib/apt/methods/https ] || {
  apt-get update
  apt-get install apt-transport-https
}
  COMMANDS
end

execute "install apt-transport-https" do
  command <<-COMMANDS
sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
  COMMANDS
end

package 'lxc-docker' do
  action :install
  options("-y")
end
~~~

### Vagrant up で仮想環境作成

~~~bash
$ vagrant up
$ vagrant ssh
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Sun Nov  2 22:18:17 2014 from 10.0.2.2
~~~

### Itamae のレシピを実行

~~~bash
$ vagrant ssh-config --host dockersample
$ itamae ssh --vagrant -h dockersample docker.rb
~~~

### docker のインストール確認

~~~bash
$ vagrant ssh

# 初回実行のため ubuntu:14.04 のイメージの取得を行う
vagrant@dockersample:~$ sudo docker run ubuntu:14.04  /bin/echo 'Hello world'
Unable to find image 'ubuntu:14.04' locally
ubuntu:14.04: The image you are pulling has been verified
511136ea3c5a: Pull complete
d497ad3926c8: Pull complete
ccb62158e970: Pull complete
e791be0477f2: Pull complete
3680052c0f5c: Pull complete
22093c35d77b: Pull complete
5506de2b643b: Pull complete
Status: Downloaded newer image for ubuntu:14.04
Hello world

# 2回目実行のため ubuntu:14.04 のイメージは取得済み
vagrant@dockersample:~$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
~~~
Docker | 基礎 と VM との違いについて #docker

# Docker | 基礎 と VM との違いについて #docker
## <i class="fa  fa-cubes" style="font-size:1em;"></i> 概要
Docker の基礎 と VM との違いについてについて
## <i class="fa fa-question-circle" style="font-size:1em;"></i> Docker とは？
Docker は開発者やシステム管理者が、ビルド・リリース・配布アプリケーションの実行を
するためのオープンプラットフォームです。

ポータブルで軽量な実行環境である **Docker Engine** と アプリケーションや実行フローのクラウド共有サービスである **Ducker Hub** で構成される
Docker は素早くアプリケーションの部品を組み立て、開発・品質・本番環境の不和をなくす。

結果として、 IT をより早く、そして同じアプリケーションを変更することなく、
ラップトップ・データセンター・VMやどんなクラウドでも実行することができる。
## <i class="fa fa-cube" style="font-size:1em;"></i> VM との違い
### VM のイメージ
![vm.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b5d457f7-76a7-0c43-572a-45d6cf8f0f3c.png)
### Docker のイメージ
![docker.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3c78fe11-4e23-62e8-068e-1a2f1efaffb7.png)
## <i class="fa fa-link" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Docker Official](https://www.docker.com/)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Gviz gem](https://github.com/melborne/Gviz)
    * 当記事の図は Gviz gem を利用して作成しています
RSpecをRailsにインストールする

#Gemfileへの追加

```ruby:Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 3.0.0'
  gem 'factory_girl_rails', '~> 3.0'
end
```

## gemのインストール
```shell-session
$ bundle install
```

## RSPECを初期化
```shell-session
$ rails g rspec:install
```

## DBを初期化
### MySQLを利用している場合は、CREATE DATABASEする

```shell-session
$ rake db:migrate RAILS_ENV=test
```
※ RSpecの実行環境は「test」なので注意してください。

## Warningの削除
###そのまま実行するとWarningが大量に出てしまいます。内容を確認したところ、sassなどライブラリ周りで出ているようです。Warningが出っ放しなのはちょっと嫌なのですが、ここは致し方なくWarningが出力されないようにしましょう

```text:.rspec
--color
#--warnings
--require spec_helper
```
### シャープでコメントアウトします。

## RSpecを書こう
```rb:spec/example/my_example_spec.rb
require 'rails_helper'

RSpec.describe ApplicationHelper, :type => 'helper' do
  describe "example spec" do

    it "should aaaaaa" do
      p "test"
    end
  end
end
```
### ※RSpecの書き方はいくつか種類があるようですが、こちらが一番正当なのでしょうか？
参考: http://www.rubydoc.info/gems/rspec-rails/frames
※実施できるテストの種類は、Model Spec, Request Spec, Helper Specなど様々あります。

## RSpecの実行

```shell-session
$ bundle exec rspec spec/example/
```
### spec/example以下のすべてのテストが実行されます。
Storyboard + Auto Layout でカスタムセルの Table View を作ったときのメモ


# はじめに
タイトルのとおりですが、ヘッダ・フッタを追加したいことなどもあると思うので、UIViewController を継承したクラスを使っています。


## イメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/39324/8f23ab01-6e70-aeee-d96a-417c79800009.png "image.png")



## アイテムの作成
TableView に表示するアイテムを作ります。

```swift:Item.swift
import Foundation

struct Item{
    var title: String
    var subtitle: String

    init (title: String, subtitle: String) {
        self.title = title
        self.subtitle = subtitle
    }
}
```

## カスタムセル

カスタムセルを作成します。流れはざっと以下の通りです。

* Storyboard 上で各種 View を配置する
* Storyboard 上で制約をつける
* CustomCell クラスを作成する
* ユーティリティ画面の Custom Class を「CustomCell」とする
* Table View Cell の Identifier を「Cell」とする
* 更新対象の View を CustomCell と紐付ける

尚、ラベルについては、複数行・改行位置対応のため、ユーティリティ画面から Lines を「0」、Line Breaks を「Word Wrap」とします。



![cell.png](https://qiita-image-store.s3.amazonaws.com/0/39324/b44627a0-0154-c84c-6f74-604aa8cd562b.png "cell.png")

```swift:CustomCell
import UIKit
import Foundation

class CustomCell: UITableViewCell {
    
    @IBOutlet weak var labelTitle: UILabel!
    @IBOutlet weak var labelSubtitle: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}
```

## Table View

下記対応をします。

* 親 View に対して、上下左右の制約を設定する
* Table View を ViewController と紐付ける

![table.png](https://qiita-image-store.s3.amazonaws.com/0/39324/60b0aedb-6460-3419-3b88-43dabce516ec.png "table.png")




## ViewController
ViewController はこんな感じです。高さ調整は下記一行でオッケーのようです。

> self.tableView.rowHeight = UITableViewAutomaticDimension



```swift:ViewController
import UIKit
import Foundation

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    var items = [Item]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.items.append(Item(title: "タイトル1", subtitle: "サブタイトル1"))
        self.items.append(Item(title: "タイトル2", subtitle: "改行が表示されるようにちょっと長めの文字を入れる"))
            
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell
        cell.labelTitle.text = items[indexPath.row].title
        cell.labelSubtitle.text = items[indexPath.row].subtitle
        return cell
    }
}
```
gulp、SassでBootstrapをセットアップしたときのメモ

レスポンシブなデザインのサイトがすぐ作れちゃうと噂の[Bootstrap](http://getbootstrap.com/)をなんとなくいじってみよう、思ったのですが、ふつうに公式のチュートリアル通りにやるとLESSとGruntを使うことを強いられてしまうので、
・Sassがいいな
・ついでにGruntの代わりにgulpを使ってみたいな
と思っていたらこんなどんぴしゃな記事を見つけました。ないすでーす。
http://ericlbarnes.com/setting-gulp-bower-bootstrap-sass-fontawesome/

基本これ通りにやればおkだったのですが、gulp-ruby-sassを実行するところでちょっと詰まったので以下はそのメモ。



##Error: Missing the Sass executable… のエラー
gulp-ruby-sassを使うのにsassをインストールする必要があったので以下を実行。

```sudo gem install sass```

##gulp-ruby-sass: stderr: OptionParser::NeedlessArgument: needless argument: --update=: ... のエラー
環境によっては出ないのかもしれないけど自分の場合これが出て結構長いことはまってました。
https://github.com/sindresorhus/gulp-ruby-sass/issues/145

gulp-ruby-sassのバージョンがデフォルトで0.7.1だったのですが、1.0より前のバージョンはもうサポートしないよ、と[公式](https://github.com/sindresorhus/gulp-ruby-sass)に書いてることに気づき、以下を実行。

```npm install --save-dev gulp-ruby-sass@1.0.0-alpha```

それに付随してgulpfileの書き方も変わったみたいなので以下のような感じに変更

```js:gulpfile.js
gulp.task('css', function() {
    return sass(config.sassPath + '/style.scss', {
        style: 'compressed',
        loadPath: [
            './resources/sass',
            config.bowerDir + '/bootstrap-sass-official/assets/stylesheets',
            config.bowerDir + '/fontawesome/scss'
        ]
    })
    .on("error", notify.onError(function (error) {
        return "Error: " + error.message;
    }))
    .pipe(autoprefix('last 2 version'))
    .pipe(gulp.dest('./public/css'));
}); 
```

…で、ようやく動いてくれました。
オシレーターの波形が違う問題

<blockquote class="twitter-tweet" lang="ja"><p>なんてこった、FirefoxのWebAudioAPIのオシレータ、サイン波以外だとDC除去フィルターがかかってる?LFO波形がちゃんと出ない...まあ、この辺いい始めるときりがないんだけど。</p>&mdash; g200kg (@g200kg) <a href="https://twitter.com/g200kg/status/536848276528451587">2014, 11月 24</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こういうツイートを見かけたので、波形ごとに 1Hz, 10Hz 441Hz, 882Hz それぞれの周波数で1周期分キャプチャしてみた。

http://the.mohayonao.com/web-audio-api/oscillator-wave/

## WebKitのオシレーターの波形
![B3QPX64CMAAGNQG.png](https://qiita-image-store.s3.amazonaws.com/0/2568/96cdbc1c-c48f-ac73-fb7a-d501648d44c0.png)

## Firefoxのオシレーターの波形
![png.png](https://qiita-image-store.s3.amazonaws.com/0/2568/8b1355ec-3c8a-6bbd-4591-15b464bc55c3.png)

たしかに全然違う。

なぜ違うかというと波形を生成するアルゴリズムが違うからで、

- WebKit -> PeriodicWave (周波数情報のテーブルから生成)
- Firefox -> BLIT (bandlimited impulse train)

という方法で生成されている。どちらもエイリアスノイズがでない方法で、ゆえに Web Audio API のオシレーターは音が良いと言われるのだけど、LFOみたいに波形をコントロールする用途だと波形が異なると困ることがある。（それ以前にFirefoxの低周波域は全然仕事していない..）ちなみに SuperCollider だとノコギリ波を出すにも音響ソース用途の Saw と LFO用途の LFSaw みたいに2種類用意されている。

[追記 2015/02/20 16:30]

以下、いろいろ書いたけど全体的に雑いのでなし。

Firefox は 37 で WebKit と同じ方式になります。

<del>
# どうしたらよいのか？
将来的に同じになるのかも知れないし、ならないのかもしれない (Web Audio APIの仕様には具体的なアルゴリズムは書かれていなくて、実装コストと理想のバランスをとって頑張れ、と書かれている) けど、今のところは各自工夫で乗り切るしかない。

## 1. カスタム波形を使う
<del>
OscillatorNode は `setPeriodicWave()` メソッドを使って波形のカスタムができるので、標準で用意されている Sine, Square, Sawtooth, Triangle それぞれの PeriodicWave を用意して代用する方法です。

http://the.mohayonao.com/web-audio-api/periodic-wave/

各波形を生成するアルゴリズム
https://github.com/mohayonao/the.mohayonao.com/blob/master/public/web-audio-api/periodic-wave/periodic-wave.js

Triangleの開始位相位置がおかしい気がしますが、それ以外はだいたいいけそう。ただし、LFO用途として考えると綺麗な波形とは言えません。
</del>
<br><ins>
[追記 2014/12/15 17:00]
Firefox 34.0 時点では PeriodicWave にバグがあるっぽくてちゃんと動かないです。
</ins> → [検証ページ](http://jsfiddle.net/mohayonao/unz6gr8d/)

## 2. BufferSourceNodeを使う
サンプリングレートと同じサイズの AudioBuffer を作って、そこに波形を書き込んで利用すると、BufferSourceNode の playbackRate を周波数代わりに使えます。ただし、この方法には WebKit の playbackRate に AudioNode を接続しても反映されないという問題があって、LFOをLFOでモジュレーションするみたいなことができません。

## 3. 用途に応じてバリバリ書く
上記の方法で解決しなさそうな場合は頑張って書くしかなさそう。音作りのために試行錯誤するたびにバリバリ書き直すので辛いことになると思う。

- 上記よりも小さい BufferSourceNode を使う
- LFOのLFOを考慮した BufferSourceNode を使ってどうにかする
- AudioParam の setValueCurveAtTime を使ってどうにかする
- ScriptProcessorNode を使ってどうにかする
</del>
MeCab の辞書に業界内で使う独自の用語を登録する

すでに前回 [Wikipedia とはてなキーワードからユーザー辞書を生成する](http://qiita.com/ynakayama/items/388c82cbe14c65827769)話を書きましたから、基本的にはこの内容を真似れば良いです。今回は補足という意味で簡単な例を手順として掲載しておきます。

MeCab 辞書への単語追加方法としては[二つの方法があります](https://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html)。

* システム辞書への追加
* ユーザ辞書への追加

システム辞書はあまり変更したくないので、基本的にユーザー辞書を作成し、これに用語を登録していく形で運用します。

### CSV ファイルに用語を書き加えていく

次のように 1 行 1 単語として独自用語を書き加えていきます。

```
On-PreSt
Dr.Cowbell
```

### Ruby で語彙の長さを計算し辞書のソースを作る

[前回](http://qiita.com/ynakayama/items/388c82cbe14c65827769)利用した Ruby スクリプトをそのまま流用すれば良いでしょう。これは単語の長さから自動的に重みを計算してくれます。

```rb
require 'csv'

original_data = {
  'my.csv'
}

CSV.open("custom.csv", 'w') do |csv|
  original_data.each do |type, filename|
    next unless File.file? filename
    open(filename).each do |title|
      title.strip!

      next if title =~ %r(^[+-.$()?*/&%!"'_,]+)
      next if title =~ /^[-.0-9]+$/
      next if title =~ /_\(/

      title_length = title.length

      if title_length > 3
        score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i
        csv << [title, nil, nil, score, '名詞', '一般', '*', '*', '*', '*', title, '*', '*', type]
      end
    end
  end
end
```

他の IT 系キーワードもあわせて利用したいなら、前回のスクリプトに my.csv のみ追加すれば良いかと思います。

### 辞書のソースから MeCab ユーザー辞書を生成する

生成された custom.csv を見ると次のように行ができているかと思います。

```
On-PreSt,,,-9050,名詞,一般,*,*,*,*,On-PreSt,*,*,custom
Dr.Cowbell,,,-12649,名詞,一般,*,*,*,*,Dr.Cowbell,*,*,custom
```

これを元にユーザー辞書を生成します。

```bash
/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u custom.dic -f utf-8 -t utf-8 custom.csv
#=> reading custom.csv ... 1191420
#   emitting double-array: 100% |###########################################|

#=> done!
```

あとはこのユーザー辞書を使えば企業独自の用語なども正確に解析することができるようになります。
Windows で VCCW

ローカルに WordPress を建てよう、と思い立って調べたところ、[VCCW](http://vccw.cc/)という便利な WordPress 入の Vangrant セットがあることを知った。
Windows ユーザはあまり考慮されていないのか、若干躓くところがあったのでメモとして残しておく。

## 環境
```
VCCW 1.9.0
Vagrant 1.6.3
VirtualBox 4.3.18
```

ちなみにコマンドラインは Cmder を利用している。

## インストール

流れは基本的に公式の [Getting Startup](http://vccw.cc/#h2-1) に沿ってやればいい。
Vagrant と VirtualBox は既にインストール済みだったので、
3. Install the vagrant-hostsupdater plugin. (Optional)
からはじめた。

次の4.で release 版をDLして解凍するか、git clone しろと書いてあるのだが、
2014/11/25 現時点では git clone したものを手順どおり vagrant up しても、上手く行かなかった（エラー内容は後述）ので、release 版をDLすることにする。

```bash
$ wget https://github.com/miya0001/vccw/archive/1.9.0.tar.gz
$ tar xvzf 1.9.0
$ mv vccw-1.9.0 vccw
```

するなり、GUIでちゃんとrelease版を落としてきてどっかに解凍するなりしよう。
CUIで頑張ると wget がなくて cinst wget とかやったり、 --no-check-certificateしないと wget できなかったりと結構めんどくさい。（記事書くためにわざわざやってみた）

5.と6.は問題なく進んでいざ7. Start a Vagrant environment.にきて
vagrant up するわけだが、ここで3.のvagrant-hostsupdater pluginを入れていると、管理者権限がないコマンドラインの場合に hosts ファイルの編集でエラーが出てしまう。

```
C:/Users/ほげほげ/.vagrant.d/gems/gems/vagrant-hostsupdater-0.0.11/lib/vagrant-hostsupdater/HostsUpdater.rb:82:in `initialize': Permission denied - C:/windows/system32/drivers/etc/hosts (Errno::EACCES)
```

Cmder なら Ctrl-T から {cmd(Admin)} をタブを開くなどして、管理者権限のあるコマンドラインから vagrant up しよう。
初回の chef の実行は5分程度とどこかで見たが、体感20分以上かかった。長い。
しばらく放置したらなんとか問題なく起動したようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/38330/0b898b9f-508b-9db8-f05f-857476164512.png)

wordpress.local にアクセスしてこんな感じになればOK。

## 余談

ちなみに先述した git clone で取得したものだと、ずいぶんと待たされた挙句、下記から始まる長いエラーメッセージが出てしまう。

```bash
==> default: [2014-11-25T09:52:17+00:00] ERROR: yum -d0 -e0 -y install gcc-4.4.7-11.el6 exceeded timeout
 900
```

全部盛りの Surface Pro 3 で実行しているので、たぶんスペック的には問題ないと思うのだが、ネットワーク的な問題かもしれない。

また、他にもどこかで躓いた場合、一度 vagrant destroy したり、いっそディレクトリごと削除するとかでまっさらにしてからやり直した方がいい。
Vagrantfile の WP_LANG を間違えて "ja_JP" に変更したら最後の最後でエラーを吐くわ（正しくは "ja" のみ）、それくらい vagrant reload したらええやろ、とやっても vagrant ssh が通らなくなったりと、散々だった。

ともかくこれでローカルに WordPress を立てられたので、ちょいちょいいじっていくことにする。
Swiftで作ったメソッドをObjective-Cで使うときの小ネタ

##Swiftで書いたコードはObjective-Cでも使えるが・・・

Swiftで書いたクラスもNSObjectを継承させたり`@objc`を使うことでObjective-Cでも使うことができますね。

しかしSwiftでの書き方とObjective-Cの書き方って微妙に違うので、ただSwiftのコードを使うだけだとなんとなくそいつだけ違和感を生じさせたりすることもあります。

例えば引数。
Objective-Cでは

```objc:objective-C
[someObject getXXXWithId:xxxx];
```

みたいなメソッドが一般的だと思うですが、Swiftだと

```swift:swift
someObject.get(xxx)
// あるいは
someObject.get(id:xxx)
```

みたいな感じに使うことが多い、というかそう使いたくなると思います。

swiftではスマートに書きたい・使いたいが、Objective-Cでは空気を読んでObjective-Cっぽく振舞って欲しい。そう願うあなたに一つの解決法を提案しましょう。

##Swiftで書いたコードをObjective-Cでもスマートに使うには

```swift:swift
func get(#id: Int) {
    // 省略
}

func get(#name: String) {
    // 省略
}
```

こんなメソッドをswiftで宣言してみてください。するとなんとObjective-Cでは

```objc:objective-C
// func get(id: Int)
[someObject getWithId:1234];
// func get(name: String)
[someObject getWithName:@"あいうえ"];
```

という形で、オーバーロードも含めて非常にObjective-Cっぽく使うことができます！
ちなみに、これは引数のラベルを必須にする書き方になるのでswiftで使おうとするとちょっとだけもっさりした書き方にはなります^^;

```swift:swiftで使うと・・・
// func get(id: Int)
someObject.get(id: 1234)
// func get(name: String)
someObject.get(name: "あいうえ")
```

それでも、Withが入らないだけそこそこSwiftっぽくはなりますね！

個人的にはオーバーロードを使ったクラスでもObjective-Cで使えるようになるのがすごく便利でした。何も考えず#無しでオーバーロードさせたクラスを`@objc`してしまうと、メソッド名の重複で怒られてしまうことになります^^;

新規のプロジェクトなら別ですが、Swiftへの置き換えならObjective-Cと混ぜながら徐々に置き換えているプロジェクトも多いはず。この辺が障壁でSwiftらしい書き方にならない！とお嘆きの方ぜひとも試してみてください。
Imagemagickの高速化 mprとmpc

Imagemagickのコマンドを高速化する機能として、mprとmpcというものがあります。

## mpr (Memory Program Register)

[mpr](http://www.imagemagick.org/Usage/files/#mpr) という仕組みを使うと、複数の処理を一つのコマンドにまとめることができます。

### before

```bash
# hoge という字の画像を生成
$ convert -size 200x200 -background transparent -fill black -gravity Center label:hoge png:- | \
# それをbg.png と合成する
$ convert -composite - bg.png hoge.png
```


### after

```bash
$ convert -size 200x200 -background transparent -fill black -gravity Center label:hoge -write mpr:hoge +delete mpr:hoge -composite bg.png hoge.png
```

`mpr:hoge` を出力として指定することで、Imagemagickプロセス内のメモリに `hoge` という名前で出力結果が一時的に保存されます。　その後、`+delete` で直前までのコマンドライン引数の内容をリセットし、最後に  `mpr:hoge` を入力にして合成の処理を実行しています。

プロセスが1つになったことで、起動のオーバーヘッドや、入力データをパースする処理が省けるため、パフォーマンスが良くなります。

## mpc (Magick Pixel Cache)

mpcは、Imagemagickが画像をパースした後のフォーマットです。 Imagemagickにとっては、汎用の画像フォーマットをパースするよりも、mpc形式を読み込んだ方が高速になります。
あらかじめ合成用の素材をmpcに変換しておくことで、パフォーマンスを改善することができます。

変換は、 

```bash
$ convert bg.jpg bg.mpc
```

のように、出力フォーマットをmpcに指定するだけです。
このとき、 `.mpc` というファイルと、`.cache` という計2つのファイルが作成されます。 `hoge.mpc` を入力にするときは、 `hoge.cache` が同じディレクトリ内に必要です。

さっきの例の合成も、合成用素材にmpc を指定することができます。

```bash
$ convert -size 200x200 -background transparent -fill black -gravity Center label:hoge -write mpr:hoge +delete mpr:hoge -composite bg.mpc hoge.png
```

* [File Handling -- IM v6 Examples](http://www.imagemagick.org/Usage/files/#mpc)
* [ImageMagick: Architecture](http://www.imagemagick.org/script/architecture.php)
Memcached超初心者の使い方メモ

telnetからデータの確認をすることは殆ど無いと思われるが、
telnetから確認する必要が出てきたので、メモ。

今回は、特にキー一覧が欲かった。

```telnet:データセット

> set foo 0 0 3 
> bar 
STORED

```

```telnet:データ取得

> get foo
bar
END

```

```telnet:データ変更

> replace foo 0 0 0
> aaa
STORED

```

```telnet:データ削除

> delete foo
DELETED

```


キー情報の入っているところ。slab

```telnet:slab確認

> stats slabs
STAT 1:chunk_size 96
...
...
END

```

stats slabs で取得した番号をslab番号として探すことが出来る  
stats cachedump [slab番号] [limit]

```telnet:キー一覧探し

> stats cachedump 1 2
ITEM enti_p_1000 [592 b; 1416899301 s]
ITEM foo [3 b; 1416823628 s]
END

```

あ、あった・・。

参考: http://l-w-i.net/t/memcached/command_001.txt
yosemiteのディフォルトでMAMP環境のメモ書き


Yosemiteをインストールしたから入ってる環境を調べてみた。

```
Apache　2.4.9
/usr/sbin/httpd

httpd.conf
/private/etc/apache2/httpd.conf

DocumetRoot
"/Library/WebServer/Documents"
```

```
MySQL

これは入ってないのでHomeBrewでインストール
```

```
PHP 5.5.14
/usr/bin/php
```

ディフォルトで新しいバージョン入ってますね。
これでｗｅｂアプリ勉強しようっと
`~/Dropbox (個人)` 以下とかでnokogiriをビルドできない問題

`bundle install --path vendor/bundle` のようにカレントのスペースやら括弧やらを含むディレクトリ以下でインストールしようとすると失敗した。

```
bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using mini_portile 0.6.1
Using bundler 1.7.7

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb --use-system-libraries
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: invalid option -(  (-h will show valid options) (RuntimeError)


Gem files will remain installed in /Users/kstg/Dropbox (個人)/tmp/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.4.1 for inspection.
Results logged to /Users/kstg/Dropbox (個人)/tmp/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.4.1/ext/nokogiri/gem_make.out
An error occurred while installing nokogiri (1.6.4.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.4.1'` succeeds before bundling.
```

 mini_portile https://github.com/luislavena/mini_portile というモジュールが動的に拡張モジュールのコンパイル時にパッチをあてるものらしく、それの`PATCH(1)`コマンドがパスによっては失敗していた。

```
cd vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.4.1/ext/nokogiri
ruby -I../../../mini_portile-0.6.1/lib extconf.rb

# ...

************************************************************************
Extracting libxml2-2.9.2.tar.gz into tmp/x86_64-apple-darwin14/ports/libxml2/2.9.2... OK
Running patch with /Users/kstg/Dropbox (個人)/tmp/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.4.1/ports/patches/libxml2/0001-Revert-Missing-init
ialization-for-the-catalog-module.patch...
Running 'patch' for libxml2 2.9.2... sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `patch -p1 < /Users/kstg/Dropbox (個人)/tmp/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.4.1/ports/patches/libxml2/0001-Revert-Mi
ssing-initialization-for-the-catalog-module.patch >/Users/kstg/Dropbox (個人)/tmp/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.4.1/ext/nokogiri/t
mp/x86_64-apple-darwin14/ports/libxml2/2.9.2/patch.log 2>&1'
ERROR, review '/Users/kstg/Dropbox (個人)/tmp/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.4.1/ext/nokogiri/tmp/x86_64-apple-darwin14/ports/libxm
l2/2.9.2/patch.log' to see what happened.
*** extconf.rb failed ***
```

どうやって解決すべきかまだよくわかってないけど。同じような問題に直面した人は居るようで

https://github.com/luislavena/mini_portile/pull/34 と
https://github.com/laiso/nokogiri/pull/1 のパッチをあてればビルドできるようになる。
シンボリックリンクがただのファイルに置き換わってしまった


frameworkの中身など、シンボリックリンクでファイルを管理することは多々あるかと思います。

ところでWindowsでは、シンボリックリンクはただのリンク先が書かれただけのテキストファイルに化けてしまいます。
-> [詳しくはこちらの記事を参照](http://qiita.com/ngyuki/items/621830bc53aaf2923f73)

_何かの拍子で、リポジトリ内のシンボリックリンクがテキストファイルに置き換わってしまった！！_

そんな事件が起きてしまったときにしたことメモ。


## 環境

```
$ git branch -v
* master
  missingSymbolicLinks
```

`master`ブランチには正常なシンボリックリンクが残っていて、`missingSymbolicLinks`ブランチではシンボリックリンクが消えているとします。

作業はUnix系OSで行います。

## 手順

```
$ find . -type l > symlinks
$ git checkout missingSymbolicLinks
$ cat symlinks | xargs git checkout master -- 
$ rm symlinks
$ git commit
```


概要は、

1. シンボリックリンクのファイルを`find`で探して、
2. 目的のブランチへ`git checkout`してくる

といった感じです。
`find`の結果を一度ファイルに書き出しているのがみっともないので、どなたか、もっといい方法を教えていただけたらと思います。
github でシンタックスチェッカーが暴走して大量にコメントが付いてしまった時に、一斉に消す

```js
$(".timeline-comment-action").attr("data-confirm", null).trigger("click")
```

data-confirm を消さないと、ひたすら OK を押す作業が始まるので注意。

# 特定の人のコメントのみ消す

シンタックスチェッカーがユーザー`hogehoge` なら、それ宛のURLとアイコンが出ているので、そこからたどって消す。

```js
$(".timeline-comment-wrapper a[href='/hogehoge']").siblings(".timeline-comment").find(".timeline-comment-action").attr("data-confirm", null).trigger("click")
```
SmartGit/HgのSubversion連携機能にプロキシを設定する

需要少なそうだけど2時間ほどハマったので。

[SmartGit](http://www.syntevo.com/smartgit/) は日本語化できないながら優れたGit/Mercurial UIクライアントです。非商用ならフリー（このことはトップページのソースを開かないと書いていないけど）。

このSmartGitの強みの一つがSubversion連携で、git-svnより強力なものを自前で実装しています。マージ・ブランチ関係の再現度が上がっている、propertiesの再現度が上がっている、svnリポジトリのクローンが一瞬で終わるなどなど。

で、このsvn連携機能にプロキシサーバを設定するのが一筋縄ではいかないのでここからがメモ。

* Edit - Preference からプロキシ設定 ⇒ 無視される
* ホームディレクトリの .subverion/servers に設定 ⇒ 無視される

えっじゃあどこ？

答は、Windowsならホームディレクトリの **AppData\Roaming\Subversion\servers** 。
AppDataの下に.subversionとほぼ同じようなディレクトリを作って勝手に参照しているのはJava用のSVNクライアントライブラリであるSvnKitです。こいつめ。

あ、SmartGitの強みはsvn連携だけじゃありませんからね。
最大の強みはUI。実ファイル→ステージ→コミットの流れを自然に再現したウィンドウ構成で、みんな大好きSourceTreeよりも直感的にGitの仕組みが理解できるし、扱えます。また3ペイン式のステージ編集エディタも素敵。使ってみなよというよりは購入しちゃいなよというレベルでお薦めしています。
UITextFieldでemailのvalidate


その文字列がメールアドレスか調べる関数

```swift
    /// その文字列がメールアドレスかどうか調べる
    class func isValidEmail(string: String) -> Bool {
        println("validate calendar: \(string)")
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
        var emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        let result = emailTest?.evaluateWithObject(string)
        return result!
    }
```

٩(๑❛ᴗ❛๑)۶
AWS LambdaでRDS（MySQL）に接続してみた

#はじめに

AWS Lambdaに登録したfunction内からRDSのMySQLに接続できるか試してみる。

Lambdaでは各種ライブラリも含めてZipファイルとしてまとめてアップロードすることでこれらを利用することができます。
※ただし、pure javascriptでないと実行環境の違いで失敗するかも知れません（未検証）

というわけで今回はpure JavaScriptで書かれたMySQL接続用ライブラリのnode-mysqlを使ってRDSに接続してみます。

#事前準備
まずは接続先となるRDSインスタンスを用意しておくがこちらの手順は割愛。
ポイントとしてはセキュリティグループで接続元を0.0.0.0/0からのアクセスを許可しておくこと。

RDSインスタンスが作成できたらあらかじめテーブルとかを用意しておく。今回はlambdaというDBを用意してsampleというテーブルを作成した。
作成したRDSインスタンスに手元の開発環境から接続する。

```bash
$ mysql -u lambda -h lambda.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com -p

```

接続したら作成済のlambdaというDBにスイッチした後、テーブルを作成し1件だけデータを入れておく。

```mysql
mysql> use lambda;
Database changed
mysql> show tables;
Empty set (0.17 sec)
mysql> create table lambda.sample (id int, value varchar(10));
Query OK, 0 rows affected (0.22 sec)
mysql> show tables;
+------------------+
| Tables_in_lambda |
+------------------+
| sample           |
+------------------+
1 row in set (0.18 sec)
mysql> insert into sample values(1,"test");
Query OK, 1 row affected (0.30 sec)
mysql> select * from sample;
+------+-------+
| id   | value |
+------+-------+
|    1 | test  |
+------+-------+
1 row in set (0.28 sec)
```

#Lambda functionの実装
続いてLambda functionのコード部分を実装する。
その前に適当なディレクトリを作成して、移動した後node-mysqlをインストールしておく。

```bash
$ mkdir lambda-mysql-sample
$ cd lambda-mysql-sample/
$ npm install mysql
mysql@2.5.3 node_modules/mysql
├── require-all@0.0.8
├── bignumber.js@1.4.1
└── readable-stream@1.1.13 (isarray@0.0.1, inherits@2.0.1, string_decoder@0.10.31, core-util-is@1.0.1)
```

実際のソースは以下のような感じで用意する。

```js:sample.js
var mysql = require('mysql');


exports.handler = function(event,context){

	var connection = mysql.createConnection({
	  host     : 'lambda.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com', //RDSのエンドポイント
	  user     : 'user', //MySQLのユーザ名
	  password : 'password', //MySQLのパスワード
	  database : 'lambda'
	});

	connection.connect();

	connection.query('select * from sample', function(err, rows, fields) {
	  if (err) throw err;

	  console.log(rows);
	  console.log(fields);
	});

	connection.end(function(err) {
  		context.done();
	});

}
```

次にこのコードに加えてnode-mysqlそのものを含めてzipファイル形式にまとめます。
コツとして**ディレクトリが含まれないフラットな形でZipファイルにまとめる必要があります**。
今回はディレクトリに移動した状態で以下のコマンドを実行しています。

```bash
zip -r lambda-mysql-sample.zip .
```

あとは普通にLambda functionを新規で作成し、コードをインラインエディタで記述するのではなく作成したZipファイルをアップロードします。
ファイル名は今回の場合だとsample.jsとし、handler名はhandlerになります。
作成が完了したら早速実行してみてください。

#結果確認
今回はマネージメントコンソール上で作成したLambda functionのEdit/Test画面でInvokeして試します。

![Screen Shot 2014-11-25 at 7.25.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/9f532c45-3ad2-84d1-890f-d7daafe65fcf.png)

ここで実行した結果は画面下部で確認できます。というわけで無事に接続できてselect文の実行もできています。

![Screen Shot 2014-11-25 at 7.28.39 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/9501b38b-1537-4131-1b0b-438295377d70.png)

#最後に
こんな感じでできるにはできるけれども現状ではRDS側のセキュリティグループでソースをanyで接続を許可しなくてはならないので実際のところ利用する機会はないかと思われます。。。

**免責
こちらは個人の意見で、所属する企業や団体は関係ありません。**
VC++でUnicode文字をコマンドプロンプトに出力する方法

普通に出力すると、コマンドプロンプト側の出力文字コードがSJISなため、文字化けを起こします。

コマンドプロンプトでUnicode文字を表示できるようにするには、以下の関数を実行して、出力コードページを変更します。

`SetConsoleOutputCP (CP_UTF8);`
Twitter Streaming API + Node.js (ntwitter)で指定キーワードのツイートを取得する


##利用モジュール
* ntwitter https://github.com/AvianFlu/ntwitter

色々あるみたいだけど検索して最初に出てきたやつを使ってみました。

##使うAPIのエンドポイント
 これみたいですね -> POST statuses/filter https://dev.twitter.com/streaming/overview/request-parameters#track

###リクエストパラメータはtrackを使います。

trackの説明に

```
Keywords to track. Phrases of keywords are specified by a comma-separated list. See track for more information.
```

とあったのでtrackがキーワード指定に使うパラメータみたいです。


他にもパラメータ色々ありますな

* delimited
* stall_warnings
* filter_level
* language
* follow
* track
* locations
* count
* with
* replies
* stringify_friend_id


##実装

`LIGinc`という単語のツイートを取得します。

```
$ npm i ntwitter
```

```index.js
var twitter = require('ntwitter');
var tw = new twitter({
  consumer_key: 'xx',
  consumer_secret: 'xx',
  access_token_key: 'xx',
  access_token_secret: 'xx'
});
 
tw.stream('statuses/filter', {'track':'LIGinc'}, function(stream) {
  stream.on('data', function (data) {
    console.log(data);
  });
});
```

```
$ node index

```

起動したら何も表示されないままです。
twitter上で指定した単語(今回はLIGinc)がつぶやかれるとコンソールにツイート情報が表示されます。
↓

```
{ created_at: 'Tue Nov 25 09:01:48 +0000 2014',
  id: 537169268056416260,
  id_str: '537169268056416257',
  text: 'ligincにてまろ氏がxxしてます。 ()',
  source: '<a href="http://sites.google.com/site/yorufukurou/" rel="nofollow">YoruFukurou</a>',
  truncated: false,
  in_reply_to_status_id: null,
  in_reply_to_status_id_str: null,
  in_reply_to_user_id: null,
  in_reply_to_user_id_str: null,
  in_reply_to_screen_name: null,
  user: 
   { id: 59417367,
     id_str: '59417367',
     name: 'のびすけ/S.Ryousuke',
     screen_name: 'n0bisuke',
     location: 'I\'m at 岩手県立大学',
     url: 'http://liginc.co.jp/life/useful-info/116563',
     description: 'のびすけです。LIG inc.\nhttp://qiita.com/n0bisuke',
.
.
.

```
ローカルマシンでyumをする方法

簡単な事なのにsshの多重接続でドハマりしたので覚書。

gw - 踏み台 - ローカルサーバ
という構成(ローカルサーバはインターネットに繋がっていない)の時、ローカルサーバでyum等をする方法。

踏み台サーバで
`$ ssh -D 1080 localhost`
自分にsshして自分1080ポートをSocksプロキシにする。

そのまま
`$ ssh -R 1080:localhost:8080 対象ローカルサーバ`
として対象のローカルサーバにsshでリモートポートフォワーディングしつつログイン。

ログイン先のローカルサーバ上のyum.confにプロキシ設定を追加。
`$ sudo vi /etc/yum.conf`
の適当な場所(distroverpkg=centos-releaseとかの下でいいじゃないかな)に
proxy=socks5h://localhost:8080
を追加。

これでローカルサーバからyumが使えるようになる。
同様にプロキシの設定をしてやれば、他の通信も外に出れる様になる。
MSYS2でtmuxを使う

## 【はじめに】

MSYS2上でtmuxを動作させる手順をまとめました。

> MSYS2の導入は[こちら](http://qiita.com/magichan/items/7702d7865deaaca2ad44) の記事をどうぞ

## 【tmuxの導入】

MSYS2では、tmuxパッケージが提供されていますので、パッケージマネージャ(pacman)から

```
$ pacman -S tmux
```

で簡単に導入できます。

一応バージョン確認

```
$ tmux -V
tmux 2.0
```

## 【tmuxの起動】
tmuxの起動は

```
$ tmux
```

で問題なく動作します。


これで一見うまくいっているように見えますが、

```
$ exit
```

を実行して一度tmuxを終了した後に、再度起動させようとすると、

```
$ tmux
“failed to connect to server: Permission denied”
```
とエラーが表示され、tmaxが起動できません。

tmuxを再度起動させるためには、/tmp ディレクトリ以下にある tmux-****** ディレクトリを消去した後に再起動する必要があるようです。

しかしながら、このディレクトリ削除の作業を毎回行うのは面倒なので、[こちら](http://superuser.com/questions/760503/cygwin-tmux-failed-to-connect-to-server-no-error) の投稿にあるように

 ```
alias tmux='rm -rf /tmp/tmux* && tmux'
```

を*.bashrc*に設定しておくことで回避しましょう。

> Note : 上記の方法で、毎回新たにtmuxを起動する（新しいセッションを作成して起動）することはできるのですが、前回のセッションにAttachしたり、複数のセッション間を移動するようなことは出来ません。 (何か情報があるかたがおりましたらお教えください)

## 【基本的な操作方法】

一応tmuxの主なコマンドを挙げておきます

|機能      |コマンド|
|:--------:|:------:|
|Window作成|Ctrl+b c|
|次のWindow|Ctrl+b n|
|前のWindow|Ctrl+b p|
|Window選択|Ctrl+b 数字|
|Window終了|Ctrl+b &|
|横分割    |Ctrl+b "|
|縦分割    |Ctrl+b %|
|ペイン移動|Ctrl+b o|
|ペイン終了|Ctrl+b x|

## 【マウスモードの設定】
次に、tmuxの操作をマウスを使って行えるようにマウスモードの設定をします。

これは設定ファイル(*~/.tmux.conf*) に以下の設定を追記します。
（設定ファイルがない場合は作成してください）

```~/.tmux.conf
set-option -g mode-mouse on
set-option -g mouse-utf8 on
set-option -g mouse-resize-pane on
set-option -g mouse-select-pane on
set-option -g mouse-select-window on
```

これにより、マウスを使っての
・Windowの切り替え
・Paneの移動
・Paneのサイズ変更
・スクロール
を行えるようになります。

マウスモードを設定すると従来のターミナル（mintty）で行えていた、コピー/ペースト処理が行えなくなりますが、**「SHIFTキーを押したままの状態でマウスを操作する」**ことで通常通りの選択/コピー/ペーストが行うことが出来るようです(今のところ私はこれで特に不便を感じておりません)。

## 【感想】
残念ながら、Session(attach/detach)は動作しませんでしたが、Window/Paneは問題なく動作しているので、単に複数ターミナルを使用したい場合は**十分使える**レベルと思います。
【C++】std::findがstd::付けなくてもコンパイルが通る

```cpp:aaa.cpp
#include <vector>
int main()
{
	std::vector<int> aaa;
	std::vector<int>::iterator r = find(aaa.begin(), aaa.end(), 5);
	return 0;
}
```

上記のコードのコンパイルが通る。本当はfind関数にはstd::を付けないとコンパイルが通ってほしくなかったんだけど・・・

自作のfind関数を使おうとしたらオーバーロードが未解決となって何が原因なのかと追っていったらstd::findがstd付けなくてもコンパイルが通ることに気付いたのが事の発端。

デバッガで追うと\<xutility>のfindが呼ばれており、
ヘッダの頭とヘッダの最後に_STD_BEGIN, _STD_ENDがありそれ以外には無い事からnamespaced stdで囲まれていると思っていたのだけれど・・・

結局こっちの対応としては自作のfindを呼ぶ場合名前空間を指定する事に。どちらにせよ同じ名前空間内以外から呼ぶ場合には問題にならないので致命的ではないものの何でstd付けなくてもコンパイルが通るのか気になる・・・
(誰か知ってる方いたら教えてください・・・)

一応追加情報
・環境はVisual studio 2012 Version11.0.60315.01 Update 2
・std::vectorはstdが無いとコンパイルは通らない。
WindowsにMSYS2を導入して、Node.js を動作させるまでの手順

## 【はじめに】

Windows上で動作するshell環境であるMSYS2を導入することで、Node.jsを簡単に動作させることができましたので、手順をまとめておきます。

MSYS2は従来のMSYSに比べて
    ・64bit OSに対応している
    ・mingw-w64に対応している
    ・gitパッケージが提供されている
    ・doxygenやffmpegやemacsパッケージまで・・
などなど結構幸せになれますのでお勧めです。


##【MSYS2のインストール】
まずは
http://sourceforge.net/projects/msys2/files/Base/
より、最新のMSYS2をダウンロードします。
ファイルは64bit版/32bit版、インストーラ形式/アーカイブ形式が
それぞれありますので自分の環境に合ったものをお好みで選択したください。

ファイルをダウンロードしたらインストールを行ってください。

> Note : 私は "D:/msys64" 以下に64bit版のMSYS2をインストールしております。


##【MSYS2の起動】
MSYS2をインストールしたディレクトリー以下に
・msys2_shell.bat
・mingw64_shell.bat
・mingw32_shell.bat
の３つの起動スクリプトが提供されています。
どれを使ってもshellが立ち上がりますので、通常は*msys2_shell.bat*から起動しておけば問題ないと思います。 が...今回は
・mingw64_shell.bat　[64bit環境の場合]
・mingw32_shell.bat　[32bit環境の場合]
 スクリプトにより起動してください。**（理由は後述します）**

> Note : MSYS2の起動を楽に行う為、スクリプトのショートカットをデスクトップやスタートメニューに作成しておくことを推奨します。


##【パッケージマネージャ(pacman)の起動】
はじめにパッケージマネージャよりパッケージの更新処理を行っておきます。

```
$ pacman -Suy
```

終了したら、MSYS2を一旦終了させ再起動します。
再起動したら、パッケージマネージャより最低限必要なパッケージを取得しておきましょう。

```
$ pacman -S vim git wget sed diffutils grep tar unzip
```

必要であればコンパイラ等(mingw-w64)もインストールします。

```
$ pacman -S gcc gcc-libs make
```

ちなみにパッケージの一覧は

```
$ pacman -Sl
```

で閲覧することができます。


##【minttyの導入】
MSYS2では *mintty*がデフォルトで動作するようになっているみたいなので、特にする事はないようです。


##【winptyラッパのインストール】
*mintty*はとても使い勝手が良い環境なのですが、**「一部のアプリで対話モードが動作しない」**といった問題点が存在します。
これは、Node.jsを使用する上では**致命的**な問題となります。

しかしながら、この問題は、winptyラッパ経由でアプリ(Node.js)を動作させることで回避することが出来ます。
幸いなことにMSYS2にはwinptyのパッケージがあるようなので、これをインストールします。

```
$ pacman -S winpty-git
```

> Note : このパッケージのwinptyは、従来の'console.exe' が 'winpty.exe' に名称変更されているようなので注意してください

##【Node.jsのインストール】
次に、Node.jsのパッケージをインストールします。
pacmanのパッケージは64bit環境用と32bit環境用で名前が違うので、

**64bit環境の場合**
`$ pacman -S mingw-w64-x86_64-nodejs`

**32bit環境の場合**
`$ pacman -S mingw-w64-i686-nodejs`

とてインストールしてください。


---
#### **補足事項**

前述した *'pacman -Sl'* コマンドでパッケージの一覧を閲覧すると、全てのパッケージは *msys* / *mingw32* / *mingw64* の３つにカテゴライズされている事がわります。
この中で *msys* にカテゴライズされたパッケージは常に利用可能なのですが、*mingw32* / *mingw64* にカテゴライズされたパッケージはそれぞれ起動スクリプト*mingw64_shell.bat* / *mingw32_shell.bat* から起動されたshell以外からは利用できません。（PATHが通っていないだけですが・・）。

今回インストールしたNode.jsパッケージは *mingw64[32]* でカテゴライズされており、*mingw64[32]_shell.bat*から起動したshellを使用する必要があります。

MSYS2の起動の際に*mingw64[32]_shell.bat*を使用したのはこのためです。

(補足事項終わり)

---

##【Node.jsの動作確認】
最後に動作を確認します。

```
$ node -v
v0.10.32

$ npm -v
1.4.28
```
対話モードの確認

```
$ node
> console.log("Hello World!");
Hello World!

>
```
> Note : nodeコマンド（スクリプト）はWinpty経由でnode.exeを叩くように記述されている為、問題なく対話モードを利用できます。
モバイルブラウザでの iframe の挙動（Mobile Safari, Chrome for Android)


JavaScript の実行速度や描画効率が体感 15〜20% 程度落ちる。

## Mobile Safari での動作

（overflow:scroll の指定を前提にしています）

iOS では iframe の扱いが特殊になり、親ドキュメントのプロセス内で動作しているかのような扱いになる。

- iframe の height 指定は不可（コンテンツの縦サイズに従ってベタ伸び）
 - document.body.offsetHeight == window.innerHeight が成立する
 - （関連して）スクロールに関与するプロパティや関数は親側に紐付く
  - iframe コンテンツ内で body.scrollTop を取っても常に 0 が返る
 - 動作イメージとして、コンテンツが縦横フルスケールで描画されたブロック要素に対して親ドキュメントが重なり、スクロールに対しては親ドキュメントを動かしているようなものだと思えば大体当てはまる

諸々

- window.onload は発火しない
 - unload 系はそもそも depricated なので発動しない
 - iframe 側の onload イベントで代用可能と思われる（タイミングの互換性は計測していないので注意）
- screen オブジェクトや scroll*、offset* プロパティは親側を参照する必要がある
 - scroll、resize 等のイベントも同じ（親側のイベントハンドラを用いる際はメモリリーク注意）



### page cache 問題（バグ）

Mobile Safari では iframe に内包された URL に紐付くページキャッシュが更新されない問題がある。

iframe 内で遷移やリロードを行った場合は、その URL に紐付く page cache が更新されない。
ページバックを行うと page cache がある場合（iframe 外で生成されていた場合）はその page cache が参照され、存在しない場合は一度だけ page cache が生成される。

iframe 内である限り、一度生成された page cache は更新されない（遷移、location.reload とも）。


### iOS 7

- フリックバックを行うと数秒フリーズする
- page cache 問題がある
 - 更にローディングインジケータが途中で停止して以後復帰しない、通信マーク横のローディングスピナーが回りっぱなしになる、といった動作異常も見せる


### iOS 8

- page cache 問題がある
Open vSwicthでVLAN構築

Open vSwitchを用いたVLANを構築してみた．
CentOS7はデフォルトでifconfigコマンドが存在しないため，インターフェースへのipアドレスの付与はipコマンドで行う．


#環境
OS: CentOS7.0 minimal
switch: Open vSwitch 2.0.0



#構成図
```
 |A| 　　　　　　　　　　　　　　　　|C|
　　 \　　　　　　　　　　　　　　　/
     |ovs-br0|-------|ovs-br1|
　　 /　　　　　　　　　　　　　　　\
 |B| 　　　　　　　　　　　　　　　　|D|

```
ホスト|A|,|C|はVLAN10, ホスト|B|,|D|はVLAN20に所属させる.

 
#netnsの作成
```
ip netns add A
ip netns add B
ip netns add C
ip netns add D
```

#netns - スイッチ間のリンクの作成
```
ip link add a0 type veth peer name ovs0-0
ip link add b0 type veth peer name ovs0-1
ip link add c0 type veth peer name ovs1-0
ip link add d0 type veth peer name ovs1-1
```

#netnsへのインターフェースの追加
```
ip link set a0 netns A up
ip link set b0 netns B up
ip link set c0 netns C up
ip link set d0 netns D up
```

#IPアドレスの付与
```
ip netns exec A ip addr add 1.0.0.1/24 dev a0
ip netns exec B ip addr add 1.0.0.2/24 dev b0
ip netns exec C ip addr add 1.0.0.3/24 dev c0
ip netns exec D ip addr add 1.0.0.4/24 dev d0
```

#スイッチの作成
```
ovs-vsctl add-br ovs-br0
ovs-vsctl add-br ovs-br1
```

#アクセスポートの設定
```
ovs-vsctl add-port ovs-br0 ovs0-0 tag=10
ovs-vsctl add-port ovs-br0 ovs0-1 tag=20
ovs-vsctl add-port ovs-br1 ovs1-0 tag=10
ovs-vsctl add-port ovs-br1 ovs1-1 tag=20
```

#トランク用のリンクの作成
```
ip link add t0 type veth peer name t1
```

#トランクポートの設定
```
ovs-vsctl add-port ovs-br0 t0 trunk=10,20
ovs-vsctl add-port ovs-br1 t1 trunk=10,20
```

#疎通確認
```lang:通る場合
ip netns exec A ping 1.0.0.3
ip netns exec B ping 1.0.0.4
```

```lang:通らない場合
ip netns exec A ping 1.0.0.4
ip netns exec B ping 1.0.0.3 
```
Railsでsession管理にactive_recordを使う方法と型の注意点（特にフォームが多い時とかに）

Railsでsessionをactive_recordを使って管理をするときにちょっとデータベースの型で詰まったのでメモします。

## 環境

Ruby 2.1.2
Rails 4.1.6
MySQL

```
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| version                 | 5.6.21   |
| version_comment         | Homebrew |
| version_compile_machine | x86_64   |
| version_compile_os      | osx10.10 |
+-------------------------+----------+
```

# activerecord-session_store

gem ```activerecord-session_store``` を入れる。Gemfileに追記して```bundle install```します。

```rb:Gemfile
gem 'activerecord-session_store'
```
# active_recordをsession_storeに設定

次にsession_store.rbで:active_record_storeを設定します。デフォルトでは:cookie_storeとなっています。

```rb:config/initializers/session_store.rb
Railsapp::Application.config.session_store :active_record_store, key: '_railsapp_session'
```

# マイグレーション

セッションを管理するテーブルを作ります。

```
bundle exec rails generate active_record:session_migration
```

```rb:xxx_add_sessions_table.rb
class AddSessionsTable < ActiveRecord::Migration

  def change
    create_table :sessions do |t|
      t.string :session_id, :null => false
      t.text :data, limit: 4294967295
      t.timestamps
    end

    add_index :sessions, :session_id, :unique => true
    add_index :sessions, :updated_at
  end

end

```

マイグレーションファイルが作られますがここで自分の環境ではですが注意すべきことありました。最初、dataカラムを普通にtext型だけでやっていたのですが、それだとフォームが多すぎるせいか以下のエラーが頻発しました。データが大きすぎるそうです。

```
 Data too long for column '' at row 1
```

なので、MySQLのlongtext型をつかうためにtextにlimitを設定しました。

```rb:xxx_add_sessions_table.rb
t.text :data, limit: 4294967295
```

ちなみに

```
1 to 255 bytes: TINYTEXT
256 to 65535 bytes: TEXT
65536 to 16777215 bytes: MEDIUMTEXT
16777216 to 4294967295 bytes: LONGTEXT
```

だそうです。
こうしたらエラーはでなくなりました。
あとはmigrate実行してOKです。

```
bundle exec rake db:migrate
```

再起動はしといてください。

# 参考
Rails4でsession storeをActiveRecordに変更 | EasyRamble
http://easyramble.com/rails-active-record-session-store.html
Rails 3 Migration with longtext - Stack Overflow
http://stackoverflow.com/questions/4443477/rails-3-migration-with-longtext