OmniAICreator/Qiita-1.07M huggingface dataset:
【MT】MT3.2からMT6へのアップグレードする方法

#はじめに

MT3.2からMT6へのアップグレードの方法になります。
ただの愚痴ですが、MT3.2は触ったことないし、別の方が構築して現状を把握している方もいないし、前にデータベースを移行して失敗した残骸があるしでアップグレードするのに苦労しました。
下記の方法を試す場合は、**必ずバックアップをして自己責任** でお願いします。
パーミッションの設定はお使いのレンタルサーバ会社のウェブサイトを確認してください。

#環境

移行前と移行後の環境は下記になります。

||MTバージョン|データベース|サーバ|
|:--|:--|:--|:--|
|移行前|MovableType 3.2|BerkeleyDB|さくらインターネット|
|移行後|MovableType 6.0.5|MySQL5.5|さくらインターネット|

#現状の確認

現状を確認するためにMT3.2の mt-config.cgi のファイルを開きます。
行の前に # があるのはコメントになり、無効になります。
何のデータベースを使用しているのか、何の文字コードを使用しているのか確認してください。
私の場合は、BerkeleyDBが利用されており、PublishCharset には utf-8 が記述されておりました。

#アップグレードの方法

アップグレードする流れは、最初にデータベースをBerkeleyDBからMySQLへ移行します。
その後にMT6をアップロードして移行したデータベースを利用してアップグレードします。
MT3.2のデータはそのまま残ります。

#STEP1 BerkeleyDBからMySQLへの移行

MT6ではBerkeleyDBは対応していないので、MySQLへデータベースを移行します。
最初に新しいMySQLのデータベースを作成します。
私の場合は、PublishCharset には utf-8 が記述されているので、データベースの文字コードはUTF-8を指定してデータベースを作成します。
次にMT3.2の mt-config.cgi を開きます。
```SQLSetNames 1```がコメントアウトされていたので、# を削除して有効にします。
MT3.2の mt-config.cgi に記述されている PublishCharset の文字コードとMySQLの文字コードの指定が同じであること、```SQLSetNames 1```が有効になっていないと文字化けしますので必ず確認してください。
データベースの相互変換するスクリプトを利用して移行します。
「[MT Database Converter](https://github.com/ogawa/mt-DBConverter) 」からダウンロードしてください。
私の場合はMT3.2を利用しているので mt-db-convert32.cgi をダウンロードしました。
概要や使用方法などありますので、確認してください。
MT3.2の設置しているディレクトリに mt-db-convert32.cgi をアップロードしてパーミッションを700に変更します。
ブラウザから設置した mt-db-convert32.cgi のURLへアクセスします。
左側に今までのデータベースの設定が表示されます。
右側に移行後のデーターベースの設定を入力してConvertしてください。
データ量によると思いますが、完了するのに多少時間がかかります。
chromeを使っている方は実行中に「ページ応答なし」とエラー表示される場合がありますが、終了せずにそのまま放っておくと完了します。
画面が切り替われば、データベースの移行が完了です。
移行が完了したら mt-db-convert32.cgi をサーバ上から削除します。

#STEP2 MT6のアップロード

新しくディレクトリを作成して、MT6のデータをアップロードしてください。
FTPソフトを利用するとアップロード漏れがある場合があります。
必ず全てのデータをアップロードしてください。
2～3回アップロードすれば漏れはなくなるかと思います。
アップロードが完了したら、mt.cgiがあるディレクトリ（新しく作成したディレクトリ）の全てのcgiファイルのパーミッションを700に変更してください。

#STEP3 MT6のへのアップグレード

ブラウザからアップロードしたMT6のURLへアクセスします。
MT6のインストール画面が表示されますので、ウィザード通りに入力してください。
データベースに関しては、先ほどBerkeleyDBから移行したMySQLのデータベースの設定を入力してください。
ログインするとアップグレードされ、完了です。
database.yml 等の Git管理


`Rails`プロジェクトを作成し、`Git`等のバージョン管理システムを使用してプロジェクトをそのまま `git add`、`git commit`してしまい公開してしまうことがある。しかし、セキュリティ上思わしくない設定ファイル等がある。

`database.yml`や`secrets.yml`等だ。

そこで一度バージョン管理に入れてしまった場合に、バージョン管理から外す方法。

```
$ git rm --cached database.yml
```

`--cached`オプションを使用しないと、ファイル自体削除されてしまうので注意。

そして再びバージョン管理されないように`.gitignore`に下記を必ず追記する。

```
/config/database.yml
```

プロジェクトをチームで共有する場合には、`database.yml`をコピーして`database.yml.sample`等を作成し、これをバージョン管理しておく方法がよい。当然、その中身に重要情報を記述してしまっては意味が無いので注意。


ちなみに、万が一`--cached`オプションを使用しないで、ファイル自体を削除して焦ってしまった時のリカバリ方法。

```
$ git reset HEAD database.yml
$ git checkout database.yml
```

これは参考までに覚え書き。
CakePHPでブラウザキャッシュを使用する方法

# 概要
データベースからJSONデータを作成して、ブラウザキャッシュ(browser's cache)したい場合など

キャッシュの有効は、`Status Code:304 Not Modified`で確認する。

**Chromeでの調べ方**
`F12` > `Ctrl-2` > Status欄を確認する

# サンプル
```php
class MainController extends AppController {
  public function index(){
    $this->response->etag('bbb');
    if ($this->response->checkNotModified($this->request)) {
       return $this->response;
    }
  }
}
```

# 参考
[公式](http://book.cakephp.org/2.0/ja/controllers/request-response.html#etag)
PHP拡張開発のブックマーク

# WEB資料
- [Extension Writing Part I: Introduction to PHP and Zend](http://devzone.zend.com/303/extension-writing-part-i-introduction-to-php-and-zend/)
- [Extension Writing Part II: Parameters, Arrays, and ZVALs](http://devzone.zend.com/317/extension-writing-part-ii-parameters-arrays-and-zvals/)
- [Extension Writing Part II: Parameters, Arrays, and ZVALs [continued]](http://devzone.zend.com/318/extension-writing-part-ii-parameters-arrays-and-zvals-continued/)
- [Extension Writing Part III: Resources](http://devzone.zend.com/446/extension-writing-part-iii-resources/)
- [Wrapping C++ Classes in a PHP Extension](http://devzone.zend.com/1435/wrapping-c-classes-in-a-php-extension/)

# 本
[Extending and Embedding PHP](http://www.amazon.com/dp/067232704X/?tag=stackoverfl08-20)
Cake3.0のMigrationsプラグインの導入

# Cake3.0のMigrationsプラグインの導入

## 前提条件

[CakePHP 3.0をインストールする](http://qiita.com/kozo/items/263de91d659cef7d5ab5)

## 概要

* CakeDCからcakephpにGitHubアカウントが移動
  * [cakephp/migrations](https://github.com/cakephp/migrations)
* MigrationsプラグインはPhinxのラッパーに変更
  * [Phinx](https://phinx.org/)
* まだ現在、`pre-alpha`である(※仕様等変わる可能性がありますのでご注意ください。)

## 導入方法

### １．インストール

composerからインストールします。

```
"require": {
    "cakephp/migrations": "dev-master"
}
```

### ２．設定

`bootstrap.php`に以下を設定する

```
Plugin::load('Migrations');
```

### ３．基本的な使い方

基本的な使い方は以下になります。

```
php bin/cake.php migrations
```

### ４．マイグレーションの作成

マイグレーション名を指定してマイグレーションファイルを作成します。

```
php bin/cake.php migrations create マイグレーション名
```

出力されるファイル

```
<?php

use Phinx\Migration\AbstractMigration;

class Hoge extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     *
    public function change()
    {
    }
    */
    
    /**
     * Migrate Up.
     */
    public function up()
    {
        // ここにupの処理を追記します。
    }

    /**
     * Migrate Down.
     */
    public function down()
    {
        // ここにdownの処理を追記します。
    }
}
```

### ５．テーブル作成・削除

○以下の内容をupに追記してテーブルを作成します。
　※primary keyは自動で作成されます。

```
$table = $this->table('users');
        $table->addColumn('name', 'text')
            ->addColumn('loginid', 'text')
            ->addColumn('password', 'text')
            ->addColumn('etc', 'text', ['null'=>true])
            ->addColumn('created', 'datetime', ['null'=>true])
            ->addColumn('modified', 'datetime', ['null'=>true])
            ->create();
```

○以下の内容をdownに追記してテーブルを削除します。
```
$this->dropTable('users');
```

### ５．その他

```
// マイグレーションUP(最新に更新)
php bin/cake.php migrations migrate

// マイグレーションUP(バージョン指定)
php bin/cake.php migrations migrate -t 20150515015053

// マイグレーションDOWN
php bin/cake.php migrations rollback

// マイグレーションDOWN(バージョン指定)
php bin/cake.php migrations rollback -t 20150515015053

// マイグレーションの状態確認
php bin/cake.php migrations status
```

詳細はPhinxのマニュアル参照  
[Phinxマニュアル](http://docs.phinx.org/en/latest/migrations.html)
Bracketsチートもどき(H26.11月)


以下はAdobeの無料エディタ「Brackets」に関するメモです。

>今すぐ乗り換えたくなるデフォルト機能３つ！
#####ライブプレビュー
#####クイックエディット
#####Photoshopカンプのコード化

#純正ショートカット
##HTML/CSS即反映
Alt+command+P
ライブプレビュー

##CSS遠隔編集
command+E
クイックエディット

##CSSプロパティ字引(英語)
command+K
クイックドキュメント

#選択関連ショートカット
##複数選択
command+B

##カーソル分割
Shift+Alt+↑OR↓

##任意箇所へカーソル分割
command+クリック

##矩形選択
Alt+ドラッグ

#プラグインショートカット
##ショートカット一覧表示
Ctrl+Alt+/
Display Shortcuts

##対応するタグまでの範囲を選択
Ctrl+Shift+T
HTML Block Selector
要)開始・終了タグどちらかにフォーカスが当たっている状態

##整形(逆ミニファイ)
Shift+command+L
Beautify
編集のBeautify on saveにチェックでセーブ時に自動整形

##行をブックマーク
command+F4
Brackets Bookmarks
F4で次のブックマークへ

##コメントをTODOリスト化
Alt+command+T
Brackets Todo
記述例　/*TODO xxx*/
HTMLへの記述例　<!--/*TODO xxx*/-->
リスト表のSetteingのOkay押下で反映は仕様？
Emmetでコメントは⌘+/

##ミニファイ
command+M
Minifier for Brackets

##カラーピッカー
command+Alt+K
Brackets Color Picker
(ファイル名).min.css等と別生成

#パッシブプラグイン
##記述補完
Emmet

##FTP
eqFTP

##ソース折り畳みトグル追加
Code Folding
要行番号非表示

##インデント表示
Indent Guides

##インデントのタブ/スペース相互一括変換
Tab To Space

##コピペ時自動インデント
Paste and Indent
貼り付け後のインデントの手間を軽減

##ブランク可視化
Show Whitespace
末尾ブランクに着色特化も2バイトには無反応。。

##行番号脇に色見本表示
Brackets Css Color Preview

##ファイル内の色からサジェスト
colorHints

##ファイルツリーに拡張子アイコン表示
Brackets File Icons

##サイドバー自動開閉
Sidebar Plus

##コード全体図表示
Brackets CodeOverview

##ポータブルもあったよ！
Brackets Portable
http://sourceforge.net/projects/bracketsportable/

飛ぶ鳥後を濁さずだそうです。
>This portable launcher (with brackets embedded) will not leave any file/registry leftovers in your PC and will store all information in the portable folder.

##おまけ
テーマの[ショウルーム](http://www.pinterest.com/TBTg2/brackets-theme/)
連番付きのファイルを、順序を維持したまま連番を振り直して、一括でリネーム

#状況
次のような名前のファイルが沢山ある。

```
old-0.png
old-1.png
...
old-187.png
```
これらを一括で次のようにリネームしたい。

```
new0001.png
new0002.png
...
new0188.png
```

#方法
##最終的にリネームを実行するコマンド
```bash
ls *.png | sort -t - -k 2 -n | xargs seqrename new
```

##ファイルのソート
このケースではlsの結果をそのままパイプで渡すと順番がおかしくなるので、あらかじめソートをかけてやる必要がある。
ハイフンの後に続く数字を数値とみなしてソートする。

```bash
ls *.png | sort -t - -k 2 -n
```

* -t - は'-'でフィールドを区切る
* -k 2 は2番目のフィールドをソートに用いる
* -n はフィールドを数値に変換してソートする

##連番リネームを行うシェルスクリプト
1番目の引数をプリフィックスとし、2番目以降の引数に渡されたファイルに連番を振ってリネームする。
拡張子は元のまま維持する。
-t オプションを付けると実際にリネームしないで結果をプレビューする。

```bash
#!/bin/bash
# seqrename

opt_test=false
while getopts t opt; do
  case $opt in 
    t) opt_test=true 
      ;;
  esac
done

shift $((OPTIND - 1))
prefix=$1
shift

i=1
for oldname in $*; do
  ext="${oldname##*.}"
  newname=$prefix`printf "%04d" $i`.$ext
  if $opt_test; then
    echo $oldname "->" $newname
  else
    mv $oldname $newname
  fi
  i=`expr $i + 1`
done
```
sails.js の local.js でDB接続設定する際にやりがちな間違い 「sails is not defined」とかのエラーヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい | sails.js (0.10.x) で始めるアプリ開発

**※この記事はsails.js 0.10.x の情報に基づいて記載していまス。それ以前またはそれ以降 0.9 や、0.11 では該当しない可能性がありますのでご注意ください** :wink:

# DB接続設定の記述の仕方がまずくて、 sails is not defined とsailsアプリを起動したときにエラーメッセージが出る

## まずい例

ネットで調べると、情報が混ざって何故かこういう風に書いてしまいがちになる :cry: 以下にも合っているように見えるがこれだと動かない (0.10.x) `sails lift` したときに "sails is not defined" と言われるのだ。

```config/local.js
module.exports = {
  mysql: {
    host: 'localhost',
    user: 'YOUR_URSER_NAME',
    password: 'YOUR_PASSWORD'
  }
}
```

```config/connections.js
module.exports.connections = {
  mysqlServer: {
    host: sails.config.mysql.host,
    user: sails.config.mysql.user,
    password: sails.config.mysql.password,
    adapter: 'sails-mysql',
    database: 'YOUR_DATABASE_NAME'
  }
}
```

## あるべきすがた

```config/local.js
module.exports = {
  connections: {
    mysql: {
      host: 'localhost',
      user: 'YOUR_URSER_NAME',
      password: 'YOUR_PASSWORD'
    }
  }
}
```

```config/connections.js
module.exports.connections = {
  mysqlServer: {
    adapter: 'sails-mysql',
    database: 'YOUR_DATABASE_NAME'
  }
}
```

# sails is not defined になる理由

## 期待していたこと

config/local.js 内に記述した値を他の config 内の設定ファイルで使う！

## 現実

sails の起動処理が終わったときに、変数 sails が初期化されるので、起動処理中の config 内の.js ではsailsを介してそれを読み込むことはできない。
ruby で変数をダイナミックに定義する例


[Ruby] インスタンス変数、ローカル変数をメタに操作する

なにかのときに役立つかもしれない。
インスタンス変数、ローカル変数に 代入文を使わずに値を設定したり、列挙をする例です。

```ruby:variable.rb
# coding: utf-8

range = (1..3)

puts '# =================================================='
puts '# 代入文をつかわずにインスタンス変数を設定する。'
puts '# =================================================='
puts "#---- before set ---"
instance_variables.each do |v|
  val = instance_variable_get "#{v}"
  puts "#{v} = #{val}"
end
puts

range.each do |idx|
  instance_variable_set "@v_#{idx}", idx * 10
end
puts "#---- after set ---"
instance_variables.each do |v|
  val = instance_variable_get "#{v}"
  puts "#{v} = #{val}"
end
puts

instance_variables.each do |v|
  remove_instance_variable(v)
end
puts "#---- after remove ---"
instance_variables.each do |v|
  val = instance_variable_get "#{v}"
  puts "#{v} = #{val}"
end
puts

puts "#----- before set local_val ---"
local_variables.each do |v|
  val = eval v.to_s
end
puts

local_1 = 0
local_2 = 0
local_3 = 0
puts '# =================================================='
puts '# 代入文を使わずにローカル変数に値を設定する。'
puts '# =================================================='
bd = binding
range.each do |idx|
  bd.local_variable_set "local_#{idx}".to_sym, idx * 100
end

puts "#----- show local variable  その１---"
puts "local_1 = #{local_1}"
puts "local_2 = #{local_2}"
puts "local_3 = #{local_3}"

puts "#----- show local variable その２---"
range.each do |idx|
  name = "local_#{idx}".to_sym
  val = bd.local_variable_get name
  puts "#{name} = #{val}"
end

puts "#----- show local variable その３ ---"
local_variables.each do |v|
  name = "#{v}".to_sym
  val = bd.local_variable_get name
  puts "#{name} = #{val}"
end
```

実行すると次のようになる。

```bash:stdout
$ ruby variable.rb
# ==================================================
# 代入文をつかわずにインスタンス変数を設定する。
# ==================================================
#---- before set ---

#---- after set ---
@v_1 = 10
@v_2 = 20
@v_3 = 30

#---- after remove ---

#----- before set local_val ---

# ==================================================
# 代入文を使わずにローカル変数に値を設定する。
# ==================================================
#----- show local variable  その１---
local_1 = 100
local_2 = 200
local_3 = 300
#----- show local variable その２---
local_1 = 100
local_2 = 200
local_3 = 300
#----- show local variable その３ ---
range = 1..3
local_1 = 100
local_2 = 200
local_3 = 300
bd = #<Binding:0x007fbe4b9e0870>
```

See
* [Rubyリファレンス instance_variable_set](http://ref.xaio.jp/ruby/classes/object/instance_variable_set)
* [Ruby 2.1.0 リファレンスマニュアル local_variable_set](http://docs.ruby-lang.org/ja/2.1.0/method/Binding/i/local_variable_set.html)
ImageMagickで複数ページのPDFをPNGに変換する

### 準備

GhostScriptとImageMagickをインストールしておく。

```sh
brew install gs imagemagick
```

### 変換

```sh
convert -density 600 images.pdf image.png
```


1ページずつ変換することもできる。

```sh
for i in {0..100}; do j=`expr $i + 1`; convert -density 600 images.pdf[$i] image`printf %04d $j`.png; done
```

images.pdf → image0001.png, image0002.png, ...
コンテナでホストに近い速度を出す

# 結論

* ネットワーク : `--net=host`を使う
* DISK : `-v`を使いその中で読み書きする

以下メモ

# ネットワーク

ポートを100個くらい開けないといけないコンテナはどうすればいいのかと
思っていたところ、`--net=host`オプションがあることに気がついた。

```bash:起動
sudo docker run --privileged -it -d \
 --net=host tukiyo3/centos7-lampp
```

```bash:
curl localhost
```

あとはポートが衝突しないように意識しながら使う。
1ホスト2コンテナぐらいなら管理できるでしょう。

## 参考

* [DockerのHost networking機能 | SOTA](http://deeeet.com/writing/2014/05/11/docker-host-networking/)

速度向上も期待できる。
mysqlのようなパフォーマンスを気にしないといけないものを動かす場合用。

> ネットワークパフォーマンスは--net=hostを使うことで改善できる。

* [仮想マシンとLinuxコンテナのパフォーマンス比較](http://www.infoq.com/jp/news/2014/08/vm-containers-performance)

# DISK

## docker内のDISKランダムシークはホストの5倍は遅い

> 差分管理する箇所へのI/Oの性能劣化は見られます

差分管理の場所はそりゃ遅いだろう・・・。

* [LXCベースのDockerゲストマシンとホストマシンのディスクI/O性能を比較検証（Bonnie++編） - Y-Ken Studio](http://y-ken.hatenablog.com/entry/docker-diskio-benchmark-with-bonnie)

その場合、`-v`でホストのDISKをマウント(Guest Shared)すればさほど変わらないパフォーマンスを得られる。

> AUFSでファイルシステムををスタックできる限界値に到達したかららしい。限界値は 42 らしい。

* [dockerで"Unable to mount using aufs"エラーの対処法 - Qiita](http://qiita.com/kimh/items/e0769f0d15336b768909)


# cpu

dockerはデフォルトでホストのCPU割当てを全て割り当てる。
そのためKVMやOpenVzのようなCPU割り当てをチューニングする必要がなく簡単である。
逆に割当てを制限することは出来る。気が向いたら書く。


# UnixBench

* [UnixBench計測した - Qiita](http://qiita.com/tukiyo3/items/f498c90f1bfd5d06f394)
シンボリックリンクで実フォルダは上書き出来なかった件

## lnの基本的な使い方

```
ln -s [元のディレクトリ] [シンボリック名]
```

そんなに使う機会ないからよくわすれる。

http://blog.torigoya.net/2012/03/09/symbol-link/

この辺をみたら実ディレクトリでもOKなのか？と勘違いしていた。


## 実験内容

ディレクトリとかファイルの準備

```sh
$ mkdir -p test1/log_data test2/log_data
$ touch test2/log_data/hoge.txt
```


```
$ tree
.
├── test1
│   └── log_data
└── test2
    └── log_data
        └── hoge.txt

```

test1/log_dataに、test2/log_dataを読むシンボリックリンクを貼りたい。

いかのコマンドを実行

```sh
ln -snf ./test2/log_data ./test1/log_data
```

```
$ tree
.
├── test1
│   └── log_data
│       └── log_data -> ./test2/log_data
└── test2
    └── log_data
        └── hoge.txt

```
こうなった。。

## いいわけ

http://linuxjm.sourceforge.jp/html/GNU_fileutils/man1/ln.1.html

この辺を見ると普通に`-f`は`指定したリンクファイルが既に存在する場合は削除する`と書いてあった。。。
つまり、シンボリックリンク限定ということ。。
「malloc: * error for object 0x7f974be006f0: pointer being freed was not allocated」でTerminalが立ち上がりません><（リンクのみ）

http://stackoverflow.com/questions/22329005/mac-terminal-pointer-being-freed-was-not-allocated-error-when-opening-termin

ざっくりした内容。

`/usr/bin`のパーミッション変えた？

1. `~/Library/Preference/com.apple.Terminal.plist`を削除
2. ディスクユーティリティを立ち上げてアクセス権の修復をする
TDD入門自分用メモ-20141118


https://github.com/ntk1000/TDDSyakyo

# Part 1-1

## TODOListの作成

* どのようなテストが必要となるか考える(まずテストから始める)
* 複雑なものは小さく分解する
* 途中で必要なものに気づいたらいきなりとりかかるのではなくTODOListに記入する

``` TODOList.md
レートが2:1の場合、$5+10CHF=$10
$5*2=10
amountのプライベート化
Dollarの副作用
Moneyの丸め処理
```

## テストの作成

``` DollarTest.java

public void testMultiplication() {

  Dollar five = new Dollar(5);

  five.times(2);

  assertEquals(10, five.amount);
}

```

* 作成したテストをコンパイルできるようにする

``` Dollar.java

public class Dollar {
  
  int amount;

  Dollar(int amount){}
  
  void times(int multiplier){}

}

```

### レッド
* コンパイルできるがテストは失敗する状態

## TDDのサイクル

1. テストを少しだけ作成する

1. すべてのテストを実行し、失敗を確認する <- イマココ

1. 小さな修正を行う

1. テストを実行し、成功させる

1. 重複を取り除くためにリファクタリングを行う

## 修正とリファクタリング

### グリーン

* テストが成功するように修正

``` Dollar.java

public class Dollar {
  
  int amount = 5 * 2;

  Dollar(int amount){}
  
  void times(int multiplier){}

}

```

### リファクタリング

* リファクタリングで実装していく

``` Dollar.java

public class Dollar {
  
  int amount;

  Dollar(int amount){
    this.amount = amount;
  }
  
  void times(int multiplier){
    amount *= multiplier;
　}

}

```

## この章で行ったこと

1. 必要なテストのリストを作成

1. スタブを作成し、テストをコンパイルした

1. まずテストをパスするようなコードを書いた

1. リファクタリングした

# Part 1-2

## TDDのサイクル、詳細

1. テストの作成: 操作、ストーリーから必要なインターフェースを考える

1. すべてのテストを実行し、失敗を確認する

1. 小さな修正を行う

1. テストをパスさせる: バーをグリーンにすることが主となる

1. リファクタリングを行う: 動作するきれいなコードを目指す

## Dollarの副作用への対応

* こういうテストをパスさせたい

``` DollarTest.java

public void testMultiplication() {
  Dollar five = new Dollar(5);
  five.times(2);
  assertEquals(10, five.amount);
  five.times(3);
  assertEquals(15, five.amount); // 30が返ってきてしまう 
}

```


* テスト自体の変更

``` DollarTest.java

public void testMultiplication() {
  Dollar five = new Dollar(5);
  Dollar product = five.times(2); // times修正必要
  assertEquals(10, product.amount);
  product = five.times(3);
  assertEquals(15, product.amount);
}

```

* Dollarのコンパイルを通す(仮実装)

``` Dollar.java

Dollar times(int multiplier){
  amount *= multiplier;
  return null;
}

```

* Dollarの修正(明白な実装)

``` Dollar.java

  Dollar times(int multiplier){
    return new Dollar (amount * multiplier);
  }

```

## 仮実装と明白な実装

* 仮実装:定数を返しておき、定数を変数で徐々に置き換えてゆく
* 明白な実装:実際の実装

## この章で行ったこと

1. 設計上の難点(副作用)をテストケースに変換した

1. 仮実装でコンパイルを通す

1. リファクタリングしてテストを通す

### source

``` DollarTest.java

public class DollarTest {

    @Test
    public void testMultiplication(){
        Dollar five = new Dollar(5);
        Dollar product = five.times(2);
        assertEquals(10,product.amount);
        product = five.times(3);
        assertEquals(15,product.amount);
    }
}

```

``` Dollar.java

class Dollar {

    int amount;

    Dollar(int amount){
        this.amount = amount;
    }

    Dollar times(int multiplier){
        return new Dollar(amount * multiplier);
    }
}

```
werckerでruby 2.1.2を使い続ける

AWS ElastcBeanstalkがruby2.1.2のためバージョンが上げれないのにwerckerのbox-rvmから非情にも2.1.2が消されbuildが通らなくなりdeployも出来なくなった。

https://github.com/wercker/box-rvm#whats-new

wercker.ymlでbox-rvmのバージョンが指定できることを知り以下の対処で2.1.2を使い続けることが可能になる。

```yaml
box: wercker/rvm@2.2.0
```
docker で postfix 使っていたら /proc/$pid/exec: Permission denied

しかも、コンテナ上の root なのにも関わらず。
ということで調べてみました。

## 結論
結論から言えば、bug っぽいです。

 * Regression error with docker 1.0.1
   * https://github.com/docker/docker/issues/6800

よく見てみると、``` mongod shutdown ``` もダメっぽい?

## 理由
話を戻して、なんで Postfix かというと、
Ubuntu の service postfix status　(/etc/init.d/postfix) のプロセスの死活確認方法が
これまた技巧的?で、死活を見ているのは running() という関数が担当しています。

```bash
running() {
    INSTANCE="$1"
    if [ "X$INSTANCE" = X ]; then
	    POSTCONF="postconf"
    else
	    POSTCONF="postmulti -i $INSTANCE -x postconf"
    fi
    queue=$($POSTCONF -h queue_directory 2>/dev/null || echo /var/spool/postfix)
    if [ -f ${queue}/pid/master.pid ]; then
	    pid=$(sed 's/ //g' ${queue}/pid/master.pid)
	    # what directory does the executable live in.  stupid prelink systems.
	    dir=$(ls -l /proc/$pid/exe 2>/dev/null | sed 's/.* -> //; s/\/[^\/]*$//')
	    if [ "X$dir" = "X/usr/lib/postfix" ]; then
	        echo y
	    fi
    fi
}
```

と、/etc/init.d/postfix を読んでみればわかると思いますが、
最終的に標準出力になんらかの出力があれば「プロセスが生きている」という形で処理されます。
(running() はただ単に postfix が生きていると確証が得られれば、標準出力に "y" と出力するだけ、死んでいたら何も無し)

で、見事に /proc/$pid/exe 読んでくれてる( д) ﾟ ﾟ 
というわけです。
なので、実質 postfix サービスが生きているはずであっても、「死んでいる」と認識されてしまうわけですね。

postfix のスクリプトもここまでして死活確認をしなくてもよいと思いますが、
docker 側で対応してくれるなら、それはそれで
コンテナ上でもホスト上でも違和感なく使えるようになるので、ありがたいことです。
(まだ status は open ですが)

ちなみに CentOS では、また違った init スクリプトになっているので、
この問題にはハマらないようです。

## なんで見つけたか
見つけた順番を正しく書くと、

1. docker コンテナ上で service postfix start して、
2. status するとうまく捕捉できていない(´・ω・)
3. /etc/init.d/postfix を echo デバッグ
4. /proc/$pid/exec を ls している行が問題なようだ。( -ω-)
5. 手でコマンドを実行してみる。(結果は書いてある通り、Permission denied)
6. 「root でやってるのに Permission denied って変だろ(#^ω^)」と思い、調べてみる
7. bug っぽいな、これ( д) ﾟ ﾟ 

という経緯だったわけです。

## 最後に
service コマンドなんぞ使うなや、というツッコミも歓迎でございます。
良い daemon プログラムの管理方法を知りたいです

ではでは(｡-ω-)ﾉ
サウンドを再生する簡単なアプリ



iOSで音を鳴らすシンプルなアプリ．
StoryBoardを貼らないとあまり意味ないかもしれないけどメモ．

画像ファイルやサウンドファイルは
Supporting Filesに入っている前提．

```ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
IBOutlet UIImageView *myImageView;

}

@property AVAudioPlayer *sound;
-(IBAction)tapBtn;

@end

```



```ViewController.m
#include <AVFoundation/AVFoundation.h>
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(IBAction)tapBtn {
    myImageView.image = [UIImage imageNamed:@"IMG_0976.jpg"];
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"moon_river" ofType:@"m4r"];
    NSURL *url = [NSURL fileURLWithPath:path];
    
    self.sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
    [self.sound play];
}

@end
```
SwiftでWKWebViewとKey-Value Observingを使ってWebページの読込み状況を取得する



iOS8から、WKWebViewというWebKitをベースとしたWebビューを使うことができるようになりました。ここではSwiftでWKWebViewと新たに増えた監視可能(KVO compliant)なプロパティを使ってみます。

## WKWebViewの用意

WKWebViewは現時点ではコードを使って実装します。UIWebViewとは異なりXcodeのInterface Builderから配置することは今の所できません。


```swift
var webView:WKWebView?

override func loadView() {
	self.webView = WKWebView()
	self.view = self.webView!
}

override func viewDidLoad() {
	super.viewDidLoad()

	let requestURL = NSURL(string: "http://www.apple.com")
	let req = NSURLRequest(URL: requestURL!)
	self.webView!.loadRequest(req)
}
   
```

## Webページの読込み状況を取得

WKWebKitではUIWebViewでは未提供のプロパティが新たに追加されましたが、その一つとしてWebページの読込み状況を表す`estimatedProgress`があります。

更に`estimatedProgress`はKey Value Observing(KVO)に対応しています。予めこうしたプロパティを監視しておくことで値が変化した時に自動的に処理を実行することができます。

ここではWebページの読込み状況を監視して、自動的にコンソールに出力してみます。

1. 監視対象の登録

	```swift
	override func viewDidLoad() {
		// 省略
		self.webView?.addObserver(self, forKeyPath:"estimatedProgress", options:.New, context:nil)
	}
	```

2. 監視解除

	SwiftではKVOの監視解除を`deinit`の中で記述します。

	```swift
	deinit {
		self.webView?.removeObserver(self, forKeyPath: "estimatedProgress")
	}
	```

3. 値が変化した時の処理

	```swift
	override func observeValueForKeyPath(keyPath:String, ofObject object:AnyObject, change:[NSObject:AnyObject], context:UnsafeMutablePointer<Void>) {
		switch keyPath {
			case "estimatedProgress":
				if let progress = change[NSKeyValueChangeNewKey] as? Float {
					println("Progress:\(progress)")
				}
			default:
				break
		}
	}
```

Web viewを開くとページの読み込み状況に応じて、コンソールに自動的に進捗状況が出力されます。

## 監視可能(KVO Compliant)なプロパティ一覧

WkWebViewのクラスリファレンスによると、以下のようなプロパティがKVO Compliantとのことです。

- title
- URL
- estimatedProgress
- loading

これによりWebサイトloadingのインジケーター(`networkActivityIndicatorVisible`)を以前と異なる方法で実装できるようになるなど、WebView関連の処理が楽になりました。

以下では例としてtitleの監視を行います。

### Webサイトのタイトルをページ遷移するたびにナビゲーションバーに自動的に表示させる

表示しているWebサイトのタイトルを検知してナビゲーションバーに表示させる例です。記述場所はそれぞれ上と同じです。

監視

```swift
self.webView?.addObserver(self, forKeyPath:"title", options:.New, context:nil)
```

監視解除

```swift
self.webView?.removeObserver(self, forKeyPath: "title")
```

値変化時の処理

```swift
case "title":
	if let title = change[NSKeyValueChangeNewKey] as? NSString {
		self.navigationItem.title = title
	}
```



## 参考
- [WKWebView Class Reference - WKWebView Class Reference](https://developer.apple.com/library/IOs/documentation/WebKit/Reference/WKWebView_Ref/index.html)
- [WKWeb​View - NSHipster](http://nshipster.com/wkwebkit/)
粒子群最適化法(PSO)で関数の最小値を求める

#概要
粒子群最適化法(PSO, Particle Swarm Optimization)とは, 動物の群れの行動をヒントとした群知能の一種です.
この記事では, 粒子群最適化法の簡単な例を紹介します.

#放物面の式
放物面の式は以下のような形で与えられます.

```math
\begin{aligned}
z = x^2+y^2
\end{aligned}
```

当たり前ですが, 最小値は$(x, y)=(0, 0)$のときに$z=0$となります.
これを粒子群最適化法を用いて求めます.

#粒子群最適化法の解説
以下の記事を参照してください.(§2の添字が一部間違っている?)
[粒子群最適化と非線形システム](https://www.jstage.jst.go.jp/article/essfr/5/2/5_2_155/_pdf)

この記事の§2を実装してみます.
#ソースコード
```py:main.py
# -*- coding: utf-8 -*-

import numpy as np
import random

#評価関数: z = x^2 + y^2
def criterion(x, y):
    z = x * x + y * y
    return z

#粒子の位置の更新を行う関数
def update_position(x, y, vx, vy):
    new_x = x + vx
    new_y = y + vy
    return new_x, new_y

#粒子の速度の更新を行う関数
def update_velocity(x, y, vx, vy, p, g, w=0.5, ro_max=0.14):
    #パラメーターroはランダムに与える
    ro1 = random.uniform(0, ro_max)
    ro2 = random.uniform(0, ro_max)
    #粒子速度の更新を行う
    new_vx = w * vx + ro1 * (p["x"] - x) + ro2 * (g["x"] - x)
    new_vy = w * vy + ro1 * (p["y"] - y) + ro2 * (g["y"] - y)
    return new_vx, new_vy


def main():
    N = 100  #粒子の数
    x_min, x_max = -5, 5
    y_min, y_max = -5, 5
    #粒子位置, 速度, パーソナルベスト, グローバルベストの初期化を行う
    ps = [{"x": random.uniform(x_min, x_max), 
        "y": random.uniform(y_min, y_max)} for i in range(N)]
    vs = [{"x": 0.0, "y": 0.0} for i in range(N)]
    personal_best_positions = list(ps)
    personal_best_scores = [criterion(p["x"], p["y"]) for p in ps]
    best_particle = np.argmin(personal_best_scores)
    global_best_position = personal_best_positions[best_particle]
    
    T = 30  #制限時間(ループの回数)
    for t in range(T):
        for n in range(N):
            x, y = ps[n]["x"], ps[n]["y"]
            vx, vy = vs[n]["x"], vs[n]["y"]
            p = personal_best_positions[n]
            #粒子の位置の更新を行う
            new_x, new_y = update_position(x, y, vx, vy)
            ps[n] = {"x": new_x, "y": new_y}
            #粒子の速度の更新を行う
            new_vx, new_vy = update_velocity(
                new_x, new_y, vx, vy, p, global_best_position)
            vs[n] = {"x": new_vx, "y": new_vy}
            #評価値を求め, パーソナルベストの更新を行う
            score = criterion(new_x, new_y)
            if score < personal_best_scores[n]:
                personal_best_scores[n] = score
                personal_best_positions[n] = {"x": new_x, "y": new_y}
        #グローバルベストの更新を行う
        best_particle = np.argmin(personal_best_scores)
        global_best_position = personal_best_positions[best_particle]
    #最適解
    print(global_best_position)
    print(min(personal_best_scores))

if __name__ == '__main__':
    main()
```

#結果
```bash:結果
{'y': 0.00390598718159734, 'x': -0.0018420875049243782}
1.86500222386e-05
```

##可視化
$N(=100)$個の粒子が$(x, y)=(0, 0)$に集中していく様子です.
![B2psHNqCMAAIXcf.png](https://qiita-image-store.s3.amazonaws.com/0/58543/a221b3b3-0461-68db-4bff-06353b56482b.png)

#その他
粒子の数などのいくつかのパラメータはどうやって決めるんですかね.(Trial and Error?)
***
文献によって位置の更新, 速度の更新, パーソナルベスト, グローバルベストの順序がバラバラ…
この記事では位置の更新⇒速度の更新⇒パーソナルベストの更新⇒グローバルベストの更新で行っています.

#編集履歴
* (2014/11/18)ソースコードの修正
vimの範囲を使いこなす

vimのコマンドには適用する範囲を指定出来るものがあります。
たとえば`:%s/hoge/fuga/g`の`%`の部分が範囲指定になります。

# 基本

|文字|意味|
|----|----|
|`%`|バッファ全体|
|`n`|n行目|
|`n,m`|n行目からm行目まで|
|`.,m`|現在カーソルがある行からm行目まで|
|`.,$`|現在カーソルがある行から最終行まで|
|`.+3,$-5`|現在カーソルがある行+3行目から最終行-5行目まで|
|`'a,'b`|マーク`'a`がある行からマーク`'b`がある行まで|
|`'<,'>`|ビジュアル選択されている行|

ビジュアル選択の開始位置はマーク`'<`、終了位置は`'>`で参照出来るので
結果として`'<,'>`でビジュアル選択している行を示すことになります。
（ただし、ビジュアル選択されている「範囲」ではなく「行」であることに注意）

# パターンマッチ
`/`や`?`で検索したときのように、範囲にもパターンを使用することが出来ます。

|文字|意味|
|----|----|
|`/hoge/,/fuga/`|「現在のカーソル位置」から最初に`/hoge`がマッチした行から、「現在のカーソル位置」から最初に`/fuga`がマッチした行まで|
|`/hoge/,?fuga?`|「現在のカーソル位置」から最初に`/hoge`がマッチした行から、「現在のカーソル位置」から最初に`?fuga`がマッチした行まで|
|`/hoge/;/fuga/`|「現在のカーソル位置」から最初に`/hoge`がマッチした行から、「`/hoge`がマッチした行」から最初に`/fuga`がマッチした行まで|
|`/hoge/;+3`|「現在のカーソル位置」から最初に`/hoge`がマッチした行から3行|
|`/hoge/+1,$`|オフセットや他との組み合わせも使える|


`/`と`?`の違いは通常と同じで順方向に検索するか逆方向に検索するかです。
区切りの`,`と`;`の違いは、終了位置をパターン指定する際（表でいう`/fuga`等）の検索基準位置の違いです。
`,`は現在のカーソル位置から検索するのに対し、`;`は前にマッチした行から検索を始めます。


# 細かい話
以下のヘルプに詳しく載ってます。
`:help 10.3`
`:help cmdline-range`
Linux mint USBでOSのインストールを行う方法


```
# Macから見えるようにしつつアンマウント
diskutil unmount /Volumes/usb 
# Volume usb on disk1s1 unmounted

# 書き込み処理
sudo dd if=~/Desktop/linuxmint-201403-mate-dvd-32bit.iso of=/dev/rdisk1 bs=1048576
```
あとはBIOSではじめにUSBみるようにすればOK
diskutil便利だね！
SendGrid+Node.js(nodemailer)+UTF-8でメールを送信する

クラウドメールサービス[SendGrid](https://sendgrid.kke.co.jp)を使ってNode.js([nodemailer](https://github.com/andris9/Nodemailer))からメールを送ってみます。
SendGridを使ってメールを送る方法はいくつかあります。詳しくは[公式ブログ](https://sendgrid.kke.co.jp/blog/?p=1300)を参照してください。

- SMTP
- Web API
- マーケティングメール機能

今回はSMTPとX-SMTPAPIを組み合わせて宛先毎に内容の異なるメールを送ってみます。

# SMTP
SMTPはWeb APIに比べて細かいメール送信パラメータを指定できるのがメリットですが、それが面倒な場合、デメリットにもなります。今回はUTF-8でメールを送ります。

# X-SMTPAPI
名前がSMTPっぽくて紛らわしいですが、[X-SMTPAPI](https://sendgrid.kke.co.jp/blog/?p=1300)はSendGrid独自の拡張ヘッダです。これを利用するとメール送信時にSendGridの様々な機能を使うことができます。今回は、To、Substitution、Sectionを利用してメールの件名や本文内の特定のキー文字列を宛先毎に異なる値に置換してメールを送ってみます。

# とりあえず送ってみる
以下の手順で[サンプルコード](https://github.com/SendGridJP/sendgrid-smtp-nodemailer-example)をクローン、.envファイル編集、実行してください。
Node.jsは0.10.28で動作確認していますが、nodemailerが動く程度の適度に古い環境であればたぶん動くと思います。

```text
git clone https://github.com/SendGridJP/sendgrid-smtp-nodemailer-example.git
cd sendgrid-smtp-nodemailer-example
cp .env.example .env
# .envファイルを編集してください
npm install
node sendgrid-smtp-utf8.js
```

### .envファイルの編集
```text
SENDGRID_USERNAME=SendGridユーザ名
SENDGRID_PASSWORD=SendGridパスワード
TOS=you@youremail.com,friend1@friendemail.com,friend2@friendemail.com
FROM=you@youremail.com
```
SENDGRID_USERNAME:SendGridのユーザ名を指定してください。
SENDGRID_PASSWORD:SendGridのパスワードを指定してください。
TOS:宛先をカンマ区切りで指定してください。
FROM:送信元アドレスを指定してください。

指定したアドレスにメールは届きましたか？

# コード

```js
var dotenv = require('dotenv');
dotenv.load();

var sendgrid_username   = process.env.SENDGRID_USERNAME;
var sendgrid_password   = process.env.SENDGRID_PASSWORD;
var from                = process.env.FROM;
var tos                 = process.env.TOS.split(',');

var nodemailer = require('nodemailer');
var setting = {
  host: 'smtp.sendgrid.net',
  port: 587,
  requiresAuth: true,
  auth: {
    user: sendgrid_username,
    pass: sendgrid_password
  }
};
var mailer = nodemailer.createTransport(setting);

var smtpapi = require('smtpapi');
var header = new smtpapi();
header.setTos(tos);
header.addSubstitution('fullname', ['田中 太郎', '佐藤 次郎', '鈴木 三郎']);
header.addSubstitution('familyname', ['田中', '佐藤', '鈴木']);
header.addSubstitution('place', ['office', 'home', 'office']);
header.addSection('office', '中野');
header.addSection('home', '目黒');
header.addCategory('Category1');

var email = {
  from:     from,
  to:       tos,
  subject:  '[sendgrid-nodemailer-example] フクロウのお名前はfullnameさん',
  text:     'familynameさんは何をしていますか？\r\n 彼はplaceにいます。',
  html:     '<strong>familynameさんは何をしていますか？</strong><br />彼はplaceにいます。',
  headers:  {"x-smtpapi": header.jsonString()},
  attachments: [{
    path: './gif.gif'
  }]
};

mailer.sendMail(email, function(err, res) {
  mailer.close();
  if (err) {
    console.log(err);
  }
  console.log(res);
});
```
ALMiniumにRedmineプラグインを追加

##はじめに
ALMiniumのインストールが終わり、Redmineを色々といじっていたら
ガントチャートの日付がよくわからない数字になっていることに気づいた。

1月から順番に週番号を振っていて、それが表示されているのかな。

パッと見てわかりづらいので、普通の日付に変える方法を探したところ、プラグインがあった。
ので、入れようとしたところ案の定入れ方がわからないので調べて設定した。

##環境
Vagrantで作ったVirtualBox(CentOS6.5)にALMiniumをいれてあるので、そのまま実施。
詳細は[こちら。](http://qiita.com/inaBowBow/items/c5f94f4c56ed8be55cf4)

##プラグイン設定
今回入れるプラグインは[このページ](http://forza.cocolog-nifty.com/blog/2014/03/redmine-redmine.html)を参考に[redmine_gantt_with_date](https://github.com/vividtone/redmine_gantt_with_date)を選んだ。

設定方法は思っていたよりも簡単。
/opt/alminium/pluginsで入れたいプラグインを"git clone"するだけ。

```none
[vagrant@vagrant-centos65 ~]$ su
Password:
[root@vagrant-centos65 vagrant]# cd ../..
[root@vagrant-centos65 /]# cd opt/alminium/plugins
[root@vagrant-centos65 plugins]# git clone https://github.com/vividtone/redmine_gantt_with_date
```

そして、[ここ](http://qiita.com/tukiyo3/items/bbee8fb84d801dd6b7a2)を参考にAppacheを再起動して完了。

```none
[root@vagrant-centos65 plugins]# service httpd restart
```

##確認
**プラグイン導入前**
![before.png](https://qiita-image-store.s3.amazonaws.com/0/59636/e5c158b3-360d-977f-8ca6-97b28dc404b0.png)

**プラグイン導入後**
![after.png](https://qiita-image-store.s3.amazonaws.com/0/59636/d2b942c8-d6fd-6730-3b0d-3ce101cda351.png)

素敵です。

##所感
こうやって改めて手順を書き出してみると「うわ簡単だな」と思う。
しかしながら、色々調べてながらで最終的に2時間程度かかっており、スキル不足は罪だなと思った。
ちょっとずつでもスキルをあげていきたいな(FPSをやりながら)。

しかも、本当にこれであってるんですかね？
Windows版Vagrantでプラグインが入れられない時はパスを疑ってみる

Vagrantには便利なプラグインが多々ありますが、いざ適用しようとするとこんなエラーが出る事があります。

>The directory where plugins are installed (the Vagrant home directory) has a space in it. On Windows, there is a bug in Ruby when compiling plugins into directories with spaces. Please move your Vagrant home directory to a path without spaces and try again.

この文章をよく見ると分かるのですが、「Windowsの場合はディレクトリにスペースがあるとプラグインが入れられないので、Vagrantのホームディレクトリをスペースのないパスに移動しよう」と、あります。
Windowsの場合、ユーザー名にスペースを含められてしまうので、環境によってはこんなエラーが出るようです。

## 移動方法
### 環境変数に「VAGRANT_HOME」を追加する
設定方法は割愛。
値は移動先の新しいホームディレクトリになりますので、フォルダは作成しておいて下さい。
スペースが無い所が良いので、`C:¥HashiCorp¥Vagrant¥home`のようなVagrantのインストール先下なんかが良いと思います。
ユーザー環境変数とシステム環境変数がありますが、ユーザー環境変数で大丈夫です。
念のため再起動しておきましょう。

### 元のホームディレクトリの中身を移動
Windows7や8の場合、`C:¥Users¥(ユーザー名)¥.vagrant.d`に、boxや設定、プラグインなどが押し込められています。
この中身を、丸ごと先ほど設定したフォルダに移動します。
boxの量などにもよりますが、数十GBは平気であるので少し時間がかかります。

### Vagrantの動作確認
普段の環境で`vagrant up`したり、`vagrant plugin list`してみたりして、環境が復元されていればOKです。

あとはお好きなプラグインをもう一度入れてみて下さい。
Scala2.10 Implicit Class

# Implicit Classとは
Scalaでは暗黙の型変換を使用し、継承を使わず型を拡張したかのように扱うことができます。
そのためには変換後のクラスと変換用のメソッドが必要だったのですが、Scala2.10から変換後のクラスと変換用のメソッドを用意しなくても、直感的に暗黙の型変換を記述できるImplicit Classが導入されました。

# 例
Implicit Classは、クラス宣言にimplicitキーワードを付与します。

◆java.io.FIleを拡張するImplicit Class
~~~
implicit class ReadFile(file: java.io.File) {
  def asString: String = {
    // ファイルの内容を読み込んで文字列を返す
  }
}

// implicit Classで定義したメソッドを使用
val file = new java.io.File("sample.scala")
plintln(file.asString)
~~~
fluentd+elasticsearchの構成でミリ秒単位のタイムスタンプを有効にする方法

## 以下は2014年末での情報です。fluentd-0.12.xでの利用方法については追記2をご確認ください。

## 背景
Fluentd+Elasticsearch+Kibanaの構成でミリ秒単位のタイムスタンプを扱いたい。

### fluentd
内部でレコードに対して付与されるtimeはunixtimeである。
そのため、ミリ秒単位でのタイムスタンプを標準でサポートしていない。
(内部データをfloatにする方法が検討されているらしい。)

### fluent-plugin-elasticsearch

 * fluentdの内部で渡されるtimeを@timestampに変換してelasticsearchへ渡している。
 * レコードに@timestampが予め用意されている場合はそれをelasticsearchへ投げる。
 * この段階で@timestampがミリ秒のデータを含み、適切なフォーマット"%Y-%m-%dT%H:%M:%S.%L%z"の場合、elasticsearchに適切な状態で保存されKibanaで取り扱い可能となる。

## 実装
以下の二つの方法を用意した。

 1. fluent-plugin-elasticsearchの修正版（フォーク） https://github.com/shivaken/fluent-plugin-elasticsearch
 1. fluentd用フィルタプラグイン https://github.com/shivaken/fluent-plugin-better-timestamp


 1はmsecをレコードに用意するだけで動作する。
 2はフィルタなので以下の様な設定を追加する必要がある。

```
 <source>
  type tail
  format
  format /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).(?<msec>\d{3}) .....
  ...
  tag log
 </source>
 <match log>
  type better_timestamp
  tag log.with_msec
 </match>
 <match tag log.with_msec>
  type elasticsearch
  ...
 </match
```

1をgit経由で利用するか2のgemをインストールしてフィルタを一段追加するかは事情に合わせて選ぶのが吉。

1については別途issueを通じて本体へのマージを目指してます。
issueで意見言ってからプルリク出したほうがいいのかな。。

追記: プルリクエスト出しました。
https://github.com/uken/fluent-plugin-elasticsearch/pull/82

追記2: fluentd 0.12.xでの設定方法について出てました。
https://github.com/uken/fluent-plugin-elasticsearch/issues/39#issuecomment-171642223
『Webを支える技術』まとめ①

[Webを支える技術](http://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042)を会社の先輩からお借りして読了しました。
自分で買ってまた読みたいです。
自分なりのまとめです。
第1回は第1部から第3部までをまとめました。

##REST

###RESTとは
Webのアーキテクチャスタイル。

###RESTアーキテクチャスタイル
* クライアント/サーバ：ユーザーインターフェースと処理を分離する
* ステートレスサーバ：サーバ側でアプリケーション状態を持たない
* キャッシュ：クライアントとサーバの通信回数と量を減らす
* 統一インターフェース：インターフェースを固定する
* 階層化システム：システムを階層に分離する
* コードオンデマンド：プログラムをクライアントにダウンロードして実行する

WebサービスやWebAPIがRESTfulになると、Webは全体としてよりよくなっていく。

##URI

###URIとは
Uniform Resource Identifier。リソースを統一的に識別するIDのこと。URIを使うとWeb上に存在するすべてのリソースを一意に示せる。

###クールURI
よいURIやきれいなURIのこと。
URIは変わらないべきであるし、変わらないURIこそが最上のURIである。
URIの設計指針は以下の5つである。

* URIにプログラミング言語依存の拡張子を利用しない
* URIに実装依存のパス名を利用しない
* URIにプログラミング言語のメソッド名を利用しない
* URIにセッションIDを含めない
* URIはそのリソースを表現する名刺である

###URIを強く意識する必要がある
URIは次の点でとても重要である。

* URIはリソースの名前である
* URIは寿命が長い
* URIはブラウザがアドレス欄に表示する

これらの観点より、URIはWebサービスやWebAPIの設計においてもっとも重要するべきパーツであるといえる。

##HTTPの基本

###HTTPとは
TCP/IPをベースとしたプロトコル。
RESTのアーキテクチャスタイルである統一インターフェース、ステートレスサーバ、キャッシュなどを実現している、Webの基盤となるプロトコル。

###TCP/IP
ネットワークプロトコルであり、階層型になっている。

* ネットワークインターフェース：物理的なケーブルやネットワークアダプタ
* インターネット層：データを実際にやり取りする部分。パケット単位でデータをやり取りする
* トランスポート層：接続先に対してコネクションを張り、データの到達を保障する
* アプリケーション層：具体的なインターネットアプリケーション

###HTTPの仕組み
クライアント(Webブラウザ)が情報を提供するサーバ(Webサーバ)に接続し、各種のリクエストを出して、レスポンスを受け取る。

###HTTPメッセージ
クライアントがサーバにリクエストするときに送るリクエストメッセージと、クライアントがサーバからレスポンスを受け取る時に受けるレスポンスメッセージをまとめてHTTPメッセージと呼ぶ。

リクエストメッセージは以下の要素で構成される。

* リクエストライン：メソッド、リクエストURI、プロトコルバージョン
* ヘッダ：メッセージのメタデータ
* ボディ：本質的な情報。リソースを更新するリクエストを送る場合は、新しく作成するリソースの表現そのものが入る

レスポンスメッセージは以下の要素で構成される。

* ステータスライン：プロトコルバージョン、ステータスコード、テキストフレーズ
* ヘッダ：メッセージのメタデータ
* ボディ：本質的な情報

##HTTPメソッド

###8つのメソッド
HTTP1.1は以下の8つのメソッドのみ用意されている。

* GET：リソースの取得
* POST：子リソースの作成、リソースへのデータ追加、そのほかの処理
* PUT：リソースの更新、リソースの作成
* DELETE：リソースの削除
* HEAD：リソースのヘッダの取得
* OPTIONS：リソースがサポートしているメソッドの取得
* TRACE：自分宛にリクエストメッセージを返す試験
* CONNECT：プロキシ動作のトンネル接続への変更

###POSTとPUTの使い分け
どちらのメソッドでもリソースを作成することが可能である。設計上の指針として次のような事実がある。
POSTでリソースを作成する場合は、リソースのURIを指定することができない。
PUTでリソースを作成する場合は、リソースのURIをクライアントで指定することができる。

###べき等性と安全性

* べき等性：ある操作を何回行っても結果が同じこと
* 安全性：操作対象のリソースの状態を変化させないこと

HTTPメソッドはその性質によって、以下のように分類することができる。

|メソッド|性質|
|:-----------|:------------------|
|GET,HEAD|べき等かつ安全|
|PUT,DELETE|べき等だが安全ではない|
|POST|べき等でも安全でもない|

* GET,DELETE：同じリクエストを何度送信しても同じ結果が返ってくる。また、リソースの状態も変えることはない
* PUT,DELETE：同じリクエストを何度送信しても更新(PUT)された結果は同じになる。また、削除(DELETE)された結果も同じになる。しかし、リソースの中身を変えてしまっているので安全ではない。
* POST：同じリクエストを複数回送信すると、複数回データが更新されてしまうことがある(ショッピングサイトの二重注文など)。また、リソースの中身を変えてしまっているので安全でもない。

###Webの成功はHTTPメソッドにあり
メソッドを限定して固定したからこそプロトコルがシンプルに保たれ、Webは成功した(RESTの統一インターフェース制約)。

##ステータスコード

###ステータスコードの分類と意味
レスポンスメッセージに含まれる。レスポンスメッセージの意味を伝える。

* 1xx：処理が継続していることを示す
* 2xx：成功
* 3xx：他のリソースへのリダイレクトを示す
* 4xx：クライアントエラーを示す。原因はクライアントのリクエストにある
* 5xx：サーバエラーを示す。原因はサーバ側にある

###ステータスコードを意識して設計する
ステータスコードにはそれぞれ意味があり、正しく扱うことが大切である。WebサービスやWebAPIでエラーが起きた時にどのステータスコードを返すかは、とても重要な設計の検討事項である。

##HTTPヘッダ

###HTTPヘッダとは
メッセージのボディの対する付加的な情報、いわゆるメタデータを表現する。クライアントやサーバはヘッダを見てメッセージに対する挙動を決定する。
日時やMIMEメディアタイプ、認証の方法やキャッシュの可否を指定することができる。
CoreDataの多段migration

適当に自分の環境で調べたので備忘録的なメモ
マイグレーションはマッピングファイルさえ用意されていれば一足飛びでも可能という話。

CoreDataのモデルバージョンが下記のように3つあるとする

ver1
ver2
ver3

この時下記のようなマッピングファイルを2つ用意する

ver1 -> ver2
ver2 -> ver3

マッピングファイルさえあれば、CoreData のバージョンがver1 でも、正常部ver3 へと適切にマイグレーションされる。
UITextFieldにAutolayoutを使用した状態で長い文字列を入れるとレイアウトが崩れる問題への対処法


開発中に詰まって、自己解決したので備忘録代わりにメモ。

この問題は、UITextField に対してAutolayoutの制約を使用するときに生じる。

問題に関する詳細は下記URL
[Issue using UITextField with long string](http://stackoverflow.com/questions/17755670/issue-using-uitextfield-with-long-string)


結論だけ書くとUITextFieldをUIViewの中に入れてやることで解決する。

UITextFieldに課していた制約をViewに課し、そのViewの中にTextFieldを入れてやることで解決。
Heroku 上の Ruboty を Wercker で自動デプロイ #ruboty #wercker

# Heroku 上の Ruboty を Wercker で自動デプロイ #ruboty #wercker
## 概要
Heroku 上の Ruboty を Wercker で自動デプロイします

## 前提
* Heroku への Ruboty 初回デプロイは完了済み
* Wercker の自動デプロイメニューを利用します
    * 自動デプロイメニューによる設定は細かな制御がきかないので、
      より細かなデプロイ設定を必要とする場合は wercker.yml で制御する。
* Wercker に Ruboty のアプリケーションを登録済み
* Ruboty のプロジェクトに wercker.yml を設定済み（疎通確認用なので bundle install だけする）

~~~ruby:wercker.yml
box: wercker/ruby
build:
    steps:
        - bundle-install
~~~

## 設定手順
* Heroku のダッシュボードで API キーを取得しておきます
* Wercker の管理画面で Ruboty のアプリケーションを選択
* Settings を選択
* DEPLOY TARGETS の Add Deploy Target から Heroku を選択
    ![ruboty_auto_deploy1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/59482e4f-567e-a9c5-0800-7992e22ab166.png)

* Heroku の API キーを入力
    ![ruboty_auto_deploy2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9b372248-b72d-99d6-003e-ed276aafcc68.png)

* Deploy target name にターゲット名を設定。 Auto deploy にチェックをして、ブランチ名に master を設定
    ![ruboty_auto_deploy3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/314d975d-090c-db1f-e32b-3bcd8d095ccc.png)

## 動作確認
* Slack から確認します
* @blockgiven さんの [ruboty-nullpo](https://github.com/blockgiven/ruboty-nullpo) を追加

~~~ruby:Gemfile
source "https://rubygems.org"
# 略

# ruboty-nullpo だけ追加
gem "ruboty-nullpo"
~~~

* GitHub への push

~~~bash
$ git push origin master
~~~

* デプロイ結果を Slack で確認

![ruboty_auto_deploy4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/278d900b-fd4f-7289-f780-5597678a8751.png)

* デプロイ結果を Wercker で確認

![ruboty_auto_deploy5.png](https://qiita-image-store.s3.amazonaws.com/0/43480/01c0aefd-b28a-8106-852c-951b6ac53e86.png)

## メモ
* Slack はメッセージのはじめの空白文字（スペース、改行）を消す。  
  そのため、AA関連がずれる。 [ruboty-nullpo](https://github.com/blockgiven/ruboty-nullpo) や [ruboty-ume](https://github.com/tbpgr/ruboty-ume) が・・・・。  
  1行目さえ空文字にならなければいいので、AAを利用する際は1行目にドット一文字などを出力しておくべきか？

## 参照
* [Wercker | Deployment](http://devcenter.wercker.com/articles/deployment/)
* [ruboty-nullpo](https://github.com/blockgiven/ruboty-nullpo)
Wercker Deployment #wercker

# Wercker Deployment #wercker
## 概要
継続的デリバリプラットフォーム Wercker の Deployment について。
## Development
Wercker は様々な PaaS 環境へのデプロイをサポートしている。
デプロイ先のことを Deploy Target と呼びます。

Paas 以外にも、 Fabric ・ Capistrano ・ プレーンな shell などもサポートしている。

## Auto Deploying
Wercker は Auto Deploying をサポートしている。
この設定を利用すると、デプロイがグリーンだった場合に、
特定のターゲットにデプロイを行うことができる。
これは、ブログなど低リスクのコンテンツに対して利用する際に便利です。

## 参照
* [Wercker | Deployment](http://devcenter.wercker.com/articles/deployment/)
Wercker Best Practice #wercker

# Wercker Best Practice #wercker
## 概要
継続的デリバリプラットフォーム Wercker の Best Practice について。
## Development
Pull Request の ビルド結果を常に確認できる。
## Deployment
一般的なデプロイは、 Staging と Production の二つの異なる
環境に行うことが多いです。

Production：本番環境
Staging：動作確認や問題の調査のために利用する本番に近い環境

Wercker でこの二つを実現するには Deploy Target を二つ作成する。
Staging への Build / Deploy が成功したら、 
次に Production への Build / Deploy を行う。
### Wercker 公式サイトの記事中の誤り（2014/11/17 時点）
説明中のリンクが死んでいるので後でプルリクエストを送る。
[Wercker Best Practice](http://devcenter.wercker.com/articles/bestpractices/)

* 誤ったリンク
http://devcenter.wercker.com/articles/introduction/concepts.html#deploy-targets
http://devcenter.wercker.com/articles/introduction/concepts.html#builds
http://devcenter.wercker.com/articles/introduction/concepts.html#deploys

* 正しいリンク
http://devcenter.wercker.com/articles/introduction/deploys.html#deploy-targets
http://devcenter.wercker.com/articles/introduction/deploys.html#builds
http://devcenter.wercker.com/articles/introduction/deploys.html#deploys

## 参照
* [Wercker](http://wercker.com/)
* [Wercker | Best Practices](http://devcenter.wercker.com/articles/bestpractices/)
* [Wercker | Attaching build statuses to commits on Github](http://devcenter.wercker.com/articles/bestpractices/pullrequests.html)
Jadeでクラス名を変数展開する	


Jadeでクラス名を変数展開したいんだけど、構文エラーになる。

例

```index.jade
- var i = 0;
while i < 5
	div.num_#{i}
```

できないのかな。
止むを得ず、以下の代替手法だといけた。

```index.jade
- var i = 0;
while i < 5
	div(class="num_"+i)
```
覚書

<h1>ローカル環境構築用ツール</h1>
curlで取ってきて展開・配置するだけ
PATHの書き換えも個人ツールやしやっとこ

* Homebrew
* xcode
* oh-my-zsh
* JDK8
* Scala
* sbt
* Play!
* Spring Boot
* Atom
* SublimeText3
* Eclipse
* Git
* Gradle
* Ruby
* Rails
* Python
* iTerm2
* node.js
* yoeman
* Chrome
* はてぶ拡張
Polymer.dartのcore-ajaxを動かす

`core-ajax-dart`で記事の一覧を取得して`repeat`機能で一行ずつ表示。
慣れない言語で、思いのほか右往左往。
でも、やっぱり動いてみると何てこと無いコードになる。

##メインページのHTML

```index.html
<html>
<head>
  <script src="packages/web_components/platform.js"></script>
  <script src="packages/web_components/dart_support.js"></script>
  <!-- 記事一覧用カスタムタグ -->
  <link rel="import" href="my_topics.html">
</head>
<body>
  <h1>記事一覧</h1>
  <div>
    <my-topics></my-topics>
  </div>
  <script type="application/dart">export 'package:polymer/init.dart';</script>
  <script src="packages/browser/dart.js"></script>
</body>
</html>
```
`<my-topics>`が今回の記事一覧のカスタムタグ。

##カスタムタグのHTML
```my_topics.html
<link rel="import" href="packages/polymer/polymer.html">
<link rel="import" href="packages/core_elements/core_ajax_dart.html">
<polymer-element name="my-topics">
  <template>
    <link rel="stylesheet" href="my_topics.css">
    <core-ajax-dart auto url="http://localhost:3000"
      handleAs="json"
      response="{{response}}"></core-ajax-dart>
    <div>
      <template repeat="{{response}}">
        <div>{{this["title"]}}</div>
      </template>
    </div>
  </template>
  <script type="application/dart" src="my_topics.dart"></script>
</polymer-element>
```
`<core-ajax-dart>`を使ってみた。Polymerの`core-ajax`の説明は[core-ajax](https://www.polymer-project.org/docs/elements/core-elements.html#core-ajax)を参照。
`<template>`の中に`<template repeat="{{response}}">`で繰り返しを実装。その中で値を参照する場合は`{{this["title"]}}`のようにHash値として考える。

##カスタムタグのDart
```my_topics.dart
import 'package:polymer/polymer.dart';

@CustomTag('my-topics')
class Topics extends PolymerElement {
  @observable List<Map<String,dynamic>> response;
  Topics.created() : super.created() {} 
}
```
クラスは簡単で、JSONを受けるresponseを定義するだけ。

Dart初心者なので、これがDartらしいコードかどうか、未だ確信が持てないが、それなりにスッキリした形なので、一旦満足。
Macで/etc/hostsに記述した独自ドメインへの名前解決が遅い



以前 [Kitematicに関する記事](http://qiita.com/ciela/items/33a89d424a7c552068c3) 書いたんですが、どうもアプリの調子が芳しくなくって使うの諦めたんです。

とはいえアプリから接続するローカルDBやローカルキャッシュに対してはKitematicが管理してるDockerにアクセスするように既に設定ファイルに記述されてる状況があるため、個人で `/etc/hosts` に下記みたいに記述してちまちまやってた。

```/etc/hosts
127.0.0.1		localhost
255.255.255.255	broadcasthost
::1				localhost
fe80::1%lo0		localhost

192.168.59.103		mongodb.kite
192.168.59.103		redis.kite
```

**ただこれがもうとにかく遅い。**
アプリ起動時にセッションテストがてら一度つなげるようになってるんですが平気で10秒ぐらいかかる。

しばらく我慢してたんですが、耐えられなくなって業後の2時間（笑）使って解決法探してた。
で、どうやら [IPv6のエントリも書いておけば大丈夫臭い記事](https://discussionsjapan.apple.com/thread/10100066?start=0&tstart=0) を発見。
結果はこんな感じに。

```/etc/hosts
127.0.0.1		localhost
255.255.255.255	broadcasthost
::1				localhost
fe80::1%lo0		localhost

192.168.59.103		    mongodb.kite
fe80::a00:27ff:fe65:393a mongodb.kite
192.168.59.103		    redis.kite
fe80::a00:27ff:fe65:393a redis.kite
```

mongodbとredis、それぞれのIPv4エントリの下にでもIPv6アドレスでもってDockerが乗ってる仮想マシンへのエントリを記述してあげる。
これで素早い接続が可能になりストレスのない起動ができるようになった。

以上、バッドノウハウにしか思えないけど解決したのでよしとする。
AngularJSのドキュメントを読む前に知っておきたいことメモ

# このメモの内容

チュートリアルも読んだし、ばりばりAngularJSプログラム書いちゃうぜ！とui bootstrapのドキュメントを読んでけつまづきました。
ドキュメント中に使われている単語がわからんのです（promiseって何よ！とか）。
そんな単語を将来の為にメモしていきます。

# 単語リスト

## promise

promise/deferredパターンでいうところのpromiseオブジェクト（へ？）。thenというメソッドを持っています。thenメソッドは第1引数に成功時の処理、第2引数に失敗時の処理を渡します。

promiseが渡ってくるときは、こんな感じで使います。

```javascript:
somepromise.then(function() {
  /* 成功時の処理 */
}, function() {
  /* 失敗時の処理 */
});
```

promise/deferredパターンは非同期処理を順番に実行するときに便利だとか（？）

## controller-as

ng-controller属性にコントローラ名を書いていると思います。そのコントローラに別名（？）を付けるやり方です。

チュートリアルに書かれているやり方：

```html:
<ANY ng-controller="SomeCtrl">
  {{someModel}}
</ANY>
```

controller-as記法を使ったやり方：

```html:
<ANY ng-contoller="SomeCtrl as some">
  {{some.someModel}}
</ANY>
```

## service

サービスオブジェクト。アプリケーション全体で参照したいものをいれておくのに便利。

coreという名前のサービスを定義：

```javascript:
angular.module('myApp', []).factory('core', function () {
  var coreServiceInstance = {
    contextPath: "/myApp"
  };

  return coreServiceInstance;
});
```

コントローラでcoreサービスを使用：

```javascript:
angular.module('myApp').controller('MyCtrl', [
  'core',
  function (core) {
    console.log('Context Path is :' + core.contextPath);
  }
]);
```

## directive

（2014/12/18追記）

HTMLの中に書いてきたng-controllerやng-appやng-includeなんてのは、全部directiveです。

angularjsは、directiveをがっちゃんこがっちゃんことHTMLの中に組み込んでいくスタイルなのですな。


## スコープ

変数のスコープ（グローバルとかローカルとかいいますね）と大体同じ意味です。

文脈（コンテキスト）と表現したりもします。

AngularJSで何かを参照するときは、そのスコープにあるものを参照します。

サザエさんで例えると、スコープとしては磯野、フグ田、波野があり、波平やカツオを参照したいときは磯野スコープを見ていないといけないということです。同様に、タラちゃんはフグ田スコープ、イクラちゃんは波野スコープを見ないと存在しないです。

スコープには親子関係があり、最初の親は`$rootScope`ただ一つです。
残りのスコープは、すべて`$rootScope`から辿られる子供になります。

ただ、グローバルスコープみたいに、どこでも参照できるものはないです。

ディレクティブを作ったりしていると、「親スコープのxxxを参照する」なんてシーンに出くわすことがあります。

サザエさんで例えると、磯野とフグ田は親子関係にあり、フグ田サザエの実体は磯野にあり、フグ田サザエは磯野サザエを参照しているということになります。
input[type=number] は ime-mode が効かない

Windows, Firefox(31.1)のみで確認。

```html
<input name="test" type="number" style="ime-mode:disabled;">
```

という html でも Firefox だと IME をポチポチ切り替えることが出来て、全角数字を入力することが出来ます。
（number を text に変えると切り替えられない）

全角数字入力状態で横っちょのスピンボタンをクリックすると半角に変換されます。
全角数字以外が入力されているとスピンボタンが効かないようです。

そして入力の全半角を問わず、サーバーには半角で飛んできます。

「ime-mode が効かねぇeeeee」って人の参考になれば幸い。
まぁ大した問題にはならないと思いますが、個人的には数値は半角で入力しないと気持ち悪い…。

わざわざ ime-mode を無視する理由がなにかあったんかね？
むしろ [type=number] だったら強制 IME オフでもいいような…。