OmniAICreator/Qiita-1.07M huggingface dataset:
Berkshelf で依存解決しつつ chespec を流す

## 普通のやりかた

berkshelf 本家のやり方はこんなかんじ

```ruby:spec/spec_helper.rb
# Added by ChefSpec
require 'chefspec'

# Uncomment to use ChefSpec's Berkshelf extension
require 'chefspec/berkshelf'
```

ただこれだと、spec を流すたびに berks vendor が走ってめっちゃ遅い。

## 工夫したやり方

berks install (または berks vendor) を前もって１度だけ走らせておく、という戦法。

[berks install 先のディレクトリを指定する](http://qiita.com/sonots/items/b091f19e6a32546744d1)の記事に書いた Rakefile を作っておくと、rake install や rake vendor タスクが生えて、クックブックを vendor/cookbooks 以下にダウンロードできるようになる。これを使って前もって依存 cookbook をダウンロードしておく。

```
$ rake install
```

その上で、spec/spec_helper.rb をこんなかんじにする。ダウンロード先の `vendor/cookbooks` を `cookbook_path` に指定している。

```ruby:spec/spec_helper.rb
require 'chefspec'

RSpec.configure do |config|
  config.cookbook_path = %w(vendor/cookbooks)
end
```

これで rspec を流せば、Berkshelf で依存解決しつつ、素早く単体テストが実行できる

```
$ rspec
```

## Berksfile でローカルパスを指定している場合

次のように Berksfile でローカルパスの cookbook を指定している場合：

```ruby:Berskfile
source 'https://supermarket.chef.io'

metadata
cookbook 'awesome_cookbook', path: '../awesome_cookbook'
```

berks install (rake install) で path 指定の cookbook は `vendor/cookbooks` にコピーされないので、cookbook_path に `..` も含めれば良い

```diff:spec/spec_helper.rb
-   config.cookbook_path = %w(vendor/cookbooks)
+   config.cookbook_path = %w(vendor/cookbooks ..)
```

## まとめ

`vendor/bookbooks` 以下に berks install する rake install タスクを作る

```ruby:Rakefile
# berks install to vendor/cookbooks
desc "berks install (download cookbooks)"
task :install do
  require 'berkshelf'
  puts 'berks install to vendor/cookbooks'
  Berkshelf.ui.mute do
    ENV['BERKSHELF_PATH'] = 'vendor'
    Berkshelf::Berksfile.from_file('Berksfile').install
  end
end
```

spec/spec_helper.rb で cookbook_path を指定する

```ruby:spec/spec_helper.rb
require 'chefspec'

RSpec.configure do |config|
  config.cookbook_path = %w(vendor/cookbooks ..)
end
```

これで毎回 berks vendor を走らせずに素早く単体テストを実行できる。

```
$ rake install # 最初の１回のみ
$ rspec
```
ChromeでFullScreen API試してみたけどけっこう限られるね

タイトルの通り。


デモ用のアプリのモックをHTMLで作る必要があって、画面いっぱいに表示したいからFullScreen API使えばいいんじゃね？と思ったけど、意外と制限多かったのでメモ。

## 1. 画面遷移が発生すると解除される。

FullScreen APIで全画面表示にした後に、表示しているコンテンツ上でリンク押下等で画面遷移が起こると、全画面表示が解除される。
仕様書やドラフトの資料で確認したわけではないけれど、今の所再現率100%。
おそらく、フィッシング詐欺等の対策。


## 2. onloadやsetTimeout等で自動実行してもリジェクトされる。

こちらも状態は再現するけど、仕様として合ってるかは不明。
例えば、以下のような感じ。


```js
// 全画面表示の実行
function enterFullscreen () {
  var x = document.body;
  if (x.webkitRequestFullScreen) {
    x.webkitRequestFullScreen();
  } else {
    x.requestFullScreen();
  }
}

// 1. onload版
window. unload = function () {
	enterFullscreen();
};

// 2. setTimeout版
setTimeout(function(){
	enterFullscreen();
}, 1000);

```
これは、1も2も動かない。
これもフィッシング詐欺防止の仕様だろうとおもうけど、未確認。


## ではどうするか

今の所、ボタン押下等のユーザの主体的なアクションをもとにrequestFullScreenを実行するしかないみたい。
あと、画面遷移したりぐりぐり全画面上で動かすなら、WebGLかな？
iframeで楽しようかともおもったけど、mozillaの資料見る限り面倒そう。。。

https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Using_full_screen_mode
OpenSSL 各ファイルの内容の確認方法


i3 Jan 17 2015: OpenSSL 各ファイルの内容の確認方法

メモとして。

`genrsa` で生成した RSA 秘密鍵。

~~~~console:
$ openssl rsa -in clttest/clt.key -text
Enter pass phrase for clttest/clt.key:
Private-Key: (2048 bit)
modulus:
    00:c1:37:ba:01:95:6c:cc:d6:03:85:8f:dc:d0:8f:
    e7:e9:35:0b:4b:7a:c8:31:49:e2:ed:06:f0:07:fe:
    d9:9c:ff:cb:48:14:db:79:d4:ff:8f:3c:c2:57:9d:
    ...
~~~~

CSR（署名要求）。

~~~~console:
$ openssl req -in clttest/clt.csr -text
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo-to, L=Minato-ku, O=Ayutaya.com, Inc., OU=Sales, Div., CN=AYUTAYA_COM EMPID 3828347/emailAddress=example@ayutaya.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:c1:37:ba:01:95:6c:cc:d6:03:85:8f:dc:d0:8f:
                    e7:e9:35:0b:4b:7a:c8:31:49:e2:ed:06:f0:07:fe:
                    d9:9c:ff:cb:48:14:db:79:d4:ff:8f:3c:c2:57:9d:
                    ...
~~~~

X.509 証明書。

~~~~console:
$ openssl x509 -in clttest/clt.crt -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 2 (0x2)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, O=Ayutaya.com, Inc., OU=IT, Div., CN=Kiichiro NAKA/emailAddress=admin@ayutaya.com
        Validity
            Not Before: Jan 13 07:24:51 2015 GMT
            Not After : Jan  4 07:24:51 2050 GMT
        Subject: C=JP, ST=Tokyo-to, L=Minato-ku, O=Ayutaya.com, Inc., OU=Sales, Div., CN=AYUTAYA_COM EMPID 3828347/emailAddress=example@ayutaya.com
        ...
~~~~

以上は PEM。DER ならばそれぞれに、`-inform ～` を指定。変換ならば、`-outform ～` を指定。

PKCS#12 の内容。

~~~~console:
$ openssl pkcs12 -in clttest/clt.p12 -info
Enter Import Password:
MAC Iteration 2048
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: F6 AA CB 59 B5 45 A5 CE A8 F1 56 58 F5 E6 EB 1E 41 63 63 2C
subject=/C=JP/ST=Tokyo-to/L=Minato-ku/O=Ayutaya.com, Inc./OU=Sales, Div./CN=AYUTAYA_COM EMPID 3828347/emailAddress=example@ayutaya.com
issuer=/C=JP/ST=Tokyo/O=Ayutaya.com, Inc./OU=IT, Div./CN=Kiichiro NAKA/emailAddress=admin@ayutaya.com
    ...
~~~~
Play2のJsonで23要素以上のclassのReadsを作る

現状のPlay2のJsonは[公式ドキュメント](https://www.playframework.com/documentation/ja/2.3.x/ScalaJsonCombinators#Reads)に記載されている方法では、23要素以上あるclassのJsonのReads(デシリアライザ)を作成することができません。

その回避策としてxuweiさんが作成した[play-twenty-three](http://d.hatena.ne.jp/xuwei/20140727/1406445058)を使うことで23要素以上のJsonのReadsを作成することができますが、for式を使えば外部ライブラリに依存せずにReadsを作成することができます。
以下がfor式版のサンプルです。
**追記: ※この方法だとエラー時の挙動が異なるためエラー箇所の特定が難しくなるようです**

```scala
import play.api.libs.json.{ Json, Reads, __ }

case class Sample(
  v01: Int,
  v02: Int,
  v03: Int,
  v04: Int,
  v05: Int,
  v06: Int,
  v07: Int,
  v08: Int,
  v09: Int,
  v10: Int,
  v11: Int,
  v12: Int,
  v13: Int,
  v14: Int,
  v15: Int,
  v16: Int,
  v17: Int,
  v18: Int,
  v19: Int,
  v20: Int,
  v21: Int,
  v22: Int,
  v23: Int,
  v24: Int,
  v25: Int)

object Sample {

  implicit val reads: Reads[Sample] = {
    for (
      v01 <- (__ \ "v01").read[Int];
      v02 <- (__ \ "v02").read[Int];
      v03 <- (__ \ "v03").read[Int];
      v04 <- (__ \ "v04").read[Int];
      v05 <- (__ \ "v05").read[Int];
      v06 <- (__ \ "v06").read[Int];
      v07 <- (__ \ "v07").read[Int];
      v08 <- (__ \ "v08").read[Int];
      v09 <- (__ \ "v09").read[Int];
      v10 <- (__ \ "v10").read[Int];
      v11 <- (__ \ "v11").read[Int];
      v12 <- (__ \ "v12").read[Int];
      v13 <- (__ \ "v13").read[Int];
      v14 <- (__ \ "v14").read[Int];
      v15 <- (__ \ "v15").read[Int];
      v16 <- (__ \ "v16").read[Int];
      v17 <- (__ \ "v17").read[Int];
      v18 <- (__ \ "v18").read[Int];
      v19 <- (__ \ "v19").read[Int];
      v20 <- (__ \ "v20").read[Int];
      v21 <- (__ \ "v21").read[Int];
      v22 <- (__ \ "v22").read[Int];
      v23 <- (__ \ "v23").read[Int];
      v24 <- (__ \ "v24").read[Int];
      v25 <- (__ \ "v25").read[Int]
    ) yield Sample(
      v01,
      v02,
      v03,
      v04,
      v05,
      v06,
      v07,
      v08,
      v09,
      v10,
      v11,
      v12,
      v13,
      v14,
      v15,
      v16,
      v17,
      v18,
      v19,
      v20,
      v21,
      v22,
      v23,
      v24,
      v25
    )
  }
}
```

23要素以上のJsonなんてほとんどないのに、そのために外部ライブラリ入れるのもなんだかなー というときには使えるかもしれません。
Redmine@OpenShiftのMySQLデータをバックアップ&リカバリー

自分用のRedmineをOpenShiftで稼働させていますが、何らかの理由でデータが消えてもらっては困るので、定期的にバックアップを取っています。この記事では、そのバックアップ手順と、バックアップデータをOpenShift上にリカバリーする手順を説明します。

# 前提

- MySQLデータ、Redmineソースコードをバックアップします。添付ファイルは考慮しません(私が添付ファイルを使用していないだけ)。
- phpMyAdminではなく、mysqldumpでダンプします。phpMyAdminでダンプしたら、なぜかダンプファイルが途中までしか出力されませんでした。
- バックアップしたMySQLデータ、Redmineソースコードを使用して、OpenShift上にリカバリーします。

# バックアップ手順

sshでOpenShiftにログインして、そこからmysqldumpを使用します。しかし、いちいちログインするのは面倒なので、以下のようにsshを使用して、ローカルPCにダンプします。

```
$ ssh -i ~/.ssh/id_rsa $1@$2 “mysqldump -h $3 -u $4 --password=$5 redmine” | gzip >redmine.sql.gz
```

- 秘密鍵にパスフレーズを設定している場合、Pagentなりssh-agentなりを使うとパスワード入力を省略できます。これは、上記コマンドをcronで定期実行するなどの場合に便利です。
- 変数は以下のように指定します。
  - \$1, $2…OpenShiftにsshアクセスするときのユーザー名、ホスト名です。OpenShiftの該当アプリケーションのページのRemote Accessで確認できます。
  - \$3…MySQLホスト名(IPアドレス)です。phpMyAdminで確認できます。
  - \$4, $5…MySQLユーザー名、パスワードです。OpenShiftの該当アプリケーションのページで確認できます。
- 出力先ファイル名に日時を含めると時間ごとのバックアップになります。

```
redmine_`date +%Y%m%d-%H%M%S`.sql.gz
```

# リカバリー手順

- バックアップしたMySQLデータ、Redmineソースコードを使用して、OpenShift上にリカバリーします。
- rhcで新規のOpenShiftアプリを作成します。
- Redmineソースコードをpushします。
- MySQLダンプファイルをscpでアップロードして、mysqlでインポートします。
- 該当アプリケーションのページで、アプリケーションを再起動します。

# 備考

- Redmineをバージョンアップしたいときはどうすれば良い？
- OpenShift以外の環境(例えばローカル)に復旧する方法を考えておいたほうが良い。万が一、OpenShiftが使えなくなってしまうことを考慮して。
band.jsでレトロなサウンドに癒される。

#band.jsとは？

作曲ツール（大嘘
JavaScriptで音を鳴らすライブラリ([MIT License](https://github.com/meenie/band.js/blob/master/LICENSE))。矩形波、ノコギリ波など、レトロな音を鳴らすことができ、和音やパート分けも可能。頑張れば昔懐かしいあんな曲こんな曲も再現できるかもしれない。
今回は細かい部分には触れずに最低限の設定で音を鳴らして楽しもうという企画。

[GitHub](https://github.com/meenie/band.js)からダウンロード

##楽譜の読み方

解凍するとdistフォルダ内にband.min.jsとかそれらしいのがあると思うが、それがプレーヤーだと思えばいいと思う。examplesフォルダ以下のapp.jsが楽譜。

###はじめに

以下音に関する部分をexamples/mario-bros-overworld/app.jsから抜粋して説明。

```
var gameMusic = new BandJS();

    gameMusic.setTimeSignature(2, 2);
    gameMusic.setTempo(180);

var rightHand = conductor.createInstrument('square', 'oscillators'),
    leftHand = conductor.createInstrument('triangle', 'oscillators'),
    drum = conductor.createInstrument('white', 'noises');

drum.setVolume(50);
```

冒頭はgameMusicを作りますという宣言。.setTimeSignatureは拍子(2分の2拍子)を、setTempoではテンポ(180BPM)を指定。

次に定義してるrightHand, leftHand, drumはそれぞれのパート分け。
conductor.createInstrument()が音の種類を指定している。
第一引数は名前見れば三角波とかホワイトノイズとか感覚でわかるかもしれないけれど、第二引数に関しては未だよくわからず。。。
設定いじってみて音の違いを楽しんで下さい。（投げやり

.setVolumeで音量を設定(Max100)。サンプルではドラムパートにあたるホワイトノイズ音量を50まで落としています。

###音を入れる

```
/**
 * Intro
 */
    // Bar 1
rightHand.note('quarter', 'E5, F#4')
    .note('quarter', 'E5, F#4')
    .rest('quarter')
    .note('quarter', 'E5, F#4');

leftHand.note('quarter', 'D3')
    .note('quarter', 'D3')
    .rest('quarter')
    .note('quarter', 'D3');

drum.rest('whole');

// Bar2
rightHand.rest('quarter')
    .note('quarter', 'C5, F#4')
    .note('quarter', 'E5, F#4')
    .rest('quarter');

leftHand.rest('quarter')
    .note('quarter', 'D3')
    .note('quarter', 'D3')
    .rest('quarter');

drum.rest('whole');

～

rightHand.repeatFromBeginning(2000);
leftHand.repeatFromBeginning(2000);
drum.repeatFromBeginning(2000);

rightHand.finish();
leftHand.finish();
drum.finish();

gameMusic.end();
```

この辺で音の入力をしています。
.noteが音符、.restが休符。引数になってるのは音の長さと音の高さ。
コメントアウトでBar1, Bar2となっているのが小節単位での音ってことですね。
音の入力が終わったら、リピートしたければ.repeatFromBeginning()して、.finishで各パートの入力を終了して、gameMusic.end()で曲全体を閉じます。

###(参考)音の長さ

| 音の長さ | 対応する値 |
|---|---|
|全音符 		|whole|
|付点二分音符 	|dottedHalf|
|二分音符 	|half|
|付点四分音符 	|dottedQuarter|
|三連符(二分) 	|tripletHalf|
|四分音符 	|quarter|
|付点八分音符 	|dottedEighth|
|三連符(四分) 	|tripletQuarter|
|八分音符 	|eighth|
|付点十六分音符 	|dottedSixteenth|
|三連符(八分) 	|tripletEighth|
|十六分音符 	|sixteenth|
|三連符(十六分) 	|tripletSixteenth|
|三十二分音符 	|thirtySecond|

###(参考)音の高さ

| 音名 | 対応する値(例としてC3から) |
|---|---|
|ド|C3|
|レ|D3|
|ミ|E3|
|ファ|F3|
|ソ|G3|
|ラ|A3|
|シ|B3|
|ド|C4|

音域は(低)C0 ～ C8(高)
半音高く…C#3、半音低く…Cb3とシャープ、フラットも組み合わせられます。

上記ソース部分だとドラムパートが一切音を出していないことがわかります。

###曲の制御

サンプルだとそこから先ボタンによる曲の制御とかも記述されているけれど、大事なのは以下

| 動作 | ソース |
|---|---|
|再生|gameMusic.play()|
|停止|gameMusic.stop()|
|一時停止|gameMusic.pause()|
|ミュート|gameMusic.mute()|
|ミュート解除|gameMusic.unmute()|

説明はほどほどに、[ここ](http://plnkr.co/edit/LG20SL?p=preview)で試してみるのがいいです。
capistrano 3入門

## 参考

* [capistrano 3 をできるだけシンプルにサーバーにコマンドを流し込むツールとして使いこなす - Qiita](http://qiita.com/kazuph/items/deeaa7d3f9889674d7fe)

## インストール

```bash:母艦(mac)にて実施
gem install capistrano
```

```bash:プロジェクト作成
mkdir test-project
cd test-project
cap install
```

## 設定開始

```rb:config/deploy.rb
lock '3.3.5'
```

全部削除して上記のcapistranoのversion表記だけ残す。

```rb:config/deploy/production.rb
role :app, %w{myserver1}

task :ls do
  on roles(:app) do
    execute "ls"
  end
end
```

* `ssh myserver1`が出来ることが前提条件。

## 実行

```bash:config/deploy/production.rbのlsタスクを実行
cap production ls
```

![スクリーンショット 2015-01-14 20.00.37.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bd6cbfb6-452a-48b7-1db8-3b0b199ca10c.png)

----

## ファイルの説明

* Capfile
  * 一番最初に読まれるファイル
* config/deploy.rb
  * 次に読まれるファイル
* config/deploy/production.rb
  * `cap production <task名>`
* config/deploy/staging.rb
  * `cap staging <task名>`

こういう使い方も出来る。

* config/deploy/hoge.rb
  * `cap hoge <task名>`
Androidバグ

過去に出会ってしまったバグのメモ。


##変なところで折り返し（自動改行）される

ブラウザの自動改行の設定がONになってるせいで起こる。
横幅の値を指定してもだめだけど、背景色や背景画像を設定すればなぜかなおる。

```css
.sample {
  background: #FFF;
}
```


##CSS3がきかない

ベンダープリフィックスつけてみる。


###PCだといらないけどスマホだと必要なやつ

* box-shadow ... 2.×系とFirefoxブラウザは必要
* box-sizing ... 2.×系とFirefoxブラウザは必要
* border-image ... 必要

`linear-gradient`　は書き方注意
 ○ OK  -webkit-gradient(linear, …)　
 × NG  -webkit-linear-gradient(…)


##背景画像がおかしい

Androidで `background-attachment:fixed` は使えないので注意。


##太字にならない

`font-weight`は無理なので`text-shadow`でがんばる。


##Webフォントが使えない

Basic認証を切ればいけるかも。


##ダウンロード・アップロードに失敗する

これもBasic認証を切ればいけるかも。
もしくは保存先の容量がいっぱいで保存できないケースかも。


##apple-touch-icon が出ない

これもBasic認証を切ればいけるかも。

##positionで重なってる要素に対して、下にある要素がタップで反応してしまう

2系ではz-indexをいくら指定しても効いてくれない。
JSをごりごり書けばいけるらしい。
最悪、デザインの方を重ならなくてもいいよう変更してもらったり。

##iframe内の表示がおかしい

あきらめる。


##心がすさんだときにみるやつ
http://hamalog.tumblr.com/post/57170434943/android
MySQLのViewのDefinerを変更する


mysqldumpを実行したところ以下のようなエラーが発生

```
$ mysqldump -uhogeuser -p some_db > /tmp/some_db.dmp
                                                                        
Warning: Using a password on the command line interface can be insecure.
mysqldump: Got error: 1449: The user specified as a definer ('fugauser'@'%') does not exist when using LOCK TABLES
```

DBを移行したときに、some_dbに含まれるviewを作成したときのユーザを削除したか、Import時に別のユーザで実行してしまったのが原因。

viewの定義をみると

```sql
CREATE ALGORITHM=UNDEFINED DEFINER=`fugauser`@`%` SQL SECURITY DEFINER VIEW `asdf` AS SELECT....
```

となっていた。
DEFINERとはViewの定義者で、参照権限を設定できるもよう。
対応方法は以下の２通り

1. 元のDBユーザ（ここではfugauser）を作成する
2. Viewの定義SQLを書き換えてDEFINERを変更(ここではfugauser->hogeuser)する。
3. DEFINERのデフォルトはCURRENT_USERになるので、VIEWのDEFINER=CURRENT_USERとしてよいなら、一旦VIEWをDROPしてしまって、再度Viewを作成

2の方法は以下の通り

```sql
変更前：CREATE ALGORITHM=UNDEFINED DEFINER=`fugauser`@`%` SQL SECURITY DEFINER VIEW `asdf` AS SELECT....
↓
変更後：ALTER ALGORITHM=UNDEFINED DEFINER=`hogeuser`@`%` SQL SECURITY DEFINER VIEW `asdf` AS SELECT....
```
指定範囲の月日 (YYYYMM) のリストを作る関数

# こーど

これ以上にスマートな書き方あるかしら。(反語)

```php
function getMonthRange($startUnixTime, $endUnixTime = null) {
    if ($endUnixTime === null) {
        $endUnixTime = time();
    }
    $ymList = array();
    for ($utime = $startUnixTime; $utime <= $endUnixTime; $utime = strtotime('+1 month', $utime)) {
        $ymList[] = date('Ym', $utime);
    }
    return $ymList;
}
```

# ざつだん

いつでもプログラム書く上での日付のインクリメント/デクリメントが地味にハマりポイント

月を増減するのに ``` $nextMonth = time() + (86400 * 30) ``` ってするとうまくいかないパターンがあるのはわかっても、 ``` $nextDay = time() + 86400 ``` が (いちおう厳密には) 正確じゃないっていう。うるう秒的に。

結局はPHP大先生のstrtotimeという痒いところに手が届くステキ機能のお力を借りて、``` +1 month ``` なり、 ``` +1 day ``` なりするのが一番いいのかしらねぇ。

大昔に自分が書いたPerlとか見ると ```$month++``` して ```$month>12``` だったら ```$year++``` したうえで ```$month=1```するようなバグインキュベーターコードが見えるのでPHP先生はすばらしい！さすが！
OpenStack Ironic ReleaseNote (Juno) を翻訳してみた

OpenStack Ironic ReleaseNote (Juno)
本家ページ：https://wiki.openstack.org/wiki/Ironic/ReleaseNotes/Juno
（つたない翻訳で間違いだらけだとは思いますがどこかの誰かの役に立てば幸い)

Juno の間に完了した作業の完全なログは下記で見つけられます。
- https://launchpad.net/ironic/juno/2014.2

# 主な特徴
- Nova Ironic driver は Nova のコードベースです。Icehouse では
Nova Ironic driver は Nova のコードベースではありませんでした。
今では Nova のコードベースであり、nova-compute 上に Ironic
 のインストールはもはや必要ありません。
  - nova の再構築は nova.virt.ironic driver でサポートされています。
  - しかしながら、オプションの ```--preserve-ephemeral``` flag は
  agent-based deploy drivers でサポートされていません。
- IPMI のセンサーデータは放出できる(例えば Ceilometer に)
- 新しいハードウェアドライバー : DRAC power & management driver, iLO power & virtual-media deploy driver, SNMP power driver, iBoot PDU power driver
  - DRAC（Dell Remote Access Controller）
- 新しい "agent" は deploy drivers の一員です。
- Neutron 依存が削除されました。
 - agent-based drivers (例えば agent_ipmitool) は外部の静的 DHCP 設定を使用することが可能です。
  あるいは、iLO-based drivers(例えば agent_ilo and iscsi_ilo)　は全く DHCP を使わないことができる。
- UEFI and iPXE boot サポートが一部のドライバで利用可能です。
- Serial-over-LAN console がサポートされています。
IPMItool, NativeIPMI ドライバはシリアルコンソールをサポートしています。

# 既知の問題
- IPMI password は Ironic API を経由してクラウド管理権限を持つユーザに表示されます。
- 複数の nova-compute プロセスの実行は公式にサポートされていません。
Ironic が ClusteredComputeManager を include している間、Ironic を持つ複数の nova-compute プロセスを実行可能にします。それは実験的とみなされ、多くの既知の問題を抱えています。
- "agent" の deploy メカニズムを使用するドライバーはその機能が異なり、次の方法で
"pxe" deploy メカニズムを使用しています。
  - agent は disk 全体のイメージを必要とし、```rebuild --preserve-ephemera``` をサポートしていません。"pxe" はパーティションイメージを必要とし ```rebuild --preserve-ephemeral``` をサポートしています。
  - "agent" のドライバーによって配置ノードがローカルディスクから boot します。
  "pxe" のドライバーによって配置ノードがローカルディスクから boot できません。そして常に netboot が必要になります。(pxe 経由か、ipxeか、仮想メディアか)

# Upgrade Note
## Icehouse -> Juno
テストされていない、しかし既知の問題がない。

## Baremetal -> Ironic
以前は"Ironic" driver を使うために "baremetal" driver が使われていたが、今は Nova インストールをアップグレードすることで可能です。 
ドキュメントは下記。
- https://wiki.openstack.org/wiki/Ironic/NovaBaremetalIronicMigration

Nova の baremetal driver は Kilo で削除されていることに注意してください。

# Documentation
公式ドキュメントとガイドは、このリリースの OpenStack Documentation program の一環として作成されていない。
Ironic 開発者によって作成されたインストールガイドは、リリースされたコードの ```doc/source/deploy/install-guide.rst``` に含まれている。オンラインで公開されている。
これらのドキュメントのオンライン版は最新リリースでなく現在最新の開発で日付ベースで維持されている。
故に下記リンクは、Juno リリースで使用できない特徴を参照できる。
- http://docs.openstack.org/developer/ironic/deploy/install-guide.html
めんどくせーからgitconfigそのまま晒す

```properties
[user]
	name = Mr. Example
	email = email@example.com
	signingkey = GPGKEY
[gpg]
	program = gpg2
[credential]
	helper = osxkeychain
[commit]
  gpgsign = false
[push]
	default = simple
[fetch]
	prune = true
[pull]
	rebase = true
[color]
	ui = auto
	branch = auto
	diff = auto
	status = auto
[log]
	decorate = true
	abbrevCommit = true
	showSignature = true
[diff]
	noprefix = true
	relative = true
	compactionHeuristic = true
	tool = Kaleidoscope
[rebase]
	autosquash = true
	autoStash = true
[alias]
	wdiff = diff --word-diff
	wshow = show --word-diff
	viz = log --graph --pretty=oneline
	llog = log --pretty=oneline
	slog = log ----shortstat
	changelog = log --date=short --no-merges --pretty=format:'%ad %an <%ae> %n%s%n%b'
	today = log --oneline --since='1 days ago'
	logshow = log --stat
	ci = commit
	co = checkout
	nb = checkout -b
	tar = archive --format=tar HEAD -o
	tgz = archive --format=tgz HEAD -o
	zip = archive --format=zip HEAD -o
	vranch = branch -avv
	staged = diff --cached
	scommit = commit -S
	sfcommit = commit -S -s
	stag = tag -s
	find = !git ls-files|grep
	resetmaster = !git stash && git checkout master && git clean -fdx && git pull --rebase && git stash pop
	overwrite = push --force-with-lease
[mergetool "vimdiff3"]
	cmd = ~/bin/vimdiff3 \"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
[merge]
	tool = Kaleidoscope
[mergetool]
	keepBackup = true
	prompt = false
[filter "lfs"]
	required = true
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
[mergetool "Kaleidoscope"]
[difftool "Kaleidoscope"]
[difftool]
	prompt = false
[mergetool "Kaleidoscope"]
	cmd = ksdiff --merge --output \"$MERGED\" --base \"$BASE\" -- \"$LOCAL\" --snapshot \"$REMOTE\" --snapshot
	trustexitcode = true
[difftool "Kaleidoscope"]
	cmd = ksdiff --partial-changeset --relative-path \"$MERGED\" -- \"$LOCAL\" \"$REMOTE\"
```
reference と ViewController の関係について検証

親コンテナの ViewController から、子のビューの reference を参照

    main --- list
          |- edit

この様な関係で main の中に `reference: 'mainbutton'` があり、
list には `'mylist'` があり、
edit には `'field1'` がある。

list ビューと edit ビューに ViewController がない場合は、
main から `lookupReference()` で、すべてのコンポーネントが参照できる。

しかし、list や edit に対応する ViewController をセットすると、
main の ViewController からは、list や edit のコンポーネントは参照できなくなる。

一方、View (コンテナー: `Ext.container.Container`) にも `lookupReference` メソッドが存在する。

コンテナーの `lookupReference` は、ViewController がセットされているか、
`referenceHolder` プロパティが `true` に設定されていなければ使えない。

先ほどの親子関係でやってもると、edit や list の ViewController を外した状態で、main ビューの lookupReference を呼び出してみると、すべてのコンポーネントの参照を取得できた。

次に edit の `referenceHolder` を `true` にして試すと、main からは参照できなくなり、edit ビューからのみ参照できた。

ここまでの動作で、`reference` を取得する場合には、その参照を保持するビューものであれば参照できる、ということになる。 参照を保持するビューの定義は、ViewController を持っているか `referenceHolder` であるかである。
VagrantをMacで動作させてみた

# VagrantをMacに入れて動作させてみた

MacにVirtualBoxとVagrantをインストールして、Vagrantで仮想マシンを立ち上げ、接続するところまでやってみます。

[VirtualBox](https://www.virtualbox.org/)
[Vagrant](https://www.vagrantup.com/)

## １．VirtualBox Vagrantのインストール

リンクから、Mac OS X版をダウンロードし、インストールします。

[VirtualBox-Downloads](https://www.virtualbox.org/wiki/Downloads)
[Vagrant-Downloads](https://www.vagrantup.com/downloads.html)

インストール後、Vagrantのバージョンを確認します。

```
$ vagrant --version
Vagrant 1.6.2
```
確認できたらBoxを追加します。


## ２．Boxを追加する

Boxは、以下から確認することが出来ます。

[vagrant-box-list](https://atlas.hashicorp.com/boxes/search?utm_source=vagrantcloud.com&vagrantcloud=1)

今回は、CentOS6.5を追加します。

```
$ vagrant box add chef/centos-6.5
```

## ３．仮想マシンを立ち上げる

```
$ mkdir -p ~/vagrant/centos6.5
$ cd ~/vagrant/centos6.5
$ vagrant init chef/centos-6.5
$ vagrant up
```
これでVirtualBox上に仮想マシンが立ち上がります。

## ４．仮想マシンに接続します
```
$ vagrant ssh
```
これで先ほど立ち上げた仮想マシンに接続することが出来ます。
ブランチ切って更新してマージするまでの流れ


# 前提
- masterブランチを本番環境で適用する想定
- developブランチをstg環境で適用する想定

今回は、`develop`ブランチに機能を追加するため、`feature-create-api`というブランチを作成し、後で`develop`ブランチにマージすることを考える。

## 1.developブランチからfeature-create-apiを作成
### 1-1.developブランチへ移動
```
git checkout develop
```

### 1-2.feature-create-apiを作成し、移動する
```
git checkout -b feature-create-api
```

- `-b`オプションをつけると、移動とセットでブランチの作成も出来る
- 現在のブランチは`git branch`で確認可能

#### （おまけ）ブランチの削除 
もしブランチ名を間違えて`feature-creaxxx`としてしまったら、消して作りなおそう！

まず、消したいブランチとは異なるブランチに移動し、ブランチを消す。

```
git checkout develop
git checkout -d feature-creaxxx
```

## 2.feature-create-apiブランチで作業
実装後、

```
git add .
git commit -am "commit message!"
git push origin feature-create-api
```
などとして、remoteに反映。

## 3.developへのマージ作業
### 3-1.マージ先のブランチに移動
```
git checkout develop
```

### 3-2.マージ
```
git merge --no-ff feature-create-api
```
- `--no-ff`オプション：fast-forwardの関係であっても、必ずマージコミットを作る
- 機能追加が見やすいので、僕らのプロジェクトではこの`--no-ff`オプションを使っている
- mergeする時、ローカルのdevelopブランチを最新の状態にするのを忘れずに！（以前筆者は躓いた）

▼（参考）図で分かるgit-mergeの--ff, --no-ff, --squashの違い
http://d.hatena.ne.jp/sinsoku/20111025/1319497900

# おまけ1
## おすすめのgit運用方法
普段gitのブランチをなるべく枝分かれさせないようにし、機能追加の単位でブランチを切るのが個人的なおすすめ。

他の人とpushが交互になる場合、

```
git fetch origin
git rebase origin/master
```

とすれば、ブランチが分かれず1本につながる。

▼（参考）git rebase 失敗した時の対処法
http://qiita.com/shuntaro_tamura/items/c505b76c1021a35ca9ff

機能追加の時は、上記のように`feature-xxx`ブランチを切って

```
git merge --no-ff feature-xxx
```
によりマージするのがおすすめです。

# おまけ2（自分用メモ）
## developへのマージ
```
git checkout develop
git merge --no-ff feature-xxx
```

## masterへのプルリク
```
ブラウザのgithubからプルリク（プルリク後マージされる）
mvn clean deploy
```
実行モジュールとPDBファイルを強制的にマッチさせるツール

本来は実行モジュール(exe,dll)と[同時に生成されたPDBファイルが必要](http://blogs.msdn.com/b/jimgries/archive/2007/07/06/why-does-visual-studio-require-debugger-symbol-files-to-exactly-match-the-binary-files-that-they-were-built-with.aspx)だが、PDBファイルを強制的に書き換えてマッチさせるツール。元ソースコードやコンパイルオプションが完全一致していないと、予期しない結果をもたらすため注意。

http://www.debuginfo.com/tools/chkmatch.html
CentOS7ではSysVinitが廃止されてsystemdが採用されてた


Dockerfileで`RUN service sshd start`としているところで、
serviceコマンドがNotFoundになっていたので気がついた。

現状DockerでCentos7を入れると`fakesystemd`がインストールされていたり、
`yum swap fakesystemd systemd`が失敗したりするので、
Dockerfileの対応としてはCentOS6を使用するように修正した。

```Dockerfile
FROM centos:centos6

...
```

# 参考

Systemdコマンド早見表(CentOS 7対応)
http://blog.yuryu.jp/2014/07/systemd-quick-guide.html

CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する
http://qiita.com/yunano/items/9637ee21a71eba197345
Amazon SES + aws-sdk-v1でメールをActionMailer経由で送信する。

## SDK version2はまだRails Friendlyではないらしい。

aws-sdk-core(aws-sdk v2)でActionMailer経由でメール送信をしようと思っていたが、v2ではまだ実現できないらしい。（もちろんv2のメソッドを使って送信はできる）

### 問い合わせてみた

> @ShotaKameyama The v1 SDK has rails integrations built in that provide a :amazon_ses delivery method configuration option. It uses your AWS credentials to send using the API, and not via smtp. The plan to is to port this into v2. Until this happens, you can safely use both the V1 and the V2 SDK together in the same application (they use different namespaces).
> 
> The rails integrations are on our short list to do soon after 2.0 stable.

ということで、対応方法を軽く教えてもらえたのでその通りにやってみる。

> My suggestion to use both v1 and v2 gems is to use the aws-sdk-v1 gem and the preview release of aws-sdk.

v1とv2はそれぞれ依存関係がなく、namespaceが違うのでそれぞれを同居させることができるらしい。

---

### 前提

 - AWS上でSESの設定が一通り完了していること
 - AWSのproductionのリミッターを解除してもらっていること
 - IAMの設定をしてあること。

###実装編

まずは、GemfileにSDKを追加する。

```rb
# Gemfile

# version2のsdk
gem 'aws-sdk', '2.0.6.pre'
# version1のsdk
gem 'aws-sdk-v1'
```

Initializersにbasicな情報を渡す。

```rb
# config/initializers/aws_ses.rb
AWS.config(
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
    :region => 'ap-northeast-1',
    :ses => { :region => 'us-west-2' }
    )
```

sesのリージョンを `us-west-2` にしたのはSESをサポートしているリージョンの中で東京から一番近そうだったから。（ですよね？）

```rb
# config/environments/production.rb

  # Mailer with Amazon SES
  config.action_mailer.delivery_method = :amazon_ses
  config.action_mailer.default_url_options = { :host => 'hogehoge.com' }
```

これだけ。だいぶ簡単に実装できるようだ。
v2のRails Friendlyな対応も楽しみですね。
JakeWharton製の動画キャプチャアプリ『Telecine』を使ってみた


## 概要
Butter Knife、OkHttp、Picassoでお馴染みの神JakeWharton氏が開発した <a href="https://play.google.com/store/apps/details?id=com.jakewharton.telecine" target="_blank">Telecine</a> を使ってみたのでメモ
Telecineは簡単に動画キャプチャが撮れるアプリになっております

<b>＊ Android 5.0以上でないと使えないので注意</b>

## 実践

### アプリを起動

![1.png](https://qiita-image-store.s3.amazonaws.com/0/40539/d01d3d23-87ee-1ef0-afd4-20a95094044b.png "1.png")

### 録画開始と停止方法

![2.png](https://qiita-image-store.s3.amazonaws.com/0/40539/266b4002-5c3f-db94-4439-52ab8eb4b022.png "2.png")

録画を開始すると右上のランチャーが消えます
初見だとわかりにくいですが、<b>上図の緑丸の部分をタップすると録画が停止されます</b>

### 動画の再生

![3.png](https://qiita-image-store.s3.amazonaws.com/0/40539/3606e594-d6b7-4e60-1070-de5b3800ac1d.png "3.png")

もちろんフォトアプリなどでも見れます

## 感想
screenrecordよりも手軽で便利です。早速業務で使っています。
安心安全のJWクオリティ
1から始めるiOSチーム開発：Apple Developer Programにメンバーを招待する



[表紙](http://qiita.com/kurumaya/items/b204cbb7e83a63279133)

組織や会社形態で開発する場合、はじめに作られる最高権限のアカウントを使い回すのは褒められた行為ではありません。
開発に必要となるApple Developer Programへメンバーを招待する方法をまとめました。

# Apple Developer Program

Apple Developer Programでは証明書、開発者のID、テスト用の端末管理などが行えます。アカウントがない場合、Xcodeで実機テストが行えませんし、アプリのアーカイブも不可能です。
アカウントの権限については、Apple公式「[アプリケーションの配布に関するガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/AppDistributionGuide.pdf)」の143ページを参照してください。

# 必要なもの	

* AgentもしくはAdminのApple Developerアカウント
* 10~20分
* ブラウザはSafari推奨

# Apple Developerへのメンバー招待

メンバーを追加するには、AgentかAdmin権限のあるアカウントでログインしてください。権限は[Apple DeveloperのMember Center > People](https://developer.apple.com/membercenter/index.action#allpeople)で確認することができます。

![00Member_Center_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/15926/fcbbc571-e924-9a15-81f1-b621f34f3fac.png "00Member_Center_Apple_Developer.png")
Member Centerにアクセスしたら、上部の「People」をクリックします。

![01Member_Center_-_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/15926/487d1f6b-562f-6f8e-661a-e8b1d32cd76e.png "01Member_Center_-_Apple_Developer.png")
Apple Developer Programのアカウント一覧が開きます。左の「Invitations」をクリックしてください。

![02Member_Center_-_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/15926/9f2cc5e5-7cd7-c3c1-a572-c7a9585ee432.png "02Member_Center_-_Apple_Developer.png")
「Invite Person」をクリックし、

![03Member_Center_-_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/15926/21e54184-c759-2bfc-5440-6141ca4a901c.png "03Member_Center_-_Apple_Developer.png")
追加したい人の姓・名・メールアドレスを入力します。

![04Member_Center_-_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/15926/ea09a343-4901-2eaa-2c72-e991ab3f66a2.png "04Member_Center_-_Apple_Developer.png")
招待に使用するメールアドレスはApple IDである必要はありません。

![10_Member_Center_-_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/15926/0f758033-5fb5-3fd4-b6fa-6b2efa8fb840.png "10_Member_Center_-_Apple_Developer.png")

![05invite_apple_developer_program.png](https://qiita-image-store.s3.amazonaws.com/0/15926/baea238e-df71-5e38-af03-4393a0055976.png "05invite_apple_developer_program.png")

指定したメールアドレスにAppleからのメールが届きます。
メールを受信した開発者がApple Developerの登録と、招待の受理をしたらメンバーの追加は完了です。
1から始めるiOSチーム開発：序


マスターアカウントの使い回しはやめて清く正しく開発しましょう。
個人開発向けの記事は数あれど、会社や組織のメンバー登録から始まってる解説があまりないのでチームでのiOS開発をフォローしていきます。

~~タイトルはぱくり~~

# 前提

* Apple Developerのマスターアカウントが既にある
* Apple DeveloperのAccount TypeがCompany/Organization
* App Store公開中のiOSアプリがある
* OS X 10.9.4（Mavericks）以降のMacが使える
	* 20GBくらいは空き容量がないときつい

# 扱う範囲

* [Apple Developerへのメンバー招待](http://qiita.com/kurumaya/items/9c007685543f51f14dd2)
* [Apple Developer招待の受理](http://qiita.com/kurumaya/items/47c7af4662d9e6fc8634)
* [iTunes Connectへのメンバー追加](http://qiita.com/kurumaya/items/95dc2a6fc3c080f73706)
* [リモートリポジトリからのチェックアウト、プロビジョニングプロファイル準備](http://qiita.com/kurumaya/items/a3a82c59c6ac41b15fa4)
* [ストア公開（Production）用の証明書の受け渡しとリリースアーカイブ作成](http://qiita.com/kurumaya/items/4cffea1913c492cf0ebf)
* ストアへの公開

既存のアカウントからの新規開発者招待、開発者登録、プロビジョニングプロファイルの作成を経てiTunes ConnectへのSubmitまでを行います。

余裕があれば組織アカウントで新規アプリのストア公開までを書きます。
WordPressのtagの見かけをjQueryでいじってみた

WordPressの「00_」から始まるtagに打ち消し線をつけて、頭に「CLOSE:」をつけるjQuery。

うちのテーマ（Graphene）はheadに書き込みできるオプションが用意されているので、軽い気持ちでやってみました。
「タグの更新は止まっているのだけどリンクは残す」という処理をしたかったのでこんな記述をしました。
「00_」にしたのはCTCの「名前ソートの降順」で下に固めるため。

```js
jQuery(function($){
   $('a.ctc-tag').each(function(){
        if($(this).text().match(/^00_/)){
            $(this).parent().prepend("CLOSE:");
            $(this).css("text-decoration","line-through");
            $(this).text($(this).text().split("00_")[1]);
        }
    });
});
```

「CLOSE:」をaタグの中には入れたくなかったので、親まであがってprependしました。

なお、このテーマ（Graphene）のオプションに2バイト文字を入れると、管理画面に再表示するときに文字化けが発生したりして、管理画面がおかしくなる恐れがあったので、2バイト文字を使っていません。
サーバサイド及びフロントにおける各階層でのパラメータのやりとり（Java、Velocity、TypeScript、Underscore.js_template）


# 前提
  - サーバサイド：Java、Spring
  - サーバサイドテンプレート：Velocity
  - フロント：TypeScript、Backbone.js
  - フロントエンドテンプレート：Underscore.js_template


Java、Velocity、TypeScript、Underscore.js_templateによるパラメータのやりとりをまとめる。

用いるファイル名は、

- TestController.java
- test.vm
- TestView.ts
- Test.html

とする。

## Java　→　Velocity
```TestController.java
model.addAttribute("param_java", param);
```

```test.vm
param_vm="$!{param_java}"
```

で、Java階層からVelocityにパラメータを渡せる。

## Velocity　→　TypeScript
```test.vm
<div id="id1" param_vm="$!{param_java}"></div>
```

```TestView.ts
this.el = '#id1';
this.paramTs = JSON.parse(this.$el.attr('param_vm')); // param_vmが数値など
this.paramTs = this.$el.attr('param_vm'); // param_vmが文字列など
```

で、VelocityからTypeScriptにパラメータを渡せる。

## TypeScript　→　Underscore.js_template
```TestView.ts
this.template = JST['Test'];
this.$el.html(this.template({
    paramTs: this.paramTs
}));
```

```Test.html
{{paramTs}}
```

で、TypeScriptからTemplateにパラメータを渡せる。

## Underscore.js_template　→　TypeScript
```Test.html
<input type="text" name="paramTemplate" value="{{paramTs}}" /> <label>テストパラメータ</label>
```

```TestView.ts
var paramTs:string = this.$('[name= paramTemplate]').val();
```

で、Templateでの入力内容をTypeScript階層に渡せる。

## TypeScript　→　Velocity
運用上この必要性を感じたことはない。

## Velocity　→　Java
運用上この必要性を感じたことはない。
scalaz - STモナド


[独習Scalaz エフェクトシステム](http://eed3si9n.com/learning-scalaz/ja/Effect-system.html)を読んだときのメモ。

> State モナドに似ているけども、違いは状態が可変で上書きされていることと、その引き換えとして状態が外から観測できないことにある。

## 定義

STの定義

```scala
sealed trait ST[S, A] {
  private[effect] def apply(s: Tower[S]): (Tower[S], A)
```

STはeffect内で実行可能なものらしい。

## newVar

STを作るには、newVarかnewArrを使う。

ますはnewVarを使ってみる。

```scala
val stf: Id ~> ({type λ[A]=ST[Int, STRef[Int, A]]})#λ = ST.newVar[Int]
```

newVarすると、STRefが使われる。NaturalTransformationに包まれているので実行する。

```scala
val st1: ST[Int, STRef[Int, Int]] = stf(1)
```

STは、map/flatMapを持っているのでforが使える。

STRefは、writeやreadなどの関数を使い値を書き変えていく。これらの関数はSTを返す。

```scala
def f[S]: ST[S, Int] = for {
  a <- ST.newVar[S](0) // a: STRef[S, Int]
  _ <- a.write(0)
  _ <- a |= 0 // writeのalias
  _ <- a mod (_ + 1) // 関数で書き変えれる
  b <- a.read // b: Int
} yield b
```

STから値を取り出すには`runST`を使う。

runSTはForallをを受け取る。

```scala
ST.runST {
  new Forall[({type λ[S] = ST[S, Int]})#λ] { def apply[S] = f[S] }
}
// 1
```

## newArr

newArrはSTArrayを返す。

```scala
def f[S]: ST[S, ImmutableArray[String]] = for {
  st <- ST.newArr[S, String](1, "a") // STArray作成
  _  <- st.write(0, "b") // 0番目を"b"に
  _  <- st.update[String]((b, v) => b + v, 0, "!") // 0番目に!追加
  ia <- st.freeze // immutableなarrayで返す
} yield ia

val ia = ST.runST {
  new Forall[({type λ[S]=ST[S, ImmutableArray[String]]})#λ] { def apply[S] = f[S] }
}
ia(0) // b!
```

これを使ったFoldableな関数があった。`ST.accumArray`だ。

```scala
def accumArray[F[_], A, B](size: Int, f: (A, B) => A, z: A, ivs: F[(Int, B)])(implicit F: Foldable[F], mf: Manifest[A]): ImmutableArray[A]
```

```scala
ST.accumArray[List, String, String](
  2, // size
  _ + _, // 結合する
  "a", // 初期値
  (0, "!") :: (1, "?") :: Nil // 0番目は!を渡す。
).toList
// List(a!, a?)
```

STの使用例として勉強になった。

## Tower

STの定義をもう一度。

```scala
sealed trait ST[S, A] {
  private[effect] def apply(s: Tower[S]): (Tower[S], A)
```

Towerの定義

```scala
private[effect] case class Tower[A]()

sealed trait IvoryTower

object IvoryTower extends IvoryTowers

trait IvoryTowers {
  private[effect] val ivoryTower = Tower[IvoryTower]()
}
```

Towerはeffect内でしか使わないので、実際に触ることはなさそう。

Towerは、[昔はWorldだった](https://github.com/scalaz/scalaz/commit/c8769aa2aa1f27da7266f4c8b0308cf4480d6d40)ようだ。IvoryTowerはRealWorldだった。[ここに](https://github.com/scalaz/scalaz/issues/271)IvoryTowerになった経緯が書いてある。

STとIOは似ていて、STは変数を構造の更新。IOは入出力を行う。

そのため、STは`Tower[S]`と何かの型を取れるが、IOは環境を表す`Tower[IvoryTower]`と固定になっている。

完全には理解できてないけど、雰囲気は分かったのでよしとしよう。

次はIOだ。
ライトニングトークに対抗してワンフレーズトークというのを思いついた

エンジニア勉強会における発表のフォーマットとして、ライトニングトーク (LT) はかなり普及していると言っていいでしょう。
発表時間を 5 分に制限することで、話し手は比較的手軽に準備ができ、聞き手も気軽に参加することができます。

そんなライトニングトークに対抗する発表のフォーマットとして、ワンフレーズトークというのを考えてみました。
今朝思いついてみて一度も実行していない、妄想レベルのものですが、実際にやってみると面白いんじゃないかと思っています。

# ワンフレーズトークとは

* ライトニングトークと同様、一般的なものよりも軽量化した発表フォーマット
* 発表者は初めに主題となるワンフレーズ (「推測するな、計測せよ」とか「単一責任原則」とか) を紹介する
* 残りの時間は、そのフレーズの背景・思想や実装例等、そのフレーズを説明することだけに集中する
* 発表時間の制約はないが、5 分でもよいし数十分の長いものでもよい

もちろん、このようなフォーマットでの発表は世の中でいくらでも行われており、全く新しいものではありません。
ですが、名前をつけて、積極的にこのフォーマットを採用することで、価値がはっきりしてきて面白いんじゃないかと思います。

# ワンフレーズトークの良さそうなところ

とにかく、フォーマットが決まっていて、シンプルである、ということに尽きます。

一般的に、わざわざ準備への労力をかけてまで発表したいという人は、そのトピックに関する情熱を強く持っており、ともすればあれもこれもと話を詰め込みがちです。
(※なお、ここでは発表者が持ち寄りで無報酬で行う発表を想定しています)

ですが、「ワンフレーズの紹介」として内容を制約することで、必然的に詰め込みができなくなります。
もちろん、そのフレーズについての歴史や厳密な定義等を詰め込むことはできますが、全ては「そのフレーズに関連する枝葉末節」に過ぎないので、聞き手は部分的にわからないところがあっても、大意は見失わずにいられると思います。

なので、発表者と聞き手のスキルの差が大きくても、身になりやすいのではと考えます。
詳細までは理解できなくとも、そのフレーズを知ることで「そういう概念があるんだな」とか、「そういうところに価値を見出すんだな」といった点なら理解できると思うからです。

# ライトニングトークとの比較

比較するにあたって、ライトニングトークにどういう利点があるかを挙げます。
これらはいずれも個人的に感じるものというだけで、「一般的にそうであるとされている」かどうかまではわかりません。

## ライトニングトークの利点

* 通常の発表と比較して、少ない労力で準備できる
* 人前で話すことが苦手な人にとっても、少ない負荷で発表できる
* その分野における知識の少ない初学者でも、発表者として参加する障壁が比較的低い
* 聞き手は、より長い発表と比較して、気軽に参加することができる
* 短い時間の中により多くの発表ができるので、バラエティに富んだ話を聞くことができる

## ワンフレーズトークではどうか

* 「ひとつのフレーズを紹介する」という目的がはっきりしているので、必要以上に話を広げて労力をかけるリスクが少ない
* フォーマットが決まっているので、物事を順序立てて話すのが苦手でも、とりあえず組み立てることができる
* 初学者でも、とにかくそのワンフレーズについて調べまくることで、発表者として参加しやすそう
* 聞き手は、例え内容が高度でも、「よくわかんないけど最初のフレーズについての説明なのね」という点は明確なので、聞いていて迷子になりにくい
* 時間についての制約はないが、長い発表にはなりにくいので、それなりのバラエティは確保できそう

このように、ライトニングトークが持つ価値と近いものを持っています。
とはいえそれぞれは排他的なものではなく、5 分間のライトニングトークにおいて、フォーマットとしてワンフレーズトークを採用することもできます。
それでいて逆に、もっと長い時間の発表においても採用することができます。

# まとめ

以上、机上の空論でした。
とはいえおもしろいものになりそうな気はしてるので、社内の勉強会でやってみようと思ってます。
また、パブリックな勉強会としても、ある程度トピックを絞った上で、会場を借りてやれないかなーとか思ってみたり。

皆さんもよければやってみて、感想等コメントください。
JavaScript からの HTTP Request で . と - を Percent-encoding する方法

`%` を `%25` にする感じ。

`%2D` -> `%252D`
`%2E` -> `%252E`


## NG

`%2D%2E` が `-.` に変換されて Request されてしまう。

```html
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title> - . </title>
  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  <script type="text/javascript">
    $(function(){
        $.ajax({
          type: 'post',
          url: '/hahaha/%2D%2E',
          data: {
          },
          success: function(data){
            console.log(data);
          }
        });
    });
  </script>
</head>
<body>
hoge
</body>
</html>
```

## OK

```html
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title> - . </title>
  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  <script type="text/javascript">
    $(function(){
        $.ajax({
          type: 'post',
          url: '/hahaha/%252D%252E',
          data: {
          },
          success: function(data){
            console.log(data);
          }
        });
    });
  </script>
</head>
<body>
hoge
</body>
</html>
```
Java1.7以上では、abstractメソッドにもアノテーションが適用される

フレームワーク層などでリフレクションを使っていて、Javaのバージョンを1.6から上げる場合は挙動の違いに要注意

## 確認環境
MacOS X(10.9.5)
jdk1.6.0_65(MacOS付属のjdk)
jdk1.7.0_71
jdk1.8.0_25

## サンプルコード

```java
public abstract class Parent {
    public abstract Number someMethod();
}

public class Child extends Parent {
    @Override
    @Sample
    public Integer someMethod() {
        return 1;
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Sample {
}

public class CheckHasSampleAnnotation {
    public static void main(String[] args) {
        for (Method method : Child.class.getMethods()) {
            Sample annotation = method.getAnnotation(Sample.class);
            if(annotation != null) {
                System.out.println("----- [" + method + "] has @Sample. -----");
            } else {
                System.out.println("[" + method + "] doesn't have @Sample.");
            }
        }
    }
}
```

### 出力結果
#### Java1.6
```
----- [public java.lang.Integer Child.someMethod()] has @Sample. -----
[public java.lang.Number Child.someMethod()] doesn't have @Sample.
[public final void java.lang.Object.wait() throws java.lang.InterruptedException] doesn't have @Sample.
[public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException] doesn't have @Sample.
[public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException] doesn't have @Sample.
[public boolean java.lang.Object.equals(java.lang.Object)] doesn't have @Sample.
[public java.lang.String java.lang.Object.toString()] doesn't have @Sample.
[public native int java.lang.Object.hashCode()] doesn't have @Sample.
[public final native java.lang.Class java.lang.Object.getClass()] doesn't have @Sample.
[public final native void java.lang.Object.notify()] doesn't have @Sample.
[public final native void java.lang.Object.notifyAll()] doesn't have @Sample.
```

#### Java1.7, 1.8
```
----- [public java.lang.Integer Child.someMethod()] has @Sample. -----
----- [public java.lang.Number Child.someMethod()] has @Sample. -----
[public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException] doesn't have @Sample.
[public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException] doesn't have @Sample.
[public final void java.lang.Object.wait() throws java.lang.InterruptedException] doesn't have @Sample.
[public boolean java.lang.Object.equals(java.lang.Object)] doesn't have @Sample.
[public java.lang.String java.lang.Object.toString()] doesn't have @Sample.
[public native int java.lang.Object.hashCode()] doesn't have @Sample.
[public final native java.lang.Class java.lang.Object.getClass()] doesn't have @Sample.
[public final native void java.lang.Object.notify()] doesn't have @Sample.
[public final native void java.lang.Object.notifyAll()] doesn't have @Sample.
```
gruntでnode-webkit

ハマりかけたのでメモ。

# gruntでnode-webkit

gruntでnode-webkitアプリをビルドします

## grunt-node-webkit-builderをインストール

```bash
$ npm install --save-dev grunt-node-webkit-builder
```

## package.jsonを編集

```js:package.json
// ...省略...

    "window": {
        "title": "node-webkitアプリ",
        "width": 360,
        "height": 480,
        "toolbar": false,
        "frame": true
    }

// ...省略...
```

## Gruntfile.jsを編集

```js:Gruntfile.js

// ...省略...

    grunt.loadNpmTasks('grunt-node-webkit-builder');

// ...省略...

    grunt.initConfig({

// ...省略...

        nodewebkit: {
            main: {
                options: {
                    version: "0.11.5",
                    platforms: ["win", "osx"],
                },
                src: [
                    "images/**",
                    "sounds/**",
                    "main.html",
                    "build/myapp.min.js",
                    "package.json",
                    "README.md",
                ],
            },
        },

// ...省略...

```

ポイントはoptions.version。
規定値は'latest'なのですが、アルファ版など動作しないバージョンのnode-webkitが選ばれた場合にビルドが通らなくなります。
[http://dl.node-webkit.org/](http://dl.node-webkit.org/)に置かれている、正常に動くバージョンを指定しましょう。

## ビルド

```bash
$ grunt nodewebkit
```

build/{プロジェクト名} フォルダ以下に各プラットフォーム向けフォルダが切られ、その中にアプリケーションが作成されます。

## できたー！

![Clipboard02.png](https://qiita-image-store.s3.amazonaws.com/0/30568/007d36f8-5949-96b7-22c4-9d1c8cc5a075.png)

ﾜｰ､ﾏﾙﾃﾞﾎﾝﾓﾉﾉｹﾞｰﾑﾐﾀｲ!
fputs$UNIX2003 fwrite$UNIX2003 でエラーが出たら

## 開発環境
OS X 10.9.5
Xcode 6.1.1 (6A2008a)
Cocos2d-x 3.3

## 現象
Cocos2d-x 3.3 で作っていたアプリをシミュレータでビルドしようとした時に発生。
i386でシンボルが見つからないとの事。

Cocos2d-x 3.3rc0以前では、fwrite\$UNIX2003やstrerror\$UNIX2003が無いことでエラーになることはあったが、3.3 finalではCCImage内で定義されていてエラーは出なくなっている。

## 対処法
足りていない関数を.cにゴリゴリ書くことで解決。

```lang:UNIX2003.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

/* 必要ならコメントイン
FILE *fopen$UNIX2003( const char *filename, const char *mode )
{
    return fopen(filename, mode);
}
size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
{
    return fwrite(a, b, c, d);
}
char* strerror$UNIX2003(int errornum){
    return strerror(errornum);
}
*/

int fputs$UNIX2003(const char *res1, FILE *res2)
{
    return fputs(res1,res2);
}

int nanosleep$UNIX2003(int val)
{
    return usleep(val);
}
double strtod$UNIX2003(const char *nptr, char **endptr)
{
    return strtod(nptr, endptr);
}


```
VirtualBoxでInsertGuestAdditionsCDImageをしたらエラーが表示された時


ゲストOSとして、KaliLinuxをインストールが完了した後、Insert Guest Additions CD Imageをしたものの下記のようにオートランのエラーが出て実行出来なかった時の対処
![スクリーンショット 2015-01-14 17.00.42.png](https://qiita-image-store.s3.amazonaws.com/0/23194/ecd7c1cf-4bde-7d65-dd96-7ae7f136bb8d.png)

# 対処法
端末から下記を実行すればOK

```sh
sh /media/cdrom0/VBoxLinuxAdditions.run
```

# 結果
![スクリーンショット 2015-01-14 16.56.07.png](https://qiita-image-store.s3.amazonaws.com/0/23194/9a146ab2-14b2-d56f-6a29-41bbe6d1a706.png)

これで、ディスプレイサイズが1024x768以上が選べたりするようになるので、作業が楽になりますね！
Vagrantに構築したゲストOS(Linux)のシステム日付を変更する方法

ローカル環境で、vagrantを構築して、開発を行っていると、システム日付を変更したいときが発生しますね。

ただ、vagrantで構築していると、dateコマンドで変更しても、すぐに、ホストOSの時計と同期してしまう現象がおこってしまいます。

その場合、ゲストOSにログインして、以下のコマンドを叩くと、ホストOSとの同期が止まります。


```bash
service vboxadd-service stop
```
***root権限で実行しましょう***
JavaScriptでURLを遷移させる方法


HTMLによる遷移は、

```html
<a href="パス名">◯◯</a>
```

JavaScriptによる遷移は、

```js
window.location.href = 'パス名'; // 通常の遷移
window.open('パス名', '_blank'); // 新しいタブを開き、ページを表示
```
複数選択可能な画像入りのセレクトボックス

AngularJsのui-selectを使って、複数選択可能な画像入りのセレクトボックスの実装方法を紹介します

![スクリーンショット 2015-01-05 18.06.38.png](https://qiita-image-store.s3.amazonaws.com/0/50682/e0bb343b-41de-1923-97b4-dd95c140899c.png)

参照：https://github.com/angular-ui/ui-select


``` lang:html

<body ng-controller="DemoCtrl">

<ui-select multiple ng-model="demo.selectedColor" theme="bootstrap" close-on-select="false" reset-search-input="true">

<ui-select-match placeholder="選択してください">

<img ng-src='{{$item.img}}'>{{$item.name}}

</ui-select-match>

<ui-select-choices repeat="color in colors | filter: {name: $select.search}">

<img ng-src='{{color.img}}'>{{color.name}}

</ui-select-choices>

</ui-select>

</body>

```

``` lang:js

angular.module('app') .controller('DemoCtrl', function ($scope) {


$scope.color = {};

$scope.colors = [

{ name: 'red',      img: 'img/red.jpg' },

{ name: 'blue',    img: 'img/blue.jpg' },

{ name: 'yellow', img: 'img/yellow.jpg' }

];


$scope.demo = {};

$scope.demo.selectedColor = [$scope.colors[0]];

});


```

■ multiple
ui-selectを複数選択可能のセレクトボックスにする(指定なしの場合は単一選択)

■ close-on-select

false : 項目選択しても選択リスト一覧を閉じない

true : 項目を選択すると選択リストが閉じる

■ reset-search-input

false : 項目選択後もフィルターの条件を維持する

true : 項目選択後はフィルターの条件をリセットする
Facebook  SDK for PHP v4.0 の使えるまとめ

## SDKのダウンロード

下記ページのDownload the PHP SDKからダウンロード

https://developers.facebook.com/docs/php/gettingstarted/4.0.0?locale=ja_JP



## インポート


```
require("../vendor/autoload.php");

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
```

## セッション

```
FacebookSession::setDefaultApplication(APP_ID, APP_SECRET);
$session = new FacebookSession({有効なアクセストークン});
```

## リクエスト

例：

```
$request = new FacebookRequest($session, 'GET', '/me');

$response = $request->execute();
```

FacebookRequestの引数

第一引数：FacebookSession

第二引数：httpMethod(GET,POST,DELETE)

第三引数：path(/me,/{pageID}/feedなど)


$request->execute(); でリクエスト内容を実行します。

戻り値は、取得した内容が返ってきます。


## バッチリクエスト


例：


```
$requestArr[] = array('method' => 'GET',  'relativeurl' => '/me');

$requestArr[] = array('method' => 'GET',  'relativeurl' => '/me');

$request = new FacebookRequest($session, 'POST', '/?batch=' . jsonencode($requestArr));

$response = $request->execute();
```

配列に単体のリクエスト用の配列を用意し、jsonencodeしたものをPOSTします。


バッチリクエストは、大量のリクエストを一回のリクエストで値が取得できます。
リクエスト数の制限があるため、大量のリクエストをする場合はバッチリクエストを使うといいです。
バッチリクエストで一度にリクエストできるのは５０までです。
Facebook APIを使う時の予約投稿の注意点

Facebook APIを使ってFacebookを操作するアプリケーションを作る時、予約投稿の取り扱いで苦労したので、その時の注意点を挙げます。

## 既に投稿されている内容を取得したいとき

```
ページID/feed
```

でフィードの内容を取得します。

## まだ投稿されていない予約投稿のIDを取得したいとき

```
ページID/promotable_posts?is_published=false
```
でアクティビティログに保持されている投稿の内容を取得します。


上記のように取得した投稿をデータベースで管理したい場合、「id」属性で投稿IDを取得して利用するのが一般的です。

## 投稿後には別のIDに変わってしまう
ここで注意する点として、「画像を付与した」予約投稿を行った場合、アクティビティログに保存される投稿IDと、投稿後にフィードに保存される投稿IDは別のIDになります。

よって、予約中の時点の投稿IDを保存していた場合、投稿後には別のIDに変わってしまうため、投稿前のIDで投稿内容を取得できなくなります。

この現象の対策としては、投稿後に投稿予定時間と、投稿の本文の２つでフィードの投稿を検索し、再度IDを取得するのがよいと思われます。（Facebookの制限で短時間に同内容の投稿はできなくなっているため。）
= で終わるメソッドの返り値は (だいたい) 無視される



= で終わるメソッドの返り値に関わらず、代入式の値は右辺の値になる。

> Methods that end with an equals sign indicate an assignment method. For assignment methods the return value is ignored, the arguments are returned instead.
> [File: methods.rdoc [Ruby 2.2.0]](http://ruby-doc.org/core-2.2.0/doc/syntax/methods_rdoc.html)


```ruby
class Person
  def name=(v)
    @name = v
    "Name assigned" # 返り値
  end
end
person = Person.new
p(person.name = "labocho") #=> "labocho"
```

```ruby
class Person
  attr_reader :id
  def id=(v)
    @id = v.to_i
  end
end
person = Person.new

# 代入式が連続する場合
# いっけん id == person.id に見えるが...
id = person.id = "123"
p person.id #=> 123
p id #=> "123"
```

ただし send を使った場合は通常のメソッドと同様、メソッドの最後の文の値になる。

```ruby
class Person
  def name=(v)
    @name = v
    "Name assigned"
  end
end

person = Person.new
p(person.send(:name=, "labocho")) #=> "Name assigned"
```
Font awesomeでハマっていたCross-Origin Resource Sharingの対応した方法

## S3 => CloudFrontをつかってAssets管理してます

自分の構築しているアプリケーションでは、S3 => CludFrontを通してassetsを呼び出している。主にEC2へのGetの回数を減らすためと、ページの読み込みスピードを上げるためにやっている。assetsのコンパイルは[asset-sync](https://github.com/rumblelabs/asset_sync)を利用。

## Font AwesomeがChromeとFFで表示されない

ところがFont Awesomeを[Font AwesomeのGem](https://github.com/bokmann/font-awesome-rails)で構築した時に、ChromeとFireFoxで豆腐現象が起こり、表示されなくなった。

## Font AwesomeのCDNを使って解決

Qiita含めて英語を含むいろんなドキュメントを読んだのだが、（自分の技術力不足や読解力不足も手伝って）なかなか解決をせず苦悶していたところ、[HTML5 experts](http://html5experts.jp/jxck/3102/)でGoogle Hosted Libraryのことを書いていたのを思い出し、[Font Awesomeで提供しているCDN](http://fortawesome.github.io/Font-Awesome/get-started/)でやればいいんじゃね？ということで、入れてみた。

```rb
= stylesheet_link_tag "//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css"
```

結果無事表示された。（しかも読み込みが気持ち早くなってる？）

[rack-cors](https://github.com/cyu/rack-cors)/Nginx/S3/CloudFrontでFont Awesomeのために色々いじくったが結局必要なくなった。