OmniAICreator/Qiita-1.07M huggingface dataset:
nginxのupstreamコンテキストで有償のresolveオプションを使わずに動的にDNS解決する

# TL;DR
* nginxからリバプロ先のバックエンドがELBの場合は、IPアドレスがキャッシュされないようにDNS名を動的に解決しないといけない。
* serverコンテキストならset変数使うハックで回避可能だけど、この技はupstreamコンテキストで使えない。
* nginxのupstreamコンテキストでresolveオプション使おうと思ったら有償版の商用機能だった罠。
* upstreamコンテキストで必要な負荷分散しつつ、Unixドメインソケットを1段挟んで、serverコンテキストでset変数するハックと組み合わせると動的にDNS解決できた。

# 経緯
nginxをリバースプロキシとして使っていて、バックエンドにELBみたいな構成の場合、DNS名を起動時に名前解決してIPアドレスをキャッシュしてしまうので、IPアドレスが変わると繋がらなくなるというのはよくあるハマりポイントみたいです。

で、調べると色んな方法が出てくるわけですが、このへんの記事がよくまとまっていました。
[Nginxでproxy_passにホスト名を書いた時の名前解決のタイミング](http://d.hatena.ne.jp/hirose31/20131112/1384251646)

1. setディレクティブで変数にホスト名をセットし、proxy_passではその変数を参照＝＞upstreamコンテキストで使えない
1. serverディレクティブにresolveパラメータをつける＝＞商用機能
1. OSSで公開されている拡張モジュールGUI/nginx-upstream-dyanmic-serversを使う

単純なproxy_passであれば1番の方法で解決しますが、諸般の事情で、以下のような構成になっていて、upstreamコンテキストを使って、2系統に重み付けで振り分けたりfailoverさせたりみたいな構成で使いたかったので、なんとしてもupstreamコンテキストで使いたいという事情がありました。

```
client -> ELB -> nginx -> ELB -> appサーバ(backend1系)
                       -> ELB -> appサーバ(backend2系)
```

で、2番の方法をnginxのマニュアルで見つけてresolveオプションでいけるやんと喜んでいたら商用機能であることが判明し、絶望の淵に叩き落とされ一喜一憂。nginxは必要な機能がちょいちょい有償版でしか使えないので油断ならないです(´・ω・｀)

で。希望を託して3番の方法をやってみたのですが、私の環境ではうまく動きませんでした。うまく動かないとは、簡単な動作確認ではDNS解決できており、機能的には問題なかったのですが、しばらくテスト環境で検証してたら、nginxのCPUが100%に張り付いてハングする事象が結構な頻度で発生しました。

問題の事象を確認したのはnginx 1.9.10で、再現条件や詳細な原因が不明なのですが、ハングしている状態でstrace取ってみると `sched_yield()` が全力で無限ループしており、疑わしいのが追加の拡張モジュールで入れたnginx-upstream-dyanmic-serversしかなく、このモジュール自体既にメンテされていないようなので、証拠不十分ですがnginx-upstream-dyanmic-serversを使わない方針で、第4の方法を思いついたので共有しておきます。

# 解決策
状況を改めて整理すると以下のとおりです。

* nginxはデフォルトだとプロセス起動時にDNS解決してIPをキャッシュしてしまう
* proxy_passの連携先がELBの場合は動的にIPアドレスが変わる可能性がある
* server/locationコンテキストでresolverの設定をいれた状態でproxy先をset変数で定義するのを組み合わせると動的に名前解決されるハックがある（上記の１番目の方法）
* このハックはupstreamコンテキストでは使えない
* upstreamコンテキストのresolveオプションは商用版でしか使えない
* 負荷分散やフェールオーバの制御でupstreamコンテキストは使いたい

ということはupstreamで名前解決しないようにすればよいわけです。つまり、役割分担して

* upstreamコンテキストで負荷分散やフェールオーバの制御しつつローカルのUnixドメインソケットに振り分ける
* 振り分け先のserverコンテキストでset変数のハックを使って動的に名前解決させる

という合わせ技でいけました。設定ファイルはこんなかんじ。

```nginx.conf
http {
    ...
    resolver 10.9.0.2 valid=5s;
 
    upstream backend {
        server unix:/var/run/nginx_backend1.sock weight=9 max_fails=1 fail_timeout=20s;
        server unix:/var/run/nginx_backend2.sock weight=1;
    }
 
    server {
        listen       8080;
        server_name  example.com;
        proxy_next_upstream error timeout http_502 http_503 http_504;;
        ...

        location / {
            proxy_pass  http://backend;
        }
    }

    server {
        listen       unix:/var/run/nginx_backend1.sock;
        server_name  example.com;
        ...

        set $lb_backend1 "internal-lb-backend1-XXXXXXXXX.ap-northeast-1.elb.amazonaws.com";
 
        location / {
            proxy_pass  http://$lb_backend1:80;
        }
    }
 
    server {
        listen       unix:/var/run/nginx_backend2.sock;
        server_name  example.com;
        ... 

        set $lb_backend2 "internal-lb-backend2-XXXXXXXXX.ap-northeast-1.elb.amazonaws.com";
 
        location / {
            proxy_pass  http://$lb_backend2:80;
        }
    }
}
```
Androidアプリではてブ追加画面をIntentで直コール

**注意**
この内容は(僕が調べた限りでは)公式に認められている方法ではありません。
個人的に作成したアプリで使用しているだけなので、使用した結果発生した影響については責任を負えません。

## やりたかったこと

僕ははてなブックマークを自分のナレッジベースのように使っていて、読んでよかった記事や参考記事などをなんでもはてなブックマークに突っ込んでいる。
⇒ [僕のはてブ](http://b.hatena.ne.jp/ponpoko04/)

そんな背景から、自分で作成したAndroidアプリ内のWebViewで表示したWebサイトをボタンクリックではてなブックマークにブックマーク追加したいと考えた。

## そもそもIntent

以下の2種類が存在する。

- 暗黙的Intent
- 明示的Intent

今回はこの明示的Intentを使って、インストールされているはてなブックマークアプリのブックマーク追加画面を直接呼び出すことに成功したやり方を書く。

## やり方

1. [こちらの記事](http://qiita.com/ueno-yuhei/items/46971ac51d1fa3315c8d)を参考にさせてもらって、はてなブックマーク追加画面の情報を取得
2. [こちらの記事](http://techbooster.jpn.org/andriod/application/1388/)にあるように`ACTION_SEND`ではてなブックマーク追加画面をコール

以上！

サンプルとして、作った画面のコードを一部貼り付ける。

```java:HotentryItemActivity.java
// この行でごにょってWebViewオブジェクトを取得しているのは目をつぶってほしい・・・
WebView showingView = ((WebView)((View)v.getParentForAccessibility()).findViewById(R.id.webview));
// はてなブックマーク追加をIntentで直コールする
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setClassName("com.hatena.android.bookmark", "com.hatena.android.bookmark.PostActivity");
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, showingView.getUrl());
//intent.setFlags(0x3080001); //[追記]このフラグは必要ありませんでした
startActivity(intent);
```

[上記ソースのすべてを見るにはこちら(GitHub)](https://github.com/ponpoko04/HatenaReader/blob/master/app/src/main/java/com/takayoshi/android/hatenareader/activities/HotentryItemActivity.java)
[リポジトリはこちら(GitHub)](https://github.com/ponpoko04/HatenaReader)

[追記]
上記サンプルコード内で`intent.setFlags(0x3080001);`してましたが、不要でした。

[追記2]
GitHubのパス変更に伴い、リンク先変更。
underscoreコードリーディング（has）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##hasとは


###[underscorejs.orgのhas](http://underscorejs.org/#has)

こんな説明。
>####_.has(object, key) 
>Does the object contain the given key? 
>Identical to object.hasOwnProperty(key), but uses a safe reference to the hasOwnProperty function, in case it's been overridden accidentally.


```javascript
_.has({a: 1, b: 2, c: 3}, "b");
=> true
```

------------- 
objectが与えられたkeyを持っているかどうかをhasOwnpropertyを用いて調べませんか？
突発的にhasOwnPropertyがオーバーライドされてしまったりした場合でも使える安全な参照をした形で提供します。


###[underscore.has](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1265)
コード的にはこのあたり。

```javascript
  // Shortcut function for checking if an object has a given property directly
  // on itself (in other words, not on a prototype).
  _.has = function(obj, key) {
    return obj != null && hasOwnProperty.call(obj, key);
  };

```

underscore内のhasOwnPropertyをcallして返す。
EC2での固定IP使用について

#EC2での固定IP使用について
EC2ではインスタンスを再起動すると都度グローバルIPアドレスが変化します。これではサービスを公開できないので固定IPを割り振ります。

##Elastic IPの作成
Elastic IPを選択し新しいアドレスの割り当てを押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/32beb936-1b7a-8deb-0b90-db02310ceb5a.png)

##作成したIPをインスタンスに関連付けます
作成したIPを選択し右クリックかアクションからアドレスの関連付けを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/d288e621-7759-6788-2fc8-931d9c2c08fb.png)

以上
フロントエンド(html, css, javascript)の修行を約2か月つけてもらって

注意されたことをまずはひたすらまとめていく。
振り返り終わったら、指摘された注意事項に基づいて研修資料に近いものを作れたら、と。

(編集途中なので、随時upload)

---

pullreqを出すときは、reviewerに対してcompassionを持つこと

- フロントのpullreqならスクショはつける
- 動きのあるものならGifファイルを添付する

---

padding, margin, height, widthなどの?pxという長さ指定のものは、baseに指定したdefault_spaceなどを使い回す。

---

文字色などのmixinにあるものは、それを使い回す

---

image_tagにclassを付け加えて、そのclass使ってる？
(htmlのimgタグにclassをつけて使うことってできんの!?)

---

（新しいlayoutファイルにおいて）
不必要なrenderファイル、classは省く

---

cssのclassの組み方として、基本的に

```
.mental_care
  .item
  .content
```
のように、基本入れ子にするのは最初だけ。（最初の.mental_careとかをnamespaceとして使う）

---

```
font-size: $font_size_small - 1
```
のような書き方では、mixinの使い方として適切ではない

---

viewファイルには日本語を書かない。
config/locales
以下に全部まとめる。lazyなんちゃらを使って、viewファイルとの対応関係を意識しながら使う。

---

インデントは必ず守る

---

矢印とか簡単なiconは
= fa_icon
のようなコードで呼び出せる。何でもかんでも画像にしないで、楽な方法を探す。

---

partialしやすいように、繰り返しになるものを意識してclassを組む。

```
.list_wrapper
.list_wrapper.border
.list_wrapper.border
```
としてしまうと、使いまわしづらい

---

CSSの命名は、役割を命名すること
個別的な名前は避ける

.mental_menu
  .mental_list
    .list_wrapper
    
---

不必要な

```
height: 100%
width: 100%
```
は避ける。

---

共通化できる部分があるclassはまとめてしまったりした方が良い場合あり

---

squareとかcircleとか、使い回す可能性の高いものはmixinに入れることを念頭に置く

---

widthやheightをpx指定するのは割と避けるようにする
可変で伸びたときのこと等を考える

---

テキストの長さが長くなったりして２列になったりと、見た目に関して考えられる条件は全部考えて、すべての場合に対応できるようにしておく。

```
if width < 30
  ...
elsif width = 30
  ...
else
  ...
end
```
のように、網羅性は高い方がいい

---

width: 90%
のような、状態はできる限り親要素に持たせる

---

defaultのsizeやcolorは重複して指定しない

---

基本widthは100%になるので、わざわざ指定しない

---

見出し系はh系のタグで囲うことを意識する。
htmlのタグがそれぞれ持つ役割を意識して、適切なhtmlタグを使用するようにする

---

CSSはできるだけシンプルに書く。
増やそうと思ったらいくらでも増やせるのがCSSなので。

---

ネガティブマージン

---

マイナスの値の書き方は

```
$default_space * -3
```

```
- $default_space * 3
```
とかはダメ。

---

fa-angle-right
のように、もともと用意されているクラスにcssを直接書くのは避けるべき
同じ画像のようなものを、fa以外で書く（例えば画像で指定する）ときとかにいきなり崩れてしまうため

---

slimにおいて、

```
h3
  = t('.content')
```
のように短いものなら、

```
h3 = t('.content')
```
と簡潔に書く。

---

sentenceの下にtitleというクラスがあるのは違和感

---

画像等をデザイナーの人に用意してもらったり、とデザイナーやビジネスサイドのようにエンジニア以外の人とのコンタクトを取りながら仕事するときは、自分からガンガン確認を取りに行く。

---

config/locales
において、他のところでも確実に使い回すものは

```
config
├──locales
	├──views
		├──users
			├──profile
				├──ja.yml
			├──common
				├──ja.yml
			
```
のように、commonにまとめて書いて参照できるようにする（lazyなんちゃらは使えなくなるが、DRYになるため）

---

' : 'のようなコロン等もI18nの中に入れてしまって問題ない

---

decoratorを使って、データの整形をまとめてやる（似たような処理をDRYにするため）

```
article.updated_at.strftime("%Y年%m月%d日")
```
を

```
article.decorator.updated_at
```
のように書けるようになる。

---

controllerの頭で

```
layout 'company'
```
と指定すればlayoutファイルは一括で指定できるし、actionによって変えたいときは、小数派のlayoutファイルをactionで指定したり、before_actionを使って指定するようにする
＝DRYに書く

---

borderはpx, solid, colorの順番で書く

---

sassにおいて

```
border: solid .5px $blue_color
border-radius: $default_space / 2
```
は

```
border: solid .5px $blue_color
	radius: $default_space / 2
```
というように簡単に書ける

---
Ruby on Rails 開発でつまづいたところ

※開発初心者なので、情報に間違いなどあれば指摘してください。

# トラブル：データベースの情報一覧ページ作成時にエラー
### 原因：
Allメソッドがきいていなかった
###解決策：
→AllメソッドはActiveRecord::Baseに入っている
→使いたいモデルに対してクラス継承の必要あり
　具体的な手順は以下の2ステップ
1. ファイル作成：
`/apps/model/(モデル名).rb`

2. 以下の文言を記入

```
class Post < ActiveRecord::Base
end
```
※なお、devise(gem)を用いた場合は自動でクラス継承用のファイルが作成される模様
第10話 太郎「迷子って言うな！」

**核心を突かれると、みんな怒るよね**

今回はthree.jsの描画をPhaserのフレームワークに載せてみます。

まずは、htmlはこんな感じ。gameというdivタグのところに、描画されます。

```html:index.html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>あれ</title>
</head>
<body>
  <div id="game"></div>
  <script src="js/three.min.js"></script>
  <script src="js/phaser.min.js"></script>
  <script src="js/poge.js"></script>
</body>
</html>
```
まずは、ゲームオブジェクトを作成します。第5引数は状態(State)オブジェクトを設定します。この状態オブジェクトって、一般的なゲームフレームワークで言うシーンみたいなもんですよね？（１週間ぐらいしか使ってないので、よくわかってないｗ

```js:hehehe.js
var state = {
  preload : function() {},
  create  : function() {},
};
```
複数の状態オブジェクトを作って、遷移していけばいいはず。
が、今回は簡単にコールバック関数だけ列挙しておきますｗ

```js:poge.js
var game = new Phaser.Game(
  mazeScreen.width, mazeScreen.height, Phaser.AUTO, 'game',
  { preload: preload, create: create, update: update, render: render }
);

function preload() {
}

function create() {
}

function update() {
}

function render () {
}
```

preloadが最初にコールされて、その処理が終わるとcreateがコールされます。なので、preloadでは、一般的に、リソースの読み込みとか準備するわけです。今回は、preloadの中で、threeのオブジェクトを作成します。そして、Phaserで作成したtextureオブジェクト上に、Threeで描画し、このtextureをSpriteとして登録して貼り付けます。これで、最終的にはPhaserがSpriteとして描画してくれます。

```js:poge.js
function preload() {
  // Threeオブジェクトの作成など（第8話参照）
  //
  // ThreeのRenderer作成
  renderer = new THREE.WebGLRenderer({antialias: true});
  // サイズを指定して
  renderer.setSize( mazeScreen.width, mazeScreen.height );
  // Canvasを取得して
  var canvas = renderer.domElement;
  // CanvasからTextureを作成
  baseTexture = new PIXI.BaseTexture(canvas);
  texture = new PIXI.Texture(baseTexture);
  textureFrame = new Phaser.Frame(0, 0, 0, mazeScreen.width, mazeScreen.height, 'poge');
  // Textureをスプライトとして追加
  var sprite = game.add.sprite(0, 0, texture, textureFrame);
}
```

そして、更新処理(update)で行動などによる描画の変化を与えてやり、描画処理(render)でThreeを描画すればいい。

```js:poge.js
function render() {
  // Threeをtextureに描画する
  renderer.render(scene, camera);
  // Phaserでtextureを更新する
  game.renderer.updateTexture(baseTexture);
}
```

物語は佳境に入ってきました。太郎と次郎は無事に脱出できるのか？ｗ
過剰に安全なBEMの書き方

さすがに普段使いはしませんが、いざという時のための備忘録。

## 普通のBEMの書き方

```css:css
.block { ... }
/* 親要素 */

.block--modifier { ... }
/* 親要素の変化形 */

.block__element { ... }
/* 子(孫)要素 */

.block__element--modifier { ... }
/* 子(孫)要素の変化形 */

.block--modifier__element { ... }
/* 変化した親を持つ子(孫)要素 */
```

## 過剰に安全なBEMの書き方

※ 必要性を分かりやすくするために、`.block`を`.scope`にリネームしますね。

```css:css
.scope:not(:root) { ... }
/* 親要素がdivかspan以外だった場合、詳細度不足に陥る可能性を踏まえて */

.scope.scope--modifier { ... }
/* 変化形が一人歩きしないように、オリジナルを伴わせる */

.scope .scope__element { ... }
/* 子(孫)要素がスコープの外側で呼ばれないように閉じ込める */

.scope .scope__element.scope__element--modifier { ... }
/* .is-接頭辞を使う方法では、マルチクラス時に誤発動する危険性がある */

.scope.scope--modifier .scope--modifier__element { ... }
/* .scopeを潰すだけで、子孫共々道連れにして無力化できる */
```

## 感想

素晴らしく安全ですが、さすがに普段使いは厳しそうです。

## おまけ

Stylusで書くとこう。

```stylus:main.styl
.scope
  @import "./module"
```

```stylus:module.styl
&:not(:root)
  ...

&&--modifier
  ...

& &__element
  ...

& &__element&__element

  &--modifier
    ...

&&--modifier &--modifier

  &__element
    ...
```
ArrayInquirer で Array の中身をらくらく確認

# はじめに

どうも僕です。今日から艦これ (Web ブラウザ版) を始めました。その記念に何か記事を書こうと思いました。

今回は Rails 5 で追加された [ArrayInquirer](http://edgeapi.rubyonrails.org/classes/ActiveSupport/ArrayInquirer.html) をご紹介したいと思います。

# ArrayInquirer とは

ArrayInquirer は [Array](http://docs.ruby-lang.org/ja/2.3.0/class/Array.html) クラスのラッパークラスです。Inquirer は「質問者」「調査員」という意味で、Array の中身を問い合わせることに特化したクラスです。

例えば、以下の Array オブジェクトがあります。

```rb
array = [:yuudachi, :sazanami, :hatsushimo]
```

この Array オブジェクトに特定の要素が含まれるかどうかを調べるには [Array#include?](http://docs.ruby-lang.org/ja/2.3.0/method/Array/i/include=3f.html) を使います。

```rb
array.include?(:yuudachi) #=> true
array.include?(:fubuki) #=> false
```

ArrayInquirer を使うと、これをより直感的に書くことができます。

まず、ArrayInquirer オブジェクトを生成してみましょう。方法は 2 つあります。

```rb
array = [:yuudachi, :sazanami, :hatsushimo]

# 方法 1 : Array#inquiry メソッドを呼ぶ。
array_inquirer = array.inquiry

# 方法 2 : ArrayInquirer のコンストラクタを使う。
array_inquirer = ActiveSupport::ArrayInquirer.new(array)
```

次に ArrayInquirer オブジェクトを使って、Array#include? と同じ挙動のコードを書いてみます。

```rb
array_inquirer.yuudachi?
#=> true
array_inquirer.fubuki?
#=> false
```

と、要素の末尾に `?` を付与したメソッド名で存在の有無を問い合わせることができるようになりました。

なお、ArrayInquirer のこれらのメソッドは文字列とシンボルの両方を検索対象とします。

```rb
array_inquirer = ['yuudachi', 'sazanami', 'hatsushimo'].inquiry

array_inquirer.yuudachi?
#=> true
array_inquirer.fubuki?
#=> false

array_inquirer.include?(:fubuki)
#=> false
array_inquirer.include?(:yuudachi)
#=> false
```

ところで上のコードを見て「ArrayInquirer オブジェクトに `include` という文字列あるいはシンボルが含まれている場合、`include?` を呼ぶとどうなるの？」と疑問に思った方がいるかもしれません。
結果は Array#include? が呼ばれます。

```rb
array_inquirer = ['yuudachi', 'sazanami', 'include'].inquiry

array_inquirer.include?
#=> ArgumentError: wrong number of arguments (given 0, expected 1)
array_inquirer.include?('include')
#=> true
```

[ArrayInquirer の実装](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/array_inquirer.rb) を見ると分かるのですが、ArrayInquirer は Array を継承しており、なおかつ method_missing で動的にメソッドを作っているため、Array に既に存在するメソッドが優先されます。

また、[Enumerable#any?](http://docs.ruby-lang.org/ja/2.3.0/method/Enumerable/i/any=3f.html) も拡張されています。

```rb
array = [:yuudachi, :sazanami, :hatsushimo]

array.any? { |kanmusu| kanmusu == :yukikaze || kanmusu == :hatsushimo }
#=> true

array_inquirer = [:yuudachi, :sazanami, :hatsushimo].inquiry

array_inquirer.any?(:yukikaze, :hatsushimo)
#=> true
array_inquirer.any?('yukikaze', 'hatsushimo')
#=> true
```

このように ArrayInquirer#any? はブロックの代わりに複数の値を引数をして受け取るようになり、そのいずれかが存在すれば `true` を返します。また、文字列とシンボルを区別しません。

Array オブジェクトの存在チェックを行う用途であれば、Array#any? と比較してかなり直感的に書けるようになると思います。

# おまけ

```rb
array_inquirer = [:include?, :any?, :all?].inquiry

array_inquirer.public_send('include?')
#=> ArgumentError: wrong number of arguments (given 0, expected 1)
array_inquirer.public_send('include??')
#=> true
```
Dockerコンテナ上にGitBucket環境を構築する


この記事は「[Dokcerコンテナ上に開発環境一式を構築する](http://qiita.com/hakaicode/items/5522a5ad1c280b9cf757)」の一部です。

## 現在のステータス

* [VPSのホストにUbuntuを入れる](http://qiita.com/hakaicode/items/5522a5ad1c280b9cf757)
* [dnsを構築する](http://qiita.com/hakaicode/items/478ba39055c101d6197d)
* [nginxを構築する](http://qiita.com/hakaicode/items/38cbed889a03a33cdfcf)
* GitBucket環境を構築する <-イマココ
* [Selenium用のJenkins環境を構築する](http://qiita.com/hakaicode/items/9a4ccf9faf63a4d9d3e4)
* [Desktop環境(IntelliJ IDEA)を構築する]()

## Dockerfile

GitBucketはJava以外特に組み合わせないので、Java8の[公式イメージ](https://hub.docker.com/r/library/java/tags/)でもいいのですが、Ubuntu14.04にしておきます。

```Dockerfile
# GitBucket Dockerfile
FROM ubuntu:14.04
ENV DEBIAN_FRONTEND noninteractive

# Install.
RUN apt-get update && apt-get -y upgrade
 && apt-get install -y build-essential software-properties-common
 && apt-get install -y byobu curl git htop man zip unzip wget
 && rm -rf /var/lib/apt/lists/*
# Install java 8
RUN add-apt-repository ppa:webupd8team/java -y && apt-get update
 && (echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections) && apt-get install -y oracle-java8-installer oracle-java8-set-default
 && rm -rf /var/lib/apt/lists/*

ENV HOME /root
RUN locale-gen ja_JP.UTF-8
ENV LANG       ja_JP.UTF-8
ENV LC_ALL     ja_JP.UTF-8

# time
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

#user
ENV USER gitbucket
RUN /usr/sbin/useradd $USER
WORKDIR /home/$USER
USER $USER
```

javaのインストールはライセンスに同意する必要があるのでdebconf-set-selectionsが必要になります。

```bash:build.sh
#/bin/sh

. ../../setenv.sh
CONTAINER=gitbucket

cd $DOCKER_HOME/$CONTAINER
docker build --force-rm -t "lavans-$CONTAINER:latest" .
```

```shell-session
$ chmod 755 *.sh
$ ./build.sh
```

## GitBucket取得

```bash:update.sh
#/bin/sh

VERSION=3.1.1

. ../../setenv.sh

wget https://github.com/takezoe/gitbucket/releases/download/$VERSION/gitbucket.war -O gitbucket-$VERSION.war
rm gitbucket.war
ln -s gitbucket-$VERSION.war gitbucket.war
```


## 起動終了スクリプト

```sh:run.sh
#/bin/sh

. ../setenv.sh
CONTAINER=gitbucket

docker run -v  $DOCKER_DIR/$CONTAINER/:/home/$CONTAINER -u $CONTAINER -d \
  -e HOME="/home/$CONTAINER" \
  --name $CONTAINER -p 8080:8080 --dns=$IP \
  lavans-$CONTAINER java -Xmx256m -jar $CONTAINER.war
#--host=gitbucket.lavans.jp
```

GitBucketのデータファイルは/home/gitbucket/.gitbucketに入るので
HOMEディレクトリをマウントして使うようにしました。gitbucketの起動オプションに-Xmx256mを指定しています。

```sh:kill.sh
#!/bin/sh

CONTAINER=gitbucket
docker kill $CONTAINER; docker rm $CONTAINER
```
nginxでカスタムHTTPヘッダを見てproxy_passを振り分ける

nginxをリバースプロキシとして使っていて、カスタムHTTPヘッダを見てproxy_passを振り分けたいことがあります。

どういうユースケースかというと、例えば現新システムを並行稼動させるのに前段でnginxをリバースプロキシとして使って、通常のリクエストは両方に分散しているのだけど、新システムだけで起こるバグの切り分けのために、一部の関係者だけ明示的に新システム側にルーティングしたいみたいなケース。

セッションの中のユーザID見てとか作りこむの大変なので、もっとお手軽に。
基本的なアイデアとしては、ブラウザの拡張でカスタムHTTPヘッダを付けてアクセスして、nginxでそのヘッダを見て振り分けする。

Modify HeadersというChrome拡張でブラウザから好きなカスタムHTTPヘッダを追加で付与できるので、これで適当なヘッダをセットする。
[Modify Headers for Google Chrome](https://chrome.google.com/webstore/detail/modify-headers-for-google/innpjfdalfhpcoinfnehdnbkglpmogdi)

例えば `X-BACKEND-VERSION: 2` という独自のHTTPヘッダを使う場合、こんなかんじで振り分けができる。

```nginx.conf
http {
    ...
    server {
        listen       8080;
        server_name  example.com;
        ...

        location / {
            if ($http_x_backend_version = "2") {
                proxy_pass  http://backend2;
                break;
            }
            proxy_pass  http://backend1;
        }
        ...
    }
}
```

Unknown 〜 エラーが出た場合は、 `underscores_in_headers on;` もhttpまたはserverコンテキストに指定が必要かもしれません。

これでURLベースじゃなくて好きなルーティングができるようになるので、メンテ画面出しつつ関係者だけ使えるようにするとか応用するアイデアがいろいろありそうな覚えておくと便利な小技じゃなかろうかと。
jQuery.css()を使って変えた値を元に戻す

jQueryの `css()` は、セレクタで指定したタグのDOMのstyle属性を編集します。
style属性は外部CSSより優先度が高いため、 `<link>` で読み込んだ外部CSSの記述は上書きされます。

CSSファイルに設定したもとの値に戻したい / もとの値を取得したい場合は、
以下のように一度 `css('cssattr', '')` を使ってリセットしてしまえば、取得が可能です。

```js
var $foo = $('#foo');

// 属性を設定
$foo.css('top', '100px');

// 属性をリセット
$foo.css('top', '');

// もとの値を取得
var org = $foo.css('top');
```
NSX EdgeとJuniper SSG5のIPSec VPN接続における落とし穴

# はじめに
IPSec VPN接続では異なる機器同士の設定でつまずく点が多くあります。今回はVMware NSX EdgeとJuniper SSG5のIPSec VPN接続設定における落とし穴について記載します。
# VMware NSX Edgeについて
下記のURLを参照してください。
http://www.vmware.com/jp/products/nsx
# Juniper SSG5について
下記のURLを参照してください。
http://www.hs-juniperproducts.jp/security/ssg/spec.html
# NSX Edgeと接続する場合のIPSec VPN推奨設定
下記の表を参考にIPSec VPNを設定します。
![IPSec-config-1.png](https://qiita-image-store.s3.amazonaws.com/0/113341/75511fb3-35c5-41e8-bb1e-de33e7a69425.png)

以下はvCloud AirにおけるIPSec VPN接続ガイドですが、日本語で記載されており参考になります。
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2094854
# Juniper SSG5におけるIPSec VPN設定
下記ページよりIPSec VPN接続ガイド_Juniper_SSGをダウンロードして参照してください。
https://www.vmware-gogo.com/p/vcloudair_campaign/
![IPSec-Juniper-1.png](https://qiita-image-store.s3.amazonaws.com/0/113341/ec22935e-76c0-540d-461a-e05caebb372e.png)
![IPSec-Juniper-2.png](https://qiita-image-store.s3.amazonaws.com/0/113341/37be22aa-f250-8a5c-698a-44cece5c10dd.png)
![IPSec-Juniper-3.png](https://qiita-image-store.s3.amazonaws.com/0/113341/b616e448-59b3-1636-1e73-9c74077701a0.png)
![IPSec-Juniper-4.png](https://qiita-image-store.s3.amazonaws.com/0/113341/852d953d-7ff1-c353-1428-3493c5ae5ab7.png)
![IPSec-Juniper-5.png](https://qiita-image-store.s3.amazonaws.com/0/113341/b8bcb70c-1259-1423-47b3-415541982ad6.png)
![IPSec-Juniper-6.png](https://qiita-image-store.s3.amazonaws.com/0/113341/d2f69a2c-4ea0-0c0c-0696-abb78abbb878.png)
![IPSec-Juniper-7.png](https://qiita-image-store.s3.amazonaws.com/0/113341/932106c3-42b9-e71d-9d16-e7ede354999e.png)
![IPSec-Juniper-8.png](https://qiita-image-store.s3.amazonaws.com/0/113341/36dfab24-035e-8208-1b6f-58fdc0f79a53.png)
![IPSec-Juniper-9.png](https://qiita-image-store.s3.amazonaws.com/0/113341/e1168cc6-9356-5580-9098-3aede8b70cec.png)
# VMware NSX EdgeとJuniper SSG5のIPSec VPN接続設定における落とし穴
上記で公開されていない落とし穴が2つありました。
## Proxy ID設定が必要
プロキシIDは、VPNピア間でポリシールールを交換するために使用されます。デフォルトでSSGではポリシーチェックが使用可能になっており、プロキシIDにより送信されるポリシーはローカルで構成されているポリシーと比較されます。プロキシID不一致はVPNの失敗によくあるようです。
参照先：http://www.infraeye.com/study/juniperssg20.html
設定画面例：
![IPSec-Juniper-10.png](https://qiita-image-store.s3.amazonaws.com/0/113341/c72322f6-83aa-0b3e-d50b-61edaf4eb58d.png)

## VPNモニターの設定が必要
以下のメッセージがログに記録されており、Phase 2のVPN Monitorの設定でDestination IP欄に対向側でpingに応答するIPアドレスを入力することでVPNトンネルステータスが安定しました。デフォルトの設定値は「default」が入力されています。

Message
VPN monitoring for VPN  〈vpn_name〉 has deactivated the SA with  ID 0x  〈tunnel-id〉x.

Meaning
 The security device determined that the VPN monitoring status for the specified VPN tunnel changed from up to down. Consequently, the security device deactivated the specified Phase 2 security association (SA).

![IPSec-Juniper-12.png](https://qiita-image-store.s3.amazonaws.com/0/113341/8f4f9afb-bd18-0cac-c0f7-df107120385e.png)
Azure PowerShell ことはじめ

Azure 環境でちょっとした操作を調べるとすぐに行き着くのが PowerShell。
ここでは、Azure PowerShell のインストールと初期設定を説明します。

# PowerShell のインストール
WebPI からインストールする方法と PowerShell ギャラリーからインストールする方法があるのですが、どうも前者の WebPI はうまくいかなかったので、ここでは後者の PowerShell ギャラリーからのインストールをします。

1. PowerShell を管理者モードで起動します（通常のモードで起動せず私ははまりました 笑）
2. まずはスクリプト実行セキュリティ・ポリシーを "Restricted" に変更します。

```ps1
Set-ExecutionPolicy RemoteSigned
```
3. 続いて、以下を実行します。
 
```ps1
Install-Module AzureRM
Install-AzureRM
Install-Module Azure
Import-AzureRM
Import-Module Azure
```

# Azure 管理に必要な構成ファイルの取得
構成ファイルは手で記述することなくダウンロードすることができます。

1. `Get-AzurePublishSettingsFile` を実行（一般権限でも大丈夫）
2. Webブラウザが起動して以下の画面が表示され、構成ファイルが自動的にダウンロードされます。![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/111347/9fb0009e-3049-0295-3fc9-82db141f9394.png)
3. 取得した構成ファイルを取り込みます。

```ps1
Import-AzurePublishSettingsFile "ダウンロードしたファイルのフルパス"

#取り込んだ情報の確認
Get-AzureSubscription

SubscriptionId            : abcdefgh-d999-4824-947x-654332123456
SubscriptionName          : Hogehoge Subscription
Environment               : AzureCloud
DefaultAccount            : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IsDefault                 : True
IsCurrent                 : True
TenantId                  :
CurrentStorageAccountName :

SubscriptionId            : ca1ca45d-3726-4567-x9f3-xyzaca7dbabc
SubscriptionName          : Piyopiyo Subscription
Environment               : AzureCloud
DefaultAccount            : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IsDefault                 : False
IsCurrent                 : False
TenantId                  :
CurrentStorageAccountName :
```

これは最初に１回だけやればOK。次回以降、これを繰り返す必要はありません。
限られた操作だけに使うアカウントを作成する


Linux上で、限られた操作だけができるようなアカウントを作る機会があったので、そのあたりについてまとめてみました。

# 「ログインできないアカウント」では足りない場面
Linuxマシンには、数多くのアカウントが作られることがあります。で、その中には「メールアカウントとしてしか使わない」「FTP専用のアカウント」「デーモンの権限切り分け用」などというように、シェルログインが全く不要なアカウントも存在します。ログインしなくていいのなら、`/bin/false`や`/sbin/nologin`のようなダミーシェルを与えておけば、ログイン自体が不能となります[^1]。

一方で、「それでは済まない」という用事ももちろんあります。サーバに自動的なオペレーションを走らせるような場面で、他のサーバへ特定のコマンドを実行させたい、というような場合です。このような場合、機械処理可能な形でログイン情報を置いておかざるを得ないので、何も制約をかけなければやりたい放題になってしまいます。

# 1コマンドなら楽勝
サーバへSSHログインする際に`authorized_keys`を設定しますが、このファイルには鍵だけでなく各種のオプションを設定できます。そこで、`command="…"`のように指定すれば、[特定のコマンドを実行して、それが終わればすぐ接続断](http://qiita.com/tukiyo3/items/0fd9c6cb57a97cd8fdfa)という専用の鍵ができます。

# 複数実行したい場合
とはいえ、リモートサーバでいくつかのオペレーションをしたい場合に、その1つ1つに鍵を作るのも手間かもしれません。そんなときに使えそうな手段として、`rbash`というシェルがあります。

## rbashとは
`rbash`とは、`bash`の特殊なモードの1つです。`rbash`という名前で起動する、あるいは`bash -r`とするとこのモードに入ります。

詳しくは[man](https://linuxjm.osdn.jp/html/GNU_bash/man1/rbash.1.html)を見てもらうとわかりやすいのですが、できなくなることとして、

* `cd`でのディレクトリ変更
* `PATH`の変更
* `/`のあるコマンドの実行、`source`
* リダイレクト

があります。大雑把に言えば、元から`PATH`に入っているコマンドと、bashの組み込みコマンドしか実行できなくなります。

ただし、これはあくまで**シェル単位での**設定なので、（シェルスクリプトを含め）シェルから実行した別コマンドには制約が適用されなくなります[^2]。つまり、シェルそのものを筆頭に、「任意のプログラムを実行できるプログラム」をこの環境から呼び出せるなら、まったく意味がなくなってしまいます。

## 実行できるものの制限
まずまっ先に、`.bash_profile`で`PATH`を制限しましょう。`~/bin`でも掘って、そこだけを指定しておくのがいいと思います。そして、`PATH`にしたディレクトリやホームディレクトリ、そして`.bash_profile`や`.bashrc`からは、当該アカウントの書き込み権を奪っておきます。

## bash内部の機能について
これだけやっても、[bash自体に内蔵されたコマンド](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbDB)は実行できるままです。特に、`kill`なんてのもあったりします。ということで、`enable -n コマンド`として組み込みコマンドを無効化しておきましょう（なお、`enable`自体を無効にしたい場合は最後に実行する必要がありますが、`rbash`の環境下では`enable`で組み込みコマンドを再有効化することはもともとできません）。

あと、スラッシュ付きのコマンドの実行はできませんが、シェルへの入力はできてしまい、**入力補助でファイルリストが出ます**。`.inputrc`で`set disable-completion on`として止めておきましょう。

# 最後に
セキュリティに完璧はありません。この`rbash`を使った方法も、あくまでシェルログインに伴うリスクを**軽減**させる方法の1つでしかありません。もっと厳格にしたければ、上のように鍵を分けるほうがより安全だと思います。

# ポートフォワード専用シェルについて
「SSH接続でポートフォワードだけしたい」というのであれば、`ssh -N`とすることで、シェル設定なしでも可能とのことです。

# 脚注
[^1]: この両者の違いについては、[参考になるページ](http://blog.archinwaterworks.com/2014/06/false_or_nologin/)がありますので、詳細は省略します。
[^2]: もちろん、`PATH`はそのまま引き継がれるので、適宜調整する必要があります。
ちょいワルQ-Networkの話

春の陽気が待ち遠しい今日この頃，皆様いかがお過ごしでしょうか．
はじめまして，休日Deep Learning勢の329と申します．

# はじめに

DQNの生い立ち　＋　Deep Q-NetworkをChainerで書いた
http://qiita.com/Ugo-Nama/items/08c6a5f6a571335972d5

東方ProjectをDeepLearningで攻略した…かった。
http://qiita.com/imenurok/items/c6aa868107091cfa509c


これらの記事に影響を受け，
「DQNってもっと面白いことできるんじゃないの」
「DQN，強化学習，Deep Learningに興味を持ってもらうためのライトな記事を書こう」
などと考え，この記事を書きました．


# 対象読者

- DQNって聞いたことあるけど．詳しくは知らない（詳しく知るためのモチベが欲しい）
- DQNの気分を味わい，知った気になりたい

以上のような方に読んで頂き，将来的に面白コンテンツが1つでも増えれば良いと思っています．
DQNの，よりDeeeepな解説は強い技術者・研究者の皆様にお願いしたいと思います．



# 攻略対象

この記事では，ニューラルネットワークを使って「後出しジャンケン」を攻略します．
相手が出した手を見た後に自分のジャンケンの手を決定し，勝利するDQNなAIを生み出します．

# プログラムと解説

[github](https://github.com/g329/dqn.git)

上記のプログラムは， **状態を入力すると，各行動の良さを出力する**ことを目指して学習します．
後出しジャンケンで言うなら，「相手の手を見た時に，グー，チョキ，パーがそれぞれ何点くらいの価値がありそうかを計算する」ことに相当します．
勝利で1点，負けたら-1点，あいこでは0点が得られることにすると，相手の手を見た後の自分の手の価値は以下のようになります．

|     | グーの価値 | チョキの価値|パーの価値|
|:---:|   :---:  |   :---:   | :---:   |
|相手がグー|     0 |        -1 |      +1 |
|相手がチョキ|  +1 |         0 |      -1 |
|相手がパー|    -1 |        +1 |       0 |

\# 後出しジャンケンゲームに関してはこの表があれば既に必勝ですね？

相手の手を入力した際に，対応する列を出力するモデルを学習により獲得します．
以下がニューラルネットワークに関する記述です．

```py
class DqnModel(Chain):
    def __init__(self,num_of_state,num_of_action):
        self.num_of_state = num_of_state
        self.num_of_action = num_of_action
        super(DqnModel, self).__init__(
                state=F.EmbedID(num_of_state, 32),  
                l2=L.Linear(32, 64),
                l3=L.Linear(64, 64),
                l4=L.Linear(64, 32),
                q_action=L.Linear(32, self.num_of_action, initialW=np.zeros((self.num_of_action, 32), dtype=np.float32))
        )

    def __call__(self, state, target, train=True):
        h = self.state(state)
        h = self.l2(h)
        h = self.l3(h)
        h = self.l4(h)
        h = self.q_action(h)
        if train:
            loss = F.mean_squared_error(h, target)
            return loss
        else:
            return h
```

後出しジャンケンゲームでは状態が3つ，行動が3つ存在するので以下のように初期化します．


```py
model = DqnModel(num_of_state=3,num_of_action=3)
```

ネットワークの出力が，教師信号に近付くように最適化問題を解きます．
以下の記述で，最適化手法を選択しています．いろいろあります．

```py
optimizer = optimizers.Adam()
optimizer.setup(model)
```

以上で準備は完了です．あとはデータを用意して，

```py
optimizer.zero_grads()
loss = model(state, target)
loss.backward()
optimizer.update()
````

とすると最適化問題を解いて，「後出しジャンケンゲーム」の関数近似による攻略を試みます．
githubからcloneたプログラムを実行すると，以下のような結果が得られると思います．

```
[[ 0.02005649 -0.00832902 -0.01909292]]
相手    :  チョキ
あとだし :  グー
```

やりました．
後出しジャンケンゲームを「ちょい悪 Q Network」で攻略することができました．


# 残された課題

私が書いたプログラムでも，「後出しジャンケン」のような小規模なゲームなら攻略することができます．
しかし，以下のような課題からこのプログラムを通常のゲームに用いることは難しそうです．

1.「状態に対する行動の良さ」の測定方法が不明である
2. 状態の番号付けが困難（TVゲームの画面状態って，いったいどのくらいあるの？）

上記の問題は．今回私がお見せしたプログラムが「なんちゃってDQN」だったことに由来しています．
つまり「本物のDQN」は，これらの問題を何らかの方法で解決しているということです．


どうです，**気になって**きましたか？


# おわりに

読んで下さった方がもれなく「私気になります」となったなら私は小躍りでもしそうになるわけですが，
きっとそのようにはならないのだろうと予測しています．
ぜひとも不明な点や間違っている点などなどなどなど，コメントとして投稿して頂ければと思います．

### Chainerはいいぞ
Gitで特定のファイルのみ前のバージョンに戻す


特定のファイルを特定のコミットの状態に戻したい場合

```zsh
$ git checkout {hash} {filepath}
```


編集中の特定のファイルをheadの状態に戻したい場合は、

```zsh
$ git checkout {filepath}
```
[RubyMine] JetBrains系エディタの矩形選択で一気にコピー&ペーストする

JetBrains系エディタの便利な使い方の勉強会がしたくてたまらない今日このごろです

ジェットなブレインのみなさん、こんな使い方できるって知っていましたか？  

![Amx3ZxKyee.gif](https://qiita-image-store.s3.amazonaws.com/0/22567/40cd0454-d05c-893a-fb94-2c475f8eee13.gif)

`Shift` + `⌘` + `8` がモード切替のショートカットで、これでカーソル選択が矩形になります
※マウスを使いたい方は `alt` を押しながらドラッグすると矩形選択できます

さらにGIFでやっているのは複数行の先頭を揃えてから `Shift` + `alt` + `→` で単語の区切りまで移動させてコピー&ペーストしています 
この辺、うまく使うとかなり効率化できますよね、特にビュー側のデザインあてとか爆速！
ELBにSSL証明書を設定する方法


# 今回の流れ

* 1.秘密鍵の作成
* 2.証明書署名要求の作成
* 3.証明書の取得
* 4.中間証明書の取得
* 5.ELBに設置


## 1.秘密鍵の作成 && 証明書署名要求の作成


* 1.秘密鍵の作成

鍵の作成にはopensslを使用するのでインストール済みか確認してください

```
$ which openssl
/usr/local/bin/openssl
```

```
openssl genrsa -out 『任意の名前を設定』.pem 2048 -sha256
```

* 2.CSRの作成

```
openssl req -new -sha256 -key 『任意の名前を設定』.pem -out 『任意の名前を設定』.jp.csr
```

* CSRで入力する情報

```
項目
コモンネーム【Common Name】    例:)hoge.com
組織名【Organization】         例:)Hoge.Inc.
部門名【Organizational Unit】  例:)Web Development Devision
市区町村郡名【Locality】       例:)Shibuya-ku
都道府県名【State or Province】例:)Tokyo
国名【Country】                例:)JP
```

下記は任意で設定

メールアドレス【E-Mail address】 例:)hoge@hoge.com

パスフレーズ【Challenge password】 設定するとWEBサーバーの自動起動に支障をきたします。

##  3.証明書の取得

こちらは証明書購入元の指示にしたがってください。CSRが必要になります

##  4.中間証明書の取得

こちらも証明書購入元から取得

##  5.ELBに設置

ロードバランサーはすでに立ち上げ済みとします。
Configure Security Settingsで今まで作成したものをそれぞれを設定すればすぐに完了です

```
証明書名:*             → 任意で設定
プライベートキー:*     → 秘密鍵を登録
パブリックキー証明書:* → 証明書
証明書チェーン:	 　　　→ 中間証明書
```

簡単でいいですね！
S3で静的Webサイトホスティングからデプロイまで覚書


# 今回の流れ

* 1.S3でバケットの作成
* 2.バケットのホスティング設定
* 3.IAMの作成
* 4.ページをデプロイ
* 5.独自ドメインを設定

# 1.S3でバケットの作成

AWSの管理画面からS3のバケットを作成します。

バケット名:

独自のドメインを設定する場合はドメイン名とバケット名を合わせてください。

リージョン:

東京がいいかな?


# 2.バケットのホスティング設定

プロパティメニューから作成したバケットの「静的ウェブサイトホスティング」を
選択。

有効化しインデントとエラードキュメントを設定

# 3.IAMの作成

IAMでユーザーを新規作成後に「アクセスキーID」と「シークレットアクセスキー」が
発行されるのでメモをしておいてください。

作成したユーザーの「ポリシーのアタッチ」から「AmazonS3FullAccess」を
選択

# 4.ページをデプロイ

デプロイには「s3cmd」を使用します。

インストール済みなことを確認

```
$ which s3cmd
/usr/local/bin/s3cmd
```

デプロイしたいルート・ディレクトリで設定ファイルを作成します。

```
s3cmd -c ./.s3cfg --configure
Access Key: アクセスキー
Secret Key: シークレットキー
Encryption password:
Path to GPG program: None
Use HTTPS protocol: True
HTTP Proxy server name:
HTTP Proxy server port: 0
```

これで`./s3cfg`という設定ファイルができあがる

```
$ ls -la
total 48
drwxr-xr-x  10 hoge-user  staff   340  2 19 10:19 .
drwxr-xr-x  60 hoge-user  staff  2040  2 18 18:48 ..
-rw-r--r--@  1 hoge-user  staff  6148  2 14 16:54 .DS_Store
-rw-------   1 hoge-user  staff  1781  2 19 10:19 .s3cfg
-rwxrwxrwx   1 hoge-user  staff    79  2 19 09:42 deploy.sh
drwxr-xr-x   8 hoge-user  staff   272  2 16 00:18 dist
-rw-r--r--   1 hoge-user  staff  1532  2 16 00:50 gulpfile.js
drwxr-xr-x   7 hoge-user  staff   238  2 14 16:24 node_modules
-rw-r--r--   1 hoge-user  staff   402  2 14 16:24 package.json
drwxr-xr-x   9 hoge-user  staff   306  2 16 00:19 src
```

これでいよいよデプロイ

デプロイしたいディレクトリとデプロイ先のバケット名を指定してあげる

```
s3cmd -c .s3cfg -P --follow-symlinks sync ./ディレクトリを指定/ s3://バケット名を指定/
```

コマンドが長いのでスクリプトにしてもいいと思います

```
$ cat deploy.sh
#!/bin/sh
s3cmd -c .s3cfg -P --follow-symlinks sync ./ディレクトリを指定/ s3://バケット名を指定/
```

5.独自ドメインを設定
DNSレコードにCNAMEでS3のエンドポイントを指定してあげればOKです！


簡単でいいですね！
【Rails】enviromentsの読み込みを設定をinitializersファイルロード後にする方法


# はじめに

enviromentsの設定でinitializers内で拡張したメソッドを
使おうとすると通常の読み込み順では使えない

config内の読み込み順

```
"environment.rb",
"application.rb",
"boot.rb",
"environments/*",
"initializers/*",
"routes.rb"
```

# 解決

`after_initialize`というメソッドで意図した順番で
読み込んでくれることができる

```
Rails.application.configure do
  config.after_initialize do
    # ここに設定を記述
  end

end

```
c++ builder > DWORDではまる > unsigned long型に対して負をとろうとしていた

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

DWORDではまった。

`DWORD m_diff_datetime_sec;`
として定義していた値に対して

`m_diff_datetime_sec= -(m_diff_datetime_sec);`
という処理をしていた。

DWORDは`unsigned long`型なのでマイナスした値はラップアラウンドして大きな値になっていた。

この値を使って補正した日付は2052年3月25日になっていた。

[最近話題が出ていた](http://postd.cc/how-to-c-in-2016-1/) stdint.h を使って uint64_t 型などとしていれば早く気づいたか、やはりそれでも見落としていたかは分からない。
slimerjsでコマンドライン引数を取得するには

# 背景

WebGLなページをXvfb経由で取得したかったので、Slimerjsにたどり着いた。

# コマンドライン引数を取得

```js
var p1 = phantom.args[0];
```

```js
slimer.exit()
```

なんかが、すぐ紹介されていて、Phantomjs互換なAPIとの紹介を見て、

```js
slimer.args
```

としたが、undefinedで少し焦った。

コマンドライン引数の取得APIは、まさにphantomjsのAPIと
全く同じだった。
【Android】DataBindingのGradleの設定が変わった

年が明けてから新しく`DataBinding`を使用するプロジェクトを作成しようとしたら、ビルドが通らなかったので、調べた解決策を記載します。

# 今までの方法
```build.gradle
dependencies {
   classpath "com.android.tools.build:gradle:1.3.0-beta1"
   classpath "com.android.databinding:dataBinder:1.0-rc0"
}
```

```app/build.gradle
apply plugin: ‘com.android.application'
apply plugin: 'com.android.databinding'
```
今まで、というか去年の年末まではこの方法で大丈夫だったはず。。

# 新しい方法
`build.gradle`を以下のように修正してsyncします。

```build.gradle
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-beta5'
    }
```
```app/build.gradle
android {
    dataBinding {
        enabled = true
    }
}
```

DataBindingが1.0になったタイミングでGradleに含まれるようになり、設定が変わったらしい。

# なんだ楽勝じゃん
って思ったらDataBindingUtilが予測に出てこない。。

よく見るとsyncでエラーが出ていた。

# Warning:Gradle version 2.10 is required. Current version is 2.8
というメッセージが。

なるほど、バージョンあげればいいのね。

`gradle>wrapper>gradle-wrapper.properties`を以下のように修正してsyncします。

```gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-2.11-all.zip
```

# Warningが消えない
syncしてもInvalidate Caches/RestartしてもWarningが消えない。おや・・・？

# Gradleを手動でダウンロードしてくる
結局`gradle-2.11-all.zip`をhttps://services.gradle.org/distributions から直接ダウンロードしてきてGradle homeに配置したら直りました。
(Gradle homeは`Settings`から"Gradle"で検索すれば見つかります。)

# まとめ
まず`build.gradle`を修正します。

```build.gradle
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-beta5'
    }
```
```app/build.gradle
android {
    dataBinding {
        enabled = true
    }
}
```

次に`gradle/wrapper/gradle-wrapper.properties`を修正します。

```gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-2.11-all.zip
```

これでsyncしてもエラーが消えない場合は
`gradle-2.11-all.zip`をhttps://services.gradle.org/distributions から
直接ダウンロードしてきてGradle homeに配置してsyncします。
それでもエラーが出ていたらInvalidate Caches/Restartしてください。

※Gradleのバージョンは現時点での最新を使いました。適宜読み替えてください。

# 参考リンク
http://developer.android.com/intl/ja/tools/data-binding/guide.html
http://stackoverflow.com/questions/34037009/android-data-binding-nosuchmethoderror/34069832#34069832
http://www.codeprogression.com/2015/11/12/data-binding-closure/
http://naotoogawa.hatenablog.jp/entry/2016/01/23/Warning%3AGradle_version_2_10_is_required__Current_version_is_2_8
http://qiita.com/hkurokawa/items/1c53c7de1c277b7f7675
http://qiita.com/AbeHaruhiko/items/fd9a01ad6fc84309e857
git: カレントブランチ以外を更新する

featureブランチにこもって作業中。masterを最新にしたい。(checkoutはしたくない)

```bash
git fetch origin master:master
```

カレントブランチに対して行うとエラーになります。わかるようなわからないような。その場合は普通にpullしましょう。
CentOS6のreposyncでEPEL7のリポジトリをミラーする時のエラー対策メモ

# エラーが出る

CentOS6でEPEL7のリポジトリのミラーを作ろうとしていたらエラーが出た。`/etc/yum.repos.d/epel-local.repo`に`[epel7]`というセクションを作って`reposync`した。

```
# reposync --arch=x86_64 --norepopath -r epel7 -p /var/www/html/epel/7/x86_64
Traceback (most recent call last):
  File "/usr/bin/reposync", line 352, in <module>
    main()
  File "/usr/bin/reposync", line 195, in main
    my.doSackSetup(arches)
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 650, in doSackSetup
    return self._getSacks(archlist=archlist, thisrepo=thisrepo)
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 687, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.6/site-packages/yum/repos.py", line 324, in populateSack
    sack.populate(repo, mdtype, callback, cacheonly)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 176, in populate
    db_un_fn = misc.decompress(db_fn)
  File "/usr/lib/python2.6/site-packages/yum/misc.py", line 1100, in decompress
    _decompress_chunked(filename, out, ztype)
  File "/usr/lib/python2.6/site-packages/yum/misc.py", line 732, in _decompress_chunked
    raise Errors.MiscError, msg
yum.Errors.MiscError: xz compression not available
```

どうやらyumがxzを扱えていないらしい。


# 対策

ググったら`mock`というパッケージを入れると問題が解決するとのこと。たぶんmockのおかげじゃなくて、修正版mockが入ることでyumがxzに対応するんだと思う（未確認）。

```
# yum install epel-release -y
# yum install mock -y
```

# 参考
https://access.redhat.com/discussions/918083
https://bugzilla.redhat.com/show_bug.cgi?id=1099676
Implementing functional languages を頑張って読む.1日目

# 1日目
[Implementing functional languages: a tutorial](https://www.google.com.au/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiCltrpo43LAhXEFZQKHVKDDRIQFgggMAA&url=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fum%2Fpeople%2Fsimonpj%2FPapers%2Fpj-lester-book%2F&usg=AFQjCNF5yFcGU5LUtS2BCmPHhZ--2UY8oQ&bvm=bv.114733917,d.dGo)を読んで重要な所のメモをする.
[パーサができた(Haskell)](http://qiita.com/amama/items/406aab20f5a82fbbeeb0)

## 1.1
Core Programは_supercombinator difinitions_で構成される.
引数がないものは_constant applicative forms_という.
let…in…式とletrec…in…式があり,局所定義ができる.
let式はletrecよりも簡単.
束縛するものは簡単な変数でなければならない.
let式の値はin…の部分.
lambda式もある.
ラムダ式をトップレベルのsupercombinator difinitionに変換することができ,_ラムダ抽象_と呼ぶ.
_structured types_,すなわち構造化された型(構造体)は_algebraic data types_,すなわち代数的データ型と呼ぶ.
この型はA|Bの型を持つ,みたいな.

```hs
tree * ::= Leaf * | Branch (tree *) (tree *)
```

(Mirrandaでは)代数的データ型はパターンマッチに使える.
簡単なコンストラクタでこれを何とかする.
case式に落とす.
Pack{_tag_, _arity_}を使ってコンストラクタを表現する.
_tag_は実際のコンストラクタ,_arity_は引数の数.
`Branch (Leaf 3) (Leaf 4)`を`Pack{7,2} (Pack{6,1} 3) (Pack{6,1} 4)`とかく.面倒!
よくわからない

> The tag is required so that objects built with different constructors can be distinguished from one
> another. In a well-typed program, objects of different type will never need to be distinguished
> at run-time, so tags only need to be unique within a data type. Hence, we can start the tag at
> 1 afresh for each new data type, giving the following representation:

Cのenumみたいなもの?
case式

```
isRed c = case c of
  <1> -> True ;
  <2> -> False ;
  <3> -> False
depth t = case t of
  <1> n -> 0 ;
  <2> t1 t2 -> 1 + max (depth t1) (depth t2)
```

case式の数字はpackで作ったtagの数字だけらしい.

## 1.2
演算子のテーブル

| 優先順位 | 結合性 | 演算子 |
|:--:|:--:|:--:|
| 6 | 左 | 適用 |
| 5 | 右 | * |
|   | なし | / |
| 4 | 右 | + |
|   | なし | - |
| 3 | なし | == ˜= > >= < <= |
| 2 | 右 | & |
| 1 | 右 | \| |

簡単のために,`x/y/z`なんて表記はできない.結合性が「なし」の演算子は全部そうだと思う.
単項-(マイナス)や単項!(否定)なんてものはない.

## 1.3
Core ProgramをコンパイルするためにCore Program用のデータ型を作る.やっとそれっぽくなってきた!
Mirandaなんて使わないので,C(とできればSchemeでも)で書く.
Mirandaの文法なんて知らないので,コードの雰囲気でそれっぽく書くので,いつの間にか変わってるかも.

```hs:言語はMiranda
module Language where
import Utils
data Expr a
   = EVar Name -- Variables
   | ENum Int -- Numbers
   | EConstr Int Int -- Constructor tag arity
   | EAp (Expr a) (Expr a) -- Applications
   | ELet -- Let(rec) expressions
   IsRec -- boolean with True = recursive,
   [(a, Expr a)] -- Definitions
   (Expr a) -- Body of let(rec)
   | ECase -- Case expression
   (Expr a) -- Expression to scrutinise
   [Alter a] -- Alternatives
   | ELam [a] (Expr a) -- Lambda abstractions
    deriving (Text)
```

```c:c11
#include <stdalign.h>

/*
|~~~|num|
0:reserved
1:ENum
2:EConstr
3:EAp
4:ELet
5:ELetrec
6:Ecase
7:ELam
8:EVar
9~15:reserved
*/

struct {
	alignas(16) void *car;
	alignas(16) void *cdr;
} typedef Expr;

```

**17ページまで進んだ**
Sassの変数を使って少し快適にBEMを使う

cssのクラスをBEMを参考に命名しています。これにより名前の衝突の可能性を下げ安心してcssを書いていくことができます。反面、文字数が長くなるので打つのも読むの大変になります。

```scss
.my-awesome-block {
  padding: 20px;
}

.my-awesome-block__element-1 {
  > p {
    font-size: 16px;
  }
}

.my-wesome-block--modifier {
  .my-awesome-block__element-1 {
    > p {
      font-size: 24px;
    }
  }
}
```

Sassの機能、変数を使って読みやすくします。ファイル上部でどのようなブロック、モディファイア、エレメントが存在するかリストされる点も良いです。

```scss
$block: ".my-awesome-block";
$block-modified: "#{$block}__modifier":
$element1: "#{$block}__element-1";

#{$block} {
  padding: 20px;
}

#{$element1} {
  > p {
    font-size: 16px;
  }
}

#{$block-modified} {
  #{$element-1} {
    > p {
      font-size: 24px;
    }
  }
}
```
久しぶりにvagrant upでFailed to mount foldersのエラー発生 (vagrant1.8.1)

# はじめに
久しぶりに触るサービスがあり、``vagrant up``したらエラーになったので回避策を書きます。

## 環境
[ホストOS] Mac OSX Yosemite
[ゲストOS] CentOS6.5
Vagrant 1.8.1
VirtualBox 5.0.14


# 起きたエラー

vagrant upの途中で

```vim
GuestAdditions versions on your host (5.0.14) and guest (4.3.4) do not match.
```
のようにバージョン合わないよの警告が出て、最終的に

```vim
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

が発生

# 解決した方法

まずはゲストOSにログイン

```vim
vagrant ssh
```

yum.confの編集

```vim
sudo vi /etc/yum.conf
```

``exclude=kernel*``をコメントアウト

```
#exclude=kernel*
```

kernelたぐいのupdate

```
sudo yum -y update kernel
```

```
sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
```

ゲストOSをexitして

```
exit
```

再起動　(多分vagrant reloadでも大丈夫)

```
vagrant halt
vagrant up
```

すると無事成功しました。

```
==> default: Complete!
==> default: Initializing database: 
==> default: [  OK  ]
```

# まとめ
一定の頻度で何らかvagrant upでエラーが起きて対応している気が。
前回は``vagrant-vbguest``の適用した気がします。

dockerも良いけど、vagrantはvagrantで好きなんですけどね。
何だか相性が合わない:disappointed_relieved:
アルファベットの配列つくる


`*` (Splat Operator) を使うといろんな書き方できますね。

アルファベットの配列を作ってみます。

```rb
('a'..'z').to_a
# => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
```

こう書けますね。

```rb
[*'a'..'z']
# => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
```

## ちな
不要なアルファベットがあるときはこんなかんじ？

```rb
[*'a'..'z'].delete_if {|a| a =~ /[p|x|z|]/}
# => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "q", "r", "s", "t", "u", "v", "w", "y"]
```


## もっといろいろできる
REF

- Ruby Splat Operator : https://gist.github.com/francisco-rojas/db0fb04ed6aa509acc18
- ここまで出来る！RubyのSplat Operatorまとめ - RailsとRubyとVimのブログ : http://alpaca.tc/blog/ruby/how-to-use-star.html
CircleCIでgolang1.6を使いたい際の設定

Circle CIでgolang1.6がまだ対応してないっぽいので超適当に書いた設定を晒す

```yaml
dependencies:
  cache_directories:
    - ~/cache

  override:
    - |
      mkdir -p ~/cache/gopath
      cd ~/cache
      file=go1.6.linux-amd64.tar.gz
      if [ ! -e $file ]; then
        wget https://storage.googleapis.com/golang/$file
        tar xf $file
      fi

test:
  override:
    - |
      export GOPATH=$HOME/cache/gopath
      export GOROOT=$HOME/cache/go
      export PATH=$GOROOT/bin:$PATH
      export workdir=$GOPATH/src/github.com/user/project
      mkdir -p `dirname $workdir`
      ln -s $PWD $workdir 2> /dev/null || true
      cd $workdir
      go get ./...
      go test ./...
      # そのたもろもろ
```
AWS Lambdaを他サービスとつなげてみた

# Lambda * XXX

## アウトライン
* Lambdaってなに
* VPC対応したね
* 使い道は？
* 他AWSサービスとの相性は？
* まとめ

## Lambdaってなに
ご存知イベント駆動のAWSサービス
_前提：Python + boto3以外つかったことない_

## VPC対応したね
VPC対応した = RDSつなげられるやん！
ENI起動時間かかりすぎ（１分くらい見といたほうがいい）
公式でENI起動時間に対しての言及はなし


## 使い道は？
* ソース管理の仕組みに難儀してる = Gitでﾋｮｲってしたいときに手間
* なんか起きたらなんか起こしたいって時は真っ先に導入してみるとよさげ


## 他AWSサービスとの相性は？
* EC2
  + AMIバックアップ用途で使ってる
  + cronつかってなんかするのとトレードオフ関係（要試算）
    - 1回/1dayとかならLambda
    - 1回/5minとかならcron
* RDS
  + 問題なし
  + RDS + Lambdaってなんかしっくりこない感ある
  + RDSのパフォーマンスチューニング必須感のせい？
* S3
  + なんかしらをS3にぶっこむのは楽
  + リアルタイム系はちょっとつらみある
    - リアルタイム系はKinesis Firehoseつかえば、S3にデータ流し込んでくれる。（ただし東京Regionまだ無いし、Kinesisよりもお高い。）
* API Gateway
  + API Gateway自身の10秒縛りが結構ネック
    - VPC対応すると初回アクセスで死ぬ
    - 寝そうなLambda叩き起こす（ポーリングさせる）Lambdaを別で作らないといけない
  + Webアプリのモック作るのとかは楽勝
* DynamoDB
  + 今のところ特に問題なし
* SES
  + メール受信駆動でなんかやるときも楽勝
  + Java版じゃないとメール保存にS3使うときの暗号化死んでるから注意
* CloudWatch Logs
  + CloudWatch Logs自体のUIにつらみある
  + ちゃんとInvocation CountとかInvocation durationとかは出てるので、動作確認は容易
* Cognito
  + 超未来ひろがる系
  + クライアントストレージ使いたい、同期したい時にそれ用の設計ちゃんとできれば強そう
* Kinesis
 + Kinesisを経由させるとJSONの縛りがなくなるので便利。(Pyhon 2.7の場合。ほかはわかんねーっす）
 + パフォーマンスがKinesisに依存してしまうのでチューニング時に注意が必要
* Redshift
 + Python2.7使ってアクセスしたい場合はpsycopg2をソースからコンパイルしないといけないのでちょっとめんどくさい
   


## まとめ
* デプロイもテストも楽チンすぎて、仕事してない感ある
* なんかやりたいとき、すぐに試せるお手軽感はたまらない
* 速度求めてメモリあげてパフォーマンスチューニングしてーっていう謎の方向に進みがちなので、そうなるくらいなら別の選択肢にすぐうつったほうがいい



### 余談
スライドネタのアウトラインをそのまま公開する試みでした。

1. MarkDownでアウトライン書く
2. 中身を太らせる
3. テンプレパワポ(GooglePresentation)にペタペタコピペ

の手順でいつも登壇資料つくるので、上記の `2.` の段階でござるよ。

無許可の丸パクリはやーよ。
feat. aoike
WKWebView内で動作するJavaScriptをデバックする方法

Safari 9.0.3 iOS 9.2.1で確認しています。

なんだかんだでSafariとWKWebViewで動作が異なったりする場合もあるので、console.logとか出力したい時があります。ありますよね？

簡単にできないかな..と思ってggると当然のようにヒットするのは信頼と実績のStackOverFlow

http://stackoverflow.com/questions/25871586/how-to-debug-javascript-code-inside-a-wkwebview

ついたコメントによればnightly build のsafariならデバックできるとのこと。
コメントの日付を見ると2014年。

ふと思いついて

1. ライトニングケーブルで手持ちのiPadをMacにつなぎ
2. safari(9.0.3)を起動
3. safariのメニュー > Device > 自分のiPadを選ぶ

とWKWebViewのインスタンスが表示されておりました。

![Screen Shot 2016-02-23 at 17.53.33.png](https://qiita-image-store.s3.amazonaws.com/0/74328/3ee76c2a-b6c2-9ccd-97fb-69bb30e21ead.png)


選択すればconsole.logの結果も表示され放題です。
ふつーにデバックできるじゃん！
WKWebViewばんざい！

めでたしめでたし。
Python3での16進のあつかい

セキュリティ関連でハッシュなどを使うときに、そのままprintで表示しても文字化けしちゃって読めないので、そこら辺をいろいろいじっていたときのメモ。

# str型とbytes型
```py3
'test' == b'test'
```
srt型とbytes型なので、もちろん違うのでFalseが返ってくる。

# str->bytesへの変換

```py3
'test'.encode('utf-8') == b'test'
```
strをbytes型へ変換してるのでTrueが返ってくる。

# バイナリデータの16進表現を返す
```py3
from binascii import hexlify
hexlify(b'A')
```
「b'41'」が返ってくる。

# 16進表記の文字列hexstrの表すバイナリデータを返す
```py3
from binascii import unhexlify
unhexlify(b'41')
```
hexlifyの逆なので「b'A'」が返ってくる。

# b''を取り外したい
```py3
b'A'.decode('utf-8')
```

# 上記をふまえてhashを使ってみる
```py3
import hashlib

from binascii import hexlify

origin = 'あ'
encoded_origin = origin.encode('utf-8')
hash_obj = hashlib.sha256()
hash_obj.update(encoded_origin)
digest = hash_obj.digest()
print(digest)                 # 人間が読めない
print(hexlify(digest))        # 人間が読める
```
[Project Euler] problem1

実質ワンライナーで書けた

```Python
# -*- coding: utf-8 -*-
'''
If we list all the natural numbers below 10 that are multiples of 3 or 5,
we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.
'''
import doctest
from functools import reduce


def problem(i,j):
    '''
    >>> problem(1,10)
    23
    '''
    return reduce(lambda x,y:x+y, [i for i in range(i,j) if not i % 5 or not i % 3])


if __name__ == "__main__":
    doctest.testmod()
    print(problem(1,1000))
```
macにjava8をインストール

# macにjava8をインストール

### 環境

現在の状態

Mac Book Air
OS X Yosemite

### brew で install

現在はbrewで入れたjava7がインストールされている状態

### java8 インストール 手順

#### 1. brewを更新

```
brew update && brew cleanup
```

#### 2. java8インストール

```
brew cask install java
```

#### 3. インストールされてる全てのバージョンを確認

```
/usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    1.8.0_74, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home
    1.7.0_72, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home
```

#### 4. .bash_profileとか.zshrcに書く

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```

#### 5. 設定したバージョンを確認

```
java -version 
```

#### 6. 消すとき

```
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home
```
Prestoからredshiftへ繋ぐ方法

postgresコネクターを使って繋ぐ事が出来る。

redshiftがSSL対応になっていると思うので、jdbcの文字列を以下のようにする


```
connection-url=jdbc:postgresql://IPアドレス:ポート番号/DB名?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
```