OmniAICreator/Qiita-1.07M huggingface dataset:
Opsworksのcookbookをtest-kitchenでテストする


AWS OpsworksでChefのcookbookを使うことができる訳ですが
Opsworks単体ではテストツールが無くcookbookを練り込むのがそこそこ手がかかります。

※Opsworksを使うまでは以下を参考にしてみてください。
http://blog.enokawa.co/2016/05/14/opsworks-codecommit/

Opsworksでは標準のchefとは異なる独自の手法でcookbookを実行していますがtest-kitchenでテストしたcookbookも使いまわせます。
ですので、chefのテストツール、test-kitchenを使えば数行のコマンドでEC2を起動してcookbookのテストを走らせる事ができます。
効率よくrecipeを書いていくためにもtest-kitchenを利用するのが良いかと思います。

# 環境
クライアントPC
 - OS: Mac OS X 
 - chefdk : 0.13.21(latest)
EC2:
 - OS: Amazon Linux 201603
 - Chef: 12.10(latest)

# 準備
## install chefdk
cookbookの開発ツールchefdkをインストールしましょう。

```
$ brew cask install chefdk
```

## cookbook作成

```
$ chef generate cookbook hello-chef
```

必要なディレクトリやファイルが作成されます。

```
$ cd hello-chef
$ kitchen init --driver=kitchen-ec2
```

ドライバーを指定するとgemが勝手にkitchen-ec2をインストールしてくれます。

# test kitchenの設定

### .kitchen.yml
テストに関して、共有する情報を記載する。

```
---
driver:
  name: ec2
  shared_credentials_profile: 
  aws_ssh_key_id: 
  region: 
  subnet_id: 
  associate_public_ip: true
  iam_profile_name: 
  security_group_ids: 
  availability_zone: 
  require_chef_omnibus: true

transport:
  ssh_key:
  username: ec2-user

provisioner:
  name: chef_zero

platforms:
  - name: AmazonLinux-201603
    driver: 
      image_id: ami-29160d47

suites:
  - name: default
    run_list:
      - recipe[hello-chef::default]
    attributes:

```

### .kitchen.local.yml
他人と共有しない自身のテスト環境について記載する

```
---
driver:
  name: ec2
  shared_credentials_profile: default
  aws_ssh_key_id: aws-miso4ru_ap-northeast-1
  region: ap-northeast-1
  subnet_id: subnet-e571de92
  associate_public_ip: true
  iam_profile_name: test-kitchen
  security_group_ids: ["sg-4c4d2029"]
  availability_zone: ap-northeast-1a
  require_chef_omnibus: true

transport:
  ssh_key: ~/.ssh/aws-miso4ru_ap-northeast-1.pem
  username: ec2-user

```

shared_credentials_profileは `~/.aws/credentials` に記載されてるprofileを指定すればOKです。

kitchen-ec2を使った時の`.kitchen.yml`の具体的な書き方は以下を参考にすると良いと思います。
https://github.com/test-kitchen/kitchen-ec2




# テスト開始
テストのやり方とか出来ることとかは以下を参考にすると良いと思います。
http://qiita.com/eielh/items/64e197f4f1eaf5ff6097

テストの状態表示

```
$ kitchen list
Instance                    Driver  Provisioner  Verifier  Transport  Last Action
default-AmazonLinux-201603  Ec2     ChefZero     Busser    Ssh        <Not Created>
```

インスタンス作成

```
$ kitchen cretae
```

cookbook 実行

```
$ kitchen converge
```

ざっくりこんな感じでテストできます。

EC2にログインして確認するには

```
$ kitchen login
```

で入れます。

serverspec等でテストを記載していたら

```
$ kitchen verify
```

テスト終わったらgit pushで上げて、Opsworkに食わせれば良いと思います。


後片付けとしてEC2も消しておきましょう。

```
$ kitchen destroy
```

# その他 tips
## foodcriticを使ってスタイルチェック

chefdkに同梱されてるコードスタイルのチェックツール
使い方は単純、cookbookのパスを引数にして実行するだけ

```
foodcritic [cookbook-path]
```

空白が返ってくればOK,何か言われたら以下を参考に修正するとよし。
http://www.foodcritic.io/

なお、foodcriticのデフォルトだと、supermakrtにアップロードする際のチェックが入る。
公開しないcookbookなら除外したほうが良い。
cookbookの直下に .foodcritic を作成して以下を記載すればOK。

```
~FC064
~FC065
```

# 参考
http://qiita.com/eielh/items/64e197f4f1eaf5ff6097
https://github.com/test-kitchen/kitchen-ec2
https://jjasghar.github.io/blog/2014/02/17/dot-kitchen-dot-local-dot-yml-and-when-you-want-to-use-it/
GraphXの情報がまとまっているページ一覧


## 概要
ググる前にここ見れば超入門の内容ならキャッチアップできるようにしておきたい
**（てかいちいちググるの大変）**


##公式
[GraphX本家サイト](http://spark.apache.org/graphx/)
→これは概要だけ。まあ本家なので間違ってるはずがない。はず。

[GraphX programming guide](http://spark.apache.org/docs/latest/graphx-programming-guide.html)
→チュートリアル的なもの。内容ちょっと不親切な感じした。
（ってなると他に見るもの無くなりそうだけど、、、）

[GraphXAPIドキュメント](http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.package)
→実際はSparkのScalaドキュメントだけど、GraphXも載ってるのでとりあえず掲載

##非公式
[TEPPEI STUDIO](http://teppei.hateblo.jp)
→去年GraphX Advent Calendarを一人でずっと回していた根気のある人。
　簡単な処理を丁寧に記載していて、割りとわかりやすい

[CL LAB](http://www.creationline.com/lab/10827)
【express4.x】セッション情報をDynamoDBに保存する

# はじめに

サーバ一台で稼動するアプリでしたらサーバー内でセッション情報を持たせとけばいいですが、
サーバ複数台に対してELBでリクエストを振り分けるとかなるとそういうわけにもいかなくなります。
セッション情報のためにDBサーバとかRDSとかは仰々しいし、ファイルにしてS3に置くというのも微妙な気がしてたのですが、DynamoDBを使うモジュールがあったので使ってみました。

# パッケージインストール

使うのは

- [express-session](https://github.com/expressjs/session)
- [connect-dynamodb](https://github.com/ca98am79/connect-dynamodb)

の二つですので、

`npm install --save express-session connect-dynamodb`

でさくっとインストール

## 余談
express-sessionはセッション情報の保存先に応じて必要なモジュールを追加でインストールするという形式をとっていて、
対応できる範囲はかなり広いです。

# app.js内で設定

DynamoDBを使うので当然IAM情報も必要です。
テーブル作ったり書き込んだりするので、権限のあるIAMを用意しときましょう。

```js:app.js
var session = require('express-session');
var DynamoDBStore = require('connect-dynamodb')({session: session});
var proxy = require('proxy-agent');
var DynamoDBStoreOptions = {
    table: "db-session", //保存先のテーブル名　デフォルトは"sessions"
    hashKey: "session-id", //ハッシュキー　デフォルトは"id"
    prefix: "session",    //ハッシュキーに付与するプレフィックス デフォルトは"sess"
    AWSConfigJSON: {
        region: 'your region',
        correctClockSkew: true,
        credentials: {
        accessKeyId: 'your accessKeyId',
        secretAccessKey: 'your secretAccessKey'
        },
        httpOptions: {
            agent: proxy("http://proxyserver.com:8080"), //プロキシ環境下なら必要
            //↓二つはDynamoDBのEPROTOエラー回避のため
            secureProtocol: 'TLSv1_method',
            ciphers: "ALL"
        },
    },
    reapInterval: 24 * 60* 60 * 1000 //セッション情報の保持時間
};

var app = express();

app.use(session({
	store: new DynamoDBStore(DynamoDBStoreOptions),
	name:'session-name',
	secret: 'session-secret-key',
	resave: false,
	saveUninitialized: false,
	cookie: {
                //express-sessionを使っているため、httpOnlyオプションはデフォルトでtrue
		maxAge: 24 * 60* 60 * 1000,
		secure: true
	}
}));

```

こんな感じで設定すればDynamoDB上にセッション情報が保存されるようになりました。
これでELBも怖くありませんね。

# おまけ　DynamoDBのEPROTOエラーについて

APIでDynamoDBにアクセスすると時折**NetworkingError: write EPROTO**と怒られることが...
EPROTOってどういうことやねん、プロトコルかよ!
原因がさっぱりわからず、ググッたりAWSの公式に聞いたりしても原因追求には至らず。
公式でも調査対応中のようです。

とりあえずググッた結果及び公式の回答によるとhttpOptionsにsecureProtocol: 'TLSv1_method'とciphers: "ALL"を加えたら怒られなくなったという報告が多いとのことなのでそれに倣っています。

実際に上記オプションを加えてからは再発してないのですが...
うーむ、闇が深い。
素のPHPでも最低限.envとmonologくらいは使う際の手順

 
 「ま、とりあえず」と書き始めたPHPスクリプトがそのまま本番投入されてしまうことは少なくありません。。。後から、「環境変数とかログ出力とかちゃんとしとけば良かった」と後悔することが多いので、最低限のセットアップ方法をメモ。
 
 
##前提
 
どちらもcomposer使ってインストールするのでcomposerはインストールしておいて下さい。
 
##インストール？
 
###.env
 
```bash
composer require vlucas/phpdotenv
```
 
###monolog

```bash
composer require monolog/monolog
```

##利用

少しめんどくさいが、後の手間を考えると我慢できる範囲。

```php
<?php
	
	//require
	require_once __DIR__.'/vendor/autoload.php';

	//for .env
	use Dotenv\Dotenv;

	$dotenv = new Dotenv(__DIR__);
	$dotenv->load(); //.envが無いとエラーになる

	//for monolog
	use Monolog\Logger;
	use Monolog\Handler\StreamHandler;

	//ログにつくprefixを与えてインスタンス作成
	$log = new Logger('MONOLOG_TEST');
	//ログレベルをDEBUG（最も低い）に設定
	$handler = new StreamHandler('./app.log',Logger::DEBUG);
	$log->pushHandler($handler);


	//利用 ///////////////////////////////////

	//.env
	//変数名が他の環境変数と被らないように注意
	$name = getenv('TEST_NAME');
	echo $name;

	//monolog
	$log->addDebug('でばっぐ');
	$log->addInfo('いんふぉ');
	$log->addWarning('わーにんぐ');
	$log->addError('えらー');
```

```php
$dotenv = new Dotenv(__DIR__);
```

としているので、PHPファイルと同じディレクトリに.evnを作成し、

```php
TEST_NAME=hoge
```

等としておく。

##その他

###.envを.gitignoreに書いておく

通常.envはリモートに上がると良くないのでgitを使う場合は.envを.gitignoreに書いておく。

###オレオレClassもautoloadできるようにしておく

せっかくツール類をautoloadしているのに自作のクラスは別途requireなんてダサいことはしたくありません。
ここでは、カレントディレクトリにClassesというクラスを保持用のフォルダを作成し、Sampleというnamespaceをマップしてみます。

composer.jsonにautoloadの記述を追加する。

```json
{
    "require": {
        "vlucas/phpdotenv": "^2.2",
        "monolog/monolog": "^1.19"
    },
    "autoload": {
    	"psr-4": {
    		"Sample\\" : "Classes/"
    	}
    }
}

```

autoloadを追加したら、ターミナルでcomposerを更新する

```
$ composer dump-autoload
```

###サンプルのクラスを作成し、namespaceを記述する

```php
<?php

	namespace Sample;

	class sampleClass{

		public function Hello()
		{
			echo "Hello Sample\n";
		}

	}
```

###メインファイルから利用する

```php
<?php
	
	//require
	require_once __DIR__.'/vendor/autoload.php';
	
	//他のコード割愛
	
	//use
	use Sample\sampleClass;

	$sc = new sampleClass;
	$sc->Hello();
```
JavaScriptで昨日の日付を取得する

自動的に、
その日の昨日の日付を取得し、
その後年月日を切り離して使用したい時。


## 今日を取得して年月日を切り離して使用する場合

```js
var objDate = new Date(),
    year    = objDate.getFullYear(),
    month   = objDate.getMonth()+ 1,
    day     = objDate.getDate();
```

## 昨日を取得して年月日を切り離して使用する場合

```
var objDate = new Date();

objDate.setDate(objDate.getDate() - 1);

var year    = objDate.getFullYear(),
    month   = objDate.getMonth()+ 1,
    day     = objDate.getDate();
```
pythonのshallow / deep copyがひと目で分かる@PythonTutor.org



![スクリーンショット 2016-05-23 11.46.03.png](https://qiita-image-store.s3.amazonaws.com/0/44835/1c6bd909-5bc0-ee4a-3e8f-8698dd0d833b.png)

コードへのリンクはこちら

- http://www.pythontutor.com/visualize.html#code=list_src++%3D+%5B1,%5B2,3%5D,4%5D%0Alist_dst1+%3D+list_src%0Alist_dst2+%3D+list_src%5B%3A%5D%0A%0Aimport+copy%0Alist_dst3+%3D+copy.copy(list_src%29%0Alist_dst4+%3D+copy.deepcopy(list_src%29&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=2&rawInputLstJSON=%5B%5D&curInstr=6
機械学習初心者が線形回帰やってみる

## はじめに

* [機械学習初心者がナイーブベイズに手を出してみる](http://qiita.com/RINDO/items/fe4c32eddc3ed880433b)
* [機械学習初心者が決定木を作ってみる](http://qiita.com/RINDO/items/a5bf5b995eefa02dd738)

に続き、3回目になります。 今回は線形回帰をやってみたいと思います。
例によって、Pythonで実装, 詳しい説明は無理なので別のサイトでお願いします(笑
だんだん、雑になってきてる感ありますが生温かい目で見守ってください。

## 要点

用語的には以下の2つです。

* 平均二乗誤差
* 勾配法

### 平均二乗誤差

線形回帰の場合、分布されたデータに対して　`y　= Θ_1x + Θ_2` の線を引きますが、その線を引いて実データとの誤差を取ることを平均二乗誤差と言います。

サンプルでは、以下のようにして定義しています。

T.dot()は内積の関数です。 それを切片の和から実データのyを引いて2乗したものを合計して学習データ数(m)で割ってます。

```py
#費用関数
j = T.sum(T.sqr(t[0] + T.dot(data, t[1:]) - target)) / (2 * m)
```

図やらのイメージは[
機械学習アルゴリズム実装シリーズ [線形回帰編]](http://blog.brains-tech.co.jp/entry/2015/10/29/154922) を参考にしてください！！

### 勾配法

勾配法は、`y　= Θ_1x + Θ_2`のΘ_1, Θ_2 をより正しいであろう方向に修正していくための方法です。

コード的には以下です。 t(= theta = Θ)という共有変数 (np.array([0,0])とする.)を微分する`T.grad ()`をいうのを定義しています。 上記で定義した平均二乗誤差の関数を、それぞれΘ1, Θ2に関して偏微分をします。
その後、 `train()`という関数を定義して`updates = ({})`で実行ごとにtの値を更新します。

```py
# 偏微分
dt = T.grad(cost=j, wrt=t)

# 勾配法(Θの更新)
train = theano.function(
    inputs  = [],
    outputs = [j],
    updates = ({t: t - (alpha*dt)})
    )
```

イメージは[第4回 勾配法（最急降下法）](https://github.com/levelfour/machine-learning-2014/wiki/%E7%AC%AC4%E5%9B%9E---%E5%8B%BE%E9%85%8D%E6%B3%95%EF%BC%88%E6%9C%80%E6%80%A5%E9%99%8D%E4%B8%8B%E6%B3%95%EF%BC%89)を参考にしてください！！

## サンプル (python)

コード見せろって人のために、コード貼っておきます。実装にはtheanoというライブラリを使っているのでわからない方はggってください！
予測あたりのコードはかけてません(時間あればコードアップデートします)

``` py
# -*- coding: utf-8 -*-

import numpy as np
import theano
import theano.tensor as T

class Regression:

    def __init__(self):
        self.t = None


    def fit(self, data, target, alpha=0.1):
        # 説明変数の長さを計算
        if isinstance(data[0], (np.ndarray, np.generic)):
            m = len(data[0])
        else:
            m = len(data)

        # 共有変数
        t = theano.shared(np.zeros(m+1), name='theta')

        # 費用関数
        j = T.sum(T.sqr(t[0] + T.dot(data, t[1:]) - target)) / (2 * m)
        # 偏微分
        dt = T.grad(cost=j, wrt=t)
        # 勾配法(Θの更新)
        train = theano.function(
            inputs  = [],
            outputs = [j],
            updates = ({t: t - (alpha*dt)})
            )
        # 学習
        for i in range(100):
            train()


if __name__ == '__main__':

    from sklearn import datasets

    iris = datasets.load_iris()

    reg = Regression()
    reg.fit(data=iris.data, target=iris.target)
```

## 参考

以下のサイト大変参考にさせていただきました

* [
機械学習アルゴリズム実装シリーズ [線形回帰編]](http://blog.brains-tech.co.jp/entry/2015/10/29/154922)
* [第4回 勾配法（最急降下法）](https://github.com/levelfour/machine-learning-2014/wiki/%E7%AC%AC4%E5%9B%9E---%E5%8B%BE%E9%85%8D%E6%B3%95%EF%BC%88%E6%9C%80%E6%80%A5%E9%99%8D%E4%B8%8B%E6%B3%95%EF%BC%89)
jqコマンドまとめメモ

##jqコマンドめも
・コマンドで指定するときの.（ドット）は項目名を表している
・コマンドで指定するときは項目を並べることで階層をたどっている（ドキュメントルートでいう/みたいな）
例えば　`$ jq -r '.foo.bar[]'`　でbar以下の情報までたどる
参考：http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af
元データはこれ（ネットでひろったやつ）

``` 
{
  "foo": {
    "bar": [
      {
        "key": "1-key",
        "value": "1-value"
      },
      {
        "key": "2-key",
        "value": "2-value",
        "option": "2-opt"
      }
    ],
    "baz": [
      {
        "key": "3-key",
        "value": "3-value",
        "option": "3-opt"
      },
      {
        "key": "4-key",
        "value": "4-value"
      }
    ]
  }
}
```


### スクリプト用データとしてCSV出力がしたい場合

```
$ cat sample.json | jq -r '.foo.bar[]'
{
  "key": "1-key",
  "value": "1-value"
}
{
  "key": "2-key",
  "value": "2-value",
  "option": "2-opt"
}
```

### 要素を指定して表示させる
```
$ cat sample.json | jq -r '.foo.bar[]|[.key, .value]'
[
  "1-key",
  "1-value"
]
[
  "2-key",
  "2-value"
]
```

###[]番目の配列として表示（配列に入れる）
```
$ cat sample.json | jq -r '.foo.bar[0]|[.key, .value]'
[
  "1-key",
  "1-value"
]
```

###配列に入れてcsvで出力
```
$ cat sample.json | jq -r '.foo.bar[0]|[.key, .value]|@csv'
"1-key","1-value"
 
$ cat sample.json | jq -r '.foo.bar[]|[.key, .value]|@csv'
"1-key","1-value"
"2-key","2-value"
```

###csvで出力したものをawkで成形
`$ awk -F, '{print ($1)}'`
これでcsvの1列目だけを表示する

```
$ cat sample.json | jq -r '.foo.bar[]|[.key, .value]|@csv' | awk -F, '{print $1}'
"1-key"
"2-key"
 
$ cat sample.json | jq -r '.foo.bar[]|[.key, .value]|@csv' | awk -F, '{print $1,$2}'
"1-key" "1-value"
"2-key" "2-value"
```

###　""が邪魔なのでsedで置き換える
```
$ cat sample.json | jq -r '.foo.bar[]|[.key, .value]|@csv' | awk -F, '{print $1,$2}' | sed -e 's/"//g'
1-key 1-value
2-key 2-value

$ cat sample.json | jq -r '.foo.baz[]|[.key, .value]|@csv' | awk -F, '{print $1,$2}' | sed -e 's/"//g'
3-key 3-value
4-key 4-value
```

### .foo.barじゃなくて.foo.bazをとりたい
```
$ cat sample.json  | jq -r '.foo[]'
[
  {
    "key": "1-key",
    "value": "1-value"
  },
  {
    "key": "2-key",
    "value": "2-value",
    "option": "2-opt"
  }
]
[
  {
    "key": "3-key",
    "value": "3-value",
    "option": "3-opt"
  },
  {
    "key": "4-key",
    "value": "4-value"
  }
]

$ cat sample.json  | jq -r '.foo[][]'
{
  "key": "1-key",
  "value": "1-value"
}
{
  "key": "2-key",
  "value": "2-value",
  "option": "2-opt"
}
{
  "key": "3-key",
  "value": "3-value",
  "option": "3-opt"
}
{
  "key": "4-key",
  "value": "4-value"
}

$ cat sample.json  | jq -r '.foo[][] | [.key , .value , .option] | @csv'
"1-key","1-value",
"2-key","2-value","2-opt"
"3-key","3-value","3-opt"
"4-key","4-value",
```
【Scratch】MB Airにインストールしてみた

この度、息子が始めた[Scratch](https://scratch.mit.edu/)ネタです。
Eテレの[Why? プログラミング](http://www.nhk.or.jp/gijutsu/programming/)にうまことハマってくれ、さらに通っている[レゴ教室](http://www.legoschool.jp/)でもプログラミングが始まったのでいい機会だとおもいます。

先日東京大学の福武ホールで行われた[Scratch Day in Tokyo 2016](http://day.scratch-ja.org/)も最後まで楽しみ、親子でどっぷりScratchに浸かって帰ってきたわけです。
以前から息子はiPadにインストールした[ぴょんきー](http://www.softumeya.com/pyonkee/ja/)でScratchを楽しんでいますが、とりあえず親子間の会話についていくために自分のMB Airにも入れました。

インストールには、以下を参考にしました。
http://studio.beatnix.co.jp/kids-it/kids-programming/scratch/offline-scratch2-install/
というか、記事にするまでもなく、この通りやるときちんとインストールできます。

はい、Scratch2.0です。
![scratch2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/26c98806-000e-3321-2490-43847e1a5b81.png)

全員参加ワークショップでは、音量を使ったプログラミングをみんなで一斉に作り、息子も私も同じように出来上がることを確認。
あれ？QiitaでYoutubeのインラインってどうやるんだろう？
よくわからないので、リンクにしておきます。
https://youtu.be/NEfcYJ6wDP8

[Minecraftとかとも連動](http://www.atmarkit.co.jp/ait/series/2939/index.html)できるようなのですが、息子ご自慢の[Kano](http://row.kano.me/)には[Minecraft with Kano](http://matome.naver.jp/odai/2140816609080671201/2140832349597077303)という同じようなものがあるようなので、そちらで楽しんでもらえるかな。

サクサク動くものが作れるということではFileMakerも同じなのですが、目線的に子供も大人も楽しめるScratchのようなものが出てきてくれて、IT業界にいる親としては親子で同じプログラミングを楽しめるのはとてもうれしいですね。
ログローテートについてまとめメモ

##ログローテートとは？
ログを古いやつから捨てて行く管理のことをログローテーションという。
svnのログイン履歴を見るためにサーバからログをチェックした事がきっかけ

###logrotateについて
・Redhatだとデフォルトでインストールされてる。
・/etc/logrotate.conf　で設定する。
・各ログファイルの設定は、/etc/logrotate.d 以下に各サービスごとに別ファイルに記述
・今回は/etc/logrotate.d/httpd　だった（svnじゃない）
・cron によって/etc/cron.daily/logrotate というシェルスクリプトが呼び出されて定期実行される
・ログの置き場所は変更可能、今回みたのは/data/apache/logs（/etc/logrotate.d/httpd　にそう書いてあるから）
rotatelogsについて
・ちなみにApacheにもrotatelogsという機能があるそうですがこっちだとログの削除設定が出来ない。らしい


###参考url
logrotateの設定について　http://server-setting.info/centos/loglotation.html
ログローテートいろいろ　http://xn--u9j0md1592aqmt715c.net/linux-apache-log-rotate/
rotatelogsの設定について　http://qiita.com/komazawa/items/77852eac0ee314f8c9ad
Apple最新情報の英語の海外サイトのまとめ


TUAW
http://www.engadget.com/topics/apple/
Mac World
http://www.macworld.com/
9to5
http://9to5mac.com/
Mac Rumors 
http://www.macrumors.com/
Apple Insider
http://appleinsider.com/
Apple Developer
https://developer.apple.com/

## Others
TechCrunch
http://techcrunch.com/
Software Design
http://sdtimes.com/
Or head over to this site.
http://www.makeuseof.com/tag/20-websites-every-apple-fan-must-bookmark/
QtConcurrent::run()を使用する際はQThreadPool::maxThreadCount()に注意を払う


[`QtConcurrent::run`](http://doc.qt.io/qt-5/qtconcurrentrun.html)は引数に与えた関数を別スレッドで実行してくれる便利な関数ですが、同時に実行されるスレッド数には注意が必要です。

# 遭遇した問題

組み込みマシン上で非常に時間のかかる処理を`QtConcurrent::run()`で実行したところ、その後で`QtConcurrent::run()`で呼び出された処理がまったく実行されないという問題に遭遇しました。


# `QtConcurrent::run()`がやっていること

`QtConcurrent::run`はスレッドプールから未使用スレッドを取り出し与えられた関数に割り当てます。
明示的にスレッドプールを指定しない場合は`QThreadPool::globalInstance()`で取得されるスレッドプールが使用されます。

この`QThreadPool`ですが、同時に実行されるスレッドの数があらかじめ決まっています。

その数はOSやマシンによって異なりますが、Linuxでのデフォルト値はCPUの数[^1]となっています。

Qt上ではその数は`QThreadPool::maxThreadCount()`で取得できます。

```cpp
QThreadPool::globalInstance()->maxThreadCount();
```

[^1]: 正確には`sysconf(_SC_NPROC_ONLN)`([参照](http://www.gnu.org/software/libc/manual/html_node/Processor-Resources.html))により取得されるプロセッサの数

# 問題の原因と改善

上記例の環境では`QThreadPool::globalInstance()`のスレッド数が1になっており、そのため時間がかかる処理を`QtConcurrent::run()`で実行するとその処理が終了するまで、他の`QtConcurrent::run()`による処理が動作しないという事態となっていました。

この問題を回避するには以下の方法があります。

1. `QThreadPool`のスレッド数を増やす
2. 別の`QThreadPool`を使用する

## `QThreadPool`のスレッド数を増やす

`QThreadPool::setMaxThreadCount()`で`QThreadPool`のスレッド数を増やすことが可能です。

例)

```cpp
QThreadPool::globalInstnace()->setMaxThreadCount(2);
```

## 別の`QThreadPool`を使用する


```cpp

static QThreadPool thread_pool;

//...

QtConcurrent::run(&thread_pool, []{ /* 時間のかかる処理 */ });
```
サイト制作進行の流れ (主にリニューアル案件で担当の振り分け用、concrete5 準拠)


concrete5 も含めた、複数のグループでサイト制作をするときに、だれがどのパートを担当するかを決めれるように、concrete5 サイト制作の流れをまとめてみました。

よく、お客さんから協業のご相談を受けるとき、自分はどのパーツを担当するのかという話し合いになります。

誰がどの担当をするのかを決めていないと、「実はサーバー構築の担当を決めていなかった、やべー」と、アルアルがあるので、テンプレートとして、サイト進行の流れを一覧として出して、このリストを元に、「●●はウチ」「●●はあなた〜」って担当分けをするための忘備録として作りました。

作りかけです。

## Web サイトリニューアル進行 テンプレート

1. 企画・設計
    - 1-1. コンテンツ設計（サイトマップやコンテンツ自身）
    - 1-2. CMS 設計（CMS の構成）
        - 1-2-1. 仕様設計
        - 1-2-2. 仕様ドキュメント 簡易版のみ (Word形式)
        - 1-2-3. 仕様ドキュメント 詳細版 (PPTX 形式)
    - 1-3. サーバー設計
        - 1-3-1, 仕様設計
        - 1-3-2. 仕様ドキュメント 簡易版のみ (Word形式)
        - 1-3-3. 仕様ドキュメント 詳細版 (PPTX 形式)
2. サーバー
    - 2-1. 設計
    - 2−2. 構築 (開発用)
    - 2−3. 構築 (本番用)
    - 2-4. ドメイン・DNS切り替え
    - 2-5. SSL 取得 or 更新
    - 2-6. メールサーバー
3. デザイン (サイト全体)
4. コーディング (サイト全体)
5. CMS テンプレート作成
    - 5-1. テーマ
    - 5-2. ページタイプ
    - 5-3. カスタムブロック
6. CMS 追加開発
7. 新規コンテンツ制作
    - 7-1.テキスト (文章)
    - 7-2.写真
    - 7-3.動画その他  
8. コンテンツ移行
9. QA (サイトチェック)
10. 更新支援
    - 10-1. 初期更新講習
    - 10-2. マニュアル作成
    - 10-3. 継続サポート
11. 保守
    - 11-1. サーバー
        - 11-1-1 Web サーバー
        - 11-1-2 DB サーバー
        - 11-1-3 他 Web 関連サーバー (CDN や バランサーなど)
        - 11-1-4 メールサーバー
    - 11-2. CMS 保守
        - 11-2-1 CMS アップグレード
        - 11-2-2 CMS 脆弱性対応
    - 11-3. ドメインやSSL証明書
        - 11-3-1 ドメイン取得・更新
        - 11-3-2 SSL 証明書取得・更新
12. 進行管理
    - 12-1. 全体
    - 12-2. 企画・コンテンツ
    - 12-3. サイト構築：デザイン
    - 12-4. サイト構築：コーディング
    - 12-5. サイト構築：CMS テンプレート制作
    - 12-5. サイト構築：CMS カスタマイズ機能開発
    - 12-6. コンテンツ移行
    - 12-7. QA サイトチェック
    - 12-8. 保守

## 宣伝 & クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。

CMS は断然 [concrete5](https://concrete5-japan.org/)で決まり。[コンクリートファイブジャパン株式会社](https://concrete5.co.jp)がサポートできます。


以上
【express4.x】セキュリティ対策最初の一歩

# CSRF対策

## luscaモジュールをインストールする

`npm install --save lusca`

## app.jsで使用を宣言

```js:app.js
var express = require('express');
var session = require('express-session');
var app = express();
var csrf = require('lusca').csrf();

app.use(lusca.csrf());
```

## フォームにcsrfトークンを埋め込む

```jade
form(role="form" action="/" method="post")
    input(type='hidden' name='_csrf' value=_csrf)
```

これでフォーム送信時にcsrfトークンのチェックが行われる。
ajax使用時は_csrfの値を取得して、送信データ内に含めること

```js
var _csrf = $('input[name=_csrf]').val();

$.ajax({
    type: 'POST',
    url: '/',
    data: {
        _csrf: _csrf
    }
});

```

これをしとかないとトークンエラーで弾かれます。

# httpヘッダの設定

## helmetモジュールを使う

[helmet](https://github.com/helmetjs/helmet)はhttpヘッダの設定に関する複数のミドルウェアの集合体です
詳細はリンク先を確認してください。

`npm install --save helmet`

```js:app.js
var express = require('express');
var helmet = require('helmet');
var app = express();

app.use(helmet());
```

これだけで9つのhttpヘッダが設定されるらしいです。スゴイ…！

## X-Powered-Byヘッダの無効化

helmetを使わない場合もこいつだけは無効化することが推奨されています。
helmetを使えば自動的に無効化されます。

```js:app.js
var express = require('express');
var app = express();

app.disable('x-powered-by');
```

# セッションの設定

暗号化とcookie関係のオプションを設定しておく

```
app.use(express.session({
    secret: 'some secret that now one knows',
    key: 'sessionId',
    cookie: {
        httpOnly: true,
        secure: true
    }
}));
```

# バリデーションを行う

expressで開発するなら[express-validator](https://github.com/ctavan/express-validator)一択かと
使い方も分かりやすいし、カスタムバリデーションを追加しやすいのも個人的にはいい感じです。




他にも色々ありますが、全部書ききるのは難しそうなので下記リンク先を見ていただければと思います。

参考
- http://www.softwaresecured.com/2015/04/08/secure-your-js-express-code/
- http://expressjs.com/ja/advanced/best-practice-security.html
PHPのクラスの書き方（というか、素のクラス利用からオートロード利用の対応ステップ）まとめ


Classをどのように書いて、どのように利用するかはいつの時代も悩ましいところですが、最近だとrequireとかじゃなくて、composerのautoloadをprs-4でやったりするらしいので、その方法についてメモしたいと思います。

##STEP1: まずは、素の状態

1つのファイルに全て書きます。
requireともnamespaceとも無縁です。が、実務でこれを利用することは無いですよね。。

test.phpに全部書きます。

```php
<?php

	//class A
	class A{

		public $name = "";

		public function __construct()
		{
			$this->name = "nanashi";
		}

		public function Hello()
		{
			echo $this->name."\n";
		}

	}

	//class B
	class B extends A{

		public $email = "";

		public function Send()
		{
			echo "Send mail to ".$this->email."\n";
		}

	}


	//Main
	$b = new B();
	$b->Hello();
	$b->Send();
```

##STEP2: クラスをファイル別に分けてrequire

次に、クラスをファイルごとに分けて、各ファイルで必要なものをrequireする方法。
いちおう、classesというフォルダを作成し、その下にA.php, B.phpを作成し、それぞれクラスA、クラスBを記述します。

test.php
/classes
   -A.php
   -B.php
   
   
###Class A

クラスAはただ切り出しただけです。
   
```php
<?php

	//class A
	class A{

		public $name = "";

		public function __construct()
		{
			$this->name = "nanashi";
		}

		public function Hello()
		{
			echo $this->name."\n";
		}

	}
```

###Class B

クラスBはクラスAを利用するので、A.phpをrequireします。

```php
<?php

	require_once __DIR__.'/../classes/A.php';

	//class B
	class B extends A{

		public $email = "";

		public function Send()
		{
			echo "Send mail to ".$this->email."\n";
		}

	}
```

メインのtest.phpは、クラスBを利用するのでB.phpをrequireしています。
クラスが多くなるとちょっと管理がしんどいですね。

```php
<?php

	require_once __DIR__.'/classes/B.php';

	//Main
	$b = new B();
	$b->Hello();
	$b->Send();
```


##STEP3: PSR-4対応でAutoload

では、最後にnamespaceというか、それを利用したautoloadに対応させたいと思います。

###composer.json

まずは、autoload.phpを生成するためにcomposer.jsonを定義します。Sampleという名前空間（プリフィックス）にclassesフォルダをマップしています。

```json
{
	"autoload": {
		"psr-4": {
			"Sample\\" : "classes/"
		}
	}
}
```

###vendor/autoload.phpの生成

jsonの設定が終わったら、下記コマンドでautoload.phpを生成（更新）します。

```bash
composer dump-autoload
```

###Class A

クラスAは、下記のようにnamespaceを追加します。

>PRS-4だと上にnamespace書かないといけませんね。

```php
<?php

	namespace Sample;

	//class A
	class A{

		public $name = "";

		public function __construct()
		{
			$this->name = "nanashi";
		}

		public function Hello()
		{
			echo $this->name."\n";
		}

	}
```

###Class B

クラスBも同様にnamespaceを追加し、かつ、クラスAを利用するので、use Sample\A;としています。

```php
<?php
	
	namespace Sample;

	use Sample\A;

	//class B
	class B extends A{

		public $email = "";

		public function Send()
		{
			echo "Send mail to ".$this->email."\n";
		}

	}
```

メインファイルでは、autoload.phpをrequireします。
そして、クラスBを利用するので、use Sample\ B;としています。

```php
<?php

	require_once __DIR__.'/vendor/autoload.php';

	use Sample\B;

	//Main
	$b = new B();
	$b->Hello();
	$b->Send();
```
AWS ElasticSearchService indices削除

ElasticSearchServiceって便利ですよね。
セットアップ後、ログ送付先に指定すれば、すぐに可視化ができて。
そんな認識で利用しているとElasticSearchServiceのリソース利用量がどんどん増えてしまいます。
そういったときにindicesを削除するコマンド

<pre>
curl -XDELETE 'http://search-weblogs-abcdefghijklmnojiu.us-east-1.a9.com/_all'
もしくはindicesを設計している場合は
curl -XDELETE 'http://search-weblogs-abcdefghijklmnojiu.us-east-1.a9.com/hoge-system-yyyymmdd'
だとか
curl -XDELETE 'http://search-weblogs-abcdefghijklmnojiu.us-east-1.a9.com/*-yyyymmdd'

</pre>

上記のコマンドをElasticSearchServiceのポリシーで許可されているインスタンスから実行すれば良い。
crontabで定期実行にすると捗ります。
Access DBからMySQL DBへのエクスポート

Access DBからMySQL ODBCを使用して、MySQLへのエクスポートをしようとしています。

MS Accessでテーブルを選択して、エクスポート → ODBC データベースを選択し、
実行すると、

ODBC － 呼び出しが失敗しました。
　　　　　　　　　　　　　　　　　　Incorrect string value ....

と表示されて、エクスポートができません。

文字コードの指定がどこか、おかしいのだろうと思うのですが、原因が掴めないでいます。

AccessのDBの文字コードは SJISです。
MySQLの文字コードもSJISにしたつもりです。my.iniの設定は以下のようになっています。

[mysql]
default-character-set=sjis

[mysqld]
default-character-set=sjis

どこを修正すればいいのか、教えて頂けないでしょうか。

以上。よろしくお願い致します。
FontAwesomeについて

http://fontawesome.io/?utm_source=hackernewsletter

今まで名前は知っていたけど、触ってこなかったFontAwesonmeを実際に触ってみたら相当便利だったので、メモ。

## FontAwesomeとは？
- サイトでよく使われるアイコンをWebフォントとして利用出来るようにした物。


## メリット
- フォントなので
  - 拡大縮小簡単
  - 色も変えられる
- Retina対応
- 回転もOK
- 重ねあわせもOK
- 使うのが簡単（classを振るだけ）
- ローディングなどの動きも簡単に出せる
- 商用利用OK

CSSでサイズや色を変更できるので複数のアイコンを用意する必要もなくて便利ですね。


## デメリット
- 複数の色を指定することは出来ない
- ほかのサイトと被る可能性あり

まぁ、挙げればこんな感じ。別にデメリットでもないかも？


## 使えるアイコン集
よく使うであろうアイコンはこんな感じ

http://fontawesome.io/icons/?utm_source=www.qipaotu.com

- 矢印アイコン(Directional Icons)
- SNSアイコン(Brand Icons)
- ローディングアイコン(Spinner Icons)
- その他ファイルタイプなどたくさん


## デザイン時の使い方（Macの場合）
Macでの使用方法を。

- FontAwesonmeをダウンロードし、解凍したファイルの中から FontAwesome.otf をインストール
- FontAwesome の[チートシート](http://fontawesome.io/cheatsheet/)から使いたいアイコンを選択しコピー
- Photoshopにテキストツールでコピペ。コピペした段階では文字化けしているので慌てないでOK
- フォント文字化けしているフォントを選択して、フォントの種類を「Font Awesome」に変更

参考：
[アイコンフォントをphotoshopやillustratorで簡単に使う方法。特に、FontAwesomeはチートシートが用意されていてカナリ便利。](http://amiten.net/archives/390)


どうして今まで使ってこなかったんだという便利さ。  
今後は積極的に使っていきたい。
Golangで`Scan error`が出た時の対応


Golangで開発している時に
`sql: Scan error on column index 1: unsupported Scan, storing driver.Value type []uint8 into type *time.Time `
というエラーが出たので、対応した

## 解決策


DNSの末尾に`?parseTime=true`を入れる

https://github.com/go-sql-driver/mysql/issues/9#issuecomment-51552649
から引用

## 原因

Scanするときの`deleted_at`の時間の型と、structの時間の型が違うことが原因。
型をあわせる処理をmysql側でするか、golang側でする必要があるが、とりあえずmysql側でするには`?parseTime=true`をつければいいらしい。
PHPでのstaticなメソッドの使いどき


# 概要

~~（過去の自分が書いた）[神クラス化したUtilityクラス](http://yyyank.blogspot.jp/2015/07/blog-post.html)とか見てイラっ☆とした。~~  

個人的には、PHPでユーティリティクラスを作るくらいなら、普通に関数作れって感じする。  関数名の衝突が怖いのなら、[名前空間](http://php.net/manual/ja/language.namespaces.php)を使えば良いでしょう。ユーティリティクラスが必要になるのは、完全にオブジェクト指向だけで関数宣言ができない言語くらいだと思います。

## 例で使うテーブル構造

どのようなときに使うかの例を示すのに、PHPでコードを書く。その時に使うテーブル構造を、先に示しておきます。  

* イベントの開催期間のマスタデータを保存する。
* 1期間に同時開催されるのは1つまで。
* INSERTするときに重複チェックをしている。（当然、同一トランザクションで。）

まぁ、実務だと先々仕様変更するかもしれないから、テーブルはこんなもんでしょう。

```sql
CREATE TABLE event_master(
    id INT NOT NULL AUTO INCREMENT PRIMARY KEY,
    start DATE,
    end DATE
);
```

# 特定の状態で初期化された、そのクラス自身の「インスタンス」が欲しいとき

インスタンスを作りたい時に、前提となる情報を特定できない場合とかありますよね。
例えば、上記のDBから、"現在開催中の"「イベントID」のインスタンスがほしい場合とか。そういうときに使うといいんじゃないかと思います。  

## event_idのクラス

```php
<?php
/**
 * イベントは、同時に1つまで開催可能。
 * DBにINSERTするときに、期間で重複がないかをチェックされる。
 * 
 */
class EventId
{
    /**
     * @var int id
     */
    private $id;
    public function __construct(int $id)
    {
        $this->id = $id;
    }
    
    /**
     * 現在実施中のイベントのIDを取得する
     * @return EventId
     */
    public static function current()
    {
        // 現在のゲームIDを特定する処理を書く
        $dbh = DatabaseHandlerFactory->getInstance()->getHandler();
        $now = $date('Y-m-d h:i:s');
        $rows = $dbh->select(
            'SELECT * FROM event_master
            WHERE start < ? AND ? < end
            ',
            [$now, $now]
        );
        return new self($rows[0]['id']);
    }
}
```

ちなみに、（Abstract Factoryパターンな）EventIdManagerがいれば、そっちに問い合わせてもいいやつです。

# Singletonのget_instanceメソッド
言うまでもないですね。  
Singletonを乱用されても困るので、[Singletonパターンはどのようなときに使うのか？](http://qiita.com/ndxbn/items/c7a37ea950876176bb81)を見てほしいです。
  
  
他なんかあったら、追記します。
IRCサーバー(oragono)を立ててIRCクライアントで接続(The Rounge, irssi)

##  The Rounge へのログインをしないとIRCサーバーへの接続が出来ないようにする

```yml:docker-compose.yml
version: '3'
services:

  thelounge:
    container_name: thelounge
    image: thelounge/thelounge
    ports:
      - "9000:9000"
    volumes:
      - ./thelounge:/var/opt/thelounge

  oragono:
    container_name: oragono
    image: oragono/oragono
    # the Roungeから接続するため Portsの指定は不要
    #ports:
      #- 6667:6667 # 平文
      #- 6697:6697 # TLS
    volumes:
      - ./ircd:/ircd
```

```sh
docker exec \
 --user node \
 -it thelounge \
 thelounge add ユーザー名
# パスワード設定、ログを残す(yes)
```

The Rounge にログイン

![スクリーンショット_2020-05-15_10-53-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/57b1f9fc-9f2b-2c86-a8f6-492fdef7cef5.png)

ircdにログイン

![スクリーンショット_2020-05-15_10-59-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/bbe790f3-4e5c-5aea-84a5-6796e1e06d25.png)

成功

![スクリーンショット_2020-05-15_10-59-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c3b3e37e-cdff-ab6a-0413-5df53bb55940.png)


----

## (個別) IRCサーバー (oragono)

* https://github.com/oragono/oragono

```rb:docker-compose.yml 
oragono:
  image: oragono/oragono
  ports:
    #- 6667:6667 # 平文
    - 6697:6697 # TLS
  volumes:
    - ./ircd:/ircd
```

```bash:起動
docker-compose up -d
```

* 自動でTLS接続用の設定もしてくれる。
* チャットログを残すにはmysqlが必要の様子。(`ircd/ircd.yaml`)
* TLS での接続
    *  成功 : The Lounge, irssi
    *  失敗 : Thunderbird (謎)

danユーザーの ログイン用パスワードはここに表示される。

![スクリーンショット_2020-05-15_10-20-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/fb40641a-aad2-08db-ac25-9237497b031f.png)



## (個別) IRC WEB Client (The Rounge)

* https://linuxhint.com/best-self-hosted-irc-clients/
* https://hub.docker.com/r/linuxserver/thelounge

```yml:docker-compose.yml
---
version: "2.1"
services:
  thelounge:
    image: linuxserver/thelounge
    container_name: thelounge
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
    volumes:
      - ./config:/config
    ports:
      - 9000:9000
    restart: unless-stopped
```

## irssiを使う場合

```bash:起動
irssi
```

```sh:tlsで接続
# port 9999 に tls接続の例
/connect -tls my.server.com 9999
```

```go:設定
/server add -network localhost -auto localhost
/network add -nick user1 -user user1 -realname "user1" localhost
/channel add -auto #chat localhost
```

```apache:#chatウィンドウに切り替え
/2
```
laravel 5.2でマルチ認証を実装してみた

laravel 5.2で、基本機能として実装されたマルチ認証をやってみました。

■github（ dog-ears/laravel-multi-auth ）
https://github.com/dog-ears/laravel-multi-auth

詳しい紹介は、長くなったので、以下からご覧くださいませ。

■laravel 5.2で実装する、マルチ認証の作り方
http://dog-ears.net/laravel/160523/#more-214

参考まで。
【初心者向け】プログラミングソフトRobipで、ESP-WROOM-02開発ボードをWi-Fi経由でプログラム更新が出来る様にする

### アップデート情報
* 2016.6.8 「書き込み用ツール」の一部修正を行ないました。ダウンロードURLはそのままです。

## ESP-WROOM-02開発ボードとは？
![IMG_0687.png](https://qiita-image-store.s3.amazonaws.com/0/46262/7a35a360-fbf7-ec7e-6eaf-ef08df0058cc.png)
ESP-WROOM-02開発ボードはスイッチサイエンスで製造販売をしているESP8266EXを搭載したWiFiモジュール及びマイクロUSBが内蔵されている基板です。
現在は、スイッチサイエンスのサイトから購入が可能です。
販売価格2,160円です。※2016年5月22日現在
[ESP-WROOM-02開発ボードの購入](https://www.switch-science.com/catalog/2500/)
## ビジュアルプログラミングアプリRobipとは？
ニャンパス株式会社が開発した、ビジュアルプログラミングアプリです。同じくニャンパス株式会社が開発したHaLake Kitは勿論の事、ESP-WROOM-02 Wi-FiモジュールやESP-WROOM-02開発ボード等に、プログラムを書き込む事ができる開発環境の事です。
Wi-Fi経由で書き込む事が可能な為、PCを使わず開発が行なえます。
[プログラミングソフトRobip](https://robip.halake.com/)
## はじめに
ESP-WROOM-02 Wi-FiモジュールやESP-WROOM-02開発ボードを購入し使用する場合、多くはArduino IDEを使用するかと思います。
しかし、初心者の多くはシリアルポートやマイコンボードの設定など、プログラム作る手前で、難しさを感じてしまうかたも多いのではないでしょうか？
ビジュアルプログラミングアプリRobipは、そういった煩わしさを解消し、1度ご自身のESP-WROOM-02に、Wi-Fi設定を書き込めば、アプリからプログラムを作り、Wi-Fi経由で、ESP-WROOM-02自体に書き込む事が可能な、Androidアプリです。
例えば、取得したセンサーのデータをWi-Fi経由で送る。
インターネット経由で、なにかしらのアクションを起こすとESP-WROOM-02についているLEDを光らすなど、インターネットを介した、おもちゃや、プロダクトを比較的容易に作る事ができます。
### まずはプログラミングソフトRobipに登録する。
[https://robip.halake.com/editor.html](https://robip.halake.com/editor.html)にアクセスして、会員登録を済ませてください。
<img width="1030" alt="スクリーンショット 2016-05-22 18.31.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/5ba9aefa-1301-336e-106e-f05748c827d9.png">

### Wi-Fiの設定を登録する。
右側のアイコンをクリックし「設定」を選びます。
![ハンバーガーアイコン.png](https://qiita-image-store.s3.amazonaws.com/0/46262/45ff0c8b-6b21-2462-a084-d6cccfcbf920.png)

写真の様な画面が表示されたら、下記の様に入力してください。
※Robip IDを設定する事で、ESP-WROOM-02開発ボードに電源がはいった場合、自動的にRobip IDのプログラム更新の有無をサーバに確認しにいきます。
Robip ID：お好きな英数字を決めてください
WiFi（１）：アクセスポイントとSSIDを登録してください。
![Wi-Fi設定.png](https://qiita-image-store.s3.amazonaws.com/0/46262/82934aa5-3215-5067-beab-d9fdbd9a936d.png)
設定後「閉じるを押して終了してください。」

### ビルドする
ビルドを行ないます。
![ビルド.png](https://qiita-image-store.s3.amazonaws.com/0/46262/0d864268-87f8-42f9-943d-b9ce95dc7631.png)

### ESP-WROOM-02開発ボードに設定した内容を書き込む
こちらから、[書き込み用ツール](http://robip.halake.com/robip-tool.jar)をダウンロードしてください。
インストール後立ち上げていただくと下記の様な画面が表示されます。
![書き込みツール.png](https://qiita-image-store.s3.amazonaws.com/0/46262/1fa8e692-c34b-bbab-2811-d7b4ae79f34a.png)

### ESP-WROOM-02開発ボードに設定した内容を書き込む
ESP-WROOM-02開発ボードの「FLASH」ボタンを押しながら、PCに接続します。
![マイコン2.png](https://qiita-image-store.s3.amazonaws.com/0/46262/5319dbbb-5bd1-a6f8-c30c-a277115ac1ad.png)

「FLASH」ボタンを押した状態で「書き込み用ツール」のリロードを行って頂くと、USBserialポートが表示されます。
![書き込みツール2.png](https://qiita-image-store.s3.amazonaws.com/0/46262/cc2b9041-b429-1271-849d-9ea4eec53de4.png)

Robip IDは先ほど設定したIDを入力し、ポートは、USBserialポートを選び、「書き込む」ボタンを押します。
![書き込みツール3.png](https://qiita-image-store.s3.amazonaws.com/0/46262/c64f7748-ba9b-3142-9f12-57cf39ef81d3.png)
書き込みが終了したら、ESP-WROOM-02開発ボードをPCから外してもOKです。
ビジュアルプログラミングアプリRobipでビルドを行なったら、ESP-WROOM-02開発ボードを再度電源をONして頂くだけで、ESP-WROOM-02開発ボードがWi-Fiを経由し、最新のプログラムを取得します。

是非[ビジュアルプログラミングアプリRobip](https://robip.halake.com/)と一緒に使ってみてください。
Zybo > Chronicles blog 21 > PS / PL interconnected > Master AXI ports / Slave AXI ports / Slave High Performance Ports / 64-bit Slave ACP / clocks from PS to PL / PS to PL Interrupts / PL to PS Interrupts / DMA peripheral request interfaces

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-One-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/418935


> The Zynq PS and PL are interconnected via the following interfaces:

> 
- Two 32-bit Master AXI ports (PS master)
- Two 32-bit Slave AXI ports (PL Master)
- Four 32/64-bit Slave High Performance Ports (PL Master)
- One 64-bit Slave Accelerator Coherency Port (ACP) (PL Master)
- Four clocks from the PS to the PL
- PS to PL Interrupts
- PL to PS Interrupts
- DMA peripheral request interfaces

これらを全て試すのはいつになるやら。
Zybo > Chronicles blog 20 > TTC > match mode > XTTCPS_OPTION_MATCH_MODE / XTtcPs_SetMatchValue() / XTtcPs_GetInterval() / XTtcPs_EnableInterrupts() / ISRの例

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-Four-Adam/ba-p/416243

> We will look at using the match registers to issue interrupts for different counter values. 

...


> We can OR the XTTCPS_OPTION_MATCH_MODE as defined within the xttcps.h file to enable the match mode along with the disabled waveform and interval mode.

...

次にトリガーを設定

```
XTtcPs_SetMatchValue(&Timer, 0, (interval/3));
```

内部カウンター(interval)はXTtcPs_GetInterval()にて取得。

次にmatch interruptを設定

```
XTtcPs_EnableInterrupts(TtcPsInt, XTTCPS_IXR_MATCH_0_MASK);
```

ISR(TickHandler()としている)では各interruptに対応する処理を書く

```.c
static void TickHandler(void *CallBackRef)
{
	u32 StatusEvent;

	StatusEvent = XTtcPs_GetInterruptStatus((XTtcPs *)CallBackRef);
	XTtcPs_ClearInterruptStatus((XTtcPs *)CallBackRef, StatusEvent);

	if (0 != (XTTCPS_IXR_INTERVAL_MASK & StatusEvent)) {
		printf("interval interrupt event\n\r");
		//XTtcPs_SetMatchValue(Timer, 0, *MatchReg);
		}
	if (0 != (XTTCPS_IXR_MATCH_0_MASK & StatusEvent)) {
			printf("match interrupt event\n\r");
			//XTtcPs_SetMatchValue(Timer, 0, *MatchReg);
			}

}
```
Zybo > Chronicles blog 19 > TTC > xttcps_hw.h > includes definitions for all possible TTC interrupts

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-Three-Adam/ba-p/413105

> The file <font color=red>xttcps_hw.h</font>, which is called up by xttcps.h, includes definitions for all possible TTC interrupts allowing them to be enabled as desired using the above function.
技術英語 >  when it's noisy, birds spend a lot less time [head down] / HUD: Head-up display / HDD: Head-down display

http://www.scientificamerican.com/podcast/episode/road-noise-takes-a-toll-on-migrating-birds/


かつてはmigratory birdsのhabitatであった場所が開拓され道路となり、そこで生成されるnoiseの話。

> Follow-up experiments in the lab found that, when it's noisy, birds spend a lot less time <font color=red>head down</font>, pecking at food, and a lot more time scanning their surroundings.

faunaからするとノイズの環境で自分の身の危険を案じるので、当然の行動だろう。
反対に周期の音に敏感でないfaunaは捕食されたり事故にあうなどして生き残れなくなる。

<hr>
関連して見つけた。

http://encyclopedia2.thefreedictionary.com/head-down+display

- HUD: Head-up display
- HDD: Head-down display

装置の場所指定に使えるだろうか。
Swiftを学ぶ：少し「Optional」を学ぶ　

Swiftには通常nil（空状態）を定義することはできませんがoptional型というもの使うと許容されます。
使い方は、宣言時に"?"を型の後ろにつけることによってnilの定義を許可します。

#書き方

`var hoge: Int?`
型の後ろに"?"を付けます。

通常、Optional型に定義してない変数
`var hoge: Int`
これにはnilは定義出来ません。
`hoge = nil これはエラーになります`

`var hoge: Int?`
`hoge = nil これは設定可能です`
何も指定しない場合、初期値としてnilが設定されています。

`var hoge: Int? = 123`
nilが設定可能、初期値として123が設定されています。

Optional設定の変数をプリントすると
Optional(123)
のように表示されOptionalであるという事がわかります。

```swift:
var hoge:Int?
hoge = 123
print(hoge)
-----------------
>プリントした結果
 Optional(123)
```

特殊な扱いになるのでOptional設定をした場合、このままでは計算には使えません。
アンラップということをします。変数名の後ろに"!"を付けます。
付けずに使用するとエラーになります。

```swift:
var hoge:Int?
hoge = 123
var fuge:Int = 5

fuge += hoge //エラーになる
        
fuge += hoge! //！を付けることによりエラーにならず普通に扱えます。
```

また下記のように書くことによりアンラップしたhogeをunwrappedHogeを定数にして使用できます。
"!"を付ける必要はありません。

```swift:
if let unwrappedHoge = hoge {
    // unwrappedHogeはアンラップされているので後ろに!は不要になります。
    fuge += unwrappedHoge
} else {
    println("定義されていない")
}
```

**nil(空状態)の使い方:**
例として画像も貼り付けられるメモアプリを作ったとします。
あるメモを表示した時、画像が無い場合
本来は画像データが設定される変数にnilを設定することにより
画像の有る無し判断に使えます。


ほんの少しOptionalについて書きました。
長く書くと混乱しそうなので続きはまた。
SSH設定(OpenSSH SSH2)

#### ssh 設定ファイル

sshサーバ設定
/etc/ssh/sshd_conf

現在の設定がどうなっているかは、以下のコマンドで確認

```
cat sshd_config | 
grep -v -e '^\s*#' -e  '^s*$'
```


|設定値|意味|
|:--:|:--|
|Port 22| sshが使用するポート。iptablesで開けておくこと。22以外の値に変更したほうがよい|
|Protocol 2|複数のバージョンを指定することもできるが、優先順位を示すものではない。Protocol 2,1なら、ver2,ver1の接続を許可、2だけだと、ver2のみでの接続を許可する|
|HostKey|秘密鍵が格納されるファイル。ver2なら、/etc/ssh/ssh_host_rsa_keyが使用される|
|Pubkey<br>Authentication<br> yes|公開鍵認証をONにするかどうか。Protocol Ver2にのみ適用される|
|PermitRoot<br>Login no|rootでのログインを許可しない|
|Password<br>Authentication no|パスワード認証を許可するかどうか(default yes)|


#### SSH公開鍵認証に何回もはまったので
（OpenSSH　SSH2で認証する場合）

１．Linux側で鍵を作成する(ログインユーザで作成）

```
$cd
$pwd
/home/user1
$mkdir ./.ssh  '.sshフォルダを作成する
$chmod 700 ./.ssh 'パーミッションを700に
$cd ./.ssh
$ssh-keygen -t rsa '鍵を作成
$cp -p id_rsa.pub authorized_keys '公開鍵の名前を変更
$chmod 600 authorized_keys 'パーミッションを600に
$ls -l 'こんな感じ id_rsa.pubは消してよい
-rw------- 1 user1 user1  417 authorized_keys
-rw------- 1 user1 user1 1700 id_rsa
-rw------- 1 user1 user1  417 id_rsa.pub
$cd /home
$ls -l 'ちなみに/home/userもパーミッション700にしておくこと
drwx------ 3 user1 user1 3800 May 20 13:00 user1
$su - 'ここからはrootで作業
※作った鍵は/etc/ssh/ssh_host_rsa_keyにも保存しておくこと
$cd /etc/ssh
$cat sshd_config | grep -v -e '^\s*#' -e '^s*$'
Port 8888 '22以外に変更しておいたほうがよい
Protocol 2 'SSH2で認証
HostKey /etc/ssh/ssh_host_rsa_key
PermitRootLogin no 'ルートでのログイン不可
RSAkeyAuthentication yes 'RSAでの認証をONに
PubkeyAuthentication yes '公開鍵認証をONに
AuthorizedKeyFile    .ssh/authorized_keys '認証ファイル指定
PasswordAuthentication no 'ここはNOに。ただし、SSHを設定する前に秘密鍵ファイルをtelnetとかscpで送っておきたいときは、yesにしておかないと送りようがない
UsePAM no
UsePrivilegeSeparation sandbox
Subsystem   sftp /usr/libexec/openssh/sftp-server
#
#/etc/init.d/sshd restart 'sshd再起動で設定反映
```

公開鍵をwindowsに落とす(putty使用)
これで秘密鍵を落とす時は、PasswordAuthentication yesにしておくこと

```
>cd "C:\Plogram Files\PuTTY" 'puttyのフォルダに移動
>pscp -scp -P 8888 user1@192.168.111.111:/home/user1/id_rsa C:\Users/user1
id_rsa     |0Kb| 0.4Kbs|ETA 00:00:00 | 100%
```
落としたid_rsaはputtygenを使って
変換→鍵のインポート→秘密鍵の保存
でputty形式に変換して保存

保存したputty形式の鍵を、
puttyの左ウィンドウ
SSH→認証→認証のためのプライベートキーファイル→参照
で指定する
Ansibleでユーザのパスワード設定変更を自動化する

Ansibleを使ってユーザのパスワードを一括して変更したい場合、
以前はユーザのパスワードは平文ではなくハッシュ化した値が必要でしたが
password_hash()を使えばplaybookに平文でパスワードの作成ができます。


**playbookに書く**

```playbook.yml
- hosts: ホスト名を指定
  tasks:
    - name: "rootユーザーのパスワードを変更"
      user:
        name: "root"
        password: "{{ 'パスワードを指定'|password_hash('sha512') }}"
```

たったこれだけです。
react.jsのprops周りをES2015で書いてみた

初投稿です。
とか書くとニコニコ動画大好きなのバレてしまいそうですが、嘘です。

今回はES2015で`defaultProps`とか`propTypes`の書き方の備忘録です。
ES2015で`defaultProps`とか`propTypes`ってどうやって書くのか最初わからず詰まってしまいました。

babelさんが`static`を使って書いているの見て`static`使えば良いのかと思っていたのですがコンソールでエラーが多発しました。
https://babeljs.io/blog/2015/06/07/react-on-es6-plus

```js:babelサンプル
class Video extends React.Component {
  static defaultProps = {
    autoPlay: false,
    maxLoops: 10,
  }
  static propTypes = {
    autoPlay: React.PropTypes.bool.isRequired,
    maxLoops: React.PropTypes.number.isRequired,
    posterFrameSrc: React.PropTypes.string.isRequired,
    videoSrc: React.PropTypes.string.isRequired,
  }
  state = {
    loopsRemaining: this.props.maxLoops,
  }
}
```

思考錯誤の末、`babel-preset-stage-0`を導入することにより無事`static`で`propTypes`や`defaultProps`を書いても問題なく動作しました。

一応、簡単なサンプルを用意しました(かなり荒いですが)
https://github.com/takahiro-saeki/react-basic-todo/tree/props-test

##サンプルの簡単な説明
ディレクトリ構成は以下のようになっています。

```text:ディレクトリ構成
.
├── README.md
├── assets
│   └── js
│       ├── common.js
│       └── component
│           └── content.jsx
├── package.json
├── template
│   ├── index.html
│   └── js
│       └── main.js
└── webpack.config.js
```

`assets/js`ディレクトリのcommon.jsで`ReactDOM.render`しています。
`assets/js/component`の中にコンポーネントが入っています。

```js:assets/js/component/content.jsx
import React from 'react';

export default class Content extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      name: this.props.name,
      age: this.props.age,
      hobby: this.props.hobby
    }
  }

  static propTypes = {
    name: React.PropTypes.string.isRequired,
    age: React.PropTypes.number.isRequired,
    hobby: React.PropTypes.string.isRequired
  }

  static defaultProps = {
    name: 'hiro',
    age: 24,
    hobby: 'DanceDanceRevolution'
  }

  render() {
    return (
      <ul>
        <li>{this.state.name}</li>
        <li>{this.state.age}</li>
        <li>{this.state.hobby}</li>
      </ul>
    )
  }
}
```

##`propTypes`について
`propTypes`とは型の制約を付ける為に使用します。
今回の場合だと、`name`と`hobby`には`string`を、ageには`number`を指定しています。
もし`age`に`string`文字列が入った場合、表示はされますが、コンソールでエラーが吐き出されます。


##`defaultProps`について
`defaultProps`はその名の通り`props`のデフォルト値を指定することが出来ます。
`constructor`内で`state`に対し、`this.props.〜`と指定することにより`props`の値を`this.state.〜`で呼び出せるようにしています。

##コンポーネント単位で分割する
次に`js/common.js`を見てみると...

```js:assets/js/common.js
import React from 'react';
import ReactDOM from 'react-dom';
import Content from './component/content';

class Main extends React.Component {
  render() {
    return (
      <section>
        <Content name='hoge' age={30}/>
      </section>
    )
  }
}

ReactDOM.render(
  <Main />,
  document.getElementById('app')
)
```

`<Content name='hoge' age={30}/>`というような感じで`defaultProps`に指定した`key`, `value`を上書きすることが来ます。

##まとめ
- `defaultProps`、`propTypes`を`static`で書くには`stage-0`が必要。
- `propTypes`は型を指定する。
- `defaultProps`は値のデフォルト値を設定する。

以上です。

良きreactライフを！ヽ(^o^)丿
Delveを利用するさいにはEl CapitanのRootlessをいったん無効にするといいかも（後で有効にしましょう）


MacでGoの開発環境を整えているときにハマったのでメモ。
Visual Studio Code上でGoの開発をするために設定する記事などは多数あるかと思います。

* [Visual Studio CodeによるGo言語のデバッグ ｜ Developers.IO](http://dev.classmethod.jp/go/visual-studio-code-golang-debug/)
* [vscode-go/READMEとdelve/Buildingの日本語訳 - Qiita](http://qiita.com/qt-luigi/items/1e73c2e129c408c16cbf)

手順的にはこれらの手順で問題ないのですが、自分の環境では証明書をシステムに作成しようとすると「Operation not permitted」と出て作成が完了しない事象が発生。

こういうメッセージが出るということはセキュリティ的に権限がないとかそういうことかとあたりをつけて、Rootlessを下記記事を参照していったん解除してみました。

[El CapitanのSystem Integrity Protection（rootless）の解除方法 - Qiita](http://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8)

その後、再度証明書を作成すると問題なくシステム上に作成されたので後は上の手順通りデバッグまでできることを確認。再度Rootlessを有効にしても問題なくデバッグできています。さらに追加で証明書をつくってみたところ、Rootlessが有効になっているにも関わらず今度は問題なく作成完了。

おそらく、以下のような状況かと想像していますが、ちゃんと調べていないので確証はないです。

* 証明書作成のさいにRootlessで制御されている箇所（ディレクトリ?）に触ろうとしてエラー
* Rootless解除後は問題なく作成完了
* 再度Rootless有効にすると、制御されているところは触らず追加のみになるので問題なく作成完了する

とりあえず手順などはGithubに置かれているドキュメントや上に張ったリンクの内容で問題ないので、そちらを参考にしつつ環境を整えるのがよろしいかと思います。
Wordpressの『画像を編集』に画像が表示されなくなった

# 問題
仕事でWordpressを触っていてUPLOADした画像を触っていたところ、はじめからなのか何か触ってしまったのかわからないが『画像を編集』のページに画像が表示されなくなってしまった。
以下の通り。

![problem.png](https://qiita-image-store.s3.amazonaws.com/0/83831/befa34c3-e7c8-2596-d02b-890025742bf5.png)

尚、以下の様なモノがサーバーから帰っている。
> PNG  IHDR_L IDATxٓdy˳{OfJ@p)"hSDJbȖp!G8~^]hl."L$Ma0}k_Ζ!ϩ>U]kO …

レスポンスがおかしなことになっている？

# とりあえずの解決法
`functions.php`に無駄なスペースとか改行とかが入っていると駄目というのが多数出てくるので試してみたが解決せず。
更にふらふら見ていると以下の記事を見つける。
> admin-ajax.php imgedit-preview header problem
> https://wordpress.org/support/topic/admin-ajaxphp-imgedit-preview-header-problem

`wp-admin/includes/image-edit.php`に`while (@ob_end_clean());`を追加するらしい。
とりあえず上記ページにあるFunctionに追加したら画像が表示された。

# 注意
とりあえず表示されて助かったが、まだ原因を理解していない。
もし参考にされる方は警戒心を持ってご利用ください。
Railsへbootstrapの適用

#2016年5月時点でのRailsへのbootstrapの適用方法

Rails初心者の私の私的メモ＆時間を無駄にせずに、bootstrapを導入できるようになるまで。

##開発環境
- 実行日時 2016年5月22日
- Cloud9
- ruby 2.3.0p0
- Rails 4.2.5

##下準備

プロジェクトを作成して、ヴューなどを作っていくのだが、今回は面倒なのでscaffoldで実行

プロジェクトを作成

```lang:terminal
> $ rails new MyProject
```

scaffoldを作る

```lang:terminal
> $ rails g scaffold user name:string body:text
```

DBを作成

```lang:terminal
> $ rake db:migrate
```

サーバーを起動

```lang:terminal
rails s -p $PORT -b $IP
```

https://(サーバーアドレス)../usersにアクセスしNew Userから確認用に２～３新規投稿しておく

![alt](http://kyouyama26.oops.jp/monooki/bootstrapindex.png)
![alt](http://kyouyama26.oops.jp/monooki/bootstrapusers.png)

##Gemの追加

Gemfileに追記する

```lang:Gemfile
gem 'less-rails'
gem 'therubyracer'
gem 'execjs'
gem 'twitter-bootstrap-rails'
```

Gemをインストールする

```lang:terminal
>bundle install
```

インストール後に警告が出た場合

```lang:terminal
.
.
.
Using web-console 2.3.0
Using turbolinks 2.5.3
Bundle complete! 16 Gemfile dependencies, 62 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from twitter-bootstrap-rails:
Important: You may need to add a javascript runtime to your Gemfile in order for bootstrap's LESS files to compile to CSS. 

**********************************************

ExecJS supports these runtimes:

therubyracer - Google V8 embedded within Ruby

therubyrhino - Mozilla Rhino embedded within JRuby

Node.js

Apple JavaScriptCore - Included with Mac OS X

Microsoft Windows Script Host (JScript)

**********************************************
```

そんなときは、さっと入力

```lang:terminal
>gem install execjs
```

##bootstrapの適用

プロジェクトにbootstrapを適用させる

```lang:terminal
>rails g bootstrap:install less
```

scaffoldで作られたuser、すなわち「Users」に対して、bootstrapのクラスを追加させる


```lang:terminal
>rails g bootstrap:themed Users
```

上記のコードを実行するとterminalに下記コードが表示されるが、bootstrapを適用させるのに、既存のファイルに上書きしてもいいですか？って意味なので[Ynaqdh]の後ろにyを入力してエンター（ﾀｰﾝ！！）
何回か聞かれるけどその都度、y押してﾀｰﾝ！

```lang:terminal
>rails g bootstrap:themed Users
Running via Spring preloader in process 3471
    conflict  app/views/users/index.html.erb
Overwrite /home/ubuntu/workspace/app/views/users/index.html.erb? (enter "h" for help) [Ynaqdh] y
```

上書きが終わったらサーバーを再起動。
再起動しないと下のようなエラーがでる

`couldn't find file 'twitter/bootstrap' with type 'application/javascript'`


##レイアウト変更
bootstrapには全体のレイアウトを簡単に変更できる機能が備わっている

```lang:terminal
>rails generate bootstrap:layout application fluid -f
```

レスポンシブ
- rails generate bootstrap:layout application fluid
レスポンシブじゃないほう
- rails generate bootstrap:layout application fixed

これでviews/layout/application.html.erbに適用させたレイアウトが反映される

ちなみに、viewはbootstrapのおかげで非常に見にくくなっているので、simple_formというgemを入れるとすっきりする

##参考サイト

[bootstrap](http://getbootstrap.com/2.3.2/scaffolding.html)
[bootstrap/git](https://github.com/seyhunak/twitter-bootstrap-rails)

bootstrapのデザインが飽きたらbootswatchというデザインテンプレートも扱えます。
[bootswatch](http://bootswatch.com/)
[bootswatch/git](https://github.com/scottvrosenthal/twitter-bootswatch-rails)