OmniAICreator/Qiita-1.07M huggingface dataset:
Rapid-SSL更新の手順 (Nginx編)

参考にした記事
・[Nginx + rapid-ssl導入 – わかりやすいよ](http://qiita.com/kmusiclife/items/aac4589f8ad7512a93f3)
・[Nginx + Rapid SSL更新超簡易版](http://qiita.com/sue738/items/afbe815ad680885cd900)

##申し込み編
・「Rapid SSL ワイルドカード」を選択
・ CSR作成ツールに入力し、秘密鍵とCSRを作成
**・秘密鍵(cert.key)とCSR(cert.csr)が表示されるので、保存。絶対忘れないこと！**

```秘密鍵(cert.key)
-----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END RSA PRIVATE KEY-----
```

```CSR(cert.csr)
-----BEGIN CERTIFICATE REQUEST-----
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-----END CERTIFICATE REQUEST-----
```

■CSRをコピペ
■証明書管理者/技術者/経理担当者を入力
■内容確認
この時点でSSL証明書管理者に「注文控えのメール」が届きます。
■代金支払い

##ファイル承認の手順
■入金完了後、ファイル承認の手順について書かれたメールが届くので、それを参考にファイル承認の作業に入ります。
■指定ファイル名や指定内容(PIN)はメールに記載されています。

**手順**
1) 新しい空のファイルを指定ファイル名で作成して下さい。
2) 作成したファイルに以下の指定内容(PIN)を書き込んで下さい。htmlタグ等は不要です。
3) 確認ＵＲＬでジオトラスト社システムがアクセスできるように、作成したファイルをＷＥＢサーバへアップロードして下さい。
4) ジオトラスト社システムが確認ＵＲＬへ対しアクセスし、ファイル内容を比較確認いたします。（確認が出来るまで時間を空けて繰り返しアクセスいたします）
5) 確認が取れましたら承認作業が完了し、ジオトラスト社の審査を経て証明書発行となります。

**■暗号キーのメールの受け取り**
SSLサーバ証明書と中間証明書が届くので確認
*クロスルート対応の中間証明書を使用する場合は、メールに記載されている専用のURLから取得できます。)


```SSLサーバ証明書
-----BEGIN CERTIFICATE-----
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-----END CERTIFICATE-----
```

```中間証明書
-----BEGIN CERTIFICATE-----
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-----END CERTIFICATE-----
```


##更新編
**・サーバ証明書＋中間証明書を連結**
合体証明書(cert.pem)を**nginx/ssl**に保存。

```合体証明書(cert.pem)
-----BEGIN CERTIFICATE-----
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-----END CERTIFICATE-----
```

・cert.keyとcert.pemが手元にあるか確認
**・Nginxのconfファイルを書き換える**

```
server {

    listen 443;
    server_name yourdomain.com;
    ssl on;

    # 秘密鍵 (cert.key ※1)
    ssl_certificate_key  /etc/nginx/ssl/cert.key;

    # 合体証明書 (cert.pem ※2)
    ssl_certificate      /etc/nginx/ssl/cert.pem;

    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    access_log /var/log/nginx/ssl_yourdomain.com.log;
    error_log /var/log/nginx/ssl_yourdomain.com.error.log;
    root /var/www/yourdomain.com;
    index index.php;

}
```

##最後に
 `nginx -t`コマンドを入力し、Rapid-ssl登録時のパスワードを入力し、再起動。
[Swift]Xcode6.1で確認済み！Hello Worldの次に試したい！超簡単にpickerViewを表示してみる


## 1・新規ProjectをSingleViewで作成する

ここではpickerSampleというプロジェクト名で作成しています。


![スクリーンショット 2014-09-03 23.31.52.png](https://qiita-image-store.s3.amazonaws.com/0/15812/068bd5bb-8667-47e2-6f24-3925d45d003c.png)


![スクリーンショット 2014-09-03 23.32.06.png](https://qiita-image-store.s3.amazonaws.com/0/15812/f8051d05-dbb4-4b36-e085-a7b3b80b04d9.png)


![スクリーンショット 2014-09-03 23.32.20.png](https://qiita-image-store.s3.amazonaws.com/0/15812/b4cb6ead-e482-a5eb-1a0c-108633da9674.png)



## ２・Main.storyboardを選択する。そしてユーティリティエリアからwebviewを選び、viewControllerへpickerを貼付ける


![スクリーンショット 2014-09-03 23.33.39.png](https://qiita-image-store.s3.amazonaws.com/0/15812/d88f8f74-f650-2e48-de96-b3479d4bce27.png)


![スクリーンショット 2014-09-03 23.33.50.png](https://qiita-image-store.s3.amazonaws.com/0/15812/5c068e02-3e00-a784-4f1b-a41afde6487c.png)



## ３・Connection Inspectorに移動しview Controllerへdelgateを追加する


![スクリーンショット 2014-09-03 23.34.04.png](https://qiita-image-store.s3.amazonaws.com/0/15812/20da1952-a25f-05c9-0a91-5a049e2c195f.png)


![スクリーンショット 2014-09-03 23.35.42.png](https://qiita-image-store.s3.amazonaws.com/0/15812/97bb6e99-409c-dc68-075d-7dbde94955f7.png)

## ４・view Controllerを以下のように修正する。

```swift
//
//  ViewController.swift
//  pickerSample
//
//  Created by g08m11 on 2014/09/03.
//  Copyright (c) 2014年 Bloc. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate {
  
  var stations = ["渋谷", "新宿", "六本木", "東京"]
  
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
  
  
  func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int {
    return 1
  }

  func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int{
    return stations.count
  }

  func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String!{
    return "\(stations[row])"
  }
  
  
  
}


```

## ５・指定した「"渋谷", "新宿", "六本木", "東京"」が表示されれば完成

白い画面が数秒表示されますが、慌てずに待ちましょう。

![swift_1.gif](https://qiita-image-store.s3.amazonaws.com/0/15812/7ceb0fc8-ff0c-9df4-9f5c-48a0f38efd47.gif)


<br>
Reveal.js | Yeoman + Reveal.js 構成について

# Reveal.js | Yeoman + Reveal.js 構成について

## 概要
Yeoman + Reveal.js 構成について

Yeoman を利用することで、効率よく Reveal.js のスライドを開発することが可能です。
Yeoman を構成する各要素、 Yeoman と Reveal.js の連携についてまとめます。

## Yeoman とは？
Web App開発の生産性を上げるワークフローを提供してくれるツールセット。
Generator , Package Manager, Build System から構成され、
代表的な組み合わせが、 

* Generator : Yo
* Package Manager : Bower
* Build System : Grunt

です。

## Yo とは？
Google 社製の Generator 。
Rails の Scaffold や Generator に当たるツール。

## Bower とは？
Twitter 社製の Package Manager 。
HTML, JavaScript, CSS のパッケージ管理を行う。

## Grunt とは？
Build System 。
build , 静的解析, minify などのタスクを管理する。

## Yo / Bower / Grunt のインストール
node.js , npm はインストール済みの想定。

~~~bash
$ npm install -g bower yo grunt-cli

$ yo --version
1.2.1
$ grunt --version
grunt-cli v0.1.13
$ bower --version
1.3.9
~~~

## Reveal 用の Generator をインストール

~~~bash
$ npm install -g generator-reveal
~~~

## Yeoman を利用して、 Reveal.jsの スライドを作成

~~~bash
$ mkdir yeomen_revealjs
$ cd yeomen_revealjs
$ yo reveal
# 対話形式で質問されるが、最初の質問のみ「Reveal.js slide dev with Yeoman」と入力し、
# 残りは全てデフォルトを選択
~~~

* ひな形が生成されました

※1階層目だけ確認

~~~bash
$ tree -L 1 -a
.
┣ .bowerrc
┣ .editorconfig
┣ .gitignore
┣ .jshintrc
┣ .yo-rc.json
┣ bower.json
┣ Gruntfile.coffee
┣ js
┣ node_modules
┣ package.json
┣ slides
┗ templates
~~~

* ライブラリのインストール

~~~bash
# ※git protocolが利用出来ない場合は、gitで下記設定を行っておく
$ git config --global url."https://".insteadOf git://

$ bower install
# => ./bower_components に各ライブラリがインストールされます
~~~

* 確認用サーバーの起動

~~~bash
$ grunt serve
~~~

* 各スライドのひな形をMarkdownで生成

~~~bash
$ yo reveal:slide "Generate" --markdown
     info Using Markdown.
     info Appending slides/generate.md to slides/list.json.
   create slides\generate.md
$ yo reveal:slide "Manage Package" --markdown
     info Using Markdown.
     info Appending slides/manage-package.md to slides/list.json.
   create slides\manage-package.md
$ yo reveal:slide "Build" --markdown
     info Using Markdown.
     info Appending slides/build.md to slides/list.json.
   create slides\build.md
$ grunt dist
~~~

* 各スライドを手動編集

下記の編集中は、 `grunt serve` を実行したままにしておけば、画面に最新状態が反映されます。

例： ./slides/index.md の編集

~~~markdown

# Reveal.js slide dev with Yeoman

### Yeoman を使って  <!-- .element: class="fragment roll-in" -->
### Reveal.js のスライドを  <!-- .element: class="fragment roll-in" -->
### 楽々作成  <!-- .element: class="fragment roll-in" -->
~~~

* GitHub にプロジェクトを作成しておく
* dist ディレクトリに移動

~~~bash
$ pwd
/path/to/project
$ cd dist
~~~

* *gh-pages* ブランチを作成

~~~bash
git checkout -b gh-pages
~~~

* deploy

本当は

~~~bash
$ grunt deploy
~~~

で、いいのだと思うのですがうまくいかなかったので

~~~bash
$ git push remote_name gh-pages
~~~

でデプロイしました。

* 完成。スライドを確認します。

http://tbpgr.github.io/yeoman_revealjs/#/

## 補足1
Chromeでスライドを開いた際に、 URLに「?print-pdf」を付与して
印刷メニューから「PDFに保存」を選ぶことでスライドをPDFとして保存できます。

## 補足2
Windows環境の場合、 cygwin だと一部の機能が動作しない場合がある。
その場合は、コマンドプロンプトを利用する。

## 参照
Yeoman Official
http://yeoman.io/

Yo GitHub
https://github.com/yeoman/yo

Bower Official
http://bower.io/

Grunt Official
http://gruntjs.com/

Grunt GitHub
https://github.com/gruntjs/grunt

Reveal.js generator
https://github.com/slara/generator-reveal
公式Moduleの追加方法


今回はModule Filterを入れてみます。

### Moduleを探す
公式サイトのModuleページで目的のModuleを探す。
https://www.drupal.org/project/project_module


### URLをコピーする。
Moduleが見つかったら、tar.gzのリンクをコピーします。
https://www.drupal.org/project/module_filter

### 追加する。
moduleぺーじの"install new module"をクリックし、
先ほどのリンクをペーストします。
後は、インストールボタンを実行で完了です。


### インストールできない場合
手動で入れる事もできます。ModuleのページからファイルをDLします。
ファイルを解凍し、Drupal内の/all/modules/内にファイルを展開。
あとは、Moduleページでchekboxをアクティブで動きます。
VPC Peeringの設定

# VPC Peeringとは
2つのVPC間の通信を外部ネットワーク経由でなくL3ネットワーク経由で、でVPC間の相互に通信ができるサービスです。

VPC Peeringの概要や利用する際の注意点（IPアドレスの重複は避けようとか、は公式ブログが詳しいです。

* Amazon Web Services ブログ  
[【AWS発表】Amazon Virtual Private CloudでVPCピアリング (VPC間接続)が可能に](http://aws.typepad.com/aws_japan/2014/04/new-vpc-peering-for-the-amazon-virtual-private-cloud.html)
* AWS Solutions Architect ブログ  
[VPC Peeringの使いどころとTips等々](http://aws.typepad.com/sajp/2014/04/vpc-peering-tips.html)
* Developers.IOブログ  
[Amazon VPC Peeringの技術的考察と留意点](http://dev.classmethod.jp/cloud/vpc-peering-restricts-and-considerations/)

# やりたいこと
* AWSアカウントAのVPC-A(10.0.0.0/16）にZabbix Serverを用意し、AWSアカウントBのVPC-B（10.45.0.0/22）にZabbix AgentをインストールしたEC2インスタンスを用意して監視する。そのためのVPC Peeringの設定方法を記載します。

## 概要図

![こんな構成で作りたい](https://qiita-image-store.s3.amazonaws.com/0/34281/1515de7d-10b2-a5f1-55df-32d61863b7ed.png)

# 手順
## VPC Peeringを設定する
VPC-A(10.0.0.0/16）とVPC-B（10.45.0.0/22）間で通信ができるようにVPC Peeringを設定する

### VPC-A側でVPC Peering Connectionを作成する  
VPC DashboardからPeering Connectionsを選択し、右側画面上部「Create VPC Peering Connection」をクリック。  
![VPCsetting1](https://qiita-image-store.s3.amazonaws.com/0/34281/1b5e2e8f-2b80-f57d-3826-811e40a91d99.jpeg)  
  
VPC Peering Connectionの設定を行う  
![VPCsetting2](https://qiita-image-store.s3.amazonaws.com/0/34281/71353b79-b60c-abe7-a1d6-c85b99de466c.jpeg)  
  
| 項目名 | 説明 |
|:-----------|:-----------|
| NameTag       | VPC Peeringのネームタグ |
| Local VPC to peer | 設定する接続元VPCの選択 |
| Account | 自分のアカウントか別のアカウントかを選択する。自分の場合は直下の一覧から接続先VPCを選択する。別のアカウントの場合はアカウントID（数字のやつ）とVPC IDを入力する。 |
  
VPC-A側にVPC Peering Connectionが作られた。  
ただしstatus「Pending Acceptance by xxxxxxx」となっている。
別アカウントをまたいだVPC Peeringを作る場合は、相手側の承認が必要になる。承認期限は1週間みたいだ。（この場合はVPC-B側の承認が必要）
![VPCsetting3](https://qiita-image-store.s3.amazonaws.com/0/34281/55bec6a1-e721-0e48-2e90-64cb5b1ad5d8.jpeg)

### VPC-B側でVPC-A側で作成したVPC Peering Connectionを承認する
VPC-B側ではVPC-A側で作成したVPC Peering Connectionのリクエストが来ているので、AWSアカウントIDとVPC IDを確認した上で「Accept request」をクリック
![VPCsetting4](https://qiita-image-store.s3.amazonaws.com/0/34281/4292d16a-2601-fad7-46df-caa125779da4.jpeg)

確認ダイアログを経て、statusが「active」になっていればOK！

![VPCsetting5](https://qiita-image-store.s3.amazonaws.com/0/34281/2ae8591f-0266-861e-48f3-e031f3d4867c.jpeg)

### VPC-A,Bでルーティング設定を行う
VPC Peering connectionができただけでは実際の通信はできません。それぞれのVPCでルーティング設定を行う必要があります。

VPC DashboardからRoute Tablesを選択してルーティングの編集を行うと、先ほど作成したVPC Peering Connection（pcx-xxxxxx）がTargetとして選択できるようになっています。

* VPC-A（10.0.0.0/16） -> VPC-B（10.45.0.0/22）へのルーティング設定
![VPCsetting5](https://qiita-image-store.s3.amazonaws.com/0/34281/3e773b48-2701-30dd-f3a8-6a60ca6a3001.jpeg)
　
* VPC-B（10.45.0.0/22） -> VPC-A（10.0.0.0/16）へのルーティング設定
![VPCsetting6](https://qiita-image-store.s3.amazonaws.com/0/34281/af56f627-1b13-7dd9-3930-cfa1c102a252.jpeg)

これでVPC-A,B同士の相互通信ができるようになりました。
なお、通信テストをする際はEC2等についているSecurity Groupも許可することを忘れないでください。
サイトの死活監視用Google Apps Script


サイト死活監視用に
無料でCRONが出来るサービス無いかと探していたら、
Google Apps Scriptのトリガーが便利そうなので書いてみた。
一定時間置きにURLをチェックして、検証文字列が無ければメールを送信。
トリガーの設定方法は下記を参考。
http://www.infoscoop.org/blogjp/2014/05/05/google-apps-script-sample/
http://dotinstall.com/lessons/basic_google_apps_script/24313


○秒応答が無かったらメール送信としたかったけど、timeoutの設定方法はわからず。
※timeoutの指定は出来ないようだ。GoogleAppScriptのタイムアウトは5minらしい。
http://stackoverflow.com/questions/19135818/how-to-cancel-an-urlfetchapp-fetch-after-specified-time
http://hima.okitsunesama.com/2014/07/gmail-googleappscript.html

```js
function myFunction() {
  try{
    var url="検証URL"; //検証URL
    var mailto="送信先メール"; // 送信先メール（カンマ区切りで複数指定）
    var search_string="検証文字列"; //検証文字列
    
    var response = UrlFetchApp.fetch(url,{
      muteHttpExceptions : true 
      //trueの場合、HTTPエラーの時に例外をスローしない
    });
    
    if(response.getContentText().indexOf(search_string)<=0){
      MailApp.sendEmail(
        mailto,
        "[GAS] 検証文字列が見つかりません",// メール件名
        "",
        {
          htmlBody: url + "<br/>" + response.getContentText()
        }
      );
    }
  }catch(e){
      // 接続エラー
      //Logger.log(e);
      MailApp.sendEmail(
        mailto,// 送信先メール
        "[GAS] 検証URLに接続できません",// メール件名
        "",
        {
          htmlBody: url + "<br />" + e.message
        }
      );    
  }
  
}

```

探してみたら、newrelicのsyntheticsを使えばページ内の「検証文字列」の監視ができるので、実際はsyntheticsを使ったほうがよさそう。
http://newrelic.com/synthetics
http://qiita.com/kumatronik/items/c542feac77b08c3ca646
Protractorの小ネタ

[AngularJSリファレンス](http://www.amazon.co.jp/dp/4844336681)の落ち穂拾いその3ということで、今回はProtractorの小ネタを紹介したいと思います。

手前味噌ですが、Protractorの説明についてはこちらをごらんください。

 - [Protractor: AngularJSの次世代E2Eテストフレームワーク](http://qiita.com/zoetro/items/b72130960c39055b8474)

## AngularJSの処理の完了を待たない

Protractorには、`browser.waitForAngular`というAPIが用意されています。
このAPIを呼び出すと、AngularJSの描画処理や、`$http`による通信処理、`$timeout`によるタイムアウト待ち処理などが完了するまで待つことができます。

Protractorは、要所要所で内部的にこの`browser.waitForAngular`を呼び出しています。
これによりテストを書く人は、AngularJSの処理が完了するまで待つという処理を書く必要がなくなるのでとても便利です。

一方、処理が完了するまで待たれると困る場合もあります。
例えば、一定時間が経過すると表示が消えるトーストUI(`$timeout`を利用)をテストしたいときに、ProtractorのAPIを呼び出すと、トーストの表示が消えるまで処理が返ってきません。そのためトーストが表示されているかどうかをテストできなくなってしまいます。

そのような場合は、`browser.ignoreSynchronization`をtrueに設定することで処理の完了を待たないようにすることができます。

~~~javascript
browser.ignoreSynchronization = true;
~~~

## ブラウザのコンソールログを取得する

Protractorネタというよりも、WebDriverネタかもしれません。

次のようにafterEachでログの長さが0であることを確認すれば、テストを実行したときに変なログが出力されていないかチェックすることができます。

~~~javascript
afterEach(function () {
  browser.manage().logs().get('browser').then(function (browserLog) {
    expect(browserLog.length).toEqual(0);
  });
});
~~~

なお、IEではこの処理が動かないようなのでご注意を。

## IEでProtractorのテストを実行する

これもProtractorネタというよりもWebDriverネタですが、Windows + IE11でProtractorを動かすのに苦労したので、紹介しておこうと思います。

まずは、下記のサイトからIEDriverServerをダウンロードします。

- http://selenium-release.storage.googleapis.com/index.html

そして、解凍したファイルのパスを環境変数PATHに追加します。
なお、64bit OSを利用している場合に、64bit版のIEDriverServerを利用すると、element.sendKeysがとても遅くなる問題があるようです。その場合は、32bit版のIEDriverServerを利用するといいみたいです。

つづいて、下記のWikiの内容に従ってIEの設定をおこないます。

- [Internet Explorer Driver](https://code.google.com/p/selenium/wiki/InternetExplorerDriver)

1. レジストリの追加をおこないます(IE11の場合のみ必要)。
2. IEの「インターネットオプション」→「セキュリティ」→「保護モードを有効にする」のチェックをすべてのセキュリティゾーンの設定で無効にします。
3. 拡張保護モードを無効にします。
4. IEを再起動します。
5. IEの「インターネットオプション」→「セキュリティ」の「信頼済みサイト」にテスト対象のホスト名を追加します。(localhostの場合は不要)

そして、設定ファイルのbrowserNameを`ie`に設定します。

~~~javascript:protractor.conf.js
exports.config = {
  seleniumAddress: "http://localhost:4444/wd/hub",
  capabilities: {
    browserName: "ie"
  },
  specs: ["*_spec.js"],
  baseUrl: 'http://localhost:9000/',
  framework: "jasmine",
  jasmineNodeOpts: {
    showColors: true
  }
};
~~~

あとは、いつもどおりProtractorを実行するだけ。
【Git】いろいろなマージコミット

##Gitでマージ
オプションの付け方によって動作が変わります。
本日は3つ紹介します。

###-ff
```
git merge -ff feature/develop
```
オプションを何もつけなくても、この設定になります。
fast-fowardの関係の場合はマージコミットが作られません。


###-no-ff
```
git merge -no-ff feature/develop
```
fast-forwardの関係にあっても、必ずマージコミットが作られます。

###--squash
```
git merge --squash feature/develop
```
マージコミットがされません。
このオプションを付けた場合は自分でコミットをしなくてはなりません。
feature/developブランチでの作業を一つのコミットにまとめてしまうことができます。


##ちなみに
###fast-forward

###■　＞　■　＞　①　＞　■　＞　②
コミット順は右から左です。■と丸囲みの数字はコミットです。
この場合、①と②はfast-forwardの関係にあります。


###fast-forwardではない
###　　　　　＞　■　＞　■　＞　②
###　　　　/　
###■　＞　◆　＞　①　
コミット順は右から左です。■と◆と丸囲みの数字はコミットです。
◆コミットから別ブランチになっています。
この場合、①と②はfast-forwardの関係ではありません。

最後見づらくてすみません。
django メモ


もともとはいってるpython

```
$ which python
```
>/usr/bin/python


brew経由でいれる

```
$ brew install python
```

pipの設定

```
$ pip install --upgrade setuptools
$ pip install --upgrade pip
```

PATHを置き換え

```
echo 'export PATH=/usr/local/bin:/usr/local/share/python:$PATH' >> ~/.bash_profile
source ~/.bash_profile
```


確認

```
$ which python
```
>/usr/local/bin/python


バージョン確認など

```
$ python --version
```
> Python 2.7.8

```
>>> import django
>>> django.get_version()
>>> django.VERSION
```
> '1.6.6'


DB作り直し

django 1.5以上は

```
./manage.py sqlclear <appname> | ./manage.py dbshell 
```

1.4以下は

```
python manage.py reset <appname> 
```
xorによる swap と、一時変数による swap

整数を入れ替える方法は3つある。

* xor や加減算を使う
* 一時変数を使う
* 専用命令 ( x86 の場合にはたぶん `xchg` ) を使う

で。

実際に書いてみる

```cpp:xor
inline
void swap( int & x, int & y )
{
  x ^= y;
  y ^= x;
  x ^= y;
}

struct foo{ int x, y; };
foo get_foo();
void use_foo( foo & );

void hoge()
{
  foo f = get_foo();
  swap( f.x, f.y );
  use_foo( f );
}
```

```cpp:一時変数
inline
void swap( int & y, int &x )
{
  int t=x;
  x=y;
  y=t;
}

struct foo{ int x, y; };
foo get_foo();
void use_foo( foo & );

void hoge()
{
  foo f = get_foo();
  swap( f.x, f.y );
  use_foo( f );
}
```

後半にある意味のないコードは、swap が最適化の末に消えてしまわないためのもの。

で。上記の2パターンを
` clang++ -S -O3 `
でアセンブラにしてみた。
`get_foo` と `use_foo` に挟まれた部分を抜粋すると:

```gas:xor.s
	callq	__Z7get_foov
	movq	%rax, -8(%rbp)
	movq	%rax, %rcx
	shrq	$32, %rcx
	movl	%eax, -4(%rbp)
	movl	%ecx, -8(%rbp)
	leaq	-8(%rbp), %rdi
	callq	__Z7use_fooR3foo
```

```gas:一時変数.s
	callq	__Z7get_foov
	movq	%rax, -8(%rbp)
	movq	%rax, %rcx
	shrq	$32, %rcx
	movl	%eax, -4(%rbp)
	movl	%ecx, -8(%rbp)
	leaq	-8(%rbp), %rdi
	callq	__Z7use_fooR3foo
```

という具合で、 xor だろうが一時変数だろうが、 `shrq` に落ちるという展開。

ならばと long long 版 で試してみると:

```gas:一時変数64.sもxor64.sも同じ
	callq	__Z7get_foov
	movq	%rax, -8(%rbp)
	movq	%rdx, -16(%rbp)
	leaq	-16(%rbp), %rdi
	callq	__Z7use_fooR3foo
```

と、同じコードになる。
たぶん、変数の入れ替えは `movq`。

とまあこんな具合。

最近のコンパイラは大変賢いので、小手先で戦っても仕方ない。
という事例。

`xchg` 命令も試したかったんだけど、時間の都合で省略。書き方知らなくて。
かえって遅くなるんだと思ってるけど、どうだろう。
登録されている電話番号の順番で自動発信。便利かも？

今回はTwilioを使って登録されている電話番号に順番に電話を発信してみたいと思います。

さてさて、どこに使うんだ？
例えば、障害が発生した際に、障害の処理によって登録されている担当に優先順位で順番に電話をかけることが可能です。
この場合は、担当A、担当B、担当C、ある場合は、担当D、担当E、担当F　など。
いろんなパターンを事前に決めといたら残りはTwilioが順次電話をかけてくれます。

担当Aに電話をかけたが、応答しなかった場合、担当Bに自動的に電話をかけるを繰り返して、誰かが電話に応答するまで、繰り返します。全員でなかったらまた戻って最初から発信して行くのも可能。

ではでは、見て行きたいと思います。

<h3>ソースコードから。</h3>

```callscreen.php
<?php
  $numbers = array("<number to call 1>", "<number to call 2>", "<number to call n>");
　$number_index = isset($_REQUEST['number_index']) ? $_REQUEST['number_index'] : "0";
　$DialCallStatus = isset($_POST['CallStatus']) ? $_POST['CallStatus'] : "";
 
  header("content-type: text/xml");

　if($DialCallStatus!="completed" && $number_index<count($numbers)){
?>
　　　<Response>
　　　　　<Dial callerId="+8150xxxxxxxx" timeout="10" action="callscreen.php?number_index=<?php echo $number_index+1 ?>">
　　　　　　　<Number url="screen_for_machine.php">
　　　　　　　　　<?php echo $numbers[$number_index] ?>
　　　　　　　</Number>
　　　　　</Dial>
　　　</Response>
<?php
　　} else {
?>
　　　　<Response>
　　　　　　<Hangup/>
　　　　</Response>
<?php
　　}
?>
```
「$numbers」に複数の電話番号を設定します。 このファイルがTwilioから呼ばれると分岐条件に満たす場合、配列に設定されている電話番号の順番で電話をかけます。 Twilioはコールに対するステータスを「POST」で渡しますので、呼ばれたスクリプトからPOSTでステータスを取得できます。
そのステータスが「completed」ではない場合、通話が成立されていないことを意味しますので、次の電話番号へ電話をかけるようになっています。

・Dail動詞にactionを指定することでDial動詞実行後設定されているurlに処理を渡します。
・Number動詞にurlを指定すると発信先に電話をかけた際の処理をそのurlに渡すことが可能です。 


```screen_for_machine.php
<?php
  header("content-type: text/xml");
?>
<Response>
<?PHP if (empty($_POST["Digits"])): ?>
  <Say language="ja-jp">〇〇で障害発生。〇〇の場合は1を〇〇の場合は2を押してください。</Say>
  <Gather numDigits="1" timeout="30" />
<?PHP elseif ($_POST["Digits"] == "1"): ?>
  <Say language="ja-jp">オペレーターに繋ぎます。</Say>
  <Dial callerId="+8150xxxxxxxx">+813xxxxxxxx</Dial>
  <Gather numDigits="1" timeout="30" />
<?PHP elseif ($_POST["Digits"] == "2"): ?>
  <Say language="ja-jp">サーバーを再起動します。</Say>
  <Hangup/>
<?PHP endif ?>
</Response>
```
このファイルは「callscreen.php」の「Number url」から呼ばれます。
つまり「Number」に設定された発信先の電話番号に電話を掛けた際に実装する処理を書いておきます。
Twilioはこのように一つのファイルだけではなくいろんなどころえのファイル分岐が可能です。
※ このファイルでは単なるメッセージを再生していますが、分岐処理の実行文として各コマンドを設定すればコマンドを実行することが可能です。 

<h3>まとめ？！</h3>
このサンプルコードはInbound（着信）用で作成されていますので、Twilio電話番号（050）のRequest URLに「callscreen.php」のURLを設定し、二つのスクリプトをウェブサーバーに配置することで動きます。試す際には、電話番号のところを自分のものに書き換えてください。

今回はサーバーの障害を例にしましたが、他に面白いところでも使われますし、これ以上便利なものも開発可能かと思います！
Git のブランチ名をエディタで変更する


![git-rename-branch.gif](https://qiita-image-store.s3.amazonaws.com/0/3295/b6677302-e131-906a-9baf-7003422dca22.gif "git-rename-branch.gif")

# ふつうにブランチ名を変える方法
ふつう作業開始時にブランチを作ります。

`git checkout -b issue-1234-yabai-warning`

いくつか実装を加えていくと、実装内容とブランチ名が合わなくなってくることがよくあります。
ですので Pull Request を作る前に、実装内容を表すようにブランチ名を変更します。

`git branch -m issue-1234-yabai-warning issue-1234-replace-deprecated-methods`

(`git branch -m old-name new-name` でブランチ名を変更)

しかしこのブランチ名を変更するコマンドの入力がダルいので、これを楽にしたいと思います。

# ブランチ名変更の面倒な点

コンソールでブランチ名を変更するときは、次のステップになるかと思います。

1. ブランチ名の変更コマンドを、補完を利用してとりあえずどちらも **変更前**の名前 で入力 (実行しない)
  * `git branch -m issue-1234-yabai-warning issue-1234-yabai-warning`
2. `Alt + Backspace` など駆使して変更後の名前から不要なものを削る
  * `git branch -m issue-1234-yabai-warning issue-1234-` :hammer:
3. 新しい名前を入力
  * `git branch -m issue-1234-yabai-warning issue-1234-replace-deprecated-methods`

特に 1. は、git-completion による補完があったとしても、パカパカ `TAB` を入力する必要があって面倒です。

# ブランチ名をエディタで変更する

## 自分で入力しない

**自分がいまいるブランチを名前の変更対象に限定** した変更用コマンドを作りました。

また、 **現在のブランチが勝手に入力** して変更点のみに注力すればいいようになっています。

ふだんコミットメッセージを入力しているように、エディタでブランチ名を変更します。

出来る限りらくらくになることを願って次のコマンドをつくりました。
(`.gitconfig` に追加して使います。)

```.gitconfig
[alias]
	rename-branch = "!f () { \
        local tmpfile=$(mktemp 2> /dev/null || mktemp -t tmp); \
        trap \"rm -f $tmpfile\" EXIT; \
        local branch=$(git rev-parse --abbrev-ref HEAD); \
        echo \"$branch\" > $tmpfile; \
        EDITOR=${EDITOR:-vim}; \
        $EDITOR $tmpfile; \
        git branch -m $branch $(cat $tmpfile); \
    };f"
```

1. `git rename-branch` でエディタが立ち上がります
2. 現在のブランチ名が入力済みなので、そこからブランチ名を変更します
3. 保存して終了することでブランチ名を変更できます

(はじめと同じ GIF です)
![git-rename-branch.gif](https://qiita-image-store.s3.amazonaws.com/0/3295/b6677302-e131-906a-9baf-7003422dca22.gif "git-rename-branch.gif")

便利!!!

# おわりに

もともとのブランチ名変更作業と比べて、入力する文字がだいぶ減って楽になったと思います。
やったね。
OSXでのインストール済みのJavaの確認

# 背景

最近Qiitaの投稿で、デスクトップのキャプチャーを載せたが、音がその動画には入っていなかった。

そこで、Macでデスクトップの音を録音できるソフトと[Sound Flower]()の存在を知ったが、MavericksではデフォルトJavaが入っておらず、検索したページでは、特定のバージョンのJDKが必要との記述を見つけた。

そんな訳で現状調査のために、インストル済みのJavaの確認方法が必要になった。

# OSXでのインストール済みのJavaの確認

```
/usr/libexec/java_home -V
```

# まとめ

結局、Sound Flowerはオリジナルは動かず、[Mavericks用にフォークしたもの](https://github.com/crmne/Soundflower/releases)をGithubで見つけて、これはjdk1.8で動いた。
QiitaAPIで「ほぼ」全投稿を取得する

なんとなくQiitaのデータで遊びたくなったので、APIで全投稿を取得できるか調べてみた。

# 現在の全投稿件数

約49,000件。
確認方法は[こちら](http://qiita.com/tag1216/items/5e5ee1738e236fafe78b)。

# 新着投稿の取得 ( /api/v1/items )

Qiitaの投稿は1日約100件強。
最大取得件数は1ページ当たり100件 x 50ページ ＝ 5,000件なので、1か月分くらいなら取得できる。
全投稿取得は無理。
<ins>[2014/10/01 追記] v2では100件 x 100ページ  ＝ 10,000件 まで取得できます。</ins>

# 特定タグの投稿取得 ( /api/v1/tags/:url_name/items )

現在投稿件数が一番多いタグはRubyで約4,680件。なので**「今なら」**各タグの全投稿を取得できる。
それには全タグの一覧が取得できればいいんだけど。。。

# タグ一覧取得 ( /api/v1/tags )

現在タグ総数は8,451件で全部は取得できない。 
まあ件数の多いタグだけ取得できればいいか、と思ったけどこのAPI、どうやら作成日が古いものから取得しているっぽいので最新の"swift"とかのタグが取得できていない。
<ins>[2014/10/01 追記] v2では作成日の降順に変更になったようです。</ins>

これちょっと使いものにならないんじゃ。。。

# 現状でなるべく多くの投稿を取得する方法

以上を踏まえた上で、現状で「ほぼ」全投稿を取得する方法。

1. 新着投稿取得APIで最新5,000件を取得する。
2. 1で取得した投稿からタグを抽出する。
3. 2の全タグについて、特定タグ投稿取得APIで最新5,000件を取得する。

# 結果

上記の方法で49,549件中47,361件取得できた。サイズは約600MB。
途中、「VC++」タグの投稿取得でエラーになったがそれ以外は問題なし。

リクエスト総数は2,547で約18時間かかった。
50ページ制限がなければ新着投稿取得APIだけで500リクエストで取得できるんだけどなあ。。。

# バッチ処理でQiitaAPIを使うときのコツ

1時間に150リクエストまでという制限があるので、3600秒/150=24秒のWAITを入れるとリクエスト制限を考えずに連続取得できる。

<ins>[2014/10/01 追記] v2では1時間に300回になったので、3600秒/300=12秒になります。</ins>
Erlangで素数かどうかをチェックする

前回に引き続き、erlangの修行をする。今回は素数チェッカーを作る。
#素数チェッカー
```erlang
- module(primenum).
- export([primenum/1]).

primenum(Num) when Num > 2 ->
  primecheck(2, Num);
primenum(Num) ->
  io:format("Input integer over 2~n").


primecheck(TargetNum, TargetNum) ->
  true;
primecheck(Num, TargetNum) when TargetNum rem Num =:= 0 ->
  false;
primecheck(Num, TargetNum) ->
  primecheck(Num+1, TargetNum).
```

#感想
前回のfizzbuzzの方が難しかった。次からは並列プログラミングに挑戦したい。
Wordpressを運用しているとAllowed memory size の表示 がでてメモリが足りなくなる解決方法。


Wordpressのページがしょっちゅう落ちて困ります。

```text:
PHP Fatal error:  Allowed memory size of 44040192 bytes exhausted (tried to allocate 32 bytes) in /var/www/html/wp-includes/pomo/streams.php on line 86
```
PHPのメモリが足りないためエラーがでてWordpressが落ちてしまいました。対策としてphp.iniのmemory_limitを64Mなどに増やします。

WordpressをおいているサーバーはCentOSです。

```text:php.iniを編集
vi /etc/php.ini
```
元々42MBほどに制限していたメモリ制限値を64MBまで増加させました。

```php:memory_limitを変更
memory_limit = 64M;
```
php.iniを編集してからウェブサーバーを再起動すると、同じphpファイルが呼ばれても、一旦はWordpressが落ちなくなります。しかしメモリ消費量はどんどん増えてきているので、メモリ消費が多いプラグインを削除したほうがいいですね。
Erlangでfizzbuzzをする

最近erlangの勉強会に参加していて、仕事ではrubyとphp、家ではnode、趣味でerlangみたいなカオスな感じになってきている。当然erlangどころか関数型言語も触ったことなかったので、勉強会でのパフォーマンスが悪くなってきた。つまり、erlangの演習をしながらちょっと復習をしていきたい。
とりあえず、基本のfizzbuzzをerlangで書いてみた。

#FizzBuzz
```erlang
- module(fizzbuzz).
- export([check/1, fizzbuzz/1, loop/2]).

check(Num) when Num rem 15 =:= 0 ->
    io:format("FizzBuzzz~n");
check(Num) when Num rem 3 =:= 0 ->
    io:format("Fizz~n");
check(Num) when Num rem 5 =:= 0 ->
    io:format("Buzz~n");
check(Num) ->
    io:format("~p~n", [Num]).

fizzbuzz(Num) ->
  loop(1,Num).

loop(Endnum, Endnum) ->
  check(Endnum);
loop(Num, Endnum) ->
  check(Num),
  loop(Num+1, Endnum).
```

#感想
ちょっとはまったところは、再帰のところだ。for文がないのでどうやって書くか試行錯誤したらこんな感じになった。慣れると結構かっこ良くかける気がしている。次は素数チェッカーを書く。
After Effectsのスクリプトでプロパティがhiddenの時に値をセットできない問題の回避方法

##プロパティがhiddenの時
After Effectsでは**特定のプロパティがオンでないと現れないプロパティ**があります。
例えば、**カメラレイヤーの目標点は1ノードカメラでは現れません。**
![cameraAnchor.png](https://qiita-image-store.s3.amazonaws.com/0/26207/252e4d57-60d7-cf61-4e60-a8182a5566ab.png)

エフェクトにも同様に**特定のプロパティがオンでないと現れないプロパティ**があります。
一例を挙げると、*Optical Flares*の*Position Z*プロパティは*Positioning Mode*の*Source Type*が*3D*の場合でしか現れません。

![of positionz.png](https://qiita-image-store.s3.amazonaws.com/0/26207/a3f1db5e-e25a-2dce-ee30-a59180be1d7b.png)


もちろん、内部的には存在しているのでアクセスはすることが出来ますが、値をセットしたい場合などは異なります。
AEのスクリプトでは基本的に`setValue()`などで値を設定していきますが、その**対象のプロパティをオンにした直後に、そのままオンの時にしか現れないプロパティを操作しようとしても、以下のエラーが出ることがあります**。

![hiddenErr.png](https://qiita-image-store.s3.amazonaws.com/0/26207/6c2144d0-d654-08f2-2db8-22c5024d2810.png)

困ったことに、このhiddenかどうかは標準のスクリプトで判別する方法がありません。

##解決方法
この場合は、**エラーが出る直前にコンポジションの現在時間を操作する**ことによって解決することが可能です。

```js:time.jsx
var actComp = app.project.activeItem;
// このコードでAEのUIを更新してエフェクトプロパティがhiddenで値が更新できないエラーを回避する
actComp.time = actComp.time;
```
一見無意味なコードのように見えますが、AE側ではUIが更新されてプロパティが現れるようになります。
bootstrapのGrid systemを使用してカラムデザインをつくる 

# Grid systemでレスポンシブデザイン
bootstrapのGrid systemを使うと簡単にレスポンシブのカラムデザインを作ることができます。

```html:HTMLの雛型
<div class="row">
  <div class="col-sm-4">
    左カラム
  </div>
  <div class="col-sm-8">
    右カラム
  </div>
</div>
```
基本的に.rowクラスの中に`.col-sm-数字`という命名のクラスを追加します。数字部分は4+8のように合計がが**12**になるように作ります。**合計12**でwidthが100％になるので、`.col-sm-4`ならwidthが33%、`.col-sm-8`ならwidthが66%になります。

# カラムのpadding
Grid systemの`.col-md-n`などのカラムクラスにはすべてpaddingがかかっています。

```css:CSS
padding-right: 15px;
padding-left: 15px;
```
モバイル端末のデザインを作る場合、左右に15pxはかなり大きいので上書きが必要になる場合が多いのではないかと思いました。

# 参考
http://getbootstrap.com/css/#grid
PDOの例外をcatchする

PHPからMySQLを扱いたい時にはPDOを使う.
SQL文を実行して失敗した時、try~catchの中に入らない.なぜ.

調べてみたところ、PDOはデフォルトで例外を吐かないよう.

http://php.net/manual/ja/pdo.error-handling.php

デフォルトのエラーモードが PDO::ERRMODE_SILENTになっているため、例外を吐くように変更.

```php
$db = new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
```

もしくは

```php
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
```

これで PDOExceptionを吐くのでcatchできるようになる
さくナレ勉強会レポート ~Dockerハンズオン~


# 概要
運良くさくナレ勉強会に当選したので備忘録を残す。
さくナレは第1回目らしいです。
ちなみに私は Docker 初心者です。

[第1回さくナレ勉強会「Dockerハンズオン」](http://knowledge.sakura.ad.jp/event/2374/)
# 勉強会開始
## Docker の基礎

Docker は linux コンテナを使用した仮想化技術
大きくわけて2つ。

* VM型
	* 完全仮想化
	* 準仮想化
* コンテナ型 - Docker, Jail

(最近は VMware が新しいことを始めたとか)
[VMware、Dockerのような独自の新技術「Project Fargo」発表。1秒以下で仮想マシン起動を実現。VMworld 2014
](http://www.publickey1.jp/blog/14/vmwaredockerproject_farge1vmworld_2014.html)
このへんの記事のことですかね。

コンテナ型はホストの環境に依存するので Docker だと CentOS など linux 系。

今回の使用OSは CoreOS でさくらのクラウドを使わせていただきました。



## ハンズオン
ハンズオンは以下の4項目ですでにドキュメントが用意されているという素晴らしいものでした。
[ github - sakura-studies](https://github.com/moongift/sakura-studies/tree/master/01)

* Docker を立ち上げて Hello World
* Word Press インストールしてみる
* MySQL を別コンテナで立ち上げてリンク
* 自分で Docker コンテナを作成する

## 感想
多少詰まったところはありましたが、上記ドキュメントをそのまま進めるだけで4項目全て完遂することができました。丁寧に解説してくださってただただ感謝です。次の抽選も当たりますように。

今回はじめて CoreOS を触りましたが Docker に特化しているだけあってとてもシンプルで良かったなあと思いました。
Docker イメージ作成用途は CoreOS 基板やってみたい。

とにかく本気で触ろうと思うには十分な勉強会でした。

# 今後やりたいこと
Docker & Packer を使って仮想マシンのイメージを作成し kickstart でのパッケージインストールを脱却したいなぁという妄想。
[Redmine] Redmineでオフショア開発する

# はじめに

Redmineは多機能なツールです。
でも、それゆえに使い方が破たんしている例をいくつも見てきましたし、経験してきました。
シンプルに使うのが重要だと思っています。

今回はオフショア開発で委託側としてRedmineを使う機会がありましたので、どのように使ったかを書いておきます。

# どのように使ったか

## チケット構成

Redmineは、委託先のサーバーを使いました。
共通の項目は、だいたい１チケットになっています。

 - 共通（委託側と委託先の窓口担当者が使うところ）
   - 要求仕様（委託側がつくり、委託元がチェック）
   - 計画（委託先がつくり、委託側がチェック）
   - Q&A（委託先がつくり、委託側が回答）
   - 成果物（委託先がつくり、委託側が受け入れテスト）
   - スプリントレビューの指摘事項（委託側がつくり、委託先が回答）
   - ミーティング（委託先がつくり、委託側がチェック）
 - スプリント（委託先が使うところ）

## チケットの作成と更新

仕様書・成果物等は基本的にファイルだったので、そのままチケットに添付しました。
ファイル名にバージョン番号をつけてバージョン管理しました。
あんまりな感じですが、あまり数が多くなかったので、十分でした。
バージョンごとにファイル名が違うと、ローカルに持ってきたときに混乱しなくて済むのがよいです。

指摘事項以外は、全部１チケットで、バージョンを変えるたびに同じチケットに添付していきました。
それに対するコメントも同じチケットに積んでいきました。

指摘事項については、１指摘１チケットにしました。
そこから委託先が子チケットをつくって構成管理につなげる、という形にしました。
対応が終わると委託先がResolvedにするので、確認して問題なければClosedにして終わりです。

# 振り返って

## よかったこと

 - プロジェクトの間、Redmine以外には、メールを少しと、定例用のWeb会議しか使いませんでした。
   そしてそれで十分でした。
 - ファイル（仕様書と成果物）のやりとりがほんとに楽でした。
 - 指摘が解消できているかをチケットの状態で管理することができ、漏れなく実施できました。
 - やりとりがすべてログに残っており、一覧で見られるので、言った言わないの議論などをせずに済みました。

## よくなかったこと

 - オフショア先のサーバーを利用したので、アクセスがかなり遅く、使い勝手がよくありませんでした。

# シンプルにRedmineを使うには

今回使ったパターンのいくつかを書いておきます。

## Q&Aで使うパターン

Q&Aリスト＝１チケットとして管理します。
Q&Aは一気に複数のＱとＡが飛び交うことが多いので、わざわざ１Ｑ=１チケットとしないほうが楽だと思います。

 1. Q&Aリストを記載したチケットをつくります。
    トラッカーは「サポート」がよいでしょう。
    Q&Aリストは、説明に書いても、記載したファイルを添付してもよいです。

 2. 担当者を質問者に変更して保存します。
    このとき、注記を入れておくと親切です。

 3. 回答者は、チケットを受け取ったら回答し、回答を記載します。
    Q&Aリストがファイルになっている場合は、回答を記載したファイルを添付します。
    ファイルのコメントに「回答済み」などを書いておくとよいです。
    注記を書いて、担当者を質問者に変えて保存します。

 4. 質問者は、回答に納得がいったらチケットをクローズします。


## （特にチームの）アクションアイテムで使うパターン

１アクションアイテム＝１チケットとして管理します。
普通の使い方だと思いますが、やはり、残件を見える化できると忘れずに済みます。
バックログプラグインやDashboardプラグインを使うとD&Dでチケットをクローズできますので、より便利です。

 1. アクションアイテムをチケットとして登録します。
    アクションアイテムの発生元（会議など）をチケットとして登録しておき、その子チケットとして作成するとよいでしょう。
    トラッカーは「サポート」がよいでしょう。

 2. アクションアイテムが完了したらチケットをクローズします。


## スプリントで使うパターン

本来の使い方は本来の使い方として使います。
ただし、もしWBSがあったとしても、WBSを全部入れてしまうのは、うまいやり方ではないでしょう。
スプリントに期間を区切って、スプリントごとにチケットを入れる方がよいと思います。
バックログプラグインが同じことをしてくれるので、利用すると便利です。

 1. バージョンをスプリントとして作成します。
 2. スプリントで達成することをチケットとして作成します。
    子チケットで担当者ごとのタスクをつくります。
 3. タスクが完了したら、子チケットをクローズします。
 4. 子チケットが全部クローズし、チケットが達成できたことを確認できたら、チケットをクローズします。


## 使わない機能

シンプルに使うためには、難しい機能たちを使わないようにします。

難しい機能 | 理由
-------------- | ----
フォーラム | 階層が深く、使い勝手がよくありません。
ファイル・文書 | チケットやWikiへの添付で十分です。
カレンダー | 見にくいです。ガントチャートで十分です。
ニュース | 便利ですが、文化がなかなかつくれません。
Wiki | 便利ですが、文書管理を難しくします。
phantomjs常駐化

phantomjsを常駐化させた際のメモ.
initctlの簡単な使い方も記す.

環境

```bash
$ cat /etc/redhat-release 
CentOS release 6.2 (Final)
```

phantomjs用ファイルを作成

```bash
# vim /etc/init/phantom.conf

description "phantomjs-resident"
author "richasonson"

start on runlevel [2345]
stop on runlevel [016]

exec phantomjs --webdriver=8643 --webdriver-logfile=/tmp/phantom.log
respawn


```

登録されているupstartを確認

```bash
$ initctl list
```

起動

```bash
# initctl start phantom
```

停止

```bash
# initctl stop phantom
```

状態を確認

```bash
$ initctl status phantom
(起動時) phantom start/running, process 4098 
(停止時) phantom stop/waiting 
```
gitのブランチモデル検討～git-flowとgithub-flowを比較してみた～



#git-flowについて
git-flowのチートシート
http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html

## メリット
* hotfix（緊急の修正）とfeature（修正）が明確に区別できる

* 複数コマンドを一つのコマンドにまとめたことで、マージ先のブランチを間違える等のオペレーションミスを軽減できる

##デメリット

* 巻き戻しの手順などは結局デフォルトのgitコマンドに頼らざるを得ない

* すべてのリポジトリのある環境でgit flowをinstallし、git flow initをしないといけない

* git-flowは毎日リリースを行うようなチームには向いていない？？
https://gist.github.com/Tomohiro/6737765

* デフォルトgitの使い方もわからない初心者がgit-flowを理解するのが難しい

* IDEとの親和性が良くない（サポートしているIDEもある）

# GitHub-flowについて

GitHub-flow図解
http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314

## メリット

* レビューの文化が定着する（たとえレビューできなくても、いやでも変更箇所くらいは頭に入ってくる）

* エンジニア以外との連携も視野に入れられる（デザイナーが画像だけ変更してプルリク、ディレクターが設定ファイルだけ変更してプルリク、みたいな）

* git-flowのようにインストールは不要

## デメリット
* githubを利用できない案件だと、プルリクエストは実現できない

# 結論
 * git-flowはデプロイ感覚が比較的長め（１周間以上）くらいのスピード感の案件でないと、逆に手間がかかりそう
 * GitHub-flowは比較的柔軟、プラグインという概念もないため扱いやすい
 * GitHub-flowを採用しよう → おそらくこういう考えに至る人が多数派なので、git-flowの利用者が減ってきている・・？

# 課題
* GitHubを使えない案件ではをプルリクエストをどのように実現するか・・？
 - 「何らかの方法による伝達とレビュー」という形に置き換える
simple_form にて disable_with: をデフォルトで設定したい

背景
=====

フォームの二重送信、できるだけ避けたいですよね。

rails では submit ボタンに `data: {disable_with: "送信中..."}` というオプションを指定してやることによって、二重送信を防ぐことができます。

```rb
= simple_form_for(...) do |f|
  ...
  = f.submit class: "btn btn-primary", data: {disable_with: "送信中..."}
```

そうすると submit 時はこんな感じに非活性になってくれます。

![スクリーンショット 2014-09-03 19.47.37.png](https://qiita-image-store.s3.amazonaws.com/0/7823/663b04fe-0ee7-a090-2733-8349712d5308.png)

これで二重送信が防げます。やったね。

問題
=====

もちろん、全ての submit ボタンに対してオプション指定なんかはしたくないので、デフォルトで用意してあげたいですね。

実装例
=====

`SimpleForm::FormBuilder` をオープンしてエイリアスメソッドを定義してあげます。

```config/initializers/simple_form.rb
SimpleForm::FormBuilder.class_eval do
  def submit_with_override(value=nil, options={})
    value, options = nil, value if value.is_a?(Hash)
    data_disable_with = { disable_with: '送信中...' }
    options[:data] = data_disable_with.merge(options[:data] || {})
    submit_without_override(value, options)
  end
  alias_method_chain :submit, :override
end
```

文言を変えたい場合は、通常通りオプション指定してやるとデフォルト文言を上書きできます。

```ruby
= simple_form_for(...) do |f|
  ...
  = f.submit class: "btn btn-primary", data: {disable_with: "アップロード中..."}
```
Knockout.js で API を発行してレスポンスを受け取る単純なサンプル[Coffeeバージョン]


CoffScript & Deferred Promise 対応版。後で自分が見る用途ですが、こちらにも投稿します。

成果物（デモ）はこちら ⇒ http://hkusu.github.io/Knockout.js_api_demo/dist/
※ ついでにエレメントを操作するサンプルも、後から追加しました。

## 前提となる環境

次のとおり作成したもの。
⇒[Knockout.js × CoffeeScript × SASS の開発環境を手軽にイマドキっぽくつくる](http://qiita.com/hkusu/items/9b103dde566c83c7fd1b)

## 実装の内容

### ViewModel

APIハンドリング周りは、後から本数が増えてもいいよう、それらをまとめるオブジェクト `api` を用意した。

```coffeescript:scripts/main.coffee
$ ->

  FirstViewModel = () ->
    api =
      getJson: () ->
        defer = $.Deferred()
        $.ajax
          type: "GET"
          url: "/api_dummy.json"
          dataType: "json"
          cache: false
          success: defer.resolve
          error: defer.reject
        defer.promise()
    self =
      items: ko.observableArray()
      getBtn: ->
        api.getJson().done (data) ->
          self.items(data)
          return
        return
    self

  if $("#firstView")[0]
    ko.applyBindings new FirstViewModel(), $("#firstView")[0]

  return
```

### View

```html:index.html
<div class="container">
    <div id='firstView'>
        <h4>
            <font color='#8b008b'>■ APIを発行して結果を取得するサンプル</font>
        </h4>
        <br>
        <button class='btn btn-primary' data-bind='click: getBtn'>API発行</button>
        <br>
        <br>
        <table class='table table-striped' data-bind='visible: items().length > 0'>
            <thead>
            <tr>
                <th>名前</th>
                <th>年齢</th>
                <th>メモ</th>
            </tr>
            </thead>
            <tbody data-bind='foreach: items'>
            <tr>
                <td data-bind='text: $data.name'></td>
                <td data-bind='text: $data.age'></td>
                <td data-bind='text: $data.memo'></td>
            </tr>
            </tbody>
        </table>
    </div>
</div>
```

### APIレスポンスとして、適当なJSONファイルを用意

```json:api_dummy.json
[
    {
        "id":1,
        "name":"山田 太郎",
        "age":35,
        "memo":"山田のメモ"
    },
    {
        "id":2,
        "name":"鈴木 花子",
        "age":23,
        "memo":"鈴木のメモ"
    },
    {
        "id":3,
        "name":"高橋 次郎",
        "age":28,
        "memo":"高橋のメモ"
    }
]
```

# ほか

ソースは GitHub に置いておきます。
⇒ https://github.com/hkusu/Knockout.js_api_demo
CloudFormationでクソが！って叫んだこと


CloudFormation のテンプレートを書いてる時に、おや？と思ったことをまとめてみた。
タンツボみたいな記事になればいいなと思う。

# SNS

## MobilePush の PlatformApplication が作成できない

でも、これはしょうがない気もする。
特にAPNs。

# DynamoDB

## テーブル作成後にそのARNを取得できない

IAMロールとか作りたいのに `Ref` で取得できない。
仕方ないので自力で作成した。

```json
{
  "Fn::Join" : [ "", [ "arn:aws:dynamodb:", {
    "Ref" : "AWS::Region"
  }, ":", {
    "Ref" : "AWS::AccountId"
  }, ":table/", {
    "Ref" : "DynamoDBTable"
  } ] ]
}
```

5年前の投稿。
[[AWS Developer Forums] Request: Provide DynamoDB table ARN as attribute in CloudFormation](https://forums.aws.amazon.com/thread.jspa?threadID=100847)

# ElastiCache

## memcachedクラスターをAZまたぎで作れない

まだ対応してないだけで、すぐ対応してくれるはず。

[[AWS Developer Forums] Create ElastiCache cluster that spans multiple AZs?](https://forums.aws.amazon.com/thread.jspa?threadID=159023)

## リソース名のルールがおかしい

他のAWSサービスでリソースを作成した場合、だいたい `スタック名-リソースID-英数字` となるのに ElastiCache はそうはならない。
`cache-Cache-XX00XX0XXX00` とかなっちゃう。
まだ `CacheParameterGroup` しか試してないのでなんとも言えないけれども。

## CacheParameterGroup の Properties が必須じゃない

ドキュメントには `Required: Yes` と書いてあるが、なくても作成できた。
値はすべてデフォルトになると思う。

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-parameter-group.html

```json
{
  "ParameterGroup" : {
    "Type" : "AWS::ElastiCache::ParameterGroup",
    "Properties" : {
      "CacheParameterGroupFamily" : "memcached1.4",
      "Description" : "test"
    }
  }
}
```

## PreferredMaintenanceWindow のフォーマットがドキュメントに載ってない

`tue:19:00-tue:20:00` のように **UTC** で指定する。
曜日はこう。 `sun|mon|tue|wed|thu|fri|sat` 。

# CloudFormation

## 子スタックの Parameters には CommaDelimitedList を渡せない

`String` か `Number` しか渡せない。
エラーメッセージが **Value of property Parameters must be an object** なので非常にわかりにくい。

> Note
> 
> If you use the ref function to pass a parameter value to a nested stack, comma-delimited list parameters must be of type String. In other words, you cannot pass values that are of type CommaDelimitedList to nested stacks.

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html#Parameters

解決策。
`CommaDelimitedList` を `Fn::Join` でカンマ区切りの `String` に変換すれば渡せる。
子スタックで再びリストに変換される。

```json
{
  "SubStack" : {
    "Type" : "AWS::CloudFormation::Stack",
    "Properties" : {
      "TemplateURL" : "https://s3.amazonaws.com/cf/substack.template",
      "Parameters" : {
        "SubnetIds" : {"Fn::Join" : [ ",", { "Ref" : "SubnetIds" }] }
      }
    }
  }
}
```

[List Params and Nested Stacks on CloudFormation](http://blog.mikebabineau.com/2014/05/05/cloudformation-nested-stacks-gotcha/)

# S3

## 旧バージョンの有効期限を設定ができない

S3のバージョニングを有効にしている場合、旧バージョンの有効期限を設定できない。
S3のAPIには設定方法(NoncurrentVersionExpiration)があるがCloudFormationが対応していない。

[PUT Bucket lifecycle](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html)

```json:現バージョンしか設定できない
{
  "Bucket" : {
    "Type" : "AWS::S3::Bucket",
    "Properties" : {
      "LifecycleConfiguration" : {
        "Rules" : [
          {
            "Status" : "Enabled",
            "ExpirationInDays" : 90
          }
        ]
      }
    }
  }
}
```
インスタンスが生成されてから一度しか実行されない機構


#### 概要
~~dispatch_onceを使えばインスタンスのライフサイクルで１度しか実行されないことを保証する機構ができます。~~
できませんでした。

詳細についてはコメント欄をどうぞ

### 背景
インスタンスが生成されてから一度だけ実行したい処理というのは出てくると思います。そんなの init でやればいいのですが、
状況によっては init の時には準備が整っておらず、任意のタイミングで処理を実行したいことがあると思います。

その時にフラグのプロパティを持つのはダサい、マルチスレッド面倒！という場合の解決策です。

### 概要
* インスタンスに`dispatch_once_t`型のプロパティを持つ
* このプロパティを`dispatch_once`に渡して実行する

### コード
```
@interface MyObject : NSObject
@property (nonatomic, assign) dispatch_once_t onceToken;
- (void)runOnce;
@end


@implementation MyObject
- (void)runOnce {
    dispatch_once(&(_onceToken), ^{
		// 一度しか実行しない処理をここに書く
    });
}
@end

```


### 実験とその結果
以下のクラスに対して、処理を100回リクエストする処理を行いました。

```MyObject
@interface MyObject : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) dispatch_once_t onceToken;
@property (nonatomic, assign) NSInteger count;
- (void)runOnce;
@end

@implementation MyObject

+ (instancetype)objectForName:(NSString *)name {
    MyObject *obj = [MyObject new];
    obj.name = name;
    return obj;
}

- (void)runOnce {
    dispatch_once(&(_onceToken), ^{
        _count++;
        NSLog(@"%@ : here!!!", _name);
    });
}
@end

```

```実験
MyObject *obj1 = [MyObject objectForName:@"obj1"];
MyObject *obj2 = [MyObject objectForName:@"obj2"];

dispatch_group_t group = dispatch_group_create();

for (NSInteger i = 0; i < 100; ++i) {
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [obj1 runOnce];
        [obj2 runOnce];
    });
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

NSLog(@"%@ -> %ld", obj1.name, obj1.count);
NSLog(@"%@ -> %ld", obj2.name, obj2.count);

```

```結果
2014-09-03 19:27:08.895 project[28275:7400318] obj1 : here!!!
2014-09-03 19:27:08.896 project[28275:7400318] obj2 : here!!!
2014-09-03 19:27:08.896 project[28275:7400187] obj1 -> 1
2014-09-03 19:27:08.896 project[28275:7400187] obj2 -> 1
```

様々なスレッドからobj1, obj2に対して`runOnce`を呼んでいますがobj1, obj2のどちらも処理は一度しか行われていないのが分かります。


### 注意点
onceTokenは書き換え可能なのでインスタンス内などで上書きしないようにしましょう。
tokenの値が元に戻ると再び処理が実行されます。
IAM要点まとめ


IAMは無料。使い放題。
AWSユーザーの認証とアクセスポリシーを管理する。

[AWS Black Belt Techシリーズ AWS IAM](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-aws-iam)

##AWSの操作をグループ、ユーザー、ロールといった単位で管理出来る
‘IAM構成例’
管理者　AWSアカウント　全操作可能
開発者　IAMユーザーorグループ　S3に関する全ての操作が可能
運用者　ロール　S3参照のみ期間限定で可能


##IAMユーザー

- 最大5000ユーザー
- ユーザー名、（オプションで）パス、所属グループ、パーミッション（AWSリソースのアクセス権限）が設定可能

##IAM　グループ

- 最大100グループ
- グループ名、（オプション）パス、パーミッション（AWSリソースのアクセス権限）が設定可能

##IAMで利用される認証情報

- アクセスキーID/シークレットアクセスキー（REST、Query形式のAPIで利用）
コンソールから生成出来る。Active/Inactiveが切り替えできる。

- X.509Certificate（SOAP形式のAPIで利用）
OpenSSLなどで作った証明書をアップロードする。

- AWSコンソールのログインパスワード
デフォルトは未設定。128文字までのBasicな認証。パスワード変更時のポリシーが設定できる。
IAMユーザーは専用のURLからコンソールにアクセスする。URLはデフォルトではアカウント名を付け足したもの。

- MFA（多要素認証）
ハードウェアもしくは仮想MFAを利用。

##IAMポリシーの記述
例）アクセス元が176.32.92.49ならば、S3のListBucketsとGetの操作を許可する

```json
{
	"Effect": "Allow",
	"Action": [
		"s3:ListBuckets",
		"s3:Get *"
	],
	"Resouce":[
		"arn:aws:s3:::mybucket"
	],
	"Condition": {
		"IpAdress": {
			"aws:SouceIP":["176.32.92.49/32"]
		}
	}
}

```

※指定したもの以外を許可する場合は"NotAction"、"NotResouce"をつかう
※"Resouce"はARN（AmazonResouceName）を利用 `arn:service:region:account:resouce`
ARN詳細（[Amazon Resource Names (ARNs) and AWS Service Namespaces - Amazon Web Services](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)）
※Resouceに対するActionの許可の条件判定を"Condition"で行う

##Conditionの書き方

```
	"Condition": {
		"IpAdress": {
			"aws:SouceIP":["176.32.92.49/32"]
		}
	}
```
**演算子:｛ポリシー変数:条件値｝**

演算子

- 文字列
- 数値
- 日付・時間
- ブール値
- IPアドレス
- AWSリソース
- IfExists　（演算子に付与。変数が無ければ無視される）
- 条件キーの有無

##変数
- 全てのリクエストで利用可能な変数
	- aws:CurrentTime
	- aws:EpochTime
	- aws:TokenIssueTime
	- aws:principaltype
	- aws:SecureTransport
	- aws:SouceIp
	- aws:UserAgent
	- aws:usename

- その他AWSサービス固有の変数もある

##ConditionのANDとOR
Conditionの下のブロックはAND、演算子に対する値はOR

```json
"Condition": {
	"DateGreaterThan": {
		"aws:CurrentTime": "2013-07-16T12:00:00Z"
	},
	"DateLessThan": {
		"aws:CurrentTime": "2013-07-16T15:00:00Z"
	},
	"IpAddress": {
		"aws:SouceIp": ["192.168.176.0/24","192.168.143.0/24"]
	}
}
```

「2013/7/16の12:00から15:00の間に、ソース
IP192.168.176.0/24もしくは192.168.143.0/24のネットワークからアクセス
したリクエスト」

##サポートと請求画面に対してもアクセスポリシーを指定できる
設定手順

- ルートアカウントからセキュリティ質問を設定
- 費用請求画面へのアクセス
- IAMユーザーに"aws-portal"のアクション追加

##アクセス可否のロジック

- アクセス制御条件は複数指定可能
- **全てのアクセスはデフォルトで不可**
デフォルトでDeny>>Allow>>条件に"Deny"を明示　この順で適用される

##IAMポリシーのテスト
[IAM Policy Simulator](https://policysim.aws.amazon.com/home/index.jsp?%01=#users)

##リソースベースのポリシー
S3バケット、SQSのキューなどAWSリソースに対してもポリシーの設定が可能

##ユースケース｜AWSアカウントを超えたアクセスの許可

```json
{
	"Statement": {
		"Effect": "Allow",
		"Principal": {
			"AWS": "arn:aws:iam::AccountBの番号:root"
	},
	"Action": "s3:*",
	"Resouce": "arn:aws:s3:::mybucket/*"
}

```
俺専用.gitignore

プロジェクト全体で管理する`.gitignore`に書くのはためらわれる。
しかし、gitでバージョンを管理してほしくないファイルってあると思う。

そんなときは、`.git/info/exclude`というファイルにバージョン管理から外したいファイルとかディレクトリを書くといい。

書き方は`.gitignore`と変わらない。
[Rails]エラーの原因を特定出来ない時に便利なbinding.pryの使い方

例えば以下のエラーが出たとする.

Failures:

  1) User pages edit page
     Failure/Error: before { visit edit_user_path(user) }
     ActionView::Template::Error:
       First argument in form cannot contain nil or be empty

しかし,controllerにもviewにも一見問題がなさそう.

### Controller
```
def edit
  @user = User.find(params[:id])
end
```

### View

```
<h1>Update your profile</h1>

<div class="row">
  <div class="span6 offset3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
...

```

何がエラーの原因か特定する為,Controllerで定義された@userの中身を参照したい.


## 使い方
Gemfile（テスト環境）に以下を追加して,bundle install.

```
group :development, :test do
  gem 'pry-rails'
end
```

binding.pry という文章を,処理を止めたいブロックに差し込む.
```
def edit
binding.pry
@user = User.find(params[:id])
end
```

rails sして,コンソールでこの時点での@userの中身を確認できる.

```
    3: 	def show
    4:     	@user = User.find(params[:id])
 => 5:     	binding.pry
    6:   	end

2.0.0 (#<UsersController:0x007f8ce9c4c0e8>):0 > @user　<=入力
=> #<User id: 1, name: "Taro", email: "example@taro.jp", created_at: "2014-09-03 01:06:09", updated_at: "2014-09-03 07:37:00", password_digest: "$hogefugapiyo/uqq...", remember_token: "foobarbaz">
2.0.0 (#<UsersController:0x007f8ce9c4c0e8>):0 > params
=> {"action"=>"show", "controller"=>"users", "id"=>"1"}
2.0.0 (#<UsersController:0x007f8ce9c4c0e8>):0 > params[:id]
=> "1"
```

どこでつまづいているのか確認する手がかりとして使える.
Railsで「何日前」と表記

**メモ**
「約〜時間前」とか表示したいとき

```rb
distance_of_time_in_words_to_now(post.created_at)
```

```ja.yml
ja:
  datetime:
    distance_in_words:
      about_x_hours:
        one: 約1時間
        other: 約%{count}時間
      about_x_months:
        one: 約1ヶ月
        other: 約%{count}ヶ月
      about_x_years:
        one: 約1年
        other: 約%{count}年
      almost_x_years:
        one: 1年弱
        other: ! '%{count}年弱'
      half_a_minute: 30秒前後
      less_than_x_minutes:
        one: 1分以内
        other: ! '%{count}分以内'
      less_than_x_seconds:
        one: 1秒以内
        other: ! '%{count}秒以内'
      over_x_years:
        one: 1年以上
        other: ! '%{count}年以上'
      x_days:
        one: 1日
        other: ! '%{count}日'
      x_minutes:
        one: 1分
        other: ! '%{count}分'
      x_months:
        one: 1ヶ月
        other: ! '%{count}ヶ月'
      x_seconds:
        one: 1秒
        other: ! '%{count}秒'
```
JavaにSSL証明書を追加する


## はじめに
社内等の開発環境のSSLで、所謂オレオレ証明書を使用していることは多いかと思います。
こうした環境を使用する場合、例えば

* ローカルPCのTomcat上のWEBアプリからHTTPSで通信するとSSLHandshakeExceptionなどが発生して困る

という事態が起きるので、Javaにこのオレオレ証明書を追加することになるわけです。
何回か作業してるんですが、追加し終わるとすぐ手順を忘れるので、メモっておくことにします。

※ Macを使った手順ですが、Windowsでも大差ないはずです。

## オレオレ証明書をDLする
FireFoxを使った手順です。

1. オレオレ証明書を使ったサイトを表示する
2. URLの横にある鍵アイコンを押す
3. 「詳細を表示」ボタンを押す
4. ページ情報のダイアログが表示され「セキュリティ」タブが表示されていることを確認する
5. 「証明書を表示」ボタンを押す
6. 証明書ビューアが開くので、「詳細」タブを選択する

7. 「書き出す」ボタンを押下して、適当な名前で証明書を保存する

今回は、`/Users/neno2000/Documents/hogecerts`として保存した前提で、話を進めます。

## keytoolを使用して証明書を追加する

証明書は

```
${JAVA_HOME}/jre/lib/security/cacerts
```
に追加することになります。
※ ${JAVA_HOME}の部分は証明書を追加したいJDKのディレクトリに置き換えてください。

今回は、以下に追加を行う想定で説明します。

```
/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/jre/lib/security/cacerts
```

基本的には

* 先ほどDLしたオレオレ証明書を
* keytoolを使用して
* `${JAVA_HOME}/jre/lib/security/cacerts`に突っ込む

というコマンドを一発叩くだけです。

今回の場合だと、以下の様なコマンドになります。

```
sudo keytool -import -trustcacerts -file /Users/nenokido2000/Documents/hogecerts -keystore /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/jre/lib/security/cacerts -alias ca
```

※ sudoしてますが、Windowsだと必要無いですね。

keytoolが「キーストアのパスワードを入力してください」と要求してくるので、デフォルトの「changeit」を入力してください。