OmniAICreator/Qiita-1.07M huggingface dataset:
PTYってなんぞ?


[Serverspec本読書メモ 3.5章〜3.12章まで](http://qiita.com/kasei-san/items/b99ad33738368a5340cd)を書いた時に、PTYを良くわかっていなかったので別途メモ

# わかっていること

- serverspecは sudo パスワードを入力する場合PTYを要求する
- sudo パスワードを入力しない場合でも
    - `/etc/sudoers` に　`Defaults requiretty` が設定されている場合はPTYが必要

# PTY : 擬似端末（ぎじたんまつ、pseudo terminal）

> 仮想コンソール、端末装置、シリアルポートハードウェアなどを使用しないテキスト端末のインターフェイスを提供する。これらのハードウェアの代わりに、擬似端末セッションの役割をソフトウェア（プロセス）が代用する。例えば、SSHなどでログインするとこの端末に接続される。

[擬似端末 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E7%AB%AF%E6%9C%AB)

# sudo パスワードを入力する場合、何故 PTY が必要?

- 対話入力には、PTYが必要
    - serverspec等で非PTYの場合は、一方的にコマンドを送ってその結果を受け取るだけっぽい

# `Defaults requiretty` が設定されている場合に、何故 PTYが必要?

- CentOSでは標準で設定されているらしい
- セキュリティ上の問題らしい
- 例えばwebサーバのセキュリティホールを突かれて、任意のスクリプトを実行された時に、sudoできてしまうのを回避するため

# 参考

- [バックアップcronでsudoを使う | アロハ技術者ブログ](http://tech-blog.aloha-inc.jp/tech/22)
    - 特定のスクリプトだけ、sudoを許可するとかもできる
AWSのGPUインスタンスにTensorFlowとJupyterを入れる


AWSのEC2のGPUインスタンスにTensorFlowを構築して、ついでにJupyterも使えるようにするまでの手順。
ローカルでJupyter触りながらGPUが使えるとすごく便利です。


#環境

- インスタンス: g2.2xlarge
- OS: Ubuntu Server 14.04 LTS

#手順

##NVIDIA Driver のインストール
GPUインスタンスにssh接続する。

apt-getのアップデートとアップグレード
（重要。この手順飛ばして、ハマりました）


```
$ sudo apt-get update
$ sudo apt-get -y upgrade
```

gcc等のパッケージを入れる

```
$ sudo apt-get -y install build-essential linux-image-extra-virtual linux-headers-generic linux-source
```

```
$ sudo update-initramfs -u
```

ドライバの競合を避けるためにNouveauをブラックリストに追加

```
$ cat <<EOF | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off alias lbm-nouveau off
EOF
```

```
$ echo options nouveau modeset=0 | sudo tee -a
```

一旦、再起動

```
$ sudo reboot
```

再起動すると、ssh接続が切れるので、もう一度ssh接続する。


その後、NVIDIA Driverをダウンロード

```
$ wget http://us.download.nvidia.com/XFree86/Linux-x86_64/361.42/NVIDIA-Linux-x86_64-361.42.run
```

権限付与

```
$ chmod +x NVIDIA-Linux-x86_64-361.42.run
```

NVIDIA Driverのインストール実行

```
$ sudo ./NVIDIA-Linux-x86_64-361.42.run
```


#Dockerのインストール

```
$ curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | sudo apt-key add --import

$ sudo apt-get update && sudo apt-get install apt-transport-https

$ sudo apt-get install -y linux-image-extra-virtual

$ echo "deb https://packages.docker.com/1.10/apt/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list

$ sudo apt-get update && sudo apt-get install docker-engine

```


Dockerをインストールできたか確認

```
$ sudo docker info
```

##NVIDIA Dockerをインストール

```
$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0-rc/nvidia-docker_1.0.0.rc-1_amd64.deb
```

```
$ sudo dpkg -i /tmp/nvidia-docker_1.0.0.rc-1_amd64.deb && rm /tmp/nvidia-docker*.deb
```

NVIDIA Dockerの簡単な動作確認をおこなう

```
$ sudo nvidia-docker run --rm nvidia/cuda nvidia-smi
```

##TensorFlow用のDockerインスタンスを立てる

```
$ sudo nvidia-docker run -it -p 8888:8888 -p 6006:6006 tensorflow/tensorflow:latest-gpu /bin/bash
```

- Port 8888：Jupyter notebook用
- Port 6006：Tensor board用

ここからはDocker内

```
# export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
# pushd /usr/lib/x86_64-linux-gnu
# ln -s libcudnn.so.4 libcudnn.so
# popd
# /run_jupyter.sh
```

`/run_jupyter.sh`実行した後に、ip:8888にブラウザから接続してJupyterの画面が表示されれば成功！

##Docker内で各種pythonライブラリなどを簡単にインストールするには

Jupyter上の「New▼」→「Terminal」からインストールできます。
![スクリーンショット 2016-06-13 23.13.59.png](https://qiita-image-store.s3.amazonaws.com/0/128193/4043ed4a-7907-1014-7261-09a0ae7aad24.png)

ここでpandasやsklearnのインストール
![スクリーンショット 2016-06-13 23.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/128193/23624604-35cd-bbd1-8374-57353d481d5a.png)


```
# pip install pandas
# pip install sklearn
```

#参考サイト

NVIDIA Driverインストール

- http://www.muo.jp/2016/05/nvidia-docker-tensorflow.html?spref=fb
- http://tleyden.github.io/blog/2014/10/25/cuda-6-dot-5-on-aws-gpu-instance-running-ubuntu-14-dot-04/

Dockerのインストール

- https://docs.docker.com/docker-trusted-registry/cs-engine/install/#install-on-ubuntu-14-04-lts
途中で気づいた超無駄なプログラム


```js
/*
 * 線と線の重なる長さを返す
 */
getLength: function (l1, r1, l2, r2) {
	var type1 = null;
	// 線2は線1より右側から始まる
	if (l1 < l2) {
		// 線は重なっている
		if (l2 < r1) {
			type1 = 'center';
		}
		// 線は重なってない
		else {
			type1 = 'right';
		}
	}
	// 線2は線1より左側から始まる
	else {
		type1 = 'left';
	}

	var type2 = null;
	// 線2の終わりは線1の開始よりも右
	// 線は重なっている
	if (l1 < r2) {
		// 線2の終わりは、線1の終わりよりも右
		if (r1 < r2) {
			type2 = 'right';
		}
		// 線2の終わりは、線1の終わりよりも左
		else {
			type2 = 'center'
		}
	}
	// 線は重なってない
	else {
		type2 = 'left'
	}

	// 結果
	if (type1 === 'right') { return 0; }
	if (type2 === 'left')  { return 0; }
	if (type1 === 'center') {
		// 線2は全て含まれる
		if (type2 === 'center') { return r2 - l2; }
		// 線2は一部含まれる
		if (type2 === 'right') { return r1 - l2; }
	}
	if (type1 === 'left') {
		// 線2は線1を全て含む(線1の長さが重なっている)
		if (type2 === 'right') { return r1 - l1; }
		// 線2は一部含まれる
		if (type2 === 'center') { return r2 - l1; }
	}
},
```


何をやっているのかというと、2つの線が重なってる量を取得する関数を作ってるだけ。いかに長い無駄なプログラムをかけるか競っていた訳ではありません。


```js
/*
 * 線と線の重なる長さを返す
 */
getLength: function (l1, r1, l2, r2) {
	return Math.max(Math.min(r1, r2) - Math.max(l1, l2), 0);
},
```

で書ける。恥ずかしい。途中で気づいた。
無駄っぷりが半端ないので、残しておく。
MySQLの自動アップデートを停止する

# MySQLの自動アップデートを停止する

毎日0:00に立ち上がるコンソール画面を止める方法です。

１．MySQLInstallerを起動。

場所

~~~
C:\Program Files (x86)\MySQL\MySQL Installer for Windows\MySQLInstaller.exe
~~~

２．Optionから"Automatic Catalog Update"のチェックを外すか、時間を変更する。

以上
何の才能もない若手が年収500万もらうためにやること


>せっかく初コメントもらったから加筆(6/19)
>ストック数が増えたので加筆(6/22)
>勧誘行為は駄目らしいので、自社のリンク消しました。(6/22)

# 本記事のターゲット
~28才くらいの若手エンジニア
才能なし、技術なし、学歴なしな人

# 力をつけよう

IT業界にいる人は、仕事をする中で力をつければよい。
吸収しながら仕事するんだ、一度やったことは忘れないのが大事。
それが、どんな些細なことでも「+1」にしかならなくても、確実に力はついている。

手っ取り早く力つけたいなら、火事場プロジェクトに参加するんだ。
問題解決のために力をつけざるを得ないから、勝手に成長してる。
ただ、精神や体を病むことがあるから、あまりおすすめはしない。

IT業界にいない人は、自主学習で力をつけるしかないんだけど、それって難しい。
基礎は学べるけど、結局仕事では役に立たないことも多い。
だったら、適当な会社に入って、仕事で使える技術を無料で学んだ方がいいと思う。
お金ももらえるし。
入った会社が気に食わなかったら転職しちゃえばいいんだよ。
その頃には力もついてるし、今どこも若手を欲しがってるから、引く手数多だよ。

# 信頼を得よう

仕事をちゃんとこなす、受け答えをちゃんとする、それだけで良い。
これが出来ない人いっぱいいるからね、この業界。

もっと信頼を得たいときには、周りが何を欲しているかを考えて行動してみよう。
例えば、ログ見づらいなーって言ってる人が近くにいたら、ログの整形ツールを作ってあげるとかね。
絶対喜ばれるし、こいつ出来るなって絶対思われる。
いいんだよ、コード汚くても、動けば。内部用だし。

とにかく周りの信頼を得られれば、会社の中で優位に立てるよ。
評価するのは自分じゃなくて周りだからね。

# 対等に仕事しよう

若手に有利なことが一つある。
それは、何か失敗しても、経験の少なさや若さを理由にゆるしてもらえる（ことが多い）。

このアドバンテージを捨てる。

若手感を出さないことが大事。
どんな人に対しても、対等な関係で仕事をする。
失敗したら自分の責任だし、解決するのも自分だ。
協力を仰いでもいいが、あくまで主は自分だ。
そしたら力もつくし、仕事も任せてもらえる。

# 手っ取り早い方法は？
年功序列が無くて、技術を大事にしてくれる会社に転職する。
そんな会社簡単に探せないよーって人は、うちの会社でも若手募集してます。

普通の中小企業だけど、中の人から言わせると、
仕事しやすいし、デスマーチないし、若手でも500万達成できてる。
自分の目標となる人にもきっと会えるよ。

興味がある人は、気軽にメールください。
面接という形でなくてもいいので、会って、ざっくばらんにお話しましょう。


# まとめ
最後は少し勧誘になってしまったけど、最後に言いたいのは
**才能なし、技術なし、学歴なし**でも、**年収500万**は達成できます！
Serverspec本読書メモ 3.5章〜3.12章まで


![](https://images-na.ssl-images-amazon.com/images/I/51P6qVOPALL._SX352_BO1,204,203,200_.jpg)
オライリーの[Serverspec本](https://www.amazon.co.jp/Serverspec-%E5%AE%AE%E4%B8%8B-%E5%89%9B%E8%BC%94/dp/4873117097)のどくしょかんそうぶんです

# 3.5 動作のカスタマイズ

- `Specinfra.configration` を利用して、serverspecの動作をカスタマイズできる
- `set` メソッドは、`Specinfra.configration` のシンタックスシュガー

## 渡せるコマンド

使えるコマンドを解説した公式のドキュメントが見つからない...

- **ssh_options**: `Net::SSH.start` に渡すオプション
- **pre_command**: テスト実行前に引数のコマンドを実行
- **env**: 環境変数。hash で複数渡せる

    ````.rb
set :env, :LANG => 'C', :LC_MESSAGES => 'C'
    ```
- **path**: PATH
- **shell**:テストで使用するシェル
- **sudo_path**: sudo する時のpath
- **disable_sudo**: テスト実行時に sudo しない
- **request_pty**: PTYを常に要求
    - **標準エラー出力と標準出力が一緒になるので注意**
    - Execバックエンドの場合も同様
        - 1.8.7の互換性のため
- **sudo_options**: sudoする時のオプション

    ```.rb
set :sudo_options, '-u foo'
```

# 3.6 一時的な動作の変更

## **let**: 一時的な`set`

```.rb
describe command('whoami') do
  let(:disable_sudo){ true }
  its(:stdout){ should match /foo/ }
end
```

## Rspec の around を使う

```spec_helper.rb
Rspec.configure do |c|
  c.around :each, sudo: false do |example|
    set :disable_sudo, true
    example.run
    set :disable_sudo, false
  end
end
```

`sudo: false` のあるExampleでのみ `disable_sudo` が有効になる

```.rb
describe command('whoami'), sudo: false do
  let(:disable_sudo){ true }
  its(:stdout){ should match /foo/ }
end
```

# 3.7 specファイルを複数のホストで共有

- Rakefileで使用するspecを制御できるのでやりようは自由
- こんなふうなやり方もあるよという提案

- ロール毎にまとめる
    - 共通のテスト、dbサーバ、appサーバ用のテストをそれぞれ用意
    - Rake でサーバ名毎に、どのテストを実行するかを決める
- モジュール毎にまとめる
    - chef なら cookbook単位
    - 各 cookbookにspecディレクトリを用意
    - それを読む
    - サーパ構成管理ツールを乗り換える時に大変
    - attributeとかを多用しているとできなさそう
- この辺はプロジェクトに応じていろいろやりようがある気がする

# 3.8 ホスト固有情報の利用

- **setproperty**: ハッシュを引数として受け取る

    ```.rb
setproperty { key1: 'value1', key2: 'value2' }
```

- **property**: `setproperty` にて設定した値を受け取る


    ```.rb
property[:key1] # 'value1'
```

## サーバ毎の固有の設定を json 書く

spec_helper.rb で読み込ませる技

```spec_helper.rb
set_property JSON.perse(File.read('properties.json'))[ENV['TARGET_HOST']]
```

3.8 もそうだけれども、やりようは色々あるから、自由にやってね! というスタンスを感じる

# 3.9 任意コマンドの実行

テスト実行前に任意のコマンドを実行したい場合

- `Specinfra::Runner` に色々なコマンド実行用メソッドがある
    - Q: 使えるメソッドの一覧どこ
- `Specinfra::Runner.run_command` で任意のコマンドを実行
- `Specinfra::CommandResult` オブジェクトが返る
    - `success?`
    - `failure?`
    - `stdout`
    - `stderr`
    - `exit_status`


# 3.12 テストコード実装の指針

- 新規システム
    - 最初は書かずに、ある程度固まった所で書く
    - 寿命が短いシステムはわざわざテストしなくても良い
    - リファクタリングのためにテストは必要
- 既存システム
    - テストがない場合、今後も長く使うのであれば書く
    - システムは変わるもの。変えるときにテストがあると安心
- 構成管理ツールがある場合
    - そのモジュールやcookbookが何をするものかを明示するため
    - **構成管理ツールは信用する。インフラコードを書く人間を信用しない**
        - ツールの設定をする人が間違えたり、勝手に(別の所で)バージョンが変わっていないことを保証する
- どこまでテストするか?
    - サーバのとしての役割が必須な所まで
    - 設定ファイルの詳細まで追うのは苦労の割に実入りが少ない
    - **設定そのものよりも、設定によってもたらされる振る舞いをテストすべき**
        - それは serverspec 外の仕事 → 例: Infratester
    - セキュリティ上重要な部分
- **インフラコードの変更、パッケージ/OSのアップデートで想定しない状態になるかどうかを確認する**
    - そのために必要なことは何か?
AWS CodeCommitをgitレポジトリとしたセットアップ自動化

# 背景
いろいろな環境でセットアップスクリプトを書いていると、
同じスクリプトを様々な環境から参照したいケースがある。

本質的に必要なのは『機能』であって、それがどこで動くかは重要じゃないでしょ、という場合。
( もちろん『どこで動くか』が重要な場合もありますが )

例えばクラウドで自分検証用にちょっとサーバ立てた。で、セットアップスクリプト書いた、
そういえばこれは自宅サーバでも移動中のノートPCでも、コンテナでも割と使いたいものだったりする。

セットアップスクリプトを置く場所は統一したい。
理想的にはGithubでレシピを公開なのかな、というとちょっとプライベートな部分もあって悩ましい。

# 自前でプライベートなgitレポジトリを立てるか?という考えも悩ましい。

* ストレージの冗長化は?
* git のサーバを2台立ててロードバランスすれば動きそうか?
* セキュリティはどのように守られるべきか?
* アクセス制限はどのように行うのか?

といった悩みが。 お仕事用のサーバ群では冗長化に対してかなりの
コストを支払っているのだけれど、2016年の今だとgitのサービスも
いろいろあるし、サービス使った方がセキュリティアップデートのコストはサービス提供者もちだし、その方が合理的だよな、とおもってCodeCommitを使ってみました。

# 下記のような構成をつくる

## EC2で自動セットアップ
![CodeCommit_EC2.png](https://qiita-image-store.s3.amazonaws.com/0/124921/dea0db43-bf4a-171e-c416-412c21bbd665.png)

## dockerで自動セットアップ
![CodeCommit_docker.png](https://qiita-image-store.s3.amazonaws.com/0/124921/7faa1f1b-3eaf-6698-8e5e-d00d9138dcf6.png)
dockerでの利用は、もうちょっとシンプルにならないかな、という悩みがある
packerやDockerfileで都度イメージ作成だろうか。
( イメージによる管理も明確なメリットがある、インスタンスが起動してから使えるまでの時間が短い。が、ブロックデバイスから疎結合になりたい。わざわざイメージ作らなくても、セットアップスクリプトをpullして実行すればセットアップ可能、みたいな環境もありかな、とも )

## KVM( libvirtd )でも
まだできてないのですが、自宅サーバも同様な感じでセットアップしたい。

![CodeCommit_libvirtd.png](https://qiita-image-store.s3.amazonaws.com/0/124921/66160ca3-e8c7-badf-f143-63ca39e090eb.png)

これができれば、自宅の物理サーバも同様な方法( PXE + kickstart + CodeCommit )でいけると思われる。

注1
  ここではchef-clientの実行間隔を60秒にし、
  chef的に「インストールされてなければするし」「プロセスが立ち上がってなければ立ち上げるし」
  というアプローチでプロセスが実行されていくようにしていますが
  chef-clientの処理は、設定のボリュームが増えれば増えるほど長くなっていくので、
  monitなり監視プロセスから起動されるアプローチの方が素早い気もします。が、monit使えていません。

# 作業の流れ
### EC2で自動セットアップ
#####[1. AWSアカウント作る](http://qiita.com/tin-machine/items/3db108ceffa24acc76fd)

#####[2. VPCつくる](http://qiita.com/tin-machine/items/2c376b3b9d62aa7cd257)

#####[3. CodeCommitを始める](http://qiita.com/tin-machine/items/184762adc732256b276b)

#####[4. ( 初回起動時に実行される仕組みの )cloud-initの処理を書き始める](http://qiita.com/tin-machine/items/8d4c60d32752d5042192)

#####[5. cloud-initのスクリプトで git cloneする](http://qiita.com/tin-machine/items/d38b7d78ce1f809e135f)

#####[6. EC2インスタンス自身が自分のRoleを確認して自分でセットアップされるようにする](http://qiita.com/tin-machine/items/d8495b3783bbb5cde93d)

### dockerで自動セットアップ( 予定 )
ここを参考にしています http://qiita.com/kukita/items/932822b2d029e4b8a0c5
( 上記のURLの仕組みは凄いと思います。chefサーバの冗長化を考え始めると、
結構工数かかりそうなんですが、冗長化のコストを外に出せる )
* 作業用PCにchef-zeroで chef server
* セットアップスクリプトはCodeCommitから定期的に git pull
* chef serverを参照するようなdockerイメージ作成
* 作業用PCからchef serverにコンテナに与えるRoleを設定
* chef-clientが自分のRoleの処理を行う

### 自宅サーバでも( 予定 )
* PXE + kickstart での自動セットアップ
* kickstartの設定で自前のスクリプトを流す
* 自前のスクリプトの処理内で、セットアップ自動化を行う
3分で理解するAmazon API GatewayとAWS Lambda

# Amazon API Gateway
APIの作成、アプリケーションの通信の窓口。
いわゆるエンドポイントを作成する。
AWSのマネジメントコンソールから作成する。実処理は書かない。
認証機能も搭載、環境を分けてデプロイ、スケーリングしてくれる。

# AWS Lambda
コードの実行をおこなうサービス。
Lambda関数と呼ばれる関数を作成して、処理を書く。
AWSのマネジメントコンソールで直接書くこともできるが、基本的にはコードをアップロードする。
処理さえ書けばよくて、サーバ管理、スケーリング、ログ記録[^1]もやってくれる。

# 上の2つを組み合わせると何ができるの？
APIが5分で作れる。
フレームワーク探してー、APIアプリケーション探してー、EC2にデプロイしてー、
スケーリング考えてーとか一切いらない。
アプリ開発者で、サーバ側全然わかんないけどAPIとか作りたいんだよ！っていう人に向いている。

# お高いんでしょ？
安心してください。従量課金です。

# なんでみんな使わないの？？
俺が聞きたい。
けど、以下のような理由なんじゃないかな。

1. 比較的新しいサービスで、まだ導入実績が少ない
2. 大規模アクセスがあり、性能にシビアなシステムには向いていない。[^2]

**2017/03/14 実際に使用して気付いたことを加筆**
3. API Gatewayのタイムアウトは30秒固定で変更できない。よって、処理に時間のかかるLambda(バッチ)をキックするとかには向いていない。
そういうLambdaは、AWS CLIから呼び出す。（か、後にAWS Batch から呼べるようになるはず）
4. AWS Lambdaを動作させられる最大時間は5分。5分過ぎると処理が中断する。これを考慮して作成するのが中々大変。

[^1]: ログは、CloudWatchLogsに出力される。コード内で明示的にログ出力することも可能。

[^2]: Lambdaは自動でスケーリングしてくれるけど、最初からスケーリングしておくことができない。あくまでアクセスが多量になってきたら、スケーリングされるので、そのときにレスポンスが落ちる。
PHPとPeridotとテスト駆動開発

# PHPでテスト駆動開発するサンプル

## サンプルはGitにあります
[daijinload/php-tdd-sample](https://github.com/daijinload/php-tdd-sample)
↑のREADMEを見れば実行手順がわかります。
mocha + powerassert感ありますね。
（エラー内容は不親切、極まりないですが。。。）

## 注意点
テストのファイル名が、`hoge.spec.php`という形でないと、
複数ファイルまとめて実行しようとしたときに一個しか実行しないです。
単体実行だと、どんな名前でも大丈夫なんですけどね。
（変更方法など、知っている方、教えてくださいm(_ _)m）

## 入れているPeridotプラグイン
https://github.com/peridot-php
プラグインたくさんあります。

[ウォッチプラグイン](https://github.com/peridot-php/peridot-watcher-plugin)しか入れてないですが、
[カバレッジプラグイン](https://github.com/peridot-php/peridot-code-coverage-reporters)もあったりします。
（xdebugとか必要になるので、一旦見送りました。）

便利なのがあれば、追加していこうと思います。
raspberry pi (=raspi)、dhcpでBonjour（ボンジュール）

参考元に感謝ー＞
http://qiita.com/hnw/items/e0d0a19a64d8d079afb5
http://www.myu.ac.jp/~xkozima/lab/raspTutorial1.html

raspiをあっちこっちに移動させると固定IPでは面倒になる。なのでやっぱdhcpがいい。となると、raspiのアドレスがどこなのかわかんなくなる。そこで、
>sudo apt-get install avahi-daemon

これで raspiのホスト名でアクセス可能。ホスト名は下記で定義されてます。変更したいときは下記をいじりましょう。
>/etc/hostname
>/etc/hosts

ぼくは、raspiって名前にしてます。raspiへアクセスするときは .local を付けます。
>ssh pi@raspi.local

これでアクセスが可能。vncやsmbも同じくいけます。macは簡単に行けました。windowsはどうなんでしょう？
raspberry pi で radiko

参考元に感謝。ー＞
http://qiita.com/JHiyama/items/6319a48c8cedded9fbf6
http://blog.muchuu.net/post/110867859055/raspberry-pi%E3%81%A7radiko%E3%81%AE%E5%86%8D%E7%94%9F%E9%8C%B2%E9%9F%B3


2016年6月時点では、ffmpegのかわりにavconv（libav-tools）。

>sudo apt-get install rtmpdump  mplayer swftools wget ibxml2-utils
>sudo apt-get install libav-tools
>wget https://gist.githubusercontent.com/soramugi/836952a6b09e540eb6a3/raw/81182ff0a1f5003077a479e0e947b66fb5d3b99e/radiko.sh
>chmod +x radiko.sh

radiko.shはpathの通っているところがいいので piユーザーの~/bin に置きました。
pathの設定は
>nano ./bashrc
>>export PATH=$PATH:~/bin

>source ./bashrc



radiko.sh内のffmpegをavconvに書き換えればOK。あとはそのままで、radiko.shが動きました。radiko.shの使い方は、

>単純にラジオを聞く
>>radiko.sh -p -t 再生時間（分） CH
>>radiko.sh -p -t 120 TBS

>録音する (m4aファイルを出力する)
>>radiko.sh -d 出力先 -f ファイル名 -t 録音時間（分）  CH
>>radiko.sh -d radiko -f TBS_20160618 -t 120 TBS

raspberryのヘッドフォン端子から聞いてみたらノイズがひどいのね。。。HDMIをつけてるからなかな？SAMBA経由でmacから聞くと安定してたのでファイル自体は問題ありません。

raspberry pi2を購入して１年くらいたったのかな。やっとやりたかったことができました。
O'Reilly Japanで買った電子書籍をkoboで快適に読む方法

O'Reilly Japan で電子書籍買ったのはいいけれど、koboに入れたら文字化けした。
その対処方法まとめ

# なぜ文字化けするのか
koboは、epub形式のファイルは洋書として判断されるため、デフォルトのフォントが
英字用になってしまう。
O'Reilly Japan は、日本語書籍なので文字化ける。

# どうすれば文字化けしないか

1. epub形式で転送して、フォントを日本語に変更する
1. 電子書籍の拡張子を、「epub」→「kepub.epub」に変更する。
1. Convertソフト(無料)を使う[^1]

どの場合でも文字化けはしなくなったが、結果的によかったのは「3」だった。

1は、処理がすごく重くなった。
2は、しおり機能、ハイライト機能が使えなくなった。

Enjoy!


[^1]: http://www.epubor.com/how-to-convert-epub-to-kepub-calibre.html
Virtualbox内のubuntu14.04にNode.jsをインストール

環境についてはこちらと同じ
http://qiita.com/yuki_saito_/items/36e80def1a4b0b0d4c71

#1.Node.js
簡単に言ってしまうと、サーバサイドjavascriptの実行環境。結構前から流行ってる。
クライアントサイドだけでなく今やjavascriptは大活躍しているようだ。

本家サイトはこちら
http://nodejs.org/download/

#2.早速インストール
今回はmakeを使ってインストールしてみようと思う

##2.1 ソースの取得と回答
    sudo wget https://nodejs.org/dist/v6.2.2/node-v6.2.2.tar.gz
    sudo tar -xzvf node-v6.2.2.tar.gz

##2.2 make(ビルド)
    cd node-v6.2.2/
    sudo ./configure --prefix=/usr/local
    sudo make
    sudo make install

--prefixでインストールするディレクトリを指定

##2.3 パスを通す
    vi ~/.profile 
    PATH="$PATH:/usr/local/bin"
    source ~/.profile

##2.4 バージョン確認
    node -v
    v6.2.2と出力される

今後はnpmとかいじったり、gulpあたりをいじってみようと思う
VisualStudioとSpecFlowでSeleniumとPhantomJSでUIテストの開発効率をちょい足しで激上げする方法


ニッチすぎるテーマですが、ニッチだからこそ情報が少なく、欲している人はいるのではないかと思ったのでのせときます。

と言ってもやることはシンプルでたった１つです。

だけど自分がふと思いついて試しに組み込んでみたら凄く便利でした。

# テストが失敗したらその時の画面を見れば原因特定が早い

しかし、PhantomJSではヘッドレスなので画面は見れません。

ChromeDriverを使えば実行中は見れますが、操作が奪われるし、奪い返すと失敗します。

最近だとChromeのInspectorを立ち上げると失敗します。


## 画面をキャプチャー

Seleniumを使うと実行中の状態をキャプチャーできてpng画像としてエクスポートできます。

~~~C#
var ss = ((ITakesScreenshot)WebDriver).GetScreenshot();
ss.SaveAsFile(fileName, ImageFormat.Png);
~~~

このキャプチャーを利用します。

## テストエクスプローラにはテスト結果が表示されます

この時点で何をどうするか分かったと思います。

MSTestなどでテストするとテストエクスプローラにテスト結果が出ます。

失敗したテストを選択すると、アサーションなどに出力されたエラーが表示されます。

このエラーを表示する内容に、先ほどの画面キャプチャーを組み込むことで、

**テストが失敗したらエラーメッセージから失敗時の画面のキャプチャー画像を見ることができます。**

# コード
コードが見やすいように不要コードは取り除きました。

~~~Definitions.cs
public string CaptureWebPageToFile(string filePath)
{
  // ページイメージをファイルに保存する
  var now = DateTime.Now;
  Screenshot shot = null;
  do
  {
    shot = ((ITakesScreenshot )WebDriver).GetScreenshot();
    if(DateTime.Now - now >= TimeSpan.FromSeconds(10))
    {
      throw new SpecFlowException( "キャプチャに10秒以上かかりました。" );
    }
  }while(shot.AsByteArray.Length == 0 );

  shot.SaveAsFile(filePath, ImageFormat.Png);
  return filePath;
}

private void AreNotEqual<L, R>(L lhs, R rhs, string msg)
{
  try
  {
    Assert.AreNotEqual(lhs, rhs);
  }
  catch (AssertFailedException e)
  {
    Assert.AreNotEqual(lhs, rhs, CreateErrorMessage(e, msg));
  }
}
private void Fail( string msg)
{
  try
  {
    Assert.Fail(msg);
  }
  catch (AssertFailedException e)
  {
    Assert.Fail(CreateErrorMessage(e, msg));
  }
}
private string CreateErrorMessage( AssertFailedException e, string msg)
{
  return string.Format("\n{0} \nURL:{1} \nSS:{2}\n" , msg ?? "" , WebDriver.Url, TestUtil.ConvertUrlFromPath(CaptureWebPageToFile()));
}
~~~

~~~TestUtil.cs
public static string ConvertUrlFromPath(string path)
{
  var absPath = Path.GetFullPath(path);
  return "file:///" + absPath;
}
~~~

## コード簡単に説明

- CaptureWebPageToFileがスクショを作成するメソッドです。
- AreNotEqual, Failメソッドが失敗時にスクショのファイルパスを自動で組み込むメソッド群です。
 - 必要に応じて増やします。

# まとめ

たったこれだけで、失敗したらエラーメッセージだけでなくキャプチャのパスも表示されます。
パスはクリックするだけで画像ビューワーが立ち上がります。
何気なく思いついた方法でしたが、これを組み込んでから失敗時の原因特定がだいぶ楽になりました。

以上になります。
Serverspecでnginxのバージョンをテストする

```nginx -v```での出力はstderrを指定すれば、テストが通るというメモを記す。

```nginx -v```で、nginxのバージョンを確認する。

出力結果：
```nginx version: nginx/1.4.6 (Ubuntu)```

"stdout"では失敗する。

```nginx_spec.rb
# Check installed package version
describe command('nginx -v') do
  its(:exit_status) { should eq 0 }
  its(:stdout) { should match /1.4.6/ }
end
```

テスト結果：
>
  1) Command "nginx -v" stdout should match /1.4.6/
     On host `melody'
     Failure/Error: its(:stdout) { should match /1.4.6/ }
       expected "" to match /1.4.6/

"stderr"にすると成功する。

```nginx_spec.rb
# Check installed package version
describe command('nginx -v') do
  its(:exit_status) { should eq 0 }
  its(:stderr) { should match /1.4.6/ }
end
```

テスト結果：
>
Command "nginx -v"
  exit_status
    should eq 0
  stderr
    should match /1.4.6/
Finished in * seconds (files took * seconds to load)
2 examples, 0 failures

どうやらnginxの仕様らしい。
[Why write nginx version on stderr?](https://trac.nginx.org/nginx/ticket/592)
gccやjavaも同じ類のようである。
AKB48総選挙のデータをブラウザの機能だけでCSVに変換

AKB総選挙も終わりました。そして気になるのが得票数。
http://sousenkyo.akb48.co.jp/result.php

せっかくなので分析可能な状態にしましょう。

## javascriptソース

```js
console.log(Array.from(
document.querySelectorAll(".member-list > li"),  
e => {return e.querySelector(".result_name").innerText + "," + e.querySelector(".result_count").innerText.replace(/[^0-9]/g, ''); }
).join("\n"));
```

これを、
http://sousenkyo.akb48.co.jp/result.php
を開いている、Chromeのコンソールに貼り付けてエンターを押すと、CSVでダンプされます。

こんな感じ。

```
指原 莉乃,243011
渡辺 麻友,175613
松井 珠理奈,112341
山本 彩,110411
柏木 由紀,92110
宮脇 咲良,78279
須田 亜香里,69159
島崎 遥香,68126
兒玉 遥,60591
武藤 十夢,58624
横山 由依,58610
北原 里英,50190
向井地 美音,47094
岡田 奈々,43318
...
```

あとは、これをエクセルに貼り付けて、グラフにすれば、選挙の規模感が分かる。

## グラフ

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/53489/8640855d-9786-8ebe-f466-2116cfd80315.png)

http://qiita.com/yugo-yamamoto/items/b87470f118ac62dc6a8d
で、書いてる、最期の方法をひな形に、querySelectoAllとArray.Fromを使って、繰り返し処理にしています。
uGuiでText内の文字色・サイズを文字単位で変更する

１．Textスクリプトをつける
２．RichTextのチェックボックスをつける。
３．HTMLのcolorタグ・sizeタグを使用（タグはあんまりわかってないけど使えます）

　黒：#000000
　赤：#ff0000

■abcは赤、deは黒、fgは緑

    public Text ButtonText;

    public void OnTextChange()
    {
        ButtonText.text = "<size=30><color=#ff0000>abc</color>de<color=#00ff00>fg</color></size>";
    }
paypalのsha256対応

paypalのsha256移行、まぁ大丈夫じゃろと余裕ぶっこいてたら対応必要でした。
sandboxは移行済みで、2016/9/30に本番環境も完全移行らしいですね。

## 確認

sandboxにcurlでリクエスト投げて確認。

https://github.com/paypal/TLS-update#php

```bash
$ php -r '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://tlstest.paypal.com/"); var_dump(curl_exec($ch));'
```

false返ってきて焦ります。
コマンドラインだからかなと思って、sandboxアカウントでテストしてもコケるので普通に焦ります。

## 対応

```bash
$ php -i | grep "SSL Version"
SSL Version => NSS/3.21 Basic ECC
```

NSSなので、

```bash
$ sudo yum update nss
```

して、apahce+mod_phpなので

```bash
$ sudo service httpd reload
```

すると通るようになりました。さくらvpsやawsはこれで通るようになりました。
sandboxアカウントでも試しましたが大丈夫になってました。
Serverspec本読書メモ  1章〜3.4章まで


![](https://images-na.ssl-images-amazon.com/images/I/51P6qVOPALL._SX352_BO1,204,203,200_.jpg)
オライリーの[Serverspec本](https://www.amazon.co.jp/Serverspec-%E5%AE%AE%E4%B8%8B-%E5%89%9B%E8%BC%94/dp/4873117097)のどくしょかんそうぶんです

# 1章 Serverspecの紹介

- Serverspec : サーバの状態をRspec記法のコードにより自動的にテストするためのツール 
- 利用目的
    - **TDDによるインフラコード開発**
    - サーバ構築後の確認作業の自動化
    - サーバ監視に使う人も居る → そんな人もいるのか
    - **サーバのあるべき状態の抽象化**
- 本質 : **テスト駆動によりインフラコードの開発やリファクタリングを促進する**
- 必要性
    - TDDで、infrastructure as code を進めるため
    - サーバの状態をServerspecが保証することで、リファクタリングがやりやすくなる
- 開発の哲学
    - 導入の敷居を下げる
        - Ruby1.8.7をサポート → RHEL6系でデフォルトのRubyであるため
    - 特定のサーバ管理ツールに依存しない
        - 構成管理ツールのライフサイクルより、テストコードのライフサイクルの方が長いであろうという哲学
    - 1つのことを上手くやる
        - サーバのテストをやるだけ → 複雑で多機能なツールは使われづらい
        - 並列実行はRakeに任せている
- 究極の目標
    - システムの継続的改善に寄与すること

# 2章 はじめてのServerspec

- `serverspec-init` はサンプルコードを生成するだけで、実践向きではない
    - あくまでサンプル
- Rakefile
    - テストの実行に必須ではない
    - ただし、Serverspecは1つのプロセスで複数のホストを扱うことを考慮していない
    - Rakeを利用してホスト毎にタスクを分ける
- spec_helper.rb
    - Rspecと同様に、serverspecの挙動を制御する

# 3章 Serverspecの本格利用

- あえて `expext` ではなく ワンライナー `should` 記法を推奨している
    - 最も直感的にかけるため
    - テストが通ったか、通らなかったか? だけを求めているので自然言語風に記述にこだわりがない
    - `should`だけ覚えていれば使えるようにしたい
    - Rspecの記法のバリエーションの隆盛に振り回されたくない
        - **わかる**
    - ちなみにRspec3で非推奨になるのは　`Object#should` でワンライナー `should` 記法は残る

```.rb
describe packege('nginx') do
  it { should be_installed }
end
```

## 3.2 リソースとリソースタイプ

```.rb
describe packege('nginx') do
  it { should be_installed }
end
```

**リソース : 具体的な個別テストの対象**

- 上記の場合 `packege('nginx')` がテスト対象となるリソース

**リソースタイプ : リソースの種類**

- 上記の場合 `packege('nginx')` リソースのリソースタイプは、 `packege`


**ServerspecではSSH経由でテストを実行する場合、デフォルトで sudo をつけている**

## 3.4 テスト対象ホストの追加

serverspec-init で生成される Rakefile では以下のように設定している

```.rb
namespace :spec do
  targets = []
  Dir.glob('./spec/*').each do |dir|
    next unless File.directory?(dir)
    target = File.basename(dir)
    target = "_#{target}" if target == "default"
    targets << target
  end
```

spec以下のディレクトリ構成はこんな感じ

```
$tree
.
├── spec_helper.rb
└── #{サーバ名}
    └── sample_spec.rb
```

- なので、テスト対象のホストを増やしたい時は、spec 以下にサーバ名のディレクトリを増やせば良い
- また、Rakefileの当該部分を書き換えることで、別の方法でテスト対象を増やすことも可能
    - 例えば AWS の API を叩くとか、consulを使うとか
HTTPS+Nginx+Rails環境でActionController::InvalidAuthenticityToken


## 症状

- Deviseのログインをしようとすると422エラー
- ActionController::InvalidAuthenticityToken
- Chrome, Safariで発生
- Firefoxでは発生しなかった

## 発生条件

下記条件で発生しました。他の要因があるかもしれないし、関係ないかもしれません。参考程度に。

- Nginx 1.6.3
- Puma 3.4.0
- Rails 5.0.0.rc1
- HTTPS強制（Railsの `force_ssl` ではなくNginxの設定で）

## 対処法

Nginxの設定ファイルはこんなかんじになっていた（抜粋）。

```nginx.conf
# --------------------------------------------------------------------
# https://example.com/
# --------------------------------------------------------------------
upstream example-app {
  server unix:/path/to/server.sock;
}

server {
  listen 443 ssl;
  server_name example.com;

  root /path/to/example-rails-app/public;

  location / {
    if (!-f $request_filename) {
      proxy_pass http://example-app;
    }
  }

  # SSLやassetsのあたりの設定は省略
}

# --------------------------------------------------------------------
# http://example.com/
# --------------------------------------------------------------------
server {
  listen 80;
  server_name example.com;

  rewrite ^(.*)$ https://example.com$1 permanent;
}

```

これだと、クライアント⇔NginxはHTTPS通信するが、Nginx⇔PumaはHTTP通信になり、RailsにはHTTP接続に見え、ホスト名が `example-app` 、クライアントのIPアドレスも127.0.0.1に見えてしまう（Pumaから見たNginxのIPアドレス）。Railsが思っている自分のURLと実際のURLが異なるからうまく処理できないような感じが原因に見えた。そのため、下記を `server` ディレクティブに加えてNginxがもってる情報を渡してあげたら解決した。

```nginx.conf
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Client-IP $remote_addr;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_set_header X-Forwarded-Proto $scheme;
```
CentOS6で、npm の iconvがインストール出来ない

## gccのアップデートを行えば解決できた。
具体的には、gcc 4.4.x => gcc 4.8.x にアップデートを行うことで解決。

他にも、以下のようなエラーが出るケースでは、gccをアップデートする事で解決出来ると思う。

```
pm ERR! iconv@2.2.1 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the iconv@2.2.1 install script 'node-gyp rebuild'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the iconv package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs iconv
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls iconv
npm ERR! There is likely additional logging output above.
```

## 原因

`npm install iconv` において、build時にgccを利用するのだが、そのgccのライブラリバージョンが低いのが問題だったって訳。

## 対応方法

### 既存のgccを削除
```
yum remove gcc
```

### gccのリポジトリを取得して、gcc関連をインストール
```
wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
yum install devtoolset-2-gcc devtoolset-2-binutils
yum install devtoolset-2-gcc-c++ devtoolset-2-gcc-gfortran
```

後はパスを通すだけ。

```
# ローカルユーザならばこちら
vi ~/.bashrc
# 全体に反映するならこっち。
vi /etc/bashrc

# 最終行に追加
source /opt/rh/devtoolset-2/enable
```

環境読み込みして完了。
```
. ~/.bashrc
```
ESLint v2.13.0

前 [v2.12.0] | 次 [v3.0.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v2.13.0 released: <a href="https://t.co/Pqj5k0JMGL">https://t.co/Pqj5k0JMGL</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/743854174618558464">2016年6月17日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

いくつかのバグ修正・機能改善が行われました。
[JSCS] からのルール移植を実施中です。進捗は GitHub の [JSCS Compatibility] マイルストーンを参照してください。

前回から1週間しか経っていないだけあって、小さなリリースです。

このリリースは、`2.x` 系の最後の機能追加リリースになります。残っているバグ修正が終わったら `3.0.0` リリースのための最終作業に入る予定です。なお、`3.0.0` も小さなリリースになります ([`2.0.0` のように](http://qiita.com/mysticatea/items/8bcecd821cca9e849078)はなりません)。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

|     | URI |
|:----|:----|
| 日本語 Issue 管理リポジトリ | https://github.com/eslint/eslint-jp |
| 日本語チャット | https://gitter.im/eslint/eslint-jp |
| 本家 Issue 管理リポジトリ | https://github.com/eslint/eslint |
| 本家チャット | https://gitter.im/eslint/eslint |

----

# :wrench: オプションが追加されたルール

## [#6059]: [func-names]

名前付き関数式を警告する `never` オプションが追加されました。
[JSCS] との互換性のためです。

```js
/*eslint func-names: [error, never]*/

// ✔ GOOD
let foo = function() {
    console.log("hello")
}

// ✘ BAD
let foo = function foo() {
    console.log("hello")
}
```

# :pencil: 新たに3つのルールが `eslint --fix` をサポートした

- [#6225]: [no-multiple-empty-lines]
- [#6320]: [padded-blocks]
- [#6412]: [object-shorthand]

[v2.12.0]: http://qiita.com/mysticatea/items/7bf844b32f8295eeb061
[v3.0.0]: http://qiita.com/mysticatea/items/9c8a8b1219d5f94441e8
[JSCS]: http://jscs.info
[JSCS Compatibility]: https://github.com/eslint/eslint/milestones/JSCS%20Compatibility
[#6059]: https://github.com/eslint/eslint/issues/6059
[#6225]: https://github.com/eslint/eslint/issues/6225
[#6320]: https://github.com/eslint/eslint/issues/6320
[#6412]: https://github.com/eslint/eslint/issues/6412
[func-names]: http://eslint.org/docs/rules/func-names
[no-multiple-empty-lines]: http://eslint.org/docs/rules/no-multiple-empty-lines
[object-shorthand]: http://eslint.org/docs/rules/object-shorthand
[padded-blocks]: http://eslint.org/docs/rules/padded-blocks
REST APIを使ったDBCSインスタンスの作り方

## はじめに

本記事はOracle CloudのDatabase Cloud Service（以下 DBCS）に対して、
REST API経由でインスタンス作成する方法を記載しています。
やろうと思った経緯はインスタンス作成を自動化したかったからです。
また[参考文献](http://qiita.com/mago1chi/items/eab5106096a6b7ce53bd#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE)に書いてある方法では実際にインスタンス作成が出来なかったため、
自分が試して成功した方法を明記するために本記事を書くことにしました。

## 作成するインスタンスの詳細をjsonファイル化

作成したいインスタンスの詳細をjsonファイルとして記載します。
以下にjsonファイルの例を示します。

```json
{
  "serviceName": "HL_inst01",
  "version": "12.1.0.2",
  "level": "PAAS",
  "edition": "EE_HP",
  "subscriptionType": "MONTHLY",
  "description": "Instance for HL",
  "shape": "oc3",
  "vmPublicKeyText": "ssh-rsa xxxxx",
  "parameters": [
    {
      "type": "db",
      "usableStorage": "30",
      "adminPassword": "Welcome#1",
      "sid": "ORCL",
      "pdb": "SCM",
      "failoverDatabase": "no",
      "backupDestination": "NONE",
    }
  ]
}
```

各項目を簡単に説明しますと

+ serviceNmae：インスタンス名
+ version：Oracleのバージョン
+ level：BASIC(virtual image) もしくは PAAS(automated)の選択
+ edition：SE、EE、HP、EPの選択
+ subscriptionType：課金頻度の選択（毎時か毎月か）
+ description：インスタンスの説明文
+ shape：OCPU数、メモリサイズの選択
+ vmPublicKeyText：公開鍵の記述
+ type：詳細不明、"PAAS"を選択した場合は"db"と入力
+ usableStorage：データファイルとして使用するデータ量の指定
+ adminPassword：sys、systemユーザのパスワード
+ sid：SIDの指定
+ pdb：pdb名の指定(versionに12.1指定の場合に指定可能)
+ failoverDatabase：詳細不明、フェイルオーバー先のインスタンス名を指定？
+ backupDestination：バックアップ先のクラウド・ストレージを指定（事前にStorage Cloud Serviceのコンテナを用意）

となります。
引っかかったのが"vmPublicKeyText"です。こちらには公開鍵を直接記述してもいいですし、
Oracle CloudのCompute Cloud Serviceに登録した公開鍵を指定してもいいです。
但し後者の具体的な指定方法は著者自身が分かっていません。

## cURLによるDBCSインスタンスの作成

REST APIを使ったインスタンスの作成にはcURLコマンドを使うのが手軽でいいです。
以下にcURLコマンドの例を示します。

```sh
curl -k --include --request POST --user <user_name>@<password> \
--header "X-ID-TENANT-NAME:<Identity Domain Name>" --header "Content-Type:application/json" \
--data @<json file name> https://<REST endpoint>/paas/service/dbcs/api/v1.1/instances/<Identity Domain Name>
```

こちらも重要なとこを簡単に説明しますと

+ user_name と password：Oracle Cloudの利用に際して登録したユーザ名とパスワードを入力します。
+ Identity Domain Name：利用しているOracle Cloudのアイデンティティ・ドメイン名を入力します。
+ json file name：前章で作成したjsonファイルのファイル名を入力します。
+ REST endpoint：自分が利用しているDBCSのRESTエンドポイントを入力します。(RESTエンドポイントの確認方法は後述）

となります。
ここで引っかかったのはRESTエンドポイントの箇所です。
そもそもここにRESTエンドポイントを入力すると気付くのに時間が掛かりました。
RESTエンドポイントはOracle Cloudの「ダッシュボード」からDBCSの「詳細」リンクへアクセスすると確認できます。

## まとめ

これで準備が整いましたので、あとは上記のcURLコマンドを実行すればインスタンスが作成されます。
さらにjsonファイル内のインスタンス名を連番などで書き換えるスクリプトを追加すれば、
DBCSインスタンスを多く作成する必要に迫られたときに、作業を自動化できます。

## 参考文献

+ [REST API for Oracle Database Cloud - Database as a Service](https://docs.oracle.com/cloud/latest/dbcs_dbaas/CSDBR/op-paas-service-dbcs-api-v1.1-instances-%7BidentityDomainId%7D-post.html#examples)
+ [REST APIを用いてOracle Database Cloud Serviceインスタンスを作成する](http://cosol.jp/techdb/2015/12/create-oracle-database-cloud-service-instance-using-rest-api.html)
VPCのネットワーク設計用テンプレート


VPCのネットワーク設計やCIDRの算出は、結構面倒臭いものです。そこで、割と汎用的な設計を行える設計書を、Googleスプレッドのテンプレートとして作成しました。

# 説明

このテンプレートでは、Amazon VPCのVPCウィザードの「[シナリオ２：パブリックサブネットとプライベートサブネットを持つ VPC（NAT）](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Scenario2.html)」で出来上がるネットワークに対して、アベイラビリティゾーンを２つ用意するよう変更した状態のネットワークの各種CIDRが計算で出るようになっています。

## 出力例

|カテゴリ|項目                 |CIDR        |
|--------+---------------------+------------|
|VPC     |CIDR                 |10.9.0.0/16 |
|a-zone  |a-zone1 CIDR         |10.9.32.0/19|
|        |a-zone2 CIDR         |10.9.64.0/19|
|subnet  |a-zone1 subnet-1 CIDR|10.9.36.0/22|
|        |a-zone1 subnet-2 CIDR|10.9.40.0/22|
|        |a-zone2 subnet-1 CIDR|10.9.68.0/22|
|        |a-zone2 subnet-2 CIDR|10.9.72.0/22|

# 使い方

以下のURLを開くと、テンプレートが開きます。
https://drive.google.com/previewtemplate?id=1en6M-JojAwII8MoiTtXPiN4bnBYlf51AgLnct1wuTg0&mode=public

![スクリーンショット 2016-06-18 21.24.38.png](https://qiita-image-store.s3.amazonaws.com/0/75307/daa587b5-c2fa-f59a-acfd-250202a45cfd.png "スクリーンショット 2016-06-18 21.24.38.png")

「このテンプレートを使う」というボタンをクリックすると、自身のGoogle ドキュメントとして新規スプレッドが作成されます。
![スクリーンショット 2016-06-18 21.26.06.png](https://qiita-image-store.s3.amazonaws.com/0/75307/776c69ce-6e8a-bc9c-b158-c9902aa9c686.png "スクリーンショット 2016-06-18 21.26.06.png")

入力エリアの色の付いている場所に各種情報を入力すると、出力エリアにVPCの設定に必要なCIDRが表示されます。

## 設定項目

"値"列は、二進数で0か1かを各列に設定してください。
"説明"列には、自由表記で説明を記載していください。

各設定項目は以下の内容で入力してください。

|項目|説明|最大数|
|---+---+----|
|app|アプリごとのID|32アプリまで|
|env|本番、ステージング、開発などの環境|8環境まで|
|a-zone|アベイラビリティゾーン|8つまで|
|subnet|サブネット。シナリオに倣いpublicとprivateを用意|8つまで|

## 拡張方法

アベイラビリティゾーンやサブネットの種類を増やしたい時には、シートの下の方にある作業エリアを編集した上で、その結果を出力エリアに追加してください。

# ライセンス

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br /><span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">中垣健志</span> 作『<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">VPCネットワーク設計</span>』は<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>で提供されています。
Phalconのプロジェクト作成

# ディレクトリ（ひな形）の準備
Phalconをインストールするとあとは何がしかのコマンドを打てば
プロジェクトのひな形が自動生成されるのかと思ったらそうではないらしい。
一先ずディレクトリ構成は以下のようにしてみた
app/controllers
app/models
app/views
public/css
public/image
public/js
すごくシンプルだが、まだどんな機能があるかわからないし、
必要になったら足せば良いかなと。
だいたい、そんなにいろいろ機能を付けるならPhalconよりも
symphonyやlaravelを使えば良い。

# Apacheの準備
ドキュメントルートを上記のpublicに向けておく。
publicは公開用のディレクトリ。
さらにpublicの直下に.htaccessを作成して以下のようにしておく。
これでリクエストを全てindex.phpで受ける事ができる。

```php:.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>
```

#bootstrapの準備
これはチュートリアルのページから拝借してきた。
public直下にindex.phpを作って以下のように書く

```php:index.php
<?php

use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Url as UrlProvider;
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;

try {

    // オートローダにディレクトリを登録する
    $loader = new Loader();
    $loader->registerDirs(array(
        '../app/controllers/',
        '../app/models/'
    ))->register();

    // DIコンテナを作る
    $di = new FactoryDefault();

    // ビューのコンポーネントの組み立て
    $di->set('view', function () {
        $view = new View();
        $view->setViewsDir('../app/views/');
        return $view;
    });

    // ベースURIを設定して、生成される全てのURIが「phalcon」を含むようにする
    $di->set('url', function () {
        $url = new UrlProvider();
        $url->setBaseUri('/phalcon/');
        return $url;
    });

    // リクエストを処理する
    $application = new Application($di);

    echo $application->handle()->getContent();

} catch (\Exception $e) {
     echo "Exception: ", $e->getMessage();
}
```

https://docs.phalconphp.com/ja/latest/reference/tutorial.html#id3
のtutorialをphalconに変えています。

# テスト
それではブラウザでアクセスしてみる。
「Exception: IndexController handler class cannot be loaded」
という表示が出てきたが、これは想定内。
Phalconではルーティングの設定をしていなければデフォルトのアクションは
IndexController@indexActionとなる。
まだコントローラーは作っていないのでこれは正常動作。
Terasoluna Server For Webの自分用設定

「TERASOLUNA Server Framework for Java（Web版）」でWebシステムを作成しています。
[https://osdn.jp/projects/terasoluna/wiki/Server_Framework_for_Java_Web]()

今後もTerasolunaを使って、新しいWebシステムを作る気がするので、Terasolunaの自分用設定をまとめます。


# JSP

### エラーページでexception.printStackTrace実行
Exceptionが発生した際に遷移するエラーページで、暗黙オブジェクト`exception`の`printStackTrace`メソッドを実行します。

```jsp:error.jsp
<%@ page isError="true" %>
<%
exception.printStackTrace();
%>
```
[http://struts.wasureppoi.com/jsp/05_errorPage.html]()

この記述がないと、エラーページに遷移した原因を追えません。

# applicationContext.xml

### カスタムログインターセプタ
デフォルトのログインターセプタでは、ビジネスロジックでExceptionが発生しても、stackTraceを出力しません。カスタムログインターセプタを作成して、stackTraceを出力するようにしました。
[http://qiita.com/yuji38kwmt/items/3acb696e5cb09fb52f54]()
ActionCableでDeviseのcurrent_userを扱う

【注意！】この記事はRails 5.0.0RC1を対象にしています。他のバージョンでの挙動は分かりません。あとそのうちDevise側が対応してくると思います。 (3.5では未対応)

Rails 5の目玉機能といえば、ActiveCable。実際に使うとなるとDeviseなどの認証機構と一緒に使うと思います。

しかし、ActionCable + Deviseをググってもあまり良い情報は出てこず、[ログインしたらcookieにcurrent_user.idを書くと良いよ](http://www.rubytutorial.io/actioncable-devise-authentication/
)という記事が真っ先に出てきます。

そんな雑な方法はイヤなので、sessionから読むようにしてみます。

```rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    protected
    def find_verified_user
      User.find(session['warden.user.user.key'][0][0])
    rescue
      reject_unauthorized_connection
    end

    def session
      @session ||= cookies.encrypted[Rails.application.config.session_options[:key]]
    end
  end
end
```

モデル名がAccountの場合セッションキーは`warden.user.account.key`だと思います。これ、ベタ書きでかっこ悪いのでちゃんと取得する方法があったら誰かコメントで教えてください。よろしくお願いします。

p.s
 今のところ、Deviseの公式GemはRails 5に対応していないのでdevelopブランチを使ってください。

```rb
gem 'devise', git: 'https://github.com/plataformatec/devise.git'
```
Azure Functions の npmモジュール の使い方

# はじめに
Azure Functionsをnode.jsでnpmモジュール追加して使いたい、の、手順。

# 事前準備
AzureポータルからAzure Functionを作成。
ここはいろいろな記事でも書かれているので省略。


# npmの実行（2018.6）

2018.6 時点でやり方が変わっていたので記事の更新をしました。
以前は Kudu経由 でやっていたのですが、コンソールというメニューが追加されました。

```
[Azure Functions] → [プラットフォーム機能] ※上にタブみたいに存在 → [コンソール]
```

でコンソールが表示されます。
コンソールでnpmモジュールのインストールをします。

```
D:\home\site\wwwroot> npm install xxxx
```

これで無事完了。
あとはソース上でいつもどおり ``require`` して利用することが可能です。

```index.js
var xxxx = require('XXXX');
```

簡単、簡単。

Fin.

---
# npmの実行（以下古い情報なので読まなくていいです）

ここが本題。おなじみの npm install を実行するために Kudu を立ち上げます。
下記URLにブラウザでアクセスします。

```
https://{{your-function-name}}.scm.azurewebsites.net
```

Functionで作ったURLの間に``scm``をはさんだURLです。

ページが無事に出てきたら上部の``Debug Console``→`CMD`から,

```
D:\home>
D:\home\site>
D:\home\site\wwwroot>
D:\home\site\wwwroot\{{your-application-name}}>
```

目的の場所に到達したら、ついに``npm``コマンドが実行できます。
Kuduの下側のコマンドプロンプト的なところで Azure Function で使いたいnpmモジュールのインストールをします。

```
D:\home\site\wwwroot\{{your-application-name}}> npm init
D:\home\site\wwwroot\{{your-application-name}}> npm install --save xxxx
```

*※ npm initがなぜかおわらない場合にはちょっと時間おいてから F5 更新してみてください*

これで無事完了。
試しに、Azure Functionの管理ページから、``Develop`` ``Code`` の左下の ``View Files'' でフォルダやファイル一覧がでてくるので、``package.json`` ができていて中身が入っていること確認しましょう。

あとはソース上でいつもどおり ``require`` して利用することが可能です。

```index.js
var xxxx = require('XXXX');
```

おわり
Akka actor で状態の var を機械的に書き換えて無くす方法

Actor では状態を保持するために var を使うことがあります。Actor の receive は並列に実行されることはないため、var でも並列性にまつわる問題に悩まされることはありません。
しかし同一スレッドでも再代入無しのほうが何かと問題が起きづらいですよね。

Actor で状態を表す var は機械的に書き換えて無くすことが出来ます。
次のようなコードがあったときに、

```scala
class MyActor extends Actor {
  private var myState: MyState = 初期状態

  override def receive: Receive = {
    case ... =>
      // 状態を参照して何か処理
      myState = 更新された状態 // 状態更新
  }
}
```

こうする

```scala
class MyActor extends Actor {
  override def receive: Receive = stateToReceive(初期状態)

  private def stateToReceive(myState: MyState): Receive = {
    case ... =>
      // 状態を参照して何か処理
      context.become(stateToReceive(更新された状態))
  }
}
```

はい。var 無くなりました。

activator new で minimal-akka-scala-seed テンプレートで生成された Actor を書き換えてみましょう。

元のコードがこれ

```scala
class PingActor extends Actor with ActorLogging {
  import PingActor._
  
  var counter = 0
  val pongActor = context.actorOf(PongActor.props, "pongActor")

  def receive = {
  	case Initialize => 
	  log.info("In PingActor - starting ping-pong")
  	  pongActor ! PingMessage("ping")	
  	case PongActor.PongMessage(text) =>
  	  log.info("In PingActor - received message: {}", text)
  	  counter += 1
  	  if (counter == 3) context.system.shutdown()
  	  else sender() ! PingMessage("ping")
  }	
}
```

`var counter` が今回のターゲットです。書き換えて var をなくしてみましょう。

```scala
class PingActor extends Actor with ActorLogging {
  import PingActor._

  def receive = stateToReceive(0)
  val pongActor = context.actorOf(PongActor.props, "pongActor")

  private def stateToReceive(counter: Int): Receive = {
    case Initialize =>
      log.info("In PingActor - starting ping-pong")
      pongActor ! PingMessage("ping")
    case PongActor.PongMessage(text) =>
      log.info("In PingActor - received message: {}", text)
      context.become(stateToReceive(counter + 1))
      if (counter + 1 == 3) context.system.shutdown()
      else sender() ! PingMessage("ping")
  }
}
```

はい。できました。
差分はこんな感じです。

```diff
--- a/src/main/scala/com/example/PingActor.scala
+++ b/src/main/scala/com/example/PingActor.scala
@@ -5,17 +5,18 @@ import akka.actor.{Actor, ActorLogging, Props}
 class PingActor extends Actor with ActorLogging {
   import PingActor._
 
-  var counter = 0
+  def receive = stateToReceive(0)
   val pongActor = context.actorOf(PongActor.props, "pongActor")
 
-  def receive = {
+  private def stateToReceive(counter: Int): Receive = {
     case Initialize =>
       log.info("In PingActor - starting ping-pong")
       pongActor ! PingMessage("ping")
     case PongActor.PongMessage(text) =>
       log.info("In PingActor - received message: {}", text)
-      counter += 1
-      if (counter == 3) context.system.shutdown()
+      context.become(stateToReceive(counter + 1))
+      if (counter + 1 == 3) context.system.shutdown()
       else sender() ! PingMessage("ping")
   }
 }
```

注意することは、更新後の counter を参照していた箇所(`counter == 3`)で、更新が行われないので `counter + 1 == 3` と書き換える点くらいでしょうか。

複数の状態変数 var があるときは、stateToReceive() の引数を複数個にするなどすれば大丈夫です。
HTMLで、縦方向に結合したセルを持つ行を、非表示にする方法


以下のような、縦方向に結合したセルを持つテーブルがあるとします。

```html:original.html
<table>
    <thead>
        <tr>
            <th>県</th><th>市</th><th>人口[千人]</th>
        </tr>
    </thead>
    <tbody>
    <tr>
        <th rowspan="3">愛知県</th><td>名古屋市</td><td>2200</td>
    </tr>
    <tr>
        <td>一宮市</td><td>300</td>
    </tr>
    <tr>
        <td>岡崎市</td><td>300</td>
    </tr>
    </tbody>
</table>
```

```css:style.css
    table, tr, td, th {
        border:solid 1px;
        border-collapse:collapse;
    }
```
![original.png](https://qiita-image-store.s3.amazonaws.com/0/37903/7a44650b-bfc6-8816-ef30-a76cd574b40e.png)

この表から「岡崎市」の行を一時的にJavaScriptで非表示にするには、どうすればいいでしょうか？
なお、「一時的に非表示」なので、「岡崎市」の行そのものを削除するのは、なしです。

方法は2つあります。
おすすめは2つ目です。

### 方法1: 非表示にしたい行のtr要素を非表示
まず最初に思いつくのが、tr要素の非表示だと思います。
tr要素を`display:none;`で非表示にします。
これだけではrowspanの値が矛盾してしまっているので、rowspan属性の値も3から2に変更します。

```html:modify1.html
    <tbody>
    <tr>
        <th id="aichiHead" rowspan="2">愛知県</th><td>名古屋市</td><td>2200</td>
    </tr>
    <tr>
        <td>一宮市</td><td>300</td>
    </tr>
    <tr class="hidden" style="display:none;">
        <td>岡崎市</td><td>300</td>
    </tr>
    </tbody>
```

![tr要素を非非表示.png](https://qiita-image-store.s3.amazonaws.com/0/37903/b7ee562b-744c-b044-e49e-21bdf5085f80.png)

```js:modify1.js
/** 非表示対象の行を非表示にする OR 表示する */
function hideRow(hide) {
  if(hide) { //非表示
    $("table tr.hidden").css("display", "none");
    $("#aichiHead").attr("rowSpan", 2);
  } else { //表示
    $("table tr.hidden").css("display", "");
    $("#aichiHead").attr("rowSpan", 3);    
  }
}
```

この方法の問題点は、rowspan属性の値を変更しなくてはならないことです。
非表示にしたい行の数、元の表の行数が変わるたびに、非表示処理のjsのソースコードを修正する必要があります。
jsで、「表示されている行数を数えて、rowspan属性値を変更する」ことも可能ですが、若干面倒です。

### 方法2: 非表示にしたい行のtd要素を非表示
tr要素を非表示にするのでなく、非表示対象行内の全てのtd要素を非表示にして、実現することもできます。

```html:modify2l.html
    <tbody>
    <tr>
        <th id="aichiHead" rowspan="3">愛知県</th><td>名古屋市</td><td>2200</td>
    </tr>
    <tr>
        <td>一宮市</td><td>300</td>
    </tr>
    <tr class="hidden">
        <td style="display:none;">岡崎市</td><td style="display:none;">300</td>
    </tr>
    </tbody>
```

![tr要素を非非表示.png](https://qiita-image-store.s3.amazonaws.com/0/37903/eee0f7b5-1872-4255-b834-755f1177a666.png)

```js:modify2.js
/** 非表示対象の行を非表示にする OR 表示する */
function hideRow(hide) {
  if(hide) { //非表示
    $("table tr.hidden > td").css("display", "none");
  } else { //表示
    $("table tr.hidden > td").css("display", "");
  }
}
```

表示結果は同じです。
ポイントはrowspan属性値を修正する必要がないことです。
非表示したい行が変わったときは、HTMLのtr要素のhiddenクラスを変更するだけでよく、jsを修正する必要はありません。


### まとめ
rowspan属性は、tr要素の表示/非表示に影響し、td要素の表示/非表示には影響しない。
Ubuntu 16.04 LTS 備忘録

# 概要
Ubuntu 16.04 LTS を利用する際の備忘録です(^O^)
# 環境
Hyper-V 7.0 （Windows 10 Pro）
# インストール
1. Ubuntuのダウンロード
    2. https://www.ubuntulinux.jp にアクセス
    3. 「Ubuntuのダウンロード」をクリック
    4. 「日本語 Remix イメージのダウンロード」をクリック
    5. 「ubuntu-ja-16.04-desktop-amd64.iso」をダウンロード
6. Ubuntuをインストール

## はまったところ
### ISOイメージから起動しない
ISOイメージから起動しようとすると`The image's hash and certifiate are not allowed (DB).`と表示され、ISOイメージから起動が出来ない。

<img width="512" alt="ubuntu_hyper-v_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/120703/66c8ddf3-6eb4-bb3a-cb5e-1b27c8436036.png">

Hyper-Vでセキュアブートが有効になっていることが原因なので、セキュアブートを無効にして起動する。

# インストール後
## リモートでsshでアクセス出来るようにする
デフォルトでssh-serverがインストールされていないのでインストールする。
```$ sudo apt-get install openssh-server```

これで接続できる！と思ったらエラーが･･･(^-^;
```$ ssh XXX.XXX.XXX.XXX
Connection closed by XXX.XXX.XXX.XXX```
仮想スイッチとUbuntuのIPアドレスが同じになっていたことが原因の模様。
UbuntuのIPアドレスを固定値に設定したらアクセス可能になりました(^O^)
**※必ず発生する訳ではないみたい（要調査）**←Windows 10 Pro Insider Previewを使ってるのが原因なんじゃ･･･

## node.jsをインストールする
@seibeさんの[Ubuntuに最新のNode.jsを難なくインストールする](http://qiita.com/seibe/items/36cef7df85fe2cefa3ea#_reference-ab9bbcf919c848e8b7a9)を参考にインストールする。

## TensorFlowをインストールする
[https://www.tensorflow.org/get_started/os_setup](https://www.tensorflow.org/get_started/os_setup)を参考にしてインストールする。
@yudsuzukさんの[UbuntuにTensorFlowをインストール](http://qiita.com/yudsuzuk/items/092c38fee18e4484ece9)も参考にする（主に動作確認）。

## CUIで起動
```$ sudo systemctl set-default multi-user.target```
-元に戻す場合
```$ sudo systemctl set-default graphical.target```

## フォルダ名を日本語から英語へ変更
```$ LANG=C
$ xdg-user-dirs-gtk-update
```
repo init -g の効果 (i.MX6 Marshmallow 編)

# 1. Overview
[repo sync でストレージを節約するための group 機能の使い方](http://qiita.com/monamour555/items/804cc47110a0a7031117)
を見て、自分の環境でどの程度効果があるか実験。

# 2. Environment
## 2.1. My environment
自分の環境は：

- Target: NXP i.MX6 向け AOSP 6.0 (arm) 
    - NXP公式[Android 6.0.1](http://www.nxp.com/ja/products/software-and-tools/software-development-tools/i.mx-software-and-tools/i.mx-6-series-software-and-development-tool-resources:IMX6_SW)
- Build host: Ubuntu 14.04 x64 (linux)

## 2.2. Not necessary
- Host Tool類
    - MacOSX(darwin) 向け
- Target source類
    - MIPS(mips)向け
    - Intel x86(x86)向け

ということで
```-g 'default,-darwin,-mips,-x86'```
をOptionに追加します。

# 3. Experiment at 2016/Jun/18
## 3.1. Do without '-g'
```
$ repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r3

    <<...中略...>>

$ repo sync

    <<...中略...>>

$ du -sh ./
44G      ./
```

## 3.2. Do with '-g'
```
$ repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r3 -g 'default,-darwin,-mips,-x86'

    <<...中略...>>

$ repo sync

    <<...中略...>>

$ du -sh ./
40G      ./
```

## 3.3. Result
ということで 4GB 程削減。
Marshmallow は他がデカすぎて、4GBが小さく感じる・・・・・