OmniAICreator/Qiita-1.07M huggingface dataset:
A successful Git branching modelのコマンド

## A successful Git branching modelとは
- 原文  
[A successful Git branching model](http://nvie.com/posts/a-successful-git-branching-model/)
- 翻訳  
[A successful Git branching model を翻訳しました](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html)

## 各ブランチについて
- **master**  
リリース可能な状態を反映するブランチ。  
ブランチ名：master  
タグをつける。
- **develop**  
開発用のメインブランチ。  
ブランチ名：develop  
masterブランチから作成する。
- **feature**  
新機能を実装するためのブランチ。  
ブランチ名：master, develop, release-* , hotfix-* 以外  
developブランチから開発者のレポジトリのみに作成。  
修正完了後、developブランチへマージし、削除。
- **release**  
リリースを準備するためのブランチ。  
ブランチ名：release-*  
developブランチから開発者のレポジトリのみに作成。  
修正完了後、developブランチとmasterブランチへマージし、削除。
- **hotfix**  
バグを修正するためのブランチ。  
ブランチ名：hotfix-*  
masterブランチから開発者のレポジトリのみに作成。  
修正完了後、developブランチとmasterブランチへマージし、削除。

## 共有レポジトリ作成
    $ cd xxx
    $ mkdir project.git
    $ cd project.git
    $ git init --bare --shared

## レポジトリ作成、共有レポジトリへpush
    $ cd project
    $ git init
    $ git add .
    $ git commit -m 'initial commit'
    $ git remote add origin ssh://user@server:port/xxx/project.git
    $ git push origin master

## 共有レポジトリからclone
    $ cd xxx
    $ git clone ssh://user@server:port/xxx/project.git

## 初期設定
    $ git config user.name [あなたの名前]
    $ git config user.email [あなたのメールアドレス]

## developブランチ作成（masterブランチから）
    $ git checkout -b develop master
    $ git push origin develop

## featureブランチ作成（developブランチから）
    $ git checkout -b feature develop

## featureブランチマージ（developブランチへ）
    $ git checkout develop
    $ git merge --no-ff feature
    $ git push origin develop
    $ git branch -d feature

## releaseブランチ作成（developブランチから）
    $ git checkout -b release develop

## releaseブランチマージ（developブランチへ）
    $ git checkout develop
    $ git merge --no-ff release
    $ git push origin develop

## releaseブランチマージ（masterブランチへ）
    $ git checkout master
    $ git merge --no-ff release
    $ git push origin master
    $ git tag -a 1.0 -m 'version1.0 release'
    $ git push --tags
    $ git branch -d release

## hotfixブランチ作成
    $ git checkout -b hotfix master

## hotfixブランチマージ（developブランチへ）
    $ git checkout develop
    $ git merge --no-ff hotfix
    $ git push origin develop

## hotfixブランチマージ（masterブランチへ）
    $ git checkout master
    $ git merge --no-ff hotfix
    $ git push origin master
    $ git tag -a 1.1 -m 'version1.1 release'
    $ git push --tags
    $ git branch -d hotfix
Push通知を受け取ったタイミングで処理を行いたい

# 結論
先に結論を書きますが。。
無理っぽいです。

# 問題点
Monacaにて、
プッシュ通知の内容を取得してどうこうという実装しておりました。

```js:Monaca_プッシュ通知取得
ons.ready(function () {
    monaca.cloud.Push.setHandler(function(data){
        alert(data.hogehoge); //オブジェクト形式でデータを取得する事が出来ます。
    });
});
```

Monacaからjson形式でデータを渡す事が出来るため、data.[～～]と記述する事でプッシュ通知に付随するjsonデータを受け取る事が可能です。

ただ、ここには問題点があって、
**こちらがPush通知が送り、受け取ったユーザーが通知をタップしてアプリが起動された場合のみ、イベントが起動する。**
つまり、**ユーザーが受け取ったPush通知をスライド等をして削除して、アイコンをタップしてアプリを起動した場合にはプッシュ通知の内容が取れない**という点です。

ユーザーが通知を100%タップしてくれるとは限らないですし。。
どうしましょう、と途方にくれていました。

# 結論(2回目)
出来そうにないです。
少なくとも私の技術力では分かりませんでした。

APIでデータ取ってくるように修正する方針にしました。

# ちなみにネイティブでは？
## Android(後述の参考サイト: No.2)
Androidにて、端末にプッシュ通知が来たタイミングで処理を行うには、
NotificationListenerService を使用する事で実現が可能なようです。

ただし、このクラスは、Android端末に来た全てのプッシュ通知の内容を取得する事が出来るため、ユーザーにより明示的に設定しなければ、使えないようでした。
要は、プログラム側からは有効・無効の制御が不可なようで、不特定多数に配布するアプリでは、現実的に難しそうです。

## iOS(後述の参考サイト: No.3)

・フォアグラウンドでのみ検出できれば良い場合は、application:didReceiveRemoteNotificationを実装しましょう。

バックグラウンドでは・・・ちょっと後日追記します。
読み込めてない部分がありました。


# 参考にしたサイト
1.[Stackoverflow様 【monacaを利用したiosへのプッシュ通知】](http://ja.stackoverflow.com/questions/7389/monaca%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Fios%E3%81%B8%E3%81%AE%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E9%80%9A%E7%9F%A5 "Qiita")
・・・ こちらは、タップ時のイベント処理に関しての投稿でした。

2.[Qiita: Androidでプッシュ通知が来たタイミングでhogehogeする](http://qiita.com/oggata/items/67f29d8404c655903858 "Qiita")

3.[ブログ: Remote Notificationの実装 – Push通知の検出](http://blogios.stack3.net/archives/2224 "Qiita")


・・・どなたか、実現方法、ご存知でしたら、教えてください。
VMware Workstation/Playerをインストール〜コマンド操作

自宅サーバ用にVMware Workstationを思わず買ってしまったので、備忘録がてらコマンド操作のメモ

タイトルをWorkstation/Playerとしてるのは、基本的にVIX（コマンド操作のユーティリティ）の操作は互換性があるため。
文中では、workstationを使うので、インストール部分など適宜読み替えて下さい。

## インストール

```shell
# 本体のインストール
chmod +x VMware-Workstation-Full-12.0.0-2985596.x86_64.bundle
sudo ./VMware-Workstation-Full-12.0.0-2985596.x86_64.bundle
## ライセンスの表示や、シリアルキーの入力があるので適当にやる

# VIXのインストール
chmod +x VMware-VIX-1.15.0-2985596.x86_64.bundle
sudo ./VMware-VIX-1.15.0-2985596.x86_64.bundle
## ライセンスの表示などがあるので適当にやる
```

## カーネルモジュールの更新

カーネル更新時に自動的にカーネルモジュールを更新してくれるがうまく行ってなさそうな時には、下記のコマンドで解決

```shell
# このシンボリックリンクは、使ってるLinuxのディストリによってはいらないかも。
sudo ln -s /usr/src/kernels/`uname -r`/include/{generated/uapi/,}linux/version.h
sudo vmware-modconfig --console --install-all
```

## 仮想マシンの操作とか

以下のvmrunコマンドで指定する、**-Tオプション**は使ってるVMwareによって適宜切り替えること。

* ws: VMware Workstation
* player: VMware Player

下記に無いコマンドについてもよくまとまってるさんこうにさせていただいた記事
[VMWare VIXを使ってVMWare Playerをコマンドプロンプトから操作する](http://qiita.com/kunst1080/items/920505696ad057f62084)

### 起動中の仮想マシン一覧を表示

```shell
vmrun list
```

### 仮想マシンの起動・停止など

```shell
# 起動（コマンドラインから使うぐらいだからnoguiつける）
vmrun -T ws start "PATH_TO_VMX_FILE" nogui

# 停止（これで停止はできるが、強制停止な気がする。仮想マシン上からshutdownした方がいい）
vmrun -T ws stop "PATH_TO_VMX_FILE"

# サスペンド（使ったことないけど、ACPI周りでうまくやってくれんのかな？）
vmrun -T ws stop "PATH_TO_VMX_FILE"

# リセット（フリーズした時とかに。。。）
vmrun -T ws reset "PATH_TO_VMX_FILE"

# 一時停止
vmrun -T ws pause "PATH_TO_VMX_FILE"

# 一時停止解除
vmrun -T ws unpause "PATH_TO_VMX_FILE"
```

### 仮想マシンのハードウェアバージョンのアップグレード

ハードウェアバージョンを上げることで、割当CPUの数やメモリ量などの上限があがったりする。

```shell
# 仮想マシン停止中に
vmrun upgradevm "PATH_TO_VMX_FILE"
```

### VMware Toolsのインストール

CUIオンリーで使ってると一番困るやつ。結構やり方わからなくて、`init 5`してGUIからインストールしてる人とかいる。

```shell
# 仮想マシン起動中に
vmrun installTools "PATH_TO_VMX_FILE"
## コマンドを実行すると仮想マシン上にCD-ROMとしてマウントされてるので、使ってる仮想マシンのOSに合わせてその後の処理をする
```

おわり。
Swift で printf をしたい 

PHP 経験者が Swift 初経験で困ったことシリーズ。

## PHP

```php
printf('%04d%02d%02d', 2015, 9, 18); // -> 20150918
```

## Swift

```swift
print(String(format: "%04d%02d%02d", 2015, 9, 18)) // -> 20150918
```
WebViewのjavascriptからViewControllerのfunctionを呼び出す方法

# Problem

WebViewにロードしたjavascriptから、ViewControllerのfunctionを呼び出したい

# Solution


## サンプルコード

* サンプルコードで使用しているライブラリ
 * [SwiftFilePath](https://github.com/nori0620/SwiftFilePath): NSFileManagerのWrapperなので、必要ではない



WebViewEvent.js

```js
open("native://anchorClicked?anchorUrl=" + anchorUrl)
```

WebViewController.swift

```swift
class WebViewController: UIViewController, UIWebViewDelegate {

  @IBOutlet weak var webView: UIWebView!

...(省略)...

  func getJavascriptString() -> String {
    let path = NSBundle.mainBundle().pathForResource("WebViewEvent", ofType: "js")!
    return Path(path).readString()!
  }

  func webViewDidFinishLoad(webView: UIWebView) {
    self.webView.stringByEvaluatingJavaScriptFromString(getJavascriptString())
  }

  func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    var url = request.URL!.standardizedURL
    if (url?.scheme == "native") {
      if url?.host == "anchorClicked" {
        let queryStrings = getQueryStrings(url!.query)
        anchorClicked(queryString)
      }
    }
  }

  func anchorClicked(queryString: [String: String]) {
    println(queryString["anchorUrl"])
  }
  
  func getQueryStrings(query: String?) -> [String: String] {
    var queryStrings = [String: String]()
    if let query = query {
      for qs in query.componentsSeparatedByString("&") {
        // Get the parameter name
        let key = qs.componentsSeparatedByString("=")[0]
        // Get the parameter value
        var value = qs.componentsSeparatedByString("=")[1]
        value = value.stringByReplacingOccurrencesOfString("+", withString: " ")
        value = value.stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
        
        queryStrings[key] = value
      }
    }
    return queryStrings
  }
  
}


```
Linuxコマンド覚書(随時更新) 

自分がよく使う組み合わせも併せてメモ

## ディレクトリ圧縮
`tar -czvf dir.tar.gz dir`
ディレクトリdirをdir.tar.gzとして圧縮

#### オプション

|コマンド|機能|
|:-:|:--|
|-c| ディレクトリ構成も含めアーカイブを新規に作成|
|-f |アーカイブファイルのファイル名/デバイスファイル名を指定する|
|-v|処理の詳細を表示する|
|-z|アーカイブ作成と同時にzip形式での圧縮も行う(拡張子：.tar.gz)|


## ディレクトリの容量を表示
`du -h /home --max-depth=1`
/homeの1階層目の容量を適当なサイズ文字を付加して表示
ディレクトリをいれなければ今いる階層をみる。depth=2にすれば2階層分(一つ下まで)の容量を表示

#### オプション
|コマンド|機能|
|:-:|:--|
|-h|認識しやすい単位で容量を表示|
|--max-depth=DEPTH|階層のルートから深さレベルが最大DEPTHまでにある各ディレクトリのディスク容量の合計を表示する|


## ページキャッシュの解放
`echo 1 > /proc/sys/vm/drop_caches`

`echo`の後の数字を変えると解放するメモリが変わる。
1:ページキャッシュ
2:Slabキャッシュ
3:1と2両方

私は1しか使ったことないです…

## メモリーやCPUの負荷率や使用状況を表示する
`vmstat 30 10 -S M`
30秒おきに1,048,576バイト単位で容量を10回表示

#### オプション
|コマンド|機能|
|:-:|:--|
|-a|アクティブ/非アクティブの内訳表示(buff/cacheの表示がなくなる)|
|-p|指定したパーティションの統計を表示|
|-n|ヘッダーを1度だけ表示|
|-d|ディスクに関する統計を表示|
|-f|fork数の表示|
|-s|各情報を詳しい情報名と共に表示する|
|-S|指定した単位で容量を表示する。kは1,000，Kは1,024，mは1,000,000，Mは1,048,576バイト単位で表示する|


## postfixの未配信メール確認/削除
`postqueue -p`　確認
`postsuper -d ALL deferred` 配信待ちをいっぺんに削除
`postsuper -d [キューID]` 指定されたIDのキューを削除

## 現在の場所を表示
`pwd -L`　シンボリックリンクをそのまま使用
`pwd -P`　シンボリックリンクをたどる
ruby-jsonnet使ってみた

ruby-jsonnetを使ってみたので初歩的だけどまとめてみた(ライブラリのUsageがまだ書かれていないので)  
そもそもJsonnetとはなんぞやという人はこちらをどうぞ([Jsonnetの薦め] (http://qiita.com/yugui/items/f4a5e0e9dbd8ddffa48e))  
サンプルのJsonnetもここを参考にした。  
# インストール
[ruby-jsonnet](https://github.com/yugui/ruby-jsonnet)
を参考に、C++実装のオフィシャルライブラリとラッパーであるruby-jsonnetをインストール。  

# 使い方
文字列から読み込み  

```ruby:jsonnet-sample1.rb
require 'jsonnet'
vm = Jsonnet::VM.new
print vm.evaluate(<<"EOS"
local base_id = 1;
[
  {
    id: base_id,
    name: "Alice",
  },
  {
    id: base_id+1,
    name: "Bob",
  },
]
EOS
)
```

次のような文字列のJSONが出力される  

```JSON
[
   {
      "id": 1,
      "name": "Alice"
   },
   {
      "id": 2,
      "name": "Bob"
   }
]
```

同様にJsonnetの中で関数を使いたい場合も  

```ruby:jsonnet-sample2.rb
require 'jsonnet'
vm = Jsonnet::VM.new
print vm.evaluate(<<"EOS"
local fibonacci(n) = if n <= 1 then 1
                     else fibonacci(n - 1) + fibonacci(n - 2);
local nodes = ["Node A", "Node B", "Node C"];
[
    {
        id: i,
        node: nodes[i],
        backoff: fibonacci(i+1)
    } for i in std.range(0, std.length(nodes)-1)
]
EOS
)
```

次のようなJSONが出力される  

```JSON
[
   {
      "backoff": 1,
      "id": 0,
      "node": "Node A"
   },
   {
      "backoff": 2,
      "id": 1,
      "node": "Node B"
   },
   {
      "backoff": 3,
      "id": 2,
      "node": "Node C"
   }
]
```

std.extVarを使いたい場合、あらかじめJsonnet::VMに値を渡す

```ruby:jsonnet-sample3.rb
require 'jsonnet'
vm = Jsonnet::VM.new
vm.ext_var("foo", "bar")
print vm.evaluate('[std.extVar("foo")]')
```

出力

```
[
   "bar"
]
```

他は後で加筆すると思います。
awspecを活用して、AWS Route53でのサブドメイン追加業務を堅実に実施する

# awspecを活用して、AWS Route53でのサブドメイン追加業務を堅実に実施する

よくあるサブドメイン追加業務を、[awspec](https://github.com/k1LoW/awspec)を利用して堅実に実施してみます。

## 1. 修正前のRoute53 Hosted Zoneの状態をawspecでspecファイル化

まずawspecの環境を作ります。awspecで利用するIAMのポリシーは必ずリードオンリー権限のみにしてください。

```sh
$ mkdir awspec
$ cd awspec/
$ awspec init
 + spec/
 + spec/spec_helper.rb
 + Rakefile
 + spec/.gitignore
 + .rspec
$ cat <<EOF > spec/secrets.yml
region: ap-northeast-1
aws_access_key_id: XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EOF
```

Hosted Zoneの状態を`awspec generate route53_hosted_zone`コマンドを使ってspecファイル化します。

```sh
$ echo "require 'spec_helper'" > spec/route53_spec.rb
$ awspec generate route53_hosted_zone example.com. >> spec/route53_spec.rb
```

生成されたspecはこんな感じ

```ruby
describe route53_hosted_zone('example.com.') do
  it { should exist }
  its(:resource_record_set_count) { should eq 4 }
  it { should have_record_set('example.com.').a('203.0.113.1').ttl(3600) }
  it { should have_record_set('example.com.').mx('10 mail.example.com').ttl(3600) }
  it { should have_record_set('mail.example.com.').a('203.0.113.1').ttl(3600) }
  it { should have_record_set('example.com.').ns('ns-123.awsdns-45.net.
ns-6789.awsdns-01.org.
ns-2345.awsdns-67.co.uk.
ns-890.awsdns-12.com.').ttl(172800) }
end
```

これで現状のRoute53 Hosted Zoneのspecファイルが生成されました。
実際に`rake spec`を実行してみます。

```
$ rake spec

...

Finished in 1.55 seconds (files took 0.66 seconds to load)
6 examples, 0 failures
```

グリーンになることを確認しました。

## 2. 今回追加するサブドメインのレコードをspecに追記

今回は`dev.example.com` のAレコード ([203.0.113.3](http://tools.ietf.org/html/rfc5737)) を追加します。

```ruby
describe route53_hosted_zone('example.com.') do
  it { should exist }
  its(:resource_record_set_count) { should eq 4 }
  it { should have_record_set('example.com.').a('203.0.113.1').ttl(3600) }
  it { should have_record_set('example.com.').mx('10 mail.example.com').ttl(3600) }
  it { should have_record_set('mail.example.com.').a('203.0.113.1').ttl(3600) }
  it { should have_record_set('example.com.').ns('ns-123.awsdns-45.net.
ns-6789.awsdns-01.org.
ns-2345.awsdns-67.co.uk.
ns-890.awsdns-12.com.').ttl(172800) }
  it { should have_record_set('dev.example.com.').a('203.0.113.3').ttl(3600) } # 開発環境用のために追加
end
```

コメントが書けるのが意外に便利だったりします。

`rake spec`を実行してレッドになることを確認します。

## 3. マネジメントコンソールなどでHosted Zoneの修正を実施

手動。。。

手動では実施せず、 [roadwalker](https://github.com/winebarrel/roadworker) などを使うとカッコいいと思います。

## 4. チェック

修正後、`rake spec`を実行してグリーンになることを確認します。

DNSの変更確認に [Infrataster::Plugin::Dns](https://github.com/otahi/infrataster-plugin-dns) を併用するのもカッコいいと思います。

終わり！

## その他

なんか前に[同じようなエントリー](http://qiita.com/k1LoW/items/0ad3d70251c6adfad0e1)を書いたような。。。
ガベージコレクション・循環参照・弱参照って

#ガベージコレクション
自動的なメモリ解放機構
メモリ解放タイミング：メモリ不足時、明示的な解放指示時

#循環参照
複数の物体（オブジェクト）で相互に情報を参照し合ってループを成している状態
Wikipediaより

#弱参照
ガベージコレクションの対象にしない参照
コード表示を綺麗に：シンタックスハイライトしたい

サイト制作時に使うモジュール集を作成するときに、
他の人がコードを見やすいようにしたい。
↓
google-code-prettify　導入！

## google-code-prettifyとは

* コードを綺麗に表示
* シンタックスハイライトをしてくれます。

autoloader（以下）を使い、CSSを読み込ませればすぐにできます。

```html
<script type="text/javascript" src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
```

（ホスト元が移動していたようです。修正しました。@annyamonnya さんご指摘ありがとうございます！）

ただ、autoloaderだとカスタマイズが難しいようす。
（カスタマイズ無しでよいならばこちらの方が楽ですね）

## ファイルをダウンロードして使います。

https://github.com/google/code-prettify

* lang-css.js
* prettify.css
* prettify.js

を落としてきます。

## ファイルを読みこませます

### CSS

header内に読み込みます。

```html
<head>
<link rel="stylesheet" href="../css/prettify.css" type="text/css">
</head>
```

### JS

私はjsをbody閉じタグ前で読み込ませました。

```html

<script src="../js/prettify.js"></script>
<script src="../js/lang-css.js"></script>
<!-- prettyPrint()関数を実行するため追加↓ -->
<script>prettyPrint();</script>
</body>
```

## 使用例
※.module_codeのdivは後から勝手に付けたので消してくださって問題ないです。

### HTML

```
<div class="module_code">▼ HTML</div>
<pre class="prettyprint">
この中にコード
</pre>
```

### こんな感じになります。（内容はh3のコード）
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/eeca4c66-3da6-972d-9b4b-6e5f00fa1630.png)



## カスタマイズ
以下に様々なスタイルのCSSがあります。
その中身をprettify.cssと入れ替えると、
スタイルが変わります。
https://github.com/google/code-prettify/tree/master/styles

スタイルの例は以下で紹介しています。
https://github.com/google/code-prettify/tree/master/styles

## てへぺろ うっかり例
コードの表示が上手くできてないと思ったら、
（スタイルが適用されてしまっていたり。）
preタグ内の実体参照化を忘れていました。(先輩からご指摘。ありがとうございます！)

ちなみに以下でSublimeTextとEmmetをつかえば、
簡単に実体参照できました。


http://aicocco.com/post/102454640894/syntax-highlighte%E3%81%A8emmet%E3%81%A8


## 参考：
Google Code Prettify のかゆいとこをなんとかする jQuery プラグインを書いてみた
http://www.cyokodog.net/blog/jquery-ex-code-prettify/

[Ex Code Prettify] その場で編集／実行できるシンタックスハイライター jQuery プラグイン
http://www.cyokodog.net/blog/ex-code-prettify-doc/

google-code-prettify を使ってシンタックスハイライト
http://www.webdesignleaves.com/wp/htmlcss/1457/
RDSのOSアップグレードのメンテナンス通知について

# 通知の内容

インスタンス用 OS アップグレードが保留中です。
これらのアップグレードを利用するには、DB インスタンスを選択し、
[Instance Actions] メニューを開いて [Upgrade Now, Upgrade at Next Window] をクリックします。
何も行わない場合、オプションアップグレードは利用可能のままとなり、
必須アップグレードは AWS が指定する将来の日付にインスタンスに適用されます。
メンテナンス列でアップグレードタイプを確認することもできます。
注意: OS アップグレード中はインスタンスがオフラインになります。

# 困ること

* OSのアップグレード中はオフラインになる事
* アップグレードしないと指定日に強制アップグレードが走る事

# AWSサポートに今問い合わせたよ

Q1：無停止でOSアップグレードする方法ないですか？
Q2：マルチAZでは無停止でアップグレードが進行しますか？

A：Multi-AZの場合でも必ずフェイルオーバが1度発生し、フェイルオーバ期間中の 60 - 120 秒程度のダウンタイムが発生致します。
まずはセカンダリのほうで適用され(セカンダリ適用中はRDSの動作に影響はございません。)、その後マスター側をメンテナンスするために1度フェイルオーバーを実施して、メンテナンス済みのセカンダリを新マスターとして利用し、旧マスター側をメンテナンスする流れとなります。
マスター側メンテナンスのために1度は必ずフェイルオーバを実施する必要がございます。
その為、アクセスの少ない時間帯にメンテナンスを入れて、アップグレードして頂く事になります。

# テスト環境をマルチAZに変更して[今すぐアップグレード]押してみた

時系列のログをまとめるとこんな感じで進行しました

9月 18 9:35 午前　マルチAZに変更を開始します。

9月 18 9:41 午前　マルチAZへの変更が完了しました。

9月 18 9:54 午前　アップデートパッチ追加開始

9月 18 10:02 午前　マルチAZのフェイルオーバー開始
* 接続確認しながら行っていたのですが、ここでDBへのアクセスが途切れました。

9月 18 10:03 午前　DBを再起動しました

9月 18 10:03 午前　フェイルオーバーが完了しました。
* 実際にDBへのアクセスが復活しました。約１分間繋がらない時間がありました。

9月 18 10:12 午前　アップデートパッチ追加完了しました。
* ここでアップデート処理が完全に完了しました。
* マルチAZ側はアップデートしなくていいのかなーと思ったけど、多分新規にマルチAZに変更したので、すでに新OSで作成されたと推測。

# 感想・まとめ

* すでにマルチAZにしている環境ではどんな動きするのかなー？→AWS側の回答ですっきりした。
* 必ずファイルオーバが発生して、1分くらいダウンタイムがあるから、メンテナンス入れて更新しないといけない。
* メンテナンス自体はすんなり約18分で完了した。
* 新規にRDSインスタンスを作成してみたら、OSアップデートされた状態で作成されてた。メンテの必要無し
iOS Simulator で TableView がスクロールできない！

## 前提

- Airのトラックパッド
- TableViewControllerを使ってる

こんな感じでTableViewにたくさんセルを入れてみても、スクロールできない。
というか全然スクロールのジェスチャーに反応してないみたい・・

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/9813f836-0c24-de80-05e5-e48fb0756910.png)

ちなみにページロード直後に右側にチラリとスクロールバーが出現してくるので、TableViewControllerのスクロールするかの設定はできてるっぽい（初期状態のまま）

### TableView の attribute inspector

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/a16e88f3-066a-bc3a-6f7a-bfcfa85747d3.png)

## 解決策

[Objective-C - トラックパッドでiOSシミュレータの操作 - Qiita](http://qiita.com/jin/items/f851f8fb6cfab71faceb)

そもそも iOSシミュレータのスクロール操作は __三本指__ !!!
なぬ〜

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/9752c6f0-bb04-e469-f67a-529201319244.png)

システム環境設定 > トラックパッド　から　３本指のドラッグ　を有効にする

でiOSシミュレータで対象の画面を __三本指__ で触るとスクロールできるようになる。。
Xcode: Module file was created by a newer version of the compiler

# Problem

Xcodeでアプリをビルドしたときに以下のエラーが発生する

```
Module file was created by a newer version of the compiler
```

# Solution

1. プロジェクトのキャッシュを削除
 - Xcode > Window > Projects > ビルド対象のプロジェクトを選択して、`Delete`ボタンを押下する
2. プロジェクトをクリーンする
 - Xcode > Product > Clean
3. ビルドする
Vagrant で CentOS を yum update した後に mount 出来ない時の対応

# はじめに
Vagrant で OS を初回起動させ、`yum update` などを行った上で `vagrant upload` すると、Vagrantの共有フォルダである `/vagrant` をマウント出来なくなってしまいました。

同様のケースは多々あるようで、根本の原因は `kernel-devel` が無かった事でしたが、ベースとした Box が bento/centos-6.7 (version 2.2.0) の場合、gccとperlも不足していたり、再起動が２度必要だったりしたので、初回に必ずやるコマンドを整理しました。


# 手順
## バージョン

Vagrant : version 1.7.4
Box : bento/centos-6.7 (version 2.2.0)


## コマンド

### 1. 仮想サーバの起動
```console:Command@PowerShell
> vagrant init bento/centos-6.7
> vagrant up
```

### 2. 必要なソフトのインストールとアップデート
```console:Command@CentOS
# yum -y install gcc perl
# yum -y install http://vault.centos.org/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm
# yum -y update

# exit
```

### 3. 仮想サーバの再起動
```console:Command@PowerShell
> vagrant reload
```

### 4. vboxadd の設定
```console:Command@CentOS

# /etc/init.d/vboxadd setup

# exit
```

### 4. 仮想サーバの再起動
```console:Command@PowerShell
> vagrant reload
```

### 5. done!
これでvagrantの起動時にマウントが可能になります。


# 参考
- [Vagrant で CentOS 6.5 を使っていたら Guest Additions の更新に失敗してハマった -Qiita](http://qiita.com/a-suenami/items/3b04151ce6e7d5b72a3e)
- [Vagrantのあのエラー - the code to rock](the code to rock)
ActiveAdmin にカスタムアクションを追加する。(idが必要な場合、必要ない場合)

idが必要な場合は member_action を使う。

```rb:app/admin/example.rb
ActiveAdmin.register Example do
  member_action :action_name, method: :get do
  end
```

生成されるパス:
`/admin/examples/:id/action_name`

idが必要が必要ない場合は collection_action を使う。

```rb:app/admin/example.rb
ActiveAdmin.register Example do
  collection_action :action_name, method: :get do
  end
```

生成されるパス:
`/admin/examples/action_name`



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
LaravelでForm Model Binding (with relationship)

# はじめに

LaravelでOne to Manyの関係を持っているmodelのフォームをForm Model Bindingを使ってきれいに書きたいなと思った次第です。
環境はLaravel5.0で、フォーム作成にはlaravelcollectiveを用いています。
http://laravelcollective.com/
Columnが複数のParagraphを持っているというケースで考えます。

```
Column hasMany Paragraphs
Paragraph belongsTo Column
```

# 実装

## controller

createではcolumnとparagraphをnewしてviewに渡してます。
storeではRequestを受け取ってMass Assignmentを使ってColumnとParagraphを保存しています。
ColumnとParagraphを一気にsave出来れば良いのになーと思っていたのですが、自分が調べた限りではOne to Manyの関係の場合は出来ないような感じでした。One to Oneだと出来るっぽいです。

editとupdateは省略しますが、大体似たような感じだと思います(気が向いたら載せます)。

```php:app/Http/Controllers/Columns.php
    public function create()
    {
        $data = [];

        $column = new Column;
        $paragraphs = array_fill(0, 3, new Paragraph);
        $column->paragraphs = $paragraphs;
        $data['column'] = $column;
        return view('column.create')->with($data);
    }

    public function store()
    {
        $column = Column::create(Request::except('paragraphs'));

        $paragraphs = [];
        $ary_paragraphs = Request::only('paragraphs');
        foreach($ary_paragraphs as $i => $ary_paragraph) {
            $paragraph = new Paragraph;
            $paragraph->fill($ary_paragraph);
            $paragraphs[] = $paragraph;
        }
        $column->paragraphs()->saveMany($paragraphs);

        return Redirect::action('Columns@index');
    }
```

### view

modelのカラム名をForm::textに渡せばバインディングしてくれます。

```php:resources/views/column/create.blade.php
{!! Form::model($column, array('action' => 'Columns@store')) !!}
<div class="form-group">
    {!! Form::label('column_title', 'タイトル:') !!}
    {!! Form::text('column_title') !!}
</div>

@foreach ($column->paragraphs as $i => $paragraph)
    <div id='paragraph-{{$i}}'>
        <div class="form-group">
            {!! Form::label('item-' . $i, '見出し' . ($i+1) . ':') !!}
            {!! Form::text('paragraphs[' . $i . '][item]', $paragraphs[$i]['item']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('content-' . $i, '本文' . ($i+1) . ':') !!}
            {!! Form::textarea('paragraphs[' . $i . '][content]', $paragraphs[$i]['content']) !!}
        </div>
    </div>
    <div class="form-group">
        {!! Form::submit('保存') !!}
    </div>
@endforeach
{!! Form::close() !!}
```

もっと良い書き方があれば教えて下さい！
c++ builder > SysUtils.RaiseLastOSError > 直前のOSエラーをエラーダイアログで表示する / それ以降は処理されなくなる


## よくわからない
時計合わせの関数SetLocalTime()のサンプルを探していて、偶然見つけたdephiコード (ドイツ語はさっぱりだが）

http://www.delphi-treff.de/tipps-tricks/system/systemeinstellungen/systemzeit-und-datum-aendern/

上記のコードにて SetLocalTime()失敗時にRaiseLastOSErrorを呼んでいる。

[VCL Reference](http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_RaiseLastOSError.html)

> Call RaiseLastOSError to raise an EOSError exception for the last OS API call that failed.

今のところRaiseLastOSErrorの使い方がよくわからない。

<hr>
## 使用例1 (GetLastError()との組合せ)
http://blog.delphi-jedi.net/2010/10/29/the-way-winapi-shows-errors/
において以下を組み合わせて使用しているようだ。
- RaiseLastOSError()
- GetLastError()

Raiseでフラグをセットして、Getでそれを取得する???
他にRaiseLastOSError()を使う理由が未調査。

<hr>
## 公式ヘルプ
[公式のヘルプ](http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_RaiseLastOSError.html)

三回 RaiseLastOSError()を使用している。
うち、一回は以下の使い方

```
/* Let the Delphi's Exception dialog pop-up */
    RaiseLastOSError(ERROR_NOT_ENOUGH_MEMORY);
```

<hr>
## 別の使用例 (一部独自メッセージ表示に)

別の使用例

[@ codeverge](http://codeverge.com/embarcadero.cppbuilder.native/throwing-eoserror-exception/1075848)

Stackoverflowでたくさん教えていただいているRemy Lebeauさんのコード

```cpp
void FileOpCheck(BOOL result, AnsiString filename) 
{ 
    if( result == FALSE ) 
    { 
        int LastError = GetLastError(); 
        if( LastError == ERROR_FILE_NOT_FOUND ) 
            throw EFileNotFound(filename); 
        else 
            RaiseLastOSError(); 
    } 
} 
```

元の質問はFILE_NOT_FOUNDの時だけ独自のエラー表示をして、他は通常のエラー処理をしたいとのことだった。

<hr>
## とりあえずの理解

以下のように理解した。

A-1. `RaiseLastOSError()`は直前のOSエラーを下記のようなOSが用意したエラーダイアログで表示する。

![raisedOSerror.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2368e8f4-ab5a-2723-dc45-39b705f1fe68.png)

A-2. OSが用意したダイアログでのエラー表示が嫌な人は`GetLastError()`でエラー番号を取得し、`(その番号==ある番号[例: ERROR_FILE_NOT_FOUND])`の場合、`MessageDlg()`で独自メッセージとして表示する、という使用例がある。

A-3. `SetLocalTime()`失敗時などのように、通常であれば失敗時にエラーダイアログが表示されない時に、あえてエラーダイアログを表示したい時に`RaiseLastOSError()`をコールする、という使用例がある。


ちなみに以下のようにエラーを直接指定してエラーダイアログを表示する方法もある。

```cpp
#include <winerror.h> // for ERROR_FILE_NOT_FOUND
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	RaiseLastOSError(ERROR_FILE_NOT_FOUND);

	String msg = "test25";
	OutputDebugString(msg.c_str());
}
```

なお、上記のようなコードの場合、`String msg = "test25";`以降の処理が実行されないので注意が必要かも。
`RaiseLastOSError(ERROR_FILE_NOT_FOUND)`や`RaiseLastOSError()`実行後は後の処理をしない、ということなのかもしれない。
【iOS9】Amazon S3のHTTPSを対応させる方法


## 現象

iOS9では、アプリで基本SSLに対応していない通信は弾かれてしまいます。

[iOS9 ATS問題](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58)

Apple公式は下記から
[App Transport Security Technote](https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/)

## S3の対応について

Amazon S3を使って画像やJSONファイルを読み込ませるために使っており、iOS9で検証したところ、HTTPでの通信で弾かれることに気づきました。

で、HTTPSにURLを変更したところ、通らない。。。

S3のSSLが、Appleの対応のもに合わないため、通信は通らないようです。

S3側の対応は、9月30日まで対応するそうです。

[SHA256ハッシュアルゴリズムへの対応](http://aws.amazon.com/jp/security/security-bulletins/aws-to-switch-to-sha256-hash-algorithm-for-ssl-certificates/)

## アプリで通信を通るようにする方法

S3の対応を待っていられない方は、Xcodeプロジェクトに設定を入れて対応しましょう。

Custom iOS Target Propertiesに
App Transport Securityに関する記述をすることで解決します。

Info.plistに下記を記述

```xml
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>s3-ap-northeast-1.amazonaws.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>
```

`NSIncludesSubdomains`を設定することで、サブドメインを有効にできます。
セキュリティをより厳しくするのであれは、`NSIncludesSubdomains `のKey/Valueを外し、`${bucketName}.s3-ap-northeast-1.amazonaws.com`などのフルのホスト名で記述しましょう。

各種設定項目は、App Transport Security Technoteに記載されています。
iOS9 からの ATS に対応する


Xcode7 にアップデート、iOS9向けで開発を始める時に気をつけることとして ATS(App Transport Security)があります。
※ATSの影響を受けるのは、Xcode 7.0以降を使用し、Base SDKを9.0以降とした場合

公式ドキュメントによると下記の条件を満たさないリクエストは失敗するとのこと。

```
The server must support at least Transport Layer Security (TLS) protocol version 1.2.
Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key.
Invalid certificates result in a hard failure and no connection.
```
参考：https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/


少し乱暴な言い方をすると http リクエストはそのままでは必ず失敗する(https でリクエストして)ということです。

とはいえアクセスするサイトを全て https 対応にするのは大変なのでその場しのぎで iOS9 向けアプリの http リクエストを有効にします。


# http アクセスを全て有効にする

下記　NSAppTransportSecurity から始まる xml をアプリの Info.plist に追記してください。

```Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
</dict>
</plist>

```

# ドメイン指定で http アクセスを有効にする。

下記のように http アクセスを許可するドメインを plist に追記します。ドメインはサブドメインも記述する必要があります。

```Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>www.example.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>
</dict>
</plist>

```
Xcodeの複数バージョンを共存


--
早速、Xcode7を入れたのですがバージョンを戻して、既存ソースをビルドしないといけなくなったので、
旧バージョンをダウンロードして７と6.4を共存させる手順をまとめました。

--

##1 旧バージョンのXcodeをダウンロードする

以下からdmgファイルをダウンロード出来ます。
https://developer.apple.com/downloads/

![スクリーンショット 2015-09-18 8.53.02.png](https://qiita-image-store.s3.amazonaws.com/0/70430/224071d9-4422-7fca-6160-427fa7d5249a.png "スクリーンショット 2015-09-18 8.53.02.png")

##2 インストール
すでにインストール済みアプリ名をアプリケーションフォルダで名前を変更する

dmgファイルから旧バージョンのXcodeをインストール
![スクリーンショット 2015-09-18 8.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/70430/86691abb-4bf6-18bc-58bd-daf3cbe7ad75.png "スクリーンショット 2015-09-18 8.51.34.png")

便宜上、これも名前を変更しておけば使用するときに切り替えて利用出来ます。
![スクリーンショット 2015-09-18 8.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/70430/196fc31a-41d9-4c88-e2b4-a931c3860ce0.png "スクリーンショット 2015-09-18 8.57.08.png")

##3 起動

プロジェクトファイルを右クリックから
「このアプリケーションで開く」から、バージョンを指定してXcodeを起動できます。
oracle ロックセッションを kill する

oracle 停止(shutdown normal)時、なかなか処理が終わらないので確認したら案の定ロックセッションがあった。

ロックセッションを kill した時のメモ。


# セッションの確認

```
SQL> SELECT
        SID, SERIAL#
    FROM
        V$SESSION
    WHERE
        SID IN (
            SELECT
                SID
            FROM
                V$LOCK
            WHERE
                TYPE IN (‘TM’,'TX’)
         )
    ;
```


# セッション kill

```
SQL> alter system kill session ‘*SID*, *SERIAL#*‘
```
時間計測　NSDate と　gettimeofday()　速度比較でわかった事

時間計測には　NSDateを使用する方法 と　gettimeofday()を使用する方法があります。
最近のCPUは、早いからどちらでもあまり問題なならないのですが、
前々から、どちらが早いのか知りたくてテストしました。
結果からするとほぼ同じでNSDateが気持ち遅いかな程度なのですが、予想外な事がわかりました。

環境はXcode7.0で　ターゲットはiPhone5s(ios8.3)です。

まず、Codeから
> #Global変数
   struct timeval start_time;
   struct timeval current_time;
   NSDate *measureTime;
   NSDate *totalTime;

> #処理
    double sum;
    totalTime = [NSDate date];
    for( int loop=0;loop<10;loop++)
    {
        sum=0.0;
> #NSDateの場合
        for( int i=0;i<100;i++)
        {
            measureTime = [NSDate date];
            [NSThread sleepForTimeInterval:0.1];
            NSTimeInterval dt = -[measureTime timeIntervalSinceNow];
            sum+=dt;
        }       
>#gettimeofdayの場合
        for( int i=0;i<100;i++)
        {
            gettimeofday(&start_time, NULL);
            [NSThread sleepForTimeInterval:0.1];
            gettimeofday(&current_time, NULL);
            double start   = (double)start_time.tv_sec+(double)start_time.tv_usec/1000000.0;
            double current = (double)current_time.tv_sec+(double)current_time.tv_usec/1000000.0;
            double dt = current-start;
            sum+=dt;
        }
#
        NSLog(@"time=%f",sum/100.0);
    }
    NSLog(@"totalTime=%f",-[totalTime timeIntervalSinceNow]);


内容
・0.1秒寝ている時間を100回測定して平均時間を測定する。
・それを10回実行して全体時間を測定する。
・結果はLogで出力


３回実行して測定した結果（秒）
![a.png](https://qiita-image-store.s3.amazonaws.com/0/75082/72231530-e306-078b-00b6-ca28e4e0035c.png)

![a.png](https://qiita-image-store.s3.amazonaws.com/0/75082/d2cb90b8-65ad-bae7-91e0-641f53df6d54.png)

結果からgettimeofday()が早いとなるのだが、・・・・・・・
んんんん　100msのSleepで平均101msなのが気に入らない

100msのSleepは本当に100msか確認
( [NSThread sleepForTimeInterval:0.1];のみで全体時間測定 )
![a.png](https://qiita-image-store.s3.amazonaws.com/0/75082/339f8bbe-f5d0-90de-5337-812727958209.png)

1ms余分にかかってましたね。ならば、実質の測定全体時間は、
>NSDate      : 101.090191-101.075412 = 0.014779 秒(100回x10回)
gettimeofday: 101.078647-101.075412 = 0.003235 秒(100回x10回)

となるのですが、
１回あたり 14us と 3us・・・・・
んんんん　桁違うじゃん　４倍も違う なんで　誤差？？？？

SleepなければNSDateとgettimeofdayの測定時間がどうなるか確認
( [NSThread sleepForTimeInterval:0.1];を削除で全体時間測定 )
まずは、NSDate
![a.png](https://qiita-image-store.s3.amazonaws.com/0/75082/240bf7a0-7cd7-f997-c63c-36b2a323a1c5.png)
次にgettimeofday
![a.png](https://qiita-image-store.s3.amazonaws.com/0/75082/270e5575-7050-4a09-496a-5af971730e68.png)

さっきの計算でgettimeofdayは、１回あたり3usだったから
そんなに差がないじゃん？？？？？？

単体計算では
>  NSDateの場合
　101.075412(Sleep全体時間) + 0.002940(測定全体時間) = 101.078352 秒(100回x10回)
 gettimeofdayの場合
　101.075412(Sleep全体時間) + 0.002428(測定全体時間) = 101.07784 秒(100回x10回)

なので、ほとんど差がないはずなのですが、
実際(最初の測定)の結果と比較すると
>  NSDateの場合　　101.090191 秒 -> 101.078352 秒 (差0.011839秒）
   gettimeofdayの場合 101.075412 秒  -> 101.07784 秒　(差-0.002428秒）

これは、推測ですが、NSDateの場合は、Sleep処理になんらかの負荷をかけている
または、Sleep処理組み合わさった場合にコードの最適化がよくない等と思います。
（まあ問題にするほどの事ではないですがね・・・・・）

#テスト結果
・ほとんど同じですが、NSDateが気持ち遅いかな程度。
・Sleepと組み合わせると追加の気持ち時間が追加される。
HTTP2で非SSL(http)でのPOSTを試すには

# 背景

mruby-hibariはコード眺めたら、POSTでのパラメータもRubyっぽく
扱えるようにすでに実装されていた。これを試したいと思った。

h2oのh2o_mrubyのexampleをベースにあれこれしていたので、httpsではなく、httpで
HTTP2を扱っていた。POSTはhtml書けば、できるが、ブラウザはHTTP2をhttpではアクセスできない。こまった。

# httpsではなくhttpでHTTP2のPOSTを行う

nghttp2に付属のnghttpコマンドが任意のファイルをPOSTする機能があり、「-」を指定すると標準入力を対象にしてくれることが分かった。

```bash
 echo "param1=hogeguga&kjunichi=nomoney" |nghttp -d - 'http://127.0.0.1:8080/foo/'
```

で出来た。
技術英語 > back to front / inside out / upside down / right-left reversed

引用: 冠詞マスター教本 by 石井隆之さん

> I've put on my sweater back to front.
(セーターを後ろ前に着てしまった)

関連して思い出したのは
- inside out
- upside down

技術的な利用としては upside down を使うかもしれない。

- Do not install the heating system upside down.


さらに思い出したのは
- head over heels ([alc](http://eow.alc.co.jp/search?q=%22head+over+heels%22))

ふと「左右逆」というのはなんだろうと思って調べたら
- right and left are reversed ([weblio](http://ejje.weblio.jp/content/%E5%B7%A6%E5%8F%B3%E9%80%86))
- 短い表記では right-left reversed
Swift2.0でNSCalendarを使う


いままで

```swift
let dataComps = calendar.components(.NSYearCalendarUnit|.NSWeekOfMonthCalendarUnit|.NSWeekdayCalendarUnit, fromDate: startDate)
```

こうだったのが

```swift:swift2.0

let dataComps = calendar.components([.Year, .Month, .Day], fromDate: startDate)

```

こうなりました。
OptionSetTypeによって、文法が変わったことによる影響です。
これ外してたらクッソ恥ずかしいよっていう英語のルールまとめ


## 動詞-able

「〇〇可能である」という __形容詞__ になる。

> Readable Code

un + 動詞 + able で「〇〇不可能である」になる。

> Network is unreachable.

「英語を喋れる」みたいな、動詞に修飾がついてる時はisEnglishSpeakableとかしちゃうのは気持ち悪いのでcanSpeakEnglishとかでいいと思います。

## enable/disableは動詞

able -> 可能である、有効である

en(dis) + 形容詞で「〇〇にする(でなくする)」という動詞になる。

```
var isEnabled = true  // 正
var isEnable  = false // 誤
```

## regist

-erで終わる単語は動詞につくものというイメージが強いので「登録する」という意味で関数名などにregistという単語を使ってしまいがちだが、英語にregistという単語はない。

registerが「登録する」という意味の動詞。

## erばっかじゃないよ

動詞-erで「〇〇する人(もの)」という名詞になるが-erでなく-orになるものもある。

- director
- indicator
- operator
- iterator
- processor
【保存版】ググりにくいSwiftの構文の呼び名/用語まとめ


とりあえず自分が検索しづらくてイラッとしたやつをまとめました。
今後も追記していきます。

## Optionalなオブジェクトをアンラップする ```!```

-> __Forced unwrapping__

## 変数宣言の型についてる ```!```

```swift
var message: String!
```

-> __Implicitly unwrapped optional type__
-> __暗黙的アンラップ__

## Optionalなオブジェクトのメンバにアクセスするときついてる ```?```

```swift
println(optionalDog?.bark())
```

-> __Optional chaining__

## ```if let```

```swift
if let dog = boy.petDog {
	println(dog.name)
}
```

-> __Optional binding__
-> __オプショナル束縛__
-> ```if var``` ```while let``` ```while var``` などもある

## ```??```

```swift
let message = json["message"] as? String ?? "no message"
```

-> __Nil coalescing operator__
-> __Swift double question mark__

## 型チェックの ```is```

-> __Type check operator__
-> __Type checking__

## キャストの ```as``` ```as?``` ```as!```

-> __Type cast operator__
-> __Downcasting__
-> __Force casting__ (as!)

## 引数に渡すクロージャが括弧の外に出てる奴

```swift
func doSomething(message: String, completion: ()->Void) {
    println("Hello")
    println(message)
    completion()
}

doSomething("Good afternoon") { () -> Void in
    println("Good night")
}
/*
Hello
Good afternoon
Good night
*/
```

-> __Trailing closure__

## ```...``` ```..<```

```swift
for i in 0...5 {
	print(i)
}
/*
012345
*/
or i in 0..<5 {
	print(i)
}
/*
01234
*/
```

-> __Range operator__
phpenv入れてからのはなし

#php-buildのアップデート

 # cd [xxx]/phpenv/plugins/php-build/
 # git pull

##からのビルド
`phpenv install 5.x.x`
で良いんだけど、php.iniは引き継いでくれたりしない。特に同バージョンでのビルドし直しに注意！

#peclがない！
phpizeでいいけど、どうせならrbenvっぽく使いこなしたい


 # phpenv global 5.x.x
 # cd [peclのソース]
 # phpize
 # ./configure
 # make ...

globalなりlocalなり指定しない場合 ./configure で php-configのパスを指定しないといけない。
自分がQiitaに投稿したタグの投稿タイプを一覧取得する方法

Qiitaのユーザーページにある円グラフ

![narikei   Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/7132/acb47863-a43d-d637-20f2-ae0c40ca35d7.png)

この投稿タイプのタグを全部取得したいときの方法です。

Otherで隠れてしまっているのですが、

とくにAPIも用意されていないっぽい・・・
全記事取得するのはちょっと面倒なので色々いじっていたら見つけました。

## とりあえず取得したいユーザーのページを開きます

![スクリーンショット 2015-09-18 1.41.10.png](https://qiita-image-store.s3.amazonaws.com/0/7132/355f240c-73a1-9793-b1b3-3d50659db382.png)

## ユーザーページでおもむろに ```Command + Option + U``` でソースを表示（Mac Chromeの場合）

## ページのソースで ```Command + F``` で ```var tagData``` の場所を表示

![スクリーンショット 2015-09-18 1.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/7132/8cf97c35-e8ce-4dec-0283-e36c074365f9.png)

## この行をコピペ

どこまで取得できるかはわかりませんが、とりあえずこの方法でいけました。
LINQでList<string[]>から検索してインデックスで返すやつ

最近の業務でCSVファイルをあれこれいじくるっていうのをC#で書いてる。

C#自体はなんかJavaみたいで特に問題はなくするする書けるのだけど
LINQで列挙するような奴がすごく便利だとは気づいたけどなかなか難しい。

CSVファイルはVB.NETにあるTextFieldParserを使って`List<string[]>`にしているのだけど、
扱ってるファイルはものによってどこに何があるのかというのが違ってくる場合があって
その揺れを吸収してなんとか必要な範囲だけの値を取り出したくこんなものを書いた。

```csharp:LINQSearchReturnIndex.cs
 var f = new List<string[]>
{
 new string[] {"a","b" }
 new string[] {"c","d" },
 new string[] {"e","f","g" },
 new string[] {"1","g","f" },
 new string[] {"h","i","j" },
 new string[] {"k","l" }
};

 var d = f
.Where(l => l[0] == "e")
.FirstOrDefault()?
.Select((s, i) => new { s, i })
.Where(t => t.s == "f")
.Select(l => new {
  CIndex = l.i,
  RIndex = f
  .Select((a, i) => new { Line = a, ri = i })
  .Where(s => s.Line[0] == "e")
  .FirstOrDefault()?
  .ri
  }
);

 Console.WriteLine($"{d?.Single().RIndex}:{d?.Single().CIndex}");
 Console.ReadKey();
```
ある文字列から始まる行のどこにもう一つの文字列があるかを調べるもの。
0からはじまるインデックスで返してくれるはず。
C# 6.0から追加された`?.`演算子も便利。


冗長かなとは思うけどとりあえずこれでなんとかなったので良しとした。
見つかった場所のインデックスを列挙できたりメソッドにしてやれば便利なんだろうけど、
そこまで勉強できてないのでここまで。

すごいつよいひとはもっとわかりやすく書けるのだろうけど自分には限界でした。
RubyとRailsのインストールメモ


新しいパソコン(windows8)にRuby on Railsの環境を構築しました。railsの環境構築は何度かやったけど、毎回どこかしらで躓くのでメモ。

# Rubyのインストール

1. まずはRubyのバージョン管理するためのuruをインストール。C:/tools(どこでもいい)フォルダを作成し、実行ファイルを配置する。このフォルダにpathを通して、"uru_rt admin install"をターミナルで実行。
2. RubyInstallerを使って、Rubyをインストール。今回は、2.0と2.2をインストールした。
3. "uru admin add ruby.exeのあるフォルダ --tag 登録タグ"をターミナルで実行して、それぞれのrubyをuruに登録。今回は以下を実行。

	```
	>uru admin add C:\Ruby\Ruby200\bin --tag ruby2.0
	>uru admin add C:\Ruby\Ruby22\bin --tag ruby2.2
	```
4. devkitをインストール。解凍したフォルダで、"ruby dk.rb init"、"ruby dk.rb install"を実行。

# Railsのインストール

1. gemのアップデートを行う。"gem update --system"をターミナルで実行。
2. railsのインストール。"gem install rails"を実行。最新のrailsがインストールされる？
3. "gem install sqlite3"をターミナルで実行した後に、sqlite3.dllをruby/binに追加。

# 環境構築

1. MinGWのインストール。"C:\MinGW\jsys\1.0"をpathに追加。
2. MinGWシェルを起動(msys --mintty)し、mkdirコマンドで作業ディレクトリを作成。
3. virtual boxをインストール。
4. vagrantをインストール。

# MySQLを使用する準備

1. MySQLをインストール。
2. gem 'mysql2', '~> 0.3.20'をGemファイルに追加。ちなみにここでバージョン指定しないとエラー出ます。

他にも注意すべきところは沢山あるので、随時補完していきたいです。
Rで実行時間を計測して出力する

RStudioのKnit HTMLの結果に表示した

[参考:R FAQ 'How can I time my code?'](http://www.ats.ucla.edu/stat/r/faq/timing_code.htm)
[RStudioでKnit HTML](http://plaza.umin.ac.jp/~takeshou/R/RmdToHTML.html)

## RMarkdownのコード例

```r

計測開始

\```{r, echo=FALSE}
ptm <- proc.time()
\```

\```{r}
print('Do some long time calculation')
Sys.sleep(15)
\```

計測終了

\```{r, echo=FALSE}
proc.time() - ptm
\```

```

※backtickのエスケープがよくわからないので `\` を入れている

## 結果

![r_proc.time.png](https://qiita-image-store.s3.amazonaws.com/0/5764/43bd9ef1-ab13-4e24-d4ce-e601bdc44ddf.png)
InGameChat機能ソリューション調査


LobiChat
PhotonChat
gamedonia
gamespark
nextpeer
mobilusのkonnect
fresviiのappsteroid
appwarp
Comechat
getsocial
c2call
pubnub
acision
chatmapper
LeanCloud
anychat
gotye
yunva

LobiChat
メリット
Lobiのコミュニティ機能を利用できる
アクティブするだけで利用できる
利用しているゲームが多いので、機能は証明されている
デメリット
UIが変更できない
チャット仕様変更できない

https://developer.lobi.co/ja/

PhotonChat
メリット
SDKが優れている
Photonクラウドを採用している国内ゲームが多い
デメリット
UI機能はない
一番近いサーバーがシンガポールに

https://www.exitgames.com/ja/Chat

gamedonia
ゲームバックアンドサービス、クラウドベース
日本語対応なし、サーバーが海外にある
unity pluginあり
https://docs.gamedonia.com/guides/in-game-chat
専用のchat機能が実装されてはないが、チャット機能実現は可能。
http://offers.gamedonia.com/hs-fs/hub/463904/file-2580571564-pdf/02_Info_PDF_Gamedonia/Gamedonia_Backend_Briefing.pdf
チャット実現
https://docs.gamedonia.com/guides/in-game-chat#Join_a_chat_room-1



gamespark
ゲームバックアンドサービス、クラウドベース
日本語対応なし、サーバーが海外にある
unity pluginあり
TeamChatMessageでチャット機能を実装しているが、他の機能と独立していない
https://docs.gamesparks.net/documentation/message-api/teams-message-api/teamchatmessage




nextpeer
バックアンドサービス、クラウドベース
“the most powerful social layer …”云々
日本語対応なし、サーバーが海外にある
unity pluginあり
streamというLineみたいなingamesocialツールが実装できる
https://nextpeer.atlassian.net/wiki/display/DEV/Social+SDK+Features




mobilusのkonnect

“OEM型メッセージングシステム”云々
日本語対応
unity pluginがない
http://mobilus.co.jp/konnect/





fresviiのappsteroid
ソーシャルゲームサービス、クラウドベース
voice chat機能提供
動画録画共有サービス
ソーシャル機能サービス
アプリプロモーションサービス
ゲーム運営サポートサービス
Web コンソールサービス
日本語対応・日本の会社
詳細調査必要
unity plugin あり
https://www.fresvii.com/features/social






appwarp
paas/baas
日本region対応あり
unity plugin あり
https://apphq.shephertz.com/service/deployApp


Comechat
Messenger

unity plugin なし
専用のチャットツールに近い
http://www.cometchat.com/features/all-features



getsocial
日本語対応なし
unity pluginあり
SNS招待機能もある
機能一覧
Fully customisable UI
Player-to-player chat
Developer-to-player communication
Segmented and Global Activity Feeds
Community Management
Player Feedback and support
Smart invites and tracking
Socially endorsed promotions for in-app purchases
Socially relevant cross-promotion tools
Localised to 12 languages
In-app Notification Center
Socially triggered push notifications
And more…
getsocial.im
https://github.com/getsocial-im/getsocial-unity-sdk#adding-the-sdk-to-your-game






c2call
unity plugin なし
日本語対応なし
専用チャットツール制作ツール
Video Chatもできる
https://www.c2call.com/en/prices.html



pubnub
http://www.pubnub.com/knowledge-base/categories/chat-apps

チャットのサービスではなく、networkのサービス
かなり強力なサービス
unity対応あり
DeNA, BitCoin exchangeも利用している
“Secure, Bi-Directional, Low-Latency Communication for IoT, Mobile, and Web”云々


acision
Think WhatsApp + Skype for enterprise.
forge SDK
global SMS coverage
IP Messaging
Enterprise向け
http://forge.acision.com/products/forge-sdk










chatmapper
チャット機能ではない
Virtual Reality eLearningができる
http://www.chatmapper.com/showcase/




LeanCloud
中国国内only
Baas
Unity対応
https://leancloud.cn

anychat
中国国内only
Baas
録画機能
http://www.anychat.cn/

gotye
中国国内only
Cocos2d,Unity対応あり
http://www.gotye.com.cn/


yunva
中国国内only
http://www.yunva.com/production.php
【R】1つでも欠損値のある行のみを取り出す

data.frameから1つでも欠損値のある行を取り出す。
使うことはあまりないが忘れた時のために…。

```r
# sample data
dat <- data.frame(
  a = c(1, 1, NA, 0, 1),
  b = c(NA, 0, 1, NA, 0),
  c = c(NA, 0, 1, 1, 0)
)

# 1つでも欠損値(NA)をもつ行を取り出す
dat[!complete.cases(dat), ]

# !を除くとna.omit(dat)と同じく欠損値をもつ行を取り除く
dat[complete.cases(dat), ]

```
GoogleCloudPlatformについての覚書

#GoogleCloudPlatform覚書
GoogleCloudPlatform=GCP
データセンターが１つのコンピュータという考え方。

## Google Cloud Platformのサービス

### BigQuery
巨大なデータからSQLでデータを抽出できる。
4TBだろうと20秒程度。データ自体もPB（ペタバイト）も入る。
簡単に言うと裏ですごい数のPCで並列にSQLを処理してると。
KPIなどデータ集計に使うのが主。
データの総量＋データの解析に使われた量(Byte)によって課金（使った分だけ請求スタイル）。

◆Drenel
BigQueryで使われている技術。旧MapReduce。

### BigTable
高速にスケーラブルなNoSQLデータベース
BigQueryが使った分課金なので、頻繁にアクセスがあるようなユーザデータならこっちのがいいかも。

### Cloud Dataflow
受け取ったデータに対し、複雑な処理ができる。
JavaScriptで記載。いずれPythonも対応…予定。
BigQueryの前（データを積むときなど）後（複雑な集計など）で使われることが多い。
バッチ処理とストリーミング処理が可能。
しかも書き方を統一。少ないコードで簡単にバッチかストリーミングか切り替えれる。

◆FlumeJava,MillWhell
Cloud Dataflowで使われる技術

◆使用モデル
Your DATA　→　Pub/Sub（で送る）　→　Dataflow（で集計用のデータに成形）　→　BigQuery（に積んで適宜集計結果を排出）　→　json形式で出力されるので受け取ったところで表示（集計結果表示）

### Borg
GCPのコンテナ技術。一般のDockerにあたるもの。

### Cloud Storage Nearline
書き込みが早い。そのくせ低料金のストレージ。
DiskIOを分散して速度UPを実現してる。

### プリエンプティブルVM
最長24時間で確実に落ちるインスタンス。
その性質上料金70%OFF。
これ専用というわけではなく、Compute Engineのインスタンスを立てるときにオプションで設定する。
一時的なバッチを使うときに使うインスタンス。

### Firebase
webサーバーとDBが一緒になったイメージ。

◆ユーザ認証処理
ユーザ認証用の関数が用意されている。

◆同期処理が簡単
1000台くらいなら遅延(そんなに)感じず接続できる。
チャット機能とかならすぐできそう。

◆リアルタイムDB（NoSQL）

◆使用モデル
端末　⇔　Firebase（　⇔　ServerやAPI）
最小モデルが端末とFirebaseだけでOK！
ただ、端末からの情報をそのまま処理させたくない（DBに積みたくない）ときとか、一旦Severに送って成否を確認してFirebaseに返す等。

## GCPの利点
◆料金のかかり方（わかりやすい）
使った分だけ安くなるというスタイル。

◆海外に強い。
リージョンが別々でも一括して管理できる。
（その国その国に近いところにリージョンを置いてもまとめて管理できる）
それに現状日本に一番近いところがアジアリージョン（台湾）なのだが、特にレイテンシの遅延は感じられないとのこと。


## おまけ
◆Ingress(イングレス)
Googleが提供しているスマートフォンゲーム。
当然GCPが使われている。

## 参考URL

◆Deep Dive into Google Cloud Technology
https://speakerdeck.com/googlecloudjapan/deep-dive-into-google-cloud-technology
↑GoogleCloudPlatformってこうゆうの

◆GoogleCloudPlatform Japan
http://www.slideshare.net/GoogleCloudPlatformJP
Googleのデータ分析
Qiitaの記事タイトルとURLを楽にコピーするブックマークレットを改良してみた

前回：
[Qiitaの記事タイトルとURLを楽にコピーするブックマークレット作ってみた](http://qiita.com/Cf_cwd/items/f08ffc8b53c7aae16442)

いただいた編集リクエストを参考にMarkdown記法をコピーできるテキストエリアとEscキーでウィンドウを削除する機能を追加しました。
(個人的には選択肢が多い方がいいと思ったため、元のコピー機能も残しました)

以下圧縮済みコードです。

```js
javascript:void (function(e){var f=location.href;f=f.split("?")[0]||f;if(f.split("/")[4]!="items"){return;}(function d(){var m=e.getElementsByTagName("h1")[0].innerHTML;
var b=e.body||e.getElementsByTagName("body")[0];var n=e.createElement("div");n.setAttribute("style","z-index: 9999;position: fixed;top: 0px;bottom: 0px;left: 0px;right: 0px;width: 50%;height: 50%;margin: auto;padding: 1%;border-radius: 5px;background: #666;");
var c=e.createElement("div");c.setAttribute("style","z-index: 9999;position: absolute;width: 5%;height: 100%;top: 0px;right: 0px;background: #f93;text-align: center;border-radius: 5px;font-size: 150%;cursor: pointer;");
c.onclick=function(){var g=this.parentNode;b.removeChild(g);};c.onmouseover=function(){this.style.backgroundColor="#fa6";this.style.color="#666";};c.onmouseout=function(){this.style.backgroundColor="#f93";
this.style.color="#000";};var k=e.createElement("p");k.setAttribute("style","position: absolute;top: 0px;bottom: 0px;left: 0px;right: 0px;height: 1em;width: 1em;margin: auto;padding: 0;font-weight: bold;user-select: none;");
k.innerHTML="×";c.appendChild(k);var a=e.createElement("textarea");a.setAttribute("style","width: 95%;height: 50%;padding: 1%;text-align: center;border-radius: 5px;border: none;resize: none;");
var l=a.cloneNode(true);a.innerHTML=m+"\r\n"+f;l.innerHTML="["+m+"]("+f+")";l.onfocus=a.onfocus=function(){this.select();};l.onkeydown=a.onkeydown=function(g){if(g.which==27){c.click();
}};n.appendChild(a);n.appendChild(l);n.appendChild(c);b.appendChild(n);}());}(document));
```

また時間のある時にGreaseMonkeyのスクリプトとして整形しようと思います。
作成したのでリンク:
[Qiitaの記事タイトルとURLを楽にコピーするGreaseMonkeyスクリプトを改良してみた](http://qiita.com/Cf_cwd/items/fa86498f2f8d7b612479)

追記：
GreaseMonkey用のコードを改変していたのでブックマークレット用コードに修正しました。
Xcode7でbitcodeのエラーが出た

環境はXcode7GM

過去のプロジェクト(Xcode6.x以前)でサードパーティのライブラリをリンクしている場合、以下のようなエラーが出る。

```Swift

ld: 'ライブラリ名' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture (アーキテクチャ名)

```
`Build Settings` > `Enable Bitcode`を**NO**にすれば解決する。

Xcode7からは、デフォルトでビルド時にビットコード(中間コード)が含まれており、これによって、各プラットフォームのアーキテクチャに最適なネイティブコードがコンパイルされ、パフォーマンスの向上を図っているらしい。

問題なのは、Xcode6.x以前で作成したプロジェクトをXcode7で開いた場合でも、デフォルトでビットコードを含むように設定されるらしい。そのため、リンクしているサードパーティのライブラリがビットコードを含んでいない場合に上のようにエラーとなる。

参考

>[Impact of Xcode build options “Enable bitcode” Yes/No](http://stackoverflow.com/questions/31088618/impact-of-xcode-build-options-enable-bitcode-yes-no)

おわり
Kotlinのif let

swiftだとおなじみの１文

```swift
let name: String? = "John Doe"

if let it = name {
  print("Name: \(it)")
}
```

kotlinだと次のように書ける

```kotlin
val name: String? = "John Doe"

name?.let {
   print("Name: ${it}")
}
```

これは引数を安全にunwrapしたいときにべんり。
またletは返り値がきちんととれるので、optionalな値をoptionalでない値に操作する時にも便利.

たとえば、３項演算が必要な場合

```kotlin
val number: Int? = null
val twoTimesNumber = if (number != null) number * 2 else 0
```

nil coalescing operatorと組み合わせると、if-else をかくよりもすっきりする.

```kotlin
val twoTimesNumber = number?.let { it * 2 } ?: 0 
```