OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Community 2013で最初のC言語プログラム

Visual Studio Community 2013でコンソールアプリケーションを開発する手順を解説します．

# 準備

## エクスプローラで拡張子を表示する

エクスプローラで拡張子が表示されないといろいろ苦労するので，最初にフォルダーオプションの設定をする．
エクスプローラを起動し，表示 > オプションを選択する．
あるいはコントロールパネル > フォルダーオプションを選択する．
「フォルダー オプション」ダイアログが開く．表示 > 詳細設定 > 「登録されている拡張子は表示しない」のチェックを外す．

# 起動
Visual Studio 2013 を起動する．

Windows 7であれば，スタートメニューから起動する．
Windows 8系であれば，Modern UIから起動する．
あるいは，Win+Qで開いた検索ボックスにvisual...と入力していくと，候補がインクリメンタル表示されるので選択する．
タスクバーにピン留めしておくと，タスクバーから起動できるので便利．

# プロジェクトを作成
ファイル > 新規作成 > プロジェクト... を選択する．
あるいは，スタートページの左上にある開始の下の 新しいプロジェクト... を選択する．

「新しいプロジェクト」ダイアログが開く．

1. 左のメニューから Visual C++ > Win32 を選択する．
2. 中央のリストから「Win32 コンソール アプリケーション」を選択する．
3. 名前は適切なプロジェクト名を付ける．ここでは仮に hello とする．
4. 場所はプロジェクトを保存するディレクトリであり，適宜変更する．デスクトップに作成したければ，c:\users\ユーザ名\Desktop となる．
5. 「ソリューションのディレクトリを作成」のチェックボックスを外す．好みの問題だが，小規模なプログラム作成でディレクトリ階層が深くなるのは扱いにくいと思う．

![vsc-first1.png](https://qiita-image-store.s3.amazonaws.com/0/53034/d4489b94-952a-13d0-d19c-bb9c9c3f6f65.png)
以上の設定をして，「OK」をクリックする．

「Win32 アプリケーション ウィザード - (プロジェクト名)」ダイアログが開く．

1. 左のメニューから アプリケーションの設定 を選択する(あるいは「次へ」をクリック)．
2. 追加のオプション の「空のプロジェクト」にチェックを入れる．
3. 同じく追加のオプションの「Security Development Lifecycle (SDL)チェック」のチェックを外す．

![vsc-first2.png](https://qiita-image-store.s3.amazonaws.com/0/53034/debffe1c-5127-38d3-6a06-7548f0c3678c.png)

# ソースコードの記述
プロジェクトが開かれる．最初は何もない．
## ソースコードの追加
右の ソリューション エクスプローラー (開発するプログラムに関わるファイルの一覧が表示される)の，「ソース ファイル」を右クリックし，追加 > 新しい項目... を選択する．
![vsc-first3.png](https://qiita-image-store.s3.amazonaws.com/0/53034/86e7cf3c-9369-bdfc-6604-eb92ebea89ed.png)

「新しい項目の追加 - (プロジェクト名)」ダイアログが開く．

1. 左のメニューから Visual C++ を選択する(多分，そのようになっている)．
2. 中央のリストから「C++ ファイル (.cpp)」を選択する．C言語の機能しか使う予定は無くても，拡張子は.cppにしておく．
3. 名前は適切なソースファイル名を付ける．ここでは仮に hello.cpp とする．
![vsc-first4.png](https://qiita-image-store.s3.amazonaws.com/0/53034/3d0a1b5a-f541-50ad-c70c-d268615b7dc2.png)

以上の設定をして，「追加」をクリックする．「hello.cpp」タブが現れ，入力が可能となる．

## プログラムの作成
ソースコードを適宜記述していく．
統合開発環境の利点には，エディタ内で補完が効くこと，組にして入力すべき記号(C言語なら{など)が自動的に入力されること，予約語(intなど)が色分けされること，などがある．

# コンパイルと実行
## コンパイル(ビルド)
Visual Studioでは実行ファイルの作成をビルドと呼び，コンパイルはその一部である．ビルド > ソリューションのビルド を選択すると，実行ファイルが生成される．

エラーがある場合，ウィンドウ下部にエラーの一覧が表示される．エラーをダブルクリックすると当該行にジャンプするので，修正する．エラーはソースコードの前の方のエラーから修正することが一般的である．前の方のエラーを直すことで，後ろの方のエラーも直ることが多い．

ビルドが正しく終了すると，通例，以下のようなメッセージが出る．

```
1>------ ビルド開始: プロジェクト:hello, 構成:Debug Win32 ------
1>  hello.cpp
1>  hello.vcxproj -> C:\Users\imura\Desktop\hello\Debug\hello.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
```

## 実行
デバッグ > デバッグ開始 でプログラムが実行されるが，一瞬黒色のターミナルが出て，すぐ終了してしまうため，実行結果がわからない．
デバッグ > デバッグなしで開始 を選択すると，終了時に「続行するには何かキーを押してください . . .」と出て結果を見ることができる．

デバッグなしで開始にはショートカットキーとしてCtrl+F5が割り当てられているので，慣れてくればこれを使うのが便利．


# 終了と再開
終了するとhelloディレクトリの中にソースコード以外にも複数のファイルが生成されていることがわかる．
開発を再開するには拡張子が.slnのソリューションファイルをダブルクリックする．
この例ではhello.slnである．
本文書冒頭のエクスプローラの設定をしていないと，どれが.slnファイルかとてもわかりにくいので要注意．

Visual Studio 2013をタスクバーにピン留めしておくと，右クリックから最近使ったソリューションが選べるので便利だ．
複数のLinuxマシン間でクリップボードを共有する【Alt-C】

GIGAZINEにこんな記事がありました。

> [スマホとPC間でテキストをショートカットキーだけで双方向コピペする「Alt-C」 - GIGAZINE:](http://gigazine.net/news/20150418-alt-c-review/)

Linuxで複数のマシンを使っていて、片方で調べながらもう片方でそのコマンド打ちたいんだけど・・・

画面見ながら打つのって面倒くさいですよね?中クリックでぱっと貼りたいですよね?

ということで、DropboxとXシステム上のクリップボードを管理するxclipを使って、簡単なスクリプトで実装してみましょう。

- [man xclip](http://linux.die.net/man/1/xclip)

# 前提

- Dropboxデーモンが動作し、インターネットに接続できる状態であること
- パッケージ"xclip"を導入済みであること

# シェルスクリプトの作成

$HOME/binに以下の2つのシェルスクリプトを用意し、

    sudo chmod u+x ~/bin/clipboard_copy.sh ~/bin/clipboard_paste.sh

で実行権限を与えておきます。

```bash:clipboard_copy.sh
#!/bin/sh
# Required: xclip

xclip -o > $HOME/Dropbox/clipboard
```

```bash:clipboard_paste.sh
#!/bin/sh
# Required: xclip

xclip -i $HOME/Dropbox/clipboard
```
# キーボードショートカットの設定

あとはこれをそれぞれのデスクトップ環境でキーボードショートカットにすればOKです。
(Alt-Cでコピー、Alt-Vで[PRIMARY]クリップボードに貼り付け、など)

# 使い方

使い方は簡単で、コピーしたいところを選択してからAlt + Cを押すと、Dropbox上のフォルダが上書きされ、別のマシン(Dropboxで同期してあるもの)でAlt + Vとすれば、(PRIMARY)クリップボードに登録されます。あとは中クリックで貼り付けるだけ。

# Remark

- もちろんネットワークに繋がっていないとできません。
- 履歴を保持しないのは、複数行のコピー&ペーストが簡単にできるようにするためです。
- Ctrl + Vで貼り付けられるようにするには、pasteの方を

```bash:clipbard_paste.sh
xclip -i -selection clipboard $HOME/Dropbox/clipboard
```

とすれば大丈夫です(詳しくはxclipのマニュアルを参照)。

# まとめ

楽ちん楽ちん
対話に必要なコーパスの集め方　まとめてみた

音声や言語処理のコーパスに関しては比較的まとまっている資料がネット上に転がっているが対話に関しては少ないのでまとめてみた。

対話の場合も音声や言語と同じで大量のデータが必要！！！

しかも特定のドメインに特化した方が良いってことになるとなかなか見つけづらい（汗

そこで対話コーパスの集め方をまとめた

#模擬対話実験(人手）

音声対話システムを実装するのに理想なデータ＝実際にシステムと対話しているデータ

これを作成するには

ユーザー役

オペレーター役

を用意して模擬対話を行ってもらうのが一番早い！！！

条件は細かく設定

##ケース１

現状：京都駅周辺

目的：烏丸御池周辺の用事を済ましてから夕食を取る

知りたい情報：車で現在地から烏丸御池周辺でレストランまで行くのに必要な情報

##実際のデータ収集方法

Wizard if OZ法を使用
ユーザー役があたかも機械と対話しているように錯覚するような状況を作り出して、データ収集する。

オペレーター（機械）がGUIを用いて応答文を瞬時に作成し、音声合成を用いて応答する。

オペレーターがユーザーの声を聞いて答える場合
音声認識を介してオペレーターが答える場合

上記の２種類がある。

＃機械を用いて学習データを集める手法

１：Wizard if OZ法を用いてデータを集める

２：集まったデータのうち、確信度の高いデータの認識データを用いて言語モデルを学習

３：学習語のモデルでデータ収集を繰り返す

（４：確信度の低いデータ、識別器の判別結果が低いデータを選別してラベル付し、それらを学習データとして使用する）

ユーザーの動機付けも大事：理由はユーザーが本当に欲しい答えを求めたり、返答に困ったりすることが少なくなり、質の高い情報を取得できるため。

#音声対話コーパスを機械学習に用いるには

収集したコーパスを機械学習のデータに用いるには、音声データに様々な情報付与が必要

１：音声データの書き起こし

自由対話は書き起こし単位を決めるのが難しい
「談話・対話研究におけるコーパス利用研究グループ」（http://www.slp.is.ritsumei.ac.jp/dtag/JP/
）によると明確な話者交代や400ms以上の無音区間で発話を区切り、発話の重なりはその起こった位置を先行発話側の該当文字にマーキングし、次の発話区切りとして記述。


２：音声対話データのタグ付

音声対話のデータは様々な目的で使用されるため、データに情報を付与する必要がある。

![Screenshot from 2015-04-20 16:30:07.png](https://qiita-image-store.s3.amazonaws.com/0/10496/2a01f06d-f61a-124e-7ca1-78dc73cc7279.png)

###スラッシュ単位：

物理的な区切り（発話の交代や発話の休憩）と論理的な単位は必ずしも一致しない。
そこで文に対するまとまりを示したものを論理的単位として、発話単位タグを付与する。

**同一話者において句点で区切ることが可能と考えられる連続発話
**言いさし、言い間違い、相手の割り込みによって発話が中断し、次の同一話者の発話に継続していない音声的連続

発話中の非文要素についてもタグ付を行う

**あいづち
**接続標識
**フィラー
**言い誤り
**非音声
**ポーズ

###形態素タグ
転記テキストに基づいて付与される品詞ラベル、各単語の開始、終了とともにラベリングされる

###発話単位の機能タグ

それぞれのスラッシュ単位が対話の中でどのような機能を果たしているかどうか情報を付与するもの

**＜対話開始＞＜対話終了＞
**＜働きかけ＞：やりとりを開始する機能
**＜応答＞：働きかけに対する応答
**＜了解＞：やりとりを締めくくる
**＜応答／働きかけ＞：応答と働きかけの両方の機能をもつ

###関連性タグ

発話単位タグでは構造を上手く表現できない「やりとり」間の関係などの対話の中位構造を表現するためのタグである。

関連性１：「働きかけー応答」
応答発話に対して、それを引き出した働きかけの発話の単位番号付与

例：「質問―答え」、「 挨拶―返答」、「 依頼―受諾または拒否」

関連性２：「隣合う複数のやりとり」
働きかけ発話に対して、先行のやりとり構造との関連の有無を「関係有り・関係無し」のいずれかで付与

例：

###談話セグメントタグ

働きかけタイプの発話の前に付与されるタグ

TBI：前後の内容の関連性が強ければ１、そうでなければ２を付与

話題名：どのような話題が付与されているか

セグメント情報：話題の遷移に関する情報を必要に応じて記述「聞き返し」「割り込み」「復帰」

参考

http://www.amazon.co.jp/%E9%9F%B3%E5%A3%B0%E5%AF%BE%E8%A9%B1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E7%9F%A5%E3%81%AE%E7%A7%91%E5%AD%A6-%E6%B2%B3%E5%8E%9F-%E9%81%94%E4%B9%9F/dp/4274203050

##対話コーパスをクラウドを使って集める場合の事例

http://www.anlp.jp/proceedings/annual_meeting/2015/pdf_dir/P2-7.pdf
MeCabでオリジナル辞書を作成する

MeCabにデフォルトで入っていない言葉を形態素解析した時に，意図しない区切られ方になることが有ります．

例えばレシピ中に出てくる「水を切る」という言葉は，「水」「を」「切る」と形態素解析されます．
これは間違いではありませんが，「水を切る」という意味ではなくなってしまい，それが困る場合があります．

なので，MeCabの辞書に登録されていない語句をまとめた，「オリジナル辞書」の作り方を書いていこうと思います．

# 辞書の作成方法
ここでは，MeCabのオリジナル辞書の作成方法を記載します．
データは全てCSV形式（カンマ区切り）で作成します．
文字コードはShift-JIS，改行コードは¥r(Linux)で作成してください．
## 名詞
名詞は，以下のように登録します．
![スクリーンショット 2015-04-20 18.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/63338/2743c6f6-94fc-ec0b-1a92-06011f8c99dd.png)
左から，
**登録したい名詞,ID,ID,重み,品詞,品詞の説明,\*,\*,\*,\*,登録したい名詞,カタカナ表示,カタカナ表記**
と並んでいます．

## 動詞
動詞は名詞とは違い，各活用形を書かなければいけません．
![スクリーンショット 2015-04-20 18.17.34.png](https://qiita-image-store.s3.amazonaws.com/0/63338/6d31f30c-e2b9-a40a-2bf5-fe3c305f4475.png)
表はそれぞれ，
**登録したい名詞,ID,ID,重み,品詞,品詞の説明,\*,\*,活用,活用形,登録したい動詞の原形,カタカナ表示,カタカナ表記**
となっています．
IDは，MeCabに登録されている「する」「きる」「つく」などのIDを，それぞれの動詞に合わせて登録します．

例えば，
から煎りに*する*であれば，599番ですし，
色が*つく*であれば，679番となります．
これは，MeCabの辞書を見て探すしかありません．

# MeCab辞書にCSVファイルをコンパイル
名詞と動詞の表を一つのCSVファイルにまとめ，以下のコマンドを叩きます．
`$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u original.dic -f utf-8 -t utf-8 オリジナル辞書CSVファイル名.csv`
※「オリジナル辞書CSVファイル名.csv」の部分は作成したCSVファイル名に変えてください．

このコマンドを叩くと，「original.dic」というファイルがカレントディレクトリに作成されます．
これがMeCabの辞書となります．
なお，エラーが出る場合は，今一度文字コードがShift-JISで改行コードが¥rになっているか確認して下さい．
※私は「[mi](http://www.mimikaki.net/)」というエディタでよく確認します．

# 辞書をMeCabに登録する
作成した辞書(original.dic)はどこにおいておいてもいいのですが，私は「**/usr/local/lib/mecab/dic/ipadic/**」の中に入れています．
なので，作成した辞書(original.dic)は，**/usr/local/lib/mecab/dic/ipadic/**の中に入っている前提でお話を進めていきます．

「**/usr/local/lib/mecab/dic/ipadic/dicrc**」ファイルのどこかに，次の一文を付け加えます．
**userdic = /usr/local/lib/mecab/dic/ipadic/original.dic**

やり方としては，おそらくターミナルで編集するのがメジャーだと思いますので，
`$ sudo vi /usr/local/lib/mecab/dic/ipadic/dicrc`
を叩き，適当なところに挿入してください．

以上です
PowerShell ハッシュのリストを表形式で出力

PowerShellでハッシュをリストにして保持していることはよくあると思います。
JSONやYAMLなどから読み込んだときによくありますよね。ありますよね。

これを単純に表形式で出力しようとしたら、うまく表示出来なかった。

```ps1
Get-NancharaList | Format-Table
```
とすると

```
Name      Value
----      -----
name      名前１
version   1.1.0
name      名前２
version   2.2.1
```
みたいになってしまう。

ハッシュレコードを1行ずつにして、キーをタイトル行にしたいのに・・・・・。
と思ったら、以下で出来た。

```ps1
Get-NancharaList | %{New-Object psobj -Property $_} | Format-Table -Property name,version
```

こうすると

```
name     version
----     -------
名前１    1.1.0
名前２    2.2.1
```
のように思うとおりの出力が出来た。
Format-TableのPropertyは表示順序の制御のために付けてます。

簡単に書けるけど簡単な書き方に簡単にたどり着けない。。。。。
PowerShell 侮れん。  Rubyほどぢゃないけどね。
flummoxでReact.jsのチュートリアルを動かしてみる


[flummox](https://github.com/acdlite/flummox/)を試してみた。
とりあえず[React.jsのチュートリアル](https://github.com/reactjs/react-tutorial)を真似して[flummox](https://github.com/acdlite/flummox/)で動かしてみようと思い書いてみた。

https://github.com/kunihiko-t/flummox-example

あまりReact.jsのお作法分かってないので書き方間違ってるとか色々あるかも。

connectToStoresを使うことでEvent Listener周りのコードが少なくなったり、全体的に見通しが良い感じ。
Slack+Hubotで複数Bot間のパイプラインを構築


初期から提供されていたWebAPIでは「Bot経由の発言を検知して、別のBotを実行」みたいなことができなかったんですが、昨年末に提供開始された[Real Time Messaging API](https://api.slack.com/rtm)を使うとそれらも含めて色々出来るようになりました。

これのなにが便利かというと、

```
1. 開発者がチャンネルで `@hubot app build` とアプリのビルドを実行する
2. アプリBotがビルドを実行後、ビルド完了をチャンネルに通知する
3. Hubotがその通知を受け取り、デプロイBotをチャット経由で実行する
4. デプロイBotがデプロイ完了をチャットに通知する
5. Hubotがその通知を受け取り、 `@channel` を付けてデプロイ完了した旨を通知する
```

みたいなことができるようになります。
また、副次効果として複数のBot間のパイプラインを構築することでそれぞれのBotが疎結合で役割が明確になり、コードの見通しも良くなります。

で、それを使ってHubot側をどう設定しているかっていうのを紹介するエントリです。

以下の例では *「テストが落ちた通知を受け取ってcommitterにmentionを付けて通知する」* というものを実装します。

![kobito.1429519136.154316.png](https://qiita-image-store.s3.amazonaws.com/222/20074/ebcae717-51ac-3093-0a30-b6a9b41f3f32.png "kobito.1429519136.154316.png")


## 前提
- Slack上でHubotを動かしている
- hubot-slackのアダプタを *v3.0.0以上* を使用している
	- v2→v3のアップグレードは[こちら](https://github.com/slackhq/hubot-slack#upgrading-from-earlier-versions-of-hubot)を参考

## コード例

```
module.exports = (robot) ->
  robot.adapter.client?.on? 'raw_message', (msg) ->
    return if msg.type isnt 'message' || msg.subtype isnt 'bot_message'
    return unless msg.attachments
    match = msg.attachments[0].fallback.match(/Failed:  (.+?)'s build/)
    return if match is null
    commit_user = match[1]
    channel = robot.adapter.client.getChannelByID msg.channel
    # プライベートチャンネルは取得出来ないためundefinedが返される
    return if channel is undefined
    text = "@#{commit_user} テストが落ちたよー！"
    robot.send {room: "##{channel.name}"}, text
```

https://gist.github.com/vexus2/1b708e358205cc277730

こんな感じで新規のスクリプトを追加すれば動きます。

通常のOutgoing Webhookの場合は `msg.text` 、Attachment形式の場合は `msg.attachments` 内に期待するテキストが入ってくるので、それらを正規表現でマッチさせて判定した後に任意のアクションを実行します。

通知を受け取るチャンネルには事前にhubotをinviteしておく必要があります。
また、Slackの仕様上プライベートグループはチャンネルID→チャンネル名の逆引きができないので、Hubotがプライベートグループ内に居たとしても動かないので注意が必要です。
CakePHP3でコントローラーのテストにモックを使う

CakePHP3になって、セッションの設定も簡単にできるようになったし、テストが簡単に書ける！
…と思ったのですが、CakePHP2だと```generate()```でできていたコントローラーのテストにおけるモックの使い方が、3ではイマイチ不明…。
```exec()```でシェルコマンドを呼んでいるところ(メール送信処理)をテストで実行したくなかったので、とりあえず以下のようにしてみました。

```php:BookingsController.php
public function add()
{
    $booking = $this->Bookings->newEntity();
    if ($this->request->is('post')) {
        $booking = $this->Bookings->patchEntity($booking, $this->request->data);
        if ($result = $this->Bookings->save($booking)) {
            // メール送信
            $this->_shell('booking_email send ' . $result->id);
            return $this->redirect(['action' => 'comp']);
        } else {
            $this->Flash->error('The inquiry could not be saved. Please, try again.');
        }
    }
}

protected function _shell($shell)
{
    exec(ROOT . '/bin/cake ' . $shell . ' > /dev/null &');
}
```

```php:BookingsControllerTest.php
public function testAdd()
{
    $data = [
        'name' => 'Yamada Taro',
        'email' => 'test@example.com'
    ];
    $this->_request = $this->_buildRequest('/bookings/add', 'POST', $data);
    $this->_response = new Response();
    $controller = $this->getMock('App\Controller\BookingsController', ['_shell'], [$this->_request, $this->_response]);
    $controller->loadModel('Bookings');
    $controller->expects($this->once())
        ->method('_shell')
        ->with($this->equalTo('booking_email send 2'));
    $controller->add();
    $this->assertRedirect(['action' => 'comp']);
}
```

せっかくの```$this->post('/bookings/add', $data)```とか書けないし、漂う無理やり感…。
もっと美しく書けないのかなぁ。

参考：[Cookbook 3.x - Testing](http://book.cakephp.org/3.0/en/development/testing.html)
Ubuntu 14.10にPhantomJSをインストールする

#したこと
下のURLにしたがってPhantomJSをソースコードからビルドした。
http://phantomjs.org/build.html

#はまったこと
* とくになし

```
# sudo apt-get install build-essential g++ flex bison gperf ruby perl libsqlite3-dev libfontconfig1-dev libicu-dev libfreetype6 libssl-dev libpng-dev libjpeg-devcode ttf-mscorefonts-installer
# git clone git://github.com/ariya/phantomjs.git
# cd phantomjs
# git checkout 2.0
# ./build.sh
```
Serfで実装するHigh Availability NAT

#Serf

障害の検知と、イベントハンドラーを行えるhashicorpのツール。

概要はこちらがわかりやすいです。
http://gihyo.jp/admin/feature/01/serf-consul

#NAT冗長化

最近はAutoScalingによる冗長化もあるが、
切り替わり時間を短くしたいためActive/Standbyによる冗長化を実装。

Serfにより障害を検知し、APIを使用しRouteTableを切り替える。

![ha-nat.png](https://qiita-image-store.s3.amazonaws.com/0/49877/fcc94d7e-0ccf-75d7-9136-1435298e60d7.png)


#Serf実装

Active側が正常であれば、常に経路を寄せるようにする。
Standby側はActive側の障害を検知した際にRouteTableを書き換える。
また、疎通間隔を4秒とし、タイムアウト12秒設定することで最長の障害時間を12秒にする。

オプション等は以下が参考になります。
https://www.serfdom.io/docs/agent/options.html
http://qiita.com/zembutsu/items/1e2cddd0a424ef7a4895

##Serf Active

```
{
  "node_name": "nat1",
  "enable_syslog": true,
  "tags": {
    "role": "nat"
  },
  "reconnect_interval": "4s",←疎通間隔は４秒
  "reconnect_timeout": "12s",←タイムアウト検知12秒
  "tombstone_timeout": "12s",←タイムアウト検知12秒
  "event_handlers": [
    "member-join=ha-nat -R [変更するRouteTableのTagName] -N 0.0.0.0/0 -r ap-northeast-1 >> /var/log/ha-nat.log 2>&1"
  ]
}
```

##Serf Standby

```
{
  "node_name": "nat2",
  "enable_syslog": true,
  "tags": {
    "role": "nat"
  },
  "reconnect_interval": "4s",
  "reconnect_timeout": "12s",
  "tombstone_timeout": "12s",
  "start_join": [
    "Active側のPrivateIP"
  ],
  "event_handlers": [
    "member-failed,member-leave=ha-nat -R [変更するRouteTableのTagName] -N 0.0.0.0/0 -r ap-northeast-1 >> /var/log/ha-nat.log 2>&1"
  ]
}
```

##initスクリプト

zembutsuさんのスクリプトを使わせて頂きました。
lockfile等をちょこっと直して使ってます。
https://gist.github.com/zembutsu/7640108

##RouteTable書き換えスクリプト

BotoによるRouteTable操作を実装しました。
理由としては、AWSで提供するNATインスタンスはAmazonLinuxのため、
botoであればすでに環境は整っているので追加のインストールは必要なくなります。

https://github.com/SatoHiroyuki/ha-nat-script/blob/master/ha-nat

```
ha-nat -R [変更するRouteTableのTagName] -N [書き換える経路(Cidr込み)] -r [リージョン]
```

#起動

Active側のサービスを先に上げる。
その後、Standby側のサービスも上げる。
```
$ sudo /etc/init.d/ha-serf start
```

#障害試験

数回試験しましたが最長で、
Ping1秒間隔の障害試験で切り替わり時に8パケットロスとなり8秒ダウン。

```
--- 8.8.8.8 ping statistics ---
42 packets transmitted, 34 received, 19% packet loss, time 42087ms
rtt min/avg/max/mdev = 2.181/2.454/2.867/0.176 ms
```

その他、タイミングによりますがこれよい短い場合もあります。
尚、両方が正常である場合のStandbyからActiveへ戻す際のパケロスはなし。
GitHub Issueの検索でできること

# GitHubのIssue検索でできること

チームメンバのタスク消化量をIssueの検索だけで可視化できないかと思ってIssueの検索についてざっくり調べました。

https://help.github.com/articles/searching-issues/

ざっくりとまとめておきます。

## 基本
- スペース区切りで複数条件を指定可。 AND条件。
- 指定した条件は基本的にはその文字列の全文検索
- 「:」で区切られた各種フィルターを指定できる

## in
文字列がどのフィールドに含まれているかを指定する。  
指定できるのはtitle, body, comment。カンマ区切りで複数指定可  

- in:title
- in:title,body
- in:comment

## is:public / is:private
リポジトリ横断で検索する場合にpublicのみ、privateのみを指定できる  
当然、privateは自分がアクセス権を持っているリポジトリのみ

- is:public
- is:private

## author
IssueまたはPullRequestの作成者

- author:shunjikonishi

## assignee
現在のassignee

- assignee:shunjikonishi

## mentioned
IssueまたはPullRequestでメンションされている人

- mentioned:shunjikonishi

## commenter
コメントした人

- commenter:shunjikonishi

## involves
関係者(author, assignee, mentioned, commenter)すべて

- involves:shunjikonishi

## team
Organizationリポジトリ限定。チームに対するメンション

- team:code-check/owners

## state
openまたはclosedの状態

- state:open
- state:closed

## label
ラベル。複数指定可。「-」をつけることで、「そのラベルを持たない」という検索条件も指定できる

- label:bug
- label:bug label:resolved
- label:priority -label:bug

## no
label, assignee, milestoneを持たない

- no:label
- no:assignee
- no:milestone

## language
リポジトリの使用言語？いまいち使い道がわからない

- language:ruby
- language:bash
の作成者

## is
状態。open/closedはstateでも指定できるがどっちでも良い。

- is:open
- is:closed
- is:merged
- is:unmerged
- is:pr
- is:issue

## created / updated / mereged /closed
日付時刻での絞り込み

- created 作成日時
- updated 更新日時
- merged マージ日時
- closed クローズ日時

フォーマットは　YYYY-MM-DD または YYYY-MM-DDTHH:MM:SS+09:00  
From/Toは不等号または「..」で範囲を指定する

- created:<2015-04-01
- updated:>=2015-04-01T18:00:00+09:00
- merged:2015-04-01..2015-05-01

「..」を使った場合、境界値を含む(らしい)

## comments
コメントの数

- comments:>100
- comments:500..1000

## user / repo
リポジトリ横断検索で特定のユーザ、またはリポジトリに範囲を限定

- user:shunjikonishi
- user:shunjikonishi/roomframework

## SHA hash
指定の文字列から始まるcommitを持つPullRequest
７文字以上の16進文字列がcommit hashと解釈される(らしい)

- e1109ab
- 0eff326d213c

## sort
ソート。以下の６つ。commentedはコメント数

- created-asc
- created-desc
- updated-asc
- updated-desc
- commented-desc
- commented-asc

## まとめ
mergedByとかcommiterとかあれば最初の目的は検索のみで達成できたと思うが、残念ながらないらしい。  
運用カバーとしてmergeまたはcloseの時点でassigneeを適切に設定しておけば、mergedの範囲検索でその期間の開発者のパフォーマンスレビューはできそうな気がする
Xcode6でGoogle Testを使う

# TL;DR
http://bitrage.de/wp/google-test-with-xcode-6-and-c11
こっちのほうが元情報で、画像付きで分かりやすい

# 準備
1. [Downloads - googletest](https://code.google.com/p/googletest/downloads/list) から1.7.0をダウンロード
2. 任意のツールでzipを解凍して、*gtest-1.7.0/xcode/gtest.xcodeproj*を開く
3. プロジェクトナビゲーターで*gtest*を選択して、*gtest-framework*の*Build Settings*を開く
    * *C++ Language Dialect*を`GNU++11 [-std=gnu++11]`に変更
    * *C++ Standard Library*を`libc++(LLVM C++ standard library with C++11 support)`に変更
    * *OS X Deployment Target*を`Compiler Default`に変更
4. *gtest-framework*をビルドする(Cmd+B)
5. プロジェクトナビゲーターのProductsにビルドされたフレームワークが在るので、*alt*キーを押しながら任意のフォルダにドラッグアンドドロップする
6. googletestを使いたいXcodeプロジェクトにテスト用の*Command Line Tool*ターゲットを追加する
    * *OS X -> Application*にある
    * *Language*は*C++*
7. テスト用ターゲットの*Build Phases -> Link Binary With Libraries*に*5.*でドラッグアンドドロップしたフレームワークを追加する
    * +マーク押すか、Finderからドラッグアンドドロップ
8. メニューバーから*Product –> Scheme –> Tests and then Product –> Scheme –> Edit Scheme*を選択
9. テスト用ターゲットを選択して*Run*の*Environment Variables*に`DYLD_FRAMEWORK_PATH`というキーを追加する
    * Valueは*7.*で追加したフレームワークがあるpath
10. テスト用フレームワークの*main.cpp*の`main()`関数の引数を変更する
    * `int main(int argc, const char * argv[])` -> `int main(int argc, char * argv[])`
        * `const`を外す
        * はずさないとgtestのinitが面倒
11. 準備完了！！！！！！！！！！！！！！！！！！！！！！！！

# 使ってみる
テスト対象のターゲットに下記のようなコード追加する

```cpp
// calc.h
class calc {
public:
    template<class T>
    static T add(T a, T b) {
        return a + b;
    }
};
```

## test書く
```cpp
#include "gtest/gtest.h"
#include "calc.h"


TEST(calc, add) {
    EXPECT_EQ(calc::add(1, 2), 3);
    EXPECT_NE(calc::add(1, 1), 3);
}

int main(int argc, char * argv[]) {
    ::testing::InitGoogleTest(&(argc), argv);
    return RUN_ALL_TESTS();
}
```

雑に*main.cpp*に書いたけどクラスとかに対応するヘッダファイル作って、そこにテスト書いたほうがいいと思う。
テスト用のターゲットにヘッダファイル追加して、テスト書いたらOK。

終わり。

# 参考
* http://bitrage.de/wp/google-test-with-xcode-6-and-c11
    * これの手順を日本語にしただけです。画像付きなのでこっちのほうが分かりやすい
* https://groups.google.com/forum/#!topic/googletestframework/EBY-mkPD4A8
    * Xcodeの"Command Line Tool"のtemplateのままだとビルドエラーになる
ShinobiLayer: Advanced Monitoringによるプロセス監視

#はじめに
SoftLayerのAdvanced MonitoringはNimSoftを使っています。この記事では、よく聞かれるプロセス監視の設定方法を紹介します。

※Advanced Monitoringを選択するとNimSoftのAgentが各サーバーに導入されるのですが、この導入途中でプロビジョニングが長時間待機させられてしまうこともあったり、監視方法に癖があるため、個人的にはAdvanced Monitoringを使うよりは、Zabbix等を独自に導入したほうが良いと思います。

#プロセス名の確認
監視したいプロセス名をチェックします。今回はmysqldを例にとってやってみましょう。プロセス名の特定のためには、psコマンドは-efではな-eをオプションとして使います。

```
# ps -ef | grep -e PID -e mysqld
UID        PID  PPID  C STIME TTY          TIME CMD
root      1591     1  0 14:29 pts/1    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     1700  1591  0 14:29 pts/1    00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root      4042  3248  0 15:15 pts/2    00:00:00 grep -e PID -e mysqld

# ps -e | grep -e PID -e mysqld
  PID TTY          TIME CMD
 1591 pts/1    00:00:00 mysqld_safe
 1700 pts/1    00:00:00 mysqld

```

# Customer Portalでの設定

* Devices -> Monitoringに移動。該当サーバーの**Advanced**のフィールドにて、**Configure Agent Reports**を選択
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/778576c8-84bd-c432-c257-516fe142a9f5.jpeg)

* Agentsとして**Process Monitoring Agents**を選択。Sectionsにて、**Alarm Subscribers**を選択し、メールにて通知先対象を追加。
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/d700a408-7186-216d-d2c8-fd6f11f77946.jpeg)

* Profilesの**Add Agent Config**を選択し、検知するプロセスを構成する。**プロセス名の箇所は「/usr/libexec/mysqld」ではなく「mysqld」であることに注意！** 下記では分かりやすいように、**Watcher Name**と**Process**を同じ名前にしている。最後に末尾の**Add Agent Config**を選択すれば完了。
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/92b1a0e2-173b-dba2-ffa8-cf69bb7a7378.jpeg)

これで、障害時には以下のような通知がメールに転送されます。
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/218cb7e2-678a-c7ab-b916-a3939b49dabf.jpeg)
また、メール以外にも以下の画面から現在発生中の障害を確認することが可能です。
![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4034665d-2c53-5970-dce6-35cf3919aa50.jpeg)



# Process Command Lineの使い方
例えば、特定のshellの監視をしたい時は、Linuxにおけるプロセス名は全て**bash**として出力されてしまうため、区別ができません。この区別が必要な際に使うのが**Process Command Line**です。

具体的な例を見てみましょう。下記は`bash /usr/local/hoge.sh`を実行しているのですが、`ps -e`ではプロセス名に区別が付きません。

```
# ps -ef |grep -e PID -e "hoge.sh" | grep -v grep
UID        PID  PPID  C STIME TTY          TIME CMD
root      3928 22591  0 15:13 pts/0    00:00:00 bash /usr/local/hoge.sh


# ps -e | grep -e PID -e bash
  PID TTY          TIME CMD
  588 pts/1    00:00:00 bash
 3248 pts/2    00:00:00 bash
 3928 pts/0    00:00:00 bash
22591 pts/0    00:00:00 bash

```

この場合、下図のように、

* **Process**としては「bash」
* **Process Name + Command Line**としては、「bash /usr/local/hoge.sh」
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/a13a2b4a-e160-4415-a840-5af7a0e9ded9.jpeg)


と設定することで、正しい監視設定が可能になります。
Puttyの.ppkファイルからopenssh用の鍵を取り出す

#したこと
鍵を間違って消してしまったので、このサイトの言うとおりにopenssh用の秘密鍵と公開鍵を取り出した。
http://www.ehow.com/how_8658327_convert-ppk-ssh-ubuntu.html

#はまったこと
* とくになし。下のコマンドを入力すればよい。パスフレーズが必要なので注意。

```
# sudo apt-get install putty-tools
# puttygen id_rsa.ppk -o id_rsa.pub -O public-openssh
# puttygen id_rsa.ppk -o id_rsa -O private-openssh
```
bcryptの使い方メモ

## 最終的なログイン機能の画像
![71FA192B-8508-448A-BDB4-E19C366E8895.png](https://qiita-image-store.s3.amazonaws.com/0/33237/d7ddb301-8cb9-98ae-f441-8aeb63115144.png)
---------------------
![3DB02050-459C-4C1F-8B57-62F3044381A5.png](https://qiita-image-store.s3.amazonaws.com/0/33237/cf65b924-1ff3-2960-e9a0-e5fe33b14ecd.png)
---------------------
![6A201EF8-3E86-4FC4-8D20-6D101DE9AB50.png](https://qiita-image-store.s3.amazonaws.com/0/33237/dfafb671-c234-065c-49f6-40107b2b5585.png)

## Modelの作成 user
```
rails g model user name:string password_digest:string
rake db:migrate
```
![888D5AE2-6073-4DD5-81E2-CE3E3219C2F0.png](https://qiita-image-store.s3.amazonaws.com/0/33237/333b00cd-ca5a-6a6b-9946-0955ca3dde26.png)


## 編集 users.rb
```users.rb
class User < ActiveRecord::Base  
  has_secure_password  
end 
```
## 管理アカウントをコンソールから追加
```
rails c
User.create!(:name => "admin", :password => "password", :password_confirmation => "password")
```
![554E4C9A-A2BF-428A-89C8-90722C6E94FE.png](https://qiita-image-store.s3.amazonaws.com/0/33237/04a979c0-10e4-e62d-2ad3-2f0cffae85a3.png)
＊DB上にはpasswordカラムはないが
password_digestカラムにハッシュ化されたpasswordが入る

## Controllerの作成 sessions
```
rails g controller sessions
```
## Viewの作成 new.html.erb（ログインフォーム）
``` app/view/sesisons/new.html.erb
<h1>ログイン</h1>
<% if flash.alert %>
    <p class="alert"><%= flash.alert %></p>
<% end %>
<%= form_tag sessions_path do %>
    <div class="field"><%= label_tag :name, 'login name' %>
      <%= text_field_tag :name, params[:name] %>
    </div>
    <div class="field"><%= label_tag :password, 'password' %>
      <%= password_field_tag :password, params[:password] %>
    </div>
    <div class="actions"><%= submit_tag "ログイン" %>
    </div>
<% end %>
```
## 編集 routes.rb
```routes.rb
Rails.application.routes.draw do
  root 'users#index'
  resources :sessions do
  end
end
```

## 編集 session_controller.rb （ログインに成功したらトップヘリダイレクト 失敗したらメッセージを表示）
``` app/controller/session_controller.rb

class SessionsController < ApplicationController
  def index
    render "new"
  end
  def create
    user = User.find_by_name params[:name]
    if user && user.authenticate(params[:password_digest])
      session[:user_id] = user.id
      redirect_to root_path
    else
      flash.now.alert = "ユーザー名かパスワードに誤りがあります"
      render "new"
    end
  end
  def destroy
    session[:user_id] = nil
    redirect_to root_path
  end
end
```
## 編集 application_controller.rb （ビューからログインユーザを参照できるようにする ）
``` app/controller/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  helper_method :current_user
end
```

## 編集 application.html.erb（ログインフォームへのパスを追加）
``` application.html.erb
<% if current_user == nil %>
    <%= link_to "ログイン", sessions_path %>
<% else %>
    <%= link_to 'ログアウト', session_path(current_user.id), :confirm => 'ログアウトしますか？', :method => :delete %>
<% end %>
<%= yield %>
```
CakePHPのコントローラを階層化する


CakePHPでコントローラを物理的にもURL的にも階層化したい。
```app/Controller/Api/UserController.php``` に ```http://~~~/api/user/index```でアクセスしたい。

```bootstrap.php
App::build(array(
		'Controller'	=> array( ROOT.DS.APP_DIR.DS.'Controller'.DS.'Api'.DS )
));
```

```routes.php
	Router::connect('/api/:controller/', array('action' => 'index'));
	Router::connect('/api/:controller/:action', array());
```

これでOKです。
UserController.php以外のコントローラもアクセスできますし（フォルダごとに設定は必要）、取り敢えずURLに問題なし。
然しViewクラスとかの接続がちょっと変わってしまうみたいなので、
そのへんは現状のWBSと相談した結果Controller/直下に親クラスかませて無理やり解決しました。
おそらくCakePHPのルール的にはあんまり良くないのですが、まあURLは綺麗になったよねってことで。

今回はAPIしか作成しないので大きな問題は出てきていません。Modelの接続もオッケー、Authコンポーネントも使えてます。

おとなしくFuelPHP使えばいいのに

----- 追記 -----

上記、

```routes.php
Router::connect('/:dir/:controller/', array('action' => 'index'));
`````

とかでも動くんですね(bootstrap.phpは書かなきゃいけない様子)。
知らなかったとはいえ拙いことを書いて申し訳ありませんでした。
/:dirであるとか/:langであるとか、好きな名前で書いてやると今度はリンクを貼るときに
array('dir'=>'hoge','controller'=>'fuga')とかで動いてくれて便利です。名前付きパラメータで取れますし。

ディレクトリとか言語とかでURLがごちゃごちゃになってきたら第三引数に正規表現書いて判断させます。
おとなしくFuelPHP使えばいいのに（二回目）
React.PropTypesをDecoratorsを使って書けるライブラリを書いた

ES6 classを使ってReactのComponentを書こうとすると、PropTypesを定義するのにコンストラクタのプロパティにしろとか、Property Initializersを使えとか言われているけど( https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html )、どうもしっくりこないのでDecoratorを使って定義できるライブラリを書きました。
https://github.com/popkirby/react-props-decorators

## コード例
```js
import React from 'react';
import { propTypes, defaultProps } from 'react-props-decorators';

@propTypes({
  foo: React.PropTypes.string,
  bar: React.PropTypes.number
})
@defaultProps({
  foo: "defaultString",
  bar: 100
})
class Baz extends React.Component {
  /* ... */
}
```

もともとのpropTypesなどの中身をDecoratorに持ってくるだけです。
【海外】IoTソリューション(医療)

## EarlySense

![スクリーンショット 2015-04-20 15.32.28.png](https://qiita-image-store.s3.amazonaws.com/0/74972/218eae60-fb69-f198-ad91-66a40ef5e269.png)

http://www.sapjp.com/blog/archives/10896

- 医療向けIoTソリューション
- マットレス下に設置するパッドサイズの非接触型モニタリングデバイスを提供している。
- センサーは呼吸、心拍数、ベット上での動きをモニタリングできる。取得したデータはベットサイドやナースステーションのモニターに表示され、かつ必要な警告メッセージを看護師の携帯電話にリアルタイムで通知できる。
- 継続的なモニタリングによって、患者の容体悪化や褥瘡(床ずれ)、落下、転倒を未然に察知することが可能である。

## Medwand

![スクリーンショット 2015-04-20 15.52.13.png](https://qiita-image-store.s3.amazonaws.com/0/74972/0548bd96-d093-e939-25a3-287fc6dc2878.png)

http://medwand.com/

- 医療向けIoTソリューション
- 病院に行かなくても、自宅で手軽に測定ができ、主に耳式体温計、脈拍、血中酸素、デジタル聴診器、高精度カメラ、耳鏡、皮膚鏡検査等が測定できる。
- 測定したデータはクラウドに置き、医者が診断する形になっている。


## Owlet

![スクリーンショット 2015-04-20 16.16.25.png](https://qiita-image-store.s3.amazonaws.com/0/74972/4b24b6fc-5c0e-c231-1cc3-4832b779de12.png)

https://www.owletcare.com/

- 医療向けIotソリューション
- 子どもの血中濃度酸素や心拍、体温,寝返りを図ってデータ化(靴下にデバイスがある。)Bluetooth 4.0経由でスマートフォンでデータは送信される。
- 子どもの健康や、母親の子どもに対するストレスケアをはかることができる。

## Nozpad

![スクリーンショット 2015-04-20 16.57.02.png](https://qiita-image-store.s3.amazonaws.com/0/74972/67636d15-10da-b948-83d4-0570fc01c542.png)

http://www.nozpad.com/

- 医療系IOTソリューション
- 呼吸を記録し、健康状態を管理する。
- メガネ型のデバイスで、スマホやタブレットにユーザーの呼吸パターンの分析結果が確認できる。
- 健康状態の悪化につながる可能性があるときにはアラートが届く仕組み。

## Clinicloud

![スクリーンショット 2015-04-20 16.59.19.png](https://qiita-image-store.s3.amazonaws.com/0/74972/c8c123dd-b9e1-bd84-a240-5650c2f28266.png)

https://clinicloud.com/

- 医療向けIoTソリューション
- 在宅用のデジタル聴診器とタッチレスの温度計で記録した体温や呼吸数、心拍数のデータをクラウドに保存、必要時には医者の診断を受けることができる。

## スマートシャツ(ヘルスウォッチ社)

![スクリーンショット 2015-04-27 13.45.19.png](https://qiita-image-store.s3.amazonaws.com/0/74972/2a850432-c4b4-b68b-eb66-244a59d8d245.png)

http://toyokeizai.net/articles/-/57318

- 心臓の動きをモニターして、心臓やその人が持つ病気の種類を検知する。そのデータはBluetooth経由で転送し、心臓外科医がスマートフォンで情報を受け取る。妊婦でも対応できる。
- データはクラウドベースで情報を集める。


## 人間の目を合成眼球に置き換えて視力強化(MHOX社)

![スクリーンショット 2015-04-27 13.54.53.png](https://qiita-image-store.s3.amazonaws.com/0/74972/cf821658-9f59-c481-f2b1-d0d71e4bf7d9.png)

http://karapaia.livedoor.biz/archives/52190368.html

- 目の見えない人に光を、視力の低い人には最大1.5まで視力を向上させる。
- 眼球にカメラ機能を持たせ、Wifi回線を通じて視界をすべて記録できる。
- 自然な容貌を保てるのかは未知。


## marshpillow

http://marshpillow.com/

![スクリーンショット 2015-04-09 17.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/74972/e0485e75-b2d7-7679-12d1-0aa179405401.png)

- 医療向けIoTソリューション
- 自分の睡眠パターンを把握することができる。
- ユーザの合計睡眠時間、ノンレム睡眠の時間、レム睡眠の時間、寝返り回数、イビキの時間を枕で測定し、そのデータをスマートフォンに転送する。
- アプリ側で睡眠パターンを分析、改善すべき点を教える。
WordPressがHTTPステータスコード500を返すのにページが表示されている？


WordPressで構築されたサイトを、ぼーっと巡回していたときのことです。

運用から引き継いだので、WebInspector(DeveloperTools)を開きながら、どんな構成なんだろうなと思いながら見ていたところ、あるアーカイブページから、HTTPステータスコード500が返ってきました。

ページは正常に表示されている（ように見える）のに、どういうことだろうと思い、再度更新してみると今度は通常のHTTPステータスコード200が返ってきました。

同じアーカイブの他のページを見ると、たしかに、たまに500が返ってきます。

不思議に思いましたが、他にクリティカルなものがそれはたくさんありましたので、ページは特に何事もなく表示されているし、後ほど対応しようということにしました。

そして、数日経ったあるとき、WebマスターツールからInternalServerエラーが急激に増加していますという警告が届きました。

内容を確認してみると、先ほどのアーカイブページでした。
そもそもの認識どおり、ときおり500を返却していたのでこれまでエラーの数は0ではありませんでした。ただ、たしかにクロールエラー（ServerError）が数倍に急増していました。なぜでしょうか？

## 調査開始

まずは、該当のページの出力内容を確認しました。
HTMLとしては、ほぼ問題ないように思いましたが、一点奇妙な点がありました。

このサイトは、キャッシュ機構に[QuickCacheプラグイン](https://wordpress.org/plugins/quick-cache/)を利用しているのですが、キャッシュされた旨のコメントがあるべきところにありません。
あるべきところとは、本来HTMLの最後なのですが、このページに至っては、最後より少し上の位置にありました。

なぜかと思って見てみると、なるほど、フッターの一部が出力されていませんでした。不自然な位置で出力が止まってしまっています。キャッシュされた旨のコメントは、そこに出力されていました。

フッターの一部とはいっても、目に見える要素は全て出力済みで、処理が止まっていたのは、その後に続くインラインスクリプトの部分でしたから、ページとしての見た目には影響がなかった様です。

そこで、開発環境でデバッグしてみると、この部分でFatalErrorが発生していました。どうやら500の原因はここみたいです。

ただ、開発環境では、HTTPステータスが500になることはありませんでした。
というのも、既に必ずヘッダーが出力されていたからです。

では、HTTPステータスが500になるのはどういう状況でしょうか？

そこで、本番環境に合わせるべく、開発環境では無効にしていたQuickCacheプラグインを有効化すると、
たしかに、HTTPステータスが500を返しました。しかし、もう一度確認すると、今度はHTTPステータス200です。

これでわかりました。アクセス時にキャッシュが作成された場合は500を返すのではないかと。

そこで、試してみました。

キャッシュをクリアしてアクセスすると、500。キャッシュがある状態でアクセスすると200。

どうやら間違いなさそうです。

そこで、QuickCacheがキャッシュを作成するフローを確認しました。

## QuickCacheのフロー

WordPressへのアクセスに対して、まず、それがキャッシュを許可するものかどうかを調べます。

許可されている場合、キャッシュ化されたファイルが既にあるか、またそれが有効なキャッシュかを調べます。

該当するファイルがあれば、キャッシュファイルを出力し、WordPressの処理が終了します。

ここで、もし有効なキャッシュが無かった場合、キャッシュファイルの作成を開始します。

QuickCacheが```ob_start();```でバッファリングを開始します。

そして、WordPress本来の処理が行われ、該当のページの表示がバッファリングされていきます。

最終的に、それがキャッシュファイルに書き込まれ、同時に、レスポンスとして出力されます。

前述の事象では、まさにここが問題でした。

fatal errorが出力するサーバーエラーのヘッダーが、バッファリングされずに先に出力されてしまっていたのです。

それぞれを整理すると下記の様な処理が行われていました。

**キャッシュ未使用時**

200 -> 500（バッファリングされないのでコード順で処理）

**キャッシュ生成時**

500 -> 200（コードはバッファリングされていのに、fatal errorが先にヘッダーを出力）

**キャッシュ読込時**

200のみ （出力されたHTMLを表示するだけなのでfatal errorは発生しない）

## クロールエラー急増の原因

これは推測になってしまうのですが、クロールされる直前に記事更新等でQuickCacheのキャッシュがクリアされたのではないかと思われます。これまでも同じページへのクロールエラーが0ではなかった点、および、そもそも頻繁なアクセスがあるページではなかったので、タイミングの問題かと。

## 対処方法

エラーにならないコードを書きましょう！

## まとめ

WordPressに限らない話と思いますが、意図せずにHTTPステータスコード500が検出されるようになったら、バッファリングを行ってる箇所を探してみる、のもいいかもしれませんね。
【海外】IoTソリューション(商業)

## WeissBeerger

![スクリーンショット 2015-04-20 15.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/74972/7c8e930a-1b32-2354-80fe-c0051737ff6d.png)

http://www.sapjp.com/blog/archives/11032

- 商業向けIoTソリューション
- ビアパブにある樽とタップの間にあるチューブに流量計を接続し、取得したデータをクラウドで処理することで、飲料の正確な注入と販売促進の最適化を図ることを行う。
- 事前に必要な情報は、計測対象のビールブランドおよびビアパブの住所、取得するデータは、何時、どれだけの量がチューブを通って消費されたかを取得する。
- これにより、最適なハッピーアワー、在庫管理、適切な注入量を改善できる。実際に11%の注ぎすぎの無駄を削減、ハッピーアワーの最適化により32%売り上げ向上ができた。
- 従来は樽の出荷データは月間だったが、リアルタイムで取得できるようになった。
- 補足: WeissPourという指定した量だけ正確に注げるように工夫したものもある。単位量あたり原価が高い飲料の過剰に注いでしまうのを防止するものである。

## コカ・コーラとスターウッドに学ぶ、ユニークな顧客体験でブランド価値を向上させる方法

![スクリーンショット 2015-04-27 12.20.47.png](https://qiita-image-store.s3.amazonaws.com/0/74972/f7c26773-ed55-fb10-ad53-b665123246ca.png)

http://www.sbbit.jp/article/cont1/29502?page=1

- 大学キャンパス内に「Coke Hug Me Machine」 の設置。ハグするとコーラが無料で提供される。インドとパキスタンはそれぞれの国の人たちが絵を描いたり、手を合わせたりすると、コーラが無料で提供される。
- フリースクリーンを備えた「Free Style Machine」は消費者がスクリーンを操作して飲料フレーバーを混ぜて、オリジナルドリンクを作成できる。
- 自動販売機にiBeaconを搭載して、顧客の行動/嗜好データを収集して、地域毎の商品ラインアップの最適化を行っている。

## UNDER ARMOUR

![スクリーンショット 2015-04-27 12.51.17.png](https://qiita-image-store.s3.amazonaws.com/0/74972/297a068a-1983-f59f-7a0d-635a03538c08.png)

http://www.sbbit.jp/article/cont1/29582

- 消費者による実店舗内での商品接触までを、タッチスクリーンUIを使ったインタラクティブ性の高いエクスペリエンスができる。
- 具体的には、自分のサイズに合ったウェアを注文したり、（購入を決めた商品の）コーディネートを提案したりできる。

## Starlab (スターウッドホテル＆リゾート)

![スクリーンショット 2015-04-27 12.37.03.png](https://qiita-image-store.s3.amazonaws.com/0/74972/18867081-900c-973e-b2d1-aaed29aaabf7.png)

- ホテル向けIotソリューションの実験施設をスターウッドホテル&リゾートが作成。
- 現状、Apple Watchを部屋の鍵として利用できるように開発中。
- 各部屋にタブレットを設置し、専用アプリで室温や湿度、照明といったコンディションをコントロール、ルームサービスのリクエストができたりする。データは収集、分析する。
- フロントやコンシェルジュデスクにiBeaconを設置。通り過ぎるだけで顧客のプロファイルデータ
をフロント側で把握できる仕組みも構築中。
Shairport Syncのビルドエラー

[Shairport Sync](https://github.com/mikebrady/shairport-sync) をREADMEに従ってビルドしようとすると、autoconfの実行時にエラーになる。

環境: RASPBIAN 2015-02-16 (Linux raspberrypi 3.18.11-v7+)

````
$ autoconf -f -i
configure.ac:6: error: possibly undefined macro: AM_INIT_AUTOMAKE
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
configure.ac:37: error: possibly undefined macro: AC_DEFINE
configure.ac:50: error: possibly undefined macro: AM_CONDITIONAL
````

こういう場合は、autoconfのかわりに、 `autoreconf --install` を実行するといいようだ。

````
$ autoreconf --install
configure.ac:6: installing `./install-sh'
configure.ac:6: installing `./missing'
Makefile.am: installing `./depcomp'
$ ./configure --with-alsa --with-avahi --with-ssl=openssl --with-soxr
````
SyncGatewayの_changesでドキュメントの変更通知を受信 (チャネル編)

今回は、ドキュメントの変更通知が取得できる、_changes APIで、チャネルを指定する方法をまとめました。

本文は[ブログ](http://ijokarumawak.github.io/couchbase/2015/04/20/syncgateway-changes-channel/)で公開しています。

目次:

1. <a href="http://ijokarumawak.github.io/couchbase/2015/04/20/syncgateway-changes-channel/#step-1">Sync Function</a>
2. <a href="http://ijokarumawak.github.io/couchbase/2015/04/20/syncgateway-changes-channel/#step-2">filterとchannel</a>
3. <a href="http://ijokarumawak.github.io/couchbase/2015/04/20/syncgateway-changes-channel/#step-3">cURLで実行してみよう</a>
CentOS6でsrpmの利用の仕方

## 参考

* [centos6.4でSRPMダウンロード - blog.youyo.info](http://blog.youyo.info/blog/2013/03/30/centos6-srpm-download/)

```bash:/etc/yum.repos.d/CentOS-Source.repo
[source]
name=CentOS-$releasever - source 
baseurl=http://vault.centos.org/6.8/os/Source/
enabled=0
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
```

```bash:使い方
yum install yum-utils
yumdownloader --source php --enablerepo=source
```

```bash:rpm展開
mkdir src
cd src
rpm2cpio ../php-5.3.3-47.el6.src.rpm | cpio -id
```

```diff:php.spec編集してみる
     --with-libxml-dir=%{_prefix} \
     --enable-xml \
     --with-system-tzdata \
+    --enable-zend-multibyte \
     $* 
 if test $? != 0; then 
   tail -500 config.log
```

```bash:ビルド
rpmbuild -ba php.spec
```

## phpのビルドオプション確認

* [PHP/PHPのコンパイルオプションをコマンドラインで確認する方法 - PukiWiki](http://www.lovebug.jp/index.php?PHP%2FPHP%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

```
php -i | grep configure | sed -e 's/ /\n/g'
```
Ubuntu インストール（14.04　32bit版）

昔のマシンにubuntuをいれてみました。
基本は素直に進んでいけばインストールは簡単です。
ただ、そのときに気になった内容をメモしておきます。
マシン性能(メモリ2GB、HDD120GB)がそこまでよくないのでちょっと心配
inspiron 700M　君です。
Celeron M 330（1.4GHz）

追記：20150423 
やはり古いPCには荷が重かったので、Lubuntu（ルブントゥ）なるものをいれてみることにします。
wikipediaより
Lubuntu（ルブントゥ）はUbuntuから派生したディストリビューションであり、「軽量で、リソース消費量が少なく、省エネ」なことを目指したプロジェクトである。
（Lubuntuインストールは未投稿）


#ダウンロード
以下からUbuntu 14.04　32bit版をダウンロードします。
[Ubuntu Desktop 日本語 Remixのダウンロード](https://www.ubuntulinux.jp/download/ja-remix)

今回はデュアルブートをするつもりではないので、真っさらから入れます。
そのため、DVDに焼き付けてからインストールする方法をとりました。

#インストール
こちらのサイトを参考にさせてもらいました。
[Ubuntuアプリのいいところ](http://ubuntuapps.blog67.fc2.com/blog-entry-695.html)
[Ubuntu日本語フォーラム](https://forums.ubuntulinux.jp/viewtopic.php?id=10609)

まずは、DVDで起動するようにBIOSの設定をしておきます。

1. Ubuntu 14.04をインストールDVDで起動
>DVDで起動して動作確認するか、いきなりインストールするか聞かれます。
いきなりインストールしました。

2. インストール準備
>マシンに入れることができるかチェックしてくれるみたいです。
自分で入れるチェックは参考サイトのようにチェックを入れずに進めました。

3. インストールの種類
>がっつり消すために削除してインストールを選択でもよかったのですが、パーティション設定をしたかったので、「それ以外を選択」
利用方法　のプルダウンが沢山でてきました。
どれを選んだらいいのか(TT)
![IMG_0903.JPG](https://qiita-image-store.s3.amazonaws.com/0/39911/b0d10f94-3537-3d4f-0733-bf95b18514f9.jpeg)
・ext4ジャーナリングファイルシステム
・ext3ジャーナリングファイルシステム
　　:
>フォーラムから
・Ubuntuをインストールするのに必要なパーティションは2つ
　システム全てを表す　/   と　swap
・/ のファイルシステムはExt4
・swap はswap
とあったので、
OS専属のパーティションとしてext4を選択し、適当に分割しました。
（今回は、120GBHDDなので、70GBを割り当て）
また、「swapは実メモリの2倍〜1.5倍程度がお勧め」ということで
メモリ2GBに対して2倍の、4GBに設定しました。<br>
※もしデュアルブートにしていた場合、
swap領域をそれぞれのOSで持っておかないといけないらしいです。
最初にubuntu用にswap領域をもっていて、その後、デュアルブートでwindowsを入れる場合はwindows用swap領域を取らないと、ubuntu用にとったswap領域が壊れるのでubuntuがおかしくなるそうです。

あとはよくあるインストールの流れです。
4. タイムゾーンの選択
5. キーボードレイアウトの選択（デフォルトのまま）
6. あなたの情報を入力（初期ユーザパスワード設定）
7. インストール開始
>スライドショーで開始されます。
なんかヤギみたいなのがでてきます。
インストール完了で再起動。

初期起動で設定したIDでログインするんですが、一回コマンドライン画面で止まりました。
DVDは自動的に取り出されたのですが、、、
とりあえず、Enterをおしたら再起動で進みました。

#Ubuntu起動
なんか、ショートカットキーの説明が出てきました。
![IMG_0905.JPG](https://qiita-image-store.s3.amazonaws.com/0/39911/fb3ea13f-58f8-02e8-5cd2-1c6fe7869d9c.jpeg)

次に、起動後、ソフトウェアの更新確認をします。
コンピュータとオンラインリソースを検索（左一番上のアイコン）から「update」と入力して検索

「ソフトウェアの更新」があるのでそれを実行します。


どうも、私のPCでは古すぎてめっちゃ遅いです。
インストールはできましたが、これは。。。使用不可のレベルっぽいです。。。
これから、どこまでできるのか見極めてから、、使えるか考えます。
jQueryでCSSの!important指定を行う

## "cssText" による !important指定
jQueryの.css()メソッドでは

~~~javascript:jQuery
$('#sample').css({'margin-top': '20px !important'}); // 無効
~~~

のような !important 指定は認識されません（宣言自体が無視されます）。

このような場合は、CSS書式をそのまま記述できる"cssText"を使用することで !important 指定を実現できます。

~~~javascript:jQuery
$('#sample').css({'cssText': 'margin-top: 20px !important;'}); // 有効
~~~

## "cssText" を使用する際の注意点
"cssText" による指定は対象となる要素のstyle属性を書き換える挙動となるため、HTMLのstyle属性によって指定されていたスタイルは無効となってしまいます。

下の例では、style属性で指定されていた "color: red;" が無効になっていることがわかります。

~~~html:HTML
<div id="sample_01" style="color: red;">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
~~~

~~~javascript:jQuery
$('#sample_01').css({'cssText': 'margin-left: 50px;'});
~~~

![sample_csstext_01.png](https://qiita-image-store.s3.amazonaws.com/0/25032/21b62325-9b4e-c25c-4e99-62d7fa426ed0.png)

意図しないスタイルの上書きを避けるためには、**あらかじめstyle属性値を取得しておき "cssText" による指定値に追加する**といった工夫が必要となります。

~~~javascript:jQuery
var defaultStyle = $('#sample_01').attr('style');
$('#sample_01').css({'cssText': defaultStyle + 'margin-left: 50px;'});
~~~

![sample_csstext_02.png](https://qiita-image-store.s3.amazonaws.com/0/25032/5285a663-8586-6b8a-5bb9-a32b6e19284f.png)
Visual Studio Community 2013のインストール

Visual Studio 2015がリリースされましたが，2013にもまだ需要があると思われるので対応(2015/08/02)．

# 本体のインストール

0. http://www.microsoft.com/ja-jp/dev/products/community.aspx にアクセスし，下の方にスクロール．「Visual Studio Community ダウンロード」をクリックする．
0. 画面上の方のVisual Studio Communityは，2015のダウンロードなので，少し下の方にスクロールし，左側に並んでいる一覧のVisual Studio 2013をクリックする．右側に「Visual Studio Community 2013 with Update 5」と「Visual Studio 2013 Language Pack」が表示される．「Visual Studio Community 2013 with Update 5」のダウンロードをクリック．vs_community.exeがダウンロードされるので，実行する．
![2015-08-02_07h25_53.png](https://qiita-image-store.s3.amazonaws.com/0/53034/a91ab223-b6f2-1227-c72b-51c0927ef1b5.png)
0. ライセンス条項にチェックを入れて，「Next」をクリックする．
![2015-08-02_08h19_00.png](https://qiita-image-store.s3.amazonaws.com/0/53034/09ca1913-675a-c064-28ca-aca32ccddc5c.png)
0. インストールするものはデフォルトでOK．「INSTALL」をクリックする．
![2015-08-02_08h19_41.png](https://qiita-image-store.s3.amazonaws.com/0/53034/7f7e1007-8145-ada7-2b21-afefca902876.png)
0. しばらく時間がかかる．待つ．
0. 終わったら次は日本語化するので，LAUNCHしたい気持ちを抑えて一度インストーラを終了する．
![2015-08-02_09h36_41.png](https://qiita-image-store.s3.amazonaws.com/0/53034/e7c3c11b-5cc9-0f1b-f763-7f052c5a341a.png)

# 言語パックのインストール

0. 言語パックは2015/8/2現在，スクリーンショット前掲の画面下側の「Visual Studio 2013 Language Pack」からはが正しく機能しない模様．https://www.microsoft.com/ja-jp/download/details.aspx?id=40783 からダウンロードする．言語が「日本語」になっていることを確認し，ダウンロードをクリック．vs_langpack.exe がダウンロードされるので，実行する...のでよいと思うのだがまだ検証していない．
0. ライセンス条項にチェックを入れて，「インストール」をクリックする．
![2015-08-02_09h40_21.png](https://qiita-image-store.s3.amazonaws.com/0/53034/0ba9de5c-3fbd-d789-59d3-3734dda99a4d.png)
0. インストール終了前に以下のようなエラーが出る場合がある．OKをクリック．
![2015-08-02_09h49_14.png](https://qiita-image-store.s3.amazonaws.com/0/53034/52795328-e436-405b-5999-7c5f84cbef51.png)
0. 時間がかかる場合もあるが，気長に待つと以下の終了画面が出る．
![2015-08-02_10h08_25.png](https://qiita-image-store.s3.amazonaws.com/0/53034/ba9db884-437a-558a-1a0c-4225db7ab14f.png)

# 小ネタ

* 言語パックをインストールしても日本語にならない場合は，Tools > Options > Environment > International Settings > language で設定する．
* Visual Studioを毎回メニューから探して起動するのは面倒なので，「タスクバーにピン留め」しておこう．
unsigned shortに対応する型 > どれを使えばいいかわからない > UINT16 | USHORT | WORD

```txt:動作確認
Windows 7pro (32bit)
```

Visual Studioやc++ builderなどでソフトを作る時、unsigned short型が出てくる。

secureCodingによると、unsigned shortなどの型をそのまま使うのはよくない（内部表現、型が異なる場合があるため）らしい。

そこで、typedefしているものを調べたら、以下のサイトがあった。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx

ここで、typedef unsigned shortしている型として以下のものがある。このうち、どれを使えばいいのかよくわかっていない。

- UINT16
- USHORT
- WORD

[こちら](http://dobon.net/vb/dotnet/beginner/intvsint32.html)を見るとUINT16は正確にはSystem.UInt16なのか。

以下はLinkの表の抜出し。

|.NET Framework型 | VB.NET型 | C#型 |
|:---:|:---:|:---:|
|System.UInt16|UShort|ushort|
[CentOS6] checkinstallでrpmを作る

```bash:x86_64の場合
git clone http://checkinstall.izto.org/checkinstall.git
cd checkinstall
yum install gettext which
make -s
make install
ln -s /usr/local/lib{,64}/installwatch.so
checkinstall -y -R
```

* `~/rpmbuild/RPMS/x86_64/checkinstall-20150420-1.x86_64.rpm`

が生成される。

## packageの名前を指定する場合

```bash:rpmの場合
checkinstall -y -R --pkgname=opt-mysql4
```

```bash:debの場合
checkinstall -y -D --pkgname=opt-mysql4
```

## 特定のファイルをパッケージから除外

```bash:
checkinstall -y -R --pkgname=local-php --exclude=/etc/httpd/conf/
```
QNAPTS-220にredmineを入れる

とりあえず動くことを確認したのでインストール手順をメモする

apacheとの連携、チケットの登録等を試していないので正常正しくDBとの連携が取れているかは未確認。
ただし、redmineの画面がプライベートネットワーク内とmyqnapcloudドメイン経由から表示されることは確認した。

必要なパッケージのインストール
==========================
rubyのセットアップ等に必要なパッケージをipkgでQNAPに追加。
全部は不要とのこと[[ここ](http://hasenpfote36.blogspot.jp/2014/02/redmine-on-ts-220-2.html)]。

```
- gcc
- make
- imagemagick
- openssl
- openssl-dev
- wget-ssl
- zlib
- less
- bash
- grep
- which
- sed
- gawk
- perl
- procps
- coreutils
- util-linux-ng
- zip
- bzip2
- diffutils
- patchutils
- gdb
- libtool
- pcre-dev
- ncursesw-dev
- net-tools
- tcl
```
rubyのインストール
================
ipkgからrubyやrails関連はインストールできるけれどもredmineが指定しているバージョンとは違い1.9.1になってしまうので、ソースからインストールすることにした。

もし、他でrubyを使用しないのであればアンインストールしておくと後々楽

```
$ ipkg remove ruby
$ ipkg remove rubygems
```

rbenvを使う方法も考えられるが、自分の環境が悪いのかrbenvはうまくいかない。さらに、QSynqと干渉してしまうらしくrbenvを実行しrubyインストールに失敗するとQSynqが接続エラーを起こすので使わない。

基本的には[ここ](http://happyhackingblog.blog.fc2.com/blog-entry-3.html)のサイトを参考にしてrubyをインストールしていけばよい。
ipkgからインストールしているコマンド系は「/opt/bin」等にあるので、QNAP起動時にOptware.shでPATHの設定を変更する方法でも構わない。
例えば）Optware.shの中で「/opt/bin:/opt/sbin:\$PATH」などとしておく。

作業場所はどこでも良いと思うが、私は`.qpkg`以下に`ruby192`ディレクトリを作成した。

```lang:ruby
mkdir /share/MD0_DATA/.qpkg/ruby192
cd /share/MD0_DATA/.qpkg/ruby192
wget http://ring.shibaura-it.ac.jp/archives/lang/ruby/1.9/ruby-1.9.2-p330.tar.gz
tar zxvf ruby-1.9.2-p330.tar.gz
cd ruby-1.9.2-p330.tar.gz
./configure --prefix=/opt --with-opt-dir=/opt
```

rubyがインストールされているか確認

```
$ which ruby
/opt/bin/ruby

$ ruby -v
ruby 1.9.2p330 (2014-08-07 revision 47094) [armv5tel-linux-eabi]
```

rubygemsの確認
--------
```lang:rubygems
$ gem -v
2.4.6
```
railsの確認
---------
```lang:rails
$ rails -v
Rails 3.2.21
```
[参考先](http://happyhackingblog.blog.fc2.com/blog-entry-3.html)のサイトではこの後`rubygems`と`rails`を入れているのだけど私の環境ではrubyを入れた段階で両方入っていた。何故かはわからない・・・・

redmineのインストール
===================
公式に載っている手順に従って行う。

MySQLのセットアップ
-----------------
公式の作業を打ち込めばいいのだが、コンソールからmysqlコマンドを認識してくれない（why?）
AppCenterからphpmyAdminからインストールして、phpMyAdminにアクセスする。

1. データベースを作成する
    - DBName: redmine
    - Character: UTF-8
2. ユーザを作成する
    - 'redmine'@'localhost' identified by 'my_password'

redmineの設定
------------
redmine公式からリリースパッケージをダウンロードして展開

```
mkdir /share/MD0_DATA/.qpkg/redmine
cd /share/MD0_DATA/.qpkg/redmine
wget http://www.redmine.org/releases/redmine-2.6.3.tar.gz
tar zxvf redmine-2.6.3.tar.gz
cd redmine-2.6.3
```
あとは公式の手順通りに進める。
途中jsonのエラーが出る場合は

```
gem install json
```
として、jsonをインストール

パーミッション設定は、redmine用のユーザ/グループを作った方がいいのだろうけど、とりあえず~~admin~~でやっている。
【国内】IoTソリューション(スポーツ)

## Nike+Running

![スクリーンショット 2015-04-20 13.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/74972/27d282c8-f28d-57ac-5980-ca369e7859a5.png)

http://masalog.net/nike_plus.html

- スポーツ向けIOTソリューション
- ランニングの累計やベストな記録、総走行距離の確認、一定距離の最速タイムが確認できる。
- 友達とのランキング機能があり、友達との間で走行距離や出走回数の比較を見ることができる。
- 屋内走行でも、設定して走行可能できる。

## XON SNOW 1

![スクリーンショット 2015-04-17 13.47.28.png](https://qiita-image-store.s3.amazonaws.com/0/74972/5f381508-04e1-45aa-9ff3-8569e550459a.png)

https://xon.cerevo.com/ja/

- スポーツ向けIOTソリューション
- スマートフォンとBluetoothを連携して、加速度、右足 足裏荷重バランス、重心、ノーズ側 たわみ、テール側 たわみ、のデータを確認できる。
- スマートフォンで撮影した動画にセンサーで取得した各種計測データを重ねて保存できる。
- トゥ部、ヒール部に超高輝度LEDストロボを内蔵し、荷重やしなり具合に連動して発光できる
thef*ck が動かない bash の人

https://github.com/nvbn/thefuck がうまく動かない人へ

github で紹介されてる fuck の alias は fc をつかうので、

```shell-session
HISTIGNORE='&:?:??:???:????:history'
```

とかがあると、cd.. とかは履歴を取れずに動かない。

以上です。
【海外】IoTソリューション(医療)

## fitbit

![スクリーンショット 2015-04-20 12.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/74972/144efe9c-79a0-8e17-e9c4-5666ea74d2a9.png)

http://www.fitbit.com/jp/charge

- 医療向けIoTソリューション
- 利用者の運動の記録(歩数、距離、消費カロリー、登った階数)や食事の記録をスマホで確認でき、友人や家族とデータを共有ができる。
- また、着信通知が表示されたり、自動睡眠監視やアラームの設定ができる。ワイヤレス同期も可能。
- センサーは3軸加速度計、高度計、バイブレーションモーターが搭載されている。
Androidのスプラッシュスクリーンの背景色を指定する

地味にハマったのでメモ。モバイル開発始めたばかりでとてもつらい。


#まず、[Xamarin公式](http://developer.xamarin.com/guides/android/user_interface/creating_a_splash_screen/)を参考にスプラッシュスクリーンを作成する。
すると、↓こんなテーマをつくることになり、うまいこと黒背景にスプラッシュ画像が浮かび上がるようになる。

```xml:Styles.xml
<resources>
  <style name="Theme.Splash" parent="android:Theme">
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowNoTitle">true</item>
  </style>
</resources>
```

# 背景色を指定できるようにする
[こちら](http://dev.classmethod.jp/smartphone/android/android-splash-without-actionbar/) を参考に、drawableにlayer-listってのを定義する。

```xml:splash.xml
<?xml version="1.0" encoding="utf-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

  <item>
    <shape android:shape="rectangle" >
      <solid android:color="#FFFFFFFF" />
    </shape>
  </item>
  <item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/splash_image" >
    </bitmap>
  </item>

</layer-list>
```
splash_imageは、表示させたい画像のファイル名です。

スプラッシュ用のテーマ自体は変更なし。
windowBackgroundの先が、画像からxmlに変わっているだけ。

```xml:Styles.xml
<resources>
  <style name="Theme.Splash" parent="android:Theme">
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowNoTitle">true</item>
  </style>
</resources>
```

以上です。
Theme.Splash内を色々いじったりしてもダメで、ハマってしまったので共有。