OmniAICreator/Qiita-1.07M huggingface dataset:
raspbian jessieにpythonのTornado環境を整備する


## 環境
- Raspberry Pi type B rev.2
- OS：raspbian jessie

## Tornadoとその他のパッケージのインストール
MongoDBも使用したかったため、pymongo、motorも一緒にインストールする。

```bash
sudo apt-get install build-essential python-dev
sudo pip install tornado
sudo pip install pymongo
sudo pip install motor
```

## MongoDbのインストール
最新版のMongoDbをインストールするにはパッケージの更新などが必要となるが、今回はデフォルトで用意されたパッケージを利用することとした。

以前はパッケージからインストールすると非常に時間がかかっていたため、バイナリのものを利用したが、パッケージからインストールしても問題なかった。

インストールされたMongoDbのバージョンは2.4.10であった。

apt-getでインストールするとOS起動時に自動的にMongoDbが立ち上がるようになる。

```bash
sudo apt-get install mongodb
```

## [補足] プロキシ環境下でのpip
proxy環境ではプロキシオプションを付けるか、

```bash
sudo -E pip install パッケージ名
```
PythonでTwitter Streaming APIを叩いた話

python Advent Calendarのトップバッターということで、今更ではありますが、Twitter APIを叩いてみた話を書いてみます。これまでAPIを叩いたことがなかったので、今回はAPIを叩くという事自体の勉強も兼ねて、Twitter-pythonライブラリなども使わずにやってみようと思います。ネットで軽く調べて出てくるのは、Twitterライブラリを使ったものが多いので、少しは役に立つといいのですが。

# やってみること
REST APIより、Streaming APIの叩き方がよくわからなかったので、今回はStreaming APIを叩いて、tweetの内容を表示するところまでやってみようと思います。

# 必要なもの
## importするもの
とはいうものの、OAuth等のコードをすべて書くのは辛いので、そのあたりはライブラリに任せることにします。

- requests
- OAuth1 from requests_oauthlib

このあたりをimportしておきます。

## 取得しておかなければいけないもの
- API key
- API Secret
- Access Token
- Access Secret

このあたりの取得方法は調べるとすぐに出てくるので割愛しますが、API-は開発者またはアプリケーションに固有のもの、Access-はユーザアカウント固有のものっぽいです。

## APIのURL
練習ということで、今回はpublic stream(Twitter全体のstream)を取得してみます。
https://stream.twitter.com/1.1/statuses/filter.json

APIの公式説明は
https://dev.twitter.com/streaming/reference/post/statuses/filter
を参照してください。

これで必要なものがそろいました。

# 実際に書いてみる
ここまでの材料で実際に書いてみます。なお、import文についての説明は省略します。

## 定数定義
``` python3
api_key = "YOUR API KEY"
api_secret = "YOUR API SECRET"
access_token = "YOUR ACCESS TOKEN"
access_secret = "YOUR ACCESS SECRET"

url = "https://stream.twitter.com/1.1/statuses/filter.json"
```

今回はこのように定数に名前をつけておきます。

## OAuth情報
OAuthで認証を行うのに、OAuth1を使います。

``` python3
auth = OAuth1(api_key, api_secret, access_token, access_secret)
```
こうすると、authにはOAuth1のオブジェクトが得られます。これを使って、POSTで認証・データの取得を行います。

## HTTP POST
``` python3
r = requests.post(url, auth=auth, stream=True, data={"track":"twitter"})
```
これでHTTP POSTによってアクセスを行います。

### stream
``` python3
stream=True
```
を指定することで、生のソケットレスポンスにアクセスできるようになり、streamデータが得られます。

### data
dataには辞書を渡します。
https://dev.twitter.com/streaming/reference/post/statuses/filter
のParametersに書いてある項目が使用できる値です。
簡単に説明しましょう。

#### folllow
カンマ区切りでユーザーIDを指定できます。この項目で指定されたユーザーのtweetを返します。

#### track
カンマ区切りでキーワードを指定できます。この項目で指定されたキーワードを含むtweetを返します。

#### locations
位置情報をカンマ区切りで指定します。
例えば-122.75,36.8,-121.75,37.8と指定すると、サンフランシスコからのtweetを返します。

follow, track, locationsのいずれか一つが必須です。

その他にもオプションがありますので、確認してみてください。

ここまでで得られたrには、リクエストへのレスポンスが入っています。これにはiter_lines()というメソッドがあり、これを呼び出すことでそれぞれのtweetを個別に得ることができます。

# Sample Code
``` python3
import requests
from requests_oauthlib import OAuth1

api_key = "YOUR API KEY"
api_secret = "YOUR API SECRET"
access_key = "YOUR ACCESS SECRET"
access_secret = "YOUR ACCESS SECRET"

url = "https://stream.twitter.com/1.1/statuses/filter.json"

auth = OAuth1(api_key, api_secret, access_token, access_secret)

r = requests.post(url, auth=auth, stream=True, data={"follow":"nasa9084","track":"emacs"})

for line in r.iter_lines():
  print(line["text"])
```

# まとめ
なんだかよくわからないながらも、Streaming APIを叩いてデータを取得することが出来ました。
間違いなどがあれば指摘していただけるとありがたいです。
WordPressをgitのSubmoduleで管理する


## wpディレクトリに、Wordpressをインストールしたい場合

```
git submodule add git://github.com/WordPress/WordPress.git wp
```

参考: https://davidwinter.me/install-and-manage-wordpress-with-git/


## git clone したディレクトリでSubmoduleをcloneしたい場合

```
git submodule update --init --recursive
```

参考: http://stackoverflow.com/questions/3796927/how-to-git-clone-including-submodules

## Wordpressの更新

```
cd wp
git pull --tags
git checkout 4.3.1 (←バージョンのtagを指定)
```
ShinobiLayer: 仮想サーバーの共有型と専有型を識別する方法

#はじめに
SoftLayerには

- 物理サーバー
- 仮想サーバー（専有型：シングルテナントタイプ）
- 仮想サーバー（共有型：マルチテナントタイプ）

の3種類があります。ただし、仮想サーバー（専有型）と仮想サーバー（共有型）は、**Device List**や**Device Details**を見ても一見区別できません。どうやったら判別できるのか？っていうのがこの記事の目的です。

#方法1: Modify Device Configurationから確認する方法
1. Devices -> （該当のサーバーを選択）して、下記のDevice Detilsの画面から、**Modify Device Configuration**を選択する。
![device_config01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/20eac0af-1063-dbd1-fb72-494658afecf7.jpeg)
2. System Configurationを確認して、**Currently Installed**の行をチェック。<br>
<共用型の仮想サーバー: **n x 2.0 GHz Cores**になっている> <br>
![device_config03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6e241ab8-27cd-51b5-ba8c-1c757ca505f0.jpeg)<br>
<専有型の仮想サーバー: **Private n x 2.0 GHz Cores**になっている> <br>
![device_config02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/25fbdb03-709c-9104-25b4-d31152f41070.jpeg)<br>

#方法2: InvoiceのComputing Instance欄を確認する方法
1. Account -> Billing -> Invoicesから該当のInvoiceを選択する。
2. 該当の仮想サーバーのCPU行をチェック。<br>
<共用型の仮想サーバー: **n x 2.0 GHz Cores**になっている> <br>
![invoice_public.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/ff4c4a55-3918-5f1c-e377-cbc607524357.jpeg)<br>
<専有型の仮想サーバー: **Private n x 2.0 GHz Cores**になっている> <br>
![invoice_private.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/d69a6798-6a00-8212-6bb5-8c3509c90aad.jpeg)<br>
MySQL クライアント毎の接続数を取得する

## SQL
MySQLでHOST毎に接続数をGROUP BYしてどれだけ繋がれているか確認したいときのSQL。

```sql
SELECT HOST,COUNT(*)
FROM information_schema.PROCESSLIST
GROUP BY SUBSTRING(HOST,1,INSTR(HOST,':') -1)
```

## 出力結果
こんな感じになります。

```
+---------------------+----------+
| HOST                | COUNT(*) |
+---------------------+----------+
| localhost           |        2 |
| xx.xxx.xx.xxx:xxxxx |        3 |
| xx.xxx.xx.xxx:xxxxx |       12 |
| xx.xxx.xx.xxx:xxxxx |        1 |
| xx.xxx.xx.xxx:xxxxx |        8 |
| xx.xxx.xx.xxx:xxxxx |        3 |
| xx.xxx.xx.xxx:xxxxx |        1 |
+---------------------+----------+
```

幸せ。
Androidコマンドラインビルドまとめ

# はじめに

GITにプッシュしたら自動でビルドしたいよねってことでまずはシェル化しました


# 環境

**OS:**
CentOS 7.1
**PP:**
- jdk1.8.0_45
- AndroidSDK
※下記はx86系のものもいれた
- libstdc++.i686
- libstdc++-devel.i686
- zlib.i686
- zlib-devel.i686

# AndroidSDKの準備
## パス設定
`export ANDROID_HOME=/usr/local/android-sdk`

## 更新
`${ANDROID_HOME}/tools/android update sdk --no-ui`
>*※ただしbuild-toolsは最新が入るので指定したい場合は下記のようにフィルターを追加*
`${ANDROID_HOME}/tools/android update sdk --no-ui --all --filter build-tools-22.0.1`

# githubからのエクスポート
  githubの画面上にある"Download ZIP"のURLをcurlコマンドを利用してダウンロード
`curl -s -f -L -u '{アカウント}/token:{アクセストークン}' {ダウンロードURL} -o {出力ファイル名}`
*※アクセストークンは「 https://github.com/settings/tokens 」で生成*
 
# ビルド
  AndroidStudioで作成したプロジェクトルートにgradlewが存在するのでこれを利用

**デバッグビルド**
`gradlew assembleDebug`
**リリースビルド**
`gradlew assembleRelease`
**両方**
`gradlew assemble`

# 署名
`jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore {キーファイル} -keypass {キーパスワード} -storepass {ストアパスワード} {APK保存先} {キーエイリアス}`

# zipalign
`zipalign -v 4 {署名前のAPKパス} {署名後のAPK保存先}`


# tips
## windowsサーバへのマウント

cat /etc/fstab
`//{Windowsパス} /{マウントパス} cifs user={ログインユーザ},password={パスワード},defaults 0 0`

## ソース内のテキストの置換
```bash:replace.sh
# 置換対象のパラメータ
RPARAM[0]='{ファイルパス}|s#{置換前のテキスト}#{置換後のテキスト}#g'
RPARAM[1]='{ファイルパス}|s#{置換前のテキスト}#{置換後のテキスト}#g'
RPARAM[2]='{ファイルパス}|s#{置換前のテキスト}#{置換後のテキスト}#g'

# パラメータを展開
for (( I = 0; I < ${#RPARAM[@]}; ++I ))
do
  # パイプ区切りのパラメータを分解
  file=`echo ${RPARAM[$I]} | cut -d\| -f1`
  regexp=`echo ${RPARAM[$I]} | cut -d\| -f2`
  # sedで置換
  sed -i -e ${regexp} ${_PJT_DIR}/${file}
done
```

***

# まとめ
**上記を順番してシェルに落とし込んでます**
1.★GITHUBからのエクスポート
2.ZIP解凍
　（ソース置換）
3.★コンパイル
4.APKを共有サーバにコピー
5.APK以外の一時ファイル削除
Web Clip Icons サイズまとめ


# Web Clip Icons とは

- [Web Clip Icons](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/WebClipIcons.html)

# サイズまとめ

|  | iPhone | iPhone retina | @3x | iPad | iPad retina |
| :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | 
| iOS 6.x と以前 | 57*57 | 114*114 | N/A † | 72*72 | 144*144 |
| iOS 7.x と以降 | 60*60 | 120*120 | 180*180 | 76*76 | 152*152 |

*(単位：pixels)*
†: @3x is for iPhone 6 Plus (and its ongoing models), which is started from iOS 8, no need to prepare the icon for iOS 6 and before.

# ファイルネーム

```
apple-touch-icon-[長]x[寬].png
```

例：

```
apple-touch-icon-57x57.png
```

# 使い方

`<head></head>` のの中に使ってください：

``` html
<html>
  <head>
    ... 略 ...
    <!-- iOS Webapp -->
    <!-- iPhone - iOS 6 -->
    <link rel="apple-touch-icon" sizes="57x57" href="/path/to/apple-touch-icon-57x57.png">
    <!-- iPhone - iOS 7 -->
    <link rel="apple-touch-icon" sizes="60x60" href="/path/to/apple-touch-icon-60x60.png">
    <!-- iPhone (Retina) - iOS 6 -->
    <link rel="apple-touch-icon" sizes="114x114" href="/path/to/apple-touch-icon-114x114.png">
    <!-- iPhone (Retina) - iOS 7 -->
    <link rel="apple-touch-icon" sizes="120x120" href="/path/to/apple-touch-icon-120x120.png">
    <!-- iPhone @3x -->
    <link rel="apple-touch-icon" sizes="180x180" href="/path/to/apple-touch-icon-180x180.png">
    <!-- iPad - iOS 6 -->
    <link rel="apple-touch-icon" sizes="72x72" href="/path/to/apple-touch-icon-72x72.png">
    <!-- iPad - iOS 7 -->
    <link rel="apple-touch-icon" sizes="76x76" href="/path/to/apple-touch-icon-76x76.png">
    <!-- iPad (Retina) - iOS 6 -->
    <link rel="apple-touch-icon" sizes="144x144" href="/path/to/apple-touch-icon-144x144.png">
    <!-- iPad (Retina) - iOS 7 -->
    <link rel="apple-touch-icon" sizes="152x152" href="/path/to/apple-touch-icon-152x152.png">
  </head>
  <body>
    ... 略 ...
  </body>
</html>

```

# 面倒くさいなら ...

じゃ、 最大サイズの 180x180 だけ使ってもオッケ
なぜ円周率定数は3.14159 26535 89793**1**なのか

#精度について　円周率を例題に
馴染みの円周率についての話。
先頭の何桁かを諳んじられる人も多いかと思われる。
π = 3.14159 26535 89793 **2**3846・・・

だが多くの処理系で小数点以下16桁目が"2"ではなく"1"になってる。
3.14159 26535 89793 **1**・・・

#IEEE754 倍精度(52bit+1bit)
結論を書くと、2進小数で近似しているためである。
IEEE754 倍精度では53bit(=52bit仮数部 + 先頭1bit)で表現するため、一番近い近似値がこの数値となる。

#Ｒで確認してみる
多倍長精度計算パッケージ Rmpfr を使用して確認してみる。

100bitで表現した場合の円周率は以下となる。
> Const("pi", 100)
1 'mpfr' number of precision  100   bits 
[1] 3.1415926535897932384626433832793
> 
3.14159 26535 89793 **2**となっている。

53bitで表現した場合の円周率は以下となる。
> Const("pi", 53)
1 'mpfr' number of precision  53   bits 
[1] 3.1415926535897931
3.14159 26535 89793 **1**となっている。

3.14159 26535 89793 **2**となるためには、精度としてあと2bit必要で、55bitあればよい。

> Const("pi", 55)
1 'mpfr' number of precision  55   bits 
[1] 3.14159265358979323

#おまけ　円周率定数の2進数表現
1 1.001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000 (0100)
IEEE754では 先頭の1は暗黙とするので2つ目の１から16進で表現すると
09 21 FB 54 44 2D 18 (4)
となる。
()内はIEEE754の52bit範囲外だが、あと2bitあれば、精度が上がることが分かると思う。
gitのブランチ運用について備忘録

個人的備忘録です。
githubでなくgitlabつかってるのでプルリクじゃなくてマージリクエストになってます。


#### 前提知識など

ワークツリー、インデックス、HEADを使いこなす
http://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe

#### 今いるbranchを確認する

アスタリスクが頭に付いてるやつが現在のブランチです

```
$ git branch
```

remoteブランチもみたい場合-aをつける

```
$ git branch -a
```

#### 今いるbranchを最新にする

```
$ git branch
$ git pull
```

#### branchを移動する

```
$ git checkout <branch-name>
```

#### branchを作る

```
$ git checkout -b <branch-name>
```

#### pushの挙動を制御する

```
git config --global push.default current
git push
```

pushしたことないブランチでもオプションつけなくてよくなるので便利。
http://dqn.sakusakutto.jp/2012/10/git_push.html

#### branchのMergeRequestを作る

gitlabのブラウザの上のほうのメニューからどうぞ。
push直後なら全体のコミット履歴にマージリクエスト作るリンクが貼られてたりすることも。
作ったら確認してもらうために適宜お伝えする等しましょう。

#### AcceptMergeボタンが出ない場合にconfrictしそうかどうか前もって調べる

http://qiita.com/horimislime/items/84fa431460c8d39f37e6

普通にマージしたいブランチに移動してmasterからマージするとコンフリクトしてたらそのファイルのメッセージが出るので
そのファイル開いて修正すればOKなようです。前もって知りたければ。
http://blog.inouetakuya.info/entry/20130602/1370173582

```
git checkout <マージしたいブランチ>
git merge master
```

#### 特定のコミットだけマージしたい時

マージしたい対象のコミットidを調べてマージしたいブランチに移動して以下のコマンドを打つとマージされます。

```
git cherry-pick <commit-id>
```

http://rfs.jp/server/git/git-cherry-pick.html
コミットが1つだけのブランチを他のブランチにまとめたい時やmasterの更新を部分的に取り込みたい時などに。

#### mergeしてみたけどやっぱ元の状態に戻したいとき（ローカル上でリモートにpushする前の話）

マージしてみたけど、修正中のブランチで消したファイルがmasterで更新されてたときは戻してmaster側も消しとけばマージできそうとか色々ごっちゃりしてきて一度元に戻りたいときなどに。

```
git reset --hard HEAD
```

http://www.thekyo.jp/manual/git/ch03s09.html


#### merge済みのローカルbranchを削除する

http://dqn.sakusakutto.jp/2013/04/git_delete_merged_branch.html

```
$ git checkout master
$ git branch --merged | grep -v '^*'
$ git branch --merged | grep -v '^*' | xargs git branch -d
```

#### mergeしてないけどやっぱ要らなかったpush済みbranchをリモートブランチも削除する

```
$ git checkout master
$ git branch -D <branch-name>
$ git push origin :<branch-name>
```

[今さら聞けないgit pushコマンド](http://shoma2da.hatenablog.com/entry/2014/03/08/234523)によると、`git push {ローカルのbranch}:{リモートのbranch}`　と指定しているので、ローカルbranchを省略するというのは、nullをリモートにpushしてリモートが消されるという意味になる模様。

#### ブランチ名について

目的に沿った分かりやすい名前がよさそうです。


#### 接続先の確認方法

```
$ git remote -v
origin  git@gitlab.hoge.net:infra/test.git (fetch)
origin  git@gitlab.hoge.net:infra/test.git (push)
```

#### 接続先remoteが複数あるとき

ちょっとややこしいですが。

git remote リポジトリを複数登録する
http://bayashi.net/diary/2012/0714

#### stashで一時保存

一時保存したいときに。
http://qiita.com/fukajun/items/41288806e4733cb9c342

#### tagをつける運用

http://qiita.com/ritukiii/items/79a46103bdf24229a1ef

一時ちょっとやってたけど最近あんまりしてない。
バージョンタグをつける。タグはポインタであって見るだけ。ブランチ切らないと編集できないです。
tagつけてもpushは明示的にしないといけない。


以上。
Android Studioでプラグインをエクスポートする方法

忘れそうなので、備忘録として投稿

#プラグインモジュールの作成
####1.プラグイン作成用プロジェクトの作成
プラグイン作成用のプロジェクトを「ファイル」→「New」→「New Project」で作成します。すでにある場合はスキップしてください。
※既存のプロジェクトでも作成可能ですが、ファイルの整理がしやすいためプラグイン用のプロジェクトを作成しています。

####2.新規モジュールを作成
プラグイン自身となるモジュールを作成します。
このモジュールに含むクラス等がプラグインとして使用できます。
「ファイル」→「New]→「New Module」で作成してください。

#build.gradleの編集
作成したモジュールの「build.gradle」を開いて以下のソースを追加してください。

```xml:build.gradle
task clearJar(type: Delete) {
    delete 'build/libs/{任意の名前}.jar'
}
task makeJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    rename('classes.jar', '{任意の名前}.jar')
}
makeJar.dependsOn(clearJar, build)
```
####！注意！
**｛任意の名前｝**は２か所とも同じ名前を設定してください。

#プラグインの出力
####コマンド入力で行う方法
１．コマンドにてモジュールのあるプロジェクトにディレクトリを合わせてください。
　↓
２．以下のコマンドを入力、実行してください。

```xml:コマンド
gradlew {任意の名前}:clean {任意の名前}:assembleDebug {任意の名前}:makejar
```
※**{任意の名前}**にはbuild.gradleで設定したものと同じにしてください。<br/>
####Gradle projectsで行う方法
Gradle projectsはAndroid Studioのタブから表示できます。
対象のクラスのタスクを表示し、[other]内を見ると[makejar]が作られてると思われます。
それをクリックすると、プラグイン出力が行われます。

#ファイルの確認
出力が完了したら、プロジェクト内に「release」フォルダが生成され、その中にjarファイル（プラグイン）が生成されています。

あとは、各プロジェクトにインポートし使用するのみです。
<br />
以上
AWS Lambdaでさくらのクラウドのバックアップを毎日取得する


さくらのクラウドもAPIを公開しているので諸々の作業をプログラマブルに制御できます。
オペミスでサーバが大変なことになった時のためにディスクのアーカイブ化（バックアップ）するためのプログラムを書いたとしても、実行するための環境をクラウドの上に構築するのもいいのですが、その環境を維持運営するのはちょっと面倒。
最近流行りのサーバレスの環境で完結させるためにAWS Lambdaを使ってみました。
![02[2].PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/4d7a461b-0dd3-9d38-ff39-1bb97785319f.png)

Lambdaは最近Pythonに対応という話が出ていたことと、curlの呼び出しに対応しているという噂を掴んたので簡単に試すには便利かなと。
ちょうど、さくらのクラウドのAPIのサンプルはcurlでサンプルコードが公開されているので、今回はコピペでやってみました;-p


サンプルコードはこちら。
https://gist.github.com/dalice/40544c999788832531c2

```lang:sacloud_backup.py
import commands
import datetime
 
def _(cmd):
    return commands.getoutput(cmd) 
 
def lambda_handler(event, context):
    access_token = "access_token"
    access_token_secret = "access_token_secret"
    zone ="tk1v" #is1a:石狩第1ゾーン,is1b:石狩第2ゾーン,tk1a:東京第1ゾーン,tk1v:サンドボックス
    disk_id = "DISK ID"
    days = datetime.datetime.today().strftime("%Y-%m-%d")
    
    cmds ='''curl --user "%s":"%s" -X POST  -d '{"Archive":{"Name":"%s","SourceDisk":{"ID":"%s"}}}'  https://secure.sakura.ad.jp/cloud/zone/%s/api/cloud/1.1/archive'''
    
    print _(cmds % (access_token,access_token_secret,'DiskbackUP_' + days,disk_id,zone))
```
こちらをAWS LambdaにPythonランタイムで登録。
コードの一部を編集する必要があるので諸々準備。


![03[2].PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/a2e7fe85-1bbe-3072-d7ea-9a1ac49b49db.png)



まずコード中に書かれている「access_token」 と「access_token_secret」 をクラウドのコントロールパネルのAPIキーから発行します。


![04[3].PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/4d2bdb35-8e26-c92d-cc6b-9882a3ce22ad.png)


次にバックアップしたいディスクのリソースIDとディスクのあるゾーン情報を確認します。
今回はSandboxなので「zone」のところに”tk1v”と入れています。それ以外のゾーンの場合にはコメントにも書いているゾーンを記載します。

「disk_id」の部分にはディスクのリソースIDを記載します。
バックアップしたいディスクとゾーンの情報は揃えるようにしてください。


![01[1].PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/ad5bb7e6-8f21-fb45-6688-ce5de89c1819.png)

いつの間にかLambdaがスケジュール実行に対応していたので、Schedule expressionに「1 day」を指定。これでうまく動くと一番上の画像のように毎日どっかのタイミングで指定したディスクを対象としたアーカイブ処理が動きます。
cron記法でも実行時間の記述ができるようなので厳密に処理開始を指定することも可能です。

ね、簡単でしょ。
今回はPythonからOS上のcurlコマンドを呼び出すという邪道なことしましたが、実際にはピュアPythonで記述すればもっとゴニョゴニョできると思います。
サーバにつながっているディスクの一覧を抜き出して一気にアーカイブ作成を行うとか結構実用的な気がします。
sshの設定をconfigに書いたらssh接続がラクになる

##ssh接続のショートカット
```
ssh -i .ssh/aws.pem -p 22 ec2user@11.111.111.1
```

ssh接続するときにこんな感じで書くのめんどくさくないですか？
解決策として.ssh/configに設定を書けばラクになります。

```
vim .ssh/config
```

configに以下を記入

```
Host pro_aws
  Hostname 11.111.111.1 //ipアドレス
  Port 22 //port番号
  User ec2-user //ユーザー名
  IdentityFile .ssh/aws.pem
```

```
ssh pro_aws
```
これでサーバーに入ることができる。

##おまけ(ssh 接続をタイムアウトの設定)
SSH(SSHのクライアント)の設定を変更する

```
vim .ssh/config
```


configに以下を記入

```
ServerAliveInterval 60
ServerAliveCountMax 3
```


 ServerAliveInterval 60 に設定すると 60秒毎にサーバーにメッセージを
 送り、ServerAliveCountMax のデフォルト回数である 3回まで繰り返す。
 つまり、サーバーが応答しなくなった後 180秒後に接続を切断する。
R Markdownで使えるMarkdown記法

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

## R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## 注意事項
この記事ではRStudioでの利用を前提にしています。[^1]

[^1]: rmarkdown::render()で実行すればそこまで気にしなくてもいい気もしますが、一応前提にします。

## Markdownの基本
まずMarkdownにそこまで慣れていない方は、RStudioのクイックリファレンスを見ながら作成することをおすめします。RStudioで[Help] - [Markdown Quike Reference]をクリックすると、Helpビューワーにでてきます。

### 他のHTML要素
基本のMarkdownには私がよく使う定義リスト(`<dl>`)などはありません。これらは**htmlタグ直打ち**でいけます。Markdownはhtmlタグをそのまま出力します。なのでhtmlタグ直打ちしてもそのまま送り出します。これはRMarkdownでも同様です。

ただし、**html直打ち要素とMarkdown記法の要素が混ざるとうまくいかなくなる場合があります**。以下のようなコードがあるとします。

```
<ul>
- list1
<li>list2</li>
</ul>
```

この場合、大抵うまく表示されません:

<ul>
- list1
<li>list2</li>
</ul>

Markdown記法で表現できるのであればMarkdown記法で記述し、必要性がでたらhtmlタグ直打ちにするといいかと。

## R Markdownで使えるMarkdown記法
本題です。

### 正体はpandoc
R Markdownによるドキュメント生成は、超ざっくり言うと以下の流れになります: [^2]

[^2]: あくまで大枠の流れを示すためにこのような書き方をしています。中ではknitrを呼び出したりyamlを処理したりと色々してますが本筋とずれるので割愛します。

1. Rmdファイルに対して`rmarkdown::render()`を実行
2. これによりRチャンク部分を評価
3. 評価した内容を取り込んでmdファイルを生成
4. mdファイルをpandocが処理し、ドキュメントを生成

はい、そうです。**Markdown部分を評価しているのはpandoc**です。ちなみにRStudioを利用しているなら、RStudio内に組み込まれているpandocに処理が回されます。[^3] 要するに**R Markdownで使えるMarkdown記法はpandocによる拡張Markdown**となります。これさえ知っておけば、いざという時はpandocを頼りに調べることができます。

[^3]: 明示的に別(ローカル等)のpandocを指定して回すことも可能です。

というわけで、rmarkdownの公式サイトにあるPandoc Markdownのドキュメント[^4]がこちらです:

- [Pandoc Markdown](http://rmarkdown.rstudio.com/authoring_pandoc_markdown.html)

「なんかこんなことできないかなぁ」と思った時は、こちらを確認するといいでしょう。

[^4]: このリンク先にはRMarkdownで使えるPandoc Markdown記法がフルで説明されているそうです。

### 実際に使ってみるには?
連載のどこかで多分書きます。

Enjoy!
リンクをクリックでメーラーを起動

htmlのリンクをクリックしたら
メーラーを起動させる方法。

基本は下です。

```php:mailLink2.php
<?php
echo '<a href="mailto:hogehoge@gmail.com">MAIL</a>';
?>
```


変数から本文の部分を作るなど、
応用させると以下のようになります。

1回分の" "の中しか見てくれないので
変数のたびに ” を入れてると全然、変数を取ってくれないので注意です。
ここで、地味にはまりました・・・。
なので、変数のたびに区切るときは ' だけです！！

```php:mailLink2.php

<?php
$adress = hogehoge@gmail.com;
$bodyBox = $hoge;

echo '<a href="mailto:'.$adress.'?subject=このまま送信してください&body='.$bodyBox.'">MAIL</a>';
?>

```
SQL | GROUP BY と WHERE の順番

WHERE を先に書くこと。

↓動く。

```sql
SELECT id
 FROM user
 WHERE name = 'John'
 GROUP BY id
```

↓動かない。

```sql
SELECT id
 FROM user
 GROUP BY id
 WHERE name = 'John'
```




<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Nutanix Community Editionの歩きかた 〜必読資料まとめ〜

# はじめに
この記事は、[Nutanix Advent Calendar 2015](http://www.adventar.org/calendars/1124) 12月1日の分として作成しました。
Nutanix Community Edition(以下CE)を試してみる際に有益な情報をまとめました。

# 英語の情報源
| サイト | 説明 |
|-------------|-------------|
|[Nutanix>NEXT](http://next.nutanix.com/)| Nutanix Next Communityのポータル（※CEのアクティベート時に当ポータルのアカウントが必要）|
|[Getting Started](http://download.nutanix.com/guides/additional_releases/communityedition/index_frames.html)|CEのインストールガイド。（※後述の日本語ブログのほうが分かりやすいかもしれません）| 
|[Nutanix Documents](https://portal.nutanix.com/#/page/docs) (要ログイン)|製品版のマニュアル。CEは機能的には製品版のAcropolis Hypervisor環境とほぼ同一なので参考になります。|

### Community Edition フォーラムのスレッド（要ログイン）
| スレッド | 説明 |
|-------------|-------------|
|[Download Software](http://next.nutanix.com/t5/Discussion-Forum/Download-Software/m-p/3188#U3188)|Community Editionのダウンロード、最新バージョンはce-2015.11.05-stable。|
|[Post your hardware](http://next.nutanix.com/t5/Discussion-Forum/Post-your-hardware-config/td-p/3249)|ハードウェア動作実績|
|[Is Nehalem Intel Family supported on latest CE?](http://next.nutanix.com/t5/Discussion-Forum/Is-Nehalem-Intel-Family-supported-on-latest-CE/m-p/5959)|Nehalem以前のCPUをce-2015.11.05-stableで使用するとCVMが起動しない事象への対応方法|

# 日本語の情報源
| サイト | 説明 |
|-------------|-------------|
|[Nutanix概要紹介](http://www.slideshare.net/smzksts/nutanix-55678666)|Nutanixの概要を紹介したSlideShare資料。Nutanixって何？を知りたい方はこちらから。|
|[Nutanix Community Meetup ポータル](http://connpass.nutanix.com)| 勉強会の開催情報、資料掲載など|
|[ブログコンテスト エントリ一覧](http://nutanix.connpass.com/event/15452/presentation/)| 2015年7月に開催したブログコンテストのエントリ一覧|
|[@hanakara_milkさんのQiitaエントリ](http://qiita.com/hanakara_milk)|Nutanixブログコンテスト優勝者、[@hanakara_milk](https://twitter.com/hanakara_milk)さんのQiitaエントリ一覧|
|[NTNX＞日記](http://blog.ntnx.jp/)|[@gowatana](https://twitter.com/gowatana/)さんのNutanixブログ|
|Nutanix SEのTwitterアカウント|[@shmza](https://twitter.com/shmza), [@smzksts](https://twitter.com/smzksts)
python > datetime > yyyy/mm/dd,hh:nn:ss 形式のprint > today = datetime.datetime.today() / print today.strftime("%Y/%m/%d,%H:%M:%S")

現在時刻は yyyy/mm/dd,hh:nn:ss形式でprintしたい。

参考 http://docs.python.jp/2/library/datetime.html

http://ideone.com/bs3buK

```test.py
import datetime

today = datetime.datetime.today()
yymmddhhnnss = today.strftime("%Y/%m/%d,%H:%M:%S")
print yymmddhhnnss
```

```txt:結果
2015/12/01,03:44:30
```

ideoneで実行したのでUTCになっているようだ。
Redshift にたまに投げる調査クエリのメモ

自分用メモ。

# ある時間以降に実行されたクエリの概要をさくっと把握したい

Redshift がなんかむっちゃ重くなってる… みたいなときに投げる想定。
なお、いずれの日時指定も **UTC 時間で指定する必要があることに注意**。

## SELECT や INSERT を対象とする場合

```sql
SELECT
  query AS query_id,
  xid,
  LEFT(querytxt, 50) AS query,
  starttime,
  endtime,
  (endtime - starttime) / 1000000.0 AS second
FROM
  stl_query
WHERE
  starttime >= CAST('2015-12-25 01:00' AS TIMESTAMP)
  AND database = 'hogehoge'  -- データベースを絞り込む場合
ORDER BY
  starttime;
```


## DDL 系のクエリを対象とする場合

`CREATE TABLE` や `ALTER TABLE` のログは `stl_query` ではなく `stl_ddltext` テーブルに記録されている。

```sql
SELECT
  xid,
  LEFT(text, 50) AS query,
  starttime,
  endtime,
  (endtime - starttime) / 1000000.0 AS second
FROM
  stl_ddltext
WHERE
  starttime >= CAST('2015-12-25 01:00' AS TIMESTAMP)
  AND sequence = 0
ORDER BY
  starttime;
```


## その他クエリも確認したい場合

GRANT などは、 `stl_utilitytext` テーブルを参照する必要がある。

```sql
SELECT
  xid,
  LEFT(text, 50) AS query,
  starttime,
  endtime,
  (endtime - starttime) / 1000000.0 AS second
FROM
  stl_utilitytext
WHERE
  starttime >= CAST('2015-12-25 01:00' AS TIMESTAMP)
  AND sequence = 0
ORDER BY
  starttime;
```


# 文字列的に長すぎて Management console 上だと見切れるクエリの全容を把握したい

## クエリが 4,000 文字以下の場合

[stl_query](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_STL_QUERY.html) システムテーブルを覗けば OK。

```sql
SELECT
  querytxt
FROM
  stl_query
WHERE
  query = 123456789  -- クエリ ID
```

## クエリが 4,000 文字を超える場合

stl_query システムテーブルは最大 4,000 文字までしかクエリを表現できないので、長大なクエリを投げた場合は [stl_querytext](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_STL_QUERYTEXT.html) を参照するしかない。ただ、わりとクエリが重めっぽいので負荷状況に注意して投げたい。

```sql
SELECT
  text
FROM
  stl_querytext
WHERE
  query = 123456789  -- クエリ ID
ORDER BY
  sequence
```

なお、こちらのクエリで得られる結果には改行コードがバックスラッシュエスケースされた状態で含まれることに注意したい。
EPUBを読むには

この記事は[ePub Advent Calendar 2015](http://qiita.com/advent-calendar/2015/epub)の1日目です。

#はじめに
EPUBは電子書籍のファイルフォーマット規格なのでまずは書籍を読んでみる。

##Kindle for XX
- [Kindle for PC](http://www.amazon.co.jp/kindleforpc)
- [Kindle for Mac](http://www.amazon.co.jp/kindleformac)

拡張子(.epub)ファイルをドラックするとどちらもmobiファイルに変換されてから読めます。

##BiB/i
- http://bibi.epub.link/

ブラウザだけで読めるようになります。

##calibre
- http://calibre-ebook.com/
- https://github.com/kovidgoyal/calibre

使っているレンダラが縦書きの日本語に対応していない。
(QtWebKitじゃなくてQtWebEngineでもフォントが寝ているからQtが対応しないと難しいかな

***
最初にリーダはこの3個ぐらい有ればepubファイルを作り始める事が出来ると思います。

###sample epubファイル
[EPUB 3 Samples](http://idpf.github.io/epub3-samples/samples.html)epubファイルがダウンロードでき日本語のサンプルもあります。
XAMPPのローカル環境でGmail送信

ローカル環境のXAMPPでメールを送信する方法のメモ。
使用する関数：mb_send_mail()

やること。
php.iniの修正
sendmail.iniの修正

これは下のサイトを参考にさせて頂きました。
http://yossy-style.net/xampp-mb_send_mail

受信されたメールを見たら、文字化けしてました。
すぐに解決はしましたが、一応メモ。

mb_language('ja');
mb_internal_encoding("UTF-8");

で、きちんと文字コードを設定しなければいけないみたいです。

下に、最終的なソースを貼っておきます。


```php:sendGmail.php

<?php
header('Content-Type: text/html; charset=UTF-8');

mb_language('ja');
mb_internal_encoding("UTF-8");

$adress = "hogehoge@gmail.com";
$title = "テスト";
$body = "テストです。";

if(mb_send_mail($adress,$title,$body)){
	echo "送信完了しました。";
}else{
	echo "送信失敗しました。";
}

?>

```
MySQLのメモ帳

# innodbの索引
* 索引は圧縮することができない(data領域はrow=compressみたいな設定がありますが)

> そのため主キーが多数サブキーが存在する際、小さいのほうが望ましいです

* group byしたら、sortが必要ない場合、order by nullをつけてください
mysqlclient/Mysql-pythonインストール時のcc1: error: unrecognized command line option "-arch"

Python環境でmysqlclientインストール時に、

```
cc1: error: unrecognized command line option "-arch"
error: command 'gcc' failed with exit status 1
```
と出た場合の対処方法。
(たぶんMysql-pythonでも同様)
***
```
/usr/local/mysql/bin/mysql_config
```
を編集(構築環境によってはパスが異なります)。
120行目前後の

```
cflags="-I$pkgincludedir  -Wall   -Os -g -fno-strict-aliasing -DDBUG_OFF -arch x86_64 " #note: end space!
```
をコメントアウトする。
kumogataでCloudFromationテンプレートを作るときはupdateでやろう


createで動作確認するよりupdateの方が色々捗る。

##通常
	$ kumogata create TEMPLATENAME.rb STACKNAME
これだと作成に失敗したときSTACKがCloudFormationに残ったままになるので、同じコマンドをもう一度叩くとエラーになる。

	$ kumogata create TEMPLATENAME.rb STACKNAME
	Failure
	[ERROR] Create failed: STACKNAME
	$ kumogata create TEMPLATENAME.rb STACKNAME
	Creating stack: STACKNAME
	[ERROR] Stack [STACKNAME] already exists
	
なのでdeleteしてやるか、別のスタック名をつける必要があってめんどくさい。

	$ kumogata delete TEMPLATENAME.rb STACKNAME
	$ kumogata create TEMPLATENAME.rb STACKNAME
	or
	$ kumogata create TEMPLATENAME.rb STACKNAME_1
	
##updateなら再入力OK
VPCだけ先に頑張って作っておいてあとはupdateコマンドで動作確認するやり方だとupdateコマンドをもう一回入れるだけで動くからこの二度手間感がなくて捗る。

	$ kumogata update TEMPLATENAME.rb STACKNAME
	Failure
	[ERROR] Update failed: STACKNAME
	$ kumogata update TEMPLATENAME.rb STACKNAME

もう一回やっても怒られない。

ただし「それ今あるのと別モンやろが」ってなるレベルの変更をかけると流石に怒られるので、ちょっとした変更を試したいときとかにオススメ。
IoTをハッカソン的なノリで作る際に気をつけるべきだと感じたこと


LIGアドベントカレンダー2日目です。 @Im0_3と申します！

ここ最近、短期間でガツッとIoTをする機会がなんどかありました。自分自身初めてのIoT、かつ複数人でハッカソン的に開発するのが初めてだったので、今回気をつけるべきと感じたこと、今後気をつけたいと思ったことをまとめてみました。

# まずは道筋を立てる
![roadd.png](https://qiita-image-store.s3.amazonaws.com/0/39377/53709cb7-fe9d-2d0b-3ff1-76380067eb33.png)

作りたいものが決まったら、まずは何が必要かを書き出す。どんな機能をつくるべきか細かく考える

# 機能は細かく作る
![239H.png](https://qiita-image-store.s3.amazonaws.com/0/39377/02594bc3-5424-e8a2-90fc-95fb66f4bd19.png)

ハッカソンのようにその場で考えながら作っていくと、途中で作り直す部分がかならず出てくるので、細かく分けて、再利用しやすい形に作ることを心がける。

# ガッチリとした構築環境よりも、最低限の構築環境を用意する
![hogee.png](https://qiita-image-store.s3.amazonaws.com/0/39377/2a43e089-494c-dae5-d7c1-73dca4a269ea.png)


短期間であれば、がっつり構築環境を用意するよりも、最低限の構築環境でぱぱっとつくるほうが効率的。

# まずは一通り完成を目指す
![public-domain-images-free-stock-photos-high-quality-resolution-downloads-public-domain-archive-10-1000x750.png](https://qiita-image-store.s3.amazonaws.com/0/39377/d75b4695-e5c2-71bd-0e3e-3f630d9e15d1.png)

ブラッシュアップは後回しにする。IoTとかフィジカルコンピューティングをして感じたのは、ブラッシュアップをしだすとキリがないということ。時間がないならまずは一通り動くことを目指す。

# 動かない原因はコードだけではない
![car.png](https://qiita-image-store.s3.amazonaws.com/0/39377/98430efa-c241-151d-abad-bcceb8ea5739.png)

普段コードを書いていると、コードのどこかに間違いがあるのだと考えがちだが、IoTは配線だったり、センサーの不調だったり、通信環境だったりといろんな要因がある。動かないときはコードと決めつけず細かく一つずつチェックする。

# 他の手段を検討してみる
![public-domain-images-free-stock-photos-high-quality-resolution-downloads-public-domain-archive-10-1000x750.png](https://qiita-image-store.s3.amazonaws.com/0/39377/6a87d544-2d75-eee7-e3fa-cd2588335a06.png)

最初に思いついたやり方よりも、もっといいやり方が見つかるかもしれない。最初に作ったものに固執しすぎず柔軟に制作を進める。

# 無理をしない
![catt.png](https://qiita-image-store.s3.amazonaws.com/0/39377/7871f8cd-6f50-25f3-d82b-f0f74f9cacef.png)

なかなか時間を確保できないからと無理をしすぎるとやはり効率が悪くなるので、しっかりオンオフを考えて割り切って制作する。

# 展示する場合は現場で動くかしっかり確かめる
![bikee.png](https://qiita-image-store.s3.amazonaws.com/0/39377/60a78481-7c4d-091a-c942-471df9c171f3.png)

今まで開発していた場所では動いたのに、当日移動してから動かないなんてこともありえるので、できれば余裕をもってセッティングを行う。

# 楽しんで制作をする
![bikee.png](https://qiita-image-store.s3.amazonaws.com/0/39377/9cf328ce-909c-b63c-76b4-1371e4dfd054.png)


しっかり協力をして、それぞれの力を生かしながら楽しく制作を行えるように動く。

***


ざっと箇条書きであげてみました。今回作ってみて、普段の制作とは違うところも多々あって難しいなと感じましたが、いろいろと勉強することが多かったです。

皆さんがこのようなときに気をつけていることなどあれば是非教えてください！

明日はディレクターの@arakan-ligです。よろしくお願いします！
Ruby力を高めるためには標準メソッドを学べ（Enumerable編）


Rubyを使っていて、便利だなって思うのが配列の操作についてなのですが、
コードレビューをしていて、
標準メソッドを使いこなしていると結構Rubyっぽいコードになって、イケてるなーって思ったりします。
覚えておくと覚えると便利なので、覚えていきましょう。

### drop

```
[*1..5].drop 2
```

出力結果

```rb
[3, 4, 5]
```

### cycle

* 配列のループを引数の数だけ繰り返す  
※ 引数を指定しない場合はbreakしない限り、無限にループさせる

実行プログラム

```
arr = [1, 2, 3, 4, 5]
arr.cycle(2) {|item| print "#{item} " }
1 2 3 4 5 1 2 3 4 5
```

出力結果

```
1 2 3 4 5 1 2 3 4 5
```

### find

* 要素を探して条件に合うものを取得

```
puts [38, 74, 56, 48, 87, 68, 81, 49].find {|item| item % 7 == 0 }
```

出力結果

```
56
```

### all?
* 全て真かどうかの検証を行う。

```
puts ['a', 'b', 'c'].all? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].all? {|w| w.kind_of?(String) }
puts [1, 2, 3].false? {|w| w.kind_of?(String) }
```

出力結果

```
true
false
false
```

### any?

* どれか真であるかを調べる（真のものを見つかった時点で実行終了）

```
puts ['a', 'b', 'c'].any? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].any? {|w| w.kind_of?(String) }
puts [1, 2, 3].any? {|w| w.kind_of?(String) }
```

出力結果

```
true
true
false
```

### none?


* 全て偽であるかを調べる

```
puts ['a', 'b', 'c'].none? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].none? {|w| w.kind_of?(String) }
puts [1, 2, 3].none? {|w| w.kind_of?(String) }
```

出力結果

```
false
false
true
```


### one?

* 一つだけ真であるかどうかを調べる

```
puts ['a', 'b', 'c'].one? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].one? {|w| w.kind_of?(String) }
puts [1, 2, 3].one? {|w| w.kind_of?(String) }
puts ['a', 'b', 3].one? {|w| w.kind_of?(Integer) }
```

出力結果

```
false
false
false
true
```


### flat_map

* 入れ子の配列をmapしてflattenしてくれる

```
p [[1,2],[3,4]].map { |i| i }
p [[1,2],[3,4]].flat_map { |i| i }
```

出力結果

```
[[1, 2], [3, 4]]
[1, 2, 3, 4]
```


### reduce

* ブロックを使って繰り返し計算を行うのに使う。
* 以下の例は配列に入っている数値の合計値を出力している。

```rb
puts [2, 6, 5, 3, 7, 8, 1, 9, 4].reduce {|sum, n| sum + n }
```

```
45
```


### lazy

このメソッドは「map や select などの lazy 版を提供するためのメソッド」です。ただ、正確にいうと「map や select などの lazy 版を提供するための名前空間を提供するメソッド」となります。

※最初は浅い理解から入っていいと思いますが、徐々に深く理解していきましょう。

以下のプログラムを実行したらどんな値が返ってくると思いますか？

```rb
[*1..100].cycle.select{|_| 1 == 1}.first
```

結果はなにも返ってこないです。
`[*1..100].cycle`が無限のリストを作るメソッドなので、結果、
無限ループをしてしまい、ただCPUとメモリを使うだけのプログラムと
なります。

では以下のプログラムならどうでしょう？

```rb
puts [*1..100].cycle.lazy.select{|_| 1 == 1}.first
```

実行結果として`1`が返ってきます。

```
1
```



詳しくは参考記事を載せたので、見ましょう！

```rb
arr.cycle.lazy.drop(rand 100).first
```

## 書いてて力尽きたもの

* chunk
* each_entry
* entries
* partition
* slice_before
* sort_by
* take
* zip


## 最後に

* Array、Hashあたりを次に書いていこうと思います。


## 参考記事

[Ruby - EnumeratorとEnumerator::Lazyの違い - Qiita](http://qiita.com/gam0022/items/8acfc0c674b96060c03f)
[Rubyist Magazine - 無限リストを map 可能にする Enumerable#lazy](http://magazine.rubyist.net/?0041-200Special-lazy)
[Enumerable - Rubyリファレンス](http://ref.xaio.jp/ruby/classes/enumerable)
Xcode : Cocoapodsの導入メモ

Mark Down記法の練習、およびQiitaアップロードテストがてら
Cocoapods導入手順をまとめてみました。

###1:そもそもCocoapodsってなあに？

 mac / iOSのライブラリ管理。
 ライブラリの取得から導入までの面倒な手順をまとめて引き受けてくれる便利なツール。
 

###2:導入手順は？ ：
以下を参考にさせていただきました。

http://www.atmarkit.co.jp/ait/articles/1403/08/news008.html

#####(1)ターミナル cocoapodsのインストール

```
sudo gem install cocoapods
pod setup
```

#####(2)Xcode Project作成（仮にtextProject)

#####(3)podfile作成
platformと導入するライブラリ、バージョンを記載し、作成したプロジェクトのディレクトリに作成。


```[projectdir]/podfile
platform :osx,"6.0"
'UIKit''=> 1.0'
```
※osx/ios/tvosなど必要なプラットフォームで変更

記述	|意味
--- | --- |
'1.0' |	バージョン1.0を使用
'> 1.0'|	1.0 より上のバージョンを使用
'>= 1.0'|	1.0 以上のバージョンを使用
'< 1.0'	|1.0 未満のバージョンを使用
'<= 1.0'|	1.0 以下のバージョンを使用
'~> 1.0.2'|	1.0.2 以降のバージョン 1.0.xを使用



####(4)ターミナル ライブラリの導入

 
 
該当プロジェクトディレクトリに移動

- 新規導入

```
pod install
```

- 更新 /削除(podfileから不要ライブラリを消してupdate)

```
pod update 
```

以上。
GitHubにsshで接続する方法

事ある毎にググっている気がするので、備忘録として残しておきます。

# 鍵の作成
```
$ ssh-keygen -t rsa -C "メールアドレス"
```
- 鍵の保存パス
- 鍵のパスフレーズ（設定しなくてもいい）

上記を聞かれるので、入力する。

```
$ chmod 600 ${作成した秘密鍵}
```
作成した秘密鍵のパーミッションを600にしておく。

# 公開鍵の登録
```
# cat ${作成した公開鍵}
```

上記で表示された文字列をGitHubに登録する。

1. GitHubにログイン
1. ユーザアイコンから「Settings」を選択
1. 「SSH keys」の項目から、catした内容の文字列を登録する

# .ssh/configに接続情報を登録する
ローカルマシンの「.ssh/config」に以下を設定する。

```
Host github.com
  HostName github.com
  IdentityFile ${作成した秘密鍵}
  User git
```

以下のコマンドを実行して接続確認が取れれば終了。
```
$ ssh -T git@github.com
```
Unity uGUIs -ウグイス-の説明

# uGUIs -ウグイス-とは？

UnityのGUIコンポーネントであるuGUIを便利に、扱いやすくをモットーに開発を進めているサポートライブラリです。
（モットーで、開発中で、っていう悲しい突っ込みどころはなしで）

# 何が出来るの？

現在サポートしている（サポート予定の）機能は以下の通りです。

* TextやButtonなどのコンポーネント群へのAuto Binding機能
* 同じようにコンポーネント群の色やマテリアルの統一的な変更機能（ex..よわよわなCSS的な）
* （レイアウト関連のサポート機能、まだ試したり等してないので予定）
* （Yamlやその他のマークアップ系による構築機能、パーサとかで死にそう）

# Sample.unitypackageはよはよ！

準備します！（2日目）
簡単な使い方などを含めて投稿を準備しようと思っています

# おわりに

uGUIsに実装を行っている機能自体は、実装されている機能のたぐいを利用していない方にはとても有用な知見としてもなり得ると思っているのでがんばってこういうのを拡散できるようにしていきます！
SSL証明書の有効期限を取得するスクリプト



こちらを参考にしました。
http://qiita.com/uemura/items/a3a0937f77494e62213c

import して使うことを想定

コマンドから使うと

```shell-session
$ ./cert_expires.py example.com google.com
example.com: 1093 days
google.com: 76 days
```

```python:sert_expires.py 
#!/usr/bin/env python


import sys
import re
import subprocess
import datetime


def parse_result_date_string(date_string):
    """
    convert date string to datetime
    >>> date_string = "Feb  2 05:47:50 2015 GMT"
    >>> d = parse_result_date_string(date_string)
    >>> d
    datetime.datetime(2015, 2, 2, 5, 47, 50)
    """
    d = datetime.datetime.strptime(date_string, '%b %d %H:%M:%S %Y %Z')
    return d


re_start = re.compile(r'Not Before: (.+)')
re_end = re.compile(r'Not After : (.+)')


def get_date_strings_from_result(result):
    """
    :return: cert start date, cert expire date
    >>> text = "Not Before: Feb  2 05:47:47 2015 GMT\\n" \\
    ...        "Not After : Feb  4 16:03:29 2016 GMT"
    >>> get_date_strings_from_result(text)
    ('Feb  2 05:47:47 2015 GMT', 'Feb  4 16:03:29 2016 GMT')
    """
    rr_start = re_start.search(result)
    rr_end = re_end.search(result)
    return rr_start.group(1) if rr_start else None, \
           rr_end.group(1) if rr_end else None


def get_cert_start_expire_date(domain):
    """
    :return: cert start date, cert expire date
    """
    command = "openssl s_client -connect {}:443 < /dev/null " \
              "2> /dev/null | openssl x509 -text | grep Not"

    command = command.format(domain)
    out = subprocess.check_output(command, shell=True)
    ss, es = get_date_strings_from_result(out)
    return parse_result_date_string(ss), parse_result_date_string(es)


def get_cert_expire_delta(domain):
    """
    time delta cert expire date and now
    """
    start_date, expire_date = get_cert_start_expire_date(domain)
    return expire_date - datetime.datetime.now()


def main():
    for domain in sys.argv[1:]:
        delta = get_cert_expire_delta(domain)
        print('{}: {} days'.format(domain, delta.days))


if __name__ == '__main__':
    main()
```
UXデザインからの卒業

```lang:ざっくり言うと
・海外向けUI設計でカスタマージャーニーマップにお世話になった話
・継続的に定点観測していたらプロダクト自体に色々応用できた話
・デザインとかUXって魔法の言葉？
```

こんにちは、渋谷のIT企業で何でも屋をしているinamolyです。

このエントリーは「[UX Tokyo Advent Calendar 2015](http://www.adventar.org/calendars/1052)」の1日目として投稿しています。

昨年から自社のクラウドホスティングや海外展開まわりでリサーチしたり、プロトタイプしたり、そしてプロダクトオーナー的な側面も強くなってきた昨今です。

今日は数年前からプロダクトをより良くするために利用しているいくつかのフレームワークの中から、カスタマージャーニーマップ（以降ジャーニーマップ）について、自身の経験交えてご紹介が出来たらと思っています。

## 海外向けUI設計こそジャーニーマップかも
昨年から今年にかけて、海外向けプロダクトのコンパネUI設計を行ってきました。その際には多くの外国籍被験者にユーザーテストの協力をいただきました。特にアジア圏の被験者へのテスト時に、お互いカタコトの英語でコミュニケーションするより、非言語なジャーニーマップの感情曲線が相互理解に一役買ってくれました。（ミスリードなど起きないか気にしてたのですが、今のところは大丈夫な模様）
今後も海外（特に非英語圏）サービスにおいてはジャーニーマップは役に立ってくれそうです。

## ジャーニーマップは継続調査でも有効
アンケートを継続して定点観測するようにジャーニーマップも定点観測し始めました。
※そもそもは[こちら](http://note.openvista.jp/2014/cjm-is_living)の記事を読んだのがキッカケでした。
#### 良い点
・小規模な変更では行わなかった調査抜けなどをフォローできる
・変化する人々の行動様式に現在のUIが沿っているか確認できる
#### つらい点
・（個人的に）ペルソナに合致する新規被験者を見つけるのがつらい

プロダクトオーナーと言いましょうか、いわゆる事業戦略での優先順位検討などをすることがあるのですが、これらで得ることが出来たデータを参考材料の一つとして並べています。


## デザインとかUXって魔法の言葉？

「デザインの意味が広義すぎる」「UXは銀の弾丸ではない」と最近よく聞かれるアレの話です。

私含めチームでは「見た目の綺麗さとしてのデザイン」と「情報を整理するデザイン」と意味合いを分けて設計、開発を行っています。もし上記の混同をされる方がいるのならば、これは日々の啓蒙活動なのかなと思っています。蛇足ですが最近では「UI設計」と「UX調査」とタスクチケットに表記することが増えました。
もしかしたら私たちは「UXデザインからの卒業」が必要なのかもしれませんね。

## 最後に
少し宣伝チックなフリになってしまったのですが、12/19(土)にIMJさん主催の「[UXD/HCD ワイワイCAFE](https://uxd-hcd-waiwai-cafe.doorkeeper.jp/)」にご協力することになりました。

テーマは**「UXデザインからの卒業」**

後日ブログレポートなどで皆さんにフィードバック出来ればと考えています。

UXデザインにおいてはまだまだ未熟ですが、先達の知恵を借り、来年もすべての人にわかりやすく新しい技術を楽しく便利に届けたい。そのために今後も精進したい次第です。
ちょっと早いですが、2015年も皆さん大変お疲れ様でした！！
bitbucket > 表示されるタグ文字 > 21文字まで > 123456789012345678901...

bitbucketにおいてタグ付けした時、bitbucketのコミット履歴で見れるタグ名はある文字数以降が省略される。


文字数を知るため `123456789012345678901234567890`というタグを登録してみた。

結果、`123456789012345678901...`となり、タグ表記は21文字までとわかった。

`123456789012345678901234567890_v0.1`
と
`123456789012345678901234567890_v0.2`
はいずれも
`123456789012345678901...`という表記になる。
guard-shotgun で.rbファイルを更新しても再起動していないように見える時の対処


## 現象

+ shotgun 単体起動の時はブラウザリロードするとrubyコード更新が反映される。
+ guard-shotgun 使用時に rubyコードを更新しても反映されていないように見える。

## 原因

+ appフォルダの他に helpersフォルダなど作成してその中のrubyコードが反映されていなかった。
+ 設定漏れだった（以下の設定）

```Guardfile

guard :shotgun do
  watch(%r{(helpers)/.+\.rb$})
end

```

+ 以下に書かれていた…
https://github.com/rchampourlier/guard-shotgun

## 環境

```
$ bundle list
  * guard (2.13.0)
  * guard-livereload (2.5.1)
  * guard-shotgun (0.4.0)
  * sinatra (1.4.6)
  * sinatra-contrib (1.4.0)
```
c / c++ > RingBuffer (N個のmargin) の実装

```txt:動作確認
C++ Builder XE4
```

グラフ描画において古いデータは描画域に入らなくなり不要のため、古いデータを削除する処理が欲しかった。

TListなど使えば簡単ではあるが、同じ処理をCプロジェクトでも使えるように自分で実装した。

処理としては

- keepnum: 最低限保持したいデータ数
- margin : 余裕を持たせるデータ数

(keepnum+ margin)にデータ数が達した時に、margin分をごっそり取り除く。
こうすることでデータを取り除く処理をデータ追加時に毎回実行せずに、あるインターバルで実行できるという意図。

```.c:処理本体
int TimeGraph_KeepLatestNsets(int keepnum, int margin, TG_graphData_t *graphDataPtr, int *dataCount)
{
	if (*dataCount < (keepnum + margin) ) {
		return *dataCount;
	}

	for(int idx = 0; idx < keepnum; idx++) {
		TG_graphData_t *src = &graphDataPtr[idx + margin];
		TG_graphData_t *dst = &graphDataPtr[idx];
		TimeGraph_SetEachData(dst, src->sampleDt, src->val, src->errStatus);
		// set 0 to moved one
		TimeGraph_SetEachData(src, src->sampleDt, 0.0, src->errStatus);
	}
	*dataCount = keepnum;

	return *dataCount;
}
```

```.c:テスト関数
void Test_TimeGraph_KeepLatestNsets()
{
	TG_graphData_t data[10];
	int dataCnt = 0;

	const int keepnum= 5;
	const int margin = 3;

	for(int idx = 0; idx < (keepnum + margin); idx++) {
		if (idx < keepnum) {
			TimeGraph_SetEachData(&data[idx], Now(), 3.141592, TG_DATA_OK); 
		} else {
			TimeGraph_SetEachData(&data[idx], Now(), 2.7182, TG_DATA_OK); 		
		}
		dataCnt++;
	}

	int preCnt = dataCnt;
	int nowCnt = TimeGraph_KeepLatestNsets(keepnum, margin, &data[0], &dataCnt);
	if (preCnt != nowCnt) {
		// after removal of old data
		int nop551 = 1;
		(void) nop551; // 警告「xxxに代入した値は使われていない」の回避
	} else {
		int nop554 = 1;
		(void) nop554; // 警告「xxxに代入した値は使われていない」の回避
	}
}
```

TG_graphData_t はデータ用の構造体。TDateTimeというメンバ変数を使っているが、Cで使う時はビルトインのデータ型に適宜変更することになる。

`TimeGraph_SetEachData(dst, src->sampleDt, src->val, src->errStatus);`
はdstポインタの構造体にsampleDt以降のデータをセットする。メンバ変数の一部への代入忘れ防止のためこうしている。

変数の名前はもう少し検討しなおす方がいいかもしれない。
Heroku ConnectのGetting Started

Heroku ConnectのGetting Started
====
Dev Centerの[Getting Started on Heroku with Heroku Connect](https://devcenter.heroku.com/articles/getting-started-with-heroku-and-connect-without-local-dev)に添って進めていけば、SalesforceのテーブルがPostgresのテーブルと同期するところまで試せます。サンプルアプリはsinatraとsinatra-activerecordを使っています。

Salesforceは開発に利用できる無料のDeveloperEditionがあるので[ここからサインアップしておきます]。
しばらくするとメールが来るのでパスワードを設定してログインします。

ログインするとこんな画面になりますが、サンプルアプリで使うのは「取引先責任者」です。イマイチ意味の分からない翻訳ですがContactのことです。ちなみに取引先がAccountです。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/80aa3645-2432-58fb-6598-bc57eff891fb.png)

取引先責任者を開いたら、ビュー→すべての取引先責任者→Go
![](https://qiita-image-store.s3.amazonaws.com/0/21374/1aa36b5d-b386-ea08-ba92-f37775f240c9.png)

DeveloperEditionにサンプルで入っている取引先責任者が表示されます。Getting Startedを進めていくと、これがPostgresに同期されます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/af11772a-3ecd-140a-5a29-9b8d3e15c852.png)

最初のデプロイ
----
[Getting Startedのこのステップ](https://devcenter.heroku.com/articles/getting-started-with-heroku-and-connect-without-local-dev#deploy-the-app)では、Heroku Buttonで[このサンプルアプリ](https://github.com/heroku/no-local-dev-getting-started)をデプロイします。フリープランのHeroku PostgresとHeroku Connectがインストールされます。

同期設定
----
ダッシュボードからデプロイしたアプリを開き、Heroku Connectアドオンを開きます。
最初はPostgresとSalesforceの設定です。Setup Connection→Next→Next→Salesforceにログイン→アクセス許可と進めます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/a0a4c06b-ec3c-ffa1-bc3a-f87310185221.png)

Create Mappingをクリックすると、Salesforceのテーブル(Salesforce用語ではオブジェクトといいます)一覧が出てくるのでContactを探してクリックします。右上に検索ボックスがあります。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/ab3e529a-caa0-e94f-67a6-c1b3792eec00.png)

同期間隔、双方向同期するか、どのカラム(Salesforce用語では項目)を同期するかを設定できます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/a740dd86-214c-dd0e-16c1-2164514d4f04.png)

Mapped Fieldsで以下の3つを選んで右上のSaveで保存します。

- Email
- FirstName
- LastName

同期確認
----
[次のステップはDataclip](https://devcenter.heroku.com/articles/getting-started-with-heroku-and-connect-without-local-dev#create-a-heroku-postgres-dataclip)、[その次のステップはGitHub連携](https://devcenter.heroku.com/articles/getting-started-with-heroku-and-connect-without-local-dev#deploying-a-change-through-github)の話です。[その次](https://devcenter.heroku.com/articles/getting-started-with-heroku-and-connect-without-local-dev#modify-app-to-list-records)がソースコードを修正してGitHubからデプロイする説明ですが、`heroku git:clone --app アプリ名`して手元で書き換えて`git push heroku master`でよいでしょう。

書き換える、というかコメントアウトを解除するのは`app.rb`のこの辺です。

```ruby
class Contact < ActiveRecord::Base
  self.table_name = 'salesforce.contact'
end

# ↓この4行のコメントアウトを解除する
get "/contacts" do
  @contacts = Contact.all
  erb :index
end
```

`https://アプリ名.herokuapp.com/contacts`を開くと同期されていることが確認できます。
![](https://qiita-image-store.s3.amazonaws.com/0/21374/1c9aeed0-1ed5-aaeb-e851-10c112a1cafc.png)

アドオンダッシュボードのGUIで同期設定すると、Heroku Connectが使うPostgresのスキーマにテーブルができるのでマイグレーションする必要はありません。むしろ勝手にテーブルを作るとアドオンGUIでエラーになります。
Xperia SX 無効化してもよさそうなアプリ一覧（個人用）

* Androidライブ壁紙
* Anonymous Usage Stats
* Bluetooth 共有
* BridgingLauncher
* com.android.backupconfirm
* com.sonyericsson.mtp.extenstion.backup
* DcmWapPushHelper
* docomo
* docomo Application Manager
* Docomo DB Agent
* DOCOMO Initialization
* docomo Palette UI
* docomo Wallpaper
* docomo Wi-fi かんたん接続
* dメニュー
* dマーケット
* FMラジオ
* Goolge Play Movies
* Google+
* Googleテキスト読み上げエンジン
* Google菓子プラグイン
* HTMLビューアー
* iコンシェル
* iコンシェルコンテンツ
* jp.co.nttdocomo.pf.paid
* MTP extension service
* OMA Client Provisioning
* Oma Download Client
* OmaV1AgentDownloadServices
* Pico TSS
* ProtectedMediaScanner
* ProtectedMediaScannerTrigger
* QC SEMC Service
* R2R Client
* Remote Control Service
* Remote support service
* Sakura
* ScreenLockService
* SDカードバックアップ
* semc-cnap-provider
* Service Menu
* Smart Search
* TalkBack
* Unsupported Headset Notifier
* Update Service
* usbotg
* VerifyCertificatesDummyApp (application)
* VerifyCertificatesDummyApp (media)
* VerifyCertificatesDummyApp (platform)
* VerifyCertificatesDummyApp (shared)
* VpnDialogs
* WapPush
* Woody
* Youtube カラオケプラグイン
* Youtube プラグイン
* お任せロック
* しゃべってキー入力
* しゃべって検索
* ウィキペディアプラグイン
* エリア連動Wi-fi
* オートGPS
* スケジュール＆メモ
* スイングパノラマ
* セットアップガイド
* ダウンロード
* デコメ絵文字マネージャ
* ドコモサービス (com.nttdocomo.android.docomoset)
* ドコモサービス (com sonyericsson.docomo.settings)
* ドコモバックアップ
* ドコモ位置情報
* ドコモ位置情報SUB
* バブル
* フェイスアンロック
* ブラックホール
* マジックスモーク壁紙
* マーケットフィードバックエージェント
* メッセージ
* メディアプレイヤー
* 中国語キーボード
* 取扱説明書
* 外国語キーボード
* 店頭用デモ
* 更新センター
* 検索アプリプロバイダ
* 災害用キット
* 連絡先インポート
* 遠隔サポート
* 電話帳サービス
* 音声レコーダー
* エリアメール
* 最近の通話履歴
* フォトスライドショー
* Google Play Books
* CdInfoAccessor.apk
*
自分で積み上げた負債を見つめなおすその１

[この記事はSansanアドベントカレンダー一日目です。](http://qiita.com/advent-calendar/2015/sansan)

# 誰よお前
エンジニアとしてご飯を食べ始めて9ヶ月のHaiToです。
最近では[Omotesando.rb](http://omotesandorb.connpass.com/)で発表したりしてます。

9ヶ月も経てば、自分が作ってしまった悲しいコードとかも出てきて`git blame`する度に悲しい気持ちになります。
悲しい気持ちになっているだけではナンの前進もないので、悲しいコードを見てどうしてこうなったのかを考えてみます。

# Twitter,2ch検索Bot
Twitterと2chで風評検索をするBotを作りました。
名前空間的にはこんな感じ

```rb
module Bot
  module Reputation
    class Bbs2chSearcher
    class TwitterSearcher
```

`Bot` (本当は別の名前だけど気にしない)空間には他にもいろいろあるので、更にもう一階層切って`Reputation`としてるところまでは、去年(インターン時代)の自分にしてはなんかまっとうに頑張ろうとした感じが見える。

で、どのへんが悲しいかというと、`Bbs2chSearcher`と`TwitterSearcher`のインターフェースは合ってないので、呼び出すときにいい感じに共通化してDRYに出来ない。

```rb
TwitterSearcher.new(last_fetched_at).fetch_twitter_reputation_posts
Bbs2Searcher.new(last_fetched_at).fetch_2ch_reputation_posts
```

なんでこうなったかというと、まっとうに設計せず作り始めたからというのと、当初自分はあんまり周りのコードを読んでいなかったので綺麗なコードへの理解度が低かった。

今はいろいろとコードを読んで、ある程度は何が良くて何が辛くて何がダメなのかはわかってきた。
今思い返せば、ちょっと工夫して

```rb
class SearcherBase
  def initialize(last_fetched_at)
    @last_fetched_at = last_fetched_at
  end

  def fetch_reputation_posts
    raise NotImplementedError
  end
end

class TwtitterSearcher < SearcherBase
class Bbs2chSearcher < SearcherBase
```

みたいなのを用意してあげたほうが、利用する側でさくっと統一できてよかったなぁなんて。
本当はきになったベースでPRを出すと良いんだろうけど、もっと大改造したかったりしてうーんとかうなってる。小さく改善したほうがまぁ見通しは良さそうだが。年末にでもやります。 **今はモンハンやります。**

ほかにもいろいろ悲しいコードを作ってしまったという思いはあるのですが、ここ数ヶ月はAuroraの検証だとか、S3画像の移動機能とか、インシデント対応とかしてたおかげであんまり負債感がない。

もしかして：**全然コード書いてない**

そんな気もする :cry: 

しかしゆるやかにソフトウェアは腐っていくので日々前進していこう。


[![LGTM](http://lgtm.in/p/O5yV8eilq)](http://lgtm.in/i/O5yV8eilq)
シェル：プログレスバーの作り方

ふとしたときに思い出せないのでメモ。

# ソース

```
#!/bin/bash

C=30
A=0
while [ $A -le $C ]
do
  B=""
  for i in `seq 1 $C`
  do
    if [ $A -eq $i ]
    then
      B="$B>"
    else
      if [ $i -le $A ]
      then
        B="$B-"
      else
        B="$B "
      fi
    fi
  done
  P=`expr $A \* 100 / $C`
  echo -en " copying...  [$B] $P %\r"
  sleep 1
  A=`expr $A + 1`
done
```
# ちょっと解説

ポイントはechoの部分。
-e オプションでエスケープコードを有効に
-n オプションで改行を抑制
\r でカーソルを行頭に移動して、次の文字列を出力する

と、同じ行でどんどん上書きされていく仕組み。`echo -e " copying...  [$B] $P %\r\c"` と、-nオプションの代わりに\cコードでもいけると思います（たぶん）。

ちなみに、\rでいけるんだったら\nでもいけるんちゃうか、と思ってしまいますが改行されてしまいうまくいきません。\r(CR)と\n(LF)の意味合いの違いにあると思います。詳しくは別途かき・・・たいです。

また、-nオプションつけてても、文字列として改行を記載するとそこは有効になってしまいます。あくまでもechoコマンドとしての改行抑制オプションが-n、というところでしょうか。
CloudantからdashDBへのレプリケーション

Bluemix上でCloudantからdashDBにレプリケーションする時のメモ。

CloudantがNoSQL、dashDBがRDBチックなDBなので、
Cloudantに情報をどんどん詰め込んでおいて、後からdashDBで取り出したいという場合もあるんじゃないかなあと思い。


## 手順
1.Cloudantのウェアハウスを作成
まずはBluemixからCloudantのコンソール画面へ。
左のメニューから[Warehousing]→[Create new warehouse]を選択。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/103032/53c3e327-2f28-3757-365d-6717867a05aa.jpeg)


ウェアハウス名を適当につけます。（ここではwaresnew）

Add databases to your warehouseでdashDBにレプリケーションしたいDBを選択。
途中まで入力すると自動的にでてくるみたい。（ここではnewdb）

OptionalのところでdashDBのサービスを選択。
事前にdashDBのサービスを作ったのでそれを選択したけど、
create new dashDB instanceというチェックもあるので、なければ作ってくれるのかも。



作成されるとこんな感じ。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/103032/c713ad9c-15cd-885e-869b-9dce0d3a7c7b.jpeg)


2.　dashDB側で確認
VIEW IN DASHDBのところのVIEWを押すと、dashDBのコンソールに飛ぶので、内容確認。

左のメニューから[tables]を選択し、スキーマを選択すると[newdb]というDBができてるのがわかる。
[Browse Data]を見ると、DBの中身も確認できた。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/103032/971c73ad-7578-8a1e-6fe3-1ce7fb6b9364.jpeg)

ちなみに[newdb_overflow]というテーブルもあわせて作成され、ロード中に発生した警告や例外が格納される。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/103032/02571550-7dea-1088-5035-24db75ae2752.jpeg)


さらに、この状態でCloudant側に情報をひとつ追加してみると…
おっ！　dashDB側にもちゃんと反映されてますね！

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/103032/557159b6-bc71-6037-e617-097da4f627f0.jpeg)


#参考
Load JSON from Cloudant database into dashDB
https://developer.ibm.com/clouddataservices/docs/dashdb/get/load-json-from-cloudant-database-in-to-dashdb/
https://developer.ibm.com/clouddataservices/wp-content/uploads/sites/47/2015/07/loading-cloudant-into-dashdb.pdf

古い資料を見ると、dashDB側のメニューにcloudantからデータを取得する選択肢があって、
dashDB側からcloudant側のデータを取得してるような記載があるんですが、
僕がdashDBコンソールのメニューを見ると、そういう選択肢がさくっと削除されてたので、慌てて探しました…。