OmniAICreator/Qiita-1.07M huggingface dataset:
【Hyper-V】 仮想スイッチ(NAPT)な内側にいるゲスト OS のサービスを公開する

[ブログからの転載](http://1bed.allright.life/?p=2162)

Hyper-V で組んだ NAPT の内側にいるゲスト OS を、ホスト OS 経由で他の端末からアクセスするためには、ルーティングテーブルにポートフォワードの情報を登録する。

## ポートフォワードを設定する

次のコマンドを流します

```ps1
Add-NetNatStaticMapping [-NatName] <String> -ExternalIPAddress <String> -ExternalPort <UInt16> -InternalIPAddress <String> -Protocol <Protocol> [-InternalPort <UInt16> ]
```

ポートフォワードを設定する時には、先に下記情報を把握して下さい。

  * ゲスト OS の IP アドレスとポートフォワードするポート番号
  * ホスト OS が受け付けるポート番号

つまり、ホスト OS の何番のポートで受けて、ゲスト OS の何番のポートにフォワードするかを把握しておきます。

今回は、SharePoint をセミナーで使うことを想定して、手元の仮想環境上の SharePoint をホスト OS にアクセスできる他のマシンからもアクセスできるように追加しました

```-ExternalIPAddress``` は 0.0.0.0 (全てから受け付ける) とします。

```ps1
# NAT テーブル名を確認
PS> Get-NetNat
Name                             : VmNAPT
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 10.0.1.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True

# ホスト OS が受けた他の端末(0.0.0.0)からポート 80 へのアクセスを、ゲスト(10.0.1.10) のポート 80 をフォワードする

PS> Add-NetNatStaticMapping "VmNAPT" -ExternalIPAddress 0.0.0.0 -InternalIPAddress 10.0.1.10 -ExternalPort 80 -Protocol TCP -InternalPort 80

StaticMappingID               : 0
NatName                       : VmNAPT
Protocol                      : TCP
RemoteExternalIPAddressPrefix : 0.0.0.0/0
ExternalIPAddress             : 0.0.0.0
ExternalPort                  : 80
InternalIPAddress             : 10.0.1.10
InternalPort                  : 80
InternalRoutingDomainId       : {00000000-0000-0000-0000-000000000000}
Active                        : True
```

## ポートフォワードを確認する

```ps1
Get-NetNatStaticMapping [[-NatName] <String[]>]
```

ポートフォワードを確認する例

```ps1
PS> Get-NetNatStaticMapping

StaticMappingID               : 0
NatName                       : VmNAPT
Protocol                      : TCP
RemoteExternalIPAddressPrefix : 0.0.0.0/0
ExternalIPAddress             : 0.0.0.0
ExternalPort                  : 80
InternalIPAddress             : 10.0.1.10
InternalPort                  : 80
InternalRoutingDomainId       : {00000000-0000-0000-0000-000000000000}
Active                        : True
```

## ポートフォワードを削除する

```ps1
Remove-NetNatStaticMapping [[-NatName] <String[]>]
```

設定したポートフォワードを削除する例

```ps1
PS> Remove-NetNatStaticMapping "VmNAPT"

確認
この操作を実行しますか?
対象 VmNAPT;0;0 の PolicyStore Local に対して操作 Delete を実行しています
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
```
node-v0でassert.deepStrictEqualを使うと`undefined is not a function`になるので

> [assert-polyfill - an exterminate "TypeError: undefined is not a function" you encounter in node-v0.](https://github.com/59naga/assert-polyfill#readme)

polyfillを作成しました。[mocha.opts](https://github.com/59naga/chopsticks/blob/cc9c2ce4401c5a6c8ac4092a0242cd57e261b004/test/mocha.opts#L3)に定義するか、`power-assert`の`require`前に実行することで、`deepStrictEqual`と`notDeepStrictEqual`が未定義の時だけ、アサート関数を定義します。

```js
require('assert-polyfill');
var assert = require('power-assert');

assert.deepStrictEqual(['foo'], ['foo']) // pass
assert.notDeepStrictEqual(['foo'], ['bar']) // pass
```

何の関数を定義しているのか
---
[`node-v4.1.2`の`assert.js`のソースコードを引っ張ってきて](https://github.com/sindresorhus/core-assert/blob/v0.1.3/index.js#L1)、[それを移植してるだけです](https://github.com/59naga/assert-polyfill/blob/v0.0.0/lib/index.js)。
これだけで動作するようになります。

失敗時の出力
---
v4,5系と全く同じです。
![foo.gif](https://qiita-image-store.s3.amazonaws.com/0/28576/4681a710-426f-e4c1-df74-21b07cd4a56a.gif)

動作サンプル
---
[chopsticks-v0.2.0のtravisCI上で](https://travis-ci.org/59naga/chopsticks/jobs/121480825#L486)動作を確認しています。
【Hyper-V】 一度削除した仮想スイッチを再作成時にエラーになるときの対処法

[ブログからの転載](http://1bed.allright.life/?p=1784)

一旦 New-VMSwitch で作成した仮想スイッチを Remove-VMSwitch で削除し、もう一度作ろうとしたら次のエラーが出て作れなくて困りました

```ps1
PS> New-VMSwitch "NAPT" -SwitchType NAT -NatSubnetAddress "10.0.1.0/24"
New-VMSwitch : 仮想イーサネット スイッチの接続の追加中にエラーが発生しました。
発生場所 行:1 文字:1
+ New-VMSwitch "NAPT" -SwitchType NAT -NatSubnetAddress "10.0.1.0/24"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-VMSwitch]、VirtualizationException
    + FullyQualifiedErrorId : InvalidState,Microsoft.HyperV.PowerShell.Commands.NewVMSwitch
```

これは仮想スイッチに振られていた固定 IP が残っていたためのようで、それを削除したら再作成が可能になりましたので、 [【Hyper-V】 仮想スイッチ(NAPT)を作成・削除する](http://qiita.com/miyamiya/items/c00a1dd9f15e0b5be738#%E5%89%8A%E9%99%A4) にまとめました。
【LINE BOT】 アカウント設定の仕方　〜アカウントを取ってみた！〜


BOTを作るためのアカウントの取り方を丁寧に。
アカウントの作成からキーの取得までやります。

[ここから登録します](https://business.line.me/ja/)
まずここで登録をします。

画像ベースで見ていきましょう！



![000.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/ecee9749-fc0d-42c0-c2be-5ba83b0fcb26.jpeg "000.jpg")
__URLからログインします__

__ログインするとLINEのログイン用メールアドレスとパスワードを聞かれるのでいつもPCでログインする時と同じように入力します__


![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/0530a4d5-6559-53b7-c1b5-132660b5be03.jpeg "001.jpg")

__すると本人確認コードが表示されるのでスマホのLINEを開いて認証しましょう__

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/4f25d12e-da5f-b77e-4264-9c3c016b0f62.jpeg "002.jpg")


__同意して進むを押すとメールアドレスに確認メールが飛ぶのでURLをクリックします__

![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/d015698e-42e1-3e6f-2d66-ee029b7a4f8d.jpeg "004.jpg")

__プロフィール情報を最後まで入力しましょう。__

![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/534fa9da-a244-5fc9-c268-ca6456671f13.jpeg "005.jpg")

![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a1597617-87a9-2ded-d4a5-acf170b95c29.jpeg "006.jpg")

__ビジネスアカウントを作成します__

![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/95b3872f-d035-9353-42f0-7ced2cc312ae.jpeg "007.jpg")

![008.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/4b68812b-d4f9-9342-2f5d-d76bf8973877.jpeg "008.jpg")


![009.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/69a2ef18-1c49-cf3d-aab3-94a271a62660.jpeg "009.jpg")

![010.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/11a2e855-f995-2640-b497-4b1e847c1714.jpeg "010.jpg")


![011.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/7d9de51d-bfc4-1820-cbde-43633c3221b1.jpeg "011.jpg")

###以上！！！
【Hyper-V】 仮想スイッチ(NAPT)を作成・削除する

[ブログからの転載](http://1bed.allright.life/?p=1795)

* 2016/03/18 現在、NAT(NAPT) の仮想スイッチは手動では作れないようだ
* 検証環境は Windows 10 Pro
* PowerShell は管理者で実行する(New-NetNat が管理者権限が必要なため)

## 作成

### 仮想スイッチの作成

```ps1
New-VMSwitch [-Name] <String> -SwitchType NAT -NatSubnetAddress <System.String>
```

仮想スイッチ名を「vSwich NAPT」で作成した例

```ps1
PS> New-VMSwitch "vSwich NAPT" -SwitchType NAT -NatSubnetAddress "10.0.1.0/24"

Name        SwitchType NetAdapterInterfaceDescription
----        ---------- ------------------------------
vSwich NAPT NAT
```


### NAT テーブルの作成

```ps1
New-NetNat [-Name] <String> -InternalIPInterfaceAddressPrefix <System.String>
```

NAT テーブル名を「VmNAPT」で作成した例

```ps1
PS> New-NetNat "VmNAPT" -InternalIPInterfaceAddressPrefix "10.0.1.0/24"

Name                             : VmNAPT
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 10.0.1.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True
```


### 確認

ネットワーク接続に指定した名前でインターフェースが作成されていて、
IP アドレスが振られていたら OK

<img width="500" alt="make_success.png" src="https://qiita-image-store.s3.amazonaws.com/0/118961/41a71177-0603-a07e-cbb6-be86bbddb8f1.png">

## 削除

仮想スイッチの削除は 3 ステップ
**※仮想スイッチに割り当てられた固定 IP も削除する必要がある**

綺麗に削除しないと次のエラーが出る




### Step 1. NAT テーブルの削除

```ps1
Remove-NetNat [-Name] <String>
```

NAT テーブル名「VmNAPT」を削除する例

```ps1
PS> Remove-NetNat "VmNAPT"
```

### Step 2. 仮想スイッチの削除

```ps1
Remove-VMSwitch [-Name] <String>
```

仮想スイッチ名「vSwich NAPT」を削除する例

```ps1
PS> Remove-VMSwitch "vSwich NAPT"
```

### Step 3. 固定 IP の削除

#### 割り当てを確認する

```ps1
PS> netsh interface ipv4 dump
# ----------------------------------
# IPv4 構成
# ----------------------------------
pushd interface ipv4

reset
set global
set interface interface="ローカル エリア接続* 1" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Wi-Fi" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="ローカル エリア接続* 2" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Bluetooth ネットワーク接続" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
add address name="ethernet_32771" address=10.0.1.1 mask=255.255.255.0
```

この ethernet_32771 が 10.0.1.1 を割り当てている模様

#### 割り当てを削除する

```ps1
PS> netsh interface ipv4 delete address name="ethernet_32771" address=10.0.1.1
```

## 参考

* [Windows 10 Insider Preview Hyper-V の NAPT 仮想スイッチ](http://www.vwnet.jp/Windows/w10/NAPT/NAPTvSwich.htm)
* [Cannot recreate a VMSwitch with NAT for earlier used subnet](https://social.technet.microsoft.com/Forums/windows/ja-JP/60c9ad58-78e8-47e2-b58d-d62450528f44/cannot-recreate-a-vmswitch-with-nat-for-earlier-used-subnet?forum=win10itprovirt)
AWS Lambda + API GatewayでLINE BOT APIを叩いてみた

LINE BOT API公開記念
AWS Lambdaでオウム返しBOTを作成

アカウント設定はhttps://developers.line.me から適当にやってください。

BOTを作成するとLINE_CHANNEL_ID, LINE_CHANNEL_SECRET, LINE_CHANNEL_MIDを取得できます

- まずはAWSのマネジメントコンソールに入り[Create a Lambda function]をクリック
- Node.jsのfunctionを選ぶ
- Code欄を以下のコードに変更

```
var https = require('https');

exports.handler = function(event, context) {
    console.log('Received event:', JSON.stringify(event, null, 2));
    var msg = event.result[0];
    var data = JSON.stringify({
      to: [msg.content.from.toString()],
      toChannel: 1383378250,
      eventType: "138311608800106203",
      content: msg.content
    });
    var url ='https://trialbot-api.line.me/v1/events';
    var opts = {
        host: 'trialbot-api.line.me',
        path: '/v1/events',
        headers: {
            "Content-type": "application/json; charset=UTF-8",
            "X-Line-ChannelID": "LINE_CHANNEL_ID",
            "X-Line-ChannelSecret": "LINE_CHANNEL_SECRET",
            "X-Line-Trusted-User-With-ACL": "LINE_CHANNEL_MID"
        },
        method: 'POST'
    }
    var req = https.request(opts, function(res){
        res.on('data', function(chunk){
            console.log(chunk.toString())
        }).on('error', function(e){
            console.log('ERROR: '+ e.stack);
        })
    })
    req.write(data)
    req.end();
};
```

- LINE_CHANNEL_ID, LINE_CHANNEL_SECRET, LINE_CHANNEL_MIDは適当に変更してください
- 次にAPI endpointsに移動し、[Add API endpoint]をクリック
- API Gatewayを選択し、もろもろ設定し、Methodは「POST」に設定
- 追加後API endpoint URLをコピーしLINE developersのBasic InformationのCallback URLにペースト
- 作成したBOTにメッセージを送るとLambdaのCloud watchのログに

```
{
    "statusCode": "427",
    "statusMessage": "Your ip address [xxx.xxx.xxx.xxx] is not allowed to access this API."
}
```
- とip addressが書かれるのでこれをLINE developersのServer IP Whitelistに追加
- 少し経つと設定されオウム返しBOTの完成

追記 2016/4/28
Whitelistを空にするとどこからでもアクセス可能となりました。
サーバーを指定したくない場合はWhitelistの設定を消してください。


つぎはBot Frameworkかな・・・
Config Rulesが東京リージョンにきました。

## Config Rulesがついに東京リージョンにもきました！！
https://aws.amazon.com/jp/about-aws/whats-new/2016/04/aws-config-rules-now-available-in-4-new-regions-us-west-oregon-eu-ireland-eu-frankfurt-and-asia-pacific-tokyo/

## 使い方
まずはConfigにアクセスして設定を行っていきます。
東京リージョン対応前からConfigを利用していた方はS３バケットなど設定はそのままで良いと思います。
![スクリーンショット_2016-04-07_23_25_57.png](https://qiita-image-store.s3.amazonaws.com/0/117895/91cacdd0-0d8a-6e94-eb43-a404d092ddbc.png)
![スクリーンショット_2016-04-07_23_27_00.png](https://qiita-image-store.s3.amazonaws.com/0/117895/c5c1ae4d-c5bc-4014-6daa-ae050aad497e.png)

次の画面でいよいよConfig Rulesの設定です。
今回は1番右の「eip-attached」を選択しました。
これを設定することで、EC2インスタンスに紐付けられていないEIPがあると教えてもらえます。
![スクリーンショット_2016-04-07_23_27_57.png](https://qiita-image-store.s3.amazonaws.com/0/117895/c711ff3b-2807-679b-2836-26ea6c3c3eab.png)

設定すると初めはComplianceにEvaluatingと表示されます。
![スクリーンショット_2016-04-07_23_28_45.png](https://qiita-image-store.s3.amazonaws.com/0/117895/f5677949-f519-d786-2bed-5272bb8dbd72.png)

少々待つと、こちらのようにCompliantと表示されます。これで準備完了です。
とっても簡単ですね。
![スクリーンショット_2016-04-07_23_29_20.png](https://qiita-image-store.s3.amazonaws.com/0/117895/af08bf35-5b2e-6bd8-5ea1-f58d5e7b7d92.png)

Rule nameをクリックするとこちらの詳細画面に飛びます。
下部には現在インスタンスに紐付けているEIPが書いてありますね。
当然Compliantです。
![スクリーンショット_2016-04-07_23_29_46.png](https://qiita-image-store.s3.amazonaws.com/0/117895/95b3f519-0483-bdad-37ed-2bfcd744c7f7.png)

## ルール違反してみる
では、このEIPを外してルール違反してみましょうー。
![スクリーンショット_2016-04-07_23_31_13.png](https://qiita-image-store.s3.amazonaws.com/0/117895/487d83f0-b42c-d6fb-8b30-18f4dafeaec8.png)

これでCompliantじゃなくなるはず、、
なのですがいくら待っても変わってくれません。。
![スクリーンショット_2016-04-07_23_29_20.png](https://qiita-image-store.s3.amazonaws.com/0/117895/97e85e89-1013-86d5-c9cc-a0a42b5233b5.png)

ですが、1回別のEC2インスタンスに紐付けてから外すと変わってくれました！！
![スクリーンショット 2016-04-08 0.58.49.png](https://qiita-image-store.s3.amazonaws.com/0/117895/ad70ce54-3cb0-a27f-2caf-331a216de22b.png)

詳細画面でもこの通り。
Noncompliantと表示されています。
![スクリーンショット_2016-04-08_0_59_16.png](https://qiita-image-store.s3.amazonaws.com/0/117895/d957ac87-219e-4063-8c45-022fb2341e74.png)

反応してくれなかった時は、EIPの関連付けを解除してもConfiguration.AssociationIdの値が
変化しただけでした。
![スクリーンショット_2016-04-08_1_05_41.png](https://qiita-image-store.s3.amazonaws.com/0/117895/7ce7f42a-d003-3940-ca1f-de13c2aba471.png)

逆にNoncompliantになった時はこのように、諸々の値が空になっていました。
同じように外しただけなのになぜ違うのだ。。。
![スクリーンショット_2016-04-08_1_05_57.png](https://qiita-image-store.s3.amazonaws.com/0/117895/b0b2ad3c-2e45-bef7-b705-849e809b57eb.png)

## 最後に
知識不足でよく分からないところもありましたが、カスタムルール作ったりして触りながら覚えていきたいです。
ルール違反が発生したらメール通知とかできたら良さそうですねー。
以上、お粗末様でした。
C++のためのAPIデザイン 読書メモ 第2章 その1

http://atosh.hatenablog.com/entries/2016/04/07

# 優れたAPIの特徴
結論からいうと,

* 内部実装が隠蔽されていて,
* 使い方がわかりやすく,
* 疎結合であること

## 問題が抽象化されていること
APIは解決すべき問題の抽象概念を提供すべき. ハイレベルな概念に基づいてデザインが決定されるべきであり, 内部実装の課題を開示すべきではない. 
ここでいう抽象化された問題とは, 「名前と住所を管理する」といったことであり, APIで提供されるクラスと関数はその問題を解くためにあるということが表現されているべきであるということ. Personオブジェクトのリストで管理するなどという内部実装の内容はクライアントには知られてはならない.

## 実装の隠蔽
本書で繰り返し語られる超重要なテーマ. 実装が隠蔽されることによって, クライアントは内部実装に依存したコードを書けなくなり, 後でクライアントコードに影響を与えずにAPIの実装を変更できるようになる. クライアントにハックされないAPIを構築すること.

* .hファイルに宣言を, .cppファイルに実装を書くこと. 原則的に, ヘッダには実装を書いてはならない.
* クラスのメンバ変数はprivateにすること. publicにするとクライアントコードで予期せぬ使われ方がされ, 後の変更が不可能になる. privateにしてgetter/setterを用意し, その実装をcppファイルの中に隠すことで, 通知, 排他制御, 遅延評価, キャッシュの利用など, 後の変更が用意になる. getterのみ用意してイミュータブルオブジェクトにすることもできる. メンバ変数はprotectedにしてもいけない. クライアントがサブクラスを作成すればメンバ変数を自由に操作できてしまうからである.
* パブリックにする必要のないメンバ関数も隠蔽すべき. クラスというものは, 何をするかを定義すべきであり, どのようにするかを定義するのではない. privateメンバ関数にするのでも不十分である. 公開されたヘッダは書き換え可能だからだ. private関数は.cppファイルに移動してstatic関数に変換し, ヘッダから削除すること.
    * 特に, privateメンバ変数を非constのポインタor参照で返すメンバ関数は内部状態のリークであり, クラスの管理なしにクライアントによって変更されうるので, 絶対に避けなければいけない.
* 可能な限りPimplイディオムを採用すること. これにより, クラスの内部実装を完全に.cppファイルに隠蔽することができる.
* private関数と同様の理由により, 実装の詳細のみに必要なクラスも, すべて.cppに隠蔽すべき.

### 例: httpサーバーからファイルダウンロード

```cpp
#include <string>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>

// 悪い例. クライアントが知らなくて良いメソッドが多すぎ
class UrlDownloader {
public:
    UrlDownloader();
    bool DownloadToFile(const std::string& url, const std::string& localfile);
    bool SocketConnect(const std::string& host, int port);
    void SocketDisconnect();
    void IsSocketDisconnect() const;
    int GetSocket() const;  // 内部状態のリーク. クライアントが自由にソケットを直に操作できる
    bool SocketWrite(const char* buffer, size_t bytes);
    size_t SocketRead(char* buffer, size_t bytes);
    bool WriteBufferToFile(char* buffer, const std::string& filename);

private:
    int socket_id_;
    struct sockaddr_in serv_addr_;
    bool is_connected_;
};
```

```cpp
#include <string>
#include <memory>

// 良い例. ユーザーシナリオ上必要なメソッドだけ提供
class UrlDownloader {
public:
    UrlDownloader();
    ~UrlDownloader();
    // 書籍ではファイル名を指定しているが, 依存性の注入の観点から, std::ostreamを渡すなどとしたほうが良い
    bool DownloadToFile(const std::string& url, const std::string& localfile);

private:
    // Pimplイディオムで実装を隠蔽
    struct Impl;
    std::unique_ptr<Impl> impl_;
};
```

http://www.amazon.co.jp/C-のためのAPIデザイン-マーティン・レディ/dp/4797369159
macでのmysql-connector-pythonインストール方法

Macでpipからmysql-connector-pythonのインストールに失敗したのでメモ

```bash
$ pip search mysql
mysql-connector-python (2.0.4)         - MySQL driver written in Python
  # 検索して出てくるからインストールできると思った

$ pip install mysql-connector-python==2.0.4
Collecting mysql-connector-python==2.0.4
  Could not find a version that satisfies the requirement mysql-connector-python==2.0.4 (from versions: )
No matching distribution found for mysql-connector-python==2.0.4
  # 検索結果にいたのにMac用に用意されていなかったためかエラーに。
  # バージョン未指定でも同様
  # 導入中のPythonのバージョンに依存したものかもしれない。(自分はpython2.7.10で確認)
```

似たような詰まり方をされている方がいたので、真似っこしたらすんなり解消
（参考：[StackOverFlow - How do you install mysql-connector-python](
http://stackoverflow.com/questions/31748278/how-do-you-install-mysql-connector-python-development-version-through-pip)）

```bash 
$  git clone https://github.com/mysql/mysql-connector-python.git
$  cd mysql-connector-python
$  python ./setup.py build
$  sudo python ./setup.py install

$ python
>>> import mysql.connector as msc
>>> msc.__version__
'2.1.3'
```
Redshift のクエリーパフォーマンス分析 "very selective filter alert" の話

# この文書について

すでに運用している Redshift のクエリーパフォーマンスをチューニングしていて気づいたことをメモして、忘れても思い出せるようにする感じ :smile: 

# STL_ALERT_EVENT_LOG にアラート

全部で5000万行ぐらいのデータに対して実行したクエリーが60秒以上かかるケースがあって調査していたら

```
very selective filter....
```

といった感じのアラートが STL_ALERT_EVENT_LOG に出ていたので、調べたところ、日本語のRedshiftの解説だと意味がわからなかったのでメモする。以下ページに

クエリーパフォーマンスの向上
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/query-performance-improvement-opportunities.html

> 未ソート行または正しくソートされていない行が存在する場合、STL_ALERT_EVENT_LOG にかなり限定的なアラートイベントが記録されることがあります。詳細については、「クエリアラートの確認」を参照してください。

とあり、意味不明だが、英語のページだとここは

> If unsorted or missorted rows are present, you might see a very selective filter alert event in STL_ALERT_EVENT_LOG. For more information, see Reviewing Query Alerts.

と書いてあり、アラートの内容がこの内容そのものだと気づく。ということで、sortkeyを見なおしてチューニングするという方針を立てたという話。
ubuntu14.04でsuper keyの嫌な挙動を無効にする

super keyを押すと出てくるdashなどを無効にしたい場合,
```
sudo aptitude install compizconfig-settings-manager
```
でcompizをインストールして，CompizConfig Settings Managerを起動．Desktopのこうにある,Ubuntu Unity Pluginで，GeneralのKey to execute a commandやKey to show the HUD when tappedをDisabledにする．
また，LauncherのKey to show the Dash,Launcher and Help Overlayでsuperキーで出てくるDashや長押しで出てくるKeyboard Shortcutsが消せる！（これを消したかった！）
地理院地図のGeoJSONドラッグ&ドロップ機能がファイルを送信していないだろうことを確認してみた

地理院地図のGeoJSONドラッグ&ドロップ機能がファイルを送信していないだろうことを確認してみた。

## 地理院地図のGeoJSONドラッグ&ドロップ機能とは
https://twitter.com/gsi_cyberjapan/status/717532680418492416
![スクリーンショット 2016-04-08 0.49.02.png](https://qiita-image-store.s3.amazonaws.com/0/102082/67227732-6791-b9c1-69ed-9696e9df99b1.png)
これです。

## 地理院地図のレポジトリを見る
何はともあれ地理院地図のレポジトリを見てみる。
https://github.com/gsi-cyberjapan/gsimaps
<img width="686" alt="スクリーンショット 2016-04-08 0.41.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/2fb231cf-407b-0189-4d74-5b1f83b395ae.png">

あ「geojson読み込み措置」というコメントがついている。ここを追ってみる。
<img width="621" alt="スクリーンショット 2016-04-08 0.42.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/87331e67-83ac-34a9-2859-66d8cf3dbf4c.png">
gsimaps.js が書き換えられていることが分かる。

https://github.com/gsi-cyberjapan/gsimaps/blob/gh-pages/js/gsimaps.js#L19520-L19552
<img width="528" alt="スクリーンショット 2016-04-08 0.43.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/768fdcd1-92cd-199f-d532-e56bc496f78b.png">
gsimaps.js で drop をテキスト検索してみたところ。ここでファイルを読み込んでいることが分かる。本当はもう少しコードを追ってみないといけないだろうけど、コードの構造からして、ドロップされたファイルのテキストを取り出して読み込んでいる感じになっていることが伝わると思う。

つまり、ドロップされたファイルはブラウザ内で読み込まれて処理され、表示される。**サーバには送信されない。**
LD_PRELOADで動的ライブラリへの依存を追加できるかの検証

# TL;DR
[LD_PRELOADでprintfを後から差し替える - Qiita](http://qiita.com/koara-local/items/d5205f94decade3ffbf1)

上記の記事で LD_PRELOAD で先行ロードしたライブラリに新しい依存があったときに、ちゃんとリンクしてくれるのか疑問に思ったので検証した。
結論、新しい依存性も解決してくれることが確認できた。

# 検証

以下に検証をまとめる。[printfの差し替えしたときの実装](http://qiita.com/koara-local/items/d5205f94decade3ffbf1)に `liblua.so` への依存を追加した。

```c:print.c
#include <stdio.h>

int main(int argc, char const* argv[])
{
    printf("printf no args\n");
    printf("printf %d\n", 1);

    fprintf(stdout, "fprintf no args\n");
    fprintf(stdout, "fprintf %d\n", 1);

    return 0;
}
```
```c:override.c(luaの依存を追加)
#include <stdio.h>
#include <stdarg.h>
#include <string.h>

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {
	const char *c = "override fwrite\n";
	write(1, c, strlen(c)); // stdout
	return 0;
}

int fprintf (FILE *__restrict __stream, const char *__restrict __format, ...) {
	const char *c = "override fprintf\n";
	write(1, c, strlen(c)); // stdout
	return 0;
}

int puts(const char *s) {
	const char *c = "override puts\n";
	write(1, c, strlen(c)); // stdout

	return 0;
}

int printf (const char *__restrict __format, ...) {
	const char *c = "override printf\n";
	write(1, c, strlen(c)); // stdout
	
	{
		const char *fn = "hello.lua";
		// Lua の言語エンジンを初期化
		lua_State *lua = luaL_newstate();
	
		// Lua のライブラリを使えるようにする
		luaL_openlibs(lua);
	
		// Lua のスクリプトを読み込む
		luaL_dofile(lua, fn);
	}

	return 0;
}
```

```lua:hello.lua 
print("hello lua")
```

ビルドと実行結果は以下のようになる。

```bash:ビルドと実行結果
$ gcc print.c 
$ ./a.out 
printf no args
printf 1
fprintf no args
fprintf 1

$ gcc -shared -fPIC override.c -llua5.1 -o liboverride.so
$ LD_PRELOAD=./liboverride.so ./a.out
override puts
override printf
hello lua
override fwrite
override fprintf
```

LD_PRELOADで追加したライブラリの依存性も問題なく解決されていることがわかる。

```bash:ライブラリの依存性の確認
$ ldd ./a.out
        linux-vdso.so.1 =>  (0x00007ffea74ca000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8569757000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8569b3a000)

$ LD_PRELOAD=./liboverride.so ldd ./a.out
        linux-vdso.so.1 =>  (0x00007ffd939fb000)
        ./liboverride.so (0x00007f9c7c35c000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9c7bf7b000)
        liblua5.1.so.0 => /usr/lib/x86_64-linux-gnu/liblua5.1.so.0 (0x00007f9c7bd4d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9c7c560000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9c7ba47000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9c7b843000)
```
#参考
[第 5 回: Lua を組み込み用の言語として利用する方法 (関数編) — WTOPIA v1.0 documentation](http://www.ie.u-ryukyu.ac.jp/~e085739/lua.hajime.5.html)
Tableau ハンズオン　NEXT STEP


・用語の説明
・Excelの取り込み（データインタプリタ）
・ピボットの使い方
・関数（日付関数）

・年月（日付）のDATETRUNCとDATEPARSEの違い
　月だけ見るのか、年月で見るのか。

・Webでリソースを探す方法
　例）棒グラフの合計を出すには？（リファレンスラインで平均出して書式設定して・・・・）



##活用と共有

###データのコピー　
1. ワークシート＞　コピー　＞　データ（縦持ちで出る）

1. ワークシート　＞　コピー　＞　クロス集計

###エクスポート
 
　Vizのデータの表示　＞　参照元　でサマリーしているところだけの元データが見られる。

###保存
####ブック
1. twb　
 　データの定義だけ保存

1. twbx
　データの中身も一緒に保存される。

####データソース
データペインから保存されたデータソースへ追加
計算式やグループなどの定義をそのまま共有する。

1. tds
　データの定義だけ保存

1. tdsx 
　データごと保存


###メジャーバリューとメジャーネーム
縦軸を複数の軸で共有する場合
　％などKPIなどはわかりやすくなる。

共通の軸を使う場合、メジャーバリュー

　クロス集計の表を作るサンプル
　フィールドに複数のメジャーを置くと　メジャーバリューに置き換えてくれる。


* 仕様
メジャーを行／列に置くと棒グラフ
　フィールドに置くとテキストになる。


###アクションフィルター
ダッシュボードの作り方：マクロからミクロへ絞り込んでいく

フィルタとして使用で適応できる。
年月のデータ等、カテゴリだけで絞りたい場合はアクションからフィルタルールを変えられる。

###データブレンディング
データ＞リレーションの設定
プライマリ→セカンダリ　
目標と実績（予実）を見るならブレッドグラフ
  リファレンスラインフィールドのスワップ(右クリックで軸変更出来る)

ブレンドしたデータをまたいで計算式を作ることも可能
　計算式を作るとプライマリのデータに入る。

達成判定
```（SUM([売上]>SUM([目標]))）
```
で判定値が作れる。
モバイルサイトでセレクトボックスを作る際はoptgroup要素を使わないほうがいいかもしれない

## 枕
今日は**モバイルサイトでセレクトボックスを作る際はoptgroup要素を使わないほうがいいかもしれない**と思った話を書きます。
主観も混じっていますのであしからず。
## 本題
さて、本題に入ります。formでセレクトボックスを作るときには、下記のようにselect要素内のoption要素をoptgroup要素によってグルーピングすることがあります。

``` html
<select name="pref">
  <optgroup label="tohoku">
   <option value="1" > 北海道 </option>
   <option value="2" > 青森県 </option>
   <option value="3" > 岩手県 </option>
   <option value="4" > 宮城県 </option>
   <option value="5" > 秋田県 </option>
   <option value="6" > 山形県 </option>
   <option value="7" > 福島県 </option>
  </optgroup>
  <optgroup label="kanto">
    <option value="8" > 茨城県 </option>
    <option value="9" > 栃木県 </option>
    <option value="10" > 群馬県 </option>
    <option value="11" > 埼玉県 </option>
    <option value="12" > 千葉県 </option>
    <option value="13" selected> 東京都</option>
    <option value="14" > 神奈川県 </option>
    <option value="15" > 山梨県 </option>
  </optgroup>
</select>

```
この書き方は普通のwebサイトなら全く問題なく、むしろ親切とも言えるのですけど、**iPhoneのSafariですとselectをタップした際の挙動がおかしくなります**。
具体的には**タップするたびにselected属性の指定がずれて**いきます。
上のコードですと、タップするたびに「東京→千葉→埼玉...」と勝手に北上していき、北海道まで行って初めて普通に操作できるようになります。ロシアまで行かなくてよかったね！
これはSafariというかwebkit系のバグのようですね...。 https://bugs.webkit.org/show_bug.cgi?id=137261　
### ドラムロール問題
さらに、optgroupを使うことはこれとは別の問題をも引き起こします。
画像をご覧ください。
ドラムロールが左にずれるんです。
これは所謂UI/UXの観点からはあまり好ましくないと思います。
![IMG_0715.PNG](https://qiita-image-store.s3.amazonaws.com/0/119598/381f395f-c06e-6098-2c05-7c36b7695b2c.png)

optgroup要素を取り除くと、
![IMG_3744.png](https://qiita-image-store.s3.amazonaws.com/0/119598/39f69883-19f5-16ca-5772-1c4175b54d39.png)
optionでくくった中身が真ん中に来るので、さっきよりタップしやすくなりました。
### まとめ
というわけで、モバイルサイトやレスポンシブサイト、iOSアプリにセレクトボックスを作る時にはoptgroup要素は使わないほうがいいかもしれないと思った次第です。
以上。
giboなるものが流行っているらしいのでVimでやる

この記事ではUbuntu15.10を使っていますが、基本的にはVimがあればOSなどを問わず再現できます。

## giboについて

`.gitignore`を自動的に生成することができるコマンドラインツール[gibo](https://github.com/simonwhitaker/gibo)が流行っているらしいので試してみました。例えば、Javaのプロジェクトを開発しているときは、以下のようにして`.gitignore`を生成します。

```sh
gibo Java > .gitignore
```

生成される.gitignoreは以下のようになります。

```
### https://raw.github.com/github/gitignore/cc542de017c606138a87ee4880e5f06b3a306def/Java.gitignore

*.class

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
```

また、`gibo-completion.bash`, `gibo-completion.zsh`, `gibo-completion.fish`のうち、適当なスクリプトを読み込むことによって、簡単にタブ補完を行うことができるようになります。

この記事より詳しいものが他にあるので、興味のある人はご覧になってください。

+ [気づいたら.gitignoreはgiboで自動生成する時代になっていた](http://qiita.com/tmknom/items/c4bcebe17d25381fa45d)

この記事の本題は[gibo](https://github.com/simonwhitaker/gibo)ではありません。

## gitignore.vim

とても便利な[gibo](https://github.com/simonwhitaker/gibo)ですが、Vimで同じことができたら（Vimmerにとっては）もっと便利なのではないかと思い、[gitignore.vim](https://github.com/iwataka/gitignore.vim)というプラグインを作成しました。

インストールする場合は、自分の好きなプラグインマネージャを使ってください。
私は[vim-plug](https://github.com/junegunn/vim-plug)派なので、以下のものを`.vimrc`に追加するとインストールすることができます。

```vim
Plug 'iwataka/gitignore.vim'
```

そして、インストールすると、以下のようなコマンドが使えるようになります。

```vim
:Gitignore " 引数のリストを表示する
:Gitignore Java " もともとある.gitignoreに対して、Javaプロジェクト用のパターンを追加する
:Gitignore! Java " もともとある.gitignoreを削除して、新しくJava用の.gitignoreを生成する
:GitignoreUpdate " テンプレートコレクションを更新する
```

`.gitignore`ファイルの場所を指定しなくとも、カレントバッファから辿ってプロジェクトルートを探し、そこに`.gitignore`を生成します。

## giboとの比較

### メリット

+ プロジェクトルートの`.gitignore`を自動的に探すこと

    [gibo](https://github.com/simonwhitaker/gibo)の場合、`.gitignore`の場所を指定するのが少し面倒ですが、`gitignore.vim`を使う場合はそれがありません。

+ Vimのプラグインであること

    Vimから出たくない人には適していると思います。

### デメリット

+ **Vimのプラグインであること**

    Vim使ってない人は[gibo](https://github.com/simonwhitaker/gibo)のほうが適しています。
スクラム現場ガイド読書会いってきた

```
読書会キックオフイベント (読んでない人も来てね！) 
スクラム現場ガイド読書会@五反田
2016-04-07（木）19:00 - 21:00
ガイアックス 
東京都品川区西五反田1-21-8 KSS五反田ビル
```

これ行ってきた。読書会。目的の本はこれ。スクラム現場ガイド。
https://book.mynavi.jp/ec/products/detail/id=50668

スクラムって何だか全然しらないし、は？アジャイル？ああ、インドの高僧でしょ？
というレベルの俺はクソ無知無知野郎。
さすがにアラサーになって勉強しないのはどうよ。
ということで勉強会に行ってきた。一人で本読むのたるいから。

Kindle版を購入していざ読書会会場。
こういうの初めてだったけど怖くなかった＆ためになった。

# どういう読書会だったの
なんか変わった方法で本を読む会だったよ。とにかく本を読むのが一番って感じの会。
知識構成型ジグソー法っていうやつだって。
「スクラムとは〜」みたいな説明はなかったよ。
あくまで本の内容のガイド程度の説明しかなかった。

#### 知識構成型ジグソー法？
班作って、みんなで同じ範囲を短時間でガーッと読む。
班ごとに読む章が違うのがポイント。
その後班をバラバラに、それこそジグソーみたいに分解する。
次はピースを集めて新しい班をつくる。
新しい班には、同じ章を読んだ人はいない。
みんな違うパートを読んだ人たち。そこで内容を共有する。

っていう読書方法。一人で読むより俄然捗るし楽しい。
これ研修とか社内勉強会でやったらよくない？
上の説明は充分でない。詳しくは次のページとか読んで。
http://coref.u-tokyo.ac.jp/archives/5515


# なにがためになった？
俺はクソ怠け者なので普段本も読まないし、家で勉強とか一切しないの。
でもこういう読書会を通してやると、何だかんだで読むし予習もしちゃう。
モチベも上がる。

# スクラムの知識はついた？
ついたよ。つくけど実践力がつくとかそういうのじゃない。
本を読んで「へーなるほどー」って思った程度。でもそれが大事だよな。
知らないと何も出来ない。

# とかいってスクラムの秘訣教えてもらったんじゃないの？
あくまで本の内容を出ないっぽいよ。だからみんな本を読んだほうが良い。
スクラム現場ガイド買って。一応「へーなるほどー」って思ったことを挙げるぞ。

- 本の９章によればメンバーに「やれば出来るはず」を期待するのはダメ。研修やれ
- ケント・ベックでさえある会社でコーチングできた人数は１２人/１年程度だったとか
- エンジニアリングプラクティスは気長にやる必要がある
- あと振り返りが一番大事かもしれんぞ！
- スプリントは２回に１回は失敗してもいいらしいぞ！
- スニークスクラム？ステルスアジャイル？なにそれ気になる

こんな感じ。次回もあるかな。勉強になったので次も参加したい。
最後に、主催者のみなさん＆会場提供のみなさんありがとうございました。
参加者の方々もありがとうございました！
minecraftのバックアップとアップデート

![minecraft_backup.png](https://qiita-image-store.s3.amazonaws.com/0/33674/f2fba008-fb5a-a259-c1fa-5c98f21dafd7.png)

# minecraftマルチサーバーの構築方法

ConoHaを使ってCentOS 7.2でMinecraftサーバーを立てる - Qiita
http://qiita.com/syarihu/items/9d9522bb86c301ef57cb

とても参考になる。

minecraftサーバー構築 - Qiita
http://qiita.com/ymko/items/b327fe1db5e2bb2a21cc

こちらは自分の構築作業メモ。

# バックアップ

* 上記の方法で構築すると、起動スクリプトに"backup"コマンドがある。
* BACKUPPATHを指定するとそこにバックアップが作成される。
* minecraftサーバーの停止は不要。オンラインバックアップが可能。（添付画像のようにログが通知される）
* バックアップの中身はworldデータとjarファイル（minecraftサーバー本体）

```bash
$ cat /etc/init.d/minecraft
 #MCPATH='/home/minecraft/minecraft'
 MCPATH='/data/minecraft'
 #BACKUPPATH='/media/remote.share/minecraft.backup'
 BACKUPPATH='/data/minecraft.backup'
```

```bash
$ /etc/init.d/minecraft backup
minecraft_server.jar is running... suspending saves
Backing up minecraft world...
Backing up minecraft_server.jar
minecraft_server.jar is running... re-enabling saves
Compressing backup...
Done.

$ ll
total 117860
-rw-rw-r-- 1 minecraft minecraft 60340655 Apr  7 23:03 world_2016-04-07_23h03.tar.gz
-rw-rw-r-- 1 minecraft minecraft 60340662 Apr  7 23:05 world_2016-04-07_23h04.tar.gz
```

Tutorials/Server startup script – Minecraft Wiki
http://minecraft.gamepedia.com/Tutorials/Server_startup_script
中身はこちら。


# アップデート

```bash
$ /etc/init.d/minecraft update
$ /etc/init.d/minecraft update snapshot
```

起動スクリプトにアップデート用のコマンドと"snapshot"オプションがある。
jsonファイルをダウンロードしてバージョンを取得している様子だが、
試せていない。snapshotは何が違うのかしら。

Tutorials/Server startup script – Minecraft Wiki
http://minecraft.gamepedia.com/Tutorials/Server_startup_script
中身はこちら。
Elm Reactor で Hello World


Elm Reactor
------------

Elm Reactor はインタラクティブな開発ツールです。Elm Platform に含まれています。
Elm Reactor により起動させた HTTP サーバーを通じて Elm で書いたプログラムを実行することにします。

別の方法として、トランスパイラーの `elm-make` を手動で実行して JavaScript に変換した上でブラウザーで実行する方法が挙げられます。

Elm に取り組む動機
----------------

Cycle.js (RxJS) や Redux の開発者やユーザーのあいだで Elm アーキテクチャ ([日本語訳](https://github.com/evancz/elm-architecture-tutorial/blob/master/README.ja.md)) が定期的に話題として触れられることから、Elm アーキテクチャに興味をもつようになりました。Android や Swift でも Elm アーキテクチャを実現するための取り組みがなされています。

Elm アーキテクチャを学ぶことで今後の仮想 DOM を前提としたライブラリやフレームワークの進化の方向性を占うのに役立つのではないかという期待をしています。

Elm の日本語チュートリアルは少ないですが、Haskell を学んでいればコードを読むことができるでしょう。私は以前「[すごいHaskellたのしく学ぼう!](http://www.amazon.co.jp/dp/4274068854)」を読んでちょっとしたコードを書く練習を続けていました。

Elm に取り組む別の動機はドメイン駆動設計の練習として抽象型データを定義するコードを書く機会を増やしたいことです ([ドメイン駆動設計 基本を理解する](http://www.slideshare.net/masuda220/ss-59756718))。

Web API をもとにした SPA (Single Page Application) の開発に移行することで、従来はサーバーサイドが担っていた Model と View の責務がクライアントサイド JavaScript に移ってきているので、TypeScript や Flow などの型システムに対応しながら、Model の開発の方法論を学んでゆくことを今後の課題として考えています。

Elm Platform の導入
-------------------

npm コマンドで Elm のコマンドツール一式を導入します。

```bash
npm install -g elm
```

プロジェクトをセットアップする
------------------------

`elm-make` コマンドでプロジェクトをセットアップします。

```bash
mkdir elm-project
cd elm-project
elm-make --yes
```

パッケージを導入する　
-----------------

`elm-package` でパッケージを導入します。今回は `elm-lang/html` を導入します。

```
elm-package install elm-lang/html --yes
```

0.17 以前は `evancz/elm-html` でした。


コードを書く
----------


```elm:Hello.elm
import Html exposing (text)

main = text "Hello, World!"
```


HTTP サーバーを起動させる
----------------------

HTTP サーバーを起動させましょう。オプションでポート番号を指定します。

```bash
elm-reactor --port 3000
```

ブラウザーで `localhost:3000/Hello.elm` にアクセスしてプログラムが動くのかを確認します。

elm-make でトランスパイルする
--------------------------

今度は `elm-make` を実行してトランスパイルしてみましょう。

```bash
elm-make Hello.elm
```

生成された `index.html` にブラウザーでアクセスしてプログラムが動くか確認しましょう。

プログラムをリファクタリングする
--------------------------

Elm アーキテクチャを学ぶことを想定して、プログラムをリファクタリングしてみましょう。[こちら](https://github.com/micktwomey/elm-tutorial/blob/master/elm-tutorial.md)のチュートリアルを参考にさせてもらいました。

```bash:Hello.elm
import Html exposing (..)

main : Html
main =
    h1 [] [ text "Hello World" ]
```

今度は view 関数を定義してみよう。

```elm:Hello.elm
import Html exposing (..)

view : String -> Html
view message =
  h1 [] [ text message ]

main : Html
main =
  view "Hello World!"
```

次に取り組むことは？
----------------

Elm アーキテクチャを挙げます。コードの例を試すために [start-app](https://github.com/evancz/start-app) パッケージを導入します。

```bash
elm-package install evancz/start-app --yes
```
AmazonLinuxでLet's Encrypt

# ゴール
SSL証明書が出力される

# 設定の違い
AmazonLinuxの場合唯一**./letsencrypt-auto --help --debug**としなければならない点に注意


```shell-session
sudo yum install git
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt/
./letsencrypt-auto --help --debug (AmazonLinux時は、--debug必須)
./letsencrypt-auto certonly -a standalone -d <サーバ名>
メールアドレス入力
Agree
```
GitBucketをTomcat8を使用せずにインストール(Nginx使用)

#ゴール
* GitBucket がインストールできている

## 背景
以外にもTomcat使った事例しか見つからなかった。
理由があるのだろうか。教えてほしい…


#実践

## GitBucket のインストール
* まずは、サクッとディレクトリ作成します。
今回は、ホームディレクトリに、作成しますがホームディレクトリでなくても問題ありません。

```
mkdir gitbucket
cd gitbucket
```

* 今回のメインであるを[GitBucket](https://github.com/gitbucket/gitbucket)ダウンロード。今回はVersion3.13ですが、実践時には。リンク先で最新版を導入してください。


```
wget https://github.com/gitbucket/gitbucket/releases/download/3.13/gitbucket.war
```

* 次にJDKをインストールします。

```
sudo yum -y install java-1.7.0-openjdk-devel java-1.8.0-openjdk-devel
```
* インストール後、OSで使用するネイティブなバージョンとして1.8.0を設定し、(今回は**2**)バージョンを確認。

```
sudo alternatives --config java
```
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/7127846a-d1fd-d7ee-820b-c7822d0a13a9.png)

* 少し強引だが、自動起動させるために/etc/rc.d/rc.localに起動陽のコマンドを仕込む。一旦sudo suで特権モードに入るか、sudoで書き込みましょう。

 ```
sudo su
echo 'java -jar /home/ec2-user/gitbucket/gitbucket.war --gitbucket.home=/home/ec2-user/gitbucket&' >> /etc/rc.d/rc.local
exit
```

## Nginxのインストール
*　普通にyumでインストール

```
sudo yum install nginx
```

* リバースプロキシの設定

```
sudo nano /etc/nginx/conf.d/ドメイン名がおすすめ.conf
```

```shell:ドメイン名がおすすめ.conf
server {
   listen 80;
   server_name ドメイン名がおすすめ

   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header Host $http_host;
   proxy_redirect off;
   proxy_max_temp_file_size 0;

   location / {
      proxy_pass http://127.0.0.1:8080/;
   }
}
```

#所感
PrivateRepositoryを大量に作りたい場合や、社外には出せないしお金も出せないって場合こうやって作成してみるのも良いですな。
5ユーザー以下なら[Bitbucket](https://bitbucket.org/)もおすすめです。
Wall-e project (ジョニー ファイブの復元)ー駆動部 #2

# 本日は、駆動部#2になります。

# 組み立て

aliexpressからFrameが来ましたので、
とにかく動かしてみます。

![IMG_2354.JPG](https://qiita-image-store.s3.amazonaws.com/0/73662/8757efb6-62b9-f424-bef7-ce6debbc12e6.jpeg)

これを組立ってると

<img width="500" alt="2c418268-cceb-e9db-3e89-a1e17803fc98.png" src="https://qiita-image-store.s3.amazonaws.com/0/73662/43bcb84a-c7b2-4b0e-29da-6dd7177a868d.png">


になります。

# モーターに電源をつなぐ

ここでモーターに電線をつなぎます。

![IMG_2362.JPG](https://qiita-image-store.s3.amazonaws.com/0/73662/a86982b9-24ec-9d81-c586-44798d64dcd1.jpeg)

# コントロールボードをつなぐ

Arduino Mega + Arduino Motor Shieldを駆動部に置きます

![IMG_2363.JPG](https://qiita-image-store.s3.amazonaws.com/0/73662/2e05b997-3fa1-f837-01ff-3caa227a4ffe.jpeg)

写真を見ると、六つの線がつないであります。

いちばん上の二つの線が,モーター電源(12v)になります。
下からは右と左のモーターにつながっています。

arduinoの電源はモーターと別でUSB電源を使います。
（モーターからはノイズが発生するので、電源は分ける方がいいんでしょうね）

#　モーターの電源をつなぐ
モーターの電源になる12Vの電源もつなぎます。
(TDK LAMBDA DC12V)


![IMG_2360.JPG](https://qiita-image-store.s3.amazonaws.com/0/73662/40e94e75-7bc3-3fa3-a227-c3108d74f467.jpeg)


走り足すと危ないので、ひっくり返して置きます。

それでテスト！


https://youtu.be/hNLw82OzsSs



（動画がQITTAで再生されませんOTL)

# arduino+motor shieldのテスト用のサンプル

ちなみにarduino + motor shieldは下記のサイトを参考しました。
http://www.instructables.com/id/Arduino-Motor-Shield-Tutorial/



近いうちこうしんします。
サラッと変えられたわりに使い勝手の影響が大きいPending Tab機能について

Atomを最新にアップデートしたところ、タブのファイル名がイタリックになったり、開いてたはずのタブが消えたりする現象が起きて、何だこりゃと思っていたのですが、これはバグではなく、v1.6.0にて追加されたPending Tabという機能でした。

<img width="241" alt="pending_tab.png" src="https://qiita-image-store.s3.amazonaws.com/0/7118/8c557a10-8761-168d-0398-04fd10ed68cb.png">

詳細は[Blogの方で説明されています](http://blog.atom.io/2016/03/17/atom-1-6-and-1-7-beta.html)が、以下に簡単にまとめておきます。

* ファイルツリーや横断検索結果のクリックで開いたファイルはPending Tabになり、次にファイルを開いた時に、タブが置き換わる。
* ファイルツリーをダブルクリックで開いた場合、Pendingにならない。
* Pendingを解除するには、タブをダブルクリックするか、Command Paletteの`Tabs: Keep Pending Tab`。
* FuzzyFinderで開いたものはPendingではない模様。
* v1.6.0にバージョンを上げた時点でデフォルトで有効になっているが、設定で無効にもできる。

アップデートのリスマークを押すとRelease Noteに飛びますが、最近のRelease NoteはPRのリンクの列挙であまり参考にならないので、Featuredな変更点を確認したいときはBlogを見るようにしたほうが良さそうです。
便利なWindows環境の構築


# Markdownメモ帳
## kobito
http://kobito.qiita.com/win

# Alfred風ランチャー
## Executor
http://executor.dk/

起動対象の追加方法
* http://pcgenki.com/util/executor_3.htm

Windowsでのシンボリックリンクの張り方
~~~
C:\Windows\system32>mklink /D リンク先　リンク元
C:\Users\ochiba\AppData\Roaming\KaitaBrowser
~~~
##### 参照
http://dev.classmethod.jp/etc/make_windows_symbolic_link/
New Relic APM簡易セットアップ方法

New Relicとは、パフォーマンス監視サービスです。
サーバ側にnewrelic用モジュールをインストールし、サーバ/アプリケーションの
レスポンスや実行にかかった時間などの統計情報をNew Relicのサイトで確認できます。
Java/Python/PHP/nodeなど、いろいろな言語に対応しており、
Heroku等のPaaS上で使用することもできます。
さらに最近は、モバイルの用アプリ(iOS/Android)のパフォーマンスをモニタリングできるようになったらしいです。
今回はさくらVPS上にあるRails アプリを例にNew Relic APMを利用する方法を記載します。

#New Relic APMセットアップ方法

□New Relicのサイトでアカウント登録をします。
 http://newrelic.com/

□サインアップ後New Relic APMのリンクをクリックします。

□Get your license keyをクリックしてライセンスキーを生成します。

□Download newrelic.ymlをクリックしてnewrelic.ymlをダウンロード

□アプリのconfig配下に配置します。

□Gemfileに以下を追加

```
　gem 'newrelic_rpm'
```

```
bundle install
```

□サーバ再起動します。

以上のステップでNew Relic APMの利用準備は完了。

New Relicにデータが送信されてパフォーマンス情報が取得できるようになります。

この記事は以下を参考に作成しました。
http://dev.classmethod.jp/tool/newrelic/
AmazonLinuxにRuby2.3を導入してRubyOnRailsの下準備

#ゴール
・AmazonLinux上でRuby2.3が動いている
・RubyOnRailsで生成されたものがすぐにデプロイできる。(Redmineとかとか)

#実践
* GemのDocument類は、重いので、個人的に必要ないと思うので自分のホームディレクトリで.gemrcというファイルを作成し、**gem: --no-ri --no-rdoc**を書き込み保存

```shell-session
echo gem: --no-ri --no-rdoc >> .gemrc
```

* nokogirのインストールで躓かないようにあとは、一気にガーッとインストール
alternatives コマンドでRuby2.3に変更する ( **2**を選択 )

```shell-session
sudo yum install -y patch gcc libxml2 libxml2-devel libxslt libxslt-devel ruby23-devel ruby23 ImageMagick ImageMagick-devel
sudo alternatives --config ruby
sudo gem install rails
sudo gem update --system
```

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/ec24f923-570f-5715-a4d8-57933167ec46.png)

* バージョンの確認

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/5f16d8b1-8315-6ae3-7aa5-6426eeeab265.png)

#まとめ
実際、何度か躓いた結果の記録です。
以外と、多いのではないでしょうか。
たぶん、AmazonLinuxでなくともCentOS系なら使えるのではと思います。

黒塗りで殆ど見えない!?
Docker machine のメモリを増やす方法

こんにちはみなさん

今回はしょうもないことでふらふらと調べまわった挙句、
それほど困るものでもなかった問題に遭遇したので、
とりあえず備忘録として挙げたものです

# Docker Toolbox

今回はいろいろ面倒になったので、Docker Toolboxでdocker環境をオールインワンで突っ込んでいます

https://www.docker.com/products/docker-toolbox

Docker Toolbox は docker を動かすために十分な環境を用意するためのインストーラです。
これを使用すると、windowsだろうがmacだろうが、ネイティブのコマンドライン上でdockerコマンドを使えるようになります
一昔前のboot2dockerですな
インストールが完了すると「Docker Quickstart Terminal」というアイコンが出てきて、これを起動すると、dockerを動かすための環境をセットアップして、動作環境を整備した状態にしてくれます

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/102182/c8d6a671-851a-fcbe-d745-8a9360ccb5f4.jpeg)

# Docker Machine

Docker Toolbox の肝はDocker Machine を起動させて、windows や mac でdockerコマンドを使えるようにするということです。
で、Docker Machineというのは、Dockerを使えるようにするための仮想環境を立ち上げ、その環境を通してdockerを使えるようにするものです。
この際立ち上がっている仮想マシンは boot2docker というdocker を動かすためのディストリビューションだそうです

「Docker Quickstart Terminal」で起動したターミナル上では、起動したDocker Machineの作成時の状態を以下のコマンドで確認できます

```
docker-machine inspect
```

ここでMemory のサイズを見ると、

```
"Memory": 1024,
```
で、普通だったらこれでも十分なのですが、
機械学習のようなメモリをバカ食いするような処理では、
静かにkill される可能性があります

# メモリを増やす

docker コンテナに任意のメモリを割り当てる方法は、runするときに以下のオプションをつければいいです

```
docker run -m 1024m hoge /bin/bash
```
しかし、コンテナに割り当てるメモリを増やすには、そもそも仮想マシンに割り当てたメモリを増やす必要があります

で、メモリの増やし方なのですが、とても原始的な手段に走りました

docker-machineが使用している仮想環境は、VirturalBox 上に存在します
というわけで、まずいったんマシンを止めます

```
docker-machine stop
```

次にVirturalBoxの管理画面を開きます
今まで入れたことがなくても、Docker Toolbox 入れたら勝手に入っています

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/102182/c4023385-b2ab-a572-e064-5e14a3732751.jpeg)


すると、「default」という名前の仮想イメージがあるので、こいつを選択した状態で設定アイコンを押してやります

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/102182/da6d5486-cdad-5505-bf3b-e51510af84c2.jpeg)

設定画面でシステムを選択し、メモリスライダを好きなように動かしてやり、OKを押します

以上で設定が終わったので、起動します
私は不安だったので、再度「Docker Quickstart Terminal」起動させました

# 確認する

最後に確認しましょう
ターミナルの軌道が完了したら、適当なコンテナに任意のメモリをくっつけて起動させてみます

```
docker run -it --rm -m 8g hoge /bin/bash
```

で、freeで確認すると

```
root@82880b1c54d8:/# free
             total       used       free     shared    buffers     cached
Mem:       8168428     220220    7948208     132696       8796     137844
-/+ buffers/cache:      73580    8094848
Swap:      2986560          0    2986560
```
こんな感じでメモリが8GBに増やせました

# まとめ

気が付いたら、ただの VirturalBox のメモリ割り当ての解説になっていたでござるの巻
Docker Toolboxがどういう設定しているかはわかりにくいけど、やっていることは仮想マシン動かして、
そのうえでDocker動かしているだけなんで、それほどブラックボックスな感じはせんですな

# 参考

https://docs.docker.com/machine/overview/
http://qiita.com/spesnova/items/073dd64a8a1d580d9ae9
Fatal error in launcher: Unable to create process using '"'でお困りのあなたへ


Python × eclipse環境を立ち上げるときにpipコマンドが通らずハマったのでメモ。

## 現象

pipへパスを通したのになぜかアップデートコマンドが通らない。

```control:実行時エラー
c:\>pip install -U pip

Fatal error in launcher: Unable to create process using '"'
```

## 解決方法

python経由でpipモジュールを呼び出すと通る。

```control:実行時エラー
c:\>python -m pip install -U pip
```

pipを一度アップデートしてからは問題なく直接呼び出せるようになったので、特定のpipバージョンでおこる現象かも。詳細は知らない。
railsでプロファイラ(rack-mini-profiler)を追加する方法

パフォーマンスチューニングをするために、プロファイリングツールを導入する。

今回使うのは、rack-mini-profiler。

#導入

1.Gemfileに gem 'rack-mini-profiler' を追加する。
2.bundle install
3.rails s

以上3ステップで導入完了。
ブラウザにアクセスすると右上に以下のように表示される。

![キャプチャ1.png](https://qiita-image-store.s3.amazonaws.com/0/71592/6ebc8511-a6ce-3eda-4927-3a7721ba69e5.png)

クリックするとメニューが開く
![キャプチャ2.png](https://qiita-image-store.s3.amazonaws.com/0/71592/67c4fd77-832d-aa8f-0e76-ed0b8b5d037b.png)

query列のリンクをクリックすると発行されたsqlが確認できる。

#本番環境で利用する方法
開発環境であれば上記だけで利用可能だが、本番で利用したい場合は以下のステップも踏む必要がある。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
#以下を追加  
  before_filter :miniprofiler
  
  private
  def miniprofiler
    Rack::MiniProfiler.authorize_request
  end
#以上を追加
end
```

#on/off切り替え
以下のtrue/falseでプロファイラ表示の切り替え可能

```ruby:/config/environments/production.rb
# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = true

```

以上です!!
Elixir入門（１）

勉強したことをほぼ写経するだけ

# 簡単なマッチング

```
# "="は「マッチオペレーター」であって、「代入演算子」ではない
iex> a = 1
1
iex> 1 = a
1
iex> 2 = a
** (MatchError) no match of right hand side value: 1
```

# 少し複雑なマッチング

```
iex> list = [1, 2, 3]
[1, 2, 3]
# 要素が３つの配列なのでOK
iex> [a, b, c] = list
[1, 2, 3]
iex> a
1
iex> b
2
iex> c
3
# ３つ目に"3"が来るのは正しいのでOK
iex> [a, b, 3] = list
[1, 2, 3]
# ３つ目に"2"が来るのはおかしいのでエラー
iex> [a, b, 2] = list
** (MatchError) no match of right hand side value: [1, 2, 3]
```

# 値を無視する"_"

```
iex> [a, b, _] = [1, 2, 3]
[1, 2, 3]
iex> a
1
iex> b
2
iex> _
** (CompileError) iex:29: unbound variable _
```

# 値を束縛する"^"

```
iex> a = 1
1
iex> a = 2
2
iex> ^a = 1
** (MatchError) no match of right hand side value: 1
```
ESLintの設定をscoped packageでnpmにあげて使い回す


ESLintがv2にアップデートしてからけっこう変わって、だましだましv1系の設定をいじりながら使い続きてたけどだいぶカオスになってきたので気合入れて書き直した。

https://github.com/hokaccha/eslint-config

せっかく気合入れて書いたのでプロジェクトを横断して設定を共有できるようにしたい。

ESLintの設定を使い回すのはいくつか方法が考えられる。

1. プロジェクトごとにコピペする
2. npmモジュールにしてextendする

さらにnpmモジュールとして利用するのはいくつか方法があって、

1. `eslint-config-hokaccha`みたいにグローバルな名前でnpmにpublishして使う
2. scoped packageとして`@hokaccha/eslint-config`みたいな名前でnpmにpublishして使う
3. githubに置いといて`npm install hokaccha/eslint-config`みたいにして使う

たぶん1が一番メジャーな方法で、[eslint-config-airbnb](https://www.npmjs.com/package/eslint-config-airbnb)とか[eslint-config-standard](https://www.npmjs.com/package/eslint-config-standard)あたりが有名どころ。そうすると`.eslintrc`では

```json:.eslintrc
{
  "extends": "airbnb"
}
```

みたいにするだけでその設定を使いまわせる。

http://eslint.org/docs/user-guide/configuring#extending-configuration-files

なので`eslint-config-hokaccha`みたいな名前でpublishしてもいいんだけど、グローバルなネームスペースに個人の設定あげるのも何か気が引ける（個人の名前でpublishしてる人もけっこういるしそんなに問題にはならないと思うけど気持ちの問題）。

そこでscoped packageでpublishすることにした[^1]。scoped packageについてはazuさんの記事を参照のこと。

[^1]: 知らなかったんだけどteppeisさんに教えてもらった

[npmで名前空間を持ったモジュールを公開する方法(scoped modules) | Web Scratch](http://efcl.info/2015/04/30/npm-namespace/)

こんな感じでnpmにpublishした。

https://www.npmjs.com/package/@hokaccha/eslint-config

インストールして

```
$ npm install --save-dev eslint @hokaccha/eslint-config
```

extendするだけ。

```json:.eslintrc
{
  "extends": ["@hokaccha/eslint-config"]
}
```

これで気合入れて書いた設定を共有できるしアップデートにも追従できる。便利。
C# で非同期な遅延処理

C# でゲームを作っていて、ちょっとした遅延処理を書きたくなったので。

```csharp
Task.Run(() => {
    Thread.Sleep(200);
    Console.WriteLine("遅延させたい処理。");
});
```

~~5.0 以降には `async/await` という機能もありますが、ドキュメントを読んだ感じ、あちらはもう少し複雑な処理向けという気がしました。~~

(16/04/08 追記) @kiichi54321 さんよりコメントをいただきました。`async` と `await` 、わりとカジュアルな使い方もできるんですね。

```csharp
Task.Run(async () => {
    await Task.Delay(200);
    Console.WriteLine("遅延させたい処理。");
});
```

`async` がメソッドなりラムダ式を「非同期に実行する」というマーカーの役割をしていて、その中の実際に非同期にしたい処理に `await` を付けると、以降の処理が `await` の結果を待ってくれる感じみたいです。
[ここ](http://www.atmarkit.co.jp/ait/subtop/features/dotnet/app/masterasync_index.html) の第二回の記事とかもとても参考になりました。

ご指摘ありがとうございました。
[Groovy]リストに格納されたオブジェクトを複数のキーを元にソートする

Groovyでは　`<=>`という演算子が有ります。
この演算子は宇宙船演算子というらしいです（PHP7情報）
やっと名前を知ることが出来たのでじゃあ一体ドコで使うの？というサンプルを投稿します。
まぁタイトルに有るとおりソートで威力を発揮します！

シンプルなサンプルとして、数値が格納されたリストを昇順にソートしてみます。

```groovy
assert [1,2,3,4,5] == [3,1,5,4,2].sort {left, right -> left <=> right}
```
GroovyのListの`sort`メソッドは、リストの先頭から自動的に1つめと2つ目の値を、渡すクロージャに渡してくれるので、その値に対して例の宇宙船演算子`<=>`を指定するだけです。
じゃあ降順は？という話になりますね。はい簡単です。単純に比較順序を逆にするだけです。

```groovy
assert [5,4,3,2,1] == [3,1,5,4,2].sort {left, right -> right <=> left}
```

こんな感じで、Groovyではお手軽にリストの中身をソートできます。宇宙船演算子とクロージャのおかげですね！

ただ、コレだけだとググれば山ほど出てくるので、今回は複数のキーをソート対象にしてみます。
条件は、

1. リストにクラスAのインスタンスを格納する。
2. そのリスト内のAインスタンスをそれぞれ、プロパティaの値で降順でソートする。
3. ただし、プロパティaの値が同じ場合は、プロパティbの値で比較して、降順でソートする。


です。
ココで新しいキーワード`?:`が出てきます。コレは`エルビス演算子`というものです。ﾌﾟﾚｽﾘｰ!!
コレは、左辺がtrueなら左辺を、左辺がfalseなら右辺を返すというイカした演算子です。

```groovy
groovy:000> assert 100 == 0?:100
===> null
groovy:000> assert 100 == 100?:0
===> null
```

このエルビス演算子を利用すると、NULLチェックをしてNULLなら別の値を入れて。。。というような作業を更にスマートに表現できる可能性が高まります。

```groovy
Date d = null
println d ?: "oh... Dateがﾇﾙﾀﾞﾖｰ"
```

エルビス演算子の詳細はまた別途投稿したいと思います。
では、これらを組み合わせてソートを実装してみます。

```groovy
class A{
	def a
	def b
}

assert ["a=2, b=1", "a=1, b=2", "a=1, b=1"] == [
	new A(a:1,b:1), 
	new A(a:1,b:2), 
	new A(a:2,b:1)
].sort{ l,r -> 
	r.a<=>l.a ?: r.b<=>l.b
}.collect {"a=${it.a}, b=${it.b}"}
```

ちょっと見辛いですね。
実行結果としては当然、

```
a=2, b=1
a=1, b=2
a=1, b=1
```
という並びになっています。

以上です。