OmniAICreator/Qiita-1.07M huggingface dataset:
C > ビット演算 > sizedCopy()の実装 > 改良版 > unsigned long mask = (1u << size) - 1; *dst &= ~mask; *dst |= (src & mask);

ある数値のうち、特定のビットだけを別の変数へコピーしたい。
ただし、sprintf()などの関数は使えないとする。

## try1 (独自実装)

以下のような実装をした。

```c
void sizedCopy(int size, int src, unsigned long *dst)
{
	int chk;
	int loop;
	int shift;
	
	shift = size - 1;
	chk = (0x01 << (size - 1)); // from MSB to LSB
	
	for(loop=0; loop<size; loop++) {
		if ( (src & chk) > 0 ) {
			*dst |= (0x01 << shift);
		} else {
			*dst &= ~(0x01 << shift);
		}
		chk = (chk >> 1);
		shift--;
	}
}
```

テスト込みの実装は
http://ideone.com/K9GS5L

```c
#include <stdio.h>

void sizedCopy(int size, int src, unsigned long *dst)
{
	int chk;
	int loop;
	int shift;
	
	shift = size - 1;
	chk = (0x01 << (size - 1)); // from MSB to LSB
	
	for(loop=0; loop<size; loop++) {
		if ( (src & chk) > 0 ) {
			*dst |= (0x01 << shift);
		} else {
			*dst &= ~(0x01 << shift);
		}
		chk = (chk >> 1);
		shift--;
	}
}

int main(void) {
	unsigned long ulval = 0;
	sizedCopy(3, 0x35, &ulval); // 0x35 = 110101b
	printf("0x%X", ulval); // answer: 0x5
	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2156 signal:0
0x5
```

上記の関数の改良版を複数回呼ぶことにより、一つの変数に複数の数値情報を入れる、という処理を検討中。


## 改良版 (yohhoyさん)

yohhoyさんに教えていただいた（ずっと)改良版。

```
unsigned long mask = (1u << size) - 1;
*dst &= ~mask;
*dst |= (src & mask);
```

http://ideone.com/F6RZ0E

自分の理解力が足りなかったので、上記動作のメモを記す。

`mask =`については、size=3の時は 111bとなるようにしている (=1000b - 1)。

`&= ~`にて該当ビットを全部OFF

`|=`にて srcのうち該当サイズ分だけ( & mask )ビットが1となっている部分をON
onlineTool > hex dec bin oct Converter

2進数から16進数や10進数に変換したい。

OSによらずに同じ方法で作業するにはやはりオンラインツールがよさそう。

http://calc.50x.eu/

特長
- どの項目に入力してもほかの値がその場で見れる
- 下にあるビット列の各自をクリックして 0 <-> 1 変換もできる
- ビット幅を変更できる (8..24)
技術英語 > [At any given time], up to 30 percent of all internet traffic is carried on Akamai’s cloud computing network.

LOE > April 20, 2012

http://loe.org/shows/shows.html?programID=12-P13-00016
> <font color=red>At any given time</font>, up to 30 percent of all internet traffic is carried on Akamai’s cloud computing network.

http://eow.alc.co.jp/search?q=at+any+given+time
> at any given time
> いつでも、どんなときでも

<hr>
givenというので「任意の」という意味になる。

http://ejje.weblio.jp/content/given+value
> given value
> 任意の値

(追記)
<font color=red>「任意の」という訳が正しいかは要確認。</font>

<hr>

givenで思い出すのは (横道)
> When I was given a chance, ...
http://qiita.com/7of9/items/8477c9fd40c3e6a42cbd

<hr>
## 追記 (「任意の」について)

確かに「任意の」に該当するような意味はgivenで見つかっていない。以下以外にも、オックスフォード英英辞典にもなし。

1) http://dictionary.reference.com/browse/given?s=t
2) http://www.merriam-webster.com/dictionary/given

2)に記載の
> particular, specified <at a given time>

を「任意」のと訳してしまっているように思う。
【シェルスクリプト】ログイン理由を記載させる！

# 使用意図
監査的な観点から、リモートでサーバにログインする際に、社内ではログイン申請を行ってい、承認を得てからログインするようにしている。ただし、ログイン申請は形式的なもので、綿密なチェックなどを行っておらず、ほとんど意味をなさない。

そのため、事前承認制をやめ、ログイン時に許可されたユーザとログイン理由を明記されたもののみに、ログインするスクリプトを作成した。

なお、コンソール接続には対応できないので、あくまでリモートでつなぐ場合を前提となる。

# 環境
CentOS 6.5

ただし、他のLinux環境でも使用できることもございますので、検証のうえ、使用してください。

# 前提条件
.bash_profileにidcheck.shをフルパスで記載すること。
パーミッションはそれぞれ付与しておくこと。
ディレクトリ構成は以下を参照とすること。
## ディレクトリ構成
/root/Tools/bin/idcheck.sh
/root/Tools/etc/VAL.txt
/root/Tools/log/idcheck.log

# スクリプト

idcheck.sh (ver1.3)

```

#!bin/bash
#
# idcheck.sh                                       ver.1.0.3  2015.06.15
#
# Author:
#     hogehoge hogehoge
#
# Usage:
#     idcheck.sh
#     You should add this script to ”.bash_profile”.
#
# Description :
#     If you login this server, you shoud write some reasons of login.
# 
# Caution:
# XXXX XXXX XXXX XXXX.
#
#########################################################################

# 変数の読み込み
VAL=/root/Tools/etc/VAL.txt
source ${VAL}

# Ctrl + Cを実施した場合の動作（SIGINTを受信した場合）
trap ' echo You must input your ID number and reasons of login.' 2

# 社員番号を入力
echo $MESSAGE6
read answer

case "$answer" in

# 許可された社員番号
        12345)
        echo $MESSAGE5
        read answer2

                if [ -z $answer2 ]
                then
                        echo $DATETIME $MESSAGE1 | tee -a ${LOG}
                        kill $BADTERM
                        exit 15

                else
                        echo $DATETIME $MESSAGE2 $answer $MESSAGE3 $answer2 | te
e -a ${LOG}
                fi
        ;;

# 上記以外は拒否
        *)
        echo $DATETIME $MESSAGE4 | tee -a ${LOG}
        kill $BADTERM
        exit 10
        ;;
esac

```

変数ファイル（VAL.txt）

```
# Variable
BADID=`who -m | awk '{ print $2 }'`
BADTERM=`ps -ef | grep -i $BAEDID | grep -v bash | grep -v grep | awk '{ print $2 }' | head -1`
DATETIME=`date '+%Y%m%d %H:%M:%S'`
LOG=/root/Tools/log/idcheck.log

# OUTPUT Messages
MESSAGE1='ログイン理由がありません。Exitします。'
MESSAGE2='社員番号'
MESSAGE3='理由：'
MESSAGE4='不正な社員番号です。ログインを拒否します。'
MESSAGE5='ログイン理由を書いてください。'
MESSAGE6='社員番号を入力してください。'


```

# 今後の課題
・社員番号ファイルを外だしする。
・LDAP連携する。
・Oracleみたいにログインした瞬間にサーバ管理者にメール送信をして、エビデンスを残す。

# 2016/01/08 追記
GitHub上にスクリプトを置きました。最新版はこちらをご確認ください。
https://github.com/domonjo01/idcheck
Zabbix Housekeeping 設定

ZabbixのHousepeeper
===

ZabbixにはHousekeeperと呼ばれる、過去から蓄積された履歴データのうち、古いものを削除する処理を担う物がある。
日々、蓄積され続ける監視データは定期的に削除しないと監視DBが肥大化することは火を見るより明らかなので、Housekeeperの設定は密かに重要な項目だ。
ただし、この手の作業は得てして負荷が上がりやすいので実行タイミングや間隔、処理の重さなどを適切に設定しないと、高負荷に陥り肝心の監視処理に遅延を及ぼすこともある。

構築当初は監視エントリも少ないのでDefault設定でも何ら問題が起きないのだが、監視エントリの増加に伴い、以下のような通知を出すようになってきたので対処を考えてみる。

# エラー内容
<pre>
Zabbix housekeeper processes more than 75% busy
</pre>

# 何が起きているか
読んで字のごとく、Housekeeperの処理でCPU負荷が75%を超過している、ということを示すのだが、たいていこれが発生している時は100%に張り付いている。

自分だけでなく、多くの人が気になっているようでちょっと[ググる](https://www.google.co.jp/search?q=Zabbix+housekeeper+processes+more+than+75%25+busy&ie=UTF-8)だけで多くの記事が有り、フォーラムにもそれ専用のスレッドが立っているので調査方法はありそう。

# 対処法
sourceも見てみたが対処法は無さそうである。
 - http://www.zabbix.jp/node/2710
- zabbix_server.c
<pre>
    115 int     CONFIG_HOUSEKEEPER_FORKS        = 1;
</pre>
<pre>
    793         else if (server_num <= (server_count += CONFIG_HOUSEKEEPER_FORKS))
    794         {
    795                 INIT_SERVER(ZBX_PROCESS_TYPE_HOUSEKEEPER, CONFIG_HOUSEKEEPER_FORKS);
    796 
    797                 main_housekeeper_loop();
    798         }
</pre>

- 見た感じこれでは、並列処理もなされないし負荷を下げるような閾値も無い様子。

従って、現在の所housekeeperのbusyを監視していても殆ど意味が無いという結論に。
なんかグダグダの結論で悲しいが、他に直さねばならないところは山ほどあるので、優先順位が低いとわかった時点でいったん保留。
画面サイズ変わるとぶっ壊れるAuto LayoutをUnit Testで把握する

## TL;DR

ライブラリ書きました。
https://github.com/ypresto/AutoLayoutLint

これを入れておけば↓みたいな感じでViewControllerごとにぶっ壊れているかどうかチェックしてくれます。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/4153/f94671fd-2368-9411-1fef-45871bf8f844.png)


## セットアップ

iOS 8.0+のプロジェクトで使えます。

CarthageかCocoaPodsでAutoLayoutLintを[インストール](https://github.com/ypresto/AutoLayoutLint#installation)したらこんな感じのテストを書けば追加done!
（画面サイズはサポートしているものだけ残して削ったり、iPadの解像度を足したりしてください。）

```objc
@import AutoLayoutLint;

@interface YourAutoLayoutLintTests : PSTAutoLayoutLintTestCase

@end

@implementation YourAutoLayoutLintTests

+ (NSArray<NSValue *> *)screenSizes
{
    return @[
        [self valueWithWidth:320 height:480], // iPhone 4S
        [self valueWithWidth:480 height:320],
        [self valueWithWidth:320 height:568], // iPhone 5, 5S
        [self valueWithWidth:568 height:320],
        [self valueWithWidth:375 height:667], // iPhone 6, 6S
        [self valueWithWidth:667 height:375],
        [self valueWithWidth:414 height:736], // iPhone 6 Plus, 6S Plus
        [self valueWithWidth:736 height:414],
    ];
}

- (void)testDummy
{
    // NOTE: Workaround for Xcode bug.
    // Refer: https://github.com/ypresto/AutoLayoutLint/issues/1
}

@end
```

## Auto Layoutの課題点

Auto Layoutは簡単に様々な画面サイズへの対応が可能で便利な反面、Constraintsを上手に設計しないと、画面サイズが変わった時に "Unable to simultaneously satisfy constraints" と言われて壊れたりします。

（設計についてはこちらもどうぞ→） http://qiita.com/yuya_presto/items/08b0656f67a59c8c2d03

チーム内でも実際にサイズが変わることによってConstraintsが壊れたりしたのですが、これをレビューなどで発見・修正するためにはConstraintsの設計について習熟していないと難しいという点が課題に上がりました。特に今回はiPhone 6(S) / 6(S) Plus解像度への対応を行うために大変多くのViewControllerについてAuto Layoutの新規投入や修正を行うこととなり、壊れている箇所がないか不安が残りました。

## それprivate APIででき（ｒｙ

そこで最低限のチェックを自動化できないかというアイデアを持ち出しました。

チームメンバーが`misplaced="YES"`になっている（Interface Builder上で黄色い三角出てる状態）xmlをgrepで見つける[チェックを作ってくれた](http://qiita.com/ainame/items/68352e24b8dc3ce5f159)のですが、かつてあった（はずの）`ambiguous="YES"`（赤丸出ていて壊れている状態）がxml上に現れなくなっていました。

一方Auto Layoutが壊れるのは大抵Interface Builder上の表示と異なる画面サイズになった場合なので、それを何とかして見つけるには実際にLayout Engineをぶん回す他なさそうだなぁという考えに至りました。

そこで、画面サイズをいろいろ変えてレイアウト処理を実際に実行してみて、Auto Layoutが警告を出す際の（private APIな）メソッド呼び出しをぶんどってTest FailureにするUnit Testをライブラリ化してみました。

※実際のViewControllerのviewDidLoadが叩かれると通信とかしちゃう場合がありそうなのでviewDidLoadもぶんどってstubにしちゃいます。

## 既知の制限

UITableViewとかUICollectionViewとか動的要素が強いのでまだチェックできないのですが適当にdataSource埋めたらどうにかなりそうなので、なんとかしようと思っています・・。
UINavigationControllerにpushしているわけじゃなく、nav/tab barの高さをエミュレートしているわけではないので、縦方向のチェックは若干不完全かもしれません。これは対策を考えます。
あと、compression resistance priorityとかcontent hugging priorityとかで起きるambiguous状態も発見したいのですがまだ未サポートです。priorityの件に関しては後で記事書こうと思います。
可変長テンプレート引数のそれぞれの値に関数を適用する

可変長のデータに対して同一関数を適用したい。
いまだと可変長テンプレート引数を使うのかなと思って次のようにしてみた。

http://lnseab.hatenablog.jp/entry/2012/12/13/172753 のテンプレートパックの展開を参考にして次のようなものを書いた。

```cpp:expand-variadic-templates.cpp
#include <iomanip>
#include <iostream>
#include <utility>
#include <cstdio>

// clang needs non-void type for template pack
template <typename T>
int log(T target) noexcept {
    time_t const now = std::time(nullptr);
    std::tm const * timeinfo = std::localtime(&now);
    std::cout
        << std::setfill('0')
        << "["
        << timeinfo->tm_year + 1900
        << "/"
        << std::setw(2) << timeinfo->tm_mon + 1
        << "/"
        << std::setw(2) << timeinfo->tm_mday
        << " "
        << std::setw(2) << timeinfo->tm_hour
        << ":"
        << std::setw(2) << timeinfo->tm_min
        << ":"
        << std::setw(2) << timeinfo->tm_sec
        << "] "
        << target
        << std::endl;
    return 0;
}

// clang consexpr needs a literal type for return value
template <typename ... Args>
inline constexpr int expand_variadic_templates(Args ... args) noexcept {
    return 0;
}

// clang consexpr needs a literal type for return value
template <typename ... Args>
inline constexpr int log_all(Args ... args) noexcept {
    return expand_variadic_templates(log(args)...);
}

int main(const int argc, const char* const argv[]) {
    log_all(1, 0.2, "foo", true);

    return 0;
}

```

gcc/clang で -Wunused-parameter コンパイラーオプションを指定していると expand_variadic_templates で使わない仮引数が生成されて警告が出てしまうのでそこだけ注意かな。

<del>渡す値の型がすべて同じ場合、 http://cpplover.blogspot.jp/2010/03/variadic-templates.html で紹介されてる再帰の方法も使えるけどスマートではないね。</del>

<ins>同じことを再帰で処理することもできる。コメントで指摘してくださった amate さんありがとうございます。あれ ? これでいいんじゃね ?</ins>

```cpp:recursive-variadic-templates.cpp
inline constexpr int log_all() noexcept {
    return 0;
}

template <typename T, typename ... Args>
inline void log_all(T target, Args ... rest) noexcept {
    log(target);
    log_all(rest...);
}

int main(const int argc, const char* const argv[]) {
    log_all(1, 0.2, "foo", true);

    return 0;
}

```
Twitterのふぁぼマークを寿司にする

記事をすべてGithub Pagesに移行しました。
新しいURLはこちら: [https://genkami.github.io/2015/11/04/twitter-shshi.html](https://genkami.github.io/2015/11/04/twitter-shshi.html)

Twitterのふぁぼマークがハートになってしまったので、昔ながらの寿司アイコンに戻す方法を書いておきます。(Google Chromeのみ)

# 1. Stylebotをインストール
[Stylebot](https://chrome.google.com/webstore/detail/stylebot/oiaejidbmkiecgbjeifoejpgmdaleoha)というChromeの拡張機能をインストールします。
[https://chrome.google.com/webstore/detail/stylebot/oiaejidbmkiecgbjeifoejpgmdaleoha](https://chrome.google.com/webstore/detail/stylebot/oiaejidbmkiecgbjeifoejpgmdaleoha)
上のリンクをクリックし、「CHROMEに追加」ボタンを押します。
![スクリーンショット 2015-11-04 3.18.28.png](https://qiita-image-store.s3.amazonaws.com/0/55949/8d47f061-2268-6dda-e5ee-4e19e234faf6.png)

「Stylebot」を追加しますか? と聞かれるので、「拡張機能を追加」をクリックします。

![スクリーンショット 2015-11-04 3.18.38.png](https://qiita-image-store.s3.amazonaws.com/0/55949/08d9241a-77c1-06ab-b46f-62c185cde55f.png)

インストール自体は数秒で完了すると思います。インストールが完了したらTwitterのページを開いてください。

# 2. TwitterのCSSを書き換える
Twitterのページを開きます。画面右上に「CSS」と書かれたボタンが増えていることに気付くと思います。
![スクリーンショット 2015-11-04 3.19.23.png](https://qiita-image-store.s3.amazonaws.com/0/55949/0bc344ca-9ff6-37c9-4275-c8ce3b3377c7.png)

このボタンをクリックするとメニューが出てくると思うので、「Open Stylebot...」をクリックします。

![スクリーンショット 2015-11-04 3.19.39.png](https://qiita-image-store.s3.amazonaws.com/0/55949/eaffea9e-057e-bc09-6d31-34730e62afd1.png)

クリックすると画面右側によくわからないメニューが出てきますが、無視して下のほうにある「Edit CSS」をクリックします。

![スクリーンショット 2015-11-04 3.19.43.png](https://qiita-image-store.s3.amazonaws.com/0/55949/8da90b53-dfae-a196-87d1-1d74acac6349.png)

すると何か入力できそうな真っ白な画面になるので、以下のCSSをそのままコピペします。

```css:style.css
.HeartAnimation {
    background: url(https://pbs.twimg.com/media/CS5_8eqU8AAkYM7.png:large);
    background-size: 2900%;
    background-position: left;
}

.ProfileTweet-action--favorite .ProfileTweet-actionButton:hover .HeartAnimation, .ProfileTweet-action--favorite .ProfileTweet-actionButton:focus .HeartAnimation, .favorited .ProfileTweet-action--favorite .HeartAnimation {
    background-position: right;
}
```

コピペした結果がこちら

![スクリーンショット 2015-11-04 3.42.43.png](https://qiita-image-store.s3.amazonaws.com/0/55949/70d619c9-57a1-d71e-fcff-c8bf32417d7f.png)

下のほうにある「Save」ボタンを押すとあら不思議! ふぁぼマークがハートから昔ながらの寿司アイコンに戻っています。やったね!

![スクリーンショット 2015-11-04 3.43.14.png](https://qiita-image-store.s3.amazonaws.com/0/55949/2b5b6219-7ffc-4ebc-8b76-432cdb49b3d6.png)

もし動かなくなってたらTwitter社の陰謀か仕様変更だと思ってください。

ちなみにChrome以外のブラウザにもユーザースタイルシートを設定できる拡張機能はあるはずなので、適当に探して適当にやってみたら寿司にできます。
ElixirでMySQLのdatetime型をUNIX TIMESTAMPに変換する

date形式をUNIX TIMESTAMPに変換するのは英語の記事があったけど
MySQLのdatetimeをElixirで扱うとmsecまで入ってたので改良。

```ex
defmodule UnixTime do
  def convert_date_to_unixtime(created_at) do
    #JSTの場合9Hにしておく
    epoch = {{1970, 1, 1}, {9, 0, 0}}
    epoch_gs = :calendar.datetime_to_gregorian_seconds(epoch)

    {{year, month, day}, {hour, minute, second, msec}} = created_at
    gs = :calendar.datetime_to_gregorian_seconds({{year, month, day}, {hour, minute, second}})
    gs - epoch_gs
  end
end
```

利用方法

```ex
UnixTime.convert_date_to_unixtime(updated_at)
```

1432364949 みたいなのが返却される

参考：
http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html
Effective Java 読書メモ ( 第9章 例外 )


# 項目57 例外的状態にだけ例外を使用する

## 例外に基づくイデオムを、通常の制御フローで使ってはいけない

### 例

ループの終了判定をArrayIndexOutOfBoundsExceptionで行うような処理はよくない。

### 理由

JVMの実装は、例外はあくまで例外的な処理のために設計されている。
最適化が行われず、パフォーマンスが出ない。
現時点で仮に性能が出なくても最新のJVM実装はそれを保証しない。

## 状態依存があるメソッドがあるクラスは、状態検査のメソッドを持つべきである

### 例

Iterator#hasNext()

### 理由

いいAPIは通常の制御フローに例外を使用することをクライアントに強制しない。
バグを隠してしまう可能性があるため。

## 並行アクセスされるか、外部から状態変更されるオブジェクトでは状態判定を戻り値で行う

### 例

オブジェクトが不適切な状態である場合にnullを返すなど、戻り値で状態を判別できるようにする。

### 理由

状態判定メソッドを呼び出してから、実際の処理を実行するまでにオブジェクトの状態が変わっている可能性があるため。

### 補足

基本的には状態検査メソッドの方が優れている。
可読性の高さと不適切な使用が（例外がthrowされることにより）見つけやすくなるため。
戻り値での状態判定は、戻り値のチェックを忘れるとバグが見つけにくい。

# 項目58 回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する

## スローできる例外には3種類ある
| 種類 | 使用ケース | 補足 |
|:-----------|:------------|:------------|
| チェック例外 | 呼び出し側が適切に回復できる場合に使用する | 回復可能かどうかは、API設計者が判断すべきことである |
| 実行時例外 | プログラミングエラーを示す場合に使用する | 多くの場合事前条件違反である。ArrayIndexOutOfBoundsExceptionは配列の長さ-1でアクセスしなければならないという、配列アクセスの事前条件を違反した場合に発生する |
| エラー |（慣例的に）JVMが実行を継続的ない状態を示すために予約されている。Errorのサブクラスは作るべきではない。|OutOfMemoryErrorなど|

## チェックされる例外には、状態を回復するための情報を供給するメソッドを用意する

### 例

購入処理を行おうとした場合に残高不足で発生する例外があるとしたら、不足額を問い合わせるアクセサメソッドを用意する。

### 理由

状態回復するために必要な情報であるから。

# 項目59 チェックされる例外を不必要に使用するのを避ける

## 例外状態を防ぐことができない、かつ例外に直面した時に有用な処理をできる場合を除きチェック例外を使用しない

### 例

※基本的に状態チェックのメソッドを用意するのと同じ考え方

```java
if (obj.actionPermitted(args)) {
    obj.action(args);
} else {
    // 例外状態の処理
}
```
### 理由

* 一つの例外のためにtry-catchブロックを記述するのは負担が大きい
* ましてや有用な処理ができないならなおさらだ

# 項目60 標準例外を使用する
## 既存の例外をできるだけ再利用する
### 例
| 例外 | 使用する機会 |
|:-----------|:------------|
| IllegalArgumentException | パラメータ値が不適切 |
| IllegalStateExceptioin | メソッド呼び出しに対してオブジェクト状態が不正 |
| NullPointerException | パラメータ値が禁止されているnull |
| IndexOutOfBoundsException | インデックスパラメータ値が範囲外 |
| CouncurrentModificationException | 禁止されているオブジェクトの並行した変更を検出 |
| UnsupportedOperationException | オブジェクトがメソッドをサポートしていない（追加のみのListの削除メソッド等） | 

### 理由
* 慣例と一致することは容易性につながる

# 項目61 抽象概念に適した例外をスローする

* 下位レイヤの例外は可能な限り上位レイヤで発生しないよう保証する
* 防げない場合は上位レイヤで処理し、伝播を防ぐ
* それも無理な場合、例外翻訳、例外連鎖を利用する

### 例
```java
try {
	// sample
} catch (LowerLevelException cause) {
	// 翻訳して連鎖させる
	throw new HigherLevelException(cause);
}
```

### 理由
* 上位レベルの処理の変更によって（スローされる例外が変わり）、呼び出し元が汚染されるのを防ぐため

# 項目62 各メソッドがスローするすべての例外を文書化する

* スローする例外については個々に性格に文書（Javadoc）化する
* throws Exception や throws Throwableとはしない
* 非チェック例外についても文書化する（ただしthrows節にはつけない）

### 理由
* メソッドの事前条件、正しく利用するための貴重な情報源になるため
* チェック例外と非チェック例外は視覚的に区別できることが大切
Max/mspで大量の家電を扱う時の工夫

#　はじめに。

メディアアート製作のために、大量の家電を制御しています。
制御上の大きな構造としては、＜Max→Arduino→リレー回路→家電＞という流れです。
この際のこの際の注意点や工夫を共有できればと思います。

#Maxの欠点

私たちは、Maxから６つのArduinoを制御するのですが、
家電を制御する際に、最初は全ての動作プログラムと、それの命令先の指定も全てMax上で行おうと考えていました。

しかし、実際にその大量のプログラムをMaxで行おうとすると負担が大きく難しいという結論に至りました。
Maxはプログラム初心者には優しく、使いやすいのですが、プログラムの量が多くなると、画面が見ずらくなり、負担も大きくなってしまうという欠点があります。

そこで、ArduinoとMaxでプログラムの**"分担"**を行うことにしました。

#APIとシリアル通信

通常、MaxからArduinoを制御する際、Maxuinoとstandardfilmataを、それぞれMaxとArduinoに入れて、全ての動作指令をMax上で行います。
通常はそれで問題ないはずなのですが、今回のように大量の家電を別々の動かし方をするとなると、Maxでの負担が大きくなります。

そこで私たちは、あらかじめArduino上で具体的な動作の仕方をプログラムし、その動かし方それぞれをナンバリングします。
そうすることで、Maxからはシリアル通信を使って、番号を下すだけで家電が動作します。

長く複雑な動作のプログラムはArduino上になりますので、Max上では単に番号を下すだけになります。
Maxに掛かる負担も減り、ウインドウはシンプルになるので、システムとしてスマート制御できるでしょう。


※この場合、動作のタイミングなどを変更したい場合はArduino本体へ直接プログラムを書き込まないといけないので多少手間がかかりますので注意。
OpsWorks の勘所

# この記事について
私が AWS OpsWorks を実際に利用するうえで、最初に知っておけたら良かったということをまとめています。
フィードバックはお気軽にいただけると嬉しいです！

## 紹介ムービー
AWS OpsWorks のご紹介（日本語字幕）
https://www.youtube.com/watch?v=T76k-QR39LI

## 内部で利用されている主なオープンソース技術
- Git
- Chef
- Capistrano
- Monit

## OpsWorks の勘所

### 設計の方針
冪等性(Immutable Infrastructure)を意識して構築します。いつでもボタンをポチるだけでインスタンスが入れ替え可能な状態。そこで次のような方針をとります。

#### 保存すべきデータや複雑な設定は EC2 から切り離す、減らす。

そうすると具体的には次のような組み立て方をしていけば良いことがわかります。

- データベースは MySQL レイヤーは使わず RDS を使う。
- ロードバランサーのレイヤーも使わず ELB を使う。
- Instance Store を採用し、EBS への依存を排除。
- アセットファイル、アップロードファイルは S3 へ投げる。
- セッション、キャッシュは Memcached や Redids を利用。
- キューイングは Redis や AWS SQS を利用。
- メールは AWS SES や SendGrid を利用。
- ログは fluentd で S3 へ投げる。

### 設定、運用について
- リポジトリに含めたくない情報は環境変数(App の設定)を利用して渡す。
- Custom Cookbook は 本家の Cookbook を複製して独自のブランチをきり、Rebase をしながら本家に追従させる運用をとる。
- EC2インスタンスから S3 や SES などの AWS の各リソースへのアクセス制御には IAM Role を使う。鍵の設置/設定なしでリソースが利用できるためシンプルになる。
- Staging 環境や検証用環境構築は Stack の複製機能を使うと楽。

## Custom Cookbook 利用タイミングの例
- 標準で用意されてい設定ファイルに設定ファイルに大きな変更が必要(設定値変更ならCustom JSONでOK)。
- Sidekiq や fluentd(td-agent) など標準で用意されていないツールの導入。
- Cronジョブの追加。

## 注意点
- AWS オートスケールは使えない(っぽいのはある)。
- Cookbook のカスタマイズは割と普通に発生する。
- RDS は1スタックにつき1つという考え方。

## 最後に
naoya 氏のコメントが的を得てますのでそのまま引用させていただきます。
> _例えば顧客毎にアプリケーションの実行環境を用意するようなビジネスのモデルなんかでも大活躍ですね。グループウェアとか。むしろビジネス的には、そこが一番重要なところなのかもしれない。_

http://d.hatena.ne.jp/naoya/20130219


## 参考
AWS OpsWorks とは何ですか? - OpsWorks ユーザーガイド
https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/welcome.html

aws/opsworks-cookbooks - Github
https://github.com/aws/opsworks-cookbooks

AWS OpsWorksハンズオン - SlideShare
http://www.slideshare.net/AmazonWebServicesJapan/aws-opsworks

AWS OpsWorks(™)のCustom Cookbooksレシピ開発役立ちメモ - Qiita sawanobolyさん
http://qiita.com/sawanoboly/items/147f550878477ff7723e
npmのuninstallコマンドを忘れがちなのでメモ

npmのアンインストール時のコマンドについて忘れがちだったのでメモ。

# package.jsonの書き換え

`--save-dev`はdevDependenciesからの削除、
`--save`はDependenciesからの削除となる。

単純に`--save`だとdevDependenciesから削除されないで注意。

```text:devDependenciesからの削除
npm uninstall パッケージ --save-dev
```

```text:Dependenciesからの削除
npm uninstall パッケージ --save
```

# アンインストール

helpでは` npm rm `と`npm uninstall`が表示されているが
アンインストールコマンドとしては以下はすべて利用できる。

```
npm rm パッケージ
npm uninstall パッケージ
npm r パッケージ
npm remove パッケージ
npm un パッケージ
npm unlink パッケージ
```

# --save-dev,--saveの位置

`--save-dev`,`--save`は人によってこだわりがありそうだが、前後どちらでもよい。

```text:devDependenciesへの登録
npm install --save-dev パッケージ
npm install パッケージ --save-dev
``` 

```text:dependenciesへの登録
npm install --save パッケージ
npm install パッケージ --save
```
サインスマートのリレーモジュールでAC電球を点灯させてみた（LoがONであることに注意）

# 概要
## 書いてあること
- 駆動側（電球・電源プラグ側）の工作について
- サインスマートのリレーモジュールの使い方について

## 写真
![22692.jpg](https://qiita-image-store.s3.amazonaws.com/0/96806/311273f3-afd1-a08f-2f99-6f11c613af59.jpeg)

## 事前調査
- [PCから沢山の機器を制御したいと思った時に](http://qiita.com/UT-HACKs/items/0ba6eccea504cd0cc6be)
- [Arduinoで照明の電子制御をしたい](http://qiita.com/UT-HACKs/items/6ca7f36b0d19fa30f795)
- [ArduinoからLED電球のON/OFFを制御する](http://qiita.com/UT-HACKs/items/ac1f0a529ee43521acf8)

# 用意したもの
## 制御側
- PC
- Arduino
- サインスマートのリレーモジュール（8チャンネル）
- ブレッドボード、ジャンパー

## 駆動側
- 電球セット
    - 電球
    - 電球ソケット（プラグ付き）
- 延長ケーブルセット
    - 電源ケーブル
    - 電源プラグ
    - 電源コネクタ
    - 圧着端子

## 工具
- ニッパ
- 圧着ペンチ
- ワイヤーストリッパー

# 駆動側（電球・電源プラグ側）の工作について
- 電球セットはおまけで、要するに**[電源プラグ]-[リレースイッチ]-[電源コネクタ]**という構成で汎用的に使えるようにします
- [SSRだけど、同じような駆動側を用意している例参考](http://blog.livedoor.jp/hardyboy/archives/5958235.html)

## 作業内容
1. 電源ケーブルを用意する
2. 電源ケーブルの途中を割いて、片方をニッパで断線する
3. 両端各2か所と、途中で断線させた2か所の被膜を5mm程度剥く
4. 両端各2か所の電線に圧着端子を圧着する
5. 両端を、電源プラグと電源コネクタのそれぞれに取り付ける
6. 切断した所の電線をリレーモジュールに差し込んでねじ止めする

## 注意点
1. 電源ケーブルを傷付けないようにする
2. ショートしないようにする（特に電源ケーブルのひげ等が、コネクタやプラグ内で接触していないか）

## 懸念点
- リレーと電源ケーブルの接続があら過ぎる。何らかの**確実な接続方法**を検討する。
- 漏電やショートが起きた時の対策がない。[リレーの反対側にヒューズを挟んでいる例](http://blog.livedoor.jp/hardyboy/archives/5958235.html)もある。
- プラグやコネクタも自分で用意するのではなく、**既製品の延長ケーブルを切断するだけ**でもよい。

# サインスマートのリレーモジュールの使い方について
- 基本は仕様書を読めばよい

## 参考
- [仕様書](http://www.tosadenshi.co.jp/pdf/relay_module.pdf)
- [16チャンネル版仕様書](http://www.tosadenshi.co.jp/pdf/relay_module_16-03.pdf)
- [使い方を解説している動画](https://www.youtube.com/watch?v=0nhX9iqbkKk)

## 配線の仕方(冒頭の写真参照)
- 左側にまとめた3本の線は、ArduinoのVccを3か所に接続
- 中央にまとめた2本の線は、ArduinoのGNDを2ヶ所に接続
- 右側にまとめた1本の線は、制御用信号をおくるピンに接続

## 動作（**制御信号とスイッチの01が逆転しているので注意**）
- 制御信号が**Lo**(GND)の時にスイッチが**ON**になる
    - 赤いLEDが点灯し、基盤上の図で切断されている方の回路（写真で言う中央と左側）が導通する
- 制御信号が**Hi**(Vcc)の時にスイッチが**OFF**になる
    - 赤いLEDが消灯し、基板上の図でつながれている方の回路（写真で言う中央と右側）が導通する
Bluetooth端末の情報をスマホで受信して何か面白いことしたい！(2/2) 〜iOSで周辺機器をスキャンする〜

[Bluetooth端末の情報をスマホで受信して何か面白いことしたい！(2/2) 〜iOSで周辺機器をスキャンする〜](http://qiita.com/nogahighland/items/f5a0420111e45ee80356) の続編です。

# Bluetooth 4.0の端末をiOS端末でスキャンしてみる

CoreBluetoothというフレームワークを利用して色々なことができそうです。
大きなライブラリではないので、どういうことができるのか公式リファレンスを眺めると大体想像がつくのではないでしょうか。

- [Bluetooth for Developers | Apple](https://developer.apple.com/bluetooth/)

リファレンスで触れられている用語をもっと噛み砕いた記事がこちらになります。リファレンスとセットで読むと、全体の概念が理解しやすいです。

- [CoreBluetoothでできること](http://qiita.com/rnamiki/items/ea912393c4fb58e7a9b9)

# サンプルを動かしてみる

iOSでアドバタイズしている周辺のBluetooth機器から特定の情報だけをサブスクライブするサンプルを作成しました。

- [受信サンプル(Github)](https://github.com/nogahighland/DetectBTLEPeripheral)

ここで「アドバタイズ」とは「情報発信してまっせ！！」という情報を広く発信していることです。受信圏内にいれば複数機器のアドバタイズ情報を受け取ることができますが、全てを受け取るということはまず無いでしょう。

通常は「○○ボタンが押された」とか、心拍数が変わったとか、電池の残量が変わったとか、ほしい情報に限定すべきでしょう。特定のサービスを持った機器と接続し、サービスの中の特定のキャラクタリスティックの値についての更新通知を受け取ることを「サブスクライブ」と言います。

サンプルでは

```objc
#define SERVICE_UUIDS           nil //@[[CBUUID UUIDWithString:@"UUID"]]
#define CHARACTERISTIC_UUID     nil //[CBUUID UUIDWithString:@"UUID"]
```

のようにまずは特定せずに全て受信するような実装にしています。手近なBluetooth機器をONにして動かせば、とりあえず全ての情報を受信してログに垂れ流すようにしています(そのせいで警告が出ていますが悪しからず)。

流れに沿って出力されるログを地道に解析すれば、どの機器のどの情報がどんな値で受信されているのか確認できると思います。応用すれば実世界の人のアクションに対してアプリケーションを反応させることができるようになります。

また、上で紹介したAppleのサンプルではiOSをBluetooth発信側にすることもできるので、iPhone同士のデータ送受信で何か面白いアプリができそうです。

# 自分でいろんな情報を発信するBluetoothデバイスを作る

ハンダ付けとか得意な人は、Arduinoという基板＋Bluetoothチップを買って情報発信プログラムを組み込めば自作のBluetooth周辺機器が作れるそうです。

私はその辺りは全く詳しくないですが、リンク先(Amazon)の商品や作り方ページをご覧になれば結構簡単に作れるそうです。ご参考までに。

- [Arduinoをはじめようキット](http://amzn.to/1CZv4Si)
- [Arduinoをはじめよう 第2版 (Make:PROJECTS) ](http://amzn.to/1xKbiqk)
- [BLEモジュール　BLESerial ](http://amzn.to/1CmgbuY)
- [ArduinoとiPhone端末をBLE(Bluetooth 4.0)でつないでみる|浅草ギ研](http://www.robotsfx.com/robot/img/radio/BLESerial/BLESerial_how6.html)

他のセンサー類と組み合わせて基板から不要な部分を取り去れば、3Dプリンターなんかで作ったケースで囲んで実生活で利用できるデバイスが作れるかもしれませんね。

商品化するにはBluetoothの技適を取得しないと電波法違反になってしまいますので、お忘れなく。

- [Bluetooth無線に必要な認証（電波法・Bluetoothロゴ認証）について](http://www.musenka.com/info/musen/auth.html)
Ruby on Rails Tutorialのテスト駆動開発でエラー


# 初めに

[「Ruby on Rails Tutorial　第3章の3.2.1　テスト駆動開発」](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-TDD)をやっていて自分の環境ではなかなかすんなりいかなかったので，その経過をメモしておく．

関係ありそうなgemのバージョンに関しては以下の通り．
rails (4.2.4)
capybara (2.5.0)
rspec関係 (3以降)

# rspecコマンドの実行でエラー（その1）
下記のrspecコマンドを実行するとエラーが出る．

$ bundle exec rspec spec/requests/static_pages_spec.rb

テストが失敗するのではなく，以下のようなエラーメッセージが出る．
>uninitialized constant Capybara (NameError)

[「Rspec で uninitialized constant Capybara (NameError) エラー」](http://app2641.hatenablog.com/entry/2014/12/15/172954)を参考に

spec/spec_helper.rbに以下の2行を先頭に追記したら，上記のエラーは出なくなった．

```ruby
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
```

# rspecコマンドの実行でエラー（その２）
上記の修正をして再びrspecコマンドの実行すると，今度は違うエラーが出る．エラーメッセージは以下の通り．
>ArgumentError: rack-test requires a rack application, 

[ここ](http://pyoonn.hatenablog.com/entry/2014/12/18/235049)を参考にして，再びspec/spec_helper.rbに以下の1行を追加（さっき追加したところの下でいいみたい）．

```ruby
require 'rspec/rails'
```

これでRspecの実行自体ではエラーが出なくなる．

あとはチュートリアルに従ってhome.html.erbを書き変えて，"Sample App"が含まれるようにしてテストを実行するとテストにパスするようになる．

# まとめ
結局，spec/spec_helper.rbに以下の3行を先頭に追記すればよいようです．

```ruby
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
```
AWS Lambdaで 形態素解析 できる賢いSlackボットを低予算で作ろうじゃないか (2)

## はじめに
形態素解析といえば `MeCab`、`Kuromoji` が有名ですが、中でも`TinySegmenter`の軽量さにはビビってました。
ところが知らぬ間に、楽天さんが、さらにすごいやつをリリースしていました！

![rakutenma_logo.png](https://qiita-image-store.s3.amazonaws.com/0/69410/2b7554ce-c504-a242-2bca-cc7aae8528d6.png)
https://github.com/rakuten-nlp/rakutenma

 - ピュア JavaScript
 - 日本語/中国語(簡体字) 対応
 - 品詞付き

これはランボーに入れちゃうしかないです！

ランボーとは：http://qiita.com/exabugs/items/e868df55333d0805acb2


## AWS設定
### Step 1: Lambda設定

 - ランボーのLambda関数を、差し替えます。

 - Lambdaは npm モジュール含みのzipを扱えるのですが、RakutenMA フルパッケージだと 50MByte を超えてしまいます。

 - 以下の最小構成なら、zip で 2MByte 弱でいけちゃう
   - rakutenma.js
   - hanzenkaku.js
   - model_ja.min.json (辞書) 

 - Lambda関数は以下になります。
(一式はこちら GitHub : https://github.com/exabugs/Lambot-MA )

```js
var fs = require("fs");

var RakutenMA = require("./rakutenma/rakutenma");
var HanZenKaku = require("./rakutenma/hanzenkaku").HanZenKaku;
var model = JSON.parse(fs.readFileSync("./rakutenma/model_ja.min.json"));

rma = new RakutenMA(model);
rma.featset = RakutenMA.default_featset_ja;
rma.hash_func = RakutenMA.create_hash_func(15);


exports.handler = function(event, context) {

  // han->zen
  var text = series([HanZenKaku.h2z, HanZenKaku.hw2fw, HanZenKaku.hs2fs], event.text);

  var tokens = rma.tokenize(text);

  tokens = tokens.reduce(function (memo, token) {
    // remove white space tokens.
    if (token[1] !== 'W') {
      // zen->han
      token[0] = series([HanZenKaku.fs2hs, HanZenKaku.fw2hw], token[0]);
      memo.push(token);
    }
    return memo;
  }, []);

  text = tokens.join("\n");

  context.done(null, {text: text});
};

// utility
function series(array, input) {
  return array.reduce(function (input, func) {
    return func(input);
  }, input);
}

```

### Step 2: Configure function
 - Memory: 使用メモリを 128 → 192 に増やす必要があります。

![スクリーンショット_2015-11-03_22_17_48.png](https://qiita-image-store.s3.amazonaws.com/0/69410/b6b03c8c-d6e5-bfd4-8287-3102b69e76b4.png)

## 確認

Slackで確認してみます。おぉ、ランボーで形態素解析できています！
東京都-京都 問題も、大丈夫ですね。
ランボーが徐々に賢くなってきました。


![スクリーンショット_2015-11-03_18_49_35.png](https://qiita-image-store.s3.amazonaws.com/0/69410/4914c52a-1176-2e8b-54e3-3a2da39e2caa.png)



## まとめ
 - AWS Lambda 上に、形態素解析が可能な Slack用 ボット (ランボー) を構築しました。
 - ランボーは低料金でオートスケール、かつ、インフラ管理が不要です。
 - Lambdaでは実行環境(コンテナ)が再利用されるようなので、重めの初期化処理があったとしても、レスポンスが速いです。

## 注意
 - RakutenMA
     - min辞書では学習は不可のようです。
     - アルファベット6文字以上の連続は処理がおかしい?
gcloudを使ってインスタンスの構築・削除を行う

## About
gcloudを触ってみたので、メモとして書いておく。

## Environment
```
$ gcloud -v
Google Cloud SDK 0.9.80

bq 2.0.18
bq-nix 2.0.18
core 2015.09.25
core-nix 2015.09.03
gcloud 2015.09.25
gsutil 4.15
gsutil-nix 4.14
```

## 前提
* `gcloud auth`で認証済み
* プロジェクトも作成済み


## 操作する
### インスタンスの起動
```
$ gcloud compute instances create test01 --boot-disk-auto-delete --image centos-7 --maintenance-policy TERMINATE --preemptible --zone asia-east1-a
```

今回はpreemptibleにしたかったので`--preemptible`と`--maintenance-policy TERMINATE`をつけている。`--zone`の指定をしないと、対話的に聞かれるのでやっておいた方がいい。

### 便利コマンド

```
$ gcloud compute images list # 利用できるimageのリスト
$ gcloud compute machine-types list # machine-typeのリスト
```

### インスタンスを停止する

```
$ gcloud compute instances stop test02 --zone asia-east1-a
```

これも`--zone`の指定をしないと対話的に聞かれるので付けておいたほうが良さそう。

### リンク
[gcloud compute instances - Cloud SDK — Google Cloud Platform] (https://cloud.google.com/sdk/gcloud/reference/compute/instances/)
iPhone実機でサーバと通信出来ないときの最も簡単な解決方法


今回はRailsでapiを作成し、実機からそのapiをいくら叩いても

```
Could not connect to the server.
```
となってしまいハマってしまいましたん。


もちろんシミュレータでは全く問題なく通信ができます。


# 解決方法

① PCとiPhoneを同じWifiに繋ぐ
② ``rails s``ではなく``rails s -b 0.0.0.0``でサーバを起動する
③ iOS側でapiを叩く時に``localhost``ではなく **PCのIPアドレス** を使用する。

## ① PCとiPhoneを同じWifiに繋ぐ
PCとiPhoneを同じネット環境に置きましょう。

## ② ``rails s``ではなく``rails s -b 0.0.0.0``でサーバを起する

``rails s``では同じネット環境内のクライアントでもサーバにアクセスすることはできません。つまりPC外であるiPhoneはサーバにアクセスすることができないのです。

``rails s -b 0.0.0.0``とすることで同じネット環境内でPC外のクライアントからサーバにアクセスすることができるようになります。

### ③ iOS側でapiを叩く時に``localhost``ではなく **PCのIPアドレス** を使用する。

localhostというのは言わばPCの中でしか通用しません。そこにはIPアドレスというものが振られています。

以下PCのIPアドレスの取得方法です

```ターミナル
ifconfig | grep 192
```

このコマンドを打つと
◯◯◯.◯◯◯.◯◯◯.◯◯◯ (◯には数字が入る) という12桁の数字が表示されるので

iOS側でapiを叩く際に

```iOS側
"http://◯◯◯.◯◯◯.◯◯◯.◯◯◯:3000/"
```

として使ってあげると良いです。





### 参考
http://ja.stackoverflow.com/questions/18253/xcode7-iphone%E5%AE%9F%E6%A9%9F%E9%80%9A%E4%BF%A1%E3%82%A8%E3%83%A9%E3%83%BC-nsurlerrordomain-code-1004
Windows環境で圧縮（日本語ファイル名含む）し、Linux環境で解凍する方法

Windows環境で圧縮したファイル名（日本語）がLinux環境で解凍した際に文字化けして困ったので
対処した内容を残しておきたいと思います。
（今ある環境は極力いじらない前提のため、ベストな対処方法ではないですが）

[Windows環境でzip圧縮した日本語ファイル名がLinux環境で文字化け](https://melodybreeze86.wordpress.com/2015/11/03/windows%E7%92%B0%E5%A2%83%E3%81%A7zip%E5%9C%A7%E7%B8%AE%E3%81%97%E3%81%9F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%8Clinux%E7%92%B0%E5%A2%83%E3%81%A7%E6%96%87/)


実施した環境は、以下となります。
（細かい部分の補足は、後日時間のあるときに更新予定です・・・）

<dl>
  <dt>Windows環境</dt>
  <dd>Windows7 (32bit)</dd>
  <dd>7-Zip</dd>
　<dt>Linux環境</dt>
  <dd>CentOS5.4 (64bit)</dd>
  <dd>unzip (5.x系)</dd>
</dl>

以下、Windows環境で作成したサンプルの圧縮バッチです。
※7za.exeは、sample.batが格納されたディレクトリと同じ場所にある前提の例です。
※ポイントは、オプション指定の「-mcu=on」の部分です。


```lang:sample.bat
7za.exe a -tzip -mcu=on sample.zip c:\sample
```
以下、Linux環境で作成したサンプルの解凍シェルです。
※sample.zipが格納されたディレクトリに移動済の前提としています。
※ポイントは、jarコマンドで解凍する点です。

```lang:sample.sh
#!bin/bash
jar xvf sample.zip
```
ここが嫌だよrubyさん

java出身者の私がrubyを使っていて嫌な部分
（経験言語、java, javascript, android, scala少々）

**gemで色々出来るのはありがたいけど、gemに頼ってると、よく解らんけど動く何かが出来る。**
→gemのソースもざっとで良いから読めよデブ！

**同じ内容の記述でも似たような記述がある。Hashの:aiueoと"aiueo"みたいな。**
→Don't think feel!あと頑張って仕様覚えろ！

**プリコンパイルされないから、エラー処理とかの中のタイポに気づかないYO！！**
→テストコードちゃんと書けよハゲ！

**moduleとclassの使い分けがイマイチわからん**
→だから勉強しろよ！！

**そもそも、railsの「設定より規約」という考えが初心者キラーすぎる気がする**
→まぁ、最初の学習コストが大きいことは大きいよね

**【要約】**
すいません。なかなかrubyに慣れないので、ただの愚痴です。
はい。
容量の大きいpng画像のサイズ減量

pngquantがよかったです。
非常に減量率が高いです。
optipng というのもありますが、ちょっと用途・目的が違うようです。

TinyPNGで使われているpngquant入れてpng圧縮してみるメモ - for centos
http://tweeeety.hateblo.jp/entry/2015/05/19/193913

pngquant -v --skip-if-larger --ext .png --force hoge.png
PhoneGap BuildでBackground Fetch

# iOSのBackground Fetch
今更ですが、iOSでバックグラウンドで何らかのジョブを行う場合、**Background Fetch**を利用することになる。

*Background Fetch を試してみた*
http://qiita.com/griffin_stewie/items/8371c09059b3ba7bb202

cordovaにもそれに対応したプラグインがあり、
*PhoneGap Build* https://build.phonegap.com/ で利用可能な様子。

*CDVBackgroundFetch - Cordova Background Fetch Plugin*
https://build.phonegap.com/plugins/955

# サンプルソースコード
Parse.comにデータを登録するサンプルソースコード。
ただし、**Background Fetch**の仕様は特に呼出間隔が決められていない。30分単位とかそれ以上でしかデータが増えていかない気がする。

```xml:config.xml
<gap:plugin name="org.transistorsoft.cordova.plugin.background.fetch" />    
```

```js
// AngularJSベース
angular.module('myApp', [])
.factory('shared',['$http',function($http){
  var _o = {
    appId : "[parse.comのアプリケーションID]",
    apiKey : "[parse.comのAPI KEY]",

    // BackgroundFetchを利用し、Parse.comにデータを登録する		
    sampleFetchPostParse: function() {
      var Fetcher = window.plugins.backgroundFetch;
    
      var fetchCallback = function() {
        // parse.com の APIを呼び出す
        $http({
          'method':'POST',
          'url':'https://api.parse.com/1/classes/SampleData',
          'headers':{
            "X-Parse-Application-Id": _o.appId,
            "X-Parse-REST-API-Key": _o.apiKey,
          },
          'data':{
            "name": "sample name",
          }
        })
        .then(function(){
          // ネイティヴ側スレッドを停止する
          Fetcher.finish();   					
        });
      }
      // Fetchを設定する
      Fetcher.configure(fetchCallback);
    }
  };
  return _o;
}])
;

```
コマンドで仮想サーバーのシステムバックアップ取得

# 概要
シェルに組み込めるコマンドで、仮想サーバーのバックアップを取得する方法です。

# 詳細
slcli コマンドをインストールしておく必要があります。 slcli は、Windows PC, Mac, Linuxのどれでも利用できます。 slcliコマンドのインストールは、[pyenv と slcli コマンドをインストールする手順](http://qiita.com/MahoTakara/items/cbd861112b00da82c95b)を参照ねがいます。

## イメージを取得したいサーバーのIDを調べる

```
chef@ChefWs:~/shells$ slcli vs list
:..........:............:.................:...............:............:........:
:    id    :  hostname  :    primary_ip   :   backend_ip  : datacenter : action :
:..........:............:.................:...............:............:........:
: 13311871 :  server1   : 161.202.***.*** : 10.132.253.** :   tok02    :   -    :
:..........:............:.................:...............:............:........:
```
## IDを指定して、イメージを取得する

```
chef@ChefWs:~/shells$ slcli vs capture 13311871 --name centos6_64_custom
:................:............................:
:           Name : Value                      :
:................:............................:
:          vs_id : 13311871                   :
:           date : 2015-10-20                 :
:           time : 00:46:30                   :
:    transaction : Create Cloud Disk Template :
: transaction_id : 24811161                   :
:      all_disks : None                       :
:................:............................:
```

## 取得したイメージのIDを調べる

```
chef@ChefWs:~/shells$ slcli image list --private
:......................................:......................:........:............:.........:
:                 guid                 :         name         :  type  : visibility : account :
:......................................:......................:........:............:.........:
: df4778ab-ff19-44f4-892e-b9aa45ea893e :  centos6_64_custom   : System :  Private   :  289550 :
:......................................:......................:........:............:.........:
```
【Javascript】配列は先頭の値から順に「0」、「1」・・・と連続した数値のプロパティ名を持つ

##Javascriptの配列は先頭の値から順に「0」、「1」・・・と連続した数値のプロパティ名を持つ。

私は、この認識でいたのですが、前に書いた記事で@think49氏にコメントを頂きました。

_配列の index は "0, 1, 2 ..." のように連続するとは限りません。_

[JavaとJavascript それぞれにおける配列の長さ - Qiita][1]
[1]:http://qiita.com/kyoshiro-obj/items/9e83dbb5e01801d53c3f

配列の初期値に

```js:配列arrayの初期値の書き方1

var array = ['Emma', 'Olivia', 'Emily',,,,, 'Charlotte'];

```

とした場合に、indexが連続してないとコメントを頂きましたが、これって次のように書き換えて考えると、length値が3だったのが、要素7に値を入れたことによって、length値が8になった。
よって、indexは連続している。っと解釈できないでしょうか？

Javascriptの文法で
「配列arrayの初期値の書き方1」 = 「配列arrayの初期値の書き方2」
となるかならないか教えて下さい。

```js:配列arrayの初期値の書き方2

var array=[];
array[0]="Emma";
array[1]="Olivia";
array[2]="Emily";

array[7]="Charlotte";

```


```js

var array = ['Emma', 'Olivia', 'Emily',,,,, 'Charlotte'];

for (var i = 0, l = array.length; i < l; ++i) {
  if (array.hasOwnProperty(i)) {
    console.log('array[' + i + '] = ' + array[i]);
    /* 下記を出力する
      array[0] = Emma
      array[1] = Olivia
      array[2] = Emily
      array[7] = Charlotte
    */
  }
}

console.log(array.length); // 8
console.log(Object.keys(array)); // ["0", "1", "2", "7"]

```


##



## 追記

自分の考えがまとまってませんでした。自分の考えをまとめました。
lengthプロパティと配列に存在するプロパティの数が一致しないときは、
__「Javascriptの配列は先頭の値から順に「0」、「1」・・・と連続した数値のプロパティ名を持つと言えない。」__
という指摘なんですね。

+ 配列はプロパティが存在するときのみ数値プロパティが存在すると考えるとき、
配列にプロパティが存在するとき数値のプロパティ名を持つ、対偶は、数値のプロパティ名を待たないときプロパティは存在しない。
lengthプロパティと配列に存在するプロパティの数が一致の場合を言っているので「Javascriptの配列は先頭の値から順に「0」、「1」・・・と連続した数値のプロパティ名を持つ。」で問題ない。

+ プロパティが存在しないときも数値プロパティが存在すると考えるとき(このときプロパティは未定義)
「Javascriptの配列は先頭の値から順に「0」、「1」・・・と連続した数値のプロパティ名を持つ。」で問題ない。



### 見かけ上は未定義

時間かけて考えるよりも、「存在しないプロパティ=見かけ上は未定義」っで
Javascriptの勉強を進めるほうがいいのかもしれない。

Javascriptの配列は先頭の値から順に「0」、「1」・・・と連続しプロパティ名を持つ。
lengthプロパティと配列に存在するプロパティの数が一致しないときは、存在しないプロパティ=未定義だから

```js

for (var i = 0; i < list.length; i+=1) {
  console.log("list[" + i + "]=" +  list[i]);
}

console.log("配列の長さ:" + list.length);

/*

実行結果
"list[0]=Emma"
"list[1]=Olivia"
"list[2]=Emily"
"list[3]=undefined"
"list[4]=undefined"
"list[5]=undefined"
"list[6]=undefined"
"list[7]=Charlotte"
"配列の長さ:8"
*/

```

####


##
vimで改行に置換する時

##メモ: 改行へ置換する
改行に置換する時コマンド
右側の`Ctrl+v return`を押すと、`^M`を生成できる。
検索の左は、`\n`と普通に入力すればいい。 
#
```vim.
:%s/\n\n/^M/
```
MD5によるデータの一致・不一致判定


## <i class="fa fa-leaf"></i> MD5とは？
> MD5（エムディーファイブ、Message Digest Algorithm 5）とは、与えられた入力に対して128ビットのハッシュ値を出力するハッシュ関数である。MD5のハッシュキーの長さは、2128（約 3.403×1038 ＝ 340澗（かん） ＝ 340京の1京倍）通りのハッシュ値をとり、IPv6のアドレス空間と同じである。
([Wikipedia](https://ja.wikipedia.org/wiki/MD5)より)

## <i class="fa fa-leaf"></i> 何に使うか？

次の用途によく利用される([Wikipedia](https://ja.wikipedia.org/wiki/MD5)より)。

>- MD5は、電子署名を必要とするアプリケーション向けに開発された。
- ファイルを転送する際にそのファイルが破損していないことを確認するためにも用いられる。
- またファイルが改竄されていないことを証明するためにも用いられる。

今回はあるデータが一致しているかどうかを判定するために利用する。

sqliteでは各データのカラムにunique制約をかけることで指定したカラムの値が重複するようなデータを保存しないことが可能である。
しかし、unique制約をかけられるカラムが存在しない場合の対策として利用。

次のの特徴から、データの一致性判定が容易にできると考えられるので使用。

- MD5のハッシュ値の空間が広い
- 文字列が同一であればハッシュ値が同じ




## <i class="fa fa-leaf"></i> プログラム例 (ruby)
```ruby
require 'digest/md5'

puts Digest::MD5.hexdigest('abc')
#=> 900150983cd24fb0d6963f7d28e17f72
puts Digest::MD5.hexdigest('tdrk')
#=> 2a3003a2073cde3ab79f53082b5ef204
```

この出力は毎回変わらないため、このハッシュ値を新たなカラムとして考え、このカラムにunique制約をかけることでデータの重複を防ぐ。






<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
IntelliJでのデバッグ実行時に'related gradle configuration was not found'エラー

次に同じエラーに遭遇するときには忘れていると思うのでメモ。

発生条件も絞り込んでいない。

#### 状況

- Dropwizard 0.9.0 が出ていたので手元のあるプロジェクトを実験台に
- 実験のタイミングで IDEIntelliJ IDEA 15 が出ていたので更新

#### エラーの内容

Dropwizard の新版を使用するように build.gradle を書き換えてデバッグ実行したところ次のようなエラーが発生し起動できず。

```
Error:Unable to make the module: XYZ, related gradle configuration was not found. Please, re-import the Gradle project and try again.
```

#### 対応

- View > Tool Windows > Gradle と選択して Gradle ツールを起動
- ツールウィンドウの左上にある Refresh ボタンをクリック
- リポジトリの同期が行われるようなのでしばらく待つ

![refresh-gradle.png](https://qiita-image-store.s3.amazonaws.com/0/67680/a7f7c914-f286-7917-e3fa-0b42a2556a3a.png)

ショートカットがあるような気がするが頻繁に行うことでもないので上記手順で妥協。
Compass(sass)のコンパイルが遅くて困る場合

#1 @importの仕方を変える
```sass
@import compass
```
として、全体を読み込むのではなく

```sass
@import compass/css3/inline-block
```
のように使うmixinに絞り込んで@importする

ちなみにsassy-buttonsなど、さらに外部のブラグインを読み込んだ場合は、
その_sassy-button.sassの中で

```sass
@import "compass/css3/border-radius"
@import "compass/css3/box-shadow"
@import "compass/css3/text-shadow"
@import "compass/css3/images"
@import "compass/css3/opacity"
```
このようにいっぱい読み込んでいるので、これはしょうがない。。

#2 小さいファイルに切り分ける
メインのスタイルファイルが
style.sassで、そこからstyle.cssを生成してるとしたら、
style.sassにサイト全体のスタイルを書き込んでいけば、
当然毎回それをコンパイルするわけなので、
どんどんコンパイル時間は長くなってしまう。
そこで、
全体のstyle.sassとは別に
新しいスタイルをテスト・構築・試行錯誤する用の
scratch.sass
を作り、そこで短いコードで試してみる。
そうすることで毎回ほとんど変わりのない全体スタイルシートをコンパイルすることからは
逃れられる。
満足するスタイルができたら、style.sassの方に移してコンパイルする。
[WIP]JMeterでちょっとした処理をする



JMeterのlibに入っているもの。

```
avalon-framework-4.1.4.jar
bsf-2.4.0.jar
bsh-2.0b5.jar
bshclient.jar
commons-codec-1.10.jar
commons-collections-3.2.1.jar
commons-httpclient-3.1.jar
commons-io-2.4.jar
commons-jexl-1.1.jar
commons-jexl-2.1.1.jar
commons-lang3-3.3.2.jar
commons-logging-1.2.jar
commons-math3-3.4.1.jar
commons-net-3.3.jar
commons-pool2-2.3.jar
dnsjava-2.1.7.jar
excalibur-datasource-2.1.jar
excalibur-instrument-1.0.jar
excalibur-logger-1.1.jar
excalibur-pool-api-2.1.jar
excalibur-pool-impl-2.1.jar
excalibur-pool-instrumented-2.1.jar
geronimo-jms_1.1_spec-1.1.1.jar
htmllexer-2.1.jar
htmlparser-2.1.jar
httpclient-4.2.6.jar
httpcore-4.2.5.jar
httpmime-4.2.6.jar
jcharts-0.7.5.jar
jdom-1.1.3.jar
jodd-core-3.6.4.jar
jodd-lagarto-3.6.4.jar
jodd-log-3.6.4.jar
jorphan.jar
jsoup-1.8.1.jar
jtidy-r938.jar
junit-4.12.jar
logkit-2.0.jar
mail-1.5.0-b01.jar
mongo-java-driver-2.11.3.jar
oro-2.0.8.jar
rhino-1.7R5.jar
rsyntaxtextarea-2.5.6.jar
serializer-2.7.2.jar
slf4j-api-1.7.10.jar
slf4j-nop-1.7.10.jar
soap-2.3.1.jar
tika-core-1.7.jar
tika-parsers-1.7.jar
xalan-2.7.2.jar
xercesImpl-2.11.0.jar
xml-apis-1.4.01.jar
xmlgraphics-commons-1.5.jar
xmlpull-1.1.3.1.jar
xpp3_min-1.1.4c.jar
xstream-1.4.8.jar
```
cron実行時のlocale

# はじめに
cron実行時に実行ユーザの環境変数は引き継がれない。
手動でうまくいくスクリプトがcronではうまく動作しない場合はシェル変数をチェックしてみる。
特にlocaleについては(個人的に)忘れがち。

- 対象環境: CentOS 6.7

# 手動とcronのlocaleの結果

```:手動でのlocaleコマンドの結果
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

```:cronでのlocaleコマンドの結果
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
```

影響としてぱっと思いつくところは、LC_TIMEに関係する`date`や`ls -l`の結果だろうか。
localeの違いによるコマンドの振る舞いを確認する場合は、コマンドの前にシェル変数の設定を記載することで確認できる。

```\n:実行例
$ ls -l aaa
-rw-rw-r-- 1 qiita qiita 0 11月  3 16:45 2015 aaa
$ LC_TIME="en_US.UTF-8" ls -l aaa
-rw-rw-r-- 1 qiita qiita 0 Nov  3 16:45 aaa
$
```

# 参考資料
[Man page of LOCALE: locale(1)](http://linuxjm.osdn.jp/html/LDP_man-pages/man1/locale.1.html)
FlashAirをWebサーバーとしてセットアップする

#参考ページ
FlashAirでできること
https://flashair-developers.com/ja/documents/overview/
ウェブブラウザ向けFlashAirアプリ開発の概要
https://flashair-developers.com/ja/documents/tutorials/web/1/

#最初のイメージング超重要
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/94562/1a3e290f-af44-20ea-a88f-15ede6ea2e6c.png)

#FlashAirを初期化してiPadで存在を確認する
FlashAirを買ってきたら、PCのSDカードスロットに突っ込む。
設定アプリをダウンロードして、「カードの初期化・設定変更」で初期化。
設定アプリの「ネットワーク設定」にてSSID「flashair0214」と変更。
http://www.toshiba-personalstorage.net/support/download/flashair/software/we/software02.htm
![1.png](https://qiita-image-store.s3.amazonaws.com/0/94562/cdb879f5-f764-9de8-8d4b-cbd10e8507e4.png)

いとも簡単にiPadから認識できました。
ちょっと拍子抜けだな。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/94562/601fb656-d05f-8343-dd1a-fc477bc259e9.png)


#ソース
```text
なし
```

#動作確認
iPadの設定でのWi-Fiを「flashair0214」で接続
![1.png](https://qiita-image-store.s3.amazonaws.com/0/94562/9ac774b1-5e01-bb93-9abf-730757e1d231.png)

iPadのブラウザでアドレスバーにて「 http://flashair0214 」と打ち込むとなかみが見える！
これがflashAirの「アクセスポイント(AP)モード」というそうだ。
SDカードは、離れたPCに突っ込まれているので「物理的に離れたフォルダを見た」ということになる。
（当然この状態だとiPadで一般のインターネットにはつながらないし、普段インターネットにつなぐWi-Fiに切り替えると「このウェブページにアクセスできません」になる）
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/94562/6171749b-5970-8df9-eba2-26d8207162bf.png)

#絵にするとこう
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/94562/b0fbe292-0755-f9ea-b610-ee6ea9c7f3b3.jpeg)



#つぎは？
Pythonでデータベースから値を取得する仕組みを作ろう
Mac に brew で Android SDK 導入

Homebrew で Android SDK をインストールできる。
zip を持ってくるやり方より楽で良い。

## 導入
```
$ brew install android-sdk
```

## 場所
いわゆる ANDROID_HOME を設定すべき場所は以下になる。

```
/usr/local/opt/android-sdk
```

※シンボリックリンク実体は /usr/local/Cellar/android-sdk/XX.XX.X

## 実行できるコマンド
主要なコマンドは /usr/local/bin にシンボリックリンクが張られるのでそのまま実行できる。

```
$ ls -ltr /usr/local/bin
…
…  aapt -> ../Cellar/android-sdk/24.4.1/bin/aapt
…  adb -> ../Cellar/android-sdk/24.4.1/bin/adb
…  aidl -> ../Cellar/android-sdk/24.4.1/bin/aidl
…  android -> ../Cellar/android-sdk/24.4.1/bin/android
…  ddms -> ../Cellar/android-sdk/24.4.1/bin/ddms
…  dexdump -> ../Cellar/android-sdk/24.4.1/bin/dexdump
…  dmtracedump -> ../Cellar/android-sdk/24.4.1/bin/dmtracedump
…  draw9patch -> ../Cellar/android-sdk/24.4.1/bin/draw9patch
…  dx -> ../Cellar/android-sdk/24.4.1/bin/dx
…  emulator -> ../Cellar/android-sdk/24.4.1/bin/emulator
…  emulator-arm -> ../Cellar/android-sdk/24.4.1/bin/emulator-arm
…  emulator-x86 -> ../Cellar/android-sdk/24.4.1/bin/emulator-x86
…  etc1tool -> ../Cellar/android-sdk/24.4.1/bin/etc1tool
…  fastboot -> ../Cellar/android-sdk/24.4.1/bin/fastboot
…  hierarchyviewer -> ../Cellar/android-sdk/24.4.1/bin/hierarchyviewer
…  hprof-conv -> ../Cellar/android-sdk/24.4.1/bin/hprof-conv
…  lint -> ../Cellar/android-sdk/24.4.1/bin/lint
…  llvm-rs-cc -> ../Cellar/android-sdk/24.4.1/bin/llvm-rs-cc
…  mksdcard -> ../Cellar/android-sdk/24.4.1/bin/mksdcard
…  monitor -> ../Cellar/android-sdk/24.4.1/bin/monitor
…  monkeyrunner -> ../Cellar/android-sdk/24.4.1/bin/monkeyrunner
…  traceview -> ../Cellar/android-sdk/24.4.1/bin/traceview
…  zipalign -> ../Cellar/android-sdk/24.4.1/bin/zipalign
```
Ruby on Rails keyword


[初心者のためのRuby＆Rails勉強フロー](https://qiita.com/AkiyoshiOkano/items/20e124adc9f04a8ef19a)

#勉強(Ruby編)
[プログラミング学習サービスprogateのRubyコース](https://prog-8.com/languages/ruby)

#勉強(Rails編)
- [Railsチュートリアルの歩き方 (第4版) ](https://speakerdeck.com/yasslab/railstutorial-ch00)
- [Ruby on Rails チュートリアル](http://railstutorial.jp/)
- [Ruby on Rails ガイド](https://railsguides.jp/)
- [クックパット　夏の技術職インターンシップ講義資料公開](http://techlife.cookpad.com/entry/2015/09/08/113442)

#インストール
http://qiita.com/hirokishirai/items/e38b29a7075459ff6032

- bundle
- rake
- heroku
- homebrew

#Tools
[CicleCI](https://circleci.com/)
##bundle-update cicle ci
- [Circle CI 2.0を使ってGemfileを新鮮に保つ](https://tech.recruit-mp.co.jp/server-side/fresh-gemfile-with-circle-ci/


#heroku

```lang:Gemfile
# Herokuの本番(production)環境ではPostgresqlを使用する
gem 'sqlite3', :group => [:development, :test]
gem 'pg', :group => [:production]

# コメントアウト
gem 'therubyracer', platforms: :ruby
```
```lang:database.yml
# Herokuに合わせて変更が必要
# 本番(production)環境のみ
production:
  adapter: postgresql
  encoding: utf8
  database: your_database
  port: 5432
  username: your_username
  password: your_password
```

```terminal
heroku run rake db:migrate --app [app_name]
heroku logs --app [app_name]
```
http://tech.gmo-media.jp/post/42344727734/starting-rails-on-heroku-01

# DB migrate
https://qiita.com/pugiemonn/items/e237b73025d8db8545bf

http://www.workabroad.jp/posts/1164

[Ruby on Rails 4 と Bootstrap で管理画面のレイアウトを作成する](https://www.imd-net.com/column/2760/)

#チュートリアル
[rails newしたときの開発を効率化するためにまず行いたい6つの設定まとめ](
http://ruby-rails.hatenadiary.com/entry/20150204/1423055537#first-settings-git)
[ruby-on-rails-tutorial](http://railstutorial.jp/book/ruby-on-rails-tutorial?version=4.2)

***error***
-
[eventmachine error](http://qiita.com/tkmiya34/items/7f4f071bda4ea81aaf62)
graphviz　　dot -Tgif sample1.dot -o sample1.gif
NAOqi OS 2.4.2アップデートでPEPPERの反応が悪くなったのはなぜ？

NAOqi OS 2.4.2にアップデートしたら　PEPPERの反応がすごく悪くなりました。
１）タブレットが起動しない。
２）話しかけても反応するけど　発声がない。
３）タッチセンサーに反応してもレスポンスがない。
など、トラブルシューティングにある内容では解決できない状況です。
うまくアップされなかったということだったのでしょうか？
fluent-plugin-bigquery の認証に JSON key を使う

## 結論

fluent-plugin-bigquery を GCE 以外で使う場合、認証情報が必要だが、

- p12キーファイルはディスコンなので、JSON key の利用を推奨する
- JSON key 形式なら、fluentd の設定ファイルに秘密鍵を埋め込めて便利

設定サンプル

```apache
<match dummy>
  type bigquery
  auth_method json_key
  json_key {
    "private_key": "-----BEGIN PRIVATE KEY-----\n...",
    "client_email": "xxx@developer.gserviceaccount.com"
  }
</match>
```

## 解説

先日、fluent-plugin-bigquery に以下の Pull Request を出してマージしてもらった。

[Support JSON key file and application default credentials authentication #50](https://github.com/kaizenplatform/fluent-plugin-bigquery/pull/50)

この変更は fluent-plugin-bigquery の v2.1.12 に含まれていて、既に使える状態。

### なぜ JSON key を利用することを推奨するのか

これは単純に Google が推奨しているから。現在、Developer Console で service account を作成すると以下の様な文言がでる。JSON が推奨、P12　形式は後方互換性のために残されていると。

<img width="461" alt="d292d7b0-76b9-11e5-9303-d64d91aa8538.png" src="https://qiita-image-store.s3.amazonaws.com/0/25774/31235334-d8c7-3347-2302-32b242106a03.png">

### JSON key にすると何が便利になるのか

P12 形式が非推奨とはいえ、しばらくは使える現状で、JSON key に切り替えるメリットはあるのかというと、あると思っている。

それは、JSON 形式にすると、秘密鍵の情報を fluentd の設定ファイル中に埋め込めるようになることである。

```apache
<match dummy>
  type bigquery
  auth_method json_key
  json_key {
    "private_key": "-----BEGIN PRIVATE KEY-----\n...",
    "client_email": "xxx@developer.gserviceaccount.com"
  }
</match>
```

この方式のメリットとしては、以下の2点があげられる。

- 秘密鍵ファイルの配置（どこのパスに配置するか、権限はどうするかなどに）悩まなくてすむ。
- 文字列として埋め込めるので、Ansible などの Provisioning ツールと相性が良い。以下のように変数にしておくことで、本番とステージングの切り替えが簡単にできたりする。実行時に変数の値を指定すれば、秘密鍵の内容をリポジトリにコミットしておく必要もなくなる。

```apache
<match dummy>
  type bigquery
  auth_method json_key
  json_key {
    "private_key": "{{ bq_private_key }}",
    "client_email": "{{ bq_client_email }}"
  }
</match>
```