OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EMRをデフォルトの設定のままで起動できない場合の対処方法

## 現象
AWS EMR のクラスタを作ったが

> Terminated with errorsFailed to provision ec2 instances because 'The requested instance profile EMR_AutoScaling_DefaultRole is invalid'

というエラーが出てクラスタを起動できない。

## 対応方法
IAM で EMR_AutoScaling_DefaultRole に AmazonEC2FullAccess を付与してから、新しいクラスタを作り直す。

本来は必要最低限の権限だけを与えるべきだが、 EMR が内部で何を行なっているのかよくわからなかったので、こういう対応をした。最低限の権限がわかる人がいたら教えて欲しい。
俺得メモ : Ubuntuのオススメするソフト一覧

私の備忘録です...。参考になれば幸いです。

オフィス : LibreOffice Writer | Calc | Impress

>標準で導入されています。

画像編集 : GIMP

>sudo apt-get install gimp

動画編集 : OpenShot Video Editor

>sudo add-apt-repository ppa:openshot.developers/ppa
sudo apt-get update
sudo apt-get install openshot-qt

音楽編集 : Audacity

>sudo apt-get install audacity lame

ディスプレイ録画 : vokoscreen

>sudo apt-get install vokoscreen

グラフィック : Blender

>sudo add-apt-repository ppa:thomas-schiex/blender
sudo apt-get update
sudo apt-get install blender

開発 : Java

>sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

実行ファイルサポート : Wine

>sudo add-apt-repository ppa:wine/wine-builds
sudo apt-get update
sudo apt-get install --install-recommends winehq-devel
MAMPのApacheでVirtualホスト設定

## 環境
・MAMP バージョン4.1

## Virtualホストとは
> バーチャルホストとは、1台のWebサーバで複数のドメイン名のWebサイトを運用すること。 Webサーバソフトの機能の一つ。 サーバに複数のIPアドレスを割り振ったり、1つのIPアドレスに複数のドメイン名を割り当てることにより、1台のWebサーバで複数のWebサイトを同時に運用することができる。

今回はMAMPのApacheにポートを分けて複数の環境を構築する

## Apache設定ファイルの変更

* /Applications/MAMP/conf/httpd.conf<br />

```
# Virtual hosts
# Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```
Includeの前の#（コメントアウト）をはずす

```
# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```

* /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf<br /><br />
末尾に追記

```
Listen 8001
<VirtualHost *:8001>
    DocumentRoot "/Users/HIROKI/Dropbox/programming/MANP-htdocs/v-host1"
    ServerName test.hiroki.local
</VirtualHost>

Listen 8002
<VirtualHost *:8002>
    DocumentRoot "/Users/HIROKI/Dropbox/programming/MANP-htdocs/v-host2"
    ServerName test.hiroki.local
</VirtualHost>
```

`Listen ポート番号`・・・受け付けるポート番号を定義

`<VirtualHost *:ポート番号>`・・・上記で指定したポートと同一に

`DocumentRoot`・・・WEBサイトのドキュメントルート

`ServerName`・・・サーバーのホストネーム


## ローカル端末hostsファイルの編集

hostsファイルにhttpd-vhosts.confに定義したサーバーのホスト名を名前解決できるようにhostsファイルを編集する

```
127.0.0.1        test.hiroki.local
```


## 接続確認
サーバーを再起動後、接続確認を行う

ポート：8001
![スクリーンショット 2017-02-02 23.15.30.png](https://qiita-image-store.s3.amazonaws.com/0/83314/36d93fa6-441d-db0a-9c2f-cabecd1802a0.png)

ポート：8002
![スクリーンショット 2017-02-02 23.15.20.png](https://qiita-image-store.s3.amazonaws.com/0/83314/67c858c7-e596-8035-3c93-9066f9ec2d5a.png)


ポートでWEBサイトを切り替えることができました
2017年のフロントエンド。。。を見て

さてFrontEndHandbook 2017が公開されましたね。私もパラパラ読んでいたのですが。

https://frontendmasters.gitbooks.io/front-end-handbook-2017/content/2017.html

上記を読んで知らなかったことを調べた記録です。

# dynamic-import

TC39 Processは stage 3 まで来ておりES2017に入る感じでしょうか。
こんな感じでimportを関数のように利用して遅延読み込みができるようです。

```html
<!DOCTYPE html>
<nav>
  <a href="books.html" data-entry-module="books">Books</a>
  <a href="movies.html" data-entry-module="movies">Movies</a>
  <a href="video-games.html" data-entry-module="video-games">Video Games</a>
</nav>

<main>Content will load here!</main>

<script>
  const main = document.querySelector("main");
  for (const link of document.querySelectorAll("nav > a")) {
    link.addEventListener("click", e => {
      e.preventDefault();

      import(`./section-modules/${link.dataset.entryModule}.js`)
        .then(module => {
          module.loadPageInto(main);
        })
        .catch(err => {
          main.textContent = err.message;
        });
    });
  }
</script>
```

# React Fiber

ReactTeam が２年以上かけて研究しているReactのコアアルゴリズムを再実装しているプロジェクトです。
Introductionだけ読むとアニメーションやレイアウトなどの適合性をより高めるために、レンダリングを複数に分割し複数のフレームに分散させてレンダリングさせるようです。
ちょっとわからないので後で読む。。。

# Inferno

9kbのReact ライクなライブラリです。`insanely fast`と書いてある通りとにかくパフォーマンスと軽量さが売りです。
ソースコードも軽量級なのでソース確認してみようかと思いました。

# Vue.js

個人的にまだ使ったことはないです。[npm trend](http://www.npmtrends.com/)ではこんな感じでした。

<img width="1022" alt="Screen Shot 2017-02-02 at 22.03.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/134294/780db8be-41a1-8c47-b18e-d1a976455be3.png">

Reactのせいで縮尺むちゃくちゃですが増えてることは間違いないです。

# CSSの噴火

BEM記法, Sass, PostCSS, CSS-in-JS, CSS Modules, styled-componentsなどCSSは混沌が続いているように感じます。
確かにこの辺はついていけてないのでもう少し落ち着くまで泣いて暮らそうかと思っています。
JavaScriptは一旦落ち着いているってのは少しながら理解（それでも流れは速く感じるが）できて、今後はWebAssemblyが一般的になってからまた色々と泣かされるかもしれません。

# Svelte

Reactなどのフレームワークとは違い、ライブラリ自体を読み込むことなくJavaScriptのランタイムのみで動かせるフレームワークです。
イメージ的にはBabelのようにJSをトランスパイルしてJavaScriptを吐き出す感じです。
こうすることで余分なフレームワークを読み込むことなく動作しますので、より軽いサイズのJavaScriptが生成できます。
リンクのブログではReactTodoMVCのコードを除いた状態で45kb(zipped), Svelteは 3.6kb （zipped）らしいです。
HelloWordの変換後のJavaScript見てるとこれも面白そうです。。。 

HelloWorld
https://svelte.technology/repl/?version=1.6.8&gist=0ed5146aa22c28410dfcff2050f3d2f8

# JAM Stack

聞いたこともない概念だったのですが、流行(って)るのでしょうか。。。
定義がちょっとよく分からないですが、JavaScriptとAPIとMarkUpでできているアプリケーションつまりSPAのことらしいです。
SPA？あーJAMStackのことねって日が来るでしょうか。。。
JavaScriptでAPIもしくはデータベースを（直接）操作できて、裏には双方向のAPIが存在してリアルタイムなデータのやり取りをするってのが今後の（今現在も）トレンドとなるってことです。

# まとめ

フロントエンドを厚めにリッチな（ブラウザ）アプリケーションのトレンドは終わらないでしょう。
これを読んでReactとWebAssemblyとサーバーサイドレンダリングとReactiveプログラミングと静的サイトジェネレータとGraphQLとVueとPostCSSと最新のCSS事情とSvelteとTC39の策定状況の確認が必要ってことが分かったので私はフロントエンドエンジニアにはなれないなぁっと改めて思いました。
ができるかぎり勉強していきたいと思います。
LINE Botは人が多いと誰が喋ってるのか認識できない

# LINE Messaging API の仕様

https://devdocs.line.me/ja/?ruby#webhooks


だれかが喋ったときにBotが受け取るデータの例。

```
{
  "events": [
    {
      "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
      "type": "message",
      "timestamp": 1462629479859,
      "source": {
        "type": "user",
        "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
      },
      "message": {
        "id": "325708",
        "type": "text",
        "text": "Hello, world"
      }
    }
  ]
}
```

# ユーザとBotが1対1のとき

![image](https://qiita-image-store.s3.amazonaws.com/0/16626/59f434ee-eeaa-4b0b-c527-ea20717c6fd9.png)

source.type="user"で来て、誰が喋ったのかはuserIdでわかる。

# グループ内での会話のとき

![image](https://qiita-image-store.s3.amazonaws.com/0/16626/50d394b1-c895-f3d7-aba6-2116ed901c1b.png)

source.type="group"で来て、どこのグループなのかはgroupIdでわかる。

<font color=red>**しかし、userIdの情報が無いので誰が喋ってるのかわからない。**</font>

# ３人以上の会話＝ルームのとき
![image](https://qiita-image-store.s3.amazonaws.com/0/16626/50f99824-cf40-07ad-1ce4-5b76aeb92473.png)

source.type="room"で来て、どこのルームなのかはroomIdでわかる。

<font color=red>**しかし、userIdの情報が無いので誰が喋ってるのかわからない。**</font>


# 盛り上げたいんだかやる気ないのかよくわからない。
どうしてこうなったてかんじ。
あと、https必須のWebHookの敷居の高さのせいで足切りされている開発者がたくさんいると思います。
sympyで線分上の最も近い点

```python
#sympyで線分上の最も近い点
from sympy import Point, Segment
senbun1 = Segment(Point(0, 0), Point(1, 1))
senbun2 = senbun1.perpendicular_bisector(Point(1, 0))
asi=senbun2.p1
print(asi)
print(float(asi.x),float(asi.y))
```
(結果)
Point2D(1/2, 1/2)
0.5 0.5
(参考)

http://qiita.com/yuba/items/2f35d1e5e162f44fc1b3

－－－－－－－－－－－－－－
【補足】(2018/07/08)

https://qiita.com/kkdd/items/b3c5e06798e59fe2768e


(20220901)
# sympyで
```python
from sympy import *
print("#",Segment(Point(0, 0), Point(1, 1)).perpendicular_bisector(Point(1, 0)))
# Segment2D(Point2D(1, 0), Point2D(1/2, 1/2))
```

```python
from sympy import *
print("#",Line(Point(0, 0), Point(1,1)).projection(Point(1, 0)))
# Point2D(1/2, 1/2)
```
[JavaScript] symbol がグローバルシンボルかどうか調べる

ある symbol が、グローバルシンボルかどうか調べれるのかなーって思ったら、`keyFor` で簡単にできる感じでした。

あと、せっかくなので wellknown-symbol かどうかも判定してみたいと思います。

---

```js
  const isGlobalSymbol = (symbol) => {
    return Symbol.keyFor(symbol) !== undefined;
  };

  const isLocalSymbol = (symbol) => {
    return Symbol.keyFor(symbol) === undefined;
  };

  const isWellknownSymbol = (function(){
    const wellknown = Object.getOwnPropertyNames(Symbol)
      .map(name => Symbol[name])
      .filter(val => typeof val === 'symbol');

    return (symbol) => {
      return wellknown.includes(symbol);
    };
  })();
```

---

#### 確認

```js
isGlobalSymbol(Symbol.for('global'))    //=> true
isLocalSymbol(Symbol.for('global'))     //=> false
isWellknownSymbol(Symbol.for('global')) //=> false

isGlobalSymbol(Symbol('local'))    //=> false
isLocalSymbol(Symbol('local'))     //=> true
isWellknownSymbol(Symbol('local')) //=> false

isGlobalSymbol(Symbol.toPrimitive)    //=> false
isLocalSymbol(Symbol.toPrimitive)     //=> true
isWellknownSymbol(Symbol.toPrimitive) //=> true
```

---

利用場面は知らんです。

終わりです。

### 参考URL

* [Symbol.keyFor() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/keyFor)
そのCRUD、必要ですか？

データベースの基本操作とされるCRUDですが、アプリで実現させる必要は必ずしもないかもしれません。

# CRUDって？

改めて説明するまでもないかもしれませんが、CRUDは「**C**reate（新規作成）」「**R**ead（データ取得）」「**U**pdate（更新）」「**D**elete」の4つをまとめて略したものです。

これらの操作はデータを扱う上で欠かせないものではあります。そして、フレームワークのScaffold機能で枠組みを一気に生成すると、たいていCRUD機能がセットでできあがってきます。

すでにある以上そのまま使いがちですが、使う方によっては不要なものも出てきます。

# CRU

まずは、D以外のCRUについて考えてみます。

ふつうCは必要ですが、「データを追加するのは管理者だけ」となれば、ユーザー側にCは必要なくなります。

Rはデータの表示ということで、特にAPIサーバとするときには必須となりますが、HTMLまでフレームワークが生成するプロジェクトでの管理画面などでは、「データ表示も編集画面と兼用する」ような構造にすればR専用の画面は不要となります。

何かしらのログのように、「一度記録してしまえばあとは編集すべきでない」ものは、U・Dを殺しておいたほうが便利です。

# D

そして、いちばん問題になるのがDです。「個人のメモ書き」や「届いたメール」のように、何とも紐付かないような単票のデータであれば、削除することにも特段の問題は生じません。しかし、多くの実用システムで使われるデータベースは**リレーショナル**なものですので、追加したデータを削除するには、相応の制約がかかってきます。

* たとえば、売上管理システムでいったん従業員を登録した場合、（誤登録で即座に削除する場合は別として）売上が上がったあとで従業員を消すとした場合、その売上は帰属未定、あるいは消滅するとなっては好ましくありません。ということで、売上を残す必要がある以上は削除できないことになります。
* Qiitaでは退会すれば投稿データも消えますが、別なサイトで「退会者のコメント」がそのまま残されていたことがありました。

ということで、リレーションに絡んでくるデータは、単純に削除してしまうわけにも行かないケースがよくあります。「論理削除」なんていう漠然とした概念でくくってしまうこともありますが、「退職者」とか「廃番」のように明確な言葉でできる状態を持つものなら、それになるよう「更新」する、というほうが適切かもしれません。

# 関連

* [DELETE_FLAG を付ける前に確認したいこと。](http://qiita.com/Jxck_/items/156d0a231c6968f2a474)
バッチファイルの生産性の低さをコードで表現してみた。

# 背景

Windowsでの開発はバッチファイルよりもPowerShellを使うべし、という主張ももはや古いと感じるほど、
PowerShellの普及は順調に進んでいるのではないかと思う今日頃ごろです。

もう、.batファイルなんか書かなくてもいいよね、書かないほうがいいよね、と思ってはいるのですが、
ふと気が付くとまた新しい.batファイルを作ってたりするわけで...

ちょっとした処理だからいいや、と思いつつも何だかんだ追加の処理を書いていくうちに
10行、20行と増え、メンテが大変になり、PowerShellで書き直すという2度手間のフラグが見え透いています。

まぁ、数十行の世界なら目をつぶれるのですが、ついついバッチファイルで分岐・ループを頑張る悪習があるので、
戒めとして、バッチファイルがどれだけ生産性が低いのかをコードとして記載しておこうと思った次第です。

※この記事では普及率がそれほどまで高くならなかったVBScript、JScriptについての言及を割愛しています。

以下、文字列を反転させる処理をBash、PowerShell、バッチファイルの順で書いています。
※Bashもついでに比べてみようと思ったので掲載。

# Bash

Bashで文字列を反転させる場合は、処理を書く必要もなく、コマンドで済みます。

``` Bash
~$ echo abcdefg | rev
gfedcba
```

それだと、つまらな過ぎるのであえて関数を作ってみる。

``` Bash
#!/bin/bash

function reverse()
{
	local -r _SOURCE=$1
	local _reversed
	for (( i=${#_SOURCE} - 1; -1 < i; i-- ))
	do
	    _reversed=$_reversed${_SOURCE:$i:1}
	done
	echo $_reversed
}
```

実行結果

``` Bash
~$ . reverse.sh
~$ reverse abcdefg
gfedcba
```

revコマンドを使用しなくても、まぁ問題なく書けるし読める。
文字数や文字列の抽出の書き方は忘れがちになるんですけどね。

# PowerShell

続きまして、PowerShell。

``` PowerShell
<#
.Synopsis
   文字列を反転させる関数
#>
function Reverse
{
    [OutputType([string])]
    Param
    (
        # 反転対象となる文字列
        [Parameter(Mandatory=$true, Position=0)]
        [string]
        $Source
    )
    $reversed=""
    ($Source.Length - 1) .. 0 | % {$reversed += $Source[$_]}
    return $reversed
}
```
実行結果

``` PowerShell
PS >. ".\Reverse.ps1"
PS >Reverse abcdefg
gfedcba
```

ちょっと、長く感じたかもしれませんが、実際に反転処理している部分だけみると、Bashよりかはシンプルかと。
ここらへんは、さすがPowerShellのパイプ。

# バッチファイル

最後にバッチファイル。

``` bat
@echo off

setlocal EnableDelayedExpansion
pushd %~0\..

rem ----------------------------------------
rem 文字列を反転させる
rem ----------------------------------------
set source=%~1
set reversed=
call :Length "%source%" out
set /a len=%out% - 1

for /l %%I in (%len%, -1, 0) do (
  set reversed=!reversed!!source:~%%I,1!
)

echo %reversed%
goto :EOF
endlocal

rem ----------------------------------------
rem 文字列の長さを返す関数
rem 
rem @第1引数 対象文字列
rem @戻り値 文字数
rem 
rem 使用禁止文字：!"%&'=^~|;,?
rem ----------------------------------------
:Length
setlocal
set i=0
set t=%~1
If "%t%"=="" endlocal & set %2=0 & goto :EOF
:CONTINUE
set t=%t:~1%
set /a i+=1
if not "%t%"=="" goto CONTINUE
endlocal & set %2=%i%
goto :EOF
```
実行結果

``` bat
C\:>reverse.bat abcdefg
gfedcba
```

コードではLength関数みたいなものを作っていますが、
バッチファイルにはそもそも関数みたいな機能はなく、
あくまでラベル構文を利用して関数みたいなものを作っています。
ググると割とやっている人が多いので、今回はこういう感じにしました。

# まとめ
バッチファイルを今までよく書いたことない方は意味不明な部分がきっと多いと思います。
わかる人でも、１から書こうとするには一苦労。
遅延環境変数の展開とか慣れてないと、とにかくややこしい。（変数参照するのに%か!で悩むとか...）
基本的な処理のコマンドやら関数が乏しいことに加え、
たとえ頑張って複雑な処理を書いてもよく使用禁止文字が出てきてしまいます。

やっぱこれを見ると、つくづくバッチファイルには限界を感じますね。

※記事全体でバッチファイルについて否定的なことしか述べてませんが、
　私自身はバッチファイルの独特過ぎる構文は割と好きです。('ω')
【UNION以外もあるよ】SQLの集合演算子

職場で聞かれて自信を持って答えられなかったので、再学習メモ

環境:oracle 11g



準備でとりあえず1~100までの数字を用意します。

```sql:
with number_table as(
 select RowNum as num from dict where RowNum <=100
)
```

※なんか適当な検証したい時、一括で数字の行を扱う良い方法があれば教えてくださいm(_ _)m

以下の2つの集合を前提に話を勧めます

A = {1,2,3}

```sql:A
select * from number_table where num in (1,2,3)
```

B = {3,4,5}

```sql:B
select * from number_table where num in (3,4,5)
```

#和集合

```math:
A \cup B
```

恐らく一番使う機会が多いはずです。
そのためか通常SQLを学習するとき、和集合以外の集合演算子を習わないことが多い気がします。

## UNION 

みなさんご存知 UNION
A,Bに含まれる要素全てが結果となる。
ただし重複要素は1行にまとめられてしまいます。

```sql:UNION
select * from number_table where num in (1,2,3)

UNION

select * from number_table where num in (3,4,5)
```

結果
{1,2,3,4,5}

実際の業務では、分割された複雑なクエリの結果を無理やりつなげるような用途に使われている気がします(笑)。
重複業は1行にまとめられてしまうので、全行出したい場合は以下のUNION ALLを。
ちなみにUNION ALLはこの重複の削除を行わない分UNIONに比べパフォーマンスがいいです。



## UNION ALL

A,Bに含まれる要素全てが結果となる。
重複要素も全件出ます。

```sql:UNION
select * from number_table where num in (1,2,3)

UNION ALL

select * from number_table where num in (3,4,5)
```

結果
{1,2,3,3,4,5}


# 差集合

```math:
A - B
```


MySQLではサポートされていないそうなので工夫してください。
http://qiita.com/Hiraku/items/71873bf31e503eb1b4e1

## EXCEPT
標準の差集合の演算子はEXCEPT。
ただし今回検証に利用したORACLEではサポートされていなかったので
下記のMINUSのみ検証します。
※oracle以外の人はEXCEPTを利用してください。

## MINUS

Aに含まれるがBに含まれない要素が結果となる。

```sql:MINUS
select * from number_table where num in (1,2,3)

MINUS

select * from number_table where num in (3,4,5)
```

結果
{1,2}

# 積集合

```math: 
A \cap B
```

共通部分を探したい時に使えます。
和集合・差集合の演算子より優先して実行されるため、注意が必要です。
優先順位を変えたい場合は()を使って工夫してください。

※またまたMySQLではサポートされていないそうです。
自己結合などで工夫してください。
http://wiki.minaco.net/index.php?MySQL%2F積集合


## INTERSECT
AとB両方に含まれる要素が結果となる。

```sql:INTERSECT
select * from number_table where num in (1,2,3)

INTERSECT

select * from number_table where num in (3,4,5)
```

結果
{3}

# 関係除算

そいうえば割り算もあると本に書いてあったのを思い出して追記。

SQLの演算子としてはサポートされていませんが、
こちらの解説がわかりやすいと思います。
http://www.k4.dion.ne.jp/~type_f/23S_L4/23S_L4DB_09.html

ただし、以下の方法によってSQLでも関係除算を行うことが出来ます

- 1 NOT EXISTSを入れ子にする
- 2 HAVING句を使った一対一対応を利用する
- 3 割り算を引き算で表現する

出展:達人に学ぶSQL徹底指南書
※気が向いたら加筆します。

# 使い所

これら集合演算子は、出力の形式(データ型、カラム数)が同一の結果に対して使うことが出来ます。
分割された複雑なクエリの結果を無理やりつなげるような用途にも使えますが、
複数テーブル間をまたいだ不正データの調査の時にかなり使えます。
今の職場では複数のバージョンのバッチ処理の結果を別テーブルに比較して、集合演算子を使って、バグの調査などに使っています。
vimでインサートモードを抜ける時のあれ（vimscript編）

[vimでインサートモードを抜ける時のあれ（Hammerspoon版その2)](http://qiita.com/oppara/items/5f70c9e67415a0a16979)

---

## きっかけ

[Vim でインサートモードを抜けた時にインプットメソッドを切り替える](https://mitsuse.jp/2017/01/02/disable-input-source-on-insert-leave-in-vim/)
:bulb:！！


## やってみた

```vim:.vimrc
if executable('keyboardSwitcher')
  autocmd InsertLeave * :call system('keyboardSwitcher select U.S.')
endif
```

## 結果

反応遅すぎてつらい
`swim` を使用した場合も同様
c_n1256_grammar_refs C言語の文法を見る別の方法

https://github.com/Arczzir/c_n1256_grammar_refs

[CGrammarRefs_v1.zip](https://raw.githubusercontent.com/Arczzir/c_n1256_grammar_refs/master/CGrammarRefs_v1.zip)の中にあるmacOS アプリを使って、C言語の文法を別の方でみることができます。
Googleスプレッドシートに東京の日の出・日の入り時間を表示する。

#概要
*※当記事の掲載については、国立天文台 暦計算室様より内容のご確認を頂いております。*

東京の日の出・日の入り時間を国立天文台 天文情報センターのWebページより取得し、Googleスプレッドシートに表示する。
国立天文台 天文情報センター 暦計算室のページはこちら。
http://eco.mtk.nao.ac.jp/koyomi/

#手順
##1.新規にスプレッドシートを作成、IMPORTHTML関数で2016年1月のデータ取得
シート「ソース」を作成し、値を設定する。
```
セル「A1」：2016
セル「B1」：s1301
セル「C1」：=IMPORTHTML("http://eco.mtk.nao.ac.jp/koyomi/dni/"&A1&"/"&B1&".html","table",1)
```

「補足」
・2016（年）
・s1301（sは日の出入り、mは月の出入り。13は東京の番号。01は月）

![koyomi1.png](https://qiita-image-store.s3.amazonaws.com/0/106673/9a628c1a-8166-1b70-05de-0b18cb6cb042.png)

##2.取得する月の分だけ1.を繰り返す
1.を設定すると、32行目までデータが自動で取得されるので、33行目に下記を設定
```
セル「A33」：2016
セル「B33」：s1302
セル「C33」：C1の計算式をそのままコピペ
```

![koyomi2.png](https://qiita-image-store.s3.amazonaws.com/0/106673/23a1d004-515a-a445-a7a5-fc0eb032f2aa.png)

次は63行目に3月のデータと必要な月分繰り返す

##3.マージするシートを作成
新規シート「データ」を作成し、値を設定する。
セル「A1」：=UNIQUE('ソース'!C:I)

![koyomi3.png](https://qiita-image-store.s3.amazonaws.com/0/106673/fec38ff0-d682-6451-3a4e-c8c6af1ab3ba.png)

欲しいデータが一覧で表示される。

ヘッダ部が文字化けしているが、元のページで確認する。
列A：年月日
列B：出
列C：方位[°]
列D：南中
列E：高度[°]
列F：入り
列G：方位[°]

#まとめ
Googleスプレッドシートの機能を使えば、スクレイピングのプログラムを書くことなく、webページのデータを取得する事が可能

*国立天文台 暦計算室様*
*ご確認、補足頂きましてありがとうございました。*
ローカルサーバを停止せずにターミナルを閉じてしまいました。

##概要

タイトルの通りです。

これをやったことで何が起こるかと言いますと・・・

「ターミナルを再起動した時にローカルサーバーが立ち上がらない」

という状況に陥ります。

めっちゃハマりました。

私の場合

`$ rails s -b 0.0.0.0`

で起動させていて、この時に出るメッセージがこちら。

`Address already in use - bind(2) for "0.0.0.0" port 3000`

そして調べているうちに出てきた起動方法がこちら

`$ rails s Puma`

この時は特にメッセージは出てこなかったのですが、

実際にブラウザで確認してみると「localhostは機能していません」

と出てしまう状況でした。

##対処法

こちらを参考にさせていただきました。

[http://arakaji.hatenablog.com/entry/2015/08/03/200502:title]


[http://qiita.com/nagao_norihiro/items/aba40bd4e0eac9f9a92d:title]


###具体的な解決方法
まずはこの3000が既に使われているとのことでしたので、そこを調べました。

`$ lsof -i :3000`

出てきた結果はこちらです。

```
COMMAND   PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby     7620 takagimarin   12u  IPv6 0x7d655025f170834b      0t0  TCP localhost:hbci (L
ISTEN)
ruby     7621 takagimarin   12u  IPv6 0x7d655025f170834b      0t0  TCP localhost:hbci (L
ISTEN)
ruby    11748 takagimarin    9u  IPv4 0x7d655025f47508a3      0t0  TCP *:hbci (LISTEN)
rub
```

PID接続してるものが原因とのことでしたので、killコマンドで消しました。

```
$ kill -QUIT 7620
$ kill -QUIT 7621
$ kill -QUIT 11748
$ kill -QUIT 11752
```

これで実行できるようになりました！

##まとめ
PIDについては深く調べていないので、今後ひと段落したら調べてみます。

しかしこれでたまに動かなくなっていたローカルサーバーの原因がわかったので良かったです。

ターミナルを閉じる時はきちんとサーバーを終了してからにしましょう(笑)
JSON文字列をDictionaryに変換する

JSONに含まれるある項目が、暗号化されて更にBase64 EncodeされたJSON文字列ってことがあって、一旦Dictionaryとして扱いたかったので調べたメモ。

`JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]` くらいで出来るので、意外と簡単でした。
変換に失敗した際にエラーが投げられるので、利用する際は適切にハンドリングするようにしましょう。

```swift
let json = "{\"fuga\":\"aiueo\",\"foo\":999,\"user\":{\"name\":\"tenten0213\",\"age\":30}}"
let data = json.data(using: .utf8)!

do {
    let dic = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] // ["fuga": "aiueo", "user": ["name": "tenten0213", "age": 30], "foo": 999]
    dic?["fuga"] // "aiueo"
    let user = dic?["user"] as? [String: Any] // ["name": "tenten0213", "age": 30]
    user?["name"] as? String // "tenten0213"
    user?["age"] as? Int // 30
} catch {
    print(error.localizedDescription)
}
```

…実は、[SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)や[ObjectMapper](https://github.com/Hearst-DD/ObjectMapper)で出来ないか調べて結構時間を使ってしまったので反省:no_mouth:
Railsで定数(APIキーやAPIのURL、消費税掛け率など)を管理するgem「config」の使い方

# GEM「config」の概要

タイトルにもあるように定数関係を管理するときにconfigは大変便利。
※もともとはrails_configとかっていう名前だったようですね([参考](http://qiita.com/yumiyon/items/32c6afb5e2e5b7ff369e))

# インストール

Gemfileに

```rb
gem 'config'
```

で、bundle installしましょう。
その後、

```sh
$ rails g config:install
create  config/initializers/config.rb
create  config/settings.yml
create  config/settings.local.yml
create  config/settings
create  config/settings/development.yml
create  config/settings/production.yml
create  config/settings/test.yml
append  .gitignore
```
コマンドを放つと、色々ファイルがジェネレートされますが、よく使うのは「config/settings.yml」です。
全体的に適用する場合は config/settings.yml に記載を足しましょう。

開発環境(RAILS_ENV=development)だけにとかであれば config/settings/development.yml に記載する。同様にproduction用とかtest用とかのファイルを作ってくれています。

# 設定例
```rb
google:
  api_key: A***S*******R*********AL***8*S****m**p8
```

```rb
price:
  consumption_tax: 1.08
```
などが書き方。あくまでただのymlなので書きやすい。

api_keyを保存しておいたり、apiの問い合わせ先のURLを書いておいたり、特定条件下のときに必ずつけたいパラメータを書いておいたりとかに使えます。

# 表示例

```haml
= Settings.google.api_key
= Settings.price.consumption_tax
```

Settingsの後ろに設定した名前を書くだけの簡単仕様です。
Testlinkのアップグレード(1.8.0 -> 1.9.16)

長年停止してた仮想マシンに眠っていたTestLinkのDBを最新バージョンへ移行した作業をメモ。

# 環境
## アップグレード前
* CentOS 6.5
* Mysql 8.24
* PHP 5.3.3
* Apache 2.2.15

## アップグレード後
* CentOS 7.3
* MariaDB 5.5 
* PHP 7.0.15
* Nginx 1.11.8

# 旧環境のバックアップ

* DBはmysqldumpでバックアップ
* **upload_area**ディレクトリをバックアップ
* 必要なら**logs**ディレクトリバックアップ

# 新環境の準備
0. MariaDB、Nginx、PHP、PHP-FPMをインストール
0. nginx.confをTestLinkに合わせて変更
0. 古い環境のDBを復元
0. TestLink 1.9.16をダウンロードして展開(設置のデフォルトパスが/var/testlinkになっているのでそちらに展開)
0. **upload_area**ディレクトリと**logs**ディレクトリを復元

# DBのアップグレード
0. ./install/sql/alter_tables/に有るSQLファイルをDBに合わせて順番に実効する
0. ./install/sql/alter_tables/1.9/mysql/DB.1.3/step1/db_schema_update.sql
  0. **1.9**はアップグレード先のバージョン
  1. **DB.1.3**は現在のDBのバージョン (バージョンはTestLinkDBのversionテーブルで確認する)
  2. **step1**→**stepZ**の順番で実行する。(stepZが無い場合も有る)
0. 今回は、1.9→1.9.4→1.9.6→1.9.8→1.9.9→1.9.10→1.9.11→1.9.12→1.9.13→1.9.14→1.9.15→1.9.16の順で実行
0. /install/sql/alter_tables/1.9.15/mysql/DB.1.9.15/step1/db_schema_update.sql
はそのまま実行するとエラーになるため**datetime**の部分を**timestamp**へ変更する必要がある
jenkinsを捨てrundeckに移行した話

#1. 背景

もともと自動化ツールとしてjenkinsを使用していました。
実際４年ほど前からjenkinsにはお世話になりっぱなしで良いツールでしたが
プラグイン管理が大変だったり、イケてない部分もあったので既に社内で実績のあるrundeckに移行する形になりました。
また同時にcronで管理していたbatchに関してもrundeckに移行しました。
詳細は後述ですが、対象が複数インスタンス存在してもnodeによる集約管理できるため、インスタンス毎のcron設定から開放されました。

#2. メリット（移行理由）

実際に検証・導入した結果のメリットが下記になります。
※詳細は後述。

1. 柔軟なジョブ作成が可能。
2. 複数ノードを一括管理できる。
3. GUIがリッチ

###2.1 柔軟なジョブ作成が可能。

##### 2.1.1 様々な種別のステップを登録可能

　
図１:ジョブ内のステップ登録
<img width="1143" alt="スクリーンショット 2017-02-02 午後7.13.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/eb2d800e-e5c7-c02d-8b1d-2c7cbf46f17b.png">


上記がjob内で管理するstep一覧ですが、コマンド、スクリプト、jobのインポートなど自在に実行できます。
stepとはジョブ内で管理するタスクのようなもので、複数定義可能です。

##### 2.1.2 ジョブ内で管理する多様なワークフロー

図１のタブにNodeStepsとWorkflowStepsとありますが、これはstep実行のフローに関する設定で、
下記のようにノードが複数存在する場合(web01,web02)ノード毎に実行するか、ステップごとに実行するかを選択できます。


```title:NodeSteps
webサーバ01
 |_step1
 |_step2
 |_step3

webサーバ02
 |_step1
 |_step2
 |_step3
```

```title:WorkflowSteps
step1
 |_webサーバ01
 |_webサーバ02

step2
 |_webサーバ01
 |_webサーバ02

step3
 |_webサーバ01
 |_webサーバ02
```


##### 2.1.3 柔軟なハンドリング

また下記のようにステップAが成功したらステップBへ、失敗したらステップEへなどのハンドリングも可能です。


```
                                        |-- success---> stepC
           |----- success --> stepB ----|
stepA -----|                            |
           |                            |--  error ---> stepD
           |
           |-----  error ---> stepE     

```

###2.2 複数ノードを一括管理できる。


スケジューラで複数インスタンスに対してbatch処理を実行する、
複数インスタンスに対してデプロイする、といった複数インスタンスに対してジョブを実行したいということは
多いですが図２で指定が可能です。

図2: Node指定
<img width="1300" alt="スクリーンショット 2017-02-02 午後7.41.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/7267aed3-8cbb-1f97-2d21-4fedafe4dd8c.png">


###2.3 GUIがリッチ


rundeckの使用は初めてでしたが、豊富なGUIのため特に何も調べることなくジョブの作成などが行えました。
もちろんCLIも用意されています。

図3はスケジューラに関する設定ですが、ポチポチと押しながらスムーズに設定が可能です。
また図４のように慣れ親しんだcronのような設定も可能です。

図3: スケジューラ周り設定
<img width="1360" alt="スクリーンショット 2017-02-02 午後7.46.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/73ac383c-2f64-3479-b4b3-438628e079cd.png">


図4: スケジューラcronによる設定
<img width="1387" alt="スクリーンショット 2017-02-02 午後7.46.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/a3ddb779-bcfe-59c0-d928-a1dad92c1082.png">

# 終わりに

短いですが、以上がrundeckに移行した理由になります。
AWSとの親和性も高く組み合わせることで様々なことを自動化できそうです。
また新たな発見があれば記載したいと思います。
Openboxでデスクトップ移動の設定





ウィンドウマネージャーで、デスクトップの移動をする時の設定




## 設定


以下を追加


```xml:~/.config/openbox/rc.xml
<keybind key="Alt-P">
   <action name="DesktopRight">
       <wrap>no</wrap>
   </action>
</keybind>
<keybind key="Alt-N">
    <action name="DesktopLeft">
        <wrap>no</wrap>
    </action>
</keybind>
```
webjarsでデプロイしたアーティファクトをGradleで利用する

# WebJarsとは

http://www.webjars.org/

- JavaScript/CSSをjarで配布し、MavenやGradleで利用できる。

# WebJarsの種類

3つの種類がある。
利用したいモジュールがない場合は、追加していくことができます。
特にNPM/Bowerは、公開されているモジュールを簡単に登録できるので便利。

- NPM WebJars
  - [NPM](https://www.npmjs.com/)で公開されているモジュールをjarにしたもの
- Bower WebJars
  - [Bower](https://bower.io/)で公開されているモジュールをjarにしたもの
- Classic WebJars
  - NPM/Bower以外のモジュール
  - 新規モジュールの登録は申請が必要

# 登録したWebjarsをすぐに使いたい

NPM/Bowerは、利用したいモジュールやバージョンが登録されていなくても、webjarsのサイト上で簡単に登録できます。
登録したwebjarsはMavenCentralリポジトリで公開されるようですが、反映までに時間がかかるようです。

新規登録したwebjarsをすぐに利用したい場合は、リポジトリを追加することで対応できます。

```groovy:build.gradle
repositories {
	maven {
		url 'https://dl.bintray.com/webjars/maven/'
	}
}

dependencies {
	compile('org.webjars.npm:jquery:3.1.1')
}
```
修論卒論pdfの遊び方

#あそびかた
皆さまお疲れ様です．
終わってから提出ディレクトリで遊んでました．
さて，楽しいコマンドは以下から

* pdfページ数一覧
 
```
find .  -name "*.pdf" ! -name ".*"|xargs -n1 pdfinfo|grep Pages|sort
```

* 提出時間を集計

```
find .  -name "*.pdf" ! -name ".*"|xargs -n1 pdfinfo|grep CreationDate|sed -e "s/^.* \([0-9][0-9]:[0-9][0-9]\).*$/\1/"|sort -n|uniq -c
```

* ファイル容量一覧

```
find .  -name "*.pdf" ! -name ".*"|xargs ls -lu|du -h|sort -n
```
php-fpm 複数共存時のメモ


PHP5.6 もばりばり現役やけど、新規プロジェクトはPHP7でやろうかな？ なとき、開発サーバを新たにたてるのはもったいないし、共存させたーい＠AmazonLinux

# 概要
alternativesの支配下です。

# ちょっと調べた
.ini はバージョンごとにあるけど、素のphp-fpm-xyは/etc/php-fpm.confを見に行っちゃうんだな。。。
で、straceでみてみると、先に/etc/sysconfig/php-fpm-x.y見にいってるじゃん。

# 設定
/etc/sysconfig/php-fpm-x.y
```
OPTIONS="-y /etc/php-fpm-x.y.conf"
```
(x,yはバージョン番号)
[Java] Java起動時のプロキシ設定方法

Javaのネットワークプロキシ設定方法メモ

```bash:proxy設定
-Dhttp.proxyHost=proxy.exsample.com -Dhttp.proxyPort=8080
-Dhttps.proxyHost=proxy.exsample.com -Dhttps.proxyPort=8080
-Dhttp.nonProxyHosts="localhost|127.0.0.1|192.168.*.*" 
```

# 参考
[java - How do I set the proxy to be used by the JVM - Stack Overflow](http://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm)
Feature Flag 管理ライブラリ Flagship の紹介

# @yuya_takeyama 

* Software Engineer at Quipper
  * Ruby/Rails
  * JavaScript
* 活動
  * ブログ: https://blog.yuyat.jp
  * Twitter: [@yuya_takeyama](https://twitter.com/yuya_takeyama)
  * GitHub: [@yuya-takeyama](https://github.com/yuya-takeyama)
    * Creator of [jr: jq like JSON processor for Rubyists](https://github.com/yuya-takeyama/jr)
    * Maintainer of [woothee-php](https://github.com/woothee/woothee-php)

---

# 今日の内容

* Quipper における Feature Flag
* 解決したかった問題
* [Flagship](https://github.com/yuya-takeyama/flagship) の紹介

---

# Feature Flag とは

* 個別の機能を On/Off するためのフラグの管理機構
* コード自体はマージしているが、リリースはまだしたくない、タイミングをコントロールしたい
* 一旦社内スタッフだけに有効化してテストしたい
* テスト環境でだけ有効化したい

---

# Quipper における Feature Flag

* 教育プラットフォームをグローバルに展開
  * フィリピン、インドネシア、メキシコ、日本、その他
* 一部マーケットごとに出したり隠したりしたい機能がある
  * コンテンツの都合で、リリースタイミングが違ったりする
* 学年によって出しわけたかったりもする
  * 例: 試験対策機能は小学生には出さない

---

# QuipperSchoolとスタディサプリ

* Global: Quipper School
* 日本: スタディサプリ
* 基本的にソースは 1 つで、環境変数等で一部変えてデプロイしている
  * アプリ・リポジトリとしては機能ごとに複数に分かれています (生徒向け・先生向け・コンテンツ制作者向け、等)
* それぞれごとの Feature Flag を管理する必要がある

---

# これまでの実装

* 仕組みが複数あった
* YAML で静的に持っているもの
* たくさんの if 文で動的に持っているもの
  * API 側の実装は ugly だが、クライアントサイドでは `user.hasFeature('foo')` みたいな感じでいい感じに取れる
* ひとつにまとめたかった

---

# 解決したかった問題

* 複数の Feature Flag のまとまりを管理する
* Ruby の DSL で宣言的に書きたい
  * Ruby で書けるなら大体のことはできる
  * それでいて設定ファイルっぽい感じにはしたい
* あと開発とかの都合で環境変数とかでサクッと On/Off できると便利そう

---

# [:flags: Flagship :ship:](https://github.com/yuya-takeyama/flagship)

---

# 定義

```rb
Flagship.define :quipperschool do
  enable :a_stable_feature

  enable :an_experimental_feature, if: -> {
    context.current_user.staff?
  }

  disable :deprecated_feature
end

Flagship.define :studysapuri do
  # ...
end

# before_action の中とかで
Flagship.select_flagset(:quipperschool)
```

---

# 分岐

単純に if 文 :sweat_smile: 

```rb
if Flagship.enabled?(:an_experimental_feature)
  # ---
end
```

---

# コンテキスト変数

動的な判定を行う時に必要な値をセットしておける。

```rb
# 値をセットする
Flagship.set_context :current_user, current_user

# メソッドをセットすることもできる
Flagship.set_context :current_user, method(:current_user)

# それを使った定義 (先のスライドにも出てましたが)
Flagship.define :quipperschool do
  enable :an_experimental_feature, if: -> {
    context.current_user.staff?
  }
end
```

# 環境変数による On/Off

* `FLAGSHIP_***` という変数に `true` / `false` を指定すると強制的に上書きできる
* コードのデプロイとは別のタイミングでリリースをタイミングできる

---

# その他の機能

* タグ (メタデータによる機能の分類)
  * API からある機能群の On/Off をまとめて返したいときとかに使う
* ヘルパーメソッド
  * フラグの定義に必要な処理を DSL 内で共通化できる
* 継承
  * 本番と開発環境で微妙に違う、みたいな時にベースの定義から継承できる

---

# 稼働実績

* Quipper School では先々週ぐらいから Flagship で機能がひとつ ship された
* スタディサプリではちょうど今日 (!) 機能がひとつ ship された
* 機能のやり方 (YAML とか) からの移行は徐々にやっていく

---

# 今後やりたいこと

* 一部ユーザ (全体の 10% とか) のみへのリリース、とかも必要そうになれば
  * いわゆるカナリアリリース

---

# ご清聴ありがとうございました
javascriptでhtml要素を複数追加するときの【ひと目で分かる】書き方

# やりたいこと
javascriptでhtml要素を追加するときに**【一目でわかる様に】**書きたい。

# 追加するもの
li要素の中にはdiv, input, a,の3つの要素が入れて
ul要素の中にli要素を入れる。

**イメージはこんな感じ**
li << (div, input, a)
ul << li
# ひと目で分かるとは？
javascriptのファイル上で、まるでhtmlファイルを見ている様なコード。

# 実際のjavascript上のコード
### 基本方針
- 文末の + で繋げつつ、インデントの様に書く
- 変数以外を文字列として書く
- 変数は扱いが厄介なので後で.findを使って入れる

![スクリーンショット 2017-02-02 20.38.43.png](https://qiita-image-store.s3.amazonaws.com/0/145707/f1d08c98-fd9c-e3d9-65c3-7c6ef602d7c2.png)


```javascript:groups.js
  function appendSeacrhList(name, id){
    $(
      '<li class="box">' +
        '<div class="searched_user"></div>' +
        '<input type="hidden" class="user_id" name="" value="">' +
        '<a href="javascript:void(0)" class="add_button">追加</a>' +
      '</li>'
    )
    .find('.searched_user').text(name).end()
    .find('.user_id').val(id).end()
    .appendTo(searched_user_list)
  };
```

## この部分で変数```name```と```id```を埋め込んでます

```javascript:groups.js
.find('.searched_user').text(name).end()
.find('.user_id').val(id).end()
```

### ※ちなみに
上記の```.end()```がめちゃくちゃ大事です。
```.find('.searched_user')```した時点で```<div class="searched_user"></div>```というオブジェクトのみ取ってくる形になっています。
```.end()```することによって1つ戻り、```$('<li class="box" ~~~ /li>)```までを取得してきています。

例えば、2つ目の```.end()```がなかった場合は
```<input type="hidden" class="user_id" name="" value="">```
という部分のみappendされることになります。
### 最後に
rryu様に指摘いただいた方法で書き直させていただきました。
ありがとうございます！

##番外編；最近買った、面白いもの
[・ハンターハンター34巻（6/29）](http://amzn.to/2u6iUc4)
クロロ VS ヒソカとか、どうやっても面白くなるとしか
[・カーテン自動開閉ロボット](http://amzn.to/2u6LHwS)
カーテンレールに付ける4000円のロボット。
これを付けてから目覚ましなしで起きられる率が上がった。
[・衛藤美彩 写真集](http://amzn.to/2tcFfIz)
「綺麗なお姉さん」が好きな人、ちょっと眺めてるだけで幸せになれますよ。
Deviseでconfirmableの登録確認メールを受け取れない場合に登録を完了させる方法

## 概要

Deviseでconfirmable利用時にメールを送信できない、且つ、letter_openerなども使えない場合にどうやって登録を完了させるかを調べたのでメモ

## 環境

Ruby: 2.4.0
Rails: 5.0.1
Devise: 4.2.0

## 手順

* Webの画面でemail, passwordを入力する
* rails consoleで該当のUserを取得
* Devise::Models::Confirmable#send_confirmation_instructionsを実行して、Mail objectを取得し、bodyをconsoleに表示させる
* 本文中のURLをコピーしてブラウザで開く
* Webの画面で変更するパスワードを入力して、登録を完了させる

```
> User.find(1).send_confirmation_instructions.body
   (0.2ms)  BEGIN
   (0.2ms)  COMMIT
  Rendering devise/mailer/confirmation_instructions.html.slim
  Rendered devise/mailer/confirmation_instructions.html.slim (0.6ms)
Devise::Mailer#confirmation_instructions: processed outbound mail in 115.8ms
Sent mail to fooooo+test5@test.cdd (4.1ms)
Date: Thu, 02 Feb 2017 17:36:46 +0900
From: please-change-me-at-config-initializers-devise@example.com
Reply-To: please-change-me-at-config-initializers-devise@example.com
To: fooooo+test5@test.cdd
Message-ID: <5892ef9eb1cea_1f423fd11ec464fc438b8@fooooo.mail>
Subject: xxxxx
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: base64

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

=> #<Mail::Body:0x007fa246f96100
 @boundary=nil,
 @charset=nil,
 @encoding="8bit",
 @epilogue=nil,
 @part_sort_order=["text/plain", "text/enriched", "text/html"],
 @parts=[],
 @preamble=nil,
 @raw_source=
  "<p>ようこそ、fooooo+test5@test.cddさん!</p><p>次のリンクでメールアドレスの確認が完了します:</p>
<p>

<a href=\"http://localhost:3000/users/confirmation?confirmation_token=xxxxxxxxxxxxxxxx&amp;locale=ja\">アカウント確認</a>
↑このURLをコピーして、ブラウザで開く
</p>">　　　　　　　　　　
```

## あとがき

letter_openerの素晴らしさを享受していたので使えない環境の場合どうするのか？とか思っていたが、Deviseも良く出来たライブラリだったので、意外と簡単に出来た
が、あまり情報は無かったので、やっぱレアケースなんだなと認識した
Vagrant+CentOS7でHTTP接続できなかった問題


Vagrantを使ってCentOS+Nginxの開発環境を作っていてHTTP接続できなかったときの解決方法

## 解決方法
Vagrantfileに下記を追記する

```Vagrantfile
  config.vm.provision "shell",
    run: "always",
    inline: "nmcli connection reload;systemctl restart network.service"
```

## 原因
CentOS7の場合network.serviceを再起動させないとprivate_networkが反映されない。
毎回それを気にするのもめんどくさいのでVagrantfileに記載して自動的に実行されるようにする
Xcode8で行数を表示させる方法

# xcode -> Preferences

![スクリーンショット 2017-02-02 18.20.37.png](https://qiita-image-store.s3.amazonaws.com/0/135794/81b4e689-045e-4943-4fd6-5f4fa86abfcb.png)


#Text Editing
![スクリーンショット 2017-02-02 18.20.57.png](https://qiita-image-store.s3.amazonaws.com/0/135794/0ddef036-c8b7-0d8f-6e11-cc5f8c2eb292.png)


# Line Number!!
![スクリーンショット 2017-02-02 18.21.12.png](https://qiita-image-store.s3.amazonaws.com/0/135794/128355a6-4848-f7b8-5669-630a5f7ef3e5.png)
特定タグの前後にスタイルを適用する書き方＋改行する書き方

#内容
下記のようなspanタグの前後にスタイルを適用したい場合の書き方。

```html:
<p>あいうえお<span id="target">かきくけこ</span>さしすせそ</p>
```

#記述方法

```css:特定タグ前にスタイルを適用
#target:before{
	content: "\A";
	white-space: pre;
}
```


```css:特定タグ前にスタイルを適用
#target:before{
	content: "\A";
	white-space: pre;
}
```

中身に当てているスタイルは改行

```css:改行スタイル
	content: "\A";
	white-space: pre;
```
基本的なコマンドがDockerイメージにインストールされているかを確認する

Dockerfileを書くときに、どのDockerイメージにどのコマンドがインストールされているのか確認してみました。

## 確認方法 ##

以下のスクリプトを実行。

```bash
#!/bin/bash

images=(
  oraclelinux:7.3
  debian:jessie
  buildpack-deps:jessie-scm
  alpine:3.5
  ubuntu:16.04
)

commands=(
  awk
  bash
  curl
  git
  make
  python
  python3
  wget
)

for image in "${images[@]}"; do
  docker pull "$image"
done

for image in "${images[@]}"; do
  echo "### $image ###"
  for com in "${commands[@]}"; do
    echo "echo $com: \$(command -v $com 2>/dev/null || echo 'not found')" | docker run -i --rm "$image" sh
  done
  echo
done
```

## 確認結果 ##

```
### oraclelinux:7.3 ###
awk: /usr/bin/awk
bash: /usr/bin/bash
curl: /usr/bin/curl
git: not found
make: not found
python: /usr/bin/python
python3: not found
wget: not found

### debian:jessie ###
awk: /usr/bin/awk
bash: /bin/bash
curl: not found
git: not found
make: not found
python: not found
python3: not found
wget: not found

### buildpack-deps:jessie-scm ###
awk: /usr/bin/awk
bash: /bin/bash
curl: /usr/bin/curl
git: /usr/bin/git
make: not found
python: /usr/bin/python
python3: not found
wget: /usr/bin/wget

### alpine:3.5 ###
awk: /usr/bin/awk
bash: not found
curl: not found
git: not found
make: not found
python: not found
python3: not found
wget: /usr/bin/wget

### ubuntu:16.04 ###
awk: /usr/bin/awk
bash: /bin/bash
curl: not found
git: not found
make: not found
python: not found
python3: not found
wget: not found
```
Kinect v2をOpenNI2経由(libfreenect2のドライバ)で使うと、遠くのデプスが取れない問題

KinectをMacやLinuxで使いたい場合、Kinect SDK(Windows専用)の代わりにOpenNI2を使うことが多い。このとき用いるドライバとして有名なのがlibfreenect2である。
https://github.com/OpenKinect/libfreenect2

しかし、この環境を構築し実際にKinectを動かすと、Kinect SDKに比べて、デプス画像で取得可能なデプスのレンジが明らかに小さくなってしまう。（しまわない場合もあるのかな？）

この問題を解決するには、libfreenect2をbuildしてdriverを作成する前に、以下のようにドライバのソースに手を加える必要がある。
[![https://gyazo.com/ce96e27f10f0dacdcb324afb92032782](https://i.gyazo.com/ce96e27f10f0dacdcb324afb92032782.png)](https://gyazo.com/ce96e27f10f0dacdcb324afb92032782)
https://github.com/RyoheiKomiyama/libfreenect2/commit/35e75f39b510733c1cdebc1e7583f6791011c7a6

この状態でlibfreenect2をbuildすると、Kinect v2の限界(約8m)までデプスを取得できるドライバが出力される。
MacにTensorflowをインストール

DeepLearningに触れる環境を構築したいと思い、
色々ある機械学習ライブラリの中から、まずはGoogleが公開した[TensorFlow](https://www.tensorflow.org/get_started/os_setup)をインストールする


[Tensorflow公式サイト](https://www.tensorflow.org/get_started/os_setup)

## 環境
Mac OS X El Capitan 10.11.6
Python 2.7.12
pip 8.1.2

## Pipをインストール
Pythonのパッケージ管理ツール[Pip](https://en.wikipedia.org/wiki/Pip_(package_manager))をインストールする

インストールされているかどうかを確認

```bash
$ pip -V
pip 8.1.2 from /usr/local/lib/python2.7/site-packages (python 2.7)
```
インストールされていなければインストールする

```bash
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
```

## TensorFlowをインストール

[公式サイト](https://www.tensorflow.org/get_started/os_setup)を確認し、自分の環境にあわせてインストールする

今回は以下を選択

```bash
# Mac OS X, CPU only, Python 2.7:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.1-py2-none-any.whl
```
pipでインストール

```bash
$ pip install --upgrade $TF_BINARY_URL
```

ちなみに、私はProxy環境下ですので

```bash
$ set HTTP_PROXY=http://proxy.hoge.jp:port
$ set HTTPS_PROXY=http://proxy.hoge.jp:port
$ pip install --upgrade $TF_BINARY_URL　--proxy=proxy.hoge.jp:port
```

## Tensorflowの動作確認
[公式サイト](https://www.tensorflow.org/get_started/os_setup)にあるテストコードをコマンドラインで実行する

```bash
$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
```

テストコード通りに動けばインストール完了。
Carthageでどの依存ライブラリはソースからビルドするかを管理するラッパーツールを書いた

# Carthageでつらい事

Swiftのバージョンが頻繁に上がる時期だったり、
何らかの理由で特定のライブラリだけバイナリから上手く使えなかったりするときに、
それらのライブラリだけは、ソースからビルドしてもらうために`--no-use-binaries`をつけてupdateしなければならない時が結構あります。

個人で開発しているときは、あまりインストールすることがなかったり、情報伝達のコストは当然かからないので楽なのですが、チームで開発しているときには、それを周知するコストが掛かったりします。

なので、できれば公式にCarthageがCartfileに依存ライブラリごとのオプションを何らか記録できたら良いのですが、現在はサポートされていません。同じことで困っている人もいるようです。

[Cartfile support for --no-use-binaries per dependency](https://github.com/Carthage/Carthage/issues/1706)

# Barca 

なので、Carthageをラップして、サポートした設定ファイルを扱うツールを自作しました。

[Barca](https://github.com/pocket7878/Barca)

## Barcafile

BarcaはCarthageと同様に、カレントディレクトリにBarcafileを設置して使います
BarcafileはCarthageと同じ限定されたOGDL形式で、Carthageと異なるのは、リポジトリにオリジンの末尾に`no-use-bin`をつけられるようになっているところです。コレをつけておくと、その依存ライブラリはソースからビルドされるようになります。

```Barcafile
github "ishkawa/APIKit" ~> 3.0
github "SnapKit/SnapKit" ~> 3.0.2
github "cbpowell/MarqueeLabel"
github "ikesyo/Himotoki" == 3.0.0
github "pubnub/objective-c" ~> 4.5
github-no-use-bin "robrix/Either" "master"
github "ReactiveX/RxSwift" ~> 3.0
github "intercom/intercom-ios" ~> 3.0
github "MoZhouqi/KMPlaceholderTextView" ~> 1.3
github "marketplacer/swift-badge" ~> 3.0
github "mixpanel/mixpanel-swift" ~> 2.1
github "realm/realm-cocoa" "v2.1.2"
```

## Barcaの挙動

Barcaはcarthageの`update`と`bootstrap`コマンドをラップしています。
起動時に`Barcafile`を開きパースした後、`Cartfile`をカレントディレクトリに吐き出します。(**`Cartfile`が上書きされるので気をつけて下さい**)
そして、パースした結果から、ソースでビルドしなくてはならないものと、そうでないライブラリとに対象ライブラリを分け、それぞれのグループについて`carthage`のコマンドを実行します。

例えば、上の`Barcafile`ならば
`carthage update [...それ以外のライブラリ...]`
と
`carthage update Either --no-use-binaries`
が順番に実行されます。

また、依存ライブラリ名以外に与えたフラグはそのまま実行されるコマンドの最後に追加されます。
また、ラップしていない`update`,`bootstrap`以外のコマンドやフラグは直接carthageに渡されるので透過的に使うことができます。
何番目・奇数・偶数・N倍の要素にスタイルを適用する方法

#内容

下記のようなリストの一部にcssを当てたい場合の書き方。

```html:sample
<ul>
	<li>項目1</li>
	<li>項目2</li>
	<li>項目3</li>
	<li>項目4</li>
	<li>項目5</li>
</ul>
```

#記述方法

```css:最初の要素にスタイルを適用
li:first-child{
}
```

```css:最後の要素にスタイルを適用
li:last-child{
}
```

```css:奇数番目の要素にスタイルを適用
li:nth-child(odd){
}
```

```css:偶数番目の要素にスタイルを適用
li:nth-child(even){
}
```

```css:n倍の要素にスタイルを適用　※以下は2の倍数
li:nth-child(2n) {
}
```

```css:上からn番目の要素にスタイルを適用　※以下は3番目
li:nth-child(3){
}
```

```css:下からn番目の要素にスタイルを適用　※以下は4番目
li:nth-last-child(4){
}
```
Ansible 俺のコーディングポリシー　メモ

# Ansible 俺のコーディング規約

## コードの可読性に関すること

処理内容を横に長く書かない
１パラメータ１行を使って書く
Atom 使ってる人はこれ http://qiita.com/h-hirokawa/items/f1960aee1c4201ee47f2 がやってくれる

```good.yml
  - name: '[apache] service start and enable'
    service:
      name: '{{item}}'
      state: started
      enabled: yes
    with_items:
      - 'httpd'
    notify:
      - '[apache] start'
```
```bad.yml
  - name: '[apache] service start and enable'
    service: name={'item'} state=started enabled=yes
    with_items:
      - 'httpd'
    notify:
      - '[apache] start'
```

## ログの可読性に関すること

with_items, with_dict など with_xxxx を積極的に使用するとログに内容が出てくるので確認しやすい

```good.yml
[code]
  - name: '[apache] install'
    package:
      name: '{{item}}'
    with_items:
      - 'httpd-{{apache.version}}'

[log]
TASK [apache: [apache] install] ***************************
ok: [10.10.10.11] => (item=[u'httpd-2.4.6'])
```
```bad.yml
[code]
  - name: '[apache] install'
    package:
      name: 'httpd-{{apache.version}}'

[log]
TASK [apache: [apache] install] ***************************
ok: [10.10.10.12]
※正しく変数が適用されているかが不安になる時がある
```

## 効率性に関すること

すべてのタスクにタグをつける

```
$ ansible-playbook -t apache 
```
タグ指定実行をすることで、一部修正して試すみたいなときの時間短縮になる

```role/apache/tasks/main.yml

- block：

  - name: '[apache] install'
    package:
      name: '{{item}}'
    with_items:
      - 'httpd-{{apache.version}}'

  - name: '[apache] configure'
　　...

  - name: '[apache] service start and enable'
　　...

  tags:
    - apache
```

## 再利用性に関すること
hash_behaviour = merge 前提で記述する
ロールのデフォルト値をできるだけ網羅しておき、デフォルト値が気に入らない部分だけ上書きする

```roles/jenkins/default/main.yml
jenkins:
  version: '{{jenkins_version | default("2.9")}}'
  port: '{{jenkins_port | default("8080")}}'
```
```playbooks/playbook.yml
- hosts: jenkins
  roles:
    - role: jenkins
      jenkins:
        port: 80
※jenkins ロールの開始時は
jenkins:
  version: '2.9'
  port: '80'
と認識される
```

hash_behaviour = replace だとデフォルト値が消えてなくなり、
指定したパラメータのみになってしまって、デフォルト値の意味がなくなる

## ディレクトリレイアウト

公式ではこのようになっているが
http://docs.ansible.com/ansible/playbooks_best_practices.html#directory-layout
経験上、導いたものは

.
├── ansible.cfg  ← このファイルがある場所で ansible-playbook を実行する
├── host_vars
│   └── localhost
├── inventories　　　　← 公式BestPractice ではトップに置いていたが、
│　　├── vagrant　　　　　inventories/$environment_name/ のディレクトリを設置する
│　　│　　└──jenkins　　　一つのインベントリファイルに 100台ないしは1000台ものリストがあるのはつらい
│　　│　　└──consul　　　　grep | wc -l で確認しやすいようにミドル/ソフトウェアごとにすべて分ける
│　　└── aws　　　　　　　実行するときは ansible-playbook -i inventories/vagrant と
│　　　　└──jenkins　　　ディレクトリ指定をすればよい
│　　　　└──consul
├── playbooks　　　　　← 公式BestPractice ではトップに置いていたが、なんかいやじゃん
│　　└──jenkins.yml　　　
├── roles
│　　├── consul
│　　├── jenkins
└── varfiles　　　← BestPractice にはなく、新設した理由はプロダクトやサービスの都合で
　　└── vagrant　　設定する項目を列挙するため。たとえば、apache/nginx のコンフィグなど
　　　　└──apache　　apache ロールの中でこのファイルを template 命令で転送するイメージ
　　　　　　└──service_a_virtualhost.conf
　　　　　　　　　　　group_vars とは異なる概念
　　　　　　　　　　　playbook にロールのパラメータをベタ書きすれば同じ効果を得るのでまだ模索中

要は、トップディレクトりに inventory とか playbook とか散乱しているのが汚く見えたのを整理しただけ

# 我流フレームワーク

inventory に書かれたグループ名は、Consul + dnsmasq を使ってローカル DNS に自動登録するノウハウをもっているので、グループ名の命名には十分に注意し、ラウンドロビンで参照されることを忘れないように。

# ほかに思いついたら追記していく
[Windows]GodMode


今さらながら知りました。
まあ、ときどき重宝するかもしれませんね。

「Windows 7」の管理機能を集約--「GodMode」の存在が明らかに
https://japan.cnet.com/article/20406124/

```text:
<任意の文字列>.{ED7BA470-8E54-465E-825C-99712043E01C}
```

という名前でフォルダを作成してみる、と。

ほかにもいろいろあるみたいですね。

「GodMode」以外にもあった「Windows 7」の隠し機能--マイクロソフト幹部が自ら公開
https://japan.cnet.com/article/20406270/
PRML(初版)をおさらいする 第1章 序論 2.1節 確率密度

確率密度
--

> 実数値を取る変数 $x$ が区間 $\(x,x+\delta{}x\)$ に入る確率が、$\delta{}x\to{}0$ のとき $p\(x\)\delta{}x$ で与えられるとき、$p\(x\)$ を $x$ 上の**確率密度(probability density)**と呼ぶ

確率密度の条件「実数値を取る変数 $x$ が区間 $\(x,x+\delta{}x\)$ に入る確率が、$\delta{}x\to{}0$ のとき $p\(x\)\delta{}x$ で与えられる」の意味するところがあまりピンと来ていない。連続性が保証されるかどうか？　条件を満たさない $p\(x\)$ って一体どんな関数？

---

ヒントを求めて、**「PRMLL([パターン認識と機械学習の学習](http://prml.in/))第2版」**を読んでみると、**確率空間 $\(\Omega,F,P\)$**の話が出てくる(PRML の第1版にはそんな話出てきてないぞ…？)。

> - $\Omega: ある集合\(標本点\in\Omega\)$
> - $F: \Omega\,の部分集合で\,\sigma\,加法族であるもの\(事象E\in{}F\)$
> - $P: F\to{}R\(=実数全体\)$  
>   $P\(E\)\geqq{}0$  
>   $E_{1},E_{2},\dots{}が互いに素ならP\(\cup{}E_{i})=\sum{P\(E_{i}\)}$  
>   $P\(\Omega\)=1$
> 
> $\Omega$ は対象となる空間で、例えばコイントスなら $\Omega=\\{表,裏\\}$。

- **互いに素([素集合](https://ja.wikipedia.org/wiki/%E7%B4%A0%E9%9B%86%E5%90%88))**:  
  共通部分が空集合であるもの。事象 $E_{1}$ と $E_{2}$ が[排反事象](http://www.ravco.jp/cat/view.php?cat_id=6198&PHPSESSID=)であるということ？
- $P$ は事象 $E\in{}F$ を入力として確率 $p\in{}R$ を返す確率密度関数。各事象の正規確率が非負で、総和が $1$

PRMLL によると、$\sigma$ 加法族であることが重要っぽい。

- **σ加法族([完全加法族](https://ja.wikipedia.org/wiki/%E5%AE%8C%E5%85%A8%E5%8A%A0%E6%B3%95%E6%97%8F))**:  
  集合演算(合併、共通部分、補集合)の加算回の操作で閉じているもの。$A,B\in{}F$ のとき $\bar{A}\in{}F$ だし、$A\cup{}B\in{}F$ だし、$A\cap{}B\in{}F$ ということ。

$\Omega$ が有限集合でない場合において、$\Omega$ の部分集合に $\sigma$ 加法族でない事象が含まれる可能性があるらしいのだ。具体的なイメージができないのでもどかしいが、事象 $A\in{}F$ と事象 $B\in{}F$ の共通部分 $A\cap{}B\notin{}F$ というようなことだろうか。そしてそういうような事象 $x$ に関して、生起確率が $p\(x\)\delta{}x$ では得られないということらしい。わかるような、わからないような…

---

そして、突然の…

> 変数変換 $x=g\(y\)$ を考える

文脈的には「変数に非線形変換を施すと、確率密度はヤコビ行列により単純な関数とは異なる仕方で変換される」ことを示すためらしい。

- [ヤコビ行列](https://ja.wikipedia.org/wiki/%E3%83%A4%E3%82%B3%E3%83%93%E8%A1%8C%E5%88%97)  
  $\vec{x}\in{}R^{n}$ を入力すると $\vec{y}\in{}R^{m}$ を返す多変数ベクトル値関数の、$x$ の偏微分を並べた行列。

わからん。続く。

---

続き
--

ヤコビ行列の話は結局良くわからなかったが、演習問題の問題文を見て、ようやくこのセクションの言いたいことを理解した。**区間$\(x,x+\delta{}x\)$の$p\(x\)$の積分値が確率** なら、**$x$に対して非線形変換を施せば$p\(x\)$の密度が高くなる点も低くなる点も出てくる**。結果、積分値も変動して **確率密度が最も高くなる$x$も変わる**。それが

> 確率密度の最大値は変数の選び方に依存する

ということのようだ。確かに直感的にも理解できる。

---

確率変数が離散である場合、確率関数は **確率質量関数** と言う。**確率密度関数** と **確率質量関数** の関係は、そのまま **密度** と **質量** の関係になっている。

- [密度](https://ja.wikipedia.org/wiki/%E5%AF%86%E5%BA%A6)

密度は単位面積あたりの質量。

**確率密度関数は、確率変数の空間を微小な単位区間に区切って、その区間における面積を求めたもの** と見做すことができるし、**確率質量関数は、確率変数の空間を離散的な有限個の区間に区切って、その区間における面積を求めたもの**と見做すことができる。

---

結局、確率変数 $x$ が生起する確率を与える関数であることに変わりはないのだが、連続系か離散系かによって使い分ける。という理解で良さそう。
MySQL Group Replicationを使う上での注意点

MySQL 5.7.17 でついにGAとなったMySQL Group Replication。
今までになかったマルチマスタ構成が可能となり、夢が広がるなあ… と感じています。

Group Replicationの検証をする中で何点か躓いた点があったので、メモしておきたいと思います。

#### 1. START GROUP_REPLICATION実行時は、GTIDは空でないといけない

MySQL5.7をyumでインストールして、パスワード変更して、my.cnfを修正して、
さあ START GROUP_REPLICATION; と実行してみたら、以下のエラーが発生しました。

```
mysql> START GROUP_REPLICATION;
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
```
```
2017-02-01T05:23:37.398876Z 0 [ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 818459df-e83d-11e6-894d-0800272020f4:1-3 > Group transactions: 84ac715e-e83d-11e6-89eb-0800272020f4:1-3,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'
2017-02-01T05:23:37.399075Z 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
```

どうやら、GROUP_REPLICATIONを開始した時点ではGTIDは空でないといけないようです。
上記手順の「パスワード変更」が原因でした。yumインストールだと、
初期パスワード（ランダム）が設定されるため、無意識で変更していた・・・。

解決策としては、「RESET MASTER;」を実行すれば、問題なくSTARTできます。

#### 2. ノード間はホスト名の名前解決が出来ないといけない

第1ノードを起動して、第2ノードをSTARTしたのですが、"RECOVERING"状態のまま
一向に"ONLINE"になってくれない。
エラーログを見てみたら、ノード間の通信でタイムアウトが発生していました。

```
mysql> SELECT * FROM performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 818459df-e83d-11e6-894d-0800272020f4
 MEMBER_HOST: node2
 MEMBER_PORT: 3306
MEMBER_STATE: RECOVERING
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 84ac715e-e83d-11e6-89eb-0800272020f4
 MEMBER_HOST: node1
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
2 rows in set (0.00 sec)
```
```
2017-02-01T05:29:04.578678Z 28 [ERROR] Slave I/O for channel 'group_replication_recovery': error connecting to master 'rpl_user@node1:3306' - retry-time: 60  retries: 1, Error_code: 2003
```

今回の環境はvagrantで構築したのですが、サーバ間で名前解決が出来ていませんでした（IPアドレスはOK）。
エラーログや「replication_group_members」の通り、ノード間の通信時にはIPアドレスではなく
ホスト名を使用するため、名前解決が出来ないと通信が出来ないようです。

解決策としては、「/etc/hosts」に各ノードの情報を記載したらオケオケオッケーです。

#### 3. mysqldump の --single-transactionは使えない

既にいくつかのユーザから指摘されていますが、Group ReplicationではSavePointsが
サポートされていないため、mysqldumpの--single-transactionオプションが使えません。

そのため、バックアップを取得する場合はそれ用のスレーブなどを用意する必要があるかもしれません。
（メンテナンス時間とかがあれば別ですが・・・）

==============================

以上、悪い点ばかりを列挙してしまいましたが、Group Replication自体はしっかり
特徴や制限事項などを理解すれば、面白い機能だと思います。
今後も検証をして、気になる点などがあればメモをしていきたいと思います。

※ そもそも名前解決ができない環境なんて稀ですしね。。
VisualStudioCodeでRubyをデバッグする多分いちばん簡単な方法(Windows10環境)

RubyのデバッグをVScodeでやる記事をいろいろと見たけど、Windowsのヤツがたぶんほとんどないので簡単に記事をまとめておくことにしました。Windowsではない人の記事を参考にしてるので似てる部分が多いかもしれないのはご了承ください。なおこの記事ではRubyのインストールは前提条件です。
![image](https://qiita-image-store.s3.amazonaws.com/0/150049/6d78bec5-3600-5753-db40-e3553e18bc92.png)

#環境
OS:Window10 Pro
VisualStudioCode:ver1.8.1(多分)
#まずはじめに
gemを使って以下の3つをインストールします。コマンドプロンプトから以下をそれぞれ実行して下さい。

```csharp:cmd1
gem install ruby-debug-ide
```

```c#:cmd2
gem install debase
```
```c#:cmd3
gem list
```

#Rubyのデバッグ用コード
なんでもいいです。今回はHelloWorldにします

```rb:helloworld.rb
  print"HelloWorld"
```
#VScode側の設定
![deg.png](https://qiita-image-store.s3.amazonaws.com/0/150049/c9dcf6a3-b793-d081-bb6b-49e8bf4b14c0.png)
デバッグの表記の近くにある歯車をクリックするとlanch.jsonが開かれます。これをもとは長いヤツですが以下のように書き直してください。

```json:lanch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug Local File",
            "type": "Ruby",
            "request": "launch",
            "cwd": "${workspaceRoot}",
            "program": "${workspaceRoot}/helloworld.rb"
        }
    ]
}
```

これでとりあえずデバッグ環境はできました。
#デバッグしてみよう
これで準備が整ったのでデバッグボタンを押してみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/150049/410d26a8-fc87-c0ab-bb30-a53fc157be07.png)
できました！∩(´∀｀)∩ﾜｧｲ♪
あと、ブレークポイント、ステップオーバー イン、アウトができます。