OmniAICreator/Qiita-1.07M huggingface dataset:
[JAWS-UG CLI] IoT #6 モノへのデバイス証明書のアタッチ

物理デバイスが AWS IoT と通信するには、X.509 証明書が必要になります。

Thing Registry 内でデバイスを表しているモノと、デバイスの証明書を関連付けることができます。


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


IoTへの権限
-----------

AWS IoTに対してフル権限があること。


AWS CLI
-------

以下のバージョンで動作確認済

- AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


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

```bash:変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       iotFull-handson-mbpr13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION
```


0.3. 証明書IDの指定
-------------------

```bash:コマンド:
aws iot list-certificates \
        --query 'certificates[].certificateId'
```

```json:結果(例):
      {
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
```

```bash:変数の指定:
IOT_CERT_ID='<利用する証明書の証明書ID>'
```

ARNを取得します。

```bash:コマンド:
IOT_CERT_ARN=$( \
        aws iot describe-certificate \
          --certificate-id ${IOT_CERT_ID} \
          --query 'certificateDescription.certificateArn' \
          --output text \
) \
        && echo ${IOT_CERT_ARN}
```

```text:結果(例):
      arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```


## 0.4. モノ名の指定

```bash:コマンド:
IOT_THING_NAME="handson-thing-$( date '+%Y%m%d' )"
```


1. 事前作業
===========

```bash:コマンド:
aws iot list-thing-principals  \
        --thing-name ${IOT_THING_NAME}
```

```json:結果:
      {
          "principals": []
      }
```


2. モノに証明書をアタッチする
=============================

```bash:変数の確認:
cat << ETX

        IOT_THING_NAME: ${IOT_THING_NAME}
        IOT_CERT_ARN:   ${IOT_CERT_ARN}

ETX
```

```bash:コマンド:
aws iot attach-thing-principal \
        --thing-name ${IOT_THING_NAME} \
        --principal ${IOT_CERT_ARN}
```

```text:結果(例):
      (戻り値なし)
```


3. 事後作業
===========

```bash:コマンド:
aws iot list-thing-principals  \
        --thing-name ${IOT_THING_NAME}
```

```json:結果(例):
      {
        "principals": [
          "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        ]
      }
```


完了
====
seq を ruby で ( シリーズ: Ruby ワンライナ ちょっとずつ 2 )



sed や tr を捨てたいのでちょっとづつ Ruby ワンライナを学ぶ．

# 参考

- http://maeharin.hatenablog.com/entry/20130113/ruby_oneliner
- http://takuya-1st.hatenablog.jp/entry/2013/08/19/194819
- http://qiita.com/bash0C7/items/749e60ff770b2e465b5e
- http://d.hatena.ne.jp/zariganitosh/20131107/ruby_oneliner_omission

# これまで

```
$ seq 1 5

1
2
3
4
5

$ seq 1 2 10

1
3
5
7
9
```

# これから？

```
$ echo '(1..5).each do |i| puts i end' | ruby

1
2
3
4
5

$ echo '(1..10).each do |i| puts i if (i - 1) % 2 == 0 end' | ruby

1
3
5
7
9
```

# 所見・所感

これはさすがに `seq` でやった方が楽。
[JAWS-UG CLI] IoT #5 モノの作成

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


IoTへの権限
-----------

AWS IoTに対してフル権限があること。


AWS CLI
-------

以下のバージョンで動作確認済

- AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


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

```bash:変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       iotFull-handson-mbpr13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION
```


1. 事前作業
===========


1.1. モノ名の決定
-----------------

```bash:変数の設定:
IOT_THING_NAME="handson-thing-$( date '+%Y%m%d' )" \
        && echo ${IOT_THING_NAME}
```

同名のモノの不存在確認

```bash:コマンド:
aws iot describe-thing \
        --thing-name ${IOT_THING_NAME}
```

```text:結果(例):
      An error occurred (ResourceNotFoundException) when calling the DescribeThing operation: Failed to describe thing handson-thing-20161117 because it does not exist in our ecosystem for your account
```


2. モノの作成
=============

```bash:変数の確認:
cat << ETX

        IOT_THING_NAME: ${IOT_THING_NAME}

ETX
```

```bash:コマンド:
aws iot create-thing \
        --thing-name ${IOT_THING_NAME}
```

```json:結果(例):
      {
        "thingArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:thing/handson-thing-20161117",
        "thingName": "handson-thing-20161117"
      }
```


3. 事後作業
===========


3.1. モノの確認
---------------

```bash:コマンド:
aws iot describe-thing \
        --thing-name ${IOT_THING_NAME}
```

```json:結果(例):
      {
          "attributes": {},
          "version": 1,
          "thingName": "handson-thing-20161117",
          "defaultClientId": "handson-thing-20161117"
      }
```


3.2. エンドポイントの確認
-------------------------

```bash:コマンド:
IOT_ENDPOINT=$( \
        aws iot describe-endpoint \
          --query 'endpointAddress' \
          --output text \
) \
        && echo ${IOT_ENDPOINT}
```

```text:結果(例):
      xxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com
```


エンドポイント情報は後で使用するのでメモしておいてください。

完了
====
[Java][Spring Boot] JPAエンティティをDTOへ変換する方法、というかそもそも変換するべき？

[`spring-boot-starter-data-rest` を使用すれば](https://spring.io/guides/gs/accessing-data-rest/)、Repositoryインターフェースに`@RepositoryRestResource`アノテーションをつけるだけで、JPAエンティティをJSONとして公開できます。

「えー、でも、直接公開しちゃうの？」
「そういうのってData Transfer Object（DTO)へいったん変換するんじゃないの？」

と考えて、ウジウジしていたのですが、そもそもなんでDTOへ変換するのか検索してみました。

# 「Data Transfer Object(DTO)」とはなんぞや？

[Wikipedia](https://en.wikipedia.org/wiki/Data_transfer_object)によりますと

> Data Transfer Object(DTO)とは、プロセス間でデータを運ぶオブジェクトである。

だそうです。データに対して何か操作する機能は持たず、データを格納することだけに特化したオブジェクトです。

プロセス間通信（Webサービス等）はコストが高いので、DTOにデータをパッケージングすることで、通信回数を減らしたり通信量を減らしたりといった効果があります。


# DTOを使うメリット

DTOがなんなのかわかったところで、使うメリットをまとめてみます。

| No. | メリット | 解説 |
|--:|:--|:--|:-:|
| 1 | 通信回数削減  | 1回の通信で、必要なものをすべてやりとりするため  | 
| 2 | 通信量削減  | 公開不要なものは通信しないため  | 

## No.１ - 通信回数削減

データベーステーブルからデータをとりまとめて返すような処理の場合、このメリットが効いてきますね。

JPAエンティティと一対一になるようなWebインターフェースだと効果ないですね。

## No.2 ｰ 通信量削減

データベーステーブルには、たいてい公開不要な項目がありますので、このメリットが効いてきますね。

JPAエンティティにアノテーションつければ非公開にできるので、このメリットは実感ないですね。

# DTOを使うデメリット

逆にデメリットをまとめてみます。

| No. | デメリット | 解説 |
|--:|:--|:--|
| 1 | コード量が増える  | 単純にDTOと変換用のコードが増えます。当然テストも増えます。 |
| 2 | CPUコストが増える | DTOとの相互変換のためにCPUを食います。 |
| 3 | メモリコストが増える  | 元データとDTO両方を持つので、メモリを倍近く食います。  |

そ、それでも通信のほうがコスト高いから（震え声

なんとなくDTO不要な気もしてきましたが、ここで真打ち登場です。

# DTOを使う真のメリット

## 「責任範囲」の分担

「責任範囲」というのはアプリケーションを階層化したとき、その階層が責任を持って提供すべきインターフェースのことです。

例えば、よくある三層構造はこのようなものです。

| 階層 | 名前 | 責任範囲 |
|:-:|:--|:--|
| 4 | ユーザ/他アプリ | 責任あったりなかったり。 :smiley:  |
| 3 | プレゼンテーション  | ユーザ/他アプリに対して操作/APIを提供する。  |
| 2 | ビジネスロジック  | プレゼンテーションに対してAPIを提供する。  |
| 1  | データアクセス  | ビジネスロジックに対してAPIを提供する。 |

RESTの場合はこのようになります。

| 階層 | 内容 |
|:-:|:--|
| 4 | ユーザ/他アプリ | 
| 3 | RESTサービス  |
| 2 | ビジネスロジック  |
| 1 | JPA  |

JPAエンティティを直接RESTサービスへ公開していると、JPAの変更がユーザ/他アプリまで波及してしまうのです。

DTOを使っていれば、そのようなことはありません。

# まとめ ｰ DTOを使うべき？

- DTOを使うべきとき<br>
共同作業をしている、あるいは公開APIのため、階層間のインターフェースを簡単には変更できない。
- それ以外のとき<br>お好みで。


# ところで、変換する方法は……？

SeasarのS2DXOみたいなのはないみたいです。

普通にしこしこ書くしか？
Linux/mySQL： コマンドラインからテーブル一覧、及びカウントを取得する。

## Linux/mySQL： コマンドラインからテーブル一覧、及びカウントを取得する。

MySQLに限った話じゃないんだけど、リストからチェック対象のCOUNTやSUMをさっくり取りたい時に。
Shell芸の練習のために書いてみました。

### 1:テーブル一覧をFile出力

```
mysql -u root -pPASSWD -e "use DBName; show tables;" | xargs -n 1 echo > a.txt

```
### 2:Count一覧をFile出力

```

mysql -u root pPASSWD -e "use DBName; show tables;" | xargs -IVar -n 1 echo "select * from "Var";" > a.txt

```

### 3:Count結果をFile出力

```

mysql -u root -pPASSWD -e "use DBName; show tables;" | xargs -IVar -n 1 echo "use DBName; select count(*) from "Var";" | xargs -ISQL mysql -u root pPASSWD -e "SQL" > a.txt

```


### 困っているところ

３でカウント結果を取得したとき、せっかくなので as TableNameとかしてテーブル名をSelect結果に挿入したかったんだけどうまくいかない。
クエリ実施前で止めて、Select文をmySQLのコンソールから生で実行した場合はうまくいったんだけど。

やりかた知ってる人いたら教えてください。
MySQL: IncrementIDの更新

## MySQL: IncrementIDの更新

## 状況：
(1)MySQLで、主キーIDをインクリメント設定している。
(2)アプリで通常実施しているINSERTとは異なる方式で(手動クエリ発行など)データをがばっと入れる(もしくはばっさり消す)ため、IDの整合性が取れなくなりそう。
(3)データ更新のあとで、IDのインクリメント値を任意の場所から再開させたい。


## テスト手順：

### (1)Create Tableで、主キーがIncrement値になっているテーブルを作成。

```
CREATE TABLE `TestIncrementTable` (
  `IncID` bigint(20) NOT NULL AUTO_INCREMENT,
  `CreateDate` datetime DEFAULT NULL,
  `UpdateDate` datetime DEFAULT NULL,
  PRIMARY KEY (`IncID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

select * from TestIncrementTable;
```

### (2)適当にデータを挿入、主キーがIncrementされていることを確認。


```
Insert Into TestIncrementTable values ('','2016/11/1','2016/11/2');
Insert Into TestIncrementTable values ('','2016/11/2','2016/11/3');
Insert Into TestIncrementTable values ('','2016/11/3','2016/11/4');
Insert Into TestIncrementTable values ('','2016/11/4','2016/11/2');
```

### (3)主キーに任意の値を設定したレコードをがばっと挿入。

```
Insert Into TestIncrementTable values (10,'2016/11/1','2016/11/2');
Insert Into TestIncrementTable values (11,'2016/11/2','2016/11/3');
Insert Into TestIncrementTable values (12,'2016/11/3','2016/11/4');
Insert Into TestIncrementTable values (13,'2016/11/4','2016/11/2');
```

### (4)主キーのIncrement値を任意の値に書き換える。

```

# Increment値の書き換え

Alter Table TestIncrementTable AUTO_INCREMENT=100;

# テーブル定義を確認して想定どおりの値に更新されていることを確認

show Create Table TestIncrementTable;

# 結果：

CREATE TABLE `TestIncrementTable` (
  `IncID` bigint(20) NOT NULL AUTO_INCREMENT,
  `CreateDate` datetime DEFAULT NULL,
  `UpdateDate` datetime DEFAULT NULL,
  PRIMARY KEY (`IncID`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8

```

(5)適当にデータを挿入して、主キーが(4)で指定した場所からIncrementされていることを確認。

```

Insert Into TestIncrementTable values ('','2016/11/1','2016/11/2');
Insert Into TestIncrementTable values ('','2016/11/2','2016/11/3');
Insert Into TestIncrementTable values ('','2016/11/3','2016/11/4');
Insert Into TestIncrementTable values ('','2016/11/4','2016/11/2');

select * from TestIncrementTable;

```


参考：

http://tweeeety.hateblo.jp/entry/2015/04/28/201956
C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（４）　学習編

ようやく学習のお話になります。

# 実行モジュール
いきなり実行モジュールのお話から始めます。
学習を行うためには「caffe.exe」を使用します。

# 引数
「caffe.exe」のシンタックスは以下のようになっています。

```
caffe <command> <args>
```

今までのツール類とは、ちょっと表現が違ってます ^^;

## command
ここでは、処理の種類を指定します。

| command | 意味 | 使用頻度 |
|:--|:--|:--:|
| train | トレーニングを行います | 高 |
| test | テストを行います | 中 |
| device_query | GPUの情報を表示します | 低 |
| time | ベンチマークを実行します | 低 |

ここでは「train」についてのみ説明します。
（後は知らなくても問題なし）

## args
代表的な引数は以下の通りです。
（全てを知りたい人は「caffe -help」を実行）

| args | 意味 | 設定例 |
|:--|:--|:--|
| -solver | ソルバファイルを指定します | -solver solver.prototxt |
| -snapshot | 学習の続きを行います | -snapshot train_100000.solverstate |
| -weights | 他で作成した学習モデルに追加して学習させます | -weights train_10000.caffemodel |

これだけ知っていればOKです。
「-snapshot」と「-weights」は、「-solver」も一緒に指定する必要があります。
なお、指定したそれぞれのファイルの中身については、また別の機会に説明します。
（そこに設定するモデルファイル等についても）

以下では、「-solver」のみを指定したときの動作を説明していきます。

# 実行時のログ
まずソルバファイルの内容が表示されます。
※あっという間に流れていきます

次にモデルファイルの内容が表示されます。
モデルファイルとは、ニューラルネットの各レイヤに何を設定するか、またパラメータにどういった値を設定するかを指定したファイルになります。
※これも、あっという間に流れていきます
モデルファイルは、トレーニング用とテスト用の2種類表示されます。

ここで、たとえばGPUのメモリが足らないなど、エラーになるとメッセージが表示され、終了します。
その場合はエラーの対処（GPUメモリが足らないなら、画像ファイルを小さくしたり、バッチサイズを小さくしたり）を行います。

これが終わると、いよいよ学習経過のログが表示されます。
例えばこんな感じのログが一定間隔で出力されます。

```
I0318 15:49:36.599722  3487 solver.cpp:408]     Test net output #0: accuracy = 0.0753
I0318 15:49:36.599763  3487 solver.cpp:408]     Test net output #1: loss = 2.39124 (* 1 = 2.39124 loss)
```

これはある程度トレーニングしたところで、「どれどれ、精度はどのくらい上がったかな？」とテストをした結果のログになります。
（もちろん、その間隔等は自分で設定するのですが）

「accuracy」は正解率で、1に近ければ近いほどいいです。
「loss」は予測とのズレになり、小さければ小さいほどいいです。

また、こちらも一定間隔で、評価で使用する学習モデルデータ（出力ファイル）を、ソルバファイルで指定したファイル名で出力します。
設定した名前に学習した回数が付加され「caffe_alexnet_train_iter_450000.caffemodel」といった感じになります。
（snapshot_prefixで「caffe_alexnet_train」を指定した場合）

# おまけ
GPUを使う使わないにも寄りますが、画像のサイズやモデルの設定で、実行時間は相当変わります。
まずは短いモデルで実行してGPUメモリでエラーにならないかを確認して、それから本当に使用したいモデルで学習するのがよいかと思います。

# 関連記事
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（１）](http://qiita.com/mine820/items/37862e45aa66c2ad8b80)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（２）](http://qiita.com/mine820/items/9ea5812fc25a70419f31)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（３）](http://qiita.com/mine820/items/f4395a3ac734085e5ed1)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（５）](http://qiita.com/mine820/items/e8857fee3fa0b4ada170)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（６）](http://qiita.com/mine820/items/01a275d1065d299702fc)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（７）](http://qiita.com/mine820/items/1e100330d163f9959c65)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（８）](http://qiita.com/mine820/items/30fcc4e5f794c42b4bd7)
Travis CI で CHANGELOG.md を更新しないとErrorを吐くようにする

# 説明

雑に作りました
develop ブランチとプルリクエストを比較して 
`CHANGELOG.md` に変化がなければ強制的に fail させます
これをビルドや環境構築する前に入れるとささっとはじいてくれます
例ではいろいろと面倒なのでビルドする前にチェックしてます

# コード

```ruby:Rakefile
#coding: utf-8
require 'open3'

desc 'Travis CI 環境で Android のビルドを行う'
task :build do
  unless ENV['TRAVIS_PULL_REQUEST'] == 'false'
    if Rake::Task['travis:checkChangeLog'].execute()
      sh('echo "ここでいろいろできます"')
    end
  end
end

desc 'CHANGELOG.md の更新有無をチェック'
task :checkChangeLog do
  sh('git fetch')
  unless ENV['TRAVIS_PULL_REQUEST'] == 'false'
    o, e, s = Open3.capture3('git diff --name-only HEAD remotes/origin/develop -- CHANGELOG.md')
    unless o.include?('CHANGELOG.md')
      fail 'CHANGELOG.md を更新しましょう'
    end
  end
end
```

```yml:.travis.yml
script:
- rake build
```

# おわりに

自分でもよくCHANGELOGを書き忘れるのでとても助かってます
[JAWS-UG CLI] IoT #1 AWS IoTのlog設定

AWS CLIを利用して、IoTのログ設定をしてみます。


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


IoTへの権限
-----------

AWS IoTに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


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

構築するリージョンを決めます。 (カレントユーザが利用するカレントリージ
ョンも切り変わります。)

```bash:コマンド(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 そ
れ以外のときにprofileが '<not set>' と表示される場合は、以下を実行して
ください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>


0.3. IAMロール名の指定
----------------------

```bash:変数の設定:
IAM_ROLE_NAME='AWSIoTLoggingPutRole'
```


1. 事前作業
===========


1.1. ロールARNの取得
--------------------

```bash:変数の設定:
IAM_ROLE_ARN=$( \
        aws iam get-role \
          --role-name ${IAM_ROLE_NAME} \
          --query 'Role.Arn' \
          --output text \
) \
        && echo ${IAM_ROLE_ARN}
```

```text:結果(例):
      arn:aws:iam::XXXXXXXXXXXX:role/AWSIoTLoggingPutRole
```


1.1. ロギング設定の確認
-----------------------

```bash:コマンド:
aws iot get-logging-options 
```

```text:結果(例):
      A client error (InvalidRequestException) occurred when calling the GetLoggingOptions operation: Customer Logging Role does not exist for account 'XXXXXXXXXXXX'
```


1.2. ログレベルの指定
---------------------

```bash:変数の設定:
IOT_LOGGING_LEVEL='INFO'
```


1.3. 設定文字列の作成
---------------------

```bash:変数の設定:
IOT_LOGOPT_PAYLOAD="roleArn=${IAM_ROLE_ARN},logLevel=${IOT_LOGGING_LEVEL}" \
        && echo ${IOT_LOGOPT_PAYLOAD}
```


2. set-logging-options
======================

```bash:変数の確認:
cat << ETX

        IOT_LOGOPT_PAYLOAD: ${IOT_LOGOPT_PAYLOAD}

ETX
```

```bash:コマンド:
aws iot set-logging-options \
        --logging-options-payload ${IOT_LOGOPT_PAYLOAD}
```

```text:結果(例):
      (戻り値なし)
```


3. 事後作業
===========

```bash:コマンド:
aws iot get-logging-options 
```

```json:結果(例):
      {
        "logLevel": "INFO",
        "roleArn": "arn:aws:iam::XXXXXXXXXXXX:role/AWSIoTLoggingPutRole"
      }
```


完了
====
includeしてなくてもmoduleに定義されたメソッドにアクセスする


```
module Bar
  BAR = 1
  def self.baz
	2
  end
end

# 完全修飾名を指定すると include や自分自身へ定義されていない場合でも参照できる
p Class.const_get("Bar::BAR") # => 1

# メソッドを呼びたい時は`::`で繋いでやる
p Bar::baz # => 2
```
XubuntuでEclipseのUIがおかしいのを直す

Xubuntu 16.04（厳密には私が使っているのはUbuntu Studioだが）に
EclipseをEclipse installerで普通にインストールして起動すると、UIが汚い。
![workspace - JavaScript - Eclipse _001.png](https://qiita-image-store.s3.amazonaws.com/0/148579/b6d74d84-bdec-2f1e-2fa4-9fca13b190f2.png)
メニューバーのところ、灰色の四角が出て気持ち悪い。
無印Ubuntuとかも同じ現象になりそうだが調べてない。

直すのはこう。
![Edit Launcher_003.png](https://qiita-image-store.s3.amazonaws.com/0/148579/eaf8fa4d-0444-16bd-41ca-4185cbc54dbf.png)
起動コマンドの頭で
`env SWT_GTK3=0 /path/to/eclipse`
SWTでGTK3を使わないように指定する。

![workspace - JavaScript - Eclipse _004.png](https://qiita-image-store.s3.amazonaws.com/0/148579/70553a45-6943-c7f6-dc87-d6a4b4a61694.png)
直る。
`therubyracer (0.12.2)`が`bundle insstall`できない

`Ruby 2.3.2`が出たとのことで、インストールして`bundle install`したら失敗した。

```
Using unicorn-worker-killer 0.4.4
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.


An error occurred while installing therubyracer (0.12.2), and Bundler cannot continue.
Make sure that `gem install therubyracer -v '0.12.2'` succeeds before bundling.
```

あーこれ良く見るやつだ。
また、`gem install therubyracer -v '0.12.2'`をインストールしろだって。
そんな時は、以下サイトで教えてもらった`libv8`を一旦消して`libv8`と`therubyracer`を一気にインストールする
http://qiita.com/chrischris0801/items/eb78fabdbaece22b3662

```
$ gem list | grep v8
libv8 (3.16.14.13)
$ gem uninstall libv8
Successfully uninstalled libv8-3.16.14.13
$ gem install therubyracer -v '0.12.2' -- --with-v8-dir
Fetching: libv8-3.16.14.15-x86_64-darwin-15.gem (100%)
Successfully installed libv8-3.16.14.15-x86_64-darwin-15
Building native extensions with: '--with-v8-dir'
This could take a while...
Successfully installed therubyracer-0.12.2
Parsing documentation for libv8-3.16.14.15-x86_64-darwin-15
Installing ri documentation for libv8-3.16.14.15-x86_64-darwin-15
Parsing documentation for therubyracer-0.12.2
Installing ri documentation for therubyracer-0.12.2
Done installing documentation for libv8, therubyracer after 0 seconds
2 gems installed
```

これで、もっかい`bundle install`する。

```
$ bundle install
Bundle complete!
$ gem list | grep v8
libv8 (3.16.14.15 x86_64-darwin-15, 3.16.14.13)
$ gem list | grep the
therubyracer (0.12.2)
```

できたできた。
VagrantでCentOS7系の環境を作る（2016年11月版）

# Vagrant box置き場のgithubがAmazonS3に移行したらしい。

とあるboxを追加しようとしたとき。

## 環境

    $ VBoxManage -v
    4.3.30r101610
    $ vagrant -v
    Vagrant 1.7.2

    母艦は、MacのYosemite。もう古いなｗ

## コマンド
    $ vagrant box add centos7.1 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.1/vagrant-centos-7.1.box

と、打ち込むと。。。。

    Unable to find AWS credentials.

    Ensure the following variables are set in your environment, or set
    them at the top of your Vagrantfile:
        AWS_ACCESS_KEY_ID
        AWS_SECRET_ACCESS_KEY
    Alternatively, you can create a credential profile and set the

        AWS_PROFILE
    environment variable. Consult the documentation for details.

と、エラーが出る。
ちょっと前まで、AWSの設定無しでダウンロード出来たじゃん。

    $ curl --head https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.1/vagrant-centos-7.1.box

で、調べる。

    Status: 302 Found
    Cache-Control: no-cache
    Vary: X-PJAX
    Location: https://github-cloud.s3.amazonaws.com/releases/44744215/c9808a28-8177-11e5-8c5f-47930a417990.box?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAISTNZFOVBIJMK3TQ%2F20161117%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20161117T085657Z&X-Amz-Expires=300&X-Amz-Signature=0ac1d5e82ea890a99061151abb28113c80c0aafb43bc208bcfb9c4f696be28f8&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dvagrant-centos-7.1.box&response-content-type=application%2Foctet-stream

！！！！！！！！！！

「Location: https://github-cloud.s3.amazonaws.com/」に引っ越してる！！
あー、AWSのアカウントが無いとbox落とせない。。。。

まあ、AWSのアカウントを取って、IAMで「AWS_ACCESS_KEY_ID」と「AWS_SECRET_ACCESS_KEY」と取得して、「~/.aws/credentials」に
「AWS_ACCESS_KEY_ID」と「AWS_SECRET_ACCESS_KEY」を書く

    [default]
    aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXX
    aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

てな感じで書いて、IAMのコンソールで、

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt99999999999999",
                "Effect": "Allow",
                "Action": [
                    "s3:GetBucketLocation"
                ],
                "Resource": [
                    "arn:aws:s3:::github-cloud"
                ]
           }
        ]
    }

な、ポリシー追加して、ポリシーの検証で「allowed」になったのを確認して、適用したのに、
前記のコマンドを打つと

    Request for box's Amazon S3 region was denied.
    
    This usually indicates that your user account is misconfigured. Ensure
    your IAM policy allows the "s3:GetBucketLocation" action for your bucket:
    
        arn:aws:s3:::github-cloud

と、アクセスさせてくれない。

もう、いい、githubからboxファイルはもうDLしないよ！（怒）


# AWSのS3にアクセスできなくても、大丈夫。俺たちにはHash Corpさんがいる！

こまかいことはここを参照↓
https://www.vagrantup.com/docs/getting-started/boxes.html

簡単にCentOS７のボックスが出来たんですよ。

    vagrant box add centos/7

余談だが、CentOS6が欲しければ

    vagrant box add centos/6

ありがとう、Hash Corpさん。
Thanks, "Hash Corp."

boxさえ追加出来れば、あとは従来通りセットアップをするだけ。

こんなことに半日費やすとは、いろいろな方々にごめんなさい。
AWSのS3が悪いんですよ、ちゃんと設定しているはずなのに、DLさせてくれないなんて。。。

AWSのアカウントを要求されるのも、なんだかなぁ、、、、って感じです。

AWSのS3経由でDL出来た方、コメント下さい。
KeyChainから証明書を書き出すと選択してない証明書まで入ってくる

iOSのプッシュ通知用の証明書をサーバーに置くために、キーチェーンから.p12ファイルを書き出しますが、その際にハマったのでメモしておきます。

#問題
間違いなく該当する証明書と秘密鍵のセットを書き出したはずなのに、別の証明書が含まれてしまっている。
（今回の場合は利用しているプッシュ配信サービス側のバリデーションに引っかかり証明書が設定できませんでした。）

#原因
色々と調べたのですが原因はわかりませんでした。また、別の端末でも再現したので環境の問題とも考えにくいです。

#対処方法
根本的な解決にはなりませんが、書き出し用に新規でキーチェーンを作成し、そこに書き出したい証明書と秘密鍵だけを入れて書き出したところ上手くいきました。

<img width="457" alt="スクリーンショット 2016-11-17 17.43.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/80eca671-395b-8083-49f3-38e8c61b4c5d.png">


#確認方法
ダブルクリックして.p12を開くと何が追加されたのかわかりにくいので、↑で作成した書き出し用のキーチェーンにp12ファイルをドラッグ＆ドロップすることで余計な証明書が含まれていないか確認しやすいです。

---

以上です。もし、根本的な解決方法がありましたら情報いただけると助かります。
gulpで自分が編集しているscssをcssCombしたい



cssCombは便利だ。
でもgulpでの導入方法を調べてみると、プロパティの並び順を整えてコンパイルする方法しか見つからなかった。

個人的にはコンパイル後の綺麗さはどうでもよくて、編集するファイルこそ綺麗にしたい。



## やりたいこと
scssを保存するたびに下記を実行したい

* そのscssをcssCombで整える
* cssにコンパイル

## 結論

これで実現できる

```json:package.json
{
  "devDependencies": {
    "gulp": "^3.9.1",
    "gulp-changed-in-place": "^2.0.3",
    "gulp-compass": "^2.1.0",
    "gulp-csscomb": "^3.0.8",
    "gulp-watch": "^4.3.5"
  }
}

```


```javascript:gulpfile.js

var changedInPlace = require('gulp-changed-in-place');
var compass = require('gulp-compass');
var csscomb = require('gulp-csscomb');
var watch = require("gulp-watch");


var srcDir = './src/';  // ソースのディレクトリ
var distDir = './dist/'; // コンパイル先ディレクトリ


var src = {
  scssDir: srcDir + 'scss/',
  scss: srcDir + 'scss/**/*.scss'
};

var tmp = {
  scssDir: srcDir + 'tmp/scss/',
  scss: srcDir + 'tmp/scss/**/*.scss'
};

var dist = {
  cssDir: distDir
};



gulp.task('csscomb', function() {
  return gulp.src(src.scss)
    .pipe(csscomb())
    .pipe(changedInPlace({firstPass: true}))
    .pipe(gulp.dest(tmp.scssDir));
});


gulp.task('moveCombedCss', function() {
  return gulp.src(tmp.scss)
    .pipe(changedInPlace({firstPass: true}))
    .pipe(gulp.dest(src.scssDir));
});


gulp.task('compass', function(){
  return gulp.src(tmp.scss)
    .pipe(compass({
      project: path.join(__dirname),
      css: dist.cssDir,
      sass: tmp.scssDir
    }))
    .pipe(gulp.dest(dist.cssDir))
});



/* default, watch
====================*/
gulp.task('default', function(callback) {
  runSequence('moveCombedCss', 'csscomb', 'compass', 'watch', callback);
});


gulp.task('watch', function(){
  watch(src.scss, function(event){ gulp.start('csscomb')});
  watch(tmp.scss, function(event){ gulp.start('moveCombedCss')});
  watch(tmp.scss, function(event){ gulp.start('compass')});
});

```


## 説明

### 今まで
cssCombなしだと`src`から`dist`へコンパイルしていた

### これから
まずは`tmp`にcssCombしたscssを吐き出し、
`tmp`から`dist`へコンパイルしつつ、`tmp`から`src`へと整えられたscssもコピーする。

`src` ⇔ 　`tmp` はそのままだと無限ループしてしまうので、
ファイルが更新されている場合のみコピーすることにする。
そのためにgulp-changed-in-placeを使用してます。

これで何も考えなくともscssを保存するだけで自動的にプロパティを並べ替えてくれる！

## 補足

* 最低限のものだけ記載していますが、autoprefixerとか適宜追加してください
* gulp-changed-in-place の他に gulp-changed というプラグインもあるのだけど、これだとうまくいかなかった
* scssのコンパイルにはcompassを使用していますが、PostCSSにそのうちする予定

もっとこうした方が良い、などあったらご意見ください！
atom-beautifyを使ったJinja2のソースコード整形

Atomを使った開発では、[atom-beautify](https://atom.io/packages/atom-beautify)というソースコード整形のパッケージを使うと良い感じにインデントや改行を入れてくれます。サポートしている言語も幅広く、それぞれにインデント幅やスタイルの指定など細かな設定ができるすぐれものです。

最近Djangoを書いている都合でJinja2形式のHTMLを書くことが多いのですが、atom-beautifyのデフォルトのHTMLの整形ルール(JS Beautify)では`{{}}`などの対応がなく包含関係などを上手に整形してくれないという不満がありました。

最初は「Jinja2対応の整形ルールなんて無いよな」と思って諦めていたのですが、どうやらHTMLのBeautifierで[Pretty Diff](https://github.com/prettydiff/prettydiff)を選択すると良いということが分かり、早速やってみることに。
 
[Support (html) jinja2 templates · Issue #418 · Glavin001/atom-beautify](https://github.com/Glavin001/atom-beautify/issues/418) 

## atom-beautifyの設定

AtomのPreferences→Packageのatom-beautifyのSettings→HTMLのDefault Beautifierの設定を"JS Beautify"から"Pretty Diff"に変更する。

<img width="602" alt="ss 2016-11-17 15.45.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/4452/71e426c6-ba87-150c-67b4-6b8cfb80e431.png">

## ソースコードの整形比較

### JS Beautifyを使った場合(デフォルト)

```html+django
{% extends "base.html" %} {% block title %}タイトル{% endblock title %} {% block content %}
<form action="{% url 'project:hoge'%}" method="post">
    {% csrf_token %} {{ form.non_field_errors }}
    <div class="form-group">
        {{ form.hoge_name.errors }}
        <label for="{{ form.hoge_name.id_for_label }}">hoge_name</label> {{ form.hoge_name }}
    </div>
    <div class="form-group">
        <div>
            <button type="submit" class="btn btn-primary">作成する</button>
        </div>
    </div>
</form>
{% endblock content %}
```

### Pretty Diffを使った場合


```html+django
{% extends "base.html" %}
{% block title %}タイトル{% endblock title %}
{% block content %}
    <form action="{% url 'project:hoge'%}" method="post">
        {% csrf_token %}
        {{ form.non_field_errors }}
        <div class="form-group">
            {{ form.hoge_name.errors }}
            <label for="{{ form.hoge_name.id_for_label }}">hoge_name</label>
            {{ form.hoge_name }}
        </div>
        <div class="form-group">
            <div>
                <button type="submit" class="btn btn-primary">作成する</button>
            </div>
        </div>
    </form>
{% endblock content %}
```

できました！きちんとblockを認識してくれています。ほかにも`{% if %}{% else %}{% endif %}`や
`{% for %}{% endfor %}`にも対応してくれます。

これでレイアウトでGitのコミットを汚すことがなくなり、スタイルも統一することができました。
RecyclerViewに導入されたItemPrefetchで描画パフォーマンス向上させる

support-library の25.0.0以降よりRecyclerViewのレンダリングパフォーマンスを向上させるItemPrefetchという機能が追加されています。

#ItemPrefetchとは
RecyclerViewでは、以下のような処理が行われています。

<img width="451" alt="Screen Shot 2016-11-17 at 00.44.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/39433/d0e66fd0-e4d5-ac16-79e4-c092c025d1f0.png">
UIThreadからViewのinflationおよびbind/Animation等処理
↓
GPUのRenderThreadで描画

GPUのRenderThreadに渡っている間, UIThread はidle状態に入ります。
ここで問題となるのは、スクロールして新規にViewをinflateが必要な場合に、UIThreadでその処理が行われることによって描画遅延の原因となることです。
25.0.0より、ItemPrefetchが有効になることによって、次のViewのinflationが必要かどうかを判断し、 **必要な場合はRenderThreadで描画中に次のinflationの準備を行うようになり、スムーズな描画が可能となります。**

ItemPrefetchが有効になる条件としては

- support library が25以上
- Lollipop以上の端末

となります。上記の条件を満たす場合、デフォルトで有効となります。この処理はViewCacheのメモリを余分に消費するという副作用があるため、OFFにすることが可能です。その場合は`LayoutManager.setItemPrefetchEnabled()`を呼び出し、falseを設定します。
詳細はDocsを御覧ください。
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager.html#setItemPrefetchEnabled(boolean)


#実際にどのように処理が変わっているのか
手元でRecyclerViewを使ったリストを用意し、Android Monitorに付属するパフォーマスンス計測ツールである[SysTrace](https://developer.android.com/studio/profile/systrace.html)で確認しました。

##ItemPrefetchが効いていない場合

<img width="651" alt="Screen Shot 2016-11-16 at 22.20.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/39433/4601a259-297f-463a-ef66-1b1f6452545b.png">

赤枠に示す部分でわかるように、Viewのinflationが重たいため、処理に時間がかかっています。黄色のFはDelayがあることをWarningしています(他が5msのところ、ここは約10msかかっていました)

##ItemPrefetchが効いている場合

<img width="673" alt="Screen Shot 2016-11-16 at 22.20.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/39433/b30edf0d-4ce0-5144-5624-78b62e7c665b.png">

赤枠の部分でわかるように、RenderThreadで描画処理を実施している最中にUIThreadで次のViewをinflationしています。

#まとめ
何も特別なことをせずともRecyclerViewをSupport Library25.0.0以上に上げると自動的にItemPrefetchは適用されます。ただし25.0.0はバグがあるため、
特に制約がない限り, バグフィックスが入った25.0.1に上げることをおすすめします!
「ストック」ボタンを救済して

- [投稿記事やコメントに「いいね」できるようになりました（Contributionの算定基準も変わります）... - Qiita Blog](http://blog.qiita.com/post/153200849029/qiita-like-button)

「ストック」ボタンから「いいね」の意図を分離するというのは分かるし、Contribution という名の事実上のランキングシステムから「ストック」を除外するというのも分かる。

（そもそも Contribution という名前が紛らわしいのだが。誰に何に対する寄与？ Qiita に対して？）

でもね。私は別に Qiita でその辺の雑談系 SNS のごとく「だよね」「そうだよね」と馴れ合いたいわけじゃない。日々アップされている玉石混交かつ大量の記事群の中から自身に有用な記事をピックアップしてマークを付けておければそれでいいのよ。それが「ストック」の意味の筈。

でも今の UI は「ストック」ボタンが冷遇されすぎていて辛いのよ。せめて「いいね」ボタンと同等（またはそれ以上）にしてください。

まぁ来月になればそれはそれで慣れちゃうのかもしれないが。

## 追記

- だぁ。「いいね」したときの通知が勝手に有効になってるよ。要らんわ、そんなもん
windowsでproxy下のdockerとPyCharm

- proxyを`http://proxy.any.ac.jp:8080/`とします

# docker
## 事前準備
- [Docker cloud](https://www.docker.com/products/docker-cloud)でサインアップ
- Repositoryを作っておく(例:username/rep)
- privateでもpublicでも問題ないが、publicだと公開する代わりに後々楽になる

## 初期起動まで
- [Docker Toolbox](https://www.docker.com/products/docker-toolbox)をインストール
- Windowsの環境変数に変数名HTTP_PROXY、値`http://proxy.any.ac.jp:8080/`
- 同じく変数名HTTPS_PROXY、値`http://proxy.any.ac.jp:8080/`
- Docker Quickstart Terminalを起動
- 無事にクジラが見れたら下記を実行

```bash
export HTTP_PROXY=http://proxy.any.ac.jp:8080/
export HTTPS_PROXY=$HTTP_PROXY
```

## 初期環境構築まで
- docker run -it --name env <centosとかubuntuとかpythonとか> /bin/bash
- 仮想環境に入れるので自由にいじること
    - ここに実行するプロジェクトとかは入れない
    - あくまで実行環境だけを構築すること
- ユーザーを作ってそこで環境を構築した場合などでは

```bash
ln -s /home/User/.hogebrew/var/pyenv/shims/python /usr/bin/python
ln -s /home/User/.linuxfuga/bin/jumanpp /usr/bin/jumanpp
```
などを駆使して**rootが無編集の.bash_profileを通して実行できるようにする**こと

- 気が済むまで環境を構築できたら`C-d`でexitして下記を実行

```bash
docker login #あなたのdocker cloudにログイン
docker commit lab username/rep:latest
docker push username/rep:latest
```

- 一度環境構築をした場合は、ほかのPCでしなくてもよいです。

# PyCharm
- [PyCharm](https://www.jetbrains.com/pycharm/download/)からダウンロード
- 学生のうちは無料。そこらへんはほかで参照してください
- 起動したらとりあえず右下のConfigure->Settingsを選択

## Settings
- Project Interpreterに移動
- Project Interpreterで歯車を押し、Add remote
- Dockerを選択し、New...
- デフォルト設定のまま、VirtualBox shared foldersが`/c/Users -> C:\Users`となっていることを確認
- OK
- image nameにusername/rep:latestを選択
- Python interpreter pathはpythonで問題ない
    - もし違うマシンを利用していても、この設定は同一です
    - 違うマシンならここでpullが始まる。同一ならそのまま
- OK

## Edit Configuration
- 最初の画面に戻り、プロジェクトを選択
- 動かしたいPython Fileで右クリ->run filename
    - 叱られる。そのままキャンセル
- ツールバーのRun -> Edit Configuration
- Pythonの項目にfilenameが存在すると思うので選択
- ScriptをC:\Users...から\c\Users...に変更
- 同様にWorking directoryを\c\Users...に変更
- Docker container settingsに移動
    - Volume bindings
        - /opt/project -> C:\Users...\project_path
        - リソースなどもここで設定
    - Environment variables
        - http_proxy -> http://proxy.any.ac.jp:8080/
        - https_proxy -> http://proxy.any.ac.jp:8080/
    - OK
- Apply
- Docker container settingsの欄が下記になってることを確認する

` -v /c/Users.../project_path ...`

# プログラム起動
- 動くと思います
- fileごとに設定するべし。めんどくさいと思うときは、Defaultsでいじることもできるが、Windowsで動くようなプログラムを利用するときはWindowsにPythonを入れて動かしたほうが良いので注意すること
どどんとふ on windows

主に友人に需要があるそうなのでWindows上でどどんとふサーバーを動かせるか頑張った。

# XAMPPのインストール
Apache httpdのWindows版は公式で配布していないらしい。[XAMPP](https://www.apachefriends.org/jp/)をインストールする。  
![2016-11-16.png](https://qiita-image-store.s3.amazonaws.com/0/57768/8a070a33-cd64-75c8-3e6c-57f022032a72.png)  
Apache以外は入れなくていい。

# Rubyのインストール

[こちらの記事](http://qiita.com/machu/items/91038f4d4a3b9b5bd6f1)を参照。インストール時に「PATHを設定する」にチェックする。  
インストールに成功しているかコマンドプロンプトで`ruby -v`してみる。

# どどんとふの設置

[どどんとふ](http://www.dodontof.com/index.php?option=com_content&view=article&id=246&Itemid=126)をダウンロードしてくる。  
public_html内のDodontoFとimageUploadSpaceをドキュメントルート内に展開。ファイルの改行コードを全部変換。  [kanjitranslator](http://www.kashim.com/kanjitranslator/)が便利だった。  
一つ上にsaveDataを展開。  
DodontoF/DodontoFServer.rbのshebangを編集。PATHを通してあるので`ruby`とだけ書けばいい。

```ruby:一行目
#!ruby
```

![2016-11-17.png](https://qiita-image-store.s3.amazonaws.com/0/57768/a1b95ec1-2693-a74c-9d79-64042f60b2ea.png)


Apacheを起動し、ブラウザでlocalhost/DodontoF/DodontoFServer.rbにアクセスしてみる。
すでにポートは解放されているので、ルータとかの設定をすればもう使える。
セキュリティは考えていない。Windowsでは何をすればセキュリティを考えたことになるのかまた調べておきたい。
なぜAMPなのか？HTML5+レスポンシブではダメな理由

AMP(Accelerated Mobile Pages)について一通り学んでも、

なぜ AMP なのか？
なぜ HTML5 + レスポンシブウェブデザインではダメなのか？（少なくともGoogleはそう判断した）
なぜ Google は AMP を猛プッシュしているのか？
なぜ巨大メディアが一斉にAMP化しはじめたのか？

といった疑問が残ったままだと思いますので、記事を書いてみました。

[なぜAMPなのか？HTML5+レスポンシブではダメな理由](https://www.craneto.co.jp/archives/958/)


Qiita 補足
AMPは「出来ること」は少ないくせに工数はガッツリかかります（外部CSSの統合とか不毛な作業にも思えます・・・）。最前線の”現場”は消耗しがちですが、AMPはモバイルWebが生き残るために生み出された（少なくともGoogleはそう考えている）ということを書いています。
NanoPiでwiringPi

WiringOPを使ってNanoPiでwiringPiで遊ぶ。

http://ekizo.mandarake.co.jp/shpimg/00/00/306/114.jpg


# 予備知識

WiringOPはOrangePiのwiringPi。OrangePiのプロセッサは Allwiner H3。NanoPi-M1 や NanoPi-Neo は同じプロセッサを使っている。

GPIO番号はNanoPi-NeoはデフォルトでWiringPiになっていて使いやすい。

# 下準備

インストール、ログインなどは「Piで遊ぼう」を参照して済ましておいて下さい。
http://qiita.com/nanbuwks/items/11cba54cdc209db48f28

```
apt-get update
apt-get install git-core
apt-get install sudo
```

# コマンドラインで使おう！

以下をすると、コマンドラインから gpio コマンドが使えるようになります。
```
git clone https://github.com/zhaolei/WiringOP.git -b h3
cd WiringOP
chmod 777 build
./build
```

# pythonで使おう！
上のやりかたで、コマンドラインから使うWiringPiはインストールされるが、Pythonからは使えない。更に作業。

いろいろ入ってないので入れておく

```
apt-get install python swig python-dev python-setuptools
```

```
git clone --recursive https://github.com/lanefu/WiringPi-Python-OP
cd WiringPi-Python-OP/
swig2.0 -python wiringpi.i
python setup.py install
```

# python3で使おう！

```
apt-get install swig python3-dev python3-setuptools
```
```
git clone --recursive https://github.com/lanefu/WiringPi-Python-OP
cd WiringPi-Python-OP/
swig2.0 -python wiringpi.i
python3 setup.py install
```
#11 【攻略】RubyWarrior Level2 ~中級編~

RubyWarrior Level2中級編をやっていきます。
前回同様道幅が広くなっているので、Level2でもちょっと難しめに感じます。

#概要
道幅広い+敵が広がって行く手を阻んでいます。いい感じに倒しつつ進みましょう。
ゲームの案内文の、
>Just like walking, you can attack! and feel in multiple directions (:forward, :left, :right, :backward).

がいいヒントになってます。

#スクリプト
```
class Player
  def play_turn(warrior)
    dir = warrior.direction_of_stairs
    
    if warrior.feel(dir).empty?
      warrior.walk!(dir)
    else
      warrior.attack!(dir)
    end
  end
end
```

#解説
まず、

```
dir = warrior.direction_of_stairs
```
でdirに階段の方向を入れてあげる。

そして、

```
if warrior.feel(dir).empty?
  warrior.walk!(dir)
else
  warrior.attack!(dir)
end
```
dirの方向がemptyならばその方向に進行、違ったらその方向に攻撃、といった感じ。
iframeをレスポンシブ対応させる方法

YouTubeの動画を埋め込みたいときってたまにありますよね。
でも、それがレスポンシブ案件だったりすると単純にiframeを入れるだけだとちょっとだけレイアウトが崩れちゃいます。例えば以下の感じ。

![スクリーンショット 2016-11-17 16.10.22.png](https://qiita-image-store.s3.amazonaws.com/0/120961/66df7793-2a14-835c-ebd7-275a98bef17f.png)

ソースは以下。


```HTML:sample01.html
<div class="movieWraper">
            <div class="iframeWrap">
                <iframe width="100%" height="100%" src="https://www.youtube.com/embed/PcUVtC-f8RY" frameborder="0" allowfullscreen></iframe>
            </div>
        </div>
```

```CSS:sample01.css
.movieWraper {
    width: 100%;
}

.iframeWrap{
    width: 100%;
}
```

幅１００％にしても高さが固定されてて横長になっちゃいます。
 解決法
-
これの解決法としては、
・iframeにposition:absoluteを指定
・.iframeWrapは高さをなくしてpaddingで高さを決める
と良いです。
ソースは以下。(htmlは変更なし)

```CSS:sample02.css
.movieWraper {
    position: relative
    width: calc(100% - 10px);
    margin: 0 auto;
}

.iframeWrap{
    height: 0;
    padding-bottom: 62.5%;
}

iframe {
    position: absolute;
    top: 0;
    left: 0;
}
```

.iframeWrapで指定したwidthとpadding-bottom(padding-topでも良い)はそのときに応じた良い感じのパラメータ設定してください。

2016/11/18 追記
-
コメントいただいた通り、padding-bottom(padding-top)は動画の比率利用して9 / 16 = 0.5625 → 56.25(%)を利用すると丁度良さそうですね。
ご指摘ありがとうございました。

まとめ
-
決して難しいことはしてないですが、忘れっぽくて細かいやり方忘れてたのでメモでした。
以上。
export PATH=... でパスを追加するときの注意点

# 正しい書き方

```sh
export PATH="$HOME/bin":"$PATH"
```
→今のところ問題なし。

# これまでの失敗

```sh
export PATH=$PATH:~/bin
```
→`$PATH` に空白を含むことがあった。

```sh
export PATH="$PATH:~/bin"
```

→チルダが展開されない。[参考](http://stackoverflow.com/questions/15858766/tilde-expansion-in-quotes)

```sh
export PATH="$PATH":$HOME/bin
```

→`$HOME`に空白を含むことがあった(!)。

```sh
export PATH="$PATH":"$HOME/bin"
```

→`$HOME/bin`を優先させた方が良いのでは？

```sh
export PATH="$HOME/bin":"$PATH"
```
→今のところ問題なし。
composer updateが何か失敗する時

xdebugが悪さしている時があるのでコメントアウトするとよくなる時がある
```
;zend_extension = "/path/to/my/xdebug.so"
```
詳しくは公式へ
https://getcomposer.org/doc/articles/troubleshooting.md#xdebug-impact-on-composer
addEventListener の第3引数が拡張されてるという話

Webアプリケーションのお話です。

イベントハンドラを登録する `addEventListener` メソッドの引数は以下の形で覚えている人が大半だと思う。

```js
element.addEventListener('click', myClickHandler, useCapture);
```

新しい Web 標準ではこういった形に拡張されているよ、という話。

```js
element.addEventListener('click', myClickHandler, {
  once: true,
  passive: true,
  capture: true
});
```

## 参考記事

https://developers.google.com/web/updates/2016/10/addeventlistener-once

## EventListenerOptions

これまでの第3引数 `useCapture` は `boolean` 型をとり、イベントハンドラがキャプチャフェーズ or バブリングフェーズのどちらで処理されるかを制御するものだった。

この第3引数が `Object` 型も受け付けるようになり、現状、それぞれ `boolean` 型で `once` , `passive` , `capture` パラメータをとる。

## `once`

`true` でイベントハンドラが1度だけ処理される。

例えば `Window` の `load` イベントハンドラは通常1度だけ実行される。イベントハンドラおよびそのスコープ変数はイベントハンドラ登録されている限り参照を保持するのでガベージコレクションの対象ではなく、こういったイベントハンドラはメモリの無駄となる。イベントハンドラ内で `removeEventListener` を記述するよりも容易にガベージコレクションのケアができるよという機能。

## `passive`

`true` でこのイベントハンドラが Passive event であることをブラウザに伝える。

イベントハンドラは `event.preventDefault()` でブラウザのスクロールを抑止する可能性があるため、ブラウザはイベントハンドラの処理が終了するまでスクロールを開始することができず、その遅延はユーザー操作を阻害する。Passive event はブラウザのスクロールを抑止しないということで、このフラグが立ったイベントハンドラではブラウザは処理の完了を待つ必要がなくなり、ユーザー操作の阻害を回避することができる。

どの程度ユーザー操作が改善されるかは以下記事内の動画が参考になる。
https://developers.google.com/web/updates/2016/06/passive-event-listeners

## `capture`

これまでの `useCapture` と同様、イベントハンドラがキャプチャフェーズ or バブリングフェーズのどちらで処理されるかを制御する。

## これまで通り `true|false` を指定したらどうなるか？

`boolean` 型が来た場合は互換性が保持されているので、キャプチャフェーズ or バブリングフェーズの制御となる。

## 対応バージョン

- `passive`
    - Chrome 51+
    - Firefox 49+
    - Safari's technology preview 7+
- `once`
    - Chrome 55+
    - Firefox 50+
    - Safari's technology preview 7+

MicrosoftEdge は [EventListenerOptions の Issue](https://github.com/MicrosoftEdge/Status/issues/442) が Open だった（2016/11/17時点）。
symfony twig拡張メモ

symfony公式にはfilterしか書いてないのでよく使いそうな
function,filter,globalのtwig拡張のメモ。

###クラス例

```
namespace CommonBundle\Twig\Extension;

class CommonExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface
{

    protected $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function getName()
    {
        return "common_extension";
    }

    /**
     * twigで使用するfilterを設定
     *
     * @return array
     */
    public function getFilters() {
        return [
            new \Twig_SimpleFilter('date'  ,[$this, 'dateFilter']),
           ];
    }


    /**
     * twigで使用するfunctionを設定
     *
     * @return array
     */
    public function getFunctions() {
        return [
            new \Twig_SimpleFunction('testFunction', [$this, 'testFunction']),
        ];
    }

    /**
     * twigで使用するglobal変数を設定
     *
     * @return array
     */
    public function getGlobals()
    {
       //twig内で使用したい変数とかを返り値に設定
        $user = "hogehoge";
        return [
            'user' => $user,
        ];
    }

    /**
     * @param  $dateTime
     * @return string
     */
    public function dateFilter($dateTime)
    {
        // 何か処理
        return $hoge;
    }

        /**
     * @param  hoge 
     * @return string
     */
    public function testFunction($hoge)
    {
        // 何か処理
        return $hoge;
    }
}
```

### DI設定
####service.yml
サービスコンテナーを使う場合

```
    common.twig.extension:
        class: CommonBundle\Twig\Extension\CommonExtension
        arguments: ['@service_container' ]
        tags:
            - { name: twig.extension }
```

###twig側

####filter

```
{{ dateTime|date }}
```
####function 

```
{{ testFunction("hogehoge") }}
```

getGlobalで指定した変数はtwig側でも使えるようになる

```
{{ user }}
```

```
hogehoge
```
と出るはず。
一番簡単にPHPでローカル開発サーバーを立てるコマンド

#index.phpのある場所でこのコマンド一発
`php -S localhost:8000`
http://localhost:8000
にアクセスしたら見れます。

#もうちょっと詳細に
```PHP:command
//cdコマンドでプロジェクト直下に入る。
cd Desktop
cd project

//PHPビルトインサーバーを立てる。どれでもいい。
php -S localhost:8000

//もしうごかなければ下記で試す
php -S 0.0.0.0:8000
php -S 127.0.0.1:8000


//サーバーが立つとこんなメッセージが出る。

MacBook-Air:project user$ php -S localhost:8000
PHP 5.6.22 Development Server started at Thu Nov 17 16:23:42 2016
Listening on http://localhost:8000
Document root is /Users/user/Desktop/project
Press Ctrl-C to quit.

//下記URLにアクセスして表示されたら成功。
http://localhost:8000

```

プロジェクト直下、もしくはindex.phpを置いてる場所で起動します。

簡単にサーバーを立てれるので重宝しますが、たしかhtaccessとかは動かないはずなので簡易的なものであるという点は一応注意する。だがほとんどの場合はこれで問題ない。
ワードプレスとかはほとんどこれでいける。
Errbit 0.6.0 系で メール通知の方法が変わっていた

# Before

0.3.0.dev では App 側の設定で「どのユーザーに通知を送るか」を選べた。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/73cfda70-1f85-485a-dc3d-056b6c73b97a.png)

# After

0.6.0 ではこんな感じ。選択肢がなくなっている。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/41e498bb-0372-b750-9a67-1f9ab6be9873.png)

そのかわり、errbitのユーザー毎に watch / unwatch を切り替えられる仕様に変わったようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/6371583e-cd26-1032-4422-610d91ea680b.png)

watch を選ぶとこんな感じになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/e29e9edb-2cfb-c28b-169e-db8cb5fc5477.png)

*画面上でWatchersをクリックしないと、一覧が表示されないので注意。（分かりづらい）

# 参考

- https://github.com/errbit/errbit/issues/1077








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
TsungでWebの負荷テストのメモ

`ab`とか`wrk`とか試したけども、簡易的なものじゃなくてもっとちゃんとやりたい。
でも`JMeter`はGUIメインだから使いにくい。

と思って探したら`Tsung`というのがあるらしいので使ってみた。

```
# apt-cache policy tsung
tsung:
  インストールされているバージョン: (なし)
  候補:               1.5.1-1
  バージョンテーブル:
     1.5.1-1 0
        500 http://ftp.jp.debian.org/debian/ jessie/main amd64 Packages

# apt-get install tsung
```

依存パッケージがめっちゃインストールされる。元々`erlang`入れてたよなーと思ったら、今使ってるのは公式パッケージじゃなくてerlang-solutionsのやつだった。なんか混ざるっぽいけどまあいい。


インストールしたら、おもむろに

```
tsung-recorder start
```

としてレコーダーを起動。

そして、Firefoxを立ち上げてプロキシにlocalhost:8090を設定する。
Chromeはシステム共通のプロキシ設定を使うようだったので普段使わないFirefoxで。
`https://example.com/` への接続は `http://-example.com/` とURLを入力するらしい。

一通り巡回したら

```
tsung-recorder stop
```

してブラウザを終了。
設定ファイルをコピーして編集する。

Facebookのプラグインとかアフィリエイトへのリクエストも混じっているので削除する。
これターゲットのサーバーを指定するから削除しなくても大丈夫？まだ詳しく見てない。
あと`CONNECT`メソッドなんかも削除する。

それから

```xml
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
  <clients>
    <client host="localhost" use_controller_vm="true"/>
  </clients>
  <servers>
    <server host="example.com" port="443" type="tcp"></server>
  </servers>
  <load>
    <arrivalphase phase="1" duration="1" unit="minute">
      <users arrivalrate="5" maxnumber="50" unit="second"></users>
    </arrivalphase>
  </load>

  <options>
    <option type="ts_http" name="user_agent">
      <user_agent probability="50">Tsung1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.33 Safari/537.36</user_agent>
      <user_agent probability="50">Tsung2 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.33 Safari/537.36</user_agent>
    </option>
  </options>
<sessions>


...ここに <session>


</sessions>
</tsung>
```

のような感じで記録した`<session>`を挟む。
そして

```
tsung -f example.com_phase1.xml start 
```

のようにベンチマーク開始。念の為ターゲットのサーバーで負荷やログをチェックしつつ、終わったら

```
mkdir 20161117-1402
cd 20161117-1402
/usr/lib/tsung/bin/tsung_stats.pl --stats ~/.tsung/log/20161117-1402/tsung.log
```

レポートを出力。



で、`use_controller_vm="true"` を外して複数クライアントにした肝心の分散テストができない…。
http://tsung.erlang-projects.org/user_manual/faq.html
ここの最初の説明にある`erlang`で`slave`が無理ぽい。
`erl`コマンド使ったことないからどうやって抜けるかも分からなかったし。`erlang`むず。

まあクライアント１台ならテストできるようになったので今日はここまで。
直近1時間のCPUクレジットの推移を取得するワンライナー


以下の `{インスタンスID}` はメトリクスを取得したいEC2インスタンスのインスタンスIDを指定すること。

```
$ aws cloudwatch get-metric-statistics \
  --namespace 'AWS/EC2' \
  --region ap-northeast-1 \
  --period 300 \
  --start-time `date +'%Y-%m-%dT%H:%M:59Z' --utc -d '60 minutes ago'` \
  --end-time `date +'%Y-%m-%dT%H:%M:59Z' --utc` \
  --metric-name CPUCreditBalance \
  --dimensions '{"Name":"InstanceId","Value":"{インスタンスID}"}' \
  --statistic Average \
  --query 'Datapoints[*].[Timestamp,Average,Unit]' \
  --output text \
  | sort
```

実行結果

```
2016-11-17T06:18:00Z    353.92  Count
2016-11-17T06:23:00Z    355.9   Count
2016-11-17T06:28:00Z    357.88  Count
2016-11-17T06:33:00Z    359.86  Count
2016-11-17T06:38:00Z    361.84  Count
2016-11-17T06:43:00Z    363.82  Count
2016-11-17T06:48:00Z    365.8   Count
2016-11-17T06:53:00Z    367.77  Count
2016-11-17T06:58:00Z    369.75  Count
2016-11-17T07:03:00Z    371.72  Count
2016-11-17T07:08:00Z    373.7   Count
2016-11-17T07:13:00Z    375.64  Count

```

## 参考

https://forums.aws.amazon.com/thread.jspa?messageID=557913
一番簡単にPHP(Laravel)で認証機能(Auth)をつくるコマンド

###認証一発作成コマンド(Laravel)
```Laravel:Laravel
php artisan make:auth
```
このコマンド一行で、安心安全な認証機能が自動で実装されます。
内容としては、新規登録、ログイン、ログアウト、パスワードリセットなどです。
嘘みたいですが、本当です。

簡単、楽、早い

Laravelのインストールについてはまた記事書きますので、フォローしておいてください。
一番簡単にLaravel最速インストール方法、とかってタイトルで環境構築方法書きます。
#10 【攻略】RubyWarrior Level1 ~中級編~

RubyWarrior Level1中級編です。
奥行きが出てきてちょっと難しくなりました。

#概要
初回は階段のある位置を自動的に見つけてくれるwarrior.direction_of_stairsが登場します。
このメソッドは「自動的に」階段の方向を見つけてくれるのですが...自分で書いてる時は気づかず、ちょっと不思議なスクリプトになってしまいました。

#スクリプト
```
class Player
  def play_turn(warrior)
    case warrior.direction_of_stairs
    when :right
      warrior.walk!(:right)
    else
      warrior.walk!
    end
  end
end
```

#解説
このスクリプトだと、warrior.direction_of_stairsに入る方向の値が、
right forward right forwardのように変化します。なので進行方向も同様に変化してゴールができる...という感じです。

warrior.direction_of_stairsを変数に入れてwarrior.walk!の引数に入れてあげたほうがはるかに楽で綺麗だと思います(と書いてから気づきました)。