OmniAICreator/Qiita-1.07M huggingface dataset:
jenkinsの1.6系から2.0系へのバージョンアップをした

まあ備忘録です。

作業手順は
・jenkisのVM停止
・VM複製
・複製したテスト用VMで
　→hostsまわりの調整して確認できるようにする
　→念のためjenkinsホームディレクトリを部分バックアップ
　→プラグインを根こそぎバージョンアップ
　→jenkinsのプロセスをリスタートしてログイン確認
　→jenkinsプロセス停止、jenkins本体バージョンアップ
　→jenkinsプロセス起動、ログイン確認
　→2.0用のパイプラインとかのプラグインを素直に入れてjenkinプロセスリスタート
　→ログイン確認、ログ確認、ジョブが動くかwebhook経由で作動するかなど確認
・複製したテストVMを落として元のVMを起動して大体同じ作業を実施
・1週間くらい泳がせて経過を観察

という感じに。

バージョンアップ参考
http://sue445.hatenablog.com/entry/2016/06/14/115409

部分バックアップの内訳は以下のように。

→ 結論から言うと以下の方式だととってる箇所的に移行の役にはたたないです。
　移行するならworkspace以外全部移すのがいいようです。

移行参考
http://snickerjp.blogspot.jp/2013/10/migrate-JenkinsCI.html

```
$ vi /tmp/exclude.txt
disabled
builds
rpmbuild
$ cd /var/lib
$ sudo tar cvf jenkins-test.tar -X /tmp/exclude.txt ./jenkins/jobs
$ sudo tar rvf jenkins-test.tar ./jenkins/config-history
$ sudo tar rvf jenkins-test.tar ./jenkins/nodes
$ sudo tar rvf jenkins-test.tar ./jenkins/plugins
$ sudo tar rvf jenkins-test.tar ./jenkins/secrets
$ sudo tar rvf jenkins-test.tar ./jenkins/users
$ sudo tar rvf jenkins-test.tar ./jenkins/.ssh
$ sudo tar rvf jenkins-test.tar ./jenkins/.gitconfig
$ sudo tar rvf jenkins-test.tar ./jenkins/config.xml
$ sudo gzip jenkins-test.tar
```

バックアップ参考
https://github.com/sue445/jenkins-backup-script/blob/master/jenkins-backup.sh
http://qiita.com/tq_jappy/items/3654059d09a4896ae598
http://yoshio.velvet.jp/blog/archives/4149

ビルド履歴もってかないと設定変更履歴はどうなるのだという疑問から調べたところ、
JobConfigHistory Plugin入れてる関係で/var/lib/jenkins/config-historyおよびその下のjobs/job-name/あたりにシステム履歴とジョブ履歴があるようでした。
http://d.hatena.ne.jp/tyuki39/20110303/1299108685

なんかjavaのOutOfMemory出るようになってしまったけど/etc/sysconfig/jenkinsのJENKINS_JAVA_OPTIONSに`-XX:MaxPermSize=256m`とか追加して収まった模様。
http://d.hatena.ne.jp/necoyama3/20090610/1244652868

プラグイン根こそぎバージョンアップの影響でか、ビルド履歴のアイコンがない警告がログにでてたけど過去の履歴は表示できなさそうなものの新しい履歴は表示できてたので移行のとき履歴を移さないとか履歴を初期化するなどで出なくなりそうかなと思いました。
https://wiki.jenkins-ci.org/display/JENKINS/Build+Trigger+Badge+Plugin
https://wiki.jenkins-ci.org/display/JENKINS/Discard+Old+Build+plugin
http://qiita.com/soramugi/items/ab1ce970b589d631289f

あと、Centos6のlibcurlが古いエラーがバージョンアップ関係なくその前から出てた模様。
http://qiita.com/shunsuke_takahashi/items/a1c3655584530c76fbe0
--tlsv1.2つけるかCentOS7にしても解決可能。

それと認証をldapsにしたいどうやんだと思って調べたところjavaのキーストアに証明書追加してurlをldap://からldaps://に変えるといける感じでした。（まだテストしただけ）
http://qiita.com/hidekuro/items/68f291d23a603143fac6
echo 初心者でも簡単!! echo で扱うアセットファイル群を簡単にバイナリにまとめて使ってみる

最近 Go の web framework である [github.com/labstack/echo](https://github.com/labstack/echo) を使ってアプリケーションを作ることが多くなってきました。昨日 echo で静的ファイルをバイナリに突っ込みたいなと考えた時、gin なら [github.com/gin-contrib/static](https://github.com/gin-contrib/static) があるのですが、 echo は自前で書かないとありませんでした。そこで、「パクればええやん」と思いついて出来上がったのがこちらになります。

> Static middleware for echo web framework(golang)

[https://github.com/Code-Hex/echo-static](https://github.com/Code-Hex/echo-static)

早速使ってみましょう。

# 使ってみる

    mkdir echo && cd echo

を実行した後、このようなディレクトリ構造を用意します。

```
.
├── assets
│   ├── gopher.png
│   └── index.html
└── main.go
```
index.html はこんな感じです。

```html:index.html
<!doctype html>

<html>
<head>
  <meta charset="utf-8">
  <title>Echo!!</title>
</head>
<body>
<p>Hello, World gophers!!</p>
<img src="/static/gopher.png">
</body>
```

gopher.png です。
![gopher.png](https://qiita-image-store.s3.amazonaws.com/0/118068/774ff336-2f6e-c9fb-09e4-326d48056530.png)
か、かわいい！！！！！


ここで 次のような main.go を作成しましょう。

```go:main.go
package main

import (
    static "github.com/Code-Hex/echo-static"

    assetfs "github.com/elazarl/go-bindata-assetfs"
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()

    e.Use(static.ServeRoot("/static", NewAssets("assets")))
    e.GET("/ping", func(c echo.Context) error {
        return c.String(200, "test")
    })
    // Listen and Server in 0.0.0.0:8080
    e.Start(":8080")
}

func NewAssets(root string) *assetfs.AssetFS {
    return &assetfs.AssetFS{
        Asset:     Asset,
        AssetDir:  AssetDir,
        AssetInfo: AssetInfo,
        Prefix:    root,
    }
}
```

そして [go-bindata](https://github.com/jteeuwen/go-bindata) を次のように実行してみましょう。

    go-bindata -o bindata.go assets/...

こうすると、ディレクトリ構成は次のようになるはずです。

```
.
├── assets
│   ├── gopher.png
│   └── index.html
├── bindata.go
└── main.go
```

それでは `go build` を実行してバイナリを作りましょう。すると `echo` という名前のバイナリが出来上がるはずです。

# 実行
    ./echo

ブラウザで `127.0.0.1:8080` にアクセスしてみましょう。
`{"message":"Not Found"}` のようなメッセージが表示されるはずです。

しかし、main.go のファイルをもう一度見てみましょう。

```go
e.Use(static.ServeRoot("/static", NewAssets("assets")))
```

とありますね！
ということは `127.0.0.1:8080/static` へブラウザでアクセスしてみましょう！
可愛いページが表示されますね！！

これは `127.0.0.1:8080/static` にアクセスした時、 `assets` ディレクトリ上に置かれているファイルへアクセス可能にするという意味のコードです。
つまり、`index.html` へアクセスしたい場合は `127.0.0.1:8080/static` もしくは `127.0.0.1:8080/static/index.html`、gopher.png にアクセスしたい場合は `127.0.0.1:8080/static/gopher.png` へアクセスすればいいのです！

# まとめ
echo でもめっちゃ簡単にアセットをバイナリにまとめて、ブラウザなどからアクセスすることができる。
CSR作成からELB(ClassicLoadBalancer)への証明書適用まで


https://www.geotrust.co.jp/support/ssl/csr/apache_openssl_renew.html

- どこで作っても良い

1.キーペア作成済み

2.秘密鍵作成
鍵作成

```
# 鍵作成
$ openssl genrsa -des3 -out domain.2016.key 2048 

# パスフレーズ削除
$ openssl rsa -in domain.key -out domain.2016.key-nopass 

# パスフレーズなし鍵作成
$ openssl genrsa -out domainname.key 2048
```

3.CSR作成

```
# CSR作成
$ openssl req -new -key domain.2016.key -out domain.2016.csr


Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:xxxx
Organization Name (eg, company) [Default Company Ltd]:xxxx
Organizational Unit Name (eg, section) []:Secure Server IDs
Common Name (eg, your name or your server's hostname) []:domain
Email Address []:xxxx

```
4. CSR確認
```
openssl req -noout -text -in (CSRファイル名)
```

# ELBに証明書登録

http://dev.classmethod.jp/cloud/aws/aws-beginner-elb-ssl/

https://liginc.co.jp/web/programming/server/164756

![スクリーンショット 2016-11-16 13.42.30.png](https://heathrow.qiita.com/files/91b45836-3fe0-c66c-3599-3b9fcd267096.png "スクリーンショット 2016-11-16 13.42.30.png")

- 証明書名
	- ドメイン
- プライベートキー
	- パスフレーズを削除した秘密鍵 
- パブリックキー証明書
	- 購入した証明書
- 証明書チェーン
	- 中間証明書

## 登録できない時
![スクリーンショット 2016-11-16 13.45.27.png](https://heathrow.qiita.com/files/2702a38e-9c6b-e320-d8e0-130dcb032245.png "スクリーンショット 2016-11-16 13.45.27.png")

CLIで試してみる
(インスタンス全てが通らないと登録できないみたい。)

## 一覧
aws iam list-server-certificates

## 削除
aws iam delete-server-certificate --server-certificate-name a

## 登録~
https://saku.io/use-aws-cli-to-upload-certs-on-elb/

```
aws iam upload-server-certificate \ domain \
  --certificate-body file://domain.cer \
  --private-key file://domain.2016.key-nopass \
  --certificate-chain file://中間証明書.txt
```
## 確認
aws iam get-server-certificate --server-certificate-name SSL証明書名

# timeoutになる
- [CSRとSSLのチェックサム確認](http://qiita.com/sumida0713/items/72fcb2b0ab926c906507)
- [セキュリティグループが443許可しているか。]
(http://blog.tnantoka.com/posts/58)

# AWS Certificate Manager
AWS上で証明書を発行・管理できる、AWS Certificate Manager（ACM）が便利。
ffmpegを用いて、動画を分割するスクリプト

#なにこれ

* 長い動画を指定時間ごとに分割できる。
* `-c copy`オプションを使っているため、割りとはやい。
* なんかあったら怖いから、ファイル名の空白をアンダーバーに置換するスクリプトも同梱。
* ぶっちゃけ、空白潰しだけでも便利。
* 何かあれば、[ぼくのGithubアカウント](https://github.com/Hukanzen)。
* こっちのほうが連絡つく、[ぼくのTwitterアカウント](https://twitter.com/AkihisaYoshii4)。

#動作環境

* Linux localhost 2.6.32-642.11.1.el6.i686 #1 SMP Fri Nov 18 18:48:28 UTC 2016 i686 i686 i386 GNU/Linux
* ffmpeg-3.1.2 (自動スクリプト拾った)

#ソースコード

#####空白潰し
```perl:rename.pl
#!/usr/bin/env perl

#Current Directoryにある指定した拡張子の、ファイル名の空白をアンダーバーに全置換

#拡張子指定
$stat='mp4';
$fl='*'.'.'.$stat.'*';

@file=glob $fl;

foreach(@file){
	$new=$_;
	$new=~s!\s!_!g;
	print $_."-".$new."\n";
	system("mv \"$_\" $new");
}
```

#####動画ファイル分割
```perl:split.pl
#!/usr/bin/env perl

#
# 動画を分割する Perl Script
# 元ファイルが"sample_data.mp4"のとき、
# 出力ファイルは"sample_data_0.mp4","sample_data_1.mp4",...
# である。
#

# $of ファイル名
# $of_ka 拡張子
my $of="sample_data";
my $of_ka=".mp4";
my $rf=$of.$of_ka;
 
# 何秒ごとに分割するか
my $split_sec=20*60;

# ffmpeg コマンド 
# -i:入力ファイル
my $ffmpeg="/opt/ffmpeg_build/bin/ffmpeg -i $rf";

# 元動画ファイルの長さ
my $max_sec=&count_time;

for(my $i=0,$j=0;;$i+=$split_sec,$j++){
	#元動画ファイルよりも後ろの部分を切り取ろうとしたら、終了
	if($i>$max_sec+1){
		last;
	}

	#オプション
	#配列にしてあるので、好みで変更できる
	#-c :codecのコピー
	#-ss:指定した時間から変換を始める
	#-t :指定秒変換する
	my @option1=("-c copy","-ss $i","-t $split_sec");

	my $option=&mkop(\@option1);

	#コマンド作成
	$exe=$ffmpeg.$option;
	#出力ファイル
	$exe.=" $of"."_".$j.$of_ka;

	#コマンド実行
	print $exe."\n";
	print "system=".system($exe)."\n";
}

#オプション作成
sub mkop{
	my ($op)=@_;
	my $cmd="";

	foreach(@$op){
		$cmd.=" ".$_;
	}

	return $cmd;
}

#動画の長さを取得(単位:秒)
sub count_time{
	my $from_time=`$ffmpeg 2>&1 | grep Duration |cut -c 13-20`;
	my @time=split(/:/,$from_time);
	my $max_sec=0;
	foreach(@time){
		$max_sec*=60;
		$max_sec+=$_;
	}

	return $max_sec;
}

```

#なぜCPANとかのmoduleを使わない？

* めんどくさい
* 他環境への移行に手間がかかる

#注意点

* ffmpegのバージョンが古いと、オプションが足りなかったり、動画の長さが取得できなかったりする。
* CentOS6.8に登録されているRepositoryだと古いので、自動スクリプトを頑張って探してください。
* 派手に標準出力するので、`nohup`コマンドをうまいこと利用すると便利！
* 何か問題があれば消します。

#感想
* Perlはいいぞ
PHPのコールバックを使う関数(usort等)

# PHPのコールバック関数

phpのコールバックってほとんど使わないんですが、
**usort** (ユーザ定義のソート関数) でちょっと戸惑ったので覚書

## まずは普通の書き方

- usort(＄my_arr, 'my_sort');

```例.
// オリジナルソート関数
function my_sort($a, $b){
  // ちなみに…
  // -1 を返すと $a のが配列の先に。1 を返すと $b が先にセットされます
  return ($a < $b) ? -1 : 1;
}

$my_arr = array(15, 2, 5, 7, 1, 9);
usort($my_arr, 'my_sort');

var_dump($my_arr); // 1, 2, 5, 7, 9, 15

```

## Class内(別Classから呼び出す時)の書き方.

- usort(＄my_arr, array(＄class, 'my_sort'));

``` 例1.
class HogeClass {
  
  // オリジナルソート関数
  public function my_sort($a, $b){
    return ($a < $b) ? -1 : 1;
  }
}

class FugeClass {
  
  public function disp_sort(){
    $my_arr = array(15, 2, 5, 7, 1, 9);

    $cls = new HogeClass();
    usort($my_arr, array($cls, 'my_sort'));

    var_dump($my_arr); // 1, 2, 5, 7, 9, 15
  }
}

```
``` 例2.
class HogeController extends Controller {
  
  // オリジナルソート関数
  public function my_sort($a, $b){
    return ($a < $b) ? -1 : 1;
  }

  public function disp_sort(){
    $my_arr = array(15, 2, 5, 7, 1, 9);
    usort($my_arr, array($this, 'my_sort'));

    var_dump($my_arr); // 1, 2, 5, 7, 9, 15
  }
}

```
Odooインプレッション

かつてOpenERPと呼ばれていたオープンソースERP、Odooをインストールしてみました。バージョンはOdoo 10.0 Windows版です。正直なところ使いこなせている実感はあまりありませんが、何かの参考になればということで。

#Odooのインストール

[PayPal のアカウントと Odoo で、カード決済のできるショッピングカート付きのコーポレートサイト（しかも多言語！）を 30 分で立ち上げる話し](http://qiita.com/UedaTakeyuki/items/01751c04554eadcbadfd)ではGitHubからクローンしてインストールする方法が紹介されていますが、今回は標準インストーラを使ってインストールします。

[ダウンロードサイト](https://www.odoo.com/page/download)に行くと、御社名やら連絡先やらいろいろ聞かれます。どうも商売臭さを感じますが入力必須なので入力してWindows版を選ぶとインストーラが落ちてきますので、これを実行します。

インストーラにはPostgreSQLのインストーラも収録されていて、一緒にインストールされます。インストール操作は、そこそこスムーズと感じました。ところどころ謎の画面が現れますが、勘と経験で乗り切りましょう。インストールが完了すると、http://localhost:8069/ でOdooが動く状態になっています。

#アプリのインストール

「アプリ」タブをクリックすると、CRMとかプロジェクトとか在庫管理とか、いろいろな機能要素が並んでいます。34個もあって目移りしますが、必要なものを順次選択して「インストール」を実行すると使えるようになります。

#触ってみた感覚

##一種独特

なんというかGUIが一種独特です。全体を通してコンセプトはそれなりに一貫していますし、プアというわけではないんですが、好き嫌いは分かれそうです。フランス人好みなんですかね？

##初心者向けのガイドは充実

サンプルデータや、初回インストール時の操作ガイドは充実しており、雰囲気は掴みやすいと思います。

##個々のアプリはそれほど多機能というわけではない

アプリの数は標準で34個と充実していますが、業務でバリバリ使いこなしていこうという向きには、会計・財務は弥生会計に及ばないし、プロジェクトはRedmineに及ばないし、といった具合に、使っていくうちに不足感が出て来るんじゃないかという気がしました。

##規模感としては中小向けかと

Odoo公式サイトの採用事例を見ると、[Toyota Material Handling](https://www.odoo.com/blog/customer-reviews-6/post/how-toyota-uses-odoo-only-after-6-months-of-integration-312)（トヨタのフランス現地法人でフォークリフトなどを扱う）とか[WWF](https://www.odoo.com/blog/customer-reviews-6/post/how-many-eucalyptus-trees-wwf-helped-to-grow-with-odoo-188)（世界自然保護基金）とか錚々たるメンツが並んでいますが、どちらかというと[株式会社ROOMS FOR](http://www.openerp-asia.net/2013/11/imple-case-rfjp/)の9ユーザといったところが適正規模なんじゃないかという気がします。

##アプリ間の連携はちょっと希薄かも

例えば、固定資産台帳は「会計・財務」の中の機能要素の一つとして用意されていますが、それとは別に「備品」というアプリがあります。備品の項目と固定資産の項目の間に何らかの関連付けがあればいいのですが、そういうのは見当たりません。全体として、すべからくこんな調子です。

個々のアプリを独立にインストール・アンインストールできる設計思想と引き換えに、アプリ間の相互連携はそれほどではないという印象です。

##日本語情報が少ない

やはり英語を読む根性がないと、Odooを使うのは厳しそうです。Odooそのものは日本語Localeが用意されています（ところどころ抜け漏れがあり、英語メッセージが出てきますが、まあまあ許容範囲です）。しかしドキュメントが全部英語。。。

以上！あくまで個人の感想で、効果には個人差があります。

#参考文献

Odoo公式サイト
https://www.odoo.com/

ADEMPIERE JAPAN (SMBアソシエイツ株式会社)
オープンソースerpとは？
http://adempiere-japan.com/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9erp%E3%81%A8%E3%81%AF%EF%BC%9F/
各種オープンソースERPの比較表があります。
個人でmdadmを利用する時によく使うコマンド一覧

・RAIDの構成
　mdadm --create --verbose --level=1 --metadata=1.2 --chunk=64 --raid-devices=2 /dev/md0 /dev/sdb1 /dev/sdc1

・自動起動設定
　mdadm --detail --scan >> /etc/mdadm.conf

・スクラビングフラグを立てる
　echo check > /sys/block/md0/md/sync_action

・エラーメールの送信テスト
　mdadm --monitor --scan --test -1

・特定のディスクにフェイルフラグを付ける
　mdadm --manage --fail /dev/md0 /dev/sda1

・フェイルしたディスクを取り除く
　mdadm -r /dev/md0 /dev/sdb1

・スーパーブロックのraid情報を削除する（削除しないと次回、再構成で取り込まれたときに問題が起こる）
　mdadm --zero-superblock /dev/sdb1

・強制的に再構成する
　mdadm —assemble /dev/md0 —force —run /dev/sd[bcdefghijk]1

・アレイを停止する
　mdadm —stop /dev/md0

・アレイにディスクを追加
　mdadm --add /dev/md127 /dev/sdb1

・全ハードディスクのシリアルを知りたい
　hdparm -i /dev/sd[a-z] | grep -E "(dev|Serial)"

・zfsのtankをimport
　zpool import tank
angularで覚えておいたほうがいい便利なもの

# ◼配列操作
## 1. angular forEachを使う

```controller.js
var files = [];
angular.forEach($scope.photos, function(photo, key) {
　　this.push({ file_id: photo.file_id, url: photo.file.url, title: photo.title });
}, files);
```

# ◼データバインド

## バインドがうまくいかないときは$apply様を使う

``ng-click``、``$time``等を使わないケースや
``ng-model``や``ng-bind``を使用していても
angularと関係ないものを使っている場合などには（jQueryやプラグイン）datepicker etc...
「即時反映されない。」（``$digest``のタイミングがくるまで待機）

これを``即時反映``させたいときには、``$apply``を使うとバインドがうまくいきます。

```controller.js
$scope.$apply(function() {
  //実行内容
});
```
```controller.js
$scope.$apply($scope.setParams());
```

# ◼金額を日本円で表記したい場合

 - ※ angular-i18n モジュールを読み込みんでいる状態が前提です。

```
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular-i18n/1.2.10/angular-locale_ja-jp.min.js"></script>
```

```mainController.js
$scope.price = 4000;
```

### numberフィルターを使用する
```index.html
{{ price|number }}
>>> 4,000.00
```
### 小数点以下を切り捨てする
```index.html
{{ price|number:0 }}
>>> 4,000
```

参考:　[公式ドキュメント: http://js.studio-kingdom.com/angularjs/ng_filter/number](http://js.studio-kingdom.com/angularjs/ng_filter/number)


# ◼セレクトボックスの作成

やり方は二通りあります。

## 1. ng-repeatを使う

```controller.js

/**
 * 1から１００の配列を作成
 */
$scope.quantities = function () {
  var quantities = [];
  for(var i=1; i<=100; i++) {
    quantities.push(i);
  }
  return quantities;
};
```

```index.mthaml
%select(name="item_quantity" ng-model="item.quantity" ng-required="true" dir="rtl")
  %option(value="" dir="opt") タップして選択
  %option(ng-repeat="num in quantities()" ng-value="num" ng-bind="num")

```

## 2. ng-optionsを使う

連想配列、optionのkeyとvalueで値を変えたい場合

```controller.js
$scope.prefs = ['北海道', '東京都', '神奈川県','沖縄'];
```

```index.mthaml
%select(name="prefId" ng-model="prefId" ng-options="num as key for (num, key) in prefs" dir="rtl")
  %option(value="" dir="opt") タップして選択
```


# ◼ ng-epeatを使うときに$$hashkeyでエラーがでる

api等でjsonデータを取得した場合、$$hashkeyというキーを持っているとng-repeatができないというエラーがでます。

``track by``を使うことでこれを回避することができます。

```index.mthaml
%div(ng-repeat="item in estimate.json_data track by $index")
```



# ◼スマートフォンのキーボードあれこれ
追記: 2017/01/26

### 数字のみでバリデーション
```
<input type="text" ng-pattern="/^[0-9]+$/">
```

### 数字と小数点のみでバリデーション 
```
<input type="text" ng-pattern="/^\\d+(?:\\.\\d+)?$/">
```

### キーボードを数字のみにする

```
<input type="text" pattern="\\d*">
```
Quantum Experience 2.0 リリース!?


# Quantum Experience 2.0!?

[IBM Quantum Computing](http://www.research.ibm.com/quantum/) のサイトにアクセスしたら、Composer の見た目が変わっていました。「Quantum Experience 2.0」となっていて、バージョンアップしたみたいですね。

Community に「[QASM 2.0 Live](https://quantumexperience.ng.bluemix.net/qstage/#/community/question?questionId=c7a17f4183104ea22ff8e3e8a95f794c)」というスレッドがあり、ここに色々書いてありそうです (まだ読んでません)。


![スクリーンショット 2017-01-13 17.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/20418/f8329c2e-1717-74de-a88e-96846d110165.png "スクリーンショット 2017-01-13 17.03.18.png")

# 新機能？

過去の Score を開いてみたら、今までなかった GATES の種類や、BARRIER(バリア？)、SUBROUTINE などがあります。

![スクリーンショット 2017-01-13 17.17.11.png](https://qiita-image-store.s3.amazonaws.com/0/20418/7c01ad8f-fa6b-0892-523e-2ec8c3eeed88.png "スクリーンショット 2017-01-13 17.17.11.png")

# QASM Editor？

QASM Editor というタブも追加されています。今までも Score の QASM 表示はあったと思うのですが、直のコードの編集・Import/Export ができるみたいですね。

![スクリーンショット 2017-01-13 17.17.45.png](https://qiita-image-store.s3.amazonaws.com/0/20418/d751b422-2341-a2f1-e144-11a3984bfc33.png "スクリーンショット 2017-01-13 17.17.45.png")
bashの初見殺しっぷりがハンパない件

- 「これ知らなきゃ分からないだろ！」
- 「エラーの原因はわかったけど、なんか腑に落ちない」
- **いま悩んだ２時間返せ！**


bashというか、UNIXのコマンドに慣れてない
僕みたいな新人エンジニアが
気をつけた方がいいポイントまとめました。




#あいことばをわすれない

微妙にエラーが出ないため、気づかないまま進んでしまい、
のちのち絶妙に致命的なことになってしまうので注意。

```
#!/bin/bash
set -Ceu
```

一行目忘れて**２時間悩みました**
二行目のオプションつけなかったため**２時間悩みました**



setのオプションはお好みで

あいことばの解説：
http://qiita.com/magicant/items/f3554274ee500bddaca8




#半角スペースをつけるな！半角スペースをつけろ！

shellさんはスペースに非常に神経質です。
よくある変数代入では=の前後にスペースいれてはダメです。

```
val=1
```

これだけで**１時間悩みました**

また、if文とかで使うカッコの前後、

```
if [ $val -eq 0 ];then
  echo ok
fi
```

こっちはスペースが無いとエラーでます。
**１時間ほど悩みました**


ほか、ドットもスペース有り無しで違います。

```
#カレントディレクトリにあるhoge.shを（別Shell立ち上げて）実行する
./hoge.sh
```

```
#ルートにあるhoge.shを、カレントシェルで実行する。（ドットコマンド）
. /hoge.sh
```

は全く違う。
こんなの初見殺し以外なんでもない。
**２時間は悩みました**


#カッコやクオートのとじ忘れはあさっての行数でエラーでる。

40行目で閉じ忘れたのに
エラーは105行目で発生とかザラ。

超単純なシンタックスエラーでも
**１５分くらい悩めます。**


#引数を全部表示する$*と$@

ダブルクオートで囲ったとき挙動が違います。
**２時間悩みました。**


#!もやばいです。

http://qiita.com/anqooqie/items/785f46a8cc5f10ba7abb

まだ悩んだことないけど、
恐ろしい。



#まとめ


あれ？ Shellcheck でいいんじゃね？
https://www.shellcheck.net/

###使い方
例えば以下を、Shellcheckにつっこみます。

```
#!/bin/bash
set -Ceu

val=1

if [ val -eq 0 ];then
  echo ok
fi
```

すると


![image](https://qiita-image-store.s3.amazonaws.com/0/158747/54288a17-8680-2e4e-c45f-8eb78f6684f5.png)


６行目のvalに"$"を忘れたので怒ってくれます。
便利！
vagrantのマウントが失敗するのでvbguestプラグインを入れる

おそらく、VirtualBox5.0.30 → 5.1.12にバージョンアップしたからだと思いますが、vagrantでマウントができなくなりました。:cry:

vagrant upすると、

```
/sbin/mount.vboxsf: mounting failed with the error: No such device
```

と出て自動マウントが失敗している模様。(起動はできてるぽいけど)
いろいろggってみたところ、GuestAdditionsというのが古いままなのが問題みたいなので、そのへんをいい感じにしてくれるらしいプラグインを入れる。

```
$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.13.0)'!
```

入ったようなので再度 `vagrant up` する。

途中で

```
[default] GuestAdditions versions on your host (5.1.12) and guest (4.3.14) do not match.
```
とか出てて、勝手に何やらインストールしてくれるみたい。
途中で`404  Not Found`とか出てて大丈夫かと心配になったけど、無事に`Your box is ready and waiting.`と緑色のメッセージが出ました。

念のため

```
$ vagrant vbguest --status
```
してみたけど、

```
Got different reports about installed GuestAdditions version:
Virtualbox on your host claims:   4.3.14
VBoxService inside the vm claims: 5.1.12
Going on, assuming VBoxService is correct...
[default] GuestAdditions 5.1.12 running --- OK.
```
と出てるので大丈夫っぽい。

`vagrant ssh` してみたら、ちゃんとマウントされていました。良かった。
Rundeck/dockerでタイムゾーンを変更

# 手早く言うと

[jjethwa/rundeck](https://github.com/jjethwa/rundeck)を使うときは、

```
TZ: Asia/Tokyo
RDECK_JVM: -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Tokyo
```
と設定することでJSTで使うことができます

# 説明

RundeckをDockerで使う場合、[jjethwa/rundeck](https://github.com/jjethwa/rundeck) が定番になっています。

普通にこのコンテナを起動すると、デフォルトのタイムゾーンで立ち上がってしまうので、タスク実行時刻を02:00(夜中二時)を指定すると、お昼頃にタスクが実行されてしまいます。

```
02:00JST = 11:00UST
```

で、なんとかすべく 「Rundeck timezone」でググると、クラスメソッドさんのこの記事が出てきます。

[Rundeck: 任意のタイムゾーン設定によるサーバ稼働を試してみる ｜ Developers.IO](http://dev.classmethod.jp/server-side/server/setting-rundeck-by-specified-timezone/)

簡単にまとめると、OS上でtimezoneを設定して、Rundeck起動時の引数に```  -Duser.timezone=Asia/Tokyo  ```付けてあげればいけるよ、ということです。

jjethwa/rundeckの場合、``` RDECK_JVM ```という引数が用意されているので、起動時の引数は外部からかんたんに設定することができます。

けれども、OSのタイムゾーンの方は、

```
 cp /usr/share/zoneinfo/Japan /etc/localtime 
```

とファイルを上書きすることになっていて、これをdockerでやろうと思うと、どっかにスクリプトを仕込まないといけなくて、どうにも面倒くさい感じです。

ためしに、TZ環境変数をわたしてみると、これだけでも一応動いてくれるようです。
例えば午前１１時過ぎ(JST)に02:00のタスクを作成すると、

![Jobs_-_default.png](https://qiita-image-store.s3.amazonaws.com/0/30743/fb56a37d-e757-c8b0-a903-dbc508237a4c.png)

１４時間後ということで、正しく夜中に実行してくれます

# docker-compose.yml

ということで、JSTで起動するためのdocker-compose.ymlをgistに上げておきました。

[start jordan/rundeck on JST timezone.](https://gist.github.com/mogya/4599cda3716a5e168cd00b2582dd4db6)

```
docker-compose up -d
```
で起動してあげれば、RundeckをJSTで起動することができます。
shellいろいろまとめ

# test command
例：

```
[ ! -z STRING ]
[ -f file ]
```
参考：　http://www.computerhope.com/unix/test.htm
# Built-in Variables(special variables)
http://johnstowers.co.nz/pages/bash-cheat-sheet.html
https://www.tutorialspoint.com/unix/unix-special-variables.htm
http://www.tldp.org/LDP/abs/html/internalvariables.html
# Array
http://www.tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html#sect_10_02
# append to file

```
echo "hello world" | tee -a file
```

# replace content in file

```
sed -i 's/original/new/g' file.txt
```
郵便番号、電話番号、銀行口座の桁数


どうも、こんにちは！
郵便番号、電話番号、銀行口座の桁数を書き留めておきます。
Formの最大文字数やバリデーションに活用してみてください。
# 郵便番号
7ケタ
# 電話番号
10ケタ or 11ケタ
# 銀行口座
```
口座番号：4ケタ〜7ケタ
銀行コード：4ケタ
銀行名：15ケタ
支店コード：3ケタ
支店名：15ケタ
口座名義(受取人名)：30ケタ
```
## 全銀のデータ
### 金融機関コード、銀行コード検索
http://zengin.ajtw.net/
### APIって？
どこを探しても無料で公開されていないような気がする。
入門書を読み終わったらゲームを作ろう #2「"倉庫マン"をつくる」

# 前回までのあらすじ
数当てゲームが無事完成し、ゲーム制作の真髄を手に入れた。
「でもさ……もっとなんかこう、あるじゃん……」という声にお応えし、今回はもう少しマシなゲームを作ってみよう。

# 課題 「"倉庫マン"をつくる」

これから"倉庫マン"[^1]というゲームを作ろう。"倉庫マン"は、以下のルールで構成されている。

- 画面は、床・壁・プレイヤー・荷物・スイッチの5つのオブジェクトで構成されている。
    - 画面は、縦・横の二次元平面で構成されている。
    - 画面は、壁で囲われていなければならない。
    - 画面には必ず一つ以上のスイッチがあり、スイッチと同じ数の荷物が存在する。
- プレイヤーは、床の上を上下左右に移動することができる。
    - プレイヤーは、荷物が置かれていないスイッチの上にも移動することができる。
- プレイヤーの進行方向に荷物があるとき、主人公は荷物を押すことができる。
    - 荷物を押すとは、荷物があった場所にプレイヤーが移動し、進行方向のひとつ先に荷物が移動することである。
    - 荷物が移動する先に壁・荷物がある場合は、プレイヤーは荷物を押すことができない。
    - スイッチの上に置かれた荷物は、再び押すことができる。
- プレイヤーは、荷物を引くことができない。
- 全ての荷物がスイッチの上に置かれると、ゲームクリア。

##入出力
今回のゲームは、前回と同様にコンソールで入出力を行う。1文字で入力し、その入力に応じて処理を行い結果を表示するように考える。
入力や出力の値は自由に決めてもらって構わない。以下は完成予想図の例である。

```text:入出力例
#########
#..p....#
#.o...*.#
#..*.oo.#
#..*....#
#########
COMMAND (w:up a:left s:down d:right)
->
```
| 記号 | オブジェクト |
|:-:|:-:|
| \.  |  床 |
| \#  |  壁 |
| p  |  プレイヤー |
| o  | 荷物  |
| *  |  スイッチ |



##段階別制作
いよいよ制作に移る。ここからは工程だけを示すので、自らの手でコーディングしてほしい。

|段階1　　初期画面|
|:--|
|床・壁のみで適当な画面を作り、テキスト形式で表示せよ。|

| 段階2　　プレイヤー|
|:--|
|プレイヤーを画面に表示せよ。 |

| 段階3　　プレイヤーの移動|
|:--|
|ユーザーの入力を受け付け、プレイヤーを上下左右に移動させよ。 |

| 段階4　　プレイヤーの移動チェック|
|:--|
|プレイヤーを壁に移動させ、仕様通りの挙動になるか調べよ。 |

| 段階5　　荷物|
|:--|
|荷物を3つ画面に表示せよ。 |

| 段階6　　荷物の移動|
|:--|
|3つの荷物を、それぞれプレイヤーの移動によって押せ。 |

| 段階7　　荷物の移動チェエク|
|:--|
|荷物を壁の方向へ押して、仕様通りの挙動になるか調べよ。また、別の荷物の方向へと移動させたらどうなるか。|

| 段階8　　スイッチ|
|:--|
|スイッチを3つ追加せよ。 |

| 段階9　　スイッチとプレイヤー |
|:--|
|スイッチの上にプレイヤーを移動させよ。また、プレイヤーをスイッチの上から移動させよ。 |

| 段階10　　スイッチと荷物|
|:--|
|荷物をスイッチの上に押せ。また、乗せたあと再び荷物を押せ。|

| 段階11　　ゲームクリア |
|:--|
|全てのスイッチの上に荷物がある状態を判定せよ。その場合はゲームクリアと表示し、ゲームを終了せよ。 |

| 段階12　　ユーザビリティ向上 |
|:--|
|プレイヤーや荷物がスイッチの上にある状態を、ユーザーが一目で判断できるようにせよ。 |

#解説
多少ゲームらしくなっただろうか。きっと数当てゲームよりはそれらしくなっただろう。

2つのゲームの違いは何だろうか。私は**「製作者の思惑」**と**「ビジュアル」**にあると考えている。
数当てゲームはゴール（当たりの数字、ナンバー）をコンピュータが自動で決定する。一方で、"倉庫マン"のような画面には得てして製作者が「こんなふうに遊んでほしい」という意図が見え隠れする。これはゲームが複雑化すればするほど滲み出てくるものだろう。
そして、自分の行動が見えるというのはやはり嬉しい。自分でゲームを動かしているという自覚があると、途端にゲームは楽しくなる。

ビジュアルについて、華麗なグラフィックがないと不満に思う人がいるかもしれない。しかし、このゲームが完成する頃には、もはやグラフィックの実装はそこまで難しいものではない。どこからか華麗なグラフィックを持ってきて、記号の代わりに表示する機能を追加するだけでよいのだから。

* * *

[^1]: お察しの通り、要するに「あの」ゲームである
PlantUMLチートシート

```
@startuml
title:関連
' クラス
Class "A"  as A {
aaa
}
Class "関連"  as 関連 {
bbb
}
Class "方矢印"  as 片矢印 {
ccc
}
Class "汎化"  as 汎化 {
ddd
}
Class "コンポジション"  as コンポジション {
ddd
}

' 関連
A --   関連
A -->  片矢印
A --|> 汎化
A --*  コンポジション
@enduml
```

![image](https://qiita-image-store.s3.amazonaws.com/0/94585/3cf4893f-1bfe-9a83-d7fe-0b18da24fa95.png)
nodebrewでNode.jsのインストール

Node.js始めしたのでインストールの方法を備忘録的に。
(多分Node.jsの頭文字は大文字の方がいいっぽい。)

## nodebrewのインストール

Node.jsのバージョンを管理するツールのnodebrewをインストールする。
Node.jsは今も開発されていて日々改善が行われているので自分がどのバージョンを利用しているのかのを把握したり、新しいバージョンが必要な際に切り替えたりすることがあるのでバージョン管理が必要になる。（らしい）

nodebrewをインストールするためにまずコマンドを実行する。

```
curl -L git.io/nodebrew | perl - setup
```

curlコマンドはファイルのダウンロードやアップロードを行い、-Lオプションでリダイレクトに対応している。（実際git.io/nodebrewはブラウザで開くとリダイレクトする。）
ここではgit.io/nodebrewをURLに指定している。
「 | 」でパイプ（今の所、左側で行った処理の返り値的なものを使って右の処理を行う感じで理解してる。）して、
perl -setupの部分はperlでgit.io/nodebrewが書かれてるっぽいので実行する際に必要になるっぽい。（不確か）

これでnodebrewがインストールされるので
.profileにPATHを設定してどこからでもnodebrewが利用できるようにする。
.profileはシェルを起動した時に自動的に実行されるファイルなのでここに書き込むことで起動した時に読み込まれるようにする。

```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.profile
```

echo 'text' >> file
の「>>」でfileに追記している。

再起動するのは面倒なので、再度読み込むためにsourceコマンドで.profileを読み込む。

```
source ~/.profile
```

ここまででnodebrewのインストールとパスを通した。

## Node.jsのインストール

バージョン管理のnodebrewはインストールできたので、早速nodebrewを使ってNode.jsをインストールしてみる。
最新ではv7.4.0(2017/01/11現在)になっている。v4.0.0から「io.js」と「Node.js v0.12.x」が統合されたらしい。

nodebrewでインストールできるバージョンに関しては以下のコマンドの実行で確認できる。

```
nodebrew ls-remote
```

(io.jsのインストールもできるっぽい。どう使えるのかは不明。。。昔のプログラムを動かせたりするのか。)

インストールするときのコマンドが２種類あって（nodebrew helpで確認できる。）、binary fileでインストールするかコンパイルされたものをインストールするかを選べる。

```
// コンパイルされたものをインストール
nodebrew install <versionを指定>
// binary fileをインストール
nodebrew install-binary <versionを指定>
```

ただ上の方でインストールすると時間がすごくかかるらしいので下の方でやった方がいいらしい。

安定版をインストールしたい場合は

```
nodebrew install stable
```

最新版をインストールしたい場合は

```
nodebrew install latest
```

でそれぞれ可能。


インストールが終わったら確認

```
nodebrew ls
```

ここまででインストールはできているけど、どのバージョンを使うのかを宣言できていないので

```
nodebrew use <versionを指定>
```

で使うバージョンを指定。

最後に実際にNode.jsが使用できるかの確認

```
node -v
```

これで使用を宣言したバージョンが表示されていればNode.jsのインストールは完了！


[ブログでも書いた](https://iedetensinhan.wordpress.com/2017/01/11/node-js%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
Zynq + Linux Kernel 4.5(以降) で "mmc0: Timeout waiting for hardware interrupt" が起きる場合の対処方法

## 症状

Zynq で Linux Kernel 4.5以降 を動作させた時、"mmc0: Timeout waiting for hardware interrupt" が起きて SD-Card が読めません。
SD-Card に root file system を作っていた場合、Linux が起動出来なくなります。

## 原因

~~Linux Kernel 4.5 以降、なにやら sdhci ドライバ周りにかなり変更が入っています。その変更内容(特に ADMA 周り)が Zynq と相性悪いようです。~~

原因は別にあるようです。詳細は次の記事を参照してください。この記事の内容は古くなっていますが、参考のため残しておきます。

* [Zynq + Linux Kernel 4.5(以降) で "mmc0: Timeout waiting for hardware interrupt" が起きる場合の対処方法(続編) @Qiita](http://qiita.com/ikwzm/items/deb43d02ac57f3f2188f)



## 参考

[https://forums.xilinx.com/t5/Embedded-Linux/mmc0-Timeout-waiting-for-hardware-interrupt-RFS-is-not-loaded/td-p/731734](https://forums.xilinx.com/t5/Embedded-Linux/mmc0-Timeout-waiting-for-hardware-interrupt-RFS-is-not-loaded/td-p/731734)

## 対処方法

あくまでも暫定対策ですが、sdhci ドライバの ADMA を使わないようにします。

### Linux メインラインの場合

手っ取り早く対処するには、bootargs に sdhci.debug_quirks=64 を追加します。

ちなみに 64 という数字は linux kernel の drivers/mmc/host/sdhci.h で次のように定義されている値です。

```C:sdhci.h

/* Controller has an unusable ADMA engine */
#define SDHCI_QUIRK_BROKEN_ADMA				(1<<6)

```

この値を debug_quirks に設定していると、ADMA は BROKEN(壊れている？）と見なされて ADMA は使わないようになります。

### Xilinx が提供する Linux の場合

Xilinx が提供している linux の場合、デバイスツリーで broken-adma2 プロパティを追加すると良いようです。
（input[name=xxx]:checked)を使わないでradioボタンのcheckedを取る


HTMLはこれ。

```hoge.html
<form id="cancel-reason-form">
	<input type="radio" name="reason" value="1">
	<input type="radio" name="reason" value="2">
	<input type="radio" name="reason" value="3">
	<input type="radio" name="reason" value="4">
	<a id="cancel-reason-btn" href="#" class="btn-blue">送信する</a>
</form>
```

## 他の参考になる記事

[【jQuery】ラジオボタンの状態取得と選択制御](http://qiita.com/tomcky/items/d5f13f58228593658720)

こちらの記事で十分ですが、ページ内に、別のformと同じ名前のradioボタンがあった場合には困るので、このフォームの中のっていうのがやりたかったです。

[ちょいちょいわからなくなるcheckbox, radio, selectboxの値の取り方]
(http://qiita.com/nmta/items/dc29378adf79c5784218)

こちらの記事のように、formにidをつけてセレクタを使えば良いですが、IDつけられないこともあるかもなのでｗ

## 自分で書いたやつ

### radioのnodelistをとってそのcheckedをfilterする

```hoge.js
function sendCancelReason(){
	var $form = $('#cancel-reason-form');
	var reason = $($form[0].reason).filter(":checked").val();
	console.log(reason);
}
```

こんな風に取れます。

```hoge.js
var reason = $($form[0].reason).filter(":checked").val();
```
は

```hoge.js
var reason = $($form[0].reason).filter(":checked").first().val();
```

の方がいいんだろうか。。。

### idのセレクタを使ってfilter

```hoge.js
$("#cancel-reason-form input[name=reason]:checked").val()
```

めっちゃ短い…。これの方がいいか…。
トレジャーデータ

お世話になっております。

お目汚し失礼します。

仕事でトレジャーデータというものがあると知りました。

グーグル先生に問い合わせて見ると

http://blog-jp.treasuredata.com/
http://blog-jp.treasuredata.com/entry/2016/09/13/163306

https://docs.treasuredata.com/articles/javascript-sdk

javascriptで操作出来

http://qiita.com/kzk9/items/15f4e01cafa30fb8e7a5
とqiitaさんにも記事が見つかりました。

見てみると
in.treasuredata.com
の中にデータがありそれを利用するにはsdkをインストールしないとイケナイのかな……

メモのように使用して申し訳ございません。

qiitaってメモしてるだけでも良いのでしょうか？
KotlinでAWS Athenaのビューワーつくった。

## AWS Athenaってなに？
re:Invent2016で発表された== 超新しいサービス！
S3内のログデータなどに対してテーブルを作って、クエリを流すと結果が返ってくるっつー代物。
標準的なSQLを理解してくれる上に、JDBC接続が可能。

AWSのマネコンから、クエリ投げられるのでスタートはちょっぱや。


## 悪いこと思いついた
1. JDBC...?
2. Java...?
3. Java on Lambda...!
4. Kotlin...!!


## できましたー
![https://image.slidesharecdn.com/20170112premiernight-170112042544/95/aws-13-638.jpg?cb=1484195169](https://image.slidesharecdn.com/20170112premiernight-170112042544/95/aws-13-638.jpg?cb=1484195169)

こうして...

![https://image.slidesharecdn.com/20170112premiernight-170112042544/95/aws-12-638.jpg?cb=1484195169](https://image.slidesharecdn.com/20170112premiernight-170112042544/95/aws-12-638.jpg?cb=1484195169)

**こう!!**

_説明は[コチラのスライド](http://www.slideshare.net/shinichitakahashi790/aws-70932144)_

言語・フレームワークはフロントがVue2、 LambdaはKotlinで作ったのでそこそこモダンなコードなはず！

リポジトリはココで公開してるし、READMEも書いたのでAPI Gatewayたてて好きに使っちゃってね！
https://github.com/cloudpack/minerva


## 余談その１

スライドにもある通り、サーバーレスは当たり前のこと、分析対象データがS3ってことで **DBレス** にもなってるのよね。
サーバーもなくてDBもないっておまえ...じゃあなんなんだよ...っていう未来が拓ける何かになった気がしてる。
今までは「Elasticsearchに流して...(ｾｺｾｺ)Kibanaで...(ｾｺｾｺ)ワーイ」みたいなのがそんなんなし！！
オラァ！ってやればそれでおｋ。しかも安い。
つまりすごい。


## 余談その２

もともとPHPerだけど、今回はKotlin。
理由はIntelliJ IDEA Ultimate買った + JDBC必要 + たのしそう、の３つ。
Swiftっぽさもありながら、やっぱりしっかりJavaで、POJOつかったナニナニみたいなのはすげえ簡単にできてそこそこまともに書けた気がする。
(GsonとJacksonつかってるのは目をつぶって)

なんかやべえの見つけたらコメントで教えてください！
PostgreSQL 俺のチートシート [ロール編]

## ロール
ロールとは、ユーザまたはグループの事

- 既存ロールの確認

```shell-session
[psql]# \du
```

- ロールの新規作成

adminユーザの新規作成ならば、

```shell-session
[psql]# CREATE ROLE admin WITH SUPERUSER LOGIN PASSWORD 'password'

 SUPERUSER  | NOSUPERUSER
 CREATEDB   | NOCREATEDB
 CREATEROLE | NOCREATEROLE
 CREATEUSER | NOCREATEUSER
 INHERIT    | NOINHERIT
 LOGIN      | NOLOGIN
```
などの種類を同時に付与できる

- 権限

スーパーユーザと所有者（オブジェクトを作成したユーザ）は、
デフォルトで全ての権限を持っている。

SELECT、CREATE、ALLなど

- 権限の追加

```shell-session
GRANT 権限 ON 対象（テーブル名またはスキーマ名） TO ロールまたはpublic
```

- 権限の付与

```shell-session
[psql]# \z
```

testrole=arwd/postgres
と表示された場合、postgresがtestroleに権限付与した、という意味

- 権限の削除

権限の削除は、権限付与者またはSUPERUSERのみ可能。

```shell-session
REVOKE 権限 ON 対象（TB名またはDB名） FROM ロール
```

- ロールの変更

```shell-session
ALTER ROLE ロール WITH CREATEROLE CREATEDB
```
ロールの変更は、CREATE ROLE持ちロールまたはSUPERUSER
CREATE ROLE持ちロールは、SUPERUSER以外のロールを変更可能。

以上
dockerをバージョンアップする (Docker Toolbox)

docker-compose を実行しようとすると、

```
Unsupported config option for services service: 'main'
```

と出て悩んだのだけど、どうやらdockerのバージョンが古いせいらしい。

```
$ docker --version
Docker version 1.8.2, build 0a8c2e3
$ docker-compose --version
docker-compose version: 1.4.2
$ docker-machine --version
docker-machine version 0.4.1 (e2c88d6)
```

のでバージョンアップする。

記憶にないけど、現在インストールされているものはどうやら DockerToolbox-1.8.2c.pkg でインストールしたようなので、最新のDocker Toolboxをダウンロードして実行する。(DockerToolbox-1.12.6.pkg)
https://www.docker.com/products/docker-toolbox

```
$ docker --version
Docker version 1.12.6, build 78d1802
$ docker-compose --version
docker-compose version 1.9.0, build 2585387
$ docker-machine --version
docker-machine version 0.8.2, build e18a919
```

バージョンアップされました。:smiley:
bash の set -eu と wait と subprocess についてのメモ


bash で set -eu としておくと、エラーが発生した時にそこで終了してくれるので便利なんですが ([参考](
http://qiita.com/youcune/items/fcfb4ad3d7c1edf9dc96))、
& つけて background 処理した時にエラー検知できなくてはまったのでメモ

```bash
#!/bin/bash

exec 2>&1
set -eux

./sleep3_error.sh  & # sleep 3 して exit 1 するスクリプト

wait

echo "OK"
```

これを実行すると、正常終了してしまう。

```
$ sh 1.sh ; echo $?
+ wait
+ ./sleep3_error.sh


+ echo OK
OK
0
```

これを、下記のように、pid 指定でwait しておくとエラー検知できる。

```
#!/bin/bash

exec 2>&1
set -eux

./sleep3_error.sh  & # sleep 3 して exit 1 するスクリプト
pid1=$!

wait $pid1

echo "OK"
```

実行結果

```
$ sh 2.sh ; echo $?
+ pid1=83798
+ wait 83798
+ ./sleep3_error.sh
1
```

ちゃんとエラー(1)で終わってる。

複数の処理を & で実行して、すべて正常終了したら、次の処理、みたいなのやろうとしたとき、wait しか書かないと、エラー起きてても次に進んでしまうので注意。

なんでこうなってんだろ。


参考：　[bash \- 複数のバックグラウンド処理の終了判定！ \- mk\-mode BLOG](http://www.mk-mode.com/octopress/2012/09/13/13002045/)
VisualStudio2015のチームエクスプローラーに対応するGitコマンド逆引き

# はじめに
やりたいことがgitコマンドから追えるよう、一覧にしてみました。
チームエクスプローラー、直感的じゃなくてイマイチなUIだと思うのは私だけでしょうか･･･。

コマンドオプション等、正確ではないかもしれません。
引数も省略してたりするので、あくまで簡易一覧と思っていただければ。


# チームエクスプローラの画面一覧

- ホーム
  - 変更
  - ブランチ
  - 同期
  - 設定
     - グローバル設定
     - リポジトリの設定
- 接続の管理


# ホーム

- 現在のブランチ上に存在するVSソリューションが表示される


# 変更

- 新規/修正/削除ファイルの一覧が表示される
`$ git diff`

- ファイル右クリック＞ステージで対象ファイルのみステージング
`$ git add [file]`

- ファイル右クリック＞変更を元に戻す
`$ git checkout [file]`

- すべてをコミット（ステージングは勝手にされるので意識しない）
`$ git add --all`
`$ git commit`

- ステージング済みをコミット
`$ git commit`

stashができるといいなぁ。


# ブランチ
- ブランチの一覧が表示される（リモートリポジトリ含む）
`$ git branch -a`

- ブランチ名クリックで切り替え
`$ git branch [branch]`

- リモートブランチ名クリックでローカルにクローンできる
`$ git checkout -b [origin/branch] [branch]`

- マージ
`$ git marge`

- リベース
`$ git rebase`

- アクション＞履歴の表示
`$ git log --graph`


# 同期

- 同期
`$ git pull`
`$ git push`

- フェッチ
`$ git fetch`

- プル
`$ git pull`

- プッシュ
`$ git push`

- 操作＞履歴の表示
`$ git log --graph`


# 設定

## グローバルの設定
`$ git config --global user.name "unnamed engineer"`
`$ git config --global user.email johndoe@example.com`

### 差分ツールおよびマージツール
`$ git config --global core.editor [c:\hoge\vsdiffmerge.exe]`
`$ git config --global merge.tool [c:\hoge\vsdiffmerge.exe]`

## リポジトリの設定

### ユーザ名および電子メール
`$ git config user.name [unnamed engineer]`
`$ git config user.email [johndoe@example.com]`

### 差分ツールおよびマージツール
`$ git config core.editor [c:\hoge\vsdiffmerge.exe]`
`$ git config merge.tool [c:\hoge\vsdiffmerge.exe]`

### リモート
- リモートリポジトリの一覧が表示される
`$ git remote`

- 追加
`$ git remote add origin [https://xxx.com]`

- 編集
`$ git config remote.origin.url []`
`$ git config remote.origin.fetch []`
`$ git config remote.origin.push []`

- 削除
`$ git remote rm [origin]`

# 接続の管理
- 新規
`$ git init`

- 追加
VisualStudio管理下に無いローカルのGitリポジトリを登録する（≠git add）

- 複製
`$ git clone`
レンダリングの考え方を調べてまとめてみた(Unity)（１）

Unityは２Dゲーム作成ツールとして触っていましたが、3Dは鬼門でした。なんだかよくわからない、、、。

サンプルを作ることはできるのですが、全体像が分からないため、何がどうなっているのか今一わかっていませんでした。その状況を打開すべく、素人なりに調べてみた結果をまとめてみます。数式などは極力省いて（とういか自分が理解できなくなっちゃう）説明していく予定です。

## 謝辞
以下の書籍やサイトを参考にさせていただきました。一部パクリみたいになっていると思います。ご指摘いただければ変更削除いたします。

- [3D-CGプログラマのためのリアルタイムシェーダー入門](https://www.amazon.co.jp/dp/4777518736/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=187205609&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4777510875&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=VR7A4PV78NPJ414EXGAE)
- [光と色の話（CCS株式会社）](http://www.ccs-inc.co.jp/s2_ps/s1/s_04/column/light_color/)
- ここも増えていく予定です

## 目次（今のところ予定）
* そもそもレンダリングってなんだろう
* そもそも反射ってどんな現象だろう
* 拡散(diffuse)反射（直接光）
* 鏡面(specular)反射（直接光）
* 間接光（環境光）
* 物理ベースレンダリングについて
* 間接光について（Unityの場合）

## レンダリングってなんなんだろう
![name.png](https://qiita-image-store.s3.amazonaws.com/0/65391/a3a1219b-4b59-eda0-d07a-e45cd18b840d.png)

表示したい物体表面上の1点に注目してみます。その点をpとします。そのpから視点vに向かって出ていく光を計算することがレンダリングです。

この画像のサイズは460x320です。ピクセル個数は147200個になります。このピクセル一つ一つが点pに相当し、各ピクセル毎にレンダリングの計算が行われて、色が決定されます(全部不透明と仮定します。透明だと同じ地点でも複数回レンダリングの計算されますよね)。ものすごい計算量ですよね。

### レンダリング方程式
点pから視点vへ出ていく光を計算する方程式をレンダリング方程式と呼びます。関数名Rとします。Radiance(放射輝度)の頭文字です。

```math
\vec{v}：視線方向のベクトルです\\
上矢印が付いているのはベクトルです。\\
R(p,\vec{v})
```

![説明１.JPG](https://qiita-image-store.s3.amazonaws.com/0/65391/2c845628-8819-383f-eaa3-4f26bc88ec35.jpeg)




点pが発する光は、自分自身が発光する光$R_{emmision}(p,v)$と、他から照らされた光を反射した光$R_{reflection}(p,v)$の2つに分けて考えられます

```math
R(p,\vec{v}) = R_{emmision}(p,\vec{v}) + R_{reflection}(p,\vec{v})
```

#### **反射光(ライト１つ)**
$R_{reflection}(p,v)$に注目します（自己発光は単純ですし、あんまり自分が光る物ってないです）。

点pに入ってくる光がライト1つの場合を想定してみましょう。

入射した光がそのまま反射することはありません。実際は特定の波長だけ吸収されたり、減衰したりします。材質によって振る舞いが変わります。またライトと点pの角度によっても明るさが変わるでしょう（真横から照らしても照らされない）。

点pに入射した光がどれくらい反射するか係数を計算する必要があります。その係数と入射した光を掛けて、点pから視点vに向う光が計算されます。

```math
l = ライトの入射の向き\\
L(p) = 点pに入ってくるライトの光\\
k(p,v,l) = どれくらい反射するかを表現する関数\\

R_{reflection}(p,\vec{v}) = k(p,\vec{v},\vec{l})L(p)
```
![説明2.JPG](https://qiita-image-store.s3.amazonaws.com/0/65391/8b169d72-cb5a-9d0d-bba7-7d3b9cf5b88c.jpeg)

#### **反射光(ライト複数)**
ゲームシーンにライトが1つしかないケースはまれです。実世界で電球を増やせば机の上の明るさが増すように、複数ある場合は足す事で表現できます。

```math
R_{reflection}(p,\vec{v}) = \sum k(p,\vec{v},\vec{l}_{i})L_{i}(p)
```

#### **反射光の反射光の反射光の、、、、**

点pに入射する光は光源だけとは限りません。すでに照らされた別地点が反射した光で照らされる事もあります。もしかしたら、その別地点も、また別地点の反射した光で（以下略）。このことを「多重パスによる反射」と呼ばれます。式で見てみましょう(自己発光はないものとします)。

```math
k(p,\vec{v},\vec{l}_{i})をkと略します\\
R(p,\vec{v}) = \sum kL_{i}(p)\\
= \sum k(\sum k'L_{i}(p')')\\
= \sum k(\sum k'(\sum k''L_{i}(p'')'')\\
= 何回必要かわからない。反射した回数分\\
```

![説明３.JPG](https://qiita-image-store.s3.amazonaws.com/0/65391/f9a77e85-12f5-7468-403a-20e9892ef1da.jpeg)

ここを比較的正直に計算して高品位な画像を得ているのが「レイトレース」とか「ラジオシティ」などの手法です。しかしゲームのようなリアルタイムな物はこの計算はあまりに重たすぎます。そこで大胆にカットしたり様々な工夫をしてきました。後半そのあたりの説明ができたらなと思います。

#### **直接光、間接光**
ライトから直接地点pに入射する光を「直接光」
それ以外の様々な別地点で反射して地点pに入射する光を「間接光」
と呼びます。

間接光の計算は膨大なため、昔のレンダリングは間接光をバッサリと無視し、直接光だけを計算しました。次の回「古典的レンダリングについて」ではそこを説明しようとおもいます。
WordPress Transients API を使うときの覚書

# Transients API とは

https://wpdocs.osdn.jp/Transients_API

> この API はキャッシュされるデータを一時的にデータベースへ保存するためのシンプルで標準化された方法を提供します。この方法ではデータに名前と有効期限を設定し、期限が来るとデータが削除されます。

利用例として

* 各種SNSの数字（いいね数）などを自前で取得して表示
* @horike37 の Simple GA ランキングプラグイン

# 基本コード

```php:transient_sample.php
<?php
// Transient データを取得する
if ( WP_DEBUG or false === ( $value = get_transient( 'sample_key' ) ) ) {
    // Transient が存在しない場合 or デバッグモードのときにこの部分のコードが実行
    $value = ... // ここで $value の値を設定し直す
    // $value を Transient へ保存。12時間後に無効にする。
    set_transient( 'sample_key', $value, 12 * HOUR_IN_SECONDS );
}
echo $value;
```

# Transients を削除したい／中身みたい

WP-CLIでサクッと

https://wp-cli.org/commands/transient/

```bash

# Set transient.
$ wp transient set sample_key "test data" 3600
Success: Transient added.

# Get transient.
$ wp transient get sample_key
test data

# Delete transient.
$ wp transient delete sample_key
Success: Transient deleted.

# Delete expired transients.
$ wp transient delete --expired
Success: 12 expired transients deleted from the database.

# Delete all transients.
$ wp transient delete --all
Success: 14 transients deleted from the database.
```
Pleiades All in One の英語化

[Pleiades All in One](http://mergedoc.osdn.jp/)を日本語で使うと、[Quick Access機能](https://mcuoneclipse.com/2012/04/08/quick-access-ctrl3/)で英単語で絞り込めなかったり、CheckStyle等のエラーメッセージが原文で読めなくなったりするため、英語化を行ないました。

## Pleiades All in One の英語化の手順

※インストール直後のEclipseを立ち上げる前に、下記の手順を実行する必要があります。
※macOSの場合には、下記の"[Pleiadesのインストールフォルダ]\eclipse"は、"/Applications/Eclipse_(バージョン)/Contents/"となります。Finderのコンテキストメニューから、"Show Pacakge Contents"メニューを選択して開くことができます。

1. "[Pleiadesのインストールフォルダ]\eclipse\dropins\MergeDoc"ディレクトリを削除
1. "[Pleiadesのインストールフォルダ]\eclipse\eclipse.ini"ファイルを変更
	* "-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar"の行を削除
	* 最後の行に"-Duser.language=en_US"を追加
1. macOSの場合、Terminalアプリから"xattr -rc /Applications/Eclipse_(バージョン).app"を実行
標準ではないけどNode.jsの便利なデバッグ方法

Node.js をデバッグする方法はいくつかありますが
今回は標準ではないですが、便利な方法があるので紹介します

# 使うもの

- Node.js v6.6 以上  
v6.3 からでも可能ですが、いろいろバグがあるらしいので
- Chrome v55 以上

# 前準備

標準の方法ではないため、Chrome のフラグを設定する必要があります

## デベロッパー ツールの試験運用版機能の有効化

Chrome で [chrome://flags/#enable-devtools-experiments](chrome://flags/#enable-devtools-experiments) を開き、有効にします

![enable-devtools-experiments.png](https://qiita-image-store.s3.amazonaws.com/0/54850/23a83f8b-f85a-e44e-8c32-1833b162fe0a.png)

「有効にする」をクリックすると、ブラウザの再起動を要求されるので、再起動します

## Node debugging の有効化

ディベロッパーツールの設定を開くと、↓このように「Experiments」が追加されています

![settings-experiments1.png](https://qiita-image-store.s3.amazonaws.com/0/54850/aa252e56-cff1-54dd-62f3-7b21c9381e56.png)

ここで、Shift キーを6回叩くと・・・

![settings-experiments2.png](https://qiita-image-store.s3.amazonaws.com/0/54850/071c4098-aeb0-212f-14a7-c70cd5007b91.png)

裏設定？が表示されるので、「Node debugging」にチェックを入れます
**重要な設定はこれです**

---

これで準備完了です

# サンプルプログラム
express を使った簡単なサンプルプログラムを用意します

```app.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000);
```

# デバッグ

ディベロッパーツールを開いた状態で、ターミナルで下記コマンドを実行します

```bash
node --inspect --debug-brk app.js
```

`--inspect` フラグを付けることでデバッグができます
`--debug-brk` フラグを付けると実行開始時に最初の行で一時停止した状態になります

実行すると「chrome-devtools://...」のような URL が表示されるので、それを Chrome で開いてもデバッグできますが
今回の方法ではそれが必要ありません

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/54850/f29edacf-a4dd-1624-371d-f3221af03c5a.gif)

動画を見てもらうとわかると思いますが、自動的に Chrome にアタッチしてくれます
いちいち URL をコピペしなくて済むので楽ですね

# 注意点

たまに自動アタッチが効かなくなる時がありますが
その時は「Node debugging」フラグが外れてたりしますので
再チェックしてください
Chrome のバージョンアップ後に多いので、その際にリセットされてるのかもしれません
RawとLPRの違いについて

プリンタを設定する際のポートの設定について

サーバーへ接続したプリンタが印刷できない障害が発生した時、プリンタ製造メーカーに問い合わせた際に応対してくれた人に色々勉強させていただいた。

ポートの設定時のプロトコルの違いについて

Raw
Windowsより印刷する時はこちら。
クライアント側より送られた印刷データを受け取ったら滞留させずにプリンタへ送信する。

LPR
プリンタ側より特に指定がある時はこちら。
クライアント側より送られた印刷データを一度貯めてからプリンタへ送信する。

その他いろんな事

Windows\System32\spool\PRINTERS に保存されているスプールデータには容量の上限がある。
一度に大量に印刷する時はこの上限に引っかかると印刷されなくなる事がある。

アプリ側より印刷する時、
部単位で印刷、10部印刷 を選択すると、10回分の印刷データが生成される。
	ページ単位で印刷、10部印刷、を選択すると、1回分の印刷データが生成される。

サーバーへプリンタを再度登録する際は以下の手順により行う事。また、再登録したプリンタを公開する際、前と同じ公開名にすることで、クライアント側の登録を不要にできる。
	1．サーバー側のドライバ削除。全てを完全に削除する。
	  プリンタセットアップ時に一緒に入るアンインストールツールを使ってアンインストールすると、何も残らずにきれいに削除してくれる。
	2．サーバー再起動
	3．サーバー側のドライバインストール
	4．サーバー再起動
Pythonを使うなら知っておくべき！便利なライブラリ10選

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[Pythonを使うなら知っておくべき！便利なライブラリ10選](http://programming-study.com/technology/python-library/)


#Pythonを使うなら知っておくべき！便利なライブラリ10選


Pythonにはたくさんの標準または外部ライブラリがありますが、その豊富さゆえにどのライブラリを活用すればいいのかわかりづらい面もあると思います。今回は、その中から知っておくと便利なPythonのライブラリをご紹介します。


##標準ライブラリ編

###datetime

日付や時刻を扱うモジュールです。日付・時刻の取得、文字列⇔日付の変換、n日後、n日前の日付データを取得する、等便利で簡単に扱えるものが揃っています。例えば、日付と時間をまとめて扱えるdatetimeオブジェクトを使えば、現在の日付と時刻を簡単に取得できます。

```
from datetime import datetime
now = datetime.now()
print(now)
# 2016-04-13 02:29:50.464488
```

###shutil

高水準なファイル操作を提供するモジュールです。ファイルのコピーやディレクトリに対する操作を非常に簡単に書くことができます。

```
import shutil
shutil.copy("/src/src.txt", "/hoge/hoge.txt")
```

src.txtファイルをhoge.txtファイルににコピーします。

###collections

deque（appendやpopを高速に行う）、OrderedDict（順序付き辞書）、defaultdict（デフォルト値のある辞書）、Counter(カウンター付き辞書)等があります。効率的なアルゴリズムの実装や、プログラミングコンテスト等ではお世話になります。

```
from collections import Counter
count = Counter('hogehoge')
print count
# Counter({'g': 2, 'e': 2, 'h': 2, 'o': 2})
```

###pdb

ブレークポイントの設定やソース行レベルでのシングルステップ実行等の機能を提供するデバッガです。インタラクティブシェルでの実行や、.pyなどのスクリプトファイルとして実行することもできます。

###timeit

Pythonプログラムの実行時間を計測するモジュールです。コード１つ１つに対して時間を計ることができるため、細かいパフォーマンスを計れます。

```
import timeit
timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
```

##外部ライブラリ編

###tqdm

ループの進捗を確認したい時に、以下のような進捗バーを簡単に作成することができます。

```
41%||█████████            | 41/100 [00:04<00:05, 10.00it/s]
```

###py2exe

PythonスクリプトをWindows用の.exeへ変換するライブラリです。Mac版の「py2app」や、汎用的な「PyInstaller」も有名です。

###simplejson

JSONのエンコード・デコードライブラリです。標準ライブラリに「json」がありますが、それと同じように使用することができ、更に高速に動作するのが特徴です。

```
import simplejson
```

###requests

使いやすいHTTPライブラリです。標準ライブラリに「urllib」がありますが、使い勝手が少々悪いものでした。requestsは非常に使いやすく、最近の書籍でもよく薦められています。

```
import requests
r = requests.get('URL')
print r.text
```

###pep8

ソースコードのチェックツールです。PythonにはPEP8というスタイルガイドがあり、これが一般的なコーディング規約となります。pep8を使うと、自分のコードはどこが違反しているかを知らせてくれます。
EC-CUBE3 consoleでデーターベース接続エラー

環境
- EC-CUBE3
- MAMP
- mac

EC-CUBEではコンソール上で
$php app/console router:debug
と打つとフック一覧が見れるらしい。

ということで実行してみたところ

```
<!doctype html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>データーベース接続エラー</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" href="/html/template/default/img/common/favicon.ico">
    <link rel="stylesheet" href="/html/template/default/css/style.css?v=3.0.13">
    <link rel="stylesheet" href="/html/template/default/css/default.css?v=3.0.13"><!-- for original theme CSS -->
・・・・以下省略
</html>
```

こんなエラーが出てしまったのでDB接続周りを調べてて、ハッと思い出しました。
MAMP環境ではDB接続にsocketの設定がいる。

それを踏まえつつソースを辿っていくと、ありました！

```php:Driver.php
protected function constructPdoDsn(array $params)
{
    $dsn = 'mysql:';
    if (isset($params['host']) && $params['host'] != '') {
        $dsn .= 'host=' . $params['host'] . ';';
    }
    if (isset($params['port'])) {
        $dsn .= 'port=' . $params['port'] . ';';
    }
    if (isset($params['dbname'])) {
        $dsn .= 'dbname=' . $params['dbname'] . ';';
    }
    // unix_socket！こいつを使えばいいはず！
    if (isset($params['unix_socket'])) {
        $dsn .= 'unix_socket=' . $params['unix_socket'] . ';';
    }
    if (isset($params['charset'])) {
        $dsn .= 'charset=' . $params['charset'] . ';';
    }
    return $dsn;
}
```

上の関数を見つけたので、以下のようにdatabase.ymlに追記

```yaml:database.yml
database:
    driver: pdo_mysql
    host: localhost
    dbname: hogehoge
    port: 
    user: hogehoge
    password : hogehoge
    charset: utf8
    defaultTableOptions: { collate: utf8_general_ci }
    // これを追記
    unix_socket: /Applications/MAMP/tmp/mysql/mysql.sock
```

そのあとに
$php app/console router:debug
を試したら見事フック一覧が出力されました！
Windows7で「更新プログラムを確認しています」の状態で進まなくなった場合

# 事象
Windows Update中、「更新プログラムの確認」が終わらなくなる現象
# 主に発生すると思われる環境
```
OS    ：Windows7 SP1(x86/x64)
Memory：4GB以下
```
# 想定される原因
圧倒的なメモリ不足
# 問題解消できる可能性があるパッチ
- [KB949104](https://support.microsoft.com/ja-jp/help/949104/how-to-update-the-windows-update-agent-to-the-latest-version)
 Windows Update エージェントを最新バージョンに更新する方法
- [KB3050265(32bit)](https://www.microsoft.com/ja-jp/download/details.aspx?id=47352)
Windows 7 用更新プログラム
- [KB3050265(64bit)](https://www.microsoft.com/ja-jp/download/details.aspx?id=47351)
Windows 7 for x64-Based Systems 用更新プログラム
Windows の PHP cURL で使用する証明書

# 問題点
Windows 上の PHP で cURL を https で利用すると、`certificate verify failed`が発生する。

これは、通信の正当性を確認するための設定がなされていないため発生するので、適切な設定を行うことで、問題は解消される。

# 解決方法
php.ini に curl.cainfo のパスを追加することで解消される。
（`curl_setopt($ch,CURLOPT_CAINFO,$path)`で指定しても良い）

# 具体的には？
xampp で PHP を導入したのであれば、xampp 内に使用できる証明書があるので、php.ini で指定することで、問題は解消される。

``` php.ini
curl.cainfo = "C:\xampp\apache\bin\curl-ca-bundle.crt"
```

# なんで書いたか
ググったら色々解決方法が書いてあるんだけど、Git for Windows の 証明書使うとか、そもそも証明書チェックを回避するとかちょっと遠回りしているように思えたので。
Windows で PHP 使うんなら、xampp 入れてるんでしょ？って発想でちょっとメモ的に書いてみた。
CloudFrontでSSLv3プロトコルを許可する

ATS対応の一環でCloutFrontをSSLv3に対応させる作業があったためメモ。
結局あまりに駆け込みが多かったのか、「やっぱ延期で、いつまで延期するかは未定」ってオチになりましたが。

念のため大前提として書いておくのですが、
これは**一旦やり過ごすだけの対応**であり、将来的にはちゃんとアプリ側でSSLv3を使わずに済むよう対応する必要があります。

## 必要なもの

* 正規のSSL証明書（自己署名証明書、通称オレオレ証明書だとNG）
* 月あたり600USD
* 証明書をアップロードしたいAWSアカウントに対してawsコマンドが叩ける環境

## 証明書のアップロード

```
aws iam upload-server-certificate --server-certificate-name [識別名] --certificate-body [証明書ファイル] --private-key [秘密鍵ファイル] --certificate-chain [中間証明書ファイル] --path /cloudfront/
```

識別名：AWSのコンソールから見える証明書の名前
証明書ファイル：証明書のパス
秘密鍵ファイル：秘密鍵のパス、パスワード付きはNG
中間証明書ファイル：中間証明書のパス

※各ファイルのパスは先頭に「file://」を付け、コマンドを実行したディレクトリから見たパスで記述すること

## 証明書の適用

CloudFrontにて、以下のように設定を変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/150553/01dafedd-d7dd-0cc1-6c88-c6d1f5ad21d7.png)

ちなみに、ここで正規の証明書ではなく自己署名証明書を上げていた場合、CloudFrontでこんなエラーが出て設定を変更することができません。

```
com.amazonaws.services.cloudfront.model.InvalidViewerCertificateException: The specified SSL certificate doesn't exist, isn't valid, or doesn't include a valid certificate chain. (Service: AmazonCloudFront; Status Code: 400; Error Code: InvalidViewerCertificate; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
```

要約すると「無効な証明書だから使わせねーよ」ってトコでしょうか。
そりゃそうです。