OmniAICreator/Qiita-1.07M huggingface dataset:
SupervisorのEventListenerを使ってプロセスの状態変化をSlackに通知する


## はじめに
supervisorを運用していて、まれにプロセスが落ちているときはないでしょうか？
外部監視するという方法もあるとは思いますが、以前から気になっていたSupervisorのEventListenerを使ってプロセスの状態変化をSlackに通知するようにしてみました。

## やったこと
### 設定ファイルの作成
下記のように設定ファイルを作成します。

```/etc/supervisord.d/process_state_event_listener.conf
[eventlistener:process_state_event_listener]
command=python /path/to/process_state_event_listener.py
events=PROCESS_STATE
redirect_stderr=false
stdout_logfile=/var/log/supervisor/event_listener_stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stderr_logfile=/var/log/supervisor/event_listener_stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=5
environment=SLACK_WEB_HOOK_URL="https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxxx"
```

#### events
プロセスの状態変化をすべて通知したいので、`PROCESS_STATE`を指定します。

#### environment
Slackに通知するために、Incoming WebHook用のURLを環境変数にセットします。

#### 参考URL
- http://supervisord.org/events.html#configuring-an-event-listener

### イベントリスナーの作成
最終的に下記のようなコードになりました。

```/path/to/process_state_event_listener.py
import sys
import os
from supervisor import childutils
from datetime import datetime
import slackweb


def main():
    while True:
        run_forever()


def run_forever():

    headers, payload = childutils.listener.wait(sys.stdin, sys.stdout)
    eventname = headers['eventname']

    payload_header, data = childutils.eventdata(payload+'\n')

    childutils.listener.ok(sys.stdout)

    color = "good"
    if eventname in ['PROCESS_STATE_BACKOFF', 'PROCESS_STATE_EXITED', 'PROCESS_STATE_FATAL', 'PROCESS_STATE_UNKNOWN']:
        color = "danger"

    attachment = {
        "title": "event",
        "text": eventname,
        "color": color,
        "fields": [{
            "title": "datetime",
            "value": datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        }, {
            "title": "hostname",
            "value": os.uname()[1]
        }]
    }

    if 'processname' in payload_header:
        attachment["fields"].append({
            "title": "process",
            "value": payload_header['processname']
        })

    if 'expected' in payload_header:
        attachment["fields"].append({
            "title": "expected",
            "value": payload_header['expected']
        })

    if 'SLACK_WEB_HOOK_URL' in os.environ:
        slack_url = os.environ['SLACK_WEB_HOOK_URL']
        slack = slackweb.Slack(url=slack_url)
        slack.notify(attachments=[attachment])


if __name__ == '__main__':
    main()
```

#### 通知イメージ
![supervisor_slack.png](https://qiita-image-store.s3.amazonaws.com/0/26422/c1087864-f461-beb2-cf24-9d624370ec8c.png "supervisor_slack.png")


#### 参考URL
- [Slackにincoming webhook経由でpythonからメッセージをPOSTする - Qiita](http://qiita.com/satoshi03/items/14495bf431b1932cb90b)

## おわりに
メール通知でよければ[superlance](https://pypi.python.org/pypi/superlance)というプラグインがあるのですが、[OP25B](https://ja.wikipedia.org/wiki/Outbound_Port_25_Blocking)問題でgmailにメールが届かなかったりしたので、Slackに通知してみました。
Supervisorを利用することが増えてきたので、今後もいろいろ応用していきたいと思います。
Unicode結合文字列の怪 Mac OS X & fish shell & JavaScript編


# 最初に結論
1. Mac OS Xではシェルによって、入力文字列にUnicodeの結合文字列が混ざることがある
2. JavaScriptでは、String.prototype.normalize()を使って`NFC`に変換すると良い

# 事件
## 事象
`デ`を含む文字列（デイリー）を[repalace](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)できない現象が起きました。

## 再現コード


```javascript:index.js
const {
  Transform
} = require('stream')

process.stdin
  .pipe(new Transform({
    transform(chunk, encoding, callback) {
      callback(null, chunk.toString()
        .replace('デイリー', ''))
    }
  }))
  .pipe(process.stdout)
```
https://gist.github.com/ledsun/7e1fecd5214f854f68d4ca35a559845c

を

```
echo 'デイリー' | node .
```
な風に実行します。

`デイリー`が空文字に置換されます。普通は何も表示されません。
ところが、Mac OS上の[fish shell](https://fishshell.com/)で実行すると`デイリー`がそのまま表示されます。

不可解な事件です。


## 発生条件
置換条件の`デイリー`を少しずつ変えて、発生条件を絞り込みます。
`デ`が入ると、置換できません。

### 置換される
- イリー
- リー
- ー

### 置換されない
- デイリー
- デイ
- デ

# 調査内容
## 実際に受け取っているバイト文字列

次のプログラムを使ってバイト文字列の差を確認してみます。

```javascript:index.js
process.stdin.on('readable', () => {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    console.log(chunk)
  }
})
```
https://gist.github.com/ledsun/e1fc7e77dd688da9302648cef0086b82

### 結果
実際、違うのです。


#### Bash

```
<Buffer e3 83 87 e3 82 a4 e3 83 aa e3 83 bc 0a> 
```


#### fish shell
```
<Buffer e3 83 86 e3 82 99 e3 82 a4 e3 83 aa e3 83 bc 0a> 
```




何者かが一文字増えています。

### 何がちがうのか？
[複数の文字コード方式に一括変換 | エンコード / デコード ツール](http://so-zou.jp/web-app/text/encode-decode/)を使って何が違うか確認してみましょう。
#### Bash

```
<Buffer e3 83 87 e3 82 a4 e3 83 aa e3 83 bc 0a> 
```

- デ `e3 83 87` 
- イ `e3 82 a4`
- リ `e3 83 aa`
- ー `e3 83 bc`

#### fish shell
```
<Buffer e3 83 86 e3 82 99 e3 82 a4 e3 83 aa e3 83 bc 0a> 
```

- テ `e3 83 86`
- ? `e3 82 99`
- イ `e3 82 a4`
- リ `e3 83 aa`
- ー `e3 83 bc`

`デ`が`テ`に変わています。何者かが、一文字増えています。

### 何か？
`u+e38299`でググると[Unicode Character 'COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK' (U+3099)](http://www.fileformat.info/info/unicode/char/3099/index.htm)がでてきます。

つまり`デ`が`テ`と濁点に分かれていました。

## 原因
結論を言うと、一見`デ`見えているものは、`テ`と`゛`がUnicodeの結合文字列として、一つに見えているものです。

- [Unicodeの特殊な文字 “結合文字列” – ものかの](http://tama-san.com/combining_character_sequence/)
- [Mac OS X の NFD 問題での対策諸々](http://qiita.com/knaka/items/48e1799b56d520af6a09)


`テ`と`゛`は、バイト文字列としては`デ`ではありません。
`デ`はマッチしません。

## 対策
[String.prototype.normalize()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)を使うと、`テ`と`゛`を`デ`に変換できます。`デ`として、見た目通りに、扱えます。

# 謝辞
原因究明にあたり、 @mysticatea 氏と @matarillo 氏にとても助けられました。

- https://twitter.com/mysticatea/status/780696729817493504
- https://twitter.com/matarillo/status/780696380666814464

ありがとうございました。
Nginxのlocationを使ってDocumentRootの外に配置されたアプリを動作させる方法


* Nginxの設定でなかなかハマってしまったので、最終的に動いた設定をメモしておきます。

## やりたいこと
* 例えば、www.your-domain.com/subdirでアクセスしたときに、DocumentRootの外にあるWordPressやフレームワークアプリを実行させたい。

	``` tree
	/path/to/your/document/root/for
		├─ www.your-domain.com
		│	├── _root_				< アクセスURL:www.your-domain.com
		│	└── subdir				< アクセスURL:www.your-domain.com/subdir
	```


## 前提

* Nginx + PHP-FPM + MariaDBで構成されてたLEMP-APサーバ。(あ、MariaDBはどうでもいいや。)
* subdirにおいたアプリは、FrameWorkやらWordPressやらのお作法に従って、サブディレクトリ運用する設定にしておく。

## 設定

* /etc/nginx/conf.d/xxxxxxx.confを編集
	
	``` bash:/etc/nginx/conf.d/xxxxxxx.conf
	server  {
		listen 80;
		server_name www.your-domain.com;
		
		location / {
			root /path/to/your/document/root/for/www.your-domain.com/_root_;
			index index.php index.html;
			if (-f $request_filename) {
				expires 30d;
				break;
			}
			if (!-e $request_filename) {
				rewrite ^(.*)$ /index.php?q=$1 last;
			}
			location ~ .php$ {
				fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
				fastcgi_index index.php;
				include /etc/nginx/fastcgi_params;
				fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
			}
		}
		
		location /subdir {
			alias /path/to/your/document/root/for/www.your-domain.com/subdir;
			index index.php index.html;
			if (-f $request_filename) {
				expires 30d;
				break;
			}
			if (!-e $request_filename) {
				rewrite ^(.*)$ /subdir/index.php?q=$1 last;
			}
		
			location ~ ^/subdir/.+\.php$ {
				fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
				fastcgi_split_path_info ^/subdir(.+\.php)(.*)$;
				include /etc/nginx/fastcgi_params;
				fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
			}
		}
	}
	```

* PHP-FPM & Nginx 再起動

	``` bash:console
	/etc/rc.d/init.d/php-fpm restart
	/etc/rc.d/init.d/nginx restart
	```

* 上記の設定でやりたいことは実現できた。
AlamofireImageでさくっと画像をURLから取得 + Cache

コード間違ってたらすいません。

#What is Alamofire and AlamofireImage?
Alamofire is an HTTP networking library written in Swift, and AlamofireImage which is an image component library for Alamofire.

#Why do we have to use AlamofireImage to retrieve an image?
Some people have a setback in retrieving image and using cache, so I highly recommend you to use Image Downloader from AlamofireImage. As you know, if iPhone retrieves image data and stores in it, those images will be used a lot of memory. Therefore, we have to use cache to deal it. Image Downloader includes Cache function. It means we do not need to spend a time with coding cache.

#Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 2.3

#  Code
```swift:ViewController.swift
import UIKit
import AlamofireImage
class ViewController: UIViewController {
    @IBOutlet weak var profileImage: UIImageView!
    let downloader = ImageDownloader()

    override func viewDidLoad() {
        super.viewDidLoad()
        retrieveProfileImage()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
extension ViewController{
        func retrieveProfileImage(){
            // Set Image URL
            let urlString = "http://~~"
            // Display Profile Image (downloader function includes cache function)
            let URLRequest = NSURLRequest(URL: NSURL(string: urlString!)!)
            downloader.downloadImage(URLRequest: URLRequest) { response in
                if let image = response.result.value {
                    self.profileImage.image = image
                }
          }
    }
}
```
#Conclusion
超簡単かつ便利。
Wildfly 10.1の新機能！

Wildfly10.1がリリースされました！
リリースノートから、主な新機能を見ていきたいと思います。

- フルHTTP/2サポート
    - HTTP2がこのバージョンから正式にサポートされるようになりました。HTTP２を利用すると、通信が早くなるみたいです。
- ロードバランス機能の強化
    - domain.xmlという設定ファイルが追加され、デフォルトのドメインモードを利用すると簡単にロードバランスが実現できるようになったようです。（これはすごい！）
- Azure上でのクラスタリングノードディスカバリ機能のサポート
- その他バグ修正


さらに！、このバージョンのWildflyからTLS（HTTPS通信）が設定なしで使えるようになった様です。これにより、これまでOpenSSHを使ってオレオレ証明書を作ってそれを読み込ませて、、、といった設定が必要なくなります。コレはかなり便利ですね。


※もちろん、外に公開する場合は正規の認証局からのお墨付きの証明書を設定する必要があるのは言うまでもありません。

詳しくはこちらを御覧ください。
http://wildfly.org/news/2016/08/19/WildFly10-1-Released/
ActiveRecordでSQLite3のBoolean値は0/1ではなく'f'/'t'

ActiveRecord + SQLite3のBoolean値でハマった。

Boolean値としてtrueが入っている(ように見える)レコードがあるとき、
そのBoolean値を検索条件にするとヒットしないことがある。

```ruby
Widget.find(1)
# => { id: 1, name: "hoge", valid: true }

Widget.where(valid: true).first
# => nil # あれ？
```

DBの中身をコマンドラインで直接見てみる。

```sqlite3

sqlite> SELECT * FROM widgets;
id  name  valid
--- ----- ------
1   hoge  1
```

うーん、SQLite3ってBoolean値を直接サポートしてないからその辺か？
SQLite3側のドキュメントを見ると、以下のように書いてあるから良さそうだけど。

> SQLite does not have a separate Boolean storage class. Instead,
> Boolean values are stored as integers 0 (false) and 1 (true).
> https://www.sqlite.org/datatype3.html

ActiveRecord側を調べてみる。
こんな記事があった。
http://stackoverflow.com/questions/23223821/sqlite-boolean-t-and-f-with-rails-active-record
http://stackoverflow.com/questions/6013121/rails-3-sqlite3-boolean-false

Boolean値は0/1ではなく'f'/'t'らしい。
コマンドラインで変更してみる。

```sqlite3
sqlite> UPDATE widgets SET valid = 't';
sqlite> SELECT * FROM widgets;
id  name  valid
--- ----- ------
1   hoge  t
```

これでいけるか？

```ruby
Widget.where(valid: true).first
# => { id: 1, name: "hoge", valid: true }
```

できた。


※補足
データ生成・編集もすべてActiveRecordでやっていれば問題は発生しない(と思う)。
外部(例えばsqlite3のコマンドライン)で作ったデータを使うときには注意が必要なようだ。

### 追記
Rails 5.2から仕様が変わったとコメントで教えて頂きました。
詳しくはこちの記事を参照してください。
[Rails 5.2 で SQLite3 の boolean の値が変わった](https://qiita.com/scivola/items/5553e117de04de7da6a1)
Docker で ubuntu の lamp をつくる

# Docker の イメージを作ってみたい
Docker のイメージを使うのはいたって簡単だった。WordPress を使うまでを blog にまとめてみた。
[Docker + WordPress 試してみた](https://goo.gl/7BukAh)
ちょっと欲が出て、Docker のオレのイメージを作りたくなった。tutum/wordpress はよくできているのだが、パーミッションがよくない。postfix も入っていない。

# tutum/lamp をパクる
パクっても訴えられたリ、涙の記者会見をする必要がないところがオープンソースのいいところ。
おおもとの [tutum/lamp](https://github.com/tutumcloud/lamp) 
今気が付いたけどパクるというより公式に Fork すればいいのか。

# Dockfile を修正
tutum/lamp は
```txt:Dockfile
FROM ubuntu:trusty
```
となっている。trusty = 14.04 のことらしいが、現時点の Docker の ubuntu:latest は 16.04 なのでそれをベースに変更を掛ける。

## FROM の変更
```txt:Dockerfile
FROM ubuntu:16.04
```
ついでに MAINTAINER も自分にする。まるで自分で作ったみたいに偽装する（オープンソースだから、、、いいんです）

## apt-get を修正
ここでつまずいた。

```txt:Dockerfile
RUN apt-get -qq update
RUN apt-get -q -y install supervisor git \
        apache2 libapache2-mod-php \
        mysql-server php-mysql pwgen php-apcu php-mcrypt
```

というのも PHP7 になっていた。PHP5.5 から一気に 7 へ。この先大丈夫か？と思いつつも修正。あと、勝手に

```txt:Dockerfile
ENV DEBIAN_FRONTEND noninteractive
```
を削ると、mysql-server のインストールで root のパスワードを聞いてくるところで止まってしまった。コンソールからリターンを入力しても先に進まない。Ctrl-C で止めました。docker kill とかの方がスマートだったのかも。
ということで、こういうのを意味なく削らないこと。理解してから削りましょう＞自分

## build
tutum/lamp の環境丸ごと+一部 Dockerfile 修正。でとりあえず build する環境は出来た。

```txt:Dockerfile
docker build -t="sinby/lamp:v161005-2" .
```

と、途中、何度も build 失敗。これ、最初に bash 起動して手で apt-get した方がいいことに気が付くのに 1h くらいかかった。あと、うまくいったところで、適当に commit でスナップショットをとるとかね。

```txt:Dockerfile
docker run -it ubuntu:16.04 /bin/bash
```
## 気になるスクリプトもあるけどそのまま
もとにしたシェルプロでは MySQL のインストール時の環境を丸ごと rm して構築しなおしたり（もっとスマートな方法がありそうな）、/app とかつくってたり、シェル・プロが / に散在したりと気になるところはいくつかあるのですが、そのままです。ハイ。

#MySQL 5.7 はセキュリティ・チェックが厳しい（らしい）
これで動くと思いきや、MySQL でこけていることがわかりました。まず、MySQL にroot でログインできません。これは空パスワードをうけつけなくなって、自動的にパスワードを付与したためのようです。noninteractive　でパスワードを聞かなくなった代わりにめんどうなことになってしまいました。
幸い、/var/log/mysql/ の下のログに残っていました。これで入れます。本当は

```txt:Dockfile
sudo debconf-set-selections <<< 'mysql-server-5.6 mysql-server/root_password password your_password'
sudo debconf-set-selections <<< 'mysql-server-5.6 mysql-server/root_password_again password your_password'
```
とする必要があったみたいです（未確認）。よくみると 5.6 の記述です。5.7 に変えればいいのでしょうか？誰か確認してください。

次に、

```
CREATE USER 'admin'@'%' IDENTIFIED BY '$PASS'
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION
```

を mysql でログインしたうえで実行しようとすると($PASS は適当に変えている)エラーになりました。root のパスワードを変えないといけないようです。
参考:[mysql5.7でパスワードを変更する](http://qiita.com/RyochanUedasan/items/9a49309019475536d22a)


```
set password for root@localhost=password('passwordPASSWORD@999');
```

これでうまくいきました！かも。

# イメージは出来たが、、、、その先が見えない
あとは自動化を本格的にして確かめて Docker hub に登録すればみんなの役に立ちそうですが、そこまでできてません。無念。
この先は恐らく Ningx への置き換えや WordPress を入れたいのですが、ちょっと無理ぽ。
CSSの教科書を読んで自分なりにまとめてみたこと（第5章）

## はじめに

谷拓樹さんのWEB制作者のためのCSS設計の教科書を読み、自分なりにまとめたものです。
自分のメモとして残しておきたいので、詳細を多少端折っていますので、気になる方は購入してみてください。
数回に分けて投稿する予定です。

[前章の記事はこちらから](http://qiita.com/poster-keisuke/items/4fb6bd838a03fca07c63)

## コンポーネントを個別に管理する

コンポーネントとして設計されたルールは、コンポーネント単位でコードを管理できるようになっている。作られたコンポーネントをCSSファイルとしてどう管理するかを考える。

```css:test.css
# Base

.body {
……...
}

# Layout

#header{
……….
}

#footer{
……….
}
```

例えば、SMACSSやMCSSのようなカテゴリ、レイヤールールにのっとって、次のように1つのCSSファイルの中で整理できる。
それほどスタイルが多くない、または関わる開発者も少ないプロジェクトであればこうした1つのCSSファイルの中で、セクションを分けて管理するのはさほど問題がない。

しかし、もっと多くのコンポーネントで構成されていたり、また多くの開発者が手をいれる可能性があるのであれば、ファイルを分割するほうが好ましい。
分割されていれば、カテゴリやレイヤーごとに開発を分担し、編集箇所が衝突するようなことも少なくなる。

ただし、開発・管理の都合だけでファイルを細分化すると別の注意点も出てくる。リソースのリクエスト数（通信数）がページの表示速度に影響するので、単純にCSSファイルを分割し、<link>や@importを使ってファイルをバラバラと読み込もうとするとそれが、速度低下につながる。

つまり、理想としては開発上は管理面の利点で分割したいのだが、プロジェクトの公開状態のときにはリクエスト数を抑えるため1つのファイルにしておきたいということ。

### Sassを使った管理法

Sassとは　http://sass-lang.com/guide

解説でも出てくるので、特に重要なのは、@import @extend Placeholderの3つである。

```sass:master.scss
@import “button”;
@import “media”;
```


```sass:button.scss
 .btn {
   ………...
 }
```

```sass:media.scss
.media {
  …….
}
```


```css:master.css 
#コンパイル後
 .btn {
   ………...
 }

.media {
  …….
}
```

### マルチクラスとシングルクラス

1つ1つのコンポーネントをCSSのクラスとし、それを複数組み合わせることでUIを作る方法
→「マルチクラス」

```html:test.html
<button class=“btn btn-large”ボタン</ button>
```

- コンポーネントさえ用意されていれば、HTMLのマークアップ上で大体のUIが作れること
- CSSはマルチクラスのほうがシンプル

単一のクラスによるアプローチ
→「シングルクラス」

```html:test.html
<button class=“btn”ボタン</ button>
```

- クラスが短調になりにくい
- マークアップ（HTML）はシンプル

とはいえ、シングルクラスを手動で実現しようとするのは、骨が折れる。そこで、Sassの@extendを使えば、CSSをの中でもOOCSSを意識して組合わせシングルクラスで実現可能。

```sass:test.sass
.box {
        margin: 0 0 30px;
        padding: 15px;
        border: 1px solid #ccc;
}
```

```sass:test.sass
// .box で使ったスタイルを継承
.item {
        @extend .box;

}

.box, .item {
  margin: 0 0 30px;
  padding: 15px;
  border: 1px solid #ccc;
}
```

.boxの情報がインポートされる。
このようにすればマークアップ上はすっきりするが、マルチクラスの設計と比べて必要なクラスの数が多くなる。

参考↓
http://nicolasgallagher.com/about-html-semantics-front-end-architecture/

### セマンティックなクラス名

```sass:test.sass
%box {
        margin: 0 0 30px;
        padding: 15px;
        border: 1px solid #ccc;
}
```

```sass:main.sass
// .box で使ったスタイルを継承
.item {
        @extend %box;
}

.item {
  margin: 0 0 30px;
  padding: 15px;
  border: 1px solid #ccc;

}
```

Placeholder Selectorを使うことで、(.の代わりに％を用いる）単品では使わないセレクタの出力を抑える。

Sassを使ったシングルクラスと、@extendのアプローチは、マークアップ上のクラス名を任意のものにできる。
もっと意味のある（セマンティックな）名前にしたいと考える人もいるであろう。それは上のような.btnや.boxのような名前ではなく、情報の保存ボタンであれば、.saveというクラス名をつけるといったことである。

こうしたセマンティックな、コンテンツ派生の意味をお持つクラス名というのは、HTML5のclass属性の使用における次の定義を持っている。（筆者はクラス属性のコンテンツに求める見た目を説明する値ではなく、コンテンツ自体の特性を説明する値を利用すること）

参考↓
https://www.w3.org/TR/2014/CR-html5-20140429/dom.html#classes

CSS上でそのクラス名を見れば、どのコンテンツに使われているルールであるかが明白と言うのは一つの利点であるといえる。
しかし、コンテンツ派生の命名である場合、再利用性は大きく損なわれる。
.saveを「次のページに進む」ボタンのUIに適応すると、名前と要素の意味が不一致になる。
逆に.btnのような抽象的な名前であれば、次のページに進む」ボタンのUIに適応しても何らおかしくはない。

btnのような抽象的な命名は、class属性の仕様のようなコンテンツ派生命名ではないものの、開発者がその振る舞いを理解できる名前で合致していれば十分セマンティックといえるでしょう。
マルチクラス、シングルクラスどちらを使うかということと同じで、どちらのアプローチにも正解はないが、中長期的な運用のなかで、メンテナンス性を高く維持できるかについては、開発者の中であるいはサービスの作り方に応じて統一すればよいものである。
TensorFlowでBRNNなんかを実装しようとした際に出る"Matrix already exists, disallowed"

#背景
TensorFlowを勉強がてらRNNを改造してBRNNの実装を試みた際、

```
ValueError: Variable RNN/BasicLSTMCell/Linear/Matrix already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at:
```

というエラーが出て苦労したのでその時のメモ。

状況としては元々のRNNの実装で
```
lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)
```
としてあった所に逆方向からの伝搬部分を付け加えて、

```
lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)
blstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)#ココ追加
```
としたことで上述のエラーが発生した。

#原因と解決策
色々調べたところどうやら双方のcellが"BiRNN_FW/RNN/BasicLSTMCell/Linear/Matrix" を使おうとすることでname collisionが起きるらしい。
そこで上記のコードを

```
with tf.variable_scope('forward',reuse=True):
    self.lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)   
with tf.variable_scope('backward',reuse=True):
    self.blstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)
```
とすることで解決できるらしい。メモメモ

参考
[Got error when initialize bidirectional rnn with LSTM cell](https://github.com/tensorflow/tensorflow/issues/799)

#Jupyterで…
上記の作業をずっとJupyterで行っていたのですが、Shift + Enterでの起動やいったん「■」ボタン押して停止してから再び実行してもずっと"Matrix already exist"のエラーでっぱなしでした。
仕方ないので一度Shutdownしてから起動することでようやくエラーが消えて実行できました。
Slackへの投稿をコマンドからできるようにする


## やりたかったこと

各種作業を自動化するにあたり、Slackに投稿するためのコマンドが欲しかった。
しかもRubyでやりたかった

## できたもの

ターミナルなどでこうすると

![image](https://qiita-image-store.s3.amazonaws.com/0/4140/b2046aa3-e5f5-6bad-dbcd-ed5c5251793c.png)

こうなる

![image](https://qiita-image-store.s3.amazonaws.com/0/4140/9ded4b3d-9218-61f9-3044-35e3ec62379f.png)

## やり方

### Slackに書き込むコードを書く

```
$ mkdir slack # 作業ディレクトリ。任意の名前。
$ rbenv local 2.3.1 # rbenvでRubyを管理している場合
$ bundle init # BundlerでGemを管理したい場合
$ vim Gemfile
```

Gemの`slack-api`と`dotenv`（環境変数を管理）を入れます

```ruby:Gemfile
source "https://rubygems.org"
gem 'slack-api'
gem 'dotenv'
```

Gemをインストール
```
$ bundle install --path vendor/bundle
```

こんな感じのファイル構成になるはずです

```
.bundle
.ruby-version
Gemfile
Gemfile.lock
vendor
```

コードはこんな感じに。
アクセストークンは開発用にはこちら（https://api.slack.com/docs/oauth-test-tokens ）、本番用にはこちら（https://my.slack.com/services/new/bot ）を使うといいようです。
開発用のアクセストークンが簡単に取れるのが嬉しい。

```ruby:main.rb
require 'slack'
require 'dotenv'

Dotenv.load #.envファイルを読み込み

message = ARGV[0]
channel_name = ARGV[1] || 'my_channel'

Slack.configure do |config|
    config.token = ENV['SLACK_API_TOKEN']
end

Slack.chat_postMessage(text: message, channel: channel_name)
```

`.evn`ファイルを作って、同じディレクトリに配置します。

```ruby:.env
SLACK_API_TOKEN=##トークンに置き換える##
```

ファイル構成は今こんな感じになっているはず

```
.bundle
.env
.ruby-version
Gemfile
Gemfile.lock
main.rb
vendor
```

試しに実行してみましょう

```
$ bundle exec ruby main.rb Hello my_channel
```

`#my_channel`にHelloと書き込まれれば成功です。
もっとオプションを受け取ったりしてコマンドっぽくしたい場合はGemの`Thor`などを使うといいでしょう。

### コマンド化する

これをどこからでも単に`slack`とするだけで呼び出せるようにしたいです。
rbenvやBundlerを使っていなければ、パスが通ってるところから単にスクリプトにシンボリックリンクなどを張るだけでいいのですが今回はそうではありません。
いろいろなやり方がありますが、私は`~/bin`にPATHを通してそこからシェルスクリプトで呼び出すという方法でやります。

```bash:slack
#!/bin/bash

if [ $# -ne 1 ]; then
  echo "テキストを引数として渡してください" 1>&2
  exit 1
fi
cd ~/projects/slack
bundle exec ruby main.rb $1 $2
```

こんな感じのスクリプトを書いて`~/bin`に配置します。
実行権限をつけるのを忘れずに。

```
$ chmod +x slack
```
最後にパスを通します。`.bash_profile`などに追記しましょう。

```bash:.bash_profile
export PATH=$PATH:~/bin
```

とすれば、どこからでも`slack`とするだけで呼び出せるようになります。

## 次のステップ

せっかくコマンドにしたので標準入力も受け取れるようにしたいですね。

- [標準入力を受け取れるシェルスクリプト、関数の作成（パイプで繋げられるようにする） - Qiita](http://qiita.com/koara-local/items/7ad01e0692e36627ba2d)
素人の言語処理100本ノック:18


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第2章: UNIXコマンドの基礎
>hightemp.txtは，日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである．以下の処理を行うプログラムを作成し，hightemp.txtを入力ファイルとして実行せよ．さらに，同様の処理をUNIXコマンドでも実行し，プログラムの実行結果を確認せよ．

###18.各行を3コラム目の数値の降順にソート
>各行を3コラム目の数値の逆順で整列せよ（注意: 各行の内容は変更せずに並び替えよ）．確認にはsortコマンドを用いよ（この問題はコマンドで実行した時の結果と合わなくてもよい）．


####出来上がったコード：

```python:main.py
# coding: utf-8

fname = 'hightemp.txt'
lines = open(fname).readlines()
lines.sort(key=lambda line: float(line.split('\t')[2]), reverse=True)

for line in lines:
	print(line, end='')
```

####実行結果：

```console:端末
高知県	江川崎	41	2013-08-12
埼玉県	熊谷	40.9	2007-08-16
岐阜県	多治見	40.9	2007-08-16
山形県	山形	40.8	1933-07-25
山梨県	甲府	40.7	2013-08-10
和歌山県	かつらぎ	40.6	1994-08-08
静岡県	天竜	40.6	1994-08-04
山梨県	勝沼	40.5	2013-08-10
埼玉県	越谷	40.4	2007-08-16
群馬県	館林	40.3	2007-08-16
群馬県	上里見	40.3	1998-07-04
愛知県	愛西	40.3	1994-08-05
千葉県	牛久	40.2	2004-07-20
静岡県	佐久間	40.2	2001-07-24
愛媛県	宇和島	40.2	1927-07-22
山形県	酒田	40.1	1978-08-03
岐阜県	美濃	40	2007-08-16
群馬県	前橋	40	2001-07-24
千葉県	茂原	39.9	2013-08-11
埼玉県	鳩山	39.9	1997-07-05
大阪府	豊中	39.9	1994-08-08
山梨県	大月	39.9	1990-07-19
山形県	鶴岡	39.9	1978-08-03
愛知県	名古屋	39.9	1942-08-02
```

####UNIXコマンド確認用のシェルスクリプト:

```bash:test.sh
#!/bin/sh

# 3カラム目を数値として逆順ソート
sort hightemp.txt --key=3,3 --numeric-sort --reverse > result_test.txt

# Pythonのプログラムで実行
python main.py > result.txt

# 結果の確認
diff --report-identical-files result.txt result_test.txt
```

####結果の確認：

```console:端末
segavvy@ubuntu:~/ドキュメント/言語処理100本ノック2015/18$ ./test.sh
10d9
< 群馬県	館林	40.3	2007-08-16
11a11
> 群馬県	館林	40.3	2007-08-16
17d16
< 岐阜県	美濃	40	2007-08-16
19,20c18
< 千葉県	茂原	39.9	2013-08-11
< 埼玉県	鳩山	39.9	1997-07-05
---
> 岐阜県	美濃	40	2007-08-16
21a20
> 千葉県	茂原	39.9	2013-08-11
23a23
> 埼玉県	鳩山	39.9	1997-07-05
```

`diff`で違いが検出されてしまいましたが、3カラム目の気温は同値があるので、その部分で違うのは仕方がないでしょう。

###ラムダ式

今回初めてラムダ式を使ってみました。`lambda line: float(line.split('\t')[2])`の部分です。与えられた文字列`line`に対して、`¥t`区切りで分割した3カラム目を`float`として返す、という関数の代わりに使っています。ただ、少し分かりにくくなりますね。内包表記もそうですが、この辺は慣れもあるかとは思います。

ちなみにPythonのドキュメントの[小さな関数とラムダ式](http://docs.python.jp/3/howto/functional.html#small-functions-and-the-lambda-expression)の解説では、著者の方はラムダなしのスタイルが好みとのことでした。

###ソートの型

ソートの時は対象データの型に注意が必要です。
今回の対象データでは、ラムダ式で`float`に変換し忘れたり、UNIXコマンドの`sort`で`--numeric-sort`をつけ忘れても正しい結果になりますが、もし気温が5度の場所が混ざっていたりすると、気温が一番低いにも関わらず先頭に来てしまいます。
　
19本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
ラムダ式の使い分けだっちゃ

初心者向けメモ化

何も渡さない
a = () => 0

渡す
a = (x) => x + 1; // カッコは省略化

指定して渡す。
a = (int x) => x + 1;

複数引数
a = (int x ,int y) => x + y;

戻り値あり
a = x => {return x * 5;}

追記
{}をつけることで複数行処理がかける。

追記
戻り値あり(NetSeedさんよりご指摘)
Func<int,int> a=x=>x*5;
:と;（コロンとセミコロン）のさいきっく入れ替え

# 前提

さいきっくぱわーでで16.04になったUbuntu on X230(US key)
（さいきっくぱわーない人はdo-release-upgradeしましょう）

# 希望
Enterの2個位左に有る「上に:下に;が書いてあるキー」を，
1. そのまま押したら出力が「:」
2. Shiftと一緒に押したら「;」
になるようにしたい．

# 作業
1. xevでkeycode調べて
2. setxkbmap -printでxkb_symbolsみて
3. /usr/share/X11/xkb/keycodes/evdevで調べたkeycodeの値見て
4. /usr/share/X11/xkb/symbols/usのxkb_symbols "basic"の該当箇所直接書き換え
5. なんとなくだけどこれ多分Ubuntu的に推奨される方法じゃないよね？

# 諸々
もともとJP key配列だった人がUS key配列になったのでShiftで:と;の切り替えがどうにも慣れなくてさいきっくでもどうにもならなかったとかなんとか．

vimのexモードとかの絡みで:を優先して，Ubuntu12.04では.Xmodmapで入れ替えてたんですが，なんかそれがUbuntu14.04でうまいこと動かなくなって（ガンマ調整のコマンドと一緒に）起動時に手でscript動かしてたんですよ実にバカだな．

ソレすらUbuntu16.04になってからうまく行かなくなったんでさいきっくぱわーで調べあげて上記のような感じになりました．


要するにさいきっくって言いたいだけです．
HerokuのDBをPostgresからConoHaのDBに変える

# 背景
HerokuのPostgersを利用していたが無料枠を使い切ってしまった！
アドオンの課金でもするかと思ったが、一番安いので$9なのでお小遣いパパにはちょっと「うっ！！」ってなるので安く済ませる方法を探していた。

そこで、前から気になってたConoHaでDBサーバーのみを立てれるか試したらいけたのでHerokuから繋いでみた。
※自動バックアップなしの10GBなら¥500で、今（2016/10現在）登録すると¥1,000分のクーポンがもらえるので飛びついてみた。

# やったこと
以下は対応のメモ。
※思い出しながら書いてるので漏れがあるかも。。。

* HerokuのアプリのアドオンからPostgresを削除する
  * 削除しないとpgがインストールされてないぜってエラーになった
* Gemfile
  * pgを削除してmysql2をインストール
* ConohaのDBの接続許可ホストを全許可にしておく
  * Heokuアプリのホスト名とかを指定したけど、db:migrateとかするときのホストはec2-xx-xxx-xxx-xx.compute-1.amazonaws.comみたいになっていた。しかも毎回変わるみたい。
* config/database.yml
  * mysqlと同じように設定
  * hostはConohaのDBのグローバルネットワークを使用する
      * パスワードなどは自分で設定したものを
* Postgres独自のカラムなど使ってなかったので、マイグレーションファイルの修正は今回特にしなくて良かった。

# 最後に
とりあえず、安くはできたがこの程度なら素直にアドオンに課金した方がいいと思う。（バックアップオプションつけたら¥800だし・・・）
まあ、今回はHerokuで外部のDBサーバーももちろん繋げまっせということでー。

そういえば、今は文字コードはutf8でいいがutf8mb4にしたい場合はConoHaではどうするんだろう？
※ご存知の方いたら教えてください
CentOS7 インストール(VMWare)

VMWare に centos7 をインストールしたときの、ネットワーク接続に関する備忘録。


とにかくゲスト OS から yum を実行したかったので、外部に接続したい。
NAT での接続の設定がなかなかうまくいかず・・・


色々調べてみると、何も考えず、ホスト OS と同じデフォルトゲートウェイにしたのがまずいらしい。

VMWare のデフォルトゲートウェイには「VMWare Network Adapter VMnet8」の IP アドレスを指定する。
ただし、.1 はホスト OS を指すようなので、.2 を指定する。


そうすることで、外部接続はできた。



が、仕組みがイマイチよくわからないので調査中。
Windows環境でgemがSSLエラー 2016

# 現象

最近、Windows環境でgemを使うとこんなエラーが出るようになった。

```
C:\>gem install capybara
ERROR:  Could not find a valid gem 'capybara' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect retur
ned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (
https://api.rubygems.org/specs.4.8.gz)
```

SSL証明書の検証に失敗しました、というHTTPS通信のエラー。

# 環境

- Windows 7 or 10 どちらでも発生を確認。
- インストールはRubyInstallerを使用。Ruby 2.3.1
- 発生時点でのgemは2.5.1

# 解決方法

Rubygemsを最新バージョンにする。

アップデートはgemで取れるが、上で示した通りhttpsは通らないので、httpを指定して取る。

```
C:\>gem -v
2.5.1
C:\>gem install rubygems-update --source http://rubygems.org/
# 出力省略
C:\>update_rubygems
# 出力省略
C:\>gem -v
2.6.7
```

この状態でgem installすると通った。

# 補足：証明書について

https://rubygems.org の証明書を見てみると、有効期間が2016/09/28からだった。最近更新されたっぽいので、これが原因だった可能性が高い。

![rubygems_cert.png](https://qiita-image-store.s3.amazonaws.com/0/112578/8f71914b-a857-23af-f420-21813bd9aa81.png)

Rubygemsのリポジトリも覗いてみると、今回アップデートした前と後で、含まれている証明書が違う。

- https://github.com/rubygems/rubygems/tree/v2.5.1/lib/rubygems/ssl_certs
- https://github.com/rubygems/rubygems/tree/v2.6.7/lib/rubygems/ssl_certs

あと、過去にも似たようなことが起こっていたらしい。

http://qiita.com/shimoju/items/394818b4989b94680aaf

## 2017/02/06 追記

ありがたいことに投稿から数か月経過してもたまに「いいね」を押してくださる方がいるようなので、今更ながら追記。[公式ガイド](http://guides.rubygems.org/ssl-certificate-update/)では、ブラウザ等でgemファイルを手動ダウンロードする方法が案内されています。そちらのほうがHTTPSを使うため、より安全です。

リンクされている`rubygems-update-2.6.7.gem`は現在では古くなっているバージョンのため、特に理由がなければ[最新バージョン](https://rubygems.org/pages/download)のgemファイルをダウンロードするのが良いと思います。
Xcode8でコンパイルが遅いのを解消する

Xcode8にしてからとてもコンパイルが遅くなった（気がする）

![スクリーンショット_2016-10-05_21_37_29.png](https://qiita-image-store.s3.amazonaws.com/0/24979/79096f21-0916-c21e-3532-3a1fc5b77cbb.png)

ここから、コンパイルしている様子を見ることができる。

![スクリーンショット_2016-10-05_21_43_34.png](https://qiita-image-store.s3.amazonaws.com/0/24979/d6279b57-9920-ee32-c19a-34dc438025dd.png)

ここで、矢印が一度にいくつ表示されているかが重要。
この場合は「４つ」同時に処理されている。

もしも同時に１つしか処理されていないのであれば

`defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4`

を実行すれば４コアで処理してくれる。
もちろん２コアのMacなら

`defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 2`

のように指定すれば最適なパフォーマンスでコンパイルしてくれる。

コア数は

`system_profiler SPHardwareDataType`

を実行すると

```
    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro11,4
      Processor Name: Intel Core i7
      Processor Speed: 2.2 GHz
      Number of Processors: 1
      Total Number of Cores: 4
      L2 Cache (per Core): 256 KB
      L3 Cache: 6 MB
      Memory: 16 GB
      Boot ROM Version: MBP114.0172.B09
      SMC Version (system): 2.29f24
      Serial Number (system): xxxxxxxxxx
      Hardware UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
```

のように表示されるので、`Total Number of Cores`を見れば良い。
上記の場合は４

設定したらコンパイル中に灰色の矢印が増えているか確認。

Xcode8じゃなくてもたぶん効くはず
tmuxで自動アタッチ & デタッチ時に自動exit

ssh先などでtmuxを使ってる場合、毎回アタッチしたり、デタッチした後にexitを打ったりするのはだるいですよね。
なので、これらを自動的に行う設定を書いてみました。


```bash
if [[ -n "${REMOTEHOST}${SSH_CONNECTION}" && -z "$TMUX" && -z "$STY" ]]; then
    function confirm {
        MSG=$1
        while :
        do
            echo -n "${MSG} [Y/n]: "
            read ans
            if [ -z "$ans" ]; then
                ans="y"
            fi
            case $ans in
                [yY]) return 0 ;;
                [nN]) return 1 ;;
            esac
        done
    }
    option=""
    if tmux has-session && tmux list-sessions; then
        echo "tmux attached session "
        option="attach"
    else
        echo "tmux created new session"
    fi
    tmux $option && confirm "exit?" && exit
fi
```

上記のコードを`.zshrc`などに書いておくと、sshで繋いだ時に自動的にtmuxが起動します。
また、デタッチしたとき以下のような表示が出て、`y`を入力するとexitが実行されます。

```
exit? [Y/n]:
```

デフォルトで`y`が入力されるようになっているので、デタッチ後にエンターを押せばsshも切れるという感じです。
tmuxの外で作業したい場合や、tmuxがうまく動かなくなることも想定して、`confirm`を使ってexitするかどうかを決めれるようにしています。
OpenSSH の 証明書認証

OpenSSH には個々の公開鍵をサーバに登録するのではなく、CA の公開鍵を登録して、証明書で認証する方法があります。

# 証明書の発行

## CA 公開鍵／秘密鍵ペアの作成

```
$ ssh-keygen -f ca.key -t ed25519
$ ls
ca.key  ca.key.pub
```

## ユーザの公開鍵への署名

公開鍵に署名して証明書を発行します。

シリアルナンバーで失効させるため -z を付けておきます。

```
$ # -V で期限も付けられる
$ # ssh-keygen -s ca_key -I certificate_identity -n principals -z serial_number id_ed25519.pub
$ ssh-keygen -s ca.key -I hexa -n ubuntu -z 1 id_ed25519.pub
```

発行された証明書（id_ed25519-cert.pub）はユーザの秘密鍵と同じディレクトリに入れておきます。


## 署名した公開鍵の証明書の確認

```
$ ssh-keygen -Lf id_ed25519-cert.pub
id_ed25519-cert.pub:
        Type: ssh-ed25519-cert-v01@openssh.com user certificate
        Public key: ED25519-CERT SHA256:A7RX7U5KH8Fi8kvh1k2Rk7j1MGilnOzjLIU5iiZm4aQ
        Signing CA: ED25519 SHA256:So6T7aqA5gQ8BC+D2cS8CBHm3hmZu7RPa+qWObPJRWQ
        Key ID: "hexa"
        Serial: 1
        Valid: forever
        Principals:
                ubuntu
        Critical Options: (none)
        Extensions:
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc
```

## 設定

### sshd_config の設定

PasswordAuthentication 等の使用しない設定は切っておきます。

公開鍵（ca.key.pub）をサーバ上に置いて、/etc/ssh/sshd_config に TrustedUserCAKeys を追加します。

```
TrustedUserCAKeys /etc/ssh/ca.key.pub
```

ssh を再起動します。

```
$ systemctl restart sshd.service
```

## ログイン

```
$ ssh -i id_ed25519 ubuntu@192.168.1.2
```


# 証明書の失効

公開鍵認証と異なり、証明書の認証の場合は CA の公開鍵のみをサーバに設置しているため、各ユーザの公開鍵を削除して、ログインできなくするということができません。

代わりに、発行した証明書を失効することができます。

## KRL の作成

KRL（Key Revocation List） を作成して、証明書を失効させます。

ファイルに失効させる証明書の serial をファイルに記載しておき、KRL を作成します。

```
$ cat list.txt
serial:1
$ # KRL を更新する場合は -u を付ける
$ ssh-keygen -k -f krl -s ca.key.pub list.txt
```

## sshd_config の設定

作成した krl をサーバ上に置いて、/etc/ssh/sshd_config に RevokedKeys を追加します。

```
RevokedKeys /etc/ssh/krl
```

ssh を再起動します。

```
$ systemctl restart sshd.service
```

## 参考 URL

- http://man.openbsd.org/ssh-keygen
- http://man.openbsd.org/sshd_config
Graphvizをコマンドラインから使う

# *環境*

OS: Windows10
Graphviz: ver2.38



# Graphvizをダウンロード

http://www.graphviz.org/Download..php

![2016-10-05.png](https://qiita-image-store.s3.amazonaws.com/0/17879/b2d25690-adf9-e2d1-ba52-6468a905b94c.png)

# 環境変数に追加

まずDLしたファイルを展開 or インストールする

## コマンドプロンプトから```bin```を環境変数に追加

プロンプトを開いて```[graphvizのインストールディレクトリ]/bin```を追加する

やり方は以下
※プロンプトを開くときに右クリック＞[管理者として実行]にしないとうまくいかないかも

```
> setx /M PATH "%PATH%;[パス名]"
```

*例*

```
> setx /M PATH "%PATH%;C:/graphviz-2.38/bin"
```

うまくいくと以下のようになる

```
成功: 指定した値は保存されました。
```


一旦コマンドラインを閉じ、再度開いて

```
> echo %path%
```

パスの値を見てさきほどのパスの文字列が追加されていればOK

## Graphvizの各コマンドが使えることを確かめる

```
> dot -V
dot - graphviz version 2.38.0 (20140413.2041)
```
Swiftでスクロールに合わせてStatusBarの表示非表示を切り替える

# やりたいこと

* TableViewをスクロールさせる時にステータスバーに表示が被らないようにしたい

# 動作環境

Xcode: 7.3.1

# 対応方法

* 画面表示時にステータスバーに被らないように初期位置をずらす
* スクロールされたらステータスバーを非表示にする
* 再度最上部までスクロールされたらステータスバーを表示する

# プログラム

TableViewの作成については割愛。
UITableViewControllerを継承してCustomTableViewControllerを作ったところから。

## 初期位置の調整

```swift:CustomTableViewController.viewDidLoad

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0)
self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(20, 0, 0, 0)

```

上記を追加してステータスバー分テーブルビューのスタート位置とスクロール開始位置をずらします。

## スクロール時のステータスバー表示非表示の調整

```swift:CustomTableViewController

var shouldHideStatusBar: Bool = false

````

ステータスバーの表示状態を管理するプロパティを作る

```swift:CustomTableViewController

override func scrollViewDidScroll(scrollView: UIScrollView) {
    shouldHideStatusBar = scrollView.contentOffset.y > 0 ? true : false
    self.setNeedsStatusBarAppearanceUpdate()
}

override func prefersStatusBarHidden() -> Bool {
    return shouldHideStatusBar
}
```

作ったプロパティをscrollViewDidScrollの中で動的に切り替えます。
scrollView.contentOffset.yがscrollView内の現在のy座標を示します。
ここで設定した値は prefersStatusBarHiddenをoverrideした中で利用しています。
self.setNeedsStatusBarAppearanceUpdate()を呼ぶと、prefersStatusBarHiddenの返り値によってステータスバーの表示非表示が切り替わるので、これでやりたいことが実現できます。
Docker for Macで、AnsibleからDocker コンテナを作成する

# 早速サンプル

 - hosts

```
[docker_host]
docker_host01
```

 - sample1.yml

```
 - hosts: docker_host
   connection: local 

  tasks:
  - name: Create container
    docker: image=centos:centos6 name=web01 ports=80:80 expose=80 tty=yes
```

- 実行

```
$ ansible-playbook -i hosts.yml sample2.yml
```

# 結果
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
c9af58da34d9        centos:centos6      "/bin/bash"         13 seconds ago      Up 11 seconds       0.0.0.0:80->80/tcp   web01
```

指定したコンテナが作成されている事が確認できました。
手法は、PlayBook中に```connection: local```と記載する事です。
```connection: local```とする事で、AnsibleはLoclhostに接続しDockerコマンドを発行しています。

[こちら](http://qiita.com/jey0taka/items/52ea026e76917d943741)と組み合わせる事で、
コンテナの作成→コンテナのプロビジョニングと一連の動作がAnsibleから行えると思います。
論理配列で要素を抽出する

課題：あるベクトルから特定の要素を抜き出したい

例：
v = [1,2,3,4,5]
から
[1,3,4]
だけ抜き出したい．

解決法：logicalで論理配列を作成して，要素を制御する

方法：
1. 論理配列のもとになる0/1で構成されるベクトルを作成する
2. logical関数で論理配列に変換する
3. ベクトルに適用する

```matlab:logical_mask.m
>> v = 1:10
v =
     1     2     3     4     5     6     7     8     9    10

>> mask = [1,0,1,1,0]
mask =
     1     0     1     1     0

>> mask = horzcat(mask,mask)
mask =
     1     0     1     1     0     1     0     1     1     0

>> logical_mask = logical(mask)
logical_mask =
     1     0     1     1     0     1     0     1     1     0

>> v(mask)
Subscript indices must either be real positive integers or logicals.
 
>> v(logical_mask)
ans =
     1     3     4     6     8     9
```

logicalで論理配列に変換するのがポイント
zoom 6max プリフロップ戦略

## オーブンレンジ

### UTG
55+,A2s+,ATo+,K9s+,KJo+,QTs+,J9s+,T9s

### UTG+1
55+,A2s+,ATo+,K9s+,KJo+,Q9s+,QJo,J9s+,T9s

### UTG+2
22+,A2s+,A9o+,K6s+,KTo+,Q8s+,QTo+,J9s+,JTo,T9s

### BTN
22+,A2s+,A4o+,K2s+,K9o+,Q6s+,Q9o+,J7s+,J9o,T7s,97s+,87s,76s,65s,54s,

### SB
#### レイズ
55+,A8s+,ATo+
#### コール
BTNと同じくらいのレンジでコール

## レイズに対して

### UTG+1
#### コール
99+,ATs+,A2s,A3s,A4s,A5s
####　３bet
QQ+,ATs+,AKo,KQs,

### UTG+2

### BTN

### SB

### BB


## 4betに対して

### UTG

### UTG+1

### UTG+2

### BTN

### SB

### BB
フォームの不安定さを少しでも解消したい【チェックリスト的なものを作りたい】

公開時には全部チェックして、複数回、複数デバイスで、複数人で送信テストしているのに、
ある日動かなくなってしまうウェブフォーム・・・
その恐怖を少しでも和らげたいので、みんなで経験値を共有しませんかというポストです。

とりあえず私の経験した限りでまとめてみます。

#現象一覧

1. フォームが表示できない
2. バリデート出ない／確認画面に行けない
3. 完了画面に行けない
4. メールが届かない

#原因
##その前に前提条件
・「公開時には全部チェックして、複数回、複数デバイスで、複数人で送信テストしている」ので、長らく問題が起こっていないこと（初期のプログラムでは問題なかったはず・・なやつ）。
・この時はこれ、って決まった原因がなくて複数にわたることもある（サーバー再起動したりパッチを思いがけず適用してしまったり）。


##1. フォームが表示できない
・SSL証明書の期限切れ
・正しいSSL証明書があたっていない
・プログラムが消えちゃった、URLが変わった


##2. バリデート出ない／確認画面に行けない
・DB書き込みがある場合は接続まわりやDBのバージョンが上がったりしていないか
・ファイルアップロードがある場合にディレクトリ権限に問題がないか
・jsを使ってる場合、jqueryなどのライブラリのバージョンが上がってたりすることもある

##3. 完了画面に行けない
これは私は実際には体験したことないです・・。（プログラムの問題とかのときは2と重複するかと・・。
・メール送信処理の問題（とか？）

##4. メールが届かない
・ドメインがブラックリストに入った
・プログラムから送信する際に使ってるドメイン名が名前解決されてなかった（スパムスコアが上がる要因）
よくわかんない時はとりあえずこれを使ってみる。。。
https://www.mail-tester.com/
ブラックリストのチェック → http://mxtoolbox.com/SuperTool.aspx
ドメインの正引き・逆引きチェック → https://www.debouncer.com/reverse-dns-check

#また何か経験したら追記したいと思います。
あぁもうとりあえず投稿。
（こういう性格がわるいとは思っているry）
RN-42でiPhoneにペアリングさせるまで

## Arduino+RN42のデバイスをiPhoneに認識させたい

##事の発端

これ
http://akizukidenshi.com/catalog/g/gK-07378/

とArduinoを使ったBTモジュールをAndroidにつないで遊んでいたが、
iPhoneにも手を出したくなった。

何も考えずにiPhoneのBluetooth画面を開いたがうまくいかず。

## そもそも認識できるモジュールなのか？

どうやら、認証を通してあるものらしいので、
設定さえすればちゃんと認識する(らしい)。

## やってみた

ここを参考にしました
http://samirlovgren.se/?page_id=1299


### 普通にPCとペアリングする

とりあえずBTがついたWin機など無かったのでMacでペアリング。


### Cool Term なるものをインストール

ここ
http://freeware.the-meiers.org/
からダウンロードできます。


### Cool Termを起動し、Bluetoothモジュールと接続


#### 接続後、"$$$"と打つ

そうすると、CMDと表示され、入力モードになります。

#### "D"と打つ

そうすると現状が表示されます。

その後、下記のコマンド を打つ


- SC,0024\r 
- SD,0704\r 
- ST,253\r 
- SO,%\r
- T,1\r 
- SM,0\r
- SA,0\r

元々、Authenticationが1になっていたので、
そのあたりが問題なのかな？

ひとまずこれでペアリングまではOKになりました。
さくらのクラウドでローカルネットワークを作成する

クラウドサーバでローカルネットワークを作成してサーバ同士をガシガシつなげられる環境を作ってみたいと思います。
流れとしては
 1. スイッチ作成
 2. サーバをスイッチに接続
 3. 必要ならサーバのIPアドレス変更
これだけです。
スイッチは課金リソースになります。

さくらのクラウドでのスイッチは、
ルーター機能(グローバルIPが16、32、64もしくはそれ以上)の有無を選択出来ます。
今回はルーター機能なしのスイッチを作成します。
この場合、1Gbpsポート数が異常に多いノンインテリジェントL2スイッチといった感覚で扱えます。

##スイッチ一覧
メニューからスイッチを選択します。
右上の「＋追加」ボタンをクリックします。
![スイッチ一覧.png](https://qiita-image-store.s3.amazonaws.com/0/140995/165e8936-6a84-e82e-ff93-080eff9db84d.png)

##スイッチ追加
すると追加のための設定が行えます。
名称にわかりやすい名前を付けます。
ここでは「ローカルスイッチ」という名前にしてみました。
最後に「ルータ」という項目がありますが、これを「はい」に変更するとグローバルIPが割り当てられます。
今回は「いいえ」のままにしておきます。
![スイッチ追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/c8fcc4c5-dd40-d57e-f159-febf5f619f08.png)

##作成
最後に「＋作成」ボタンをクリックすると課金リソースの追加について注意が表示されます。
さらに「作成」をクリックですぐにスイッチが追加されます。

##マップの確認
マップを確認するとこのようになっています。
ローカルスイッチにはサーバを接続していないのでスイッチが単独で存在しています。
続いてスイッチにtestサーバを接続してみます。
![マップ.png](https://qiita-image-store.s3.amazonaws.com/0/140995/bba11397-f9ad-32e7-2089-5be8c84cfcd7.png)

##サーバの停止とネットワークIFの追加
ネットワークIFはサーバが停止している状態でないとできないのでシャットダウンしておきます。
(ここではサンドボックスということでメニューからシャットダウンしていますが、
通常はサーバ上のOSからシャットダウンしてください。)
![サーバ停止.png](https://qiita-image-store.s3.amazonaws.com/0/140995/1e2d6b97-8a01-685c-27d0-5d9fa8661fa7.png)

シャットダウンが終了するとサーバ一覧上でこのようにグレーアウトされます。
![サーバ一覧停止.png](https://qiita-image-store.s3.amazonaws.com/0/140995/4c04b4d5-8623-d2d9-0ba9-40fe537b7f21.png)
サーバをダブルクリックしてNICタブを開きます。
「＋追加」ボタンをクリックすると操作確認が求められるので「追加」をクリックします。
![サーバNIC追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/0f3964ef-5e1a-3cac-6274-6be6abd764d7.png)

##接続の編集
NICの追加が完了したらNICが2つ表示される様になります。
未接続状態のNICの右側にある逆三角形をクリックするとメニューが表示されるので「接続を編集」をクリックします。
![サーバ接続を編集.png](https://qiita-image-store.s3.amazonaws.com/0/140995/fdf2d813-6a0b-3e3f-3148-d66771ad52f5.png)

接続先を選択できるダイアログが表示されるので
![サーバNIC接続先確認.png](https://qiita-image-store.s3.amazonaws.com/0/140995/de1f2449-2575-a70b-cdcf-bed64dd34cba.png)
「スイッチに接続」をクリックして先ほど追加したスイッチを選択します
![サーバ接続先変更後.png](https://qiita-image-store.s3.amazonaws.com/0/140995/12e5a9dc-5736-c14c-c870-d54929679fde.png)
あとは更新ボタンをクリックするだけです。

##接続先変更後
このようにスイッチに接続された状態になります。
「IPv4アドレスを編集」というメニューが追加されています。
これはあくまでもコントロールパネル上に指定したIPが表示できるだけでOS上の設定は変更されません。
![サーバ接続先変更完了.png](https://qiita-image-store.s3.amazonaws.com/0/140995/2a1474dd-3a4e-73d1-dec2-f9fcd96ff637.png)

##変更後のマップ
ローカルスイッチに接続されたことでtestサーバからローカルスイッチに線が延びました。
今回の作業ではtestサーバのOSではIPアドレスの設定などは終わっていません。
停止している状態なのでサーバを起動後、NICの設定をしてあげる必要があります。
(CentOS6.Xだと/etc/sysconfig/network-scripts/ifcfg-eth1を追加してあげればOKです)
また、新規でサーバを作成する場合はグローバル接続ではなく、スイッチに接続が選択出来ます。
その場合はこのマップにある、グローバル接続への線が消えてローカルスイッチだけに接続されます。
(このパターンだとグローバルに出て行く経路がないので困ったことになりますが、ルーター機能とVPCルーターを活用すれば問題なくなります)
![マップ変更後.png](https://qiita-image-store.s3.amazonaws.com/0/140995/6b719d33-d3f7-8f2f-2c9c-7e6ce8bdd88e.png)
CentOS7でLaravel開発を始める


　ララベルって聞いたことあるなと思ったらあれですね魔法少女ララベルですね

　以下簡単な覚え書きですのでGoogle検索のヒントにでもしてください

## 使ったもの
 - vagrant
 - CentOS7
 - PHP7
 - Laravel5

　取り敢えずvagrantでCentOS7を立ち上げてPHP7をインストール
　全体的にスーパーユーザーでやっております

``` bash
yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm -qa | grep php
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd

```

　composerが必要そうだったのでそれも

``` bash

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer global require "laravel/installer=~1.1"

```

　composerを使ってlaravelプロジェクトを作成

``` bash

# pwd /var/www
composer create-project laravel/laravel sample --prefer-dist

```

　取り敢えず今回はsampleという名前でプロジェクトを作成します
　/var/www/sampleというフォルダができるのでそこに移動
　この辺はhttpd.confとか適当に設定します。URLRewriteまわりもさくさくと書いてしまいましょう

``` bash

#pwd /var/www/sample
composer install

```

## ！！！エラー発生！！！

### phpunit/phpunit 3.7.9 requires ext-dom * -> the requested PHP extension dom is missing from your system.
[composerでPHPUnitがインストールできない](http://blue-goheimochi.hatenablog.com/entry/2013/07/24/composer%E3%81%A7PHPUnit%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)

　これ私の方ではまだ解決してないです。php.iniにextensionも書いたのになぜ。
　composer.jsonからエラー行(PHPUnit)だけ取り除いて無理矢理動かしました。
　はい次。

### ブラウザからindex.phpが表示できない

参考:[laravel5のインストールで、ファイルパーミッションエラー](http://momoiro-tj.hateblo.jp/entry/2016/01/12/221657)

　/var/log/httpd/error_log曰く、パーミッションが無いとのことだったのでこれを設定

``` bash

#pwd /var/www/sample
chmod -R 777 bootstrap
chmod -R 777 storage

```

　まだ動かない。何。
　こういうときの犯人はSELinuxですので(断定)早々に殺しておきましょう

``` bash

setenforce 0

```

　さてやっとApacheエラーでもChromeエラーでもなくララベルらしきエラー画面が見えました。
![スクリーンショット 2016-10-05 17.48.45.png](https://qiita-image-store.s3.amazonaws.com/0/62826/b17eca74-70ee-0a1b-e96c-8203a808070f.png "スクリーンショット 2016-10-05 17.48.45.png")

### 

　これは[github](https://github.com/laravel/framework/issues/9080)に答えがありました。ありがとうgithub愛してるよgithub

``` bash

#pwd /var/www/sample
php artisan key:generate
php artisan config:clear

```

![kobito.1475657825.794071.png](https://qiita-image-store.s3.amazonaws.com/0/62826/0f4949c3-3bd9-f211-4aff-2809c374d440.png "kobito.1475657825.794071.png")

　やったーララベルのトップが見えました―！
Amazon LinuxでGeoIPを使って海外からの攻撃を遮断する方法


# 概要
AWSの環境でmod_geoipというApacheモジュールを使って、海外のIPからのアタックを遮断する設定例です。

設定が簡単なので
海外からの攻撃を一刻も早く遮断したい！といった場合に、
ちゃんとした WAF, IPS/IDS ツールを導入するまでのつなぎとして使える小技です。

# 環境
EC2 (Amazon Linux AMI release 2016.03)
ELB (Classic)

GeoIP-1.4.8-1.5.amzn1.x86_64
httpd24-2.4.23-1.66.amzn1.x86_64
mod24_geoip-1.2.7-1.6.amzn1.x86_64

# GeoIPとは？
maxmind社が提供しているIPアドレスから地理情報を確認することができるサービスです。
https://www.maxmind.com/

# mod_geoipの設定

前提：Apache2.4がインストール済みであること（設定は割愛）。

### mod_geoipのインストール

```
# yum install mod24_geoip
```

### GeoIPデータベースの更新

```
# cd /usr/share/GeoIP

<<< データが古いので退避 >>>
# mv GeoIP.dat GeoIP.dat.org

<<< 最新のデータを取得 >>>
# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# gunzip GeoIP.dat.gz
```

### geoip.confの設定
日本国外からの接続を遮断する設定

```Apache:/etc/httpd/conf.d/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>

<DirectoryMatch />
SetEnvIf GEOIP_COUNTRY_CODE JP AllowCountry
Order deny,allow
Deny from all
Allow from env=AllowCountry
</DirectoryMatch>
```

### 反映

```
# service httpd restart
```

# ApacheがELB配下にある場合

普通に設定するとアクセス元IPがELBのものになったり、ヘルスチェックが弾かれてしまったりしてうまく動作しません。
これらの問題を回避する為、以下の設定を追加します。

### ELB経由でもallow fromで元IPをチェックできるようにする
```Apache:/etc/httpd/conf/httpd.conf
#<<< 下記を追加 >>>
RemoteIPHeader X-Forwarded-For

#<<< LogFormat 設定を変更 %h -> %a >>>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%a %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
```

### ELBのヘルスチェックIPをチェック対象から除外
ELBのSubnetからの接続を許可する設定を追加すればOK（この例はクラスB全部）

```Apache:/etc/httpd/conf.d/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>

<DirectoryMatch />
SetEnvIf Remote_Addr "^172.(1[6-9]|2[0-9]|3[0-1])." AllowCountry <<<-- New!!
SetEnvIf GEOIP_COUNTRY_CODE JP AllowCountry
Order deny,allow
Deny from all
Allow from env=AllowCountry
</DirectoryMatch>
```

#### 反映

```
# service httpd restart
```


以上。


# 参考サイト
[GeoIP Legacy Apache Module ドキュメント](http://dev.maxmind.com/geoip/legacy/mod_geoip2/) 国の他に,大陸や地域ごとの制御も可能なようです。
[CentOSでGeoIPを利用してHTTPアクセスを制御する](http://qiita.com/SatoHiroyuki/items/4ccfa109a76dfe474793)
TensorflowでMNISTデータ認識＋多層ニューラルネット

# はじめに
Tensorflowの勉強をしばらくほったらかしにしていたので、~~復讐~~復習をかねてぼちぼちやっていく。
以前、下記サイトを読んでTensorflowの多層ネット化をもう少しわかりやすく書けないかなーと思い、今回作ってみた。
http://qiita.com/TomokIshii/items/92a266b805d7eee02b1d

# ソース
冒頭の変数宣言は気に入らないなと思いつつ、ひとまずアップしたソースのリンクをば。
[mnizst_SDG.py](https://github.com/WaterIsland/DLStudy/blob/master/tensorflow/source/mine/mnist/mnist_SGD.py)
> IPythonnのstartupファイルを設定しなくてもいいようにimportを追加 2016/10/08
> loss関数のcross_entropyの式を間違えていたので修正 2016/10/10


# 実装の概要
なお、このソースファイルは、以下の本家（https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html） のソースファイルを元に改良を加え。Tensorflowの礼儀作法に習い、以下の３関数を実装している。
1. inference
2. loss
3. training
ついでに、学習前・中・後のベンチマーク用にtest関数を実装している。
（結果しか見えないなんてつまんないです。後々のことも考えて。）

# 実行環境
ざっくり以下の環境。
・Mac OS X 10.10.5
・Python 3.5.1
・virtualenv
・IPython


# 処理内容（特筆すべき処理）
では、コードの説明をしよう。
正直、inferenceに該当する部分以外は特別いじっていないので省略する。


inferenceでは、次のようなニューラルネットを構築している。
1. 入力層（input_placeholder）、隠れ層（y1）、出力層（y2）で全結合
2. 入力層〜隠れ層間の結合の重みは W1 と b1、隠れ層〜出力層間の結合の重みは W2 と b2
3. 重みは、平均 0 、偏差 0.1（分散 0.01）で初期化
4. 中間層の活性化関数は、sigmoid、softplus、relu のいずれか（テスト済み）

# 処理内容（ここだけ気をつけて）
学習中のテストには、学習データから除外された確認用のデータを使用していることに注意すれば、あとは本家の処理そのものである。

# 処理結果

実行するとこんな感じである。いい感じですね。
![スクリーンショット 2016-10-05 17.36.28.png](https://qiita-image-store.s3.amazonaws.com/0/143341/a3ad8101-86f8-4c33-6ef0-a266e4460b50.png)
Vagrantで共有フォルダ設定したフォルダでbundle installがコケる

- RailsプロジェクトをVagrantで構築して共有フォルダ設定をしてAtomでコーディングしたかった物語です

## 経緯
- `bundle install --path vendor/bundle/`をすると
- `Gem::Ext::BuildError: ERROR: Failed to build gem native extension.`というエラーが出ました
- native extensionがビルド出来ないっぽいです
- 
- ここでnokogiriでエラーが出ていたので、nokogiriでコケるあるあるのパターンだ！と思って色々やりましたが、上手く行きませんでした。
- しかし、共有フォルダに設定したフォルダ以外では正常にbundle install出来ます


## 問題
- 調べてみるとwindowsの権限周りが邪魔をしてビルド出来ないらしいです

## 解決策
- そのままなのですが、

### bundleでインストールされる先を共有フォルダから外しちゃおう作戦
- 至って簡単なのですが、
- `bundle install --path ../vendor/bundle`で共有フォルダ外にしました

## 終わり
- ゴリ押し感がありますが結構ハマってしまって時間がなかったので応急処置的な感じです
- もっと良い解決方法があれば教えて頂きたいです。


## 参考URL
- https://tamosblog.wordpress.com/2015/02/22/bundle-install_on_vagrant/
CentOS7にPostgreSQL9.6をGUIで、インストール

#Linuxに、なれていない場合でも、簡単に、GUIで、最新のPostgreSQLがインストールできます。

CentOS7が、Gnome Desktopでインストールされている状態から、enterprisedbのサイト(http://www.enterprisedb.com/products-services-training/pgdownload#windows)
より、Linux用の、postgresql-9.6.0-1-linux-x64.runをダウンロードします。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/59472/6d9e103b-b780-8c38-965b-77e12ef4068c.png)

# runファイルに実行権限をつける。
Linuxに、あまり、なじみのない場合は、./postgresql-9.6.0-1-linux-x64.run
で実行しようとするかもしれませんが、runファイルは、実行できません。
これも、GUIで、『プログラムとして実行できる』　にチェックをつけますて、実行します。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/59472/fb1eaca5-1953-50d0-71e2-bacb08d455d5.png)

# runファイルを実行。
ここからは、Windowsのインストールと、同様の進み方で、Nextで、インストールが可能です。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/59472/d21b5a46-cbb6-4ebf-6680-1a1eb4814888.png)
locateの設定が注意点。(cが万能かと思っていましたが、そうではないようで、使用される用途により、選択が必要です)
![005.png](https://qiita-image-store.s3.amazonaws.com/0/59472/9f9c1e40-7ef3-78a6-3f43-5dbb5efa99d9.png)

# 接続設定も、GUIで。
vi/vimではなく、geditを使用して、Windowsのメモ帳の感じで、接続設定編集が可能です。
/opt/PostgreSQL/9.6/dataにある、pg_hba.conf、postgres.confを編集します。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/59472/dccffe3f-8313-0bf0-1047-943972848172.png)

あとは、ファイアーウォール(これもGUI)を設定し、サービスを再起動すれば、OK。
* * *
アプリケーションの開発のテストなどで、手元に、PostgreSQLを試してみたい方などには、よい手順ではないかと、思います。
詳細な手順と画面は、こちら、http://a23.sblo.jp/article/177085921.html
Goでツイートしてみよう

# 自己紹介

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の2回生です👍 (2016.10.4現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

# GolangでTwitter

使うものは、Aditya Mukerjeeさんの[anaconda](https://github.com/ChimeraCoder/anaconda)というライブラリを使います。

## コードを書いていくヨ

```go
package main

import (
  "fmt"
  "github.com/ChimeraCoder/anaconda"
  "log"
)

func main() {
  anaconda.SetConsumerKey("[ck]")
  anaconda.SetConsumerSecret("[cs]")
  api := anaconda.NewTwitterApi("[at]", "[as]")

  text := "Hello from Golang."
  tweet, err := api.PostTweet(text, nil)
  if(err != nil){
    log.Fatal(err)
  }
  fmt.Println(tweet.Text)
}
```

Goはそれほど書いたことはないんですが、まぁ普通な流れですね。

`anaconda`を使っているところで認証周りをしてもらって、textにつぶやく内容を代入します。

`PostTweet()`を使いtwitterへつぶやいて、エラーがあればエラーの内容を表示し、

つぶやいた内容を標準出力するまでです。

# 最後に

main関数があるのは、やはり便利ですねぇ〜

Twitter -> [@konojunya](https://twitter.com/konojunya)