OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7へのiptablesの導入

CentOS7.2にiptablesをセットアップした際のメモ。

# CentOS6との相違点
- パッケージ名がiptablesからiptables-servicesに変わった
- firewalldがデフォルトで有効になっている模様 -> 両方はいらないのでiptablesを導入したら無効に

※　本当はfirewalldの方が設定中も通信が途切れることが無いようなので、firewalldを使ったほうが良さそう。でも今回は勉強不足なところもあり、iptablesを利用する。

# 方針
- wirewalldではなくiptablesを利用する
- ipv6のネットワークを無効化する
- ip6tables.serviceを無効化する
- ipv4のフィルタリングだけしっかり設定する

# インストール
```console
$ sudo yum install iptables-services
```

# 設定
iptablesで使用する設定ファイルは以下の４つ。

- /etc/sysconfig/iptables-config
- /etc/sysconfig/iptables
- /etc/sysconfig/ip6tables-config
- /etc/sysconfig/ip6tables

xxx-configは利用モジュールの読み込みやサービス停止時の動作等を定義する。
xxtablesはフィルタリングのルールを主に定義する。

**iptables-config**
今回はFTPのパッシブモード等を利用しないため、デフォルトのまま使用する。

**iptables**
さくらのナレッジのサイトが参考にしつつ設定する。

```text:/etc/sysconfig/iptables
# ポリシー
*filter
:INPUT   DROP   [0:0]
:FORWARD DROP   [0:0]
:OUTPUT  ACCEPT [0:0]

### デフォルトで許可
# ループバックを許可
-A INPUT -i lo -j ACCEPT
# セッション確率済みのパケットを許可
-A INPUT  -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# DNSの戻りパケットを許可
-A INPUT -p udp --sport 53 -j ACCEPT
# NTPの戻りパケットを許可
-A INPUT -p udp --sport 123 -j ACCEPT
# ICMP
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
# SSH
-A INPUT -p tcp --tcp-flags SYN,RST,ACK SYN -m state --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

### 攻撃対策
# データを持たないパケットの接続を破棄する
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYNflood攻撃と思われる接続を破棄する
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# ステルススキャンと思われる接続を破棄する
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP

### 各種サービス
# -A INPUT -p tcp --dport 80 -j ACCEPT

COMMIT
```

# サービスの有効化・無効化
```console
$ sudo systemctl start iptables.service
$ sudo systemctl enable iptables.service
$ sudo systemctl stop firefwalld.service
$ sudo systemctl disable firewalld.service
```

ipv6の停止はまた、別途。

# 参考サイト
[CentOS7のiptablesとFirewalld](https://www.superweibu.com/archives/6120.html)
[CentOS7, iptables設定でハマった](http://mosuke5.hateblo.jp/entry/2014/09/20/180326)
[iptables インストールと設定](http://www.very-cute.net/wp/iptables-inst/)
[ファイアウォールiptablesを簡単解説～初心者でもよくわかる！VPSによるWebサーバー運用講座(4)](http://knowledge.sakura.ad.jp/beginner/4048/)
[俺史上最強のiptablesをさらす](http://qiita.com/suin/items/5c4e21fa284497782f71)
[コピペから脱出！iptablesの仕組みを理解して環境に合わせた設定をしよう](http://oxynotes.com/?p=6361)
Bootstrap3のスマホ表示時の余白を狭くする

Bootstrap3のgrid systemを使用すると, レスポンシブデザインが容易に実現できるのだが, 画面の横幅が768px未満のとき(スマホ用表示のときに)画面横の余白が大きく感じるのが玉に瑕. 

それを是正するには, 以下のようにすればOK.

~~~css
@media (max-width: 767px) {
  .container  {
    padding: 3px !important; /* 好みに応じて余白サイズを指定 */
    overflow-x: hidden !important; /* これがないと x軸方向に謎の余白が生じてしまう */
  }
  
  .navbar-header {
    margin: 0px  !important;
  }
}
~~~
[メモ][Rails]コントローラーのメソッドをヘルパーとしてビューで使う

コントローラーにあるメソッドをヘルパーのようにビューで使いたい。
## 最初に考えていたもの
```application_controller.rb
def current_user
  @current_user ||= User.find(session[:user_id])
end
```
```◯◯_controller.rb
before_action :current_user
```
```◯◯.html.haml
= user.name if @current_user
```
みたいな感じで考えていたのですが、
使う action があるコントローラーすべてに before_action をつけないといけないし、
set_current_user みたいな名前にしないとわかりにくい、けどコントローラー内で使うときは current_user て名前じゃないとわかりにくい。

他にもヘルパーに書き出すのがいいかなーと思いつつも
* ヘルパーにしたいメソッドがこのメソッドだけ
* コントローラーでも使うのでヘルパーとコントローラーの両方に書くとDRYじゃない
* ヘルパーに書いて、それをコントローラーに入れてもいいけど、ヘルパーでActiveRecord使うのは気持ち悪い(個人的に)


## 解決策
この[APIdock](http://apidock.com/rails/AbstractController/Helpers/ClassMethods/helper_method)の通りです。これで終わりです。

コントローラーに

```
helper_method :method_name
```
を入れるだけでよい！

先程のコードの場合は

```application_controller.rb
helper_method :current_user

def current_user
  @current_user ||= User.find(session[:user_id])
end
```
とすれば

```◯◯.html.haml
= user.name if current_user
```
上記のようにビューで使えます。

複数のメソッドを使うときには

```application_controller.rb
helper_method :current_user, user_signed_in?

def current_user
  @current_user ||= User.find(session[:user_id])
end

def user_signed_in?
  current_user != nil
end
```

こんな感じでカンマ区切りでいけるようです。
C++ 演算子の代替表現

C++には演算子の代替表現というものがあります。それはすなわち、以下のようなコードが書けるという意味です。

```cpp
if (n not_eq m)
{
  std::cout << "n is not equal to m." << std::endl;
}
if (n and m)
{
  std::cout << "both n and m are not false." << std::endl;
}
```

今日知ったのですが、この代替表現は文脈を問わず使うことができます。

```cpp
class sth
{
public:
  void func(int and n) and
  {
    std::cout << n << " and" << std::endl;
  }
  void func(int bitand n) bitand
  {
    std::cout << n << " bitand" << std::endl;
  }
};
```

妙な気分ですが、このコードは合法です。以下のように使うこともできます。

```cpp
int main()
{
  int a = 123;
  sth().func(static_cast<int and>(a));
  sth s;
  s.func(* bitand a);
}
```

いやあ、知らなかった。一生使うことはなさそうです。
[JAWS-UG CLI] ACM入門 #15 Route53の削除

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-route53レコードセットの削除">第1項へ進んでください</A>。


0. 準備
=======

0.1. HostedZoneIdの変数への格納
---------------

```bash:コマンド
HOSTED_ZONE_ID=`aws route53 list-hosted-zones \
 --query HostedZones[].Id --output text` && echo ${HOSTED_ZONE_ID}
```
```text:結果(例):
      /hostedzone/Z1S92TCRCPLEYH
```


1. Route53レコードセットの削除
===========

1.1. レコードセットの削除
---------------

Route53のゾーン（ドメイン）削除するには、全ての登録したレコードを削除しなければなりません。
レコードセット登録時に使用したJSONファイルのCREATEをDELETEに置換することで再利用可能なので、これにより削除を実行します。
複数のファイルを同時には処理できませんから、順次作業します。

（１回目）

```bash:コマンド:
cat ./route53.json | sed -e 's/CREATE/DELETE/g' > ./route53delete.json
aws route53 change-resource-record-sets \
 --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file://route53delete.json
```
```text:結果(例):
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "Comment": "SESincoming",
              "SubmittedAt": "2016-11-03T05:17:25.761Z",
              "Id": "/change/CWGAZK7G2ILU4"
          }
      }
```

（２回目）

```bash:コマンド:
cat ./route53b.json | sed -e 's/CREATE/DELETE/g' > ./route53delete.json
aws route53 change-resource-record-sets \
 --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file://route53delete.json
```
```text:結果(例):
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "Comment": "AliasRecord",
              "SubmittedAt": "2016-11-03T06:52:06.554Z",
              "Id": "/change/C385JS8Z5GJZAB"
          }
      }
```

（CloudFrontまでの方は次の３回目は不要です。こちらはALBまで構築した方のみ）

```bash:コマンド:
cat ./route53c.json | sed -e 's/CREATE/DELETE/g' > ./route53delete.json
aws route53 change-resource-record-sets \
 --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file://route53delete.json
```
```text:結果(例):
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "Comment": "ALB-AliasRecord",
              "SubmittedAt": "2016-11-03T06:52:06.554Z",
              "Id": "/change/C385JS8Z5GJZAB"
          }
      }
```

ここまで実行したら１分程度待ちます。
（レコードセットの削除が完了しないとゾーンを削除できないからです）


1.2. レコードセット削除の確認
---------------

```bash:コマンド
aws route53 get-hosted-zone --id ${HOSTED_ZONE_ID} --query HostedZone.ResourceRecordSetCount
```
```text:結果:
      2
```

出力結果が 2 でない場合は、もう１分程度待って再度実行します。
それでも変わらない場合、レコードセットの削除に失敗していますから確認してください。


2. Route53ホストゾーンの削除
===========

2.1. ゾーンの削除
---------------

```bash:コマンド:
aws route53 delete-hosted-zone --id ${HOSTED_ZONE_ID}
```
```text:結果(例):
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "SubmittedAt": "2016-11-03T06:55:05.380Z",
              "Id": "/change/C3RGFWB23BB5L7"
          }
      }
```

2.2. ゾーンが削除されたか確認
-----------------------

```bash:コマンド
aws route53 list-hosted-zones
```
```text:結果:
      {
          "HostedZones": []
      }
```



懇親会へ行きましょう！
=======

以上で本日のハンズオンは片付けまで全て終了です。
おつかれさまでした。荷物を片付けて懇親会へ行きましょう。


注意
=======
Route53には無料利用枠が有りません。
削除し忘れると課金され続けます。きちんと削除の確認をするようにしましょう。
vagrantでローカル開発環境を構築してCentOSを動かす

## はじめに
macでローカル開発環境を構築したときのメモ。
用いた環境は、

- OS X Yosemite 10.10.5
- vagrant 1.8.6
- VirtualBox 5.1.6
- CentOS 6.8

## VirtualBoxとVagrantをダウンロード
まず、仮想マシンを動かす環境として以下の２つのツールをダウンロードします。

[VirtualBox](https://www.virtualbox.org/wiki/Downloads)
[Vagrant](https://www.vagrantup.com/downloads.html)

ダウンロードできたら、ターミナルから以下のコマンドを打ち、vagrantのプラグインを追加します。

```text:コマンド
vagrant plugin install vagrant-vbguest
```

## Vagrantファイルを作成

今回は、`[home]/MyVagrant/mycentos` というディレクトリを作成して仮想マシンを立ち上げます。
仮想マシンを立てるディレクトリに移動して、

```text:コマンド
vagrant init bento/centos-6.8
```

と入力するとVagrantfileが作成されます。（時間が結構かかります。）

作成されたVagrantfileを編集して、仮想マシンのIPアドレスを設定します。
以下の行のコメントアウトを外します。

```text:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```

これでCentOSを仮想マシンとして立ち上げる環境が整いました。

## 仮想マシンを起動

ターミナルから`vagrant up`と入力すると仮想マシンが立ち上がります。

`vagrant status`で仮想マシンのステータスが確認できます。以下の通りにrunning と表示さればOKです。

```
default                   running (virtualbox)
```

`vagrant ssh`でログインができます。あとはPHPでもpythonでも必要なものを入れていきましょう。
Python 関数のキーワード引数


```python
f(a, b, option1=10, option2=20)
```

のように引数をキーワードで指定でしたいという基本的なことについて。オプションは毎回指定するものではなくて、指定しなければデフォルト値が使われるようにしたい。

```python
f(a, b) # option1, option2 は指定しなくてもいい
```

## **kwargs

検索すると `**kwargs` というものがよくでてくる。

```python
def f(a, b, **kwargs): 
	option1 = kwargs.get('option1', 1)
	option2 = kwargs.get('option2', 2)
```

`kwargs` はキーワード名と値の入った辞書で、`get` メソッドでデフォルトの値を指定している。

しかし、`**kwargs` は「なんでもあり」なので、うっかりスペルミスすると意図しないデフォルト値が使われる。

```python
f(a, b, opton1=10) # スペルミスにより option1 はデフォルトの1となる
```

## デフォルト引数

そもそも、Python では引数を名前でよべるので、キーワードが決まっているなら `**kwargs` を使うべきではない。

```python
def f(a, b, option1=1, option2=2): 
	pass

f(a, b, option1=10, option2=20)
f(a, b, opton1=10) # エラー opton1というキーワードはない
```

しかし、`option1`は固定引数でもあるので、うっかり引数の数を間違えると option を上書きしてしまう。

```python
f(a, b, c) # 引数の数を間違え、意図しない option1=c
```

## `*` 引数 (Python3)

Python3 では `*` をはさむことで以降の変数はキーワードでしか呼べなくなる。

```python
def f(a, b, *, option1=1, option2=2): 
	pass

f(a, b, option1=10, option2=20)
f(a, b, c) # エラー 固定変数は２つ
f(a, b, opton1=10) # エラー 存在しないキーワード
```

というわけで、Python3 ではこれがおすすめ。

### 参考
http://stackoverflow.com/questions/1419046/python-normal-arguments-vs-keyword-arguments
[JAWS-UG CLI] ACM入門 #14 SESの削除

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-ses-incomingの削除">第1項へ進んでください</A>。


0. 準備
=======


0.1. リージョンの決定
---------------------

今回はバージニア(us-east-1)リージョンで作業します。

```bash:変数の設定:
export AWS_DEFAULT_REGION='us-east-1'
```

0.2. ドメイン名の変数への格納
---------------

変数へドメイン名を格納します。
ここでは example.tk とします。自分のドメイン名に読み替えてください。

```bash:コマンド:
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
```

```text:結果(例):
      example.tk
```

0.3. ルールセット名の変数への格納
---------------

SES Incoming作成時に設定した名前を変数へ格納します。

```bash:コマンド:
SES_RULE_SET_NAME='S3spool' && echo ${SES_RULE_SET_NAME}
```

```text:結果(例):
      S3spool
```


1. SES Incomingの削除
=================

1.1. 受信ルールセットの無効化
-----------------

ルールセットを削除するには、まず無効化する必要があります。

```bash:コマンド:
aws ses set-active-receipt-rule-set
```
```text:結果:
      返り値なし
```

1.2. 受信ルールセットの削除
-----------------

受信ルールセットを削除します。
ルールセットを削除すると、関連するルールも自動的に削除されます。

```bash:コマンド:
aws ses delete-receipt-rule-set --rule-set-name ${SES_RULE_SET_NAME}
```
```text:結果:
      返り値なし
```

1.3. 削除されたか確認
-----------------

```bash:コマンド:
aws ses list-receipt-rule-sets
```
```text:結果:
      {
          "RuleSets": []
      }
```

2. SES ドメイン認証情報の削除
=================

2.1. ドメイン認証情報の削除
-----------------

```bash:コマンド:
aws ses delete-identity --identity ${DOMAINNAME}
```
```text:結果:
      返り値なし
```

2.2. 削除されたか確認
-----------------

```bash:コマンド:
aws ses list-identities
```
```text:結果:
      {
          "Identities": []
      }
```
[JAWS-UG CLI] ACM入門 #13 ACM証明書の削除

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-acm証明書の削除">第1項へ進んでください</A>。


0. 準備
=======

0.1. ACM証明書arnの変数への格納
-----------------

証明書のarnを変数 CERT_ARN へ格納します。

```bash:コマンド(例):
CERT_ARN=`aws acm list-certificates --region us-east-1 \
 --query CertificateSummaryList[].CertificateArn \
 --output text` && echo ${CERT_ARN}
```
```text:結果:
      arn:aws:acm:us-east-1:777777777777:certificate/9eb6865a-63a3-48df-92c2-ae113c877b33
```



1. ACM証明書の削除
=================

1.1. 証明書の削除
-----------------

```bash:コマンド:
aws acm delete-certificate --region us-east-1 --certificate-arn ${CERT_ARN}
```
```text:結果:
      返り値なし
```

ここで An error occurred (ResourceInUseException)のようなエラーが出た場合は、何らかのサービスでまだこの証明書が使用されています。
利用中のACM証明書は削除することができません。
CloudFrontやELBなどを確認して先に削除してから再実行してください。



1.2. 削除されたか確認
-----------------

```bash:コマンド:
aws acm list-certificates --region us-east-1
```
```text:結果:
      {
          "CertificateSummaryList": []
      }
```
[JAWS-UG CLI] ACM入門 #12 S3バケットの削除

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-s3バケットの削除">第1項へ進んでください</A>。


0. 準備
=======

0.1. ドメイン名の変数への格納
---------------

ここでは example.tk とします。自分のドメイン名に読み替えてください。

```bash:コマンド:
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
```

```text:結果(例):
      example.tk
```

0.2. コンテンツ配信用S3バケット名の変数への格納
-----------------

S3バケット名を www.ドメイン名 とします。（例: www.example.tk ）

```bash:コマンド:
WEB_S3_BUCKET="www.${DOMAINNAME}" && echo ${WEB_S3_BUCKET}
```
```text:結果:
      www.example.tk
```

0.3. SES Incoming用S3バケット名の変数への格納
-----------------

S3バケット名を ドメイン名.sesincoming とします。

```bash:コマンド:
SES_S3_BUCKET=${DOMAINNAME}.sesincoming && echo ${SES_S3_BUCKET}
```
```text:結果:
      example.tk.sesincoming
```


1. S3バケットの削除
=================

1.1. コンテンツ配信用S3バケットの削除
-----------------

S3バケットを削除します。
オブジェクトが残っていますから --force オプションで同時に全て削除します。

```bash:コマンド:
aws s3 rb --force s3://${WEB_S3_BUCKET}
```
```text:結果:
      delete: s3://www.example.tk/index.html
      remove_bucket: www.example.tk
```

1.2. 削除されたか確認
-----------------

```bash:コマンド:
aws s3 ls s3://${WEB_S3_BUCKET}
```
```text:結果:
      An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist
```

このようにエラーとなれば削除完了しています。
1.3. SES Incoming用S3バケットの削除
-----------------

S3バケットを削除します。
オブジェクトが残っていますから --force オプションで同時に全て削除します。

```bash:コマンド:
aws s3 rb --force s3://${SES_S3_BUCKET}
```
```text:結果(例):
      delete: s3://example.tk.sesincoming/ljfdsfdsodfsojfdsojfdslkdfljfdlkslkd9fdj
      remove_bucket: example.tk.sesincoming
```

1.4. 削除されたか確認
-----------------

```bash:コマンド:
aws s3 ls s3://${SES_S3_BUCKET}
```
```text:結果:
      An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist
```

このようにエラーとなれば削除完了しています。
PostgreSQLで料理のレシピを管理

こんにちは、みゆうです。食いしん坊です。
PostgreSQL初心者です。

やりたいこと：料理のレシピを管理するため自分用DBの構築

やったこと：PortgreSQLのtutorial通りにDBを作った後、練習のためTABLEに情報をいくつか書き込んだ

やったことをほんのちょっと詳しく書くと、

- DB作成
- 以下のコマンドでテーブル作成

```
CREATE TABLE recipe (
recipe_id int PRIMARY KEY,
recipe_name varchar(80),
link varchar(2000),
time_to_cook time,
ingredients varchar[]
);
```

- お気に入りのレシピをTABLEに挿入

```
INSERT INTO recipe VALUES
(
'5',
'野菜ジュースのいきなりパスタ',
'http://www.bh-recipe.jp/recipe/050400142.html',
'0:15',
ARRAY['野菜ジュース']
);
```

- テーブルの確認

recipe_db=> SELECT * FROM recipe;

 recipe_id |         recipe_name          |                          link                          | time_to_cook |  ingredients
-----------+------------------------------+--------------------------------------------------------+--------------+----------------
         1 | マスタードソース             | http://略             | 00:10:00     | {マスタード}
         2 | パンプキンケーキ             | http://           | 01:00:00     | {かぼちゃ}
         3 | 鮭のムニエル                 | http://         | 00:30:00     | {鮭}
         4 | リンゴのパウンドケーキ       | https:// | 01:00:00     | {りんご}
         5 | 野菜ジュースのいきなりパスタ | http://www.bh-recipe.jp/recipe/050400142.html          | 00:15:00     | {野菜ジュース}

ingredientsには、必要な食材を書きました。
でも、常備されてる食材を書くのは省略しました。

なんとなく思いついた料理名を書いていっただけなのに、ingredientsがすべて1つになった...。
[JAWS-UG CLI] ACM入門 #10 EC2インスタンスの削除

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-ec2インスタンスの削除">第1項へ進んでください</A>。

0. 準備
=======


0.1. リージョンの決定
---------------------

今回はバージニアリージョン(us-east-1)で作業してください。

```bash:変数の設定:
export AWS_DEFAULT_REGION='us-east-1'
```

0.2. EC2インスタンスIDの変数への格納
---------------

```bash:コマンド:
EC2_INSTANCE_ID=`aws ec2 describe-instances \
 --query Reservations[].Instances[].InstanceId \
 --output text` && echo ${EC2_INSTANCE_ID}
```

```text:結果(例):
      i-77777777777777777
```

0.3. セキュリティグループIDの変数への格納
---------------

```bash:コマンド:
SG_NAME="ec2-handson-sg"
SG_ID=`aws ec2 describe-security-groups --group-names ${SG_NAME} \
 --query SecurityGroups[].GroupId --output text` && echo ${SG_ID}
```

```text:結果:
      sg-acf623d1
```

0.4. 鍵ペア名と鍵ファイル名の変数への格納
---------------

```bash:コマンド:
EC2_KEY_NAME="ec2-handson" && echo ${EC2_KEY_NAME}
FILE_SSH_KEY="${HOME}/.ssh/${EC2_KEY_NAME}.pem"
ls ${FILE_SSH_KEY}
```

```text:結果(例):
      ec2-handson
      /home/ec2-user/.ssh/ec2-handson.pem
```



1. EC2インスタンスの削除
===========

1.1. インスタンスの削除(ターミネート)
---------------

```bash:コマンド:
aws ec2 terminate-instances --instance-ids ${EC2_INSTANCE_ID}
```
```text:結果(例):
      {
          "TerminatingInstances": [
              {
                  "InstanceId": "i-77777777777777777",
                  "CurrentState": {
                      "Code": 32,
                      "Name": "shutting-down"
                  },
                  "PreviousState": {
                      "Code": 16,
                      "Name": "running"
                  }
              }
          ]
      }
```

インスタンスの削除が完了しないと他のリソースを削除できないため、ここで３分ほど待ちます。

1.2. インスタンスが削除されたか確認
---------------

```bash:コマンド:
aws ec2 describe-instances --instance-ids ${EC2_INSTANCE_ID} \
 --query Reservations[].Instances[].State.Name
```
```text:結果:
      [
          "terminated"
      ]
```

terminated と出力されたか必ず確認してから次に進んでください。
shutting-down の場合はもう数分待って再実行します。
running の場合は削除に失敗しています。前の手順を再試行してください。

1.3. セキュリティグループの削除
-----------------

```bash:コマンド:
aws ec2 delete-security-group --group-id ${SG_ID}
```
```text:結果:
      返り値なし
```

1.4. セキュリティグループ削除の確認
-----------------

```bash:コマンド:
aws ec2 describe-security-groups --group-ids ${SG_ID}
```
```text:結果(例):
      An error occurred (InvalidGroup.NotFound) when calling the DescribeSecurityGroups operation: The security group 'sg-acf623d1' does not exist
```

このようにエラーになれば削除完了しています。

1.5. 鍵ペアの削除
-----------------

```bash:コマンド:
rm -f ${FILE_SSH_KEY}
aws ec2 delete-key-pair --key-name ${EC2_KEY_NAME}
```
```text:結果:
      返り値なし
```

1.6. 鍵ペア削除の確認
-----------------

```bash:コマンド:
aws ec2 describe-key-pairs --key-names ${EC2_KEY_NAME}
```
```text:結果(例):
      An error occurred (InvalidKeyPair.NotFound) when calling the DescribeKeyPairs operation: The key pair 'ec2-handson' does not exist
```

このようにエラーになれば削除完了しています。
[JAWS-UG CLI] ACM入門 #9 ALBの削除

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-albの削除">第1項へ進んでください</A>。


0. 準備
=======

0.1. リージョンの決定
---------------------

今回はバージニアリージョン(us-east-1)で作業してください。

```bash:変数の設定:
export AWS_DEFAULT_REGION='us-east-1'
```

0.2. ロードバランサarnの変数への格納
---------------------

```bash:コマンド:
ELB_ARN=`aws elbv2 describe-load-balancers \
 --query LoadBalancers[].LoadBalancerArn --output text` && echo ${ELB_ARN}
```
```text:結果(例):
      arn:aws:elasticloadbalancing:us-east-1:777777777777:loadbalancer/app/elbv2-handson-lb/62e537f3a6cf6a47
```

0.3. ターゲットグループarnの変数への格納
---------------------

```bash:コマンド:
ELB_TG_ARN=`aws elbv2 describe-target-groups \
 --query TargetGroups[].TargetGroupArn --output text` && echo ${ELB_TG_ARN}
```
```text:結果(例):
      arn:aws:elasticloadbalancing:us-east-1:777777777777:targetgroup/elbv2-handson-tg/0bdd081084c558c8
```

0.4. セキュリティグループIDの変数への格納
---------------

```bash:コマンド:
SG_NAME="elbv2-handson-sg"
SG_ID=`aws ec2 describe-security-groups --group-names ${SG_NAME} \
 --query SecurityGroups[].GroupId --output text` && echo ${SG_ID}
```

```text:結果:
      sg-84f326f9
```





1. 片付け
=================

1.1. ロードバランサの削除
-----------------

ロードバランサを削除します。
関連づけられたリスナやルールも自動的に削除されます。

```bash:コマンド:
aws elbv2 delete-load-balancer --load-balancer-arn ${ELB_ARN}
```
```text:結果:
      返り値なし
```

1.2. ロードバランサが削除されたか確認
-----------------

```bash:コマンド:
aws elbv2 describe-load-balancers
```
```text:結果:
      {
          "LoadBalancers": []
      }
```


1.3. ターゲットグループの削除
-----------------

```bash:コマンド:
aws elbv2 delete-target-group --target-group-arn ${ELB_TG_ARN}
```
```text:結果:
      返り値なし
```

1.4. ターゲットグループが削除されたか確認
-----------------

```bash:コマンド:
aws elbv2 describe-target-groups
```
```text:結果:
      {
          "TargetGroups": []
      }
```

1.5. セキュリティグループの削除
-----------------

```bash:コマンド:
aws ec2 delete-security-group --group-id ${SG_ID}
```
```text:結果:
      返り値なし
```

1.6. セキュリティグループ削除の確認
-----------------

```bash:コマンド:
aws ec2 describe-security-groups --group-ids ${SG_ID}
```
```text:結果(例):
      An error occurred (InvalidGroup.NotFound) when calling the DescribeSecurityGroups operation: The security group 'sg-84f326f9' does not exist
```

このようにエラーになれば削除完了しています。
atom/windows10でエラーが文字化ける

# atomをインストール
- インストーラを使ってただインストール
- windows7でも試すが、エラーが文字化けることは無い。
- プラグインを消して試すが変わらず。
- アンインストール（.atomも削除）
- 再度インストールし、まっさらな状態から試すが、エラーが豆腐。
- 下記画像は、最初のエラー時。
![2016-11-05.png](https://qiita-image-store.s3.amazonaws.com/0/35048/ed04edbb-9ead-d600-d17d-f346d20c7d15.png)
- 未だに未解決。

- windows10が悪い？

## 解決策(2016/12/29)
- ようやくわかった。
 - atomの設定を行っている init.coffee
 - ![2016-12-29.png](https://qiita-image-store.s3.amazonaws.com/0/35048/425661a1-4d5a-5c7d-e54f-bc2c0beaf3d2.png)

- 以下の一文を追加。
- process.env.JAVA_TOOL_OPTIONS = '-Dfile.encoding=UTF-8'
- PHPやるのになんでJavaだ。そもそもエディタの設定だから言語関係ないだろ。とおもってやってなかった。
- やってみたら、文字化け治った。
- なんで？ｰ>わかりません。<ーイマココ
[JAWS-UG CLI] ACM入門 #5 S3によるWebコンテンツの作成

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-webコンテンツの作成">第1項へ進んでください</A>。

0. 準備
=======

0.1. ドメイン名の変数への格納
---------------

変数へドメイン名を格納します。
ここでは example.tk とします。自分のドメイン名に読み替えてください。

```bash:コマンド:
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
```

```text:結果(例):
      example.tk
```


1. Webコンテンツの作成
=================

S3バケットに配信を行うWebコンテンツを配置します。

1.1. コンテンツ配信用S3バケットの作成
-----------------

S3バケット名を www.ドメイン名 とします。（例: www.example.tk ）
同名のS3バケットが無いか確認します。

```bash:コマンド:
WEB_S3_BUCKET="www.${DOMAINNAME}"
aws s3 ls ${WEB_S3_BUCKET}
```
```text:結果:
      An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist
```

最後がdoes not existなら問題ありません。
違う内容の場合は１行目の www を他のものに適当に変更してやり直しましょう。

S3バケットの作成

```bash:コマンド:
aws s3 mb s3://${WEB_S3_BUCKET}
```
```text:結果(例):
      make_bucket: www.example.tk
```

1.2. コンテンツの配置
-----------------

今回はハンズオンのため index.html のみ作成します。

```bash:コマンド:
cat << EOF > index.html
<HTML>
<HEAD><TITLE>CLI GO!</TITLE></HEAD>
<BODY BGCOLOR=#FF0000><H1>CLI GO! GO! GO!!!</H1></BODY>
</HTML>
EOF
cat index.html
```
```text:結果:
      <HTML>
      <HEAD><TITLE>CLI GO!</TITLE></HEAD>
      <BODY BGCOLOR=#FF0000><H1>CLI GO! GO! GO!!!</H1></BODY>
      </HTML>
```

作成したコンテンツをS3バケットへコピーします。

```bash:コマンド:
aws s3 cp ./index.html s3://${WEB_S3_BUCKET}/ --acl public-read
```
```text:結果(例):
      upload: ./index.html to s3://www.example.tk/index.html
```

1.3. 静的ウェブサイトのホスティングを有効化
-----------------

ルートオブジェクトを index.html としてウェブサイトを有効化します。

```bash:コマンド:
ROOT_OBJECT="index.html"
aws s3 website "s3://${WEB_S3_BUCKET}" --index-document ${ROOT_OBJECT}
```
```text:結果:
      返り値なし
```
[JAWS-UG CLI] ACM入門 #4 ACMによるSSL証明書の作成

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-acmによるssl証明書の作成">第1項へ進んでください</A>。

前提条件
========

ドメインを取得済みであること。
SES Incomingで admin@ドメイン名 宛の電子メイルが受信可能になっていること。



0. 準備
=======

0.1. ドメイン名の変数への格納
---------------

変数へドメイン名を格納します。
ここでは example.tk とします。自分のドメイン名に読み替えてください。

```bash:コマンド:
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
```

```text:結果(例):
      example.tk
```

0.2. 電子メイル受信用S3バケットの変数
-----------------

S3バケット名を ドメイン名.sesincoming とします。
注：各自で違うバケット名を指定した場合はそれを指定してください。

```bash:コマンド:
SES_S3_BUCKET=${DOMAINNAME}.sesincoming
echo ${SES_S3_BUCKET}
```
```text:結果(例):
      example.tk.sesincoming
```



1. ACMによるSSL証明書の作成
=================

SSL証明書をCloudFrontで使用する場合は us-east-1 リージョンに作成する必要があります。
ACMによるSSL証明書は作成したリージョンでのみ使用可能で、リージョンを跨ぐことはできませんから注意が必要です。
このため、以下の手順ではコマンドラインにリージョンを明示しています。
今回は example.tk と www.example.tk の両方でアクセスできるSSL証明書を作成します。

1.1. 証明書作成要求
-----------------

```bash:コマンド:
CERT_ARN=`aws acm request-certificate --domain-name ${DOMAINNAME} \
 --subject-alternative-names www.${DOMAINNAME} \
 --region us-east-1 --output text` && echo ${CERT_ARN}
```
```text:結果(例):
      arn:aws:acm:us-east-1:777777777777:certificate/9eb6865a-63a3-48df-92c2-ae113c877b33
```

証明書のARNが取得されますが、まだ使用する事はできません。
ドメイン所有確認の電子メイルが自動送信されるので、これを確認します。

1.2. ドメイン所有確認
-----------------

先ほど設定したS3バケットに電子メイルが届いているのでこれを取得します。

```bash:コマンド:
aws s3 ls ${SES_S3_BUCKET}
```
```text:結果(例):
      2016-10-12 17:10:36      10203 2kjfjklew90fjklfk4od0wpkgit9fk9jfdkdfi9z
      2016-10-12 17:10:34      10170 4krul2vjrqniql7p11470po8fedf3ifjniegsc01
      2016-10-12 16:55:30        645 AMAZON_SES_SETUP_NOTIFICATION
```

長い無機質な名前の物が届いた電子メイルです。
この名前をコピーペーストし MAIL_FILENAME 変数へ格納します。
（注：複数個存在する場合、「ファイルサイズの小さい方」を選択してください）
ファイルをローカルへコピーします。

```bash:コマンド:
MAIL_FILENAME="4krul2vjrqniql7p11470po8fedf3ifjniegsc01"
aws s3 cp s3://${SES_S3_BUCKET}/${MAIL_FILENAME} ./
```
```text:結果(例):
      download: s3://example.tk.sesincoming/4krul2vjrqniql7p11470po8fedf3ifjniegsc01 to ./4krul2vjrqniql7p11470po8fedf3ifjniegsc01
```

電子メイル本文中に認証用のURLがあるため、これを抽出します。

```bash:コマンド:
grep https ${MAIL_FILENAME} | grep context
```
```text:結果(例):
      https://certificates.amazon.com/approvals?code=8342b457-0f14-4234-b512-80488e3d2d12&context=0d7739c8-7045-4576-ac37-cf9829a3007d-75732d776573742d32
```

WebブラウザでこのURLを開き、 I Approve をクリックします。
Success! と表示されたら認証完了です。


1.3. 証明書の発行確認
-----------------

証明書が発行されたか確認します。

```bash:コマンド:
aws acm describe-certificate --certificate-arn ${CERT_ARN} \
 --region us-east-1 --query Certificate.Status
```
```text:結果(例):
      "ISSUED"
```

ISSUED と表示されれば発行済みです。

各種サービスで変数 CERT_ARN へ格納されたarnを指定すればSSL証明書を使用することができます。
Bootstrap Tab で任意のイベントでタブ遷移

jQueryで任意のイベントを検出し, ```$('.nav-tabs a[href="#タブ名"]').tab('show');```を呼べばOK.

~~~html:html
 <!-- タブ -->
 <div>
   <ul class="nav nav-tabs center">
     <li class="active">
       <a href="#main" data-target="#main" data-toggle="tab">
         基本情報
       </a>
     </li>
     <li>
       <a href="#access" data-target="#access" data-toggle="tab">
         アクセス
       </a>
     </li>
   </ul>
 </div>

 <!-- 各タブのなかみ -->
 <div class="tab-content">
   <div role="tabpanel" class="tab-pane active fade in" id="main">

     （省略）

     <button id="change-to-access-tab" class="btn btn-primary">タブを切り替えるボタン</button>
   </div>
   <div role="tabpanel" class="tab-pane fade in" id="access">

     （省略）

   </div>
 </div>

 <!-- jQuery -->
 <script>
 $(function() {
   // ボタンクリックでタブを切り替え
   $('#change-to-access-tab').click(function(e) {
     $('.nav-tabs a[href="#access"]').tab('show');
   });    
 });
 </script>
~~~
VSCodeのthemeを作ってMarketPlaceで公開まで

[Visual Studio Code Themes](https://code.visualstudio.com/Docs/customization/themes#_creating-a-custom-theme)

# yoを使って雛形を生成

[The Yo Code Visual Studio Code Extension Generator](https://code.visualstudio.com/docs/tools/yocode)

`yo`と`generator-code`をnpmでinstall

```
npm i -g yo generator-code
```

雛形を生成

```
yo code
```

New Color Themeを選択する

![](https://code.visualstudio.com/images/yocode_yocode.png)

Themeの雛形をURLで渡せるので今回は[vscode-extension-samples/Sample_Light.tmTheme at master · Microsoft/vscode-extension-samples](https://github.com/Microsoft/vscode-extension-samples/blob/master/theme-sample/Sample_Light.tmTheme)を使う。[Colorsublime](http://colorsublime.com/)とかでもよい。

あとは聞かれるままにthemeの名前等を埋める。


# localでthemeをvscodeに追加する

`~/.vscode/extensions`にyoで生成したディレクトリを突っ込むだけ。あとはVSCode上からいつも通りにthemeを適用するのと同じ。

# themeを編集する

yoで生成した場合、theme/XXX.tmThemeファイルが生成されるのでそれを編集する。

有効なオプションはtextmateに従えばよいのだが、これがイマイチわかりにくくて手探りで泥臭く雛形に適用しながら作っていった。もっとスマートな方法がほしい。

### 有効なオプションの資料

[Creating a Custom Theme](https://code.visualstudio.com/Docs/customization/themes#_creating-a-custom-theme)
[TextMate Manual » Language Grammars](http://manual.macromates.com/en/language_grammars#naming_conventions)

sublime textのdocumentもいいヒントになった。

[Scope Naming – Sublime Text 3 Documentation](https://www.sublimetext.com/docs/3/scope_naming.html#entity)

textmateのテーマを作るツール。これで生成してないけど、対応するオプションを知るのに役立った。

[Monokai • TmTheme Editor](https://tmtheme-editor.herokuapp.com/#!/editor/theme/Monokai)


# Marketplaceにpublishする

[vsce Publishing Tool - Publishing your Visual Studio Code Extensions](https://code.visualstudio.com/docs/tools/vscecli)

`vsce`というpublish toolを使うらしい。

```
npm install -g vsce
```

`vsce`でpublishするには[Visual Studio Team Services](https://www.visualstudio.com/ja-jp/docs/setup-admin/team-services/sign-up-for-visual-studio-team-services)に登録してAccess Tokenを得る必要があるので適当に登録する。


publisherを登録

```
vsce create-publisher (publisher name)
```

プロジェクトルートに移動してpublishする

```
vsce publish
```

# 成果物

[Harmonic16 light Theme - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=cotto.theme-harmonic16-light)

[cotto89/vscode-theme-harmonic16-light: VSCodeTheme base on base16-harmonic16-light](https://github.com/cotto89/vscode-theme-harmonic16-light)
[JAWS-UG CLI] AWS Certificate Manager (ACM)入門

こちらは
<A HREF="https://jawsug-cli.doorkeeper.jp/events/41913" target=_blank>JAWS-UG CLI専門支部 #68 AWS Certificate Manager (ACM)入門</A>
で使用するハンズオン資料になります。


目的
===========

AWSの無料SSL証明書発行サービスでありますACMを中心に、これを利用して各種サービスを体験します。
・無料でドメイン名を登録する
・Route53へ登録したドメインを設定する
・SES incomingでドメイン宛の電子メイル受信環境を構築する
・ACMによるSSL証明書を作成する
・S3によるWebコンテンツを作成
・CloudFrontでACMとS3コンテンツを用いHTTP/2配信環境を構築する
（以下２件は時間が余った人用）
・EC2によるWebコンテンツを作成
・ALB(Application Load Balancer)でACMとEC2を用いHTTP/2配信環境を構築する
以上を目的とします。


無料利用枠について
===========

今回利用するサービスのうち、Route53には無料利用枠がありません。
月額料金(USD0.5/ホストゾーン)は、作成から6時間以内に削除すれば発生しないのでこれは無料で利用可能です。
しかし、DNSクエリ料金は一度でもDNSが参照されると課金対象となるため、数十円の料金が発生することをご承知置きください。


ハンズオン目次
===========

1. 無料でドメイン名を登録する
http://qiita.com/zakky/items/a1ff8af60415e05956e4

2. Route53とSESによるドメイン利用環境の準備
http://qiita.com/zakky/items/a4dcb8c58dd2ff2dcc54

3. SES incomingの設定
http://qiita.com/zakky/items/7df36756d65926f0f62f

4. ACMによるSSL証明書の作成
http://qiita.com/zakky/items/c4c25ab935a7cd568b72

5. S3によるWebコンテンツの作成
http://qiita.com/zakky/items/08cd6bb60f73bc104915

6. CloudFrontによるACMを用いたS3コンテンツのHTTP/2配信環境の構築
http://qiita.com/zakky/items/cbecb880c7e5f2f0b74f

7. （時間が余った人用）EC2によるWebコンテンツの作成
http://qiita.com/zakky/items/575aefd703488208a1a6

8. （時間が余った人用） ALBでACM証明書を用いたHTTP/2配信環境の構築
http://qiita.com/zakky/items/cd6020783bc824acd42e

（片付け）

9. （時間が余った人用）ALBの削除
http://qiita.com/zakky/items/c10fb1fcb66b97982959

10. （時間が余った人用）EC2インスタンスの削除
http://qiita.com/zakky/items/fb707a49e596ed9b7a17

11. CloudFrontの削除
http://qiita.com/zakky/items/75ba82f70b6ce8ba32fe

12. S3ウェブコンテンツの削除
http://qiita.com/zakky/items/b32b381e3773fb143f51

13. ACM証明書の削除
http://qiita.com/zakky/items/07f64da8c4b92fe469ad

14. SESの削除
http://qiita.com/zakky/items/7dcfc6c513f24d1a1b37

15. Route53の削除
http://qiita.com/zakky/items/0eabd46d1010245573d9
Ubuntu 14.04 LTS > pandas > No module named pandas > easy_install pandasで対応した

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
以下のOSのdual boot
---
Windows 8.1 pro (64bit)
---
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
```

Jupyterにてpandasを使おうとしていたが、以下のエラーが出た。

> No module named pandas

以下を試した

- sudo apt-get install pandas
- sudo pip install pandas

上記でpandasがインストールされたようだが、moduleが見つからないエラーは出る。

以下を試した。

```
easy_install pandas
```

エラーがでなくなった。

pipやeasy_installなどについてはまだよく分かっていない部分が多い。
正しい対処かは不明。
Chrome デベロッパーツールを開いているとPOST再送ダイアログが表示されない

# Chrome デベロッパーツールを開いているとPOST再送ダイアログが表示されない

題名の通りで、特筆すべきことは何もないんですが…。

```html:hoge.html
<form method="post">
<input type="text" name="hoge">
<input type="submit" value="ok">
</form>
```

このようなシンプルな html を適当な web サーバに置いて submit 後に F5してみると再現できます。
（何の警告もなくPOST再送される）

http://stackoverflow.com/questions/25527260/chrome-dev-tools-ignores-form-re-submit-warning

で「そっちのほうが便利じゃね？」って感じで推測されてるけど結構有名なのかな？
個人的には全然知らんくて「なんでだー」って感じで10分程度ハマったので備忘録として残しておきます。
Nginx - CSSファイルが更新されない時の対応について


以前CSSファイルが更新されないという減少が発生した時の対応となります。

### 原因
- Nginxで「sendfile on;」というパラメータが有効になっていた。

このパラメータを有効にしていると、kernelのシステムコール「sendfile」を使用して、kernel内にファイルを複写するようです。

### 対応
```
vi /etc/nginx/nginx.conf
---
    sendfile off;
---
sudo service nginx restart
```

デフォルトはoffのよう。いつ設定されたのかは不明。。。

### ※参考
- [IT Notebook](http://makaaso.hatenablog.com/entry/2016/11/05/160321 "IT Notebook")
エラー判定 （ファイルが見つかりません）


判定コード

```go
	data, err := ioutil.ReadFile(filePath)
	if err != nil {
		switch err.(type) {
		case *os.PathError:
			// ファイルが見つからない
		default:
			// その他のエラー
		}
	}
```

どのエラーが判定しているか確認するコード

```go
t := reflect.TypeOf(err)
println("error: ", t.String())
```

実行結果

```
error:  *os.PathError
```
Windows版stackでもHDBC-sqlite3をビルドする

試した環境:

- Windows 10 Home 64bit (ver. 1607)
- stack v1.0.4
- LTSHaskell 7.5

(Bash for Windowsは使ってません)

# うまくいかなかった方法

MSYS2を使っているので、

とりあえず、

```
pacman -S sqlite
```

したうえで、
cabalファイルにHDBC-sqlite3を書いたプロジェクトで

```
stack install
```

するも

```
Process exited with code: ExitFailure 1
Logs have been written to: C:\Users\Yuji\Dropbox\prg\prj\shioyaki\.stack-work\logs\HDBC-sqlite3-2.3.3.1.log
Configuring HDBC-sqlite3-2.3.3.1...
setup-Simple-Cabal-1.24.0.0-ghc-8.0.1.exe: Missing dependency on a foreign
library:
* Missing C library: sqlite3
This problem can usually be solved by installing the system package that
provides this library (you may need the "-dev" version). If the library is
already installed but in a non-standard location then you can use the flags
--extra-include-dirs= and --extra-lib-dirs= to specify where it is.
```

と怒られる。
上記のメッセージの通り
`--extra-include-dirs=`と`--extra-lib-dirs=`なるオプションがあるそうなので、msys2のインストールディレクトリーをあさるも、それらしいDLLやヘッダーファイルが見当たらない。

# うまくいった方法

やむを得ず[Programming Notes: WindowsにHaskell HDBC-sqlite3のインストール](http://znatz.blogspot.jp/2013/01/windowshaskell-hdbc-sqlite3.html)を参考に[SQLite本家のサイト](http://www.sqlite.org/download.html)からWindows用のDLL(sqlite-dll-win64-x64-3150100.zip)とヘッダーファイル(sqlite-amalgamation-3150100.zip)をとってきて、それぞれを`C:\sqlite`ディレクトリーに展開。

その上で

```
stack build --extra-include-dirs="C:\sqlite" --extra-lib-dirs="C:\sqlite"
```

と実行したらインストールできた模様。

# TODO

`stack build`するたびに毎回上記のオプションを指定するのはかったるいので、方法を別途検討する。

追記: よく見たら `stack.yaml ` に同名の項目があった。`stack new`などしたら出てくるデフォルトの`stack.yaml`にも、次のようにコメントアウトされて書いてあるはず。

```yaml
# Extra directories used by stack for building
# extra-include-dirs: [/path/to/dir]
# extra-lib-dirs: [/path/to/dir]
```

ただしこれはフルパスでないといけないので、プロジェクトディレクトリーのどこかに置きたい、みたいなケースではやっぱり`stack build`をラップしたコマンドを作る必要があるだろう。
まぁ、作ればいいだけの話だけど。
ニフティクラウド IoTデバイスハブにイベントを送信するChoregrapheのboxサンプル

[特大ペッパソン2016](https://mashupawards.doorkeeper.jp/events/53065) 用のメモ

## ニフティクラウド IoTデバイスハブ とは

[クラウド 機能・サービス（IoTデバイスハブ） \| ニフティクラウド](http://cloud.nifty.com/service/iot_device_hub.htm)　より

> ニフティクラウド IoTデバイスハブは、IoTデバイスのクラウド接続、デバイス/ユーザーの管理など、IoTデバイスの運用に必要なバックエンド機能をクラウドで提供いたします。

デバイスからMQTTやREST API経由でイベントデータを蓄積したり、
アプリからデバイスを操作するためにコマンドを送信したり、
それをスマートモジュールと連携して他サービスと組み合わせたりして
IoTサービスを始めるときのバックエンドとして活用できるクラウドサービスです。

![IoTデバイスハブ概要](http://cloud.nifty.com/service/images/iot_device_hub01.png)

提供されているSDKは以下の通りです。

- モバイル向け: iOS / Android
- デバイス向け: Node.js / C++ / Texas Instruments CC3200 / Android

SDKが提供されていない言語でも、[ドキュメント](http://cloud.nifty.com/guide/iot_device_hub/)を読めば簡単にAPI経由でのイベント送信ができます
（ざっくりいうと、headerにAPIキーを付与するくらいです）

ということで、Choregrapheを使ってPepperくんアプリを開発するときは、
どうやってイベントデータ送信のboxを作ればいいかやってみました

## 準備するもの

- choregraphe
- requestsモジュール
 - [pepperに外部モジュール追加してみる。とりあえずrequestsで。 \- Qiita](http://qiita.com/n0bisuke/items/5b782bb758ce5611cc90)を参考に、choregrapheプロジェクトのlibフォルダにインストール
- ニフティクラウド IoTデバイスハブのプロジェクト
 - [クラウドユーザーガイド（IoTデバイスハブ：プロジェクトの作成） \| ニフティクラウド](http://cloud.nifty.com/guide/iot_device_hub/create_project.htm) を参考にプロジェクト、デバイスクラス、デバイスを追加してください
 - 追加したデバイスのクレームモードを有効にしてください

## pythonのコードサンプル

以下のコードがrequestsモジュールを利用してAPI経由でイベント送信を行うものです。

- ヘッダーに認証情報を設定してください
- イベント送信用のエンドポイントにはデバイスIDを指定する必要があります
- `_YOUR_API_KEY_` / `_YOUR_DEVICE_ID_`は、デバイス作成時に表示されるものに書き換えてください
- イベント送信はputメソッドで行います


```python
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.framemanager = ALProxy("ALFrameManager")
        self.folderName = None

    def onUnload(self):
        import sys
        if self.folderName and self.folderName in sys.path:
            sys.path.remove(self.folderName)
        self.folderName = None

    def onInput_onStart(self):

        #libフォルダにあるライブラリをパスに追加する
        import sys, os
        self.folderName = os.path.join(self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
        if self.folderName not in sys.path:
            sys.path.append(self.folderName)

        import json
        import requests

        #デバイスハブに送信するデータ
        payload={ 'eventType':'foo', 'eventData': {'text':'value'}}

        #ヘッダー情報
        headers={'Authorization':'ModeCloud _YOUR_API_KEY_', 'Content-Type':'application/json'}

        #イベント送信を行う
        r = requests.put('https://iot-device.jp-east-1.api.cloud.nifty.com/devices/_YOUR_DEVICE_ID_/event', data=json.dumps(payload), headers=headers, verify=False)

        if r.status_code == 204 :
            self.logger.info("success")
        else:
            self.logger.info(r.json())


    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()

```
Rails + Google map でマップ表示

1） Gemのインストール
---

~~~rb:Gemfileに追加
# Google map
gem 'gmaps4rails'  # railsでGoogle mapを使えるようにする
gem 'geocoder'     # 地名から緯度経度を引けるようにする
~~~

~~~sh:コマンド実行
bundle install
~~~

2） 緯度経度カラムをもつモデルを作成
---

新しくモデルを作成しても良いし, 既存のモデルにカラムを追加してもよい. 以下は後者の例. Spotモデル(観光地を表すモデル)に緯度経度を追加.

~~~sh:コマンド実行
rails generate migration add_columns_to_spots latitude:float longitude:float
bundle exec rake db:migrate
~~~

3） 緯度経度を計算し保存
---

地名を緯度経度に変換してくれるgem ```geocoder```によって, 任意のタイミングで緯度経度を得ることができる. 住所カラムをもつモデルに対しては, 通常, 住所が変更されるたびに緯度経度を更新すべきだ. したがって, modelファイルに以下のようなコールバックを書くのが良い.

~~~rb:model/spot.rbを以下のように更新
class Spot < ActiveRecord::Base
  before_save :geocode_full_address

  def geocode_full_address
    coords = Geocoder.coordinates(
      self.prefecture + self.city + self.address # 県名 + 市町村名 + 丁目番地
    )
    self.latitude = coords[0]
    self.longitude = coords[1]
  end
end
~~~


4) API Keyの取得
---

https://developers.google.com/maps/documentation/javascript/get-api-key

5) ＜script＞タグ挿入
---

~~~html:application.html.erbのhead内に追加
  <script src="//maps.google.com/maps/api/js?key=[*******************]"></script>
  <script src="//cdn.rawgit.com/mahnunchik/markerclustererplus/master/dist/markerclusterer.min.js"></script>
~~~

6) Underscore.jsの追加
---

underscore.jsと依存関係にあるらしい. 以下の中身をすべてコピーし, ```app/assets/javascripts/underscore.js```に貼り付け.
http://underscorejs.org/underscore-min.js


~~~javascript:app/assets/javascripts/underscore.jsを新規作成
// 上のリンクを開いて出てくるソースを貼る
~~~

その後, underscore、gmaps/googleをapplicaton.jsに追加する.

~~~javascript:app/assets/javascripts/application.jsに追加
//= require underscore
//= require gmaps/google
~~~

7） Viewを編集
---

好きなところにマップ用のdivを追加

~~~html:hogehoge.html.erbの任意の場所に追加
 <div style='width: 100%;'>
   <div id="map" style='width: 100%; height: 33vh;'></div>
 </div>
~~~

~~~html:hogehoge.html.erbの末尾に追加
<script type="text/javascript">
  handler = Gmaps.build('Google');
  handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
    markers = handler.addMarkers([
      {
        "lat": <%= @spot.latitude %>,
        "lng": <%= @spot.longitude %>,
        "picture": {
          "width":  32,
          "height": 32
        },
        "infowindow": '<%= @spot.name %>'
      }
    ]);
    handler.bounds.extendWith(markers);
    handler.fitMapToBounds();
    handler.getMap().setZoom(15);
  });
</script>
~~~

以上！
四則演算を行う


ここではSQLで四則演算を行う方法を紹介します．四則演算には加算（+），減算（-），乗算（*），除算（/）があります。

レコードの同士を足すことが可能です。

```
SELECT 別名テーブル.レコードA + 別名テーブル.レコードB AS 別名レコードAとBの合算値 FROM 別名テーブルの参照元 別名テーブル;
```
PyCharmによるDjango入門

Pythonもあまり触ったこともなくかなりの初心者なんですが、すこしずつ勉強して行こうと思います。

[Djangoチュートリアル](https://docs.djangoproject.com/ja/1.10/intro/)

を参考にしながら進めていきます。

#開発環境

- OS: Windows10
- IDE: PyCharm
- Python 3.4.4
- Django 1.10.3


#プロジェクト作成

Pythonはすでにインストール済みという前提で進めていきます。

Pycharmを起動　＞　New Project　＞　Djangoを選択

"Location"と"Interpreter"を決めたら"Create"ボタンでプロジェクトが作成されます。

このときDjangoがインストールされていなくても自動でインストールされます。


PyCharmで作成したばかりのプロジェクトは"mysite"という名の場合下記のように表示されているはずです。

- mysite/
    - templates
    - mysite/
        - \_\_init\_\_.py
        - settings.py
        - urls.py
        - wsgi.py
    - db.sqlite3
    - manage.py

それぞれのファイルについての説明は[はじめての Django アプリ作成、その 1](https://docs.djangoproject.com/ja/1.10/intro/tutorial01)にあるので割愛します。


#開発サーバー起動

PyCharmからの起動は単純でエディターの右上にある"Run"ボタンをクリックするだけでサーバーが立ち上がります。

Terminalからの起動は

`C:/.../mysite/manage.py runserver ポート番号`

でもいけます。

すると、

```
.
.
Django version 1.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
```

このようなものが表示され、そこにアクセスすると"It worked!"というページが表示されます。
これで無事に開発用サーバーが立ち上がりました。


#アプリケーション作成

それではPyCharmからmange.pyタスクを利用してアプリケーションを作ります。

Tools > Run mange.py Task...(Ctrl+Alt+R)

でエディタ下にmange.pyタスクコマンドツール的なものが出てきます。

```
manage.py@mysite>

```

これはTerminalで`python manage.py コマンド`を行うのと同じものでショートカットを覚えておけばいちいち`python manage.py`をTerminalで毎回タイプしなくてもよくなります。

それではアプリケーション"polls"を自動生成するコマンドは

```
manage.py@mysite>startapp polls

```

これでmanage.pyと同じディレクトリに

- polls/
    - migrations/
        - \_\_init\_\_.py
    - \_\_init\_\_.py
    - admin.py
    - apps.py
    - models.py
    - tests.py
    - views.py

が作られます。


#まとめ

このようにしてPyCharmでより簡単にDjangoプロジェクト開発を進めることができます。

この後のビュー作成などはチュートリアルに従っていけばうまくいくはずです。
Railsでコンソールを使ってDBをいじる

1） rails c の場合
---

rails cでrailsのコンソールに入れる. コンソールに入ったら, 各モデルのメソッドを使ってDB検索などができる.
例

~~~sh
User.all
=> SELECT `users`.* FROM `users`
~~~

メソッドはこちらにまとまってる
http://qiita.com/tono0123/items/576a4a4659b51860f304

2） rails db の場合
----

rails db でDBのクライアントをコンソール画面でいじれるようになる. DBのクライアントなので, SQL文が使える.
例

~~~
SELECT * FROM USERS;
~~~

以上.
Railsでgmailでメールを送ろうとしたけどsmtp認証のエラーが出て詰まった時の解決方法

何回かActionMailerでユーザが登録してからメールが送られるようにしようとしました。いろいろ調べてなかなか解決できなかったけどやっとできたんで、自分がどんな風にgmailやRailsを設定して解決できたかを簡単に書いておきたいなと思いました。

ところで、herokuでデプロイしています。

#解決方法
1. config/environments/production.rbなどの設定
2. gmailの二段階認証の設定
3. その他のセキュリティの設定


##config/environments/production.rbなどの設定
```ruby:production.rb
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
host = 'website.com'
config.action_mailer.default_url_options = { host: host }
# development.rbだと、上の２行じゃなくて下の一行
# config.action_mailer.default_url_options = {  host: 'localhost', port: 3000 }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address => "smtp.gmail.com",
  :port => 587,
  :user_name => ENV["EMAIL_HIDDEN"],
  :password => ENV["PASSWORD_HIDDEN"],
  :authentication => :plain,
  :enable_starttls_auto => true
}
```

環境変数の`ENV["EMAIL_PASSWORD"]`とかを設定するには<a href="https://github.com/laserlemon/figaro" target="_blank">figaro</a>というgemを使います。gmailのアカウントの情報をここで設定します。
（figaroの使い方を省きます）


herokuを使っていたら、
`$ heroku config:set EMAIL_HIDDEN=メール`
という風に環境変数を設定してください。

自分のgmailとそのアカウントのパスワードを設定すると、自分にメールを送れるようになります。ただ、他人はブロックされますね。

##gmailの二段階認証の設定
じゃあ、他人にメールを送るにはどうしたらいい？
今まで、gmailの二段階認証が有効にしていなかったら、有効にしてください。

gmailのnavbarの９つの銀色の四角のdropdownを押して、アカウントをクリックします。
「ログインとセキュリティ」の「Googleへのログイン」をクリックします。
「２段階認証プロセス」を押して、手続きに従います。
それができたら、「２段階認証プロセス」の下にある「アプリ パスワード」でパスワードを取得してください

<strong>このパスワード</strong>を環境変数として設定してください！！（空白なしで）
つまり、上にあったproduction.rbの`ENV["EMAIL_PASSWORD"]`は取得したパスワードに変更しないとダメです。

これで、gmailの方では自分のサイトが使えるアプリケーションとして登録されて、メールのパスワードじゃなくてそのアプリケーションの独特のパスワードを経由してメールを送るようになります。

##その他のセキュリティの設定
私が詰まったところは上の二段階認証の設定だったけど、次の設定も必要みたいです。

・正直はよく分からないけど、<a href="https://accounts.google.com/b/0/DisplayUnlockCaptcha">このリンク</a>でGoogleへのアカウントを許可します。

###次の２つは必要かどうかは分からないけど、特に１番目をやってみた方がいいと思います。
1. これも正直は関係するかどうかは分からないけど、これもいじりました。gmailのアカウントの受信トレイの画面で歯車のボタンを押して「設定」を押します。「メール転送とPOP/IMAP」のタブを押して、IMAPを有効にしてください。![imap.png](https://qiita-image-store.s3.amazonaws.com/0/74313/6029a1cd-9293-a537-50a3-af2f27f826f4.png)

2. 2段階認証が設定してあると使えないみたいだけど、これも関係するらしいです。<a href="https://www.google.com/settings/security/lesssecureapps">安全性の低いアプリ</a>：ここで、設定を「オン」にします。上の対応でメールが送られなかったら、一回二段階認証を外してからやってみてもいいのかもしれません。

###まとめ
はっきりと<strong>これだ！</strong>って言えなくてすみませんが、とにかく上の対応で解決できました。
簡単に言えば、
1. gmailの方で二段階認証で作成したパスワードを環境変数として設定すること
2. その他のgmailのセキュリティを変更すること
Railsでデータベースを初期化

DBを初期化するには、```app/db/seeds.rb```に以下のように書いて

~~~rb:app/db/seeds.rb
10.times do
  Spot.create(
    name: '増上寺',
    description: '東京タワーに近い',
    region: '関東',
    prefecture: '東京都',
    city: '港区',
    address1: '芝公園４−７−３５',
    address2: ''
  )
end
~~~

以下のように```db:seed```を実行。

~~~sh
bundle exec rake db:seed
~~~

以上
JavaScriptのフックパターンの楽な書き方

JavaScriptでコアスクリプトのファイルを直接いじらずに
別ファイルから既存の関数に機能追加するのがフックパターン。
プラグインを作る際に頻出ですね。

#従来の（苦しい）書き方

```js
var _Class_method = Class.prototype.method;
Class.prototype.method = function() {
	_Class_method.apply(this, arguments);	//元の関数
	console.log('プラグインで処理挿入～');	//追加処理
};
```

よし、ちょっと面倒だけど仕方ないな。
この調子でもういっこ…コピペして改変するか。

```js
var _Class_method2 = Class.prototype.method;	//←あー！！！！！１１１
Class.prototype.method2 = function() {
	_Class_method2.apply(this, arguments);	//元の関数
	console.log('別の関数に別の処理挿入～');	//追加処理
};
```

…一箇所書き換え忘れてしまったようですね。
しかもこれエラー出ないから見つけづらい。

#新しい（ナイスな）書き方

４回もclass_methodほにゃらら～みたいな呪文を唱える書き方が悪いのです。
フックパターンそのものを関数化しましょう。

```js
function hook(baseClass, target, addition) {
	if (baseClass.prototype[target]) baseClass = baseClass.prototype;
	else if (!baseClass[target]) throw new Error('フック先が無いんですけど！');
	var origin = baseClass[target];
	baseClass[target] = function() {
		arguments[arguments.length] = origin;
		arguments.length++;
		return addition.apply(this, arguments);
	};
}
```

仕組みは追って説明しますが、とりあえず使い方は以下。

```js
hook(Class, 'method', function() {
	var origin = arguments[arguments.length - 1];
	origin.apply(this, arguments);	//元の関数
	console.log('プラグインで処理挿入～');	//追加処理
});
```

バ…バカな…　か…簡単すぎる…　あっけなさすぎる…

４回もあった面倒くさい呪文が１回ぽっきりに減りました。
しかも万が一メソッド名を間違えた時は即座にエラーを吐いてくれる！
(var originとかいう謎の呪文が増えてますがそれは目をつぶってねお願いです)

#解説

まずhook関数を解説していきます。
引数はbaseClassがフックしたいメソッドの存在するクラス、
targetがフックしたいメソッドの名前、additionが新たな関数です。

```js
if (baseClass.prototype[target]) baseClass = baseClass.prototype;
else if (!baseClass[target]) throw new Error('フック先が無いんですけど！');
```

一行目ではまずtargetという名前のメソッドがプロトタイプにあるか調べ、
存在すればプロトタイプをフックの対象に設定しています。
よくわからなければ「静的メソッドと動的メソッドの両方に対応している」とご理解ください。
特にRPGツクールMVではXxxManager系の静的クラスに
フックしたいこともよくあるので、この記述は私的には必要ですね。

二行目は静的メソッドと動的メソッドのどちらも存在しなかった時にエラーを吐きます。

```js
var origin = baseClass[target];
baseClass[target] = function() {
	arguments[arguments.length] = origin;
	arguments.length++;
	return addition.apply(this, arguments);
};
```

フックの本体。よく見ると最初に出てきた例と似たような記述であることがわかりますね。

ただ目新しいのがargumentsに関する記述。
これは何をしているかというと引数リストの末尾に、元の関数を加えているのです！
（`arguments.push(origin)`としたかったのですが、argumentsにはpushメソッドが生えていないようです）
他にreturnという記述がさりげなく増えてますが、戻り値が存在する関数に対応したまでです。

これにより、新しく作るaddition関数から元の関数を好きなタイミングで呼び出すことが出来ます！
先フックだろうが後フックだろうが引数があろうが戻り値があろうが自由自在ですね！

```js
hook(Class, 'method', function() {
	var origin = arguments[arguments.length - 1];
	origin.apply(this, arguments);	//元の関数
	console.log('プラグインで処理挿入～');	//追加処理
});
```

再掲ですがフック側。ここで問題なのはvar originです。
こんな回りくどい書き方をしなくても引数の末尾のoriginを直接受け取ればいいじゃん、
と思われるかもしれませんが、それではダメなパターンがあります。
そう、同じメソッドへの**多重フック**です。

何回もフックしていくと引数の末尾にorigin1,origin2とどんどん関数が増えていくので、
それぞれの関数の**その場で最後尾の関数**を正しく選び出さないと無限ループを起こします。
そのためのおまじないがvar originの一行なわけです。

「結局おまじないかよ！」と思うかもしれませんが、
元々の**４箇所書き換えないと失敗、しかもエラーは出ない**と比べると
**１箇所書き換え、おまじないは一行そのままコピペ、しくじったらエラーが出る**では
全然使用感が違うと思います。ってか違います。

**・呼び出し側で引数が省略されたらどうするの？**
…ただし引数の末尾に元の関数を加えていくという荒業なので
呼び出し側が引数を省略しだしたりすると破綻がちらついてきます。
ちなみにRPGツクールMVでは`Game_Party.prototype.hasItem`と
`Window_Command.prototype.addCommand`の２つの関数で引数省略が前提の処理があります。
この２つではhook関数を作ったフックはやめておきましょう。

…というわけでJavaScriptのフックパターンを楽で失敗なく
書けるようにする関数を考えついたので紹介してみました。
これでプラグインが作りやすくなると思うので、みんなもツクール買ってプラグイン作ろう！