OmniAICreator/Qiita-1.07M huggingface dataset:
サーバーで絶対に行わなければいけない最低セキュリティ設定

ちゃんとセキュリティログ見てますか？（cat /var/log/secure）
↑おそらくsshのポートを変更していない場合、不正ログインを試みようとした形跡がズラ～って表示されます。
２４時間常にサーバーは危険に晒されています。

だるがってはだめです！
サーバーは契約してすぐは穏やかでもそのうち　必ず！　必ずです！　１００％です！
中国などからOS自体に不正ログインアタックが行われます。

１００％です！
私の管理する５０のサーバーではすべて不正ログインを試みた形跡があります。

パスワード認証で、特にセキュリティ対策をしていない場合OSにログインされてしまうのも時間の問題です。

しかも、仮に不正ログインされてもcronを勝手に設定されたりなどなので気づかないことも多いかと思います。

あとは、鍵認証に勝手に追加されているというのもよく聞きます。

データ破壊なんて、攻撃者にメリットないですものね。
目的はそんなものではありません。
そもそも気づかれたら対策されて終わりじゃないですか
攻撃者はあなたのサーバーをあなたに気づかれないように悪いことに利用しようとしているのです。

手順というよりは項目だけ。

#【リモートからのルート権限でいきなりログインするのを防止する】#
sshからルート権限で動作させたい場合は、一旦一般ユーザーでログイン後「su」コマンドでルートになるようにします。
これで、ルート権限を使用できるようにするには２重ログインが必要になり安全になります。
>vim /etc/ssh/sshd_config
PermitRootLogin no

#【パスワード認証を無効にする】#
※この設定だけを行うとサーバーにsshからログインできなくなります。
RSA（鍵認証）の設定をしてからこの設定をして下さい。
パスワード認証は危険過ぎるので鍵認証だけでsshログインできるようにします。
>vim /etc/ssh/sshd_config
PasswordAuthentication no

#【sshのポート変更】#
※この設定だけを行うとサーバーにsshからログインできなくなる可能性があります。
firewalldなどでの設定が必要なのと、ログインするクライアント側でもコマンドにポートを指定しないといけなくなります。
サーバーの入口を変えて入り口を見つけるとことから初めさせましょう。
普通は22番ポートがサーバーの入り口です。
これを使われていない適当な番号に変更することで入口が分かりません。
ですが、すべての番号に総当りでチェックされたらばれてしまいます。
>vim /etc/ssh/sshd_config
「Port 22」　を　「Port xxxxx」　へ書き換える

#【denyhostsの導入】#
これは不正ログインしようとしているホストIPを自動でアクセス拒否してくれます。
仕組みとして、sshが吐き出すセキュリティログ（ログインに失敗したや存在しないユーザーでログインしようとした等）を監視して、自動的にアクセス拒否のリストに追加してくれるサービスプログラムです。
これを導入するだけでパスワード認証でさえもほぼほぼ防げます。
>（yum install epel-release）
yum install denyhosts
vim /etc/denyhosts.conf
「ADMIN_EMAIL」　の行の自分のメールアドレスを追加する（カンマ区切りで複数可）
あとはディフォルトのままでもいい
service denyhosts start（初回は多少時間かかる）
chkconfig denyhosts on
chkconfig --list denyhosts（２〜５がオンになっているかチェック）

#【firewalldの導入】#
CentOS7から標準搭載されており、標準でオンになっています。
CentOS6までは開きまくっているポート（全て開いてるかも）を自分で使わないポートを塞ぐという設定が必要でしたが、
このfirewalld（すなわちCentOS7以降）ではディフォルトでポートは閉じまくっています。（sshだけ許可されているはずです）
要するに、起動していればディフォルトのままでも一応おｋです。


#【その他】#
他には、脆弱性の多いsshバージョン１を無効化することや、
>vim /etc/ssh/sshd_config
「Protocol 2」

webサーバーやphp（できるかな？）などをルート権限で起動させない。
（ユーザーとグループを一般ユーザーに変更する）

できれば毎日、最低週一でアップデート（yum update）を実行する（Heartbleedのようにとんでもないバグ、脆弱性はありまくり）
cronで実行してもいいかと思います
（yum update）を問答無用で実行して、サーバーがおかしくなったことは一度もないので。

phpMyAdmin自体を入れない
Adminじゃないけど
例えば、もし、Webの画像アップロードフォームからphpファイルをアップロードされてみてください。
それで、思い通りにそのphpを実行されてしまいますね。
phpは仕方ない場面だらけかも知れないが、極力使わない。
使うならちゃんと、画像ディレクトリではphpにアクセスしてもphpに処理を流さないようにする。

データベースは全ユーザーをローカルからのみログイン可能にする。
（普通はそれで問題ない場合だらけなはず）
sshでログイン後に
などなど
Markdownでシーケンス図を書いてGithubのREADME.mdに埋め込む



Markdownで図を書く方法が予想外に快適だったので共有しなければならない。と使命感にかられました。


## まずシーケンス図

めっちゃストックされてる以下を参照しつつ書いてみる

Markdownテキストでシーケンス図とフローチャートを描く
http://qiita.com/ka215/items/a709665cb34c505ccf1f


StackEditでシーケンス図を書く
https://stackedit.io/


```md
```sequence
Frontend->Backend:get or post
Backend->Redis:get
Redis->Redis:get model
Redis-->MySQL:get model (When data is not found on Redis)
Redis-->Backend:mohdel
Backend-->Frontend:json
Frontend->Frontend:build DOM
```

するとこんな素敵なシーケンス図ができるのですかさずスクリーンショットをとる。


<img width="300" alt="setupguide_structure_image.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/7b8fa6bb-45f1-b060-b9ba-050b0cbde0a9.png">




## README.mdに埋め込む

- スクリーンショットをプロジェクトのリポジトリにプッシュする
- github上のリポジトリから画像のURLを取得する
- Readme.mdに埋め込む (GithubのUI上から直接修正すると楽)

```Readme.md
.
.
![overview image](https://github.com/hogehogehoge_project/overview.png?raw=true)
.
.

```


ついでに図のMarkdownも下の方にはっつけておけばメンテナンス性も完璧。
ローカル環境でmultirust+rustbookでRust日本語ドキュメントをビルドする

https://github.com/rust-lang-ja/the-rust-programming-language-ja をローカル環境でビルドする手順です。


## 前提
| 項目 | 説明 |
|----|-------------------------|
| OS | MacOSX 10.11.2 |
| Rust | 1.7.0 stable, 1.9.0 nightly |
| 検証日時 | 2016.03.25              |

## `rustbook`のインストール
[multirust](https://github.com/brson/multirust)経由で入れます。

```
$ multirust run nightly cargo install --git https://github.com/steveklabnik/rustbook.git
```
設定を変えていない場合は`$HOME/.multirust/toolchains/nightly/cargo/bin/rustbook`にインストールされます。


## `rustbook`の実行
インストールしたrustbookをそのまま実行するとライブラリを読めずにエラーになります。

```
$ ~/.multirust/toolchains/nightly/cargo/bin/rustbook
dyld: Library not loaded: @rpath/librustdoc-18402db3.dylib
  Referenced from: /Users/hattori-h/.multirust/toolchains/nightly/cargo/bin/rustbook
  Reason: image not found
zsh: trace trap  ~/.multirust/toolchains/nightly/cargo/bin/rustbook
```

なのでこれを回避するために環境変数`DYLD_LIBRARY_PATH`を指定して実行します。

```
$ DYLD_LIBRARY_PATH=$HOME/.multirust/toolchains/nightly/lib ~/.multirust/toolchains/nightly/cargo/bin/rustbook
Usage: rustbook <command> [<args>]

The <command> must be one of:
  help    Print this message.
  build   Build the book in subdirectory _book
  serve   --NOT YET IMPLEMENTED--
  test    --NOT YET IMPLEMENTED--
```

実行できました。


## ドキュメントをビルドする
ここまで準備が整えばあとはビルドするだけです。
`SUMMARY.md`を起点にビルドするので、`SUMMARY.md`がある場所にカレントディレクトリを変更します。
(大抵ドキュメントのルートディレクトリ的なところにあるはず。)

```
$ git clone https://github.com/rust-lang-ja/the-rust-programming-language-ja.git
$ cd the-rust-programming-language-ja
$ find . -name "SUMMARY.md"
./1.6/en/book/SUMMARY.md
./1.6/en/nomicon/SUMMARY.md
./1.6/en/style/SUMMARY.md
./1.6/ja/book/SUMMARY.md
./1.6/ja/nomicon/SUMMARY.md
./1.6/ja/style/SUMMARY.md
$ cd 1.6/ja/book
$ DYLD_LIBRARY_PATH=$HOME/.multirust/toolchains/nightly/lib ~/.multirust/toolchains/nightly/cargo/bin/rustbook build .
```

`_book`ディレクトリが作成され、その中にビルドされたドキュメントが作成されます。

以上
Realmメモ


## スレッド間のオブジェクト共有不可能

一意に検索できるものを渡して別スレッド上で再検索し、オブジェクトを生成する。

```swift
let realm = try! Realm()
let foo1 = realm.objects(Foo).first!
let fooId = foo1.id
let q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(q) {
    let foo2 = realm.objects(Foo).filter("id = %@", fooId).first!
    print(foo2.name) // ok
    print(foo1.name) // error
}
```


## オブジェクトを削除すると関連している箇所はnilになる

```swift
class Foo: Object {
	dynamic var id = NSUUID().UUIDString
	dynamic var bar: Bar?
	let bazList = List<Baz>()
}

class Bar: Object {
	dynamic var id = NSUUID().UUIDString
}

class Baz: Object {
	dynamic var id = NSUUID().UUIDString
}

let realm = try! Realm()
let bar = Bar()
let baz = Baz()
let foo = Foo(value: ["bar": bar, "baz": baz])
realm.write {
	realm.add(bar)
	realm.add(baz)
	realm.add(foo)
	
	realm.delete(bar)
	realm.delete(baz)
}

print(foo.bar) // nil
print(foo.bazList.count) // 0
```


## Realm#delete()はSequenceTypeなものは入る

Realm Docsの[オブジェクトの削除](https://realm.io/jp/docs/swift/latest/#section-25)にはオブジェクト単体かDB内全削除しか例にないが、 _delete()_ の定義を見ると

```swift
public func delete<S: SequenceType where S.Generator.Element: Object>(objects: S)
```

があるので、次のように同時に複数のオブジェクトを削除することもできる。

```swift
// 検索結果を利用して削除
realm.delete(realm.objects(Foo).filter("id IN %@", ["a", "b"]))

// 関連しているオブジェクトを削除
realm.delete(foo.bazList)
```


## LinkingObjectsは遅延解決

Realmにおけるオブジェクト間の関係は一方向なので、本来は両方に別オブジェクトへの関係を書かないといけないのだが、大きくなればなるほど整合性を保つのが大変になる。
そのために存在するのが _LinkingObjects_ である。

```swift
class Foo: Object {
	dynamic var name = ""
	dynamic var bar: Bar?
}

class Bar: Object {
	dynamic var name = ""
	let fooList = LinkingObjects(fromType: Foo.self, property: "bar")
}
```

ただし、LinkingObjectsはリストのようなものなので、OneToOneのような関係の場合は次のように書いてしまいがち。

```swift
class Bar: Object {
	let foo = LinkingObjects(fromType: Foo.self, property: "bar").first!
}
```

これは必ずnilになる。
なぜかというと、LinkingObjectsはオブジェクトが生成されてから意味を持つオブジェクトなので、それまでは何のデータもないオブジェクトになるから。

もし単体で欲しい場合は、次のように書く必要がある。

```swift
public class Bar: Object {
	private let fooList = LinkingObjects(fromType: Foo.self, property: "bar")
	public var foo: Foo { return fooList.first! }
}
```


## データモデルへの変更はリアルタイム

Realmの更新は全てトランザクション内でないといけないので

```swift
let foo = realm.objects(Foo.self).first!
foo.name = "foo"
try! realm.write { realm.add(foo, update: true) }
```

とかやろうとすると`foo.name = "foo"`の時点でエラーになるので、次のようにトランザクション内で全て行う必要がある。

```swift
let foo = realm.objects(Foo.self).first!
try! realm.write {
    foo.name = "foo"
}
```

結局Realmオブジェクトを剥き出しにしないとならなくなるので、何かのクラス内に押し込めたく考えた結果、次のような方法で更新処理をするようにした。

```swift
let foo = Foo(value: realm.objects(Foo.self).first!)
foo.name = "foo"
try! realm.write { realm.add(foo, update: true) }
```

Fooにはちゃんとプライマリーキーを設定しないといけない。
[Google Analytics] ui-routerでurlに渡しているパラメータに依存しないでpageView数を集計したい(angulartics利用)

#angularticsいれるだけだと
http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$stateProvider

ユーザーページのurlを

    url: "/users/:userid"

と指定していると、
google analyticsは
/users/1
/users/2
とuser別に件数をカウントしてしまいます。

ユーザーページのPV数が取りたいのに。

#$analytics.pageTrackを使う
https://github.com/angulartics/angulartics

    $analytics.pageTrack('/my/url');

と記述すればこのpathで「も」GoogleAnalyticsに送られます。
(元の"/users/1","/users/2"でも送られます)

#どこに記述するか
angularticsのwebsiteには

    module.controller('SampleCtrl', function($analytics) {
        // emit pageview beacon with path /my/url
        $analytics.pageTrack('/my/url');

とControllerの頭に記述していますが、
URLの管理をしているmodule.configの方に書けば一元管理できます。

    angular.module().config(
            ['$stateProvider', ($stateProvider: angular.ui.IStateProvider) => {
                $stateProvider
                    .state('user-page', {
                        url: "/users/:userid",
                        onEnter: ['$analytics', function($analytics: any) {
                            $analytics.pageTrack('user-page');
                        }],
                    })
kintone で SpreadJS による計算

#SpreadJS の強力な計算機能

Excel 関数と同等の関数が SpreadJS にあるということですので、kintone で使ってみます。
しくみは、見ての通り、kintone の入力に値を入れると、SpreadJS で計算して、出力に取り込みます。
![image](https://qiita-image-store.s3.amazonaws.com/0/100572/3b2b2c6e-a18a-851d-7187-2d1365b27499.png)

SpreadJS の計算式を変更すると、出力も変えられます。JavaScript で計算するより簡単です。
複雑な計算式も、SpreadJS 上に設定するだけです。
![image](https://qiita-image-store.s3.amazonaws.com/0/100572/f855eb0f-b1bd-92a3-aeff-ae18a0c02815.png)

#JavaScript

「入力」項目の値が変わったら、SpreadJS に値をセットして、出力セルを「出力」項目に設定します。

```
(function() {
    "use strict";
    kintone.events.on(["app.record.detail.show", "app.record.edit.show", "app.record.create.show"], function(event) {
        
        kintone.app.record.setFieldShown('データ', false);
        
        //----------------------------------------------
        // SpreadJS設定
        //----------------------------------------------
        // SpreadJSカルチャ設定
        $.wijmo.wijspread.Culture("ja-jp");
        // SpreadJSインスタンス生成とシートの取得
        var sspace1 = kintone.app.record.getSpaceElement('SPREAD1');
        $(sspace1).css("height","300px");
        $(sspace1).wijspread();
        var spread = $(sspace1).wijspread("spread");

        if(event.record['データ']['value']){
            // インポート
            spread.fromJSON(JSON.parse(event.record['データ']['value']));
        }
        
        var sheet = spread.getSheet(0);
        sheet.setValue(2,2, parseInt(event.record['入力']['value']));
        sheet.setValue(4,2, '=' + sheet.getFormula(3,2));
        
        sheet.bind($.wijmo.wijspread.Events.ValueChanged, function (e, info) {
            var record = kintone.app.record.get();
            record['record']['出力']['value'] = info.sheet.getCell(3,2).text();
            kintone.app.record.set(record);
        });

        return event;
    });

    kintone.events.on(["app.record.edit.change.入力", "app.record.create.change.入力"], function(event){
        var sspace1 = kintone.app.record.getSpaceElement('SPREAD1');
        var spread = $(sspace1).wijspread("spread");
        var sheet = spread.getSheet(0);
        sheet.setValue(2,2, parseInt(event.record['入力']['value']));
        sheet.setValue(4,2, '=' + sheet.getFormula(3,2));
        event.record['出力']['value'] = sheet.getCell(3,2).text();
        return event;
    });

    kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(event){
        var sspace1 = kintone.app.record.getSpaceElement('SPREAD1');
        var spread = $(sspace1).wijspread("spread");
        // エクスポート
        event.record['データ']['value'] = JSON.stringify(spread.toJSON());
        return event;
        
    });
    
})();
DockerコンテナにGlusterFSを導入してみた


最近私の中で色んな意味でホットなGlusterFSを大好きなDockerコンテナに導入してみました。

# 環境

|OS|CentOS7.2|
|:--|:--|
|Kernel|3.10.0|
|Docker|1.8.2|
|Container|CentOS7.2|
|GlusterFS|3.7.8|

# 前提

* ホストOSはminimal install
* yum update済み
* SELINUX停止済み
* Dockerは導入済み
* 作業はrootで行う

# 導入

* Dockerコンテナを特権モードで起動する

```
[root@hostos ~]# docker run --privileged -it --name=gfs docker.io/centos
```

* 必要なパッケージを導入する

```
[root@container /]# yum install -y glusterfs-server.x86_64
```

* コンテナから抜けてイメージ化を行う

```
[root@hostos ~]# docker commit gfs centos7/gfs
```

* 作成したイメージから特権モードでコンテナを起動する

```
[root@hostos ~]# docker run --privileged -itd --name=gfs01 centos7/gfs /sbin/init
[root@hostos ~]# docker run --privileged -itd --name=gfs02 centos7/gfs /sbin/init
```

* GlusterFSサービスを起動する

```
[root@container01 /]# systemctl start glusterd
[root@container02 /]# systemctl start glusterd
```

* GlusterFSの領域を作成する

```
[root@container01 /]# mkdir -r /gfs01/01
[root@container02 /]# mkdir -r /gfs02/02
```

* GlusterFSのコンテナ同士でPeerを貼る

```
[root@container01 /]# gluster peer probe [gfs02 IPADDR]
```

* GlusterFSのストレージを作成する

glusterの後の「volume」は「vol」と省略も可能

```
[root@container01 /]# gluster volume create [VOLUME NAME] replica 2 [gfs01 IPADDR]:/gfs01/01 [gfs02 IPADDR]:/gfs02/02
[root@container01 /]# gluster volume start [VOLUME NAME]
```

* ホストOSからGlusterFSをマウントする

ここではgfs01のIPアドレスを指定しているがgfs02のIPアドレスでもマウント可能
glusterfsタイプでマウントするには「glusterfs-fuse」パッケージが必要

```
[root@hostos ~]# yum install -y glusterfs-fuse
[root@hostos ~]# mount -t glusterfs [gfs01 IPADDR]:/[VOLUME NAME] [MOUNT POINT]
```

# DockerコンテナのGlusterFSを外部からマウントしたい時

## 方法１：ブリッジネットワークで外に出す

* Pipeworkなんかを使ってコンテナにブリッジ接続のvethを追加

Pipeworkまたはnsenterの設定を行いブリッジ接続でコンテナを外部公開することでGlusterFSの外部マウントが可能になります。
Pipework/nsenterの設定方法についてはこの記事の本質ではないので割愛いたします。
(後日別記事としてあげるかもしれません。)

## 方法２：必要なポートをExposeする

Dockerコンテナの起動時に必要なポートをExposeすることによって外部からGlusterFSストレージに対してアクセス出来るようにします。GlusterFSのバージョンによって必要なポートが変更されておりますのでご注意ください。

* Peerで利用されるポート
 * 1017 - 10xx
* GlusterFS Deamonポート
 * 24007
* マネジメントポート
 * 24008
* GlusterFSのブリックが利用するポート
 * 24009 - 
* GlusterFS NFSサービスを利用する場合
 * 38465 - 
* GlusterFSのブリックが利用するポート
 * 49152 - 

Peerで利用する1017-ポートは解放しなくてOK
GlusterFS Version3.4未満ではブリックごとに24009から連番で割り当てられる
GlusterFS Version3.4以上ではブリックごとに49152から連番で割り当てられる

参考URL(外部サイト)：http://www.gluster.org/community/documentation/index.php/Basic_Gluster_Troubleshooting

# Dockerコンテナ In GlusterFSで出来ないこと

## コンテナに直接Lunをマウント出来ない
現状コンテナにLunをマウントすることが権限的に出来ないのでホストOSにマウントして、コンテナに-vオプションでマウントという方法しか無い。
マウントレイヤが一層増えるのでもちろん性能は下がる。これはDockerの仕様の問題なので解決するのには先が長そう・・(システム領域を触ることになるのでセキュリティ的に大丈夫かとかがあるはず)

## 性能はそんなによろしくない
直接Lunマウントなんかが出来ないものだから素で使うより性能はよろしくはない。
ただHWリソースの制限ができるので最適化できれば利用価値はあるかも。しれない。

## Stripeモードが不安定な場合がある
ホストに直接GlusterFSを導入してガリガリ使ったことがないからなんとも言えないがStripeで組んだ時にマウント先の中身が見えなくなることがあった(書き込みは出来る)。
これはGlusterFSのポートとも関係がありそう。基本的には双方向通信が出来ないとGlusterFSは利用出来ないです。
DockerコンテナからはiSCSIカーネルモジュールが見えない件


DockerコンテナからiSCSI直接マウントできたら幸せだなぁ。
たぶんできないだろうなぁ。と思ったらやっぱりできなかった。

## コンテナにiSCSIイニシエータを導入したかった

* ホストOSからCentOSのコンテナを起動

```
[root@hostos]# docker run --privileged -idt --name init centos /sbin/init
```

* コンテナへアクセス

```
[root@hostos]# docker exec -it init /bin/bash
```

* iSCSIイニシエータの導入

```
[root@container]# yum update -y
[root@container]# yum install -y iscsi-initiator-utils
[root@container]# iscsiadm -m discovery -t sendtargets -p 10.250.201.122
```

* iSCSI用のカーネルモジュールが無いとエラーが出る

```
libkmod: kmod_module_insert_module: could not find module by name='iscsi_tcp'
iscsiadm: Could not insert module tcp. Kmod error -38
iscsiadm: iSCSI driver tcp is not loaded. Load the module then retry the command.
 
iscsiadm: Could not perform SendTargets discovery: iSCSI driver not found. Please make sure it is loaded, and retry the operation
```

* ホストOSにカーネルモジュールが存在するか確認

```
[root@hostos]# find -name *iscsi_tcp*
./3.10.0-123.el7.x86_64/kernel/drivers/scsi/iscsi_tcp.ko
./3.10.0-123.el7.x86_64/kernel/drivers/scsi/libiscsi_tcp.ko
./3.10.0-229.14.1.el7.x86_64/kernel/drivers/scsi/iscsi_tcp.ko
./3.10.0-229.14.1.el7.x86_64/kernel/drivers/scsi/libiscsi_tcp.ko
```

ちゃんとある模様

* コンテナにカーネルモジュールが存在するか確認

```
[root@container]# find -name *iscsi_tcp*
```

存在しない

* ちなみに

```
[root@container]# ll -a /usr/lib/modules/
total 8
drwxr-xr-x.  2 root root 4096 Aug 14 21:05 .
dr-xr-xr-x. 18 root root 4096 Aug 14 21:05 ..
```

コンテナ内にはカーネルモジュールはすっからかん

## 結論
CentOS7 for Docker Containerではコンテナに対してiSCSIイニシエータを導入することは出来ない。
これはCentOS7上で利用するDockerコンテナの制約である。

## 参考
[[RedHat社森若氏の資料]](http://www.slideshare.net/moriwaka/docker-38735584)（14P）でもDocker Containerはカーネルやハードウェアに対して操作できないことを示唆
PythonでQRコードを生成する

QRコードを作るWEBサービスというのはどうにもこうにも広告が多すぎる。さらにはURLとか特定文字列だけQRコードにしてくれたらいいんだけど、機能が多すぎて面倒くさい。

よし、ならば自分用に作ろう。がきっかけです。

まずは外部モジュールのインスコから。
qrcode 5.2.2をまずは https://pypi.python.org/pypi/qrcode

次に画像処理なのでPillowですね。
https://pypi.python.org/pypi/Pillow

これで準備万端。


```python:makeqr.py

import qrcode
from PIL import Image

img = qrcode.make("http://www.yahoo.co.jp/")
img.save('qr_code.png')

img.show()

```

実質これだけなんですが、レン鯖で自分用で動かしたいのでCGIにします。
以下、さくらインターネットに実際に設置したモノ。さくらで外部モジュールを使う場合はこちらをご参考ください。

http://qiita.com/Gen6/items/a6747c1bb432fcec337a


```python:makeqr.cgi

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
import qrcode
from PIL import Image
import cgi
from datetime import datetime

print "Content-Type: text/html\n"

print """
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
<style>
#content{
  width: 100%;
  text-align: center;
}

#topmain {
  width: 90%;
  margin: 0 auto;
  margin-top: 100px;
  text-align: center;
}

input[type="text"] {
  width: 400px;
  height: 30px;
}

input[type="submit"] {
  background: #ff9900!important;
  color: #fff;
  font-size: 15px;
  padding: 8px;
  border-radius: 4px;
  width: 200px;
}

</style>
<div id="content">
<div id="topmain">
"""

form = cgi.FieldStorage()

newQr = form["targets"].value
today = datetime.now().strftime("%Y/%m/%d %H:%M:%S")

print "<h1>" + newQr + "</h1>"
print "<p>" + today + "</p>"
print "<p><a href=\"index.html\">Back to TOP</a></p>"

img = qrcode.make(newQr)
img.save('qr_code.png')

print "<p><img src=\"qr_code.png\"></p>"

print """
</div>
</div>
</body>
</html>
"""

```


おしまい。
Dockerは勝手にCPUを全部使っちゃうよという話


元々そういわれていた様な気もするのでなにを今更という感じもしますが備忘として。

## HostOSにprocessorひとつ

* HostOSのprocessor数の確認

```
# cat /proc/cpuinfo | grep processor
processor       : 0
```

CPUはひとつだけ。

* コンテナに割り当てられたprocessorの確認

```
# cat /sys/fs/cgroup/cpuset/system.slice/docker-046da3a950705f500154c13fd0cc4ded2e01145e26aed3797b5231c6cafebe5d.scope/cpuset.cpus
0
```

もちろんコンテナに割り当てられているのもひとつだけ。

## processor増設(1→4)

VMのCPU割り当てを追加しました。

* HostOSのprocessor数の確認

```
# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3
```

CPUプロセッサは４つ見える。

* コンテナに割り当てられたprocessorの確認

```
# cat /sys/fs/cgroup/cpuset/system.slice/docker-046da3a950705f500154c13fd0cc4ded2e01145e26aed3797b5231c6cafebe5d.scope/cpuset.cpus
0-3
```

勝手に4つ全部使ってる！

## 要するに

 `--cpuset-cpus` オプションを利用しないで立ち上げたコンテナについてはHostOS側のprocessorを増設すると自動で割り当て数も増える。
 
CPUを計画的に使いたいのであれば各コンテナに必要なprocessorを割り当てた方が良いよということ。
５行で出来るブリッジネットワークの作り方 in CentOS7.X


ブリッジ接続便利ですよね、かなり使ってます。
DockerとかKVMとか利用用途が広いので覚えておくと便利です。
この作り方ならNetworkManagerを止めなくてもOK

# ブリッジネットワークの作り方

## 1行目

```shell-session
# nmcli connection add type bridge con-name br0 ifname br0 stp no
```

ブリッジ「br0」を作成します。作成の際にSTPは止めておきます。

## 2行目

```shell-session
# nmcli connection modify br0 ipv4.method manual ipv4.addresses "192.168.0.1/24" ipv4.gateway "192.168.0.254" ipv4.dns 8.8.8.8
```

今回のキモですipv4.addressesにはブリッジ先のIPを割り当て、ipv4.gatewayにはそのGatewayを、ipv4.dnsには言わずもがなDNSを割り当てます。

## 3行目

```shell-session
# nmcli connection add type bridge ifname eth0 master br0
```

このコマンドでeth0とbr0をブリッジ接続しています。

## 4行目

```shell-session
# nmcli con del eth0
```
不要になったeth0を削除します。

## 5行目

```shell-session
# systemctl restart network
```

ネットワークを再起動して完成です。

昔みたく/etc/sysconfig/network-script/ifcfg-ethXを弄くったりしなくて良くて楽ちんですね！

# まとめ(コピペ用)

```shell-session
nmcli connection add type bridge con-name br0 ifname br0 stp no
nmcli connection modify br0 ipv4.method manual ipv4.addresses "IPAddr/24" ipv4.gateway "Gateway" ipv4.dns 8.8.8.8
nmcli connection add type bridge ifname eth0 master br0
nmcli con del eth0
systemctl restart network
```
テキストファイルを行単位でランダムに配置し直す


たまーに使うことがあるLinuxコマンドでいっつも忘れがちになるので備忘として残しておきます。
sortコマンドを利用してテキストの行単位ランダムソートを行えます。

# コマンド
-Rオプションがミソです。

```shell-session
cat hoge.txt | sort -R > hogehoge.txt
```

# 実例

* 元ファイル

```shell-session:hoge.txt
$ cat hoge.txt
aaaa
bbbb
cccc
dddd
eeee
```

* コマンド実行

```shell-session
$ cat hoge.txt | sort -R > hogehoge.txt
```

* ランダムソート後のファイル

```shell-session:hogehoge.txt
$ cat hogehoge.txt
aaaa
eeee
bbbb
cccc
dddd
```

簡単でしょう。
Apache起動で一部の画像が表示されない

【参考サイト】
Apacheを使ってローカルサーバーを構築し、
いざ、ブラウザに「http://localhost/ （localhost） 」とうちこみ
表示させてみたが。

パスはあっているのに、一部画像が表示されない！！！
![images_not_found.png](https://qiita-image-store.s3.amazonaws.com/0/115664/cc6c6083-2301-6f99-d096-6da35c641f90.png)
↑こんな感じ!


ターミナルで、該当の画像が格納されているimagesファイルに移動（cd）し、
「 ll 」 コマンドで、ファイルのパーミッション（アクセス権）を確認すると、
↑<a href ="http://innopm.hatenablog.com/entry/2013/11/26/155730"> 「 ll 」は、「ls -l」に相当するコマンドです。</a>

たしかに、ばらばらな様子。。
（-rw-r-----とか、調べましたが、ちょっとわからないので、割愛します。。）
![apache_01.png](https://qiita-image-store.s3.amazonaws.com/0/115664/bef397dd-2642-12b1-3433-88d9934e147c.png)


そこで、以下のコマンドを打ちました
chmod 644 ./*

再度、「 ll ( ls -l) 」 コマンドを叩くと、
綺麗に（rw-r--r--）統一されました

 追記： パーミッションの説明（ 左（rw-）→自分、　真ん中（r--）グループに対する権限 右（r--）自分でもなく、グルーブにもいないユーザー
　　　　　　　　　　　　r=読み w=書き x=実行 

644の数字については、以下の記事をご確認ください
<a href ="http://blog.fenrir-inc.com/jp/2012/02/file_permission.html"> 普通の HTML ファイルは 644 にする</a>

再度、localhostを確認。


ちゃんと画像が表示されました〜！！！！！！！！！！！！！！
最近のAndroid Virtual Device Managerでハードウェアのオプションを変更するには

Android のエミュレータがいつのまにか進化していて、AVD Manager も Android Studio に統合されています。コマンドラインで`android avd`すると旧来のスタンドアロンな AVD Manager が見えますが、どちらもハードウェアの設定は簡素化されて、すべてのオプションが GUI 上でいじれるわけではなくなってしまいました。

という訳で、GUI で変更ができないオプションはどうやって変更するか、というのがこの記事のフォーカスです。

## AVD の実体はどこにあるのか

Android Studio に統合された AVD Manager であれば、AVD の一覧の`Actions`のメニュー内に、`Show on Disk`という項目があります。ここから直接 AVD の実体を見ることができます。

![スクリーンショット 2016-03-25 15.40.17.png](https://qiita-image-store.s3.amazonaws.com/0/31829/b01ce2b2-35d2-c420-2a81-25fbd112bb30.png)

ファイルパスで言うと、`~/.android/avd/<AVD Name>/`が AVD の中身になります。

## AVD の設定を保存しているファイル

このディレクトリの中に、`config.ini`というテキストファイルがあります。
中身はいたってシンプル、各行にプロパティ名と値の対が並んでいるだけです。

```config.ini
avd.ini.encoding=UTF-8
AvdId=Nexus_7_API_23
abi.type=x86_64
avd.ini.displayname=Nexus 7 API 23
disk.dataPartition.size=200M
hw.accelerometer=yes
hw.audioInput=yes
hw.battery=yes
hw.camera.back=none
hw.camera.front=none
hw.cpu.arch=x86_64
hw.dPad=no
hw.device.hash2=MD5:47dc70fd92541dd16c19f9efa3e9db62
hw.device.manufacturer=Google
hw.device.name=Nexus 7 2013
hw.gps=yes
hw.gpu.enabled=yes
hw.gpu.mode=auto
hw.gsmModem=no
hw.keyboard=yes
hw.lcd.density=320
hw.mainKeys=no
hw.ramSize=1536
hw.sdCard=yes
hw.sensors.orientation=yes
hw.sensors.proximity=no
hw.trackBall=no
image.sysdir.1=system-images/android-23/default/x86_64/
runtime.network.latency=none
runtime.network.speed=full
runtime.scalefactor=auto
sdcard.size=100M
skin.name=nexus_7_2013
skin.path=/Applications/Android Studio.app/Contents/plugins/android/lib/device-art-resources/nexus_7_2013
tag.display=Default
tag.id=default
vm.heapSize=64
```

各設定項目のプロパティ名及び取りうる値は[公式のドキュメント](http://java.llp.dcc.ufmg.br:8080/apiminer/static/docs/tools/devices/managing-avds-cmdline.html#hardwareopts)にあります。これを見ながら、好みのものをゴリゴリと手で書くことで、GUI では設定できなかったものが設定できるようになります。
Git | $ git log で表示するコミット数を制限する

オプション `-n` を使えば良い。

`$ git log -n 1` (1コミット分だけ表示)
`$ git log -n 2` (2コミット分だけ表示)
`$ git log -n 3` (3コミット分だけ表示)

# もう一声

ハイフンの後に直接、数字を打っても良い。

`$ git log -1`
`$ git log -2`
`$ git log -3`

( @tsuyoshi_cho さん情報 )

# 環境

- git version 2.3.8 (Apple Git-58)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Dockerを利用していてagettyがCPU使用率を専有してしまったら


Dockerを利用していていると稀に遭遇する問題を書き起こしてみました。
正直何が原因で何をすれば改善出来るのかはっきりとわかっておりません。

自分の備忘録的な意味合いが強い記事ですがもしかしたら現在進行形で困ってる方のヒントになれば幸いです:)

# 事象

* Dockerコンテナを複数台<span class="red">**連続**</span>で立ち上げ
* ホスト機でTOPを確認するとagettyがCPU使用率100%で張り付く

```
top - 14:07:38 up 4 days, 22:31,  1 user,  load average: 5.69, 2.38, 2.94
Tasks: 208 total,   4 running, 204 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni,  0.0 id, 98.9 wa,  0.0 hi,  0.9 si,  0.0 st
KiB Mem :  8011232 total,  5015324 free,   559104 used,  2436804 buff/cache
KiB Swap:  2113532 total,  2113512 free,       20 used.  7119736 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
8296 root       0   0       0      0      0 R 100.0  0.0  23:03.09 agetty/tty
    3 root      20   0       0      0      0 R  71.4  0.0  23:03.09 ksoftirqd/0
  340 root       0 -20       0      0      0 S  19.9  0.0   5:00.85 kworker/0:1H
```
場合によっては複数agettyプロセスが張り付くこともあります。

* ホスト機の動作が全体的にスローダウン

## agettyとは何者か？

> agetty は tty ポートをオープンし、ログイン名を求めるプロンプトを出し、 /bin/login コマンドを起動する。通常 agetty は init(8) から 起動される。

>agetty はいくつか非標準な機能を持っており、直結ラインやダイアルインの ラインに便利になっている。 

参考：https://linuxjm.osdn.jp/html/util-linux/man8/agetty.8.html

要するにログインプロンプトだと理解している。

## 問題が発生した環境

|OS|CentOS7.2|
|:--|:--|
|Kernel|3.10.0|
|Docker|1.8.2|
|Container|CentOS7.2|
|コンテナ起動プロセス|/sbin/init|

## 問題が起こり得る状況

私の環境では以下の状況で起こりやすいです。

* コンテナを連続で作成した時
* コンテナを連続で起動した時
* サーバが別の負荷が発生している時

サーバが忙しい状態やコンテナ起動の処理が終わってないウチに別コンテナを起動するとなるようです。

## 原因は？

完全に予想ではあるが、コンテナ立ち上げ時にコンテナに対してagettyのログインプロンプトが割り当てられる。
割り当てが完了し、排他制御が出来るまでに次のコンテナが立ち上がるとagettyが重複して割り当てらる事によってプロセスが暴走している(ように見える)。

## 対処法

* gettyサービスを停止する

systemctlのリストをgettyで検索し、出てきたgettyプロセスを停止することでagettyが暴走するのを防ぎます。
(コンテナは正常に上がるがその他の影響については未調査)

```
systemctl list-units *getty* 
systemctl stop getty@tty1.service
systemctl stop system-getty.slice
systemctl stop getty.target
```

* 暴走したagettyプロセスをkillする

TOPコマンドで暴走しているagettyプロセスIDを検出し、そのプロセスをKillする方法。
killしてもコンテナは稼働しています。

```
kill [agetty プロセスID]
```
deploygateをenterprise版に乗り換える際に便利なスクリプトを書いた

deploygateすごく便利なんだけど、Freeとかで試していていざEnterprise版を導入しようとすると
グループを作らずにアカウントに直接紐付けていたアプリはEnterprise版とは別の管理になってしまい悲しい事になる  
  
現状これをいい感じに移行してくれる仕組みは無い様なので　　
Enterpriseじゃない方からダウンロードしてきてEnterprise版に再アップロードするスクリプトを書いた  

https://github.com/komatatsu/deploygate-reuploader
ruby2.2.4を使っているので他のだと動かないかも知れないけど簡単な内容なのでいい感じに書き換えるとかして使ってください
【ハンズオン資料】IBM Bluemix Swift Runtime.

IBM Bluemix Swift Runtimeを使った、Swiftウェブアプリケーション開発環境構築手順。

・IBM Swift Sandbox
　https://swiftlang.ng.bluemix.net
・IBM Swift KITURA
　https://github.com/IBM-Swift/Kitura
・IBM Bluemix OpenWhisk
　http://www.ibm.com/cloud-computing/bluemix/openwhisk/

# 事前準備（必ず確認してください。）
・IBM Bluemix アカウント取得。
　http://ibm.biz/bluemixfree
・CF（Cloud Foundry） CLI Install
　https://github.com/cloudfoundry/cli/releases
・Bluemix CLI Install
　http://clis.ng.bluemix.net/ui/home.html
・Dockerハンズオン資料のダウンロード
　[Hand_on_Swift_Docker_IBM_bluemix](https://www.dropbox.com/s/dojw6mnq93z2xqy/Hand_on_Swift_Docker_Bluemix.pdf?dl=0)
・Docker Install
　https://docs.docker.com/engine/installation/
・Docker Hubからswiftイメージを取得（約900MB）
　`docker pull swiftdocker/swift`
・IBM Bluemixのリージョンや作業スペースを確認
![スクリーンショット 2016-03-25 13.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/29452/724583c9-74c3-f8a6-3327-0a1fe01f8933.png)


#Swift Runtimeを追加
![スクリーンショット 2016-03-25 13.04.11.png](https://qiita-image-store.s3.amazonaws.com/0/29452/87c4c2ed-d60d-9f77-42dd-524f07e02deb.png)
↓↓↓↓↓
![スクリーンショット 2016-03-25 13.14.31.png](https://qiita-image-store.s3.amazonaws.com/0/29452/52f3d540-dfb8-4a97-a543-cf2f11771a33.png)
↓↓↓↓↓
![スクリーンショット 2016-03-25 13.20.38.png](https://qiita-image-store.s3.amazonaws.com/0/29452/8b65a3d8-41f0-87aa-45eb-26fa5bbd7169.png)
↓↓↓↓↓
![スクリーンショット 2016-03-25 13.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/29452/9a2c1be5-8724-f88f-7470-b5fa1578195c.png)

#アプリのソースコードをダウンロードし、編集
![スクリーンショット 2016-03-25 14.50.17.png](https://qiita-image-store.s3.amazonaws.com/0/29452/6b97f3d1-b050-717b-7710-d6c3ae604782.png)
↓↓↓↓↓
![スクリーンショット 2016-03-25 14.59.11.png](https://qiita-image-store.s3.amazonaws.com/0/29452/11d20937-9c44-02b1-bd06-b68aa3ce98fd.png)
↓↓↓↓↓
![スクリーンショット 2016-03-25 15.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/29452/e7e7a60b-f134-373c-efa2-b04305093379.png)
↓↓↓↓↓
![スクリーンショット 2016-03-25 15.15.10.png](https://qiita-image-store.s3.amazonaws.com/0/29452/8076d0a5-d145-c8c4-f496-73c1b082db1d.png)

# BMXUG（Bluemix User Group）コミュニティ
「Bluemix」の「今」をフォローしましょう！

・Facebook ： [Bluemixユーザーグループ](https://facebook.com/groups/bmxug)
・Qiita ： [Bluemix Qiitaページ](http://qiita.com/tags/Bluemix)
・Doorkeeper：[Doorkeeperコミュニティ](https://bmxug.doorkeeper.jp/)
・Slack ： [Bluemix User Group(BMXUG)の交流用](http://bit.ly/1QzOgiC)
・stackoverflow ： [stackoverflow（コミュニティQ&A）](http://ja.stackoverflow.com/questions/tagged/bluemix)
・Twitter ： #bmxug
CentOS7を入れたらまずやること（初期設定）

## 一般ユーザーからsudoできるように設定
\# usermod -G wheel [一般ユーザー]
## パッケージのアップデート
$ sudo yum -y update
## SELinuxの無効化
$ sudo setenforce 0
$ sudo vi /etc/sysconfig/selinux
SELINUX=enforcing
↓
SELINUX=disabled
## ファイヤーウォール停止
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
## システム再起動
$ sudo reboot

## 参考サイト
https://centossrv.com/centos7-init.shtml
クラス名 > プリフィックス > C / T / つけない



delphi
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro03.htm
> 
Delphi では，コンポーネント (コントロール) 等のクラス名に，プリフィックス (プレフィックス) として大文字の T を付けるのが慣習になっています．

.NET Framework 4
https://msdn.microsoft.com/ja-jp/library/ms229040(v=vs.100).aspx
> クラス名には、プリフィックス (C など) を<font color=red>使用しないでください</font>。

Google C++ Style Guide
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules
ELBの暖機運転申請

個人メモ

AWSポートにELBの暖機運転申請を頼んだ時のメモ
AWSサポートから、技術サポート=>ELB=>ELBに関してを選択

ELBのエンドポイント、リージョン、連絡に使用するメールアドレス等を入力
フリーの記述欄に下記フォーマットに従って申請理由を入力した

```
・ELB名：*********************.elb.amazonaws.com
・リージョン：東京リージョン
・予測されるリクエスト数 （リクエスト/秒）：XXX/秒（MAX:XXX)
・予想されるピーク時のスループット (bit/秒)：XXX
・Pre-warmingが必要となる期間（日本時間）：X月XX日午前0時〜X月XX日午後23時59分
・HTTPSの利用有無、利用する場合にはHTTPとHTTPSの割合（有／無、％）：HTTPS:XX％/HTTP:XX%
・利用するAZ（アベイラビリティ・ゾーン）の数： XX
・バックエンドインスタンスでの Keep-alive の設定可否：無し/あり
・バックエンド EC2 インスタンスの台数：平常時:XX台⇒スケール:XX台予想（アクセス次第で更にスケール）
・ユースケース：*******************でユーザーの一斉アクセスが見込まれるため

```

なお、平均スループットは下記の様にして計算し、伝える模様。AWSサポートさんは親切に教えてくれる。
下記計算に従って上記申請のスループットを出す。
（下記、1ページあたりのリクエスト平均データサイズを申請すれば良さそう）


例： 1ページが20KBのHTML、30KBのCSS、10枚の15KBの画像で構成されるケースとして
このとき、1リクエストあたりの平均レスポンスサイズは、およそ16.66KB(=200KB/12リクエスト)。
また、このケースでの平均的なHTTPリクエスト文字列長を1KBと仮定する。

これらより、1リクエストあたりの平均リクエストサイズ+レスポンスサイズは、16.7 + 1 = 17.7[KB/req]と推定される。


暖気申請⇒申請完了
まで数時間だったので2日前に申請すれば全く問題なさそう


###注意
###送られてきたメールじゃなくて、サポートのフォーラムから投稿する！！
【Rails4】form_forは単数形のパスを生成してくれないらしい

2019年10月17日 追記
`Rails6` 以降には `form_for`, `form_tag` を廃止にする宣言があるみたいです

https://github.com/rails/rails/issues/25197

>Note: For 5.x, form_for and form_tag should just be soft deprecations, no warnings. Then we can deprecate with a warning, perhaps, in Rails 6.x.

# 環境
 OS X 10.11.4
 ruby -v 2.3.0
 rails -v  4.2.5

#ハマったこと
```lang:hoge/view/new.html.erb
<%= form_for @hoge do |f| %>
  # 省略
<% end %>
```
上のようにform_forメソッドを利用しようとしたとき、オブジェクトを渡せばパスを指定してなくてもRailsが上手に繋げてくれるはずと思っていたのですが、

```
NoMethodError undefined method `hoges_path'
```
エラーになってしまう。
解決策を書いてくれている記事は結構あって感謝でしたが、原因がわからないと気持ち悪いなーと思ったので調べてみました。

#原因
form_forが自動的に生成してくれるパスが複数形のみだった。

```
$ rake routes
  # 本来のroutes
  hoge_index POST   /hoge(.:format)     hoge#create

  # form_forが欲しかったroutes
  hoges_index POST   /hoge(.:format)    hoge#create
  #   ↑複数形
```

RubyonRailsガイドにも載ってました。
>ある長年の未解決バグ が原因で、form_forでは単数形リソースを自動的に扱えません。これを解決するには、以下のようにフォームのurlを直接指定します。
[Rails のルーティング](http://railsguides.jp/routing.html#%E5%8D%98%E6%95%B0%E5%BD%A2%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9)


# 解決策
以下のようにurl:を指定してあげるだけ、

```lang:hoge/view/new.html.erb
<%= form_for @hoge, url: hoge_index_path do |f| %>
  # 省略
<% end %>
```
好みだと思いますが、これでも動きます。

```
<%= form_for @hoge,　:url => { :controller => :hoge, :action => :create } %>
  # 省略
<% end %>
```


#参考
[【Rails】formヘルパーを徹底的に理解する](http://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)
MacからRedshiftにpsqlで接続する


## PostgreSQLをインストール

```
$ brew install postgresql
$ postgres --version
postgres (PostgreSQL) 9.4.4
```

## psqlで接続

```
$ psql "host=[host] user=[user] dbname=[dbname] port=[port]"
Password:
```

パスワードを聞かれるのが面倒な方は以下のワンライナーで。

```
$ PGPASSWORD=[password] psql -h [Endpoint] -U [username] -d [dbname] -p [port]
```

接続してしまえば、自由にSQLを叩くことが出来ます。

## psqlのコマンド

psqlコマンドが用意されています。

### コマンド一覧を見る
基本的に困れば、これで確認できます。

```
dbname=> \?
```

### psqlの接続解除

```
dbname=> \q
```

### DB一覧を確認

```
dbname=> \l
```

### テーブル一覧を確認

```
dbname=> \d
```

### カラムの確認

```
dbname=> \d [table]
```
tableの指定方法はschema.name

## 参考
* [psql ツールを使用してクラスターに接続する - Amazon Redshift](http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/connecting-from-psql.html) 
* [Redshiftにpsqlのワンライナーで接続したい - Qiita](http://qiita.com/yoshidashingo/items/706334fb15eb947de895)
npm installの無駄な待ち時間を圧倒的にカイゼンする方法

npm installの待ち時間長いですよね。
ところで、時間といえば相対性理論、そう、アインシュタインです。
アインシュタインはかつて、こう語りました。

> 可愛い女の子と一時間一緒にいると、一分しか経っていないように思える。
> 熱いストーブの上に一分座らせられたら、どんな一時間よりも長いはずだ。
> 相対性とはそれである。
> アインシュタイン

つまり、**npm install**時に**ポプテピピック**の4コマが続々と表示されれば体感時間は**圧倒的**に**短く**なり**最高**ってことですよね？
こんな風に。

![npm2.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/c362d1d4-d16a-7101-e3ff-73d2e539d1c5.gif)


**便利！！！**

[github: akameco/npm-popute](https://github.com/akameco/npm-popute)

## インストール
```
$ npm i -g npm-popute
```

`npm-popute`というCLIコマンドを提供します。
npmコマンドと同様に使うことでき、`install`または`i`のときだけプログレスバーの代わりのポプテピピックの漫画を表示します。

```
$ npm-popute install --save react react-dom
```

また、npm install以外のコマンドはすべて標準のnpmのコマンドとして動作するので、aliasすると便利?です。

```.zshrc
alias npn='npm-popute'
```

## 実装
やっていることは単純で、`npm`コマンドを`child_process.spawn`でフックし、コマンドラインオプションが`i`または`install`のときにポプテピピックの画像を表示するようにしています。

iTerm2の最新版より画像の表示がサポートされるようになったのでそれを利用しています。
残念ながらiTerm2以外のターミナルを使ってる人は使えません。
画像を表示するnode.js製コマンドラインツールについては以下の記事にまとめているので参照してください。
[iTerm2の新機能を使ってターミナルにポプテピピックの4コマをランダムに表示する - Qiita](http://qiita.com/akameco/items/13a62b7b8f8efd542d98)

## まとめ
`gifi`にインスパイアされてカッとなって書いたけど、どう見ても著作権的にアウトっぽいので、おそらく今流行りの`npm unpublish`することになると思います。

<img width="320" alt="指定暴力団npm.png" src="https://qiita-image-store.s3.amazonaws.com/0/15319/9f346509-b207-f57e-d731-f759efa7957d.png">


コードはgithubにあるのでプルリクやissue等よろしくお願いします。
[github: akameco/npm-popute](https://github.com/akameco/npm-popute)

## 参考

[iTerm2の新機能を使ってターミナルにポプテピピックの4コマをランダムに表示する - Qiita](http://qiita.com/akameco/items/13a62b7b8f8efd542d98)
[vdemedes/gifi: watch GIFs while running npm install](https://github.com/vdemedes/gifi)
ng-japan 2016 セッション資料まとめ

2016年3月21日、[ng-japan 2016](http://ngjapan.org/)に参加しました。とても有用な情報が獲得できたのですが、資料などのURLが散らばってたのでまとめました。


# 全体のTogetter
 - http://togetter.com/li/952725

# ng-japan 2016 - C+D Room (主にAngular2関連のセッション)
- Yotube https://www.youtube.com/watch?v=4QVMhM75XK8

## Angular 2の失敗しない始め方 / 稲富 駿
- 資料 - http://laco0416.github.io/slides/a-way-for-happy-angular-days/#/
- Togetter - http://togetter.com/li/953341

## Angular2実践入門 / 白石 俊平
- 資料 - http://www.slideshare.net/shumpei/angular2-59809652
- Togetter - http://togetter.com/li/953323

## Microsoft Openness TypeScriptとAngular,そしてVisual Studio Code / 井上 章
- 資料 - 見つかりませんでした。
- Togetter - http://togetter.com/li/953338


## クリエイティブの視点から探るAngular 2の可能性
- 資料 - http://www.slideshare.net/clockmaker_jp/angular-2-59811274
- Togetter - http://togetter.com/li/953319

## ngUpgradeと移植戦略 / 奥野 賢太郎
- 資料 - https://speakerdeck.com/armorik83/ngupgradetoyi-zhi-zhan-lue
- Togetter - http://togetter.com/li/953348

## Angular1.4で作られた自社マイクロサービスを2へマイグレーション / 林 優一
- 資料 - http://www.slideshare.net/frontainer/angular142
- Togetter - http://togetter.com/li/953335


# ng-japan 2016 - A Room
- Youtube - https://www.youtube.com/watch?v=yQX1Y3MAIWQ

## Angular1.5 新機能 / 金井 健一
- 資料 - http://www.slideshare.net/canidoweb/new-features-in-angular-15

## Progressive Mobile Web Apps / 浅井 智也	
- 資料 - http://www.slideshare.net/dynamis/progressive-mobile-web-apps

## Angular2を書くためのAngularJSの書き方 / 吉田 徹生
- 資料 - https://speakerdeck.com/teyosh/angular2woshu-kutamefalseangularjsfalseshu-kifang

## エンタープライズAngularの取り組み / 林 裕一郎
- 資料 - 見つかりませんでした。

## RxJS概要とリアクティブ アーキテクチャ / 高岡 大介	
- 資料 - https://speakerdeck.com/dsuket/rxjsgai-yao-toriakuteihu-akitekutiya

## Angular1.5 Component & ngComponentRouter / 佐川 夫美雄	
- 資料 - 見つかりませんでした。
Amazon Linux 2015.09 に capybara-webkit gem をインストールしてRubyでブラウジングする


## Installing gems

### capybara-webkit gem

gem入れるまでがツラい。→ [AmazonLinux 2015.09 に Qt5 WebKit をインストール](http://qiita.com/takeyuweb/items/fd9fc0a273923b13b2cd)

```sh
sudo ln -s /usr/lib64/qt5/bin/qmake /usr/bin/qmake 
sudo gem install capybara-webkit --no-ri --no-rdoc
```

```
Building native extensions.  This could take a while...
Successfully installed capybara-webkit-1.8.0
1 gem installed
```

### headless gem

```sh
sudo yum install xorg-x11-server-Xvfb
sudo gem install headless --no-ri --no-rdoc
```

```
Fetching: headless-2.2.3.gem (100%)
Successfully installed headless-2.2.3
1 gem installed
```

## RubyでHTMLやスクリーンショットを取得

```ruby
require 'capybara-webkit'
require 'headless'

Capybara::Webkit.configure do |config|
  config.block_unknown_urls
  config.allow_url('*')
end

client = Capybara::Session.new(:webkit)
headless = Headless.new
headless.start
begin
  client.visit('http://www.google.com/')
  p client.status_code # => 200
  p client.html        # => "<!DOCTYPE html><html itemscope=\"\" itemtype=\"http://schema.org/WebPage\" ...
  client.save_screenshot('screenshot.png')
ensure
  headless.destroy
end
```

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/7000/dac9b214-d62b-7770-1c3a-92ad9647e429.png)
日時の整形比較【PHP/MySQL】

日時を整形するとき、PHPとMySQLで微妙に違ってこんがらがるのでメモ。
PHPなら`date`、MySQLなら`DATE_FORMAT`と組み合わせて使う

| |PHP|MySQL|
|--:|:-:|:-:|
|年(4桁)|Y|%Y|
|年(2桁)|y|%y|
|月(0あり)|m|%m|
|月(0なし)|n|%c|
|日(0あり)|d|%d|
|日(0なし)|j|%e|
|曜日(Sunday)|l[^l]|%W|
|曜日(Sun)|D|%a|
|曜日(数字)|w|%w|
|時(24H/0あり)|H|%H|
|時(24H/0なし)|G|%k|
|時(12H/0あり)|h|%h or %I[^i]|
|時(12H/0なし)|g|%l[^l]|
|分|i|%i|
|秒|s|%s|
|am/pm|a|-|
|AM/PM|A|%p|

[^i]: 大文字アイ
[^l]: 小文字エル
vimのファイル文字コード変更と開き直す方法

この辺が全然覚えられないのでまとめ

# 現在の設定を確認
・vimの文字コードを確認
`:set enc?`
・ファイルの文字コードを確認
`:set fenc?`

# ファイルの文字コード変更
```
:set fileencoding=文字コード
:set fenc=文字コード (上のコマンドの短縮形。)
:set fenc=euc-jp (指定エンコーディングに変更。)
```

# ファイルフォーマット（改行コード）変更
```
:set fileformat=ファイルフォーマットの種類
:set ff=ファイルフォーマットの種類 (上のコマンドの短縮形。)
:set ff=dos OR mac OR unix (改行を指定形式に変更。)
```

# ファイルの文字コード読みなおし
```
:e ++enc=指定したいエンコーディング
:e ++enc=euc-jp (指定エンコーディングで開き直す。)
```

# ファイルフォーマット（改行コード）読みなおし
```
:e ++ff=指定したいファイルのフォーマット
:e ++ff=dos OR mac OR unix (指定形式で開き直す。)
```

# 参考というかほぼ引用
- http://advweb.seesaa.net/article/3074705.html
音声認識比較：東芝のRECAIUSとGoogleのWeb Speechを同じ朗読を再生してみた

# 音声認識の比較
最近各社が音声認識のためのAPIを積極的に開示している。その中でも日経産業新聞に東芝がRECAIUSという新しい音声認識APIを開発者に提供していると聞き、早速試してみた。

## 東芝の新しいRECAIUSという音声認識
https://www.toshiba.co.jp/cl/pro/recaius/feature.html
Docomo Developerのやつと似た感じのラインナップではあるが、同時通訳などさらに上を目指しているような印象を受ける。使用するには開発者登録をする。まずメールだけ登録すると、翌営業日にキーが送られてくる。開発者登録の中でも驚くほどシンプル。

## Google Web Speech API
ちょっと使ってみたことのあるAPIで、非常に高精度。
https://www.google.com/intl/ja/chrome/demos/speech.html

## 朗読ファイルを再生して音声認識を比較
読み上げた文章は以下のとおり

https://www.youtube.com/watch?v=21sz_jpskZI&feature=youtu.be
> 案の定、市場の混雑を抜けだす前にトムは彼を見失ってしまった。これからどうすべきかわからなかったので、トムはとりあえず、市場広場から上の路地へと階段が通じている一角で待つことにした。背後の薄暗い路地は静まり返っていて、前方の市場の活気とは奇妙に対照的だった。

## RECAIUSでの認識
> 案の定、上の混雑を抜けだす前にお別れを見失ってしまった。
これからどうすべきか分からなかったのでともとりあえず以上広場から上の路地へと階段が続いてる一角で待つことにした。
介護の薄暗い図書室まで書いていて、前方の一場の活気とは奇妙に対照的だった。

## Google Web Speechでの認識
> あの上支障の混雑を抜け出す前にとも別れを三勇士なってしまったこれからどうすべきかわからなかったので ともはとりあえず地上広場から上野 ロジエと階段が続いている 一鶴で待つことにした 英語のうすぐらいの事は集まり返っていて 前方の市場の楽器とは 奇妙に対照的だった

## 感想
どちらも、一般的な会話文の認知の精度にはほとんど差はないくらいの高性能だと言える。例えば一般的な英語のテキストを読み上げてみたところ、文節の区切りなどに違いがあるにしても、99％正確に認識して文字を起こせる。
> 私はビールを飲むのがコーヒーやお茶よりも好きです。
> お母さんはいつも働いています。私はお母さんにお礼を言います。
このような文章は、その他Docomoの音声認識やYahooのでもほぼ完璧だ。

しかし小説の一部のような朗読の場合、文章表現の幅が大きいためか認知度は極端に下がる。今回試した小説の範囲ではRECAIUSのほうが精度は良かったように思う。
git flowとgithub flowとは？その違いは？

##git flowとgithub flowとは？その違いは？
ふたつとも、Gitにおけるリポジトリのモデルのこと。
こんなふうにブランチを切って運用していくと便利だよというワークフローのこと。

github flowはgit flowを簡略化したもの。

##git flowとは？
![git-model@2x.png](https://qiita-image-store.s3.amazonaws.com/0/82030/57bcbffe-903f-f66c-8a2a-3f021a2411a3.png)

http://nvie.com/posts/a-successful-git-branching-model/ より

 - masterブランチ、developブランチがメイン
 - featureブランチ、releaseブランチ、hotfixブランチが補助
 - masterブランチは常にリリースできる状態
 - developブランチから、featureブランチ/releaseブランチ/hotfixブランチを切って開発を進める
 
 - featureブランチは機能追加用(通常の開発用)
 - releaseブランチはリリース直前用
 - hotfixブランチはリリース後の緊急対応用

##git flowでの開発の流れ
①developブランチからfeatureブランチを切って、開発
(②他の人が開発したら自分のfeatureブランチにマージ)
③開発が終わったらfeatureブランチをdevelopにマージして、featureブランチを削除
④developブランチをremoteにpush	
①～④を繰り返して開発を進める

⑤開発が終了したらdevelopブランチからreleaseブランチを切ってリリース準備
⑥releaseブランチの編集完了後、developブランチとmasterブランチにマージして、releaseブランチを削除
⑦リリース(masterブランチのデプロイ)
⑧リリース後、バグが発生した場合にはmasterブランチからhotfixブランチを切って対応
⑨バグ対応が完了したらmasterブランチにマージして、hotfixブランチを削除

⑤～⑨を繰り返してバージョン管理を運用する
		
作業を行うのはfeatureブランチ/releaseブランチ/hotfixブランチ上で
developブランチ/masterブランチでは作業は行わない。	


##github flowとは？

git flowを簡略化したもの。
具体的には、developブランチが省略されて、pull request機能が使われていることが、大きな違い。

##github flowでの開発の流れ

①masterブランチから説明的な名前を付けたブランチを切って、開発
②開発が終わったら、作成したブランチにローカルでcommitし、サーバー上の同名ブランチにpushする
③アドバイスやFB、コードレビューをしてもらいたい時、もしくはブランチをマージする時にpull requestを出す
④必要があればコードを修正して再度commitとpush
⑤その場のルールによるが、再度コードレビューをしてもらってOKが出たら、masterブランチにマージする


参考　https://codeiq.jp/magazine/2014/11/18748/
Ubuntu+GeForceでubuntuスプラッシュ画面でフリーズする問題

# 問題
ubuntuを起動させたときにスプラッシュ画面(下図)で止まってしまい，ログイン画面に遷移しない．
![ubuntu_splash](https://qiita-image-store.s3.amazonaws.com/0/88680/dd720170-9abf-5bcb-6599-8d27e8989544.png)

自分の環境

- ubuntu 14.04 + GeForceGTX 970M
- ubuntu 14.04 + GeForceGTX 980

で問題が起こることは確認済み．


# 対処法
1. インターネットにつなぐ
1. とりあえず再起動する(電源ボタン長押し or  "Alt" + "PrtSc" + R + S + E + I + U + B)
2. Grub画面で"e"を押して編集モードへ
3. 下から２行目ぐらいのところにある"quiet splash"を"text"に書き換えて"F10"．これでCUIで入れる．

### 対処法１
CUIでログインしてから

```bash
$ export LANG=C
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot
```

### 対処法２
CUIでログインしてから

```bash
$ export LANG=C
$ sudo apt-get purge nvidia-*
##　purgeする前に，何がpurgeされるか写メでも撮ってメモっておきましょう！！！
$ sudo reboot
```
再起動してから
システム設定→ソフトウェアとアップデート→追加のドライバー
から最新のNVIDIA-binary-driverをインストール
これでpurgeされたソフトウェアはアップデートされているはずだけど，
念のため，purge前に撮ったメモか写メを見て
インストールされてないものがあればapt-getか何かで入れなおす．

# 補足
### CUIでのインターネットの入り方
（いつもGUIでネットワーク設定してる僕のような~~へっぽこ~~ubuntuユーザのために）

`/etc/network/interfaces`を

```
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
```
にして再起動．
iTerm2の新機能を使ってターミナルにポプテピピックの4コマをランダムに表示する

iterm2が画像をサポートするようになりました。
iterm2の新機能については、以下の記事が素晴らしくまとまっています。

[iTerm2 3.0の新機能 - Qiita](http://qiita.com/ksato9700/items/49539ec2f19027829f2f)

今回はせっかくなので、node.jsでターミナルに画像を表示するコマンドラインツールを書いてみました。
`popute-img`または`ppt-img`でポプテピピックの４コマをランダムに表示します。

![img.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/ce317452-7141-b74c-a97a-402a1fc41121.gif)

ポプテピピック、どれもパンチが効いててすごい。

コードはgithubで公開しています。
[github: akameco/popute-random-img](https://github.com/akameco/popute-random-img)

## インストール
npmからインストールできます。

```
$ npm install -g popute-random-img
```

## 使い方
以下のコマンドを提供します。

```
$ popute-img
```

または

```
$ ppt-img
```

## 実装
### コマンドラインツール
node.jsによるコマンドラインツールの作り方はこちらを参照してください。
[node.jsによるコマンドラインツール - Qiita](http://qiita.com/akameco/items/585f2c53629f1e66f4f1)

### スクレイピング
httpライブラリは[got](https://github.com/sindresorhus/got)を使っています。
node.jsのhttpライブラリというと`request`がメジャーですが、個人的には軽量でPromiseベースの`got`が好みです。

```js
const got = require('got');
got('http://mangalifewin.takeshobo.co.jp/rensai/popute2/').then(res => {
	console.log(res.body);
}).catch(e => console.log(e));
```

それをjQueryライクに要素を取得できる`cheerio`でパースします。

```
got(url).then(res => {
	const $ = cheerio.load(res.body);
	return $('.bookR a').map((i, el) => {
		return $(el).attr('href');
	}).get();
}).catch(err => {
	console.log(err);
});
```

### iTerm2に画像を表示
`term-img`を使いました。
[sindresorhus/term-img: Display images in your terminal](https://github.com/sindresorhus/term-img)

画像のパスかbufferを引数に取ります。

```js
const termImg = require('term-img');
termImg('test.jpg');
```

## まとめ
今回は完全にお遊びですが、キャプチャをターミナルから確認したり、ログの可視化などに使えそうです。
テストがすべてpassしたらlgtmな画像を表示してもいいかもしれませんね。

[akameco/popute-random-img: ポプテピピックの画像をランダムで取得](https://github.com/akameco/popute-random-img)

## 参考

- [iTerm2 3.0の新機能 - Qiita](http://qiita.com/ksato9700/items/49539ec2f19027829f2f)
- [sindresorhus/got: Simplified HTTP/HTTPS requests](https://github.com/sindresorhus/got)
- [sindresorhus/term-img: Display images in your terminal](https://github.com/sindresorhus/term-img)
VPS (VULTR) を docker-machine として使い docker-compose でデプロイする

[docker-composeでnginx, fluentd, nodeサーバの構成作ってみた](http://qiita.com/macoshita/items/f598c331bbdb881141b7)のですが、これを手軽に本番環境にデプロイする手段として、VPS(VULTR) を docker-machine として使うやり方を試してみました。

## 要確認:私の環境

```
OS X El Capitan
バージョン 10.11.1
MacBook Pro (Retina, 13-inch, Late 2013)
Docker version 1.10.2, build c3959b1
docker-compose version 1.6.0, build d99cad6
docker-machine version 0.6.0, build e27fb87
```

あんまり古い docker だと動かないのでお気をつけて。

## 基本方針

ドライバを切り替えて、デプロイ先となる docker-machine をリモートで作成し、 `docker-compose up -d` でデプロイできるようにする。

## [VULTR](https://www.vultr.com/) の場合

[VULTR](https://www.vultr.com/) は海外の VPS サービスです。 [DigitalOcean](https://www.digitalocean.com/) などの競合ですね。
docker-machine をインストールすると DigitalOcean のドライバがデフォルトでついてくるのですが、DigitalOcean には東京リージョンがないんですよね……。
VULTR には東京リージョンがあり、2016/03/24 時点では $5/mo SSD プランが DigitalOcean よりメモリ多めだったので、今回はこちらを使うことにしました。

### VULTR に登録して API キーの取得

なかなか管理画面がイケてるので、迷うこともないような気もしますが、Account -> API から取得できます。

![スクリーンショット 2016-03-24 23.05.52.png](https://qiita-image-store.s3.amazonaws.com/0/17722/de4e831d-30a1-69fa-44cb-c030d95aaba1.png)

スクショには写ってないですが、スクロールすると IP の制御についても記載があり、デフォルトで API を有効にした IP からでないと拒否するようになっています。スタバったりする人は注意を。

### VULTR のプラグインをインストール

[GitHub のリリースページ](https://github.com/janeczku/docker-machine-vultr/releases) から拾ってきて、 docker-machine と同じディレクトリに入れるか、パスを通します。mac なら多分 /usr/local/bin にあるかと。

### docker-machine create

下記のコマンドで docker-machine を作成します。
このうち、 vultr-region-id と vultr-plan-id はお好きなものを選んでください。
25 は東京、29 は $5/mo SSD プランです。それぞれの ID は http://vultr-status.appspot.com/ より調べることができます。

```
$ docker-machine create \
    --driver vultr \
    --vultr-api-key={あなたのAPIキー} \
    --vultr-region-id 25 --vultr-plan-id 29 \
    MyVultrMachine
```

## docker-compose を使ってデプロイ

ここまでいけたら、あとは下記のコマンドで終了です。

```
$ eval $(docker-machine env MyVultrMachine)
$ docker-compose build
$ docker-compose up -d
```

先ほど作成した MyVultrMachine の情報を DOCKER_HOST などにセットし、 docker-compose build でビルドして、 up -d でデプロイ。

先の私の記事の docker-compose.yml は nginx, node, fluentd の3つのコンテナを立ち上げるもので、8080 ポートにアクセスすると helloworld を返すようになっているので、下記を叩くと helloworld が表示されます。

```
$ curl $(docker-machine ip MyVultrMachine):8080
```

### 本番とローカルで docker-compose.yml を変えたいんだけど

ポート番号を変えたいといったちょっとした変更なら、docker-compose.yml では `${VARIABLE}` で環境変数をよめるので、対応できそうです。
また、docker-compose には `--file` オプションがあり、好きな docker-compose を指定できるので、ローカルでしか立ち上げないコンテナなどがある場合はこれで切り替える形になるでしょうか。
このあたりは今後調整していくところです。

## まとめと補足

最初の目論見どおり、簡単に VPS にデプロイすることができました。

今回は複数コンテナをデプロイするために compose を使いましたが、1 つのコンテナなら別に使う必要はなくて、"VULTR の場合"までを参考にしてもらって docker コマンド叩けばよいかと。

なお、docker-compose を production で利用することについては、まだ時期尚早。下記ページの最初の数行を訳すと、「まだ開発とかテストに使うのが主目的だよ。あと小さいデプロイならいいけど、大規模なのには多分向かないと思うよ」的なことが書かれています。
<https://docs.docker.com/compose/production/>

でも Amazon ECS の CLI が docker-compose.yml でのデプロイをサポートしてるので、会社の production で使うならそっちでやる手もありそうです（未検証です）。

何にしても、昔の「色々ハマって docker 使わないほうがむしろ楽」という状況が、「ちょっとハマるところはあるけど使うと色々楽になる」という状況まで変わってきてると感じました。てか楽しい。
Mac同士をLAN接続して通信する


2台を直結させるので、設営の現場なんかでルーターを減らせるというメリットありますね。

手順
======================

1. LANケーブルで2台を接続（最近のはストレートでも大丈夫
1. それぞれ固定IPにする


システム設定＞ネットワーク を開く
インターフェイスを選んで、ネットワーク上で一意なIPに手動で設定する。

__1台目の設定__


![ip1.png](https://qiita-image-store.s3.amazonaws.com/0/20773/7d3b7450-3242-4087-4928-00cfcc82fd08.png "ip1.png")

__2台目の設定__

![ip2.png](https://qiita-image-store.s3.amazonaws.com/0/20773/aeffc919-34b8-8251-9f04-394348c4acd6.png "ip2.png")


疎通を確認する
======================

arp コマンドとか、ping を通してみる

```
$ arp -a
? (10.0.0.1) at **:**:**:**:**:** on en5 ifscope [ethernet]
? (10.0.255.255) at ff:ff:ff:ff:ff:ff on en5 ifscope [ethernet]
```

UDPもとばしてみる

受信

```
nc -lu 8000
```

送信

```
date | nc -u 10.0.0.1 8000
```
office365 > pop before SMTPではまる > サーバー設定間違い

関連 [mail > pop before smtp > 受信を行ってから送信する? > 30分間の送信許可](http://qiita.com/7of9/items/769267225059af47f6c5)


自動メール送信ソフトにてメール送信が時々失敗していた問題の原因がわかった。

pop before SMTP のサーバを間違っていた。

- 誤: `outlook.office.com`
- 正: `outlook.office365.com`

ポートなど他の設定は同じ。

office365に変更後、pop before SMTPに失敗することがなくなった。

よくわからないのは、以下であるが、とりあえず解決したのでよしとする。

- office.comの方で150回のうち80回程度は成功していたこと
- なぜこのアドレスを使うようになったか (どの情報源を参考にしたか)