OmniAICreator/Qiita-1.07M huggingface dataset:
terraform v0.9で追加された "env" を使って複数環境を作成してみる


## update terraform v0.9
アップデート内容については、ここに書いてあります。
[https://www.hashicorp.com/blog/terraform-0-9/](https://www.hashicorp.com/blog/terraform-0-9/)

やはり個人的には、 **env** による複数環境の構築・運用のしやすさがどうなるのかが気になったのでさっそく試してみました。

## サンプルで作成したレポジトリ
今回作成したレポジトリはこちらにあります。
[https://github.com/Twinuma/terraform0.9-sample](https://github.com/Twinuma/terraform0.9-sample)

## 説明
**env** に関してはここにドキュメントがあるのでこちらを見てください。
[https://www.terraform.io/docs/state/environments.html](https://www.terraform.io/docs/state/environments.html)

簡単に説明すると、
`terraform env new dev` と実行すると、カレントディレクトリに `terraform.tfstate.d/dev` が出来上がります。

次に`terraform env select dev` と実行すると、カレントディレクトリに `.terraform/environment` が出来上がります。このファイルには現在の環境情報が書いてます。この場合は `dev` と記載されている。

`apply` コマンドを実行すると `terraform.tfstate.d/dev`配下に `terraform.tfstate`が出来上がります。

## 今回私がやってみた環境を分ける方法

```vpc.tf
resource "aws_vpc" "vpc" {
  cidr_block = "${terraform.env == "dev" ? var.dev_vpc_cidr : terraform.env == "stg" ? var.stg_vpc_cidr : var.prod_vpc_cidr}"
  enable_dns_hostnames = true
  tags {
    Name = "${terraform.env}-${var.vpc_name}"
    env = "${terraform.env}"
  }
}
```

```terraform.tfvars
vpc_name = "vpc"
dev_vpc_cidr = "10.2.0.0/16"
stg_vpc_cidr = "10.1.0.0/16"
prod_vpc_cidr = "10.0.0.0/16"
```

```
terraform env select dev

terraform plan -var 'access_key=xxxxx' -var 'secret_key= xxxxx'

terraform apply -var 'access_key= xxxxx' -var 'secret_key= xxxxx'
```


このようにやれば一つのtfファイル内で条件分岐で環境分けができました。
なにげにタグにもちゃんと入れられるのも嬉しい。

もっとスマートにできる方法があるかもしれないので、もしよかったらコメントで教えてくれると嬉しいですm(_ _)m


## 環境の作成
```
terraform workspace new prd
```

## 現在の環境
```
terraform workspace show
```

## 環境の選択
```
terraform workspace select prd
```

## 環境の一覧
```
terraform workspace list
```
Azure Storage へのアクセスログ

#概要
監査等々で、ファイルなどのアクセスログを取得したいというニーズがあります。
Azure Storage の標準設定では、アクセスログの取得していませんが、設定一つ変更するだけで、アクセスログ収集ができます。
#設定方法
[Azure ポータル](https://portal.azure.com)で、ストレージアカウントを開き、[診断]を選択、必要に応じて、"BLOB ログ"・"テーブル ログ"・"キュー ログ"をチェックし、保存します。

![storage01.png](https://qiita-image-store.s3.amazonaws.com/0/3816/9eab160a-c9f3-4f15-b6b3-e92d357247ea.png)

ログは、ストレージアカウントに作成される $log コンテナに保存されるので、[Azure Storage Explorer](http://storageexplorer.com/) などを使って、コンテナにアクセスすれば、ログファイルにたどり着けます。
リテンション期間も設定できるので、必要に応じて、日数を設定します。長期保存をすると、それだけストレージ容量も増えるのでお気を付けて。
Serverless Frameworkで複数ステージにデプロイされているLambdaをInvokeする


Serverless Frameworkでは、`$ sls deploy --stage dev`とか`$ sls deploy --stage prod`みたいにステージを分けてデプロイできます。

でServerless FrameworkでデプロイされるLambdaは、`service-name`-`stage`-`function-name`という名前になります。
なのでLambdaからinvokeする場合は以下のように書きます。

```
const query = {
  FunctionName: 'serverless-fw-name-development-examplefunction',
  Payload: JSON.stringify({
    'username': username
  }),
  InvocationType: 'Event',
  LogType: 'None'
}
const client = new aws.Lambda({apiVersion: '2015-03-31'})
client.invoke(query).promise()
```

ただこの書き方だと、stage名決め打ちになってしまいます。
で、どうもServerless FWのステージ名は`event`や`context`内にも入っていない様子。

ということで今のところ`serverless.yml`で環境変数としてステージ名を突っ込んでおくのが無難かなと思います。

```serverless.yml
service: sample

provider:
  name: aws
  runtime: nodejs4.3
  stage: dev
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "lambda:InvokeFunction"
      Resource:
        - "*" #サンプルなので全許可にしてます。
functions:
  example:
    handler: hello.handler
    environment:
      STAGE: ${opt:stage}
```

```hello.js
// 前略

const query = {
  FunctionName: 'sample-' + process.env.STAGE + '-example',
  Payload: JSON.stringify({
    'username': username
  }),
  InvocationType: 'Event',
  LogType: 'None'
}
const client = new aws.Lambda({apiVersion: '2015-03-31'})
client.invoke(query).promise()
```

他にいい方法あればコメントか編集リクエスト貰えるとめっちゃ助かります。
[メモ] Dockerでsupervisordを使うときにログを標準出力する

Docerの１コンテナ上で複数のサービスを動かす場合、supervisordが便利。
しかし、デフォルトの設定では標準出力、標準エラー出力にログが出力されない。
コンテナ内のログを取得する必要があるとき、利用するには少し辛い。

通常だとサービスの標準出力、標準エラー出力は以下のディレクトリなどに出力されてしまう。(apt-getでsupervisorを入れた場合)
`/var/log/supervisor/xxx.log`

supervisor_stdout (python2オンリー)を入れる方法もあるが、
https://github.com/coderanger/supervisor-stdout

標準オプションで出力できるので、こちらを使うのがオススメ。
http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html

```
[program:xxx]
...
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
```

### nginxの例

nginxのログを標準出力にシムリンクを貼る

```
ln -sf /dev/stdout /var/log/nginx/access.log
ln -sf /dev/stderr /var/log/nginx/error.log
```

/etc/supervisor/conf.d/nginx.conf

```
[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'
autostart=true
autorestart=true

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
```

これでdocker logやdocker-composeでログが見えるようになりました。
TortoiseGit の Diff Viewer で vimdiffを指定する

なぜかググっても全然でてこなかったのでメモ。

普段はTortoiseGitからdiff見るときはそのままTortoiseGitMergeをつかってるが、
一時的にvimdiffにしたくなったので。


TortoiseGit の Diff Viewer の External の設定で下記のように指定すればOK

```
C:\Program Files (x86)\Vim\vim73\vim.exe -d %base %mine
```

vimdiffがないと思ったら、vim.exe -d と同等らしい。
Rustのすすめ

Rustの歴史(from wikipedia)
----------
- 主任開発者: グレイドン・ホアレ
- 2006年に制作開始、2010年モジラ・サミットで公開
- Rustコンパイラー第0.1版は2012年1月に完成(LLVMベース)
- Firefox 48(2016年8月2日)にはRustで書き直されたメディアパーサが組み込まれた
- [Servo](https://servo.org/): Geckoに変わる新たなレンダリングエンジン

---

Rustの特徴
----------

- 安全性、速度、並行性
- 全てのデータ競合を排除
- 実行時オーバーヘッドのないコンパイル時の安全性検査
- ゼロコスト抽象化

---

LLVMの恩恵
----------
- 最適化(C並の性能)
- [emscripten](https://github.com/kripken/emscripten)： Javascript/wasmへコンパイル
- [nvptx](https://github.com/japaric/nvptx)：PTX（CUDA)へコンパイル

---

情報源
------
- [The Rust Programming Language](https://doc.rust-lang.org/book/) / [JP](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/)
    - 公式。言語仕様はここが最善。
- [The Rust Standard Library](https://doc.rust-lang.org/stable/std/)
    - 標準ライブラリのドキュメント。だいたいググったらここにあたる
- [This Week in Rust](https://this-week-in-rust.org/)
    - ホットなRust情報をお届けしてくれるはず！
- [docs.rs](https://docs.rs/)
    - crate.ioに公開されたパッケージのドキュメントを自動的にビルドしている。自作パッケージのドキュメントのホスト先として優秀
- [rust-jp](https://rust-jp.herokuapp.com/) slack team
    - ここで聞くと答えてくれるかも？

---

環境構築
--------

- [rustup](https://www.rustup.rs/)
    - 各OS向けにインストーラ完備
    - ディレクトリ単位でRustのバージョン切り替えが可能
- cargo
    - ビルド/実行ツール
    - TOML形式でパッケージのメタ情報、依存を記述する(Cargo.toml)
    - crate.ioだけでなくgithubからでもコードを取得可能
    - crate.ioへの公開もサポート(cargo publish)
    - 便利なサブコマンドプラグインもある
- rustc
    - LLVMベースのコンパイラ
    - rustupで勝手に入るので自分では触らない

---

さあRustを書き始めましょう！！
Herokuにアプリをあげたのでついでに自分のドメインも使えるようにした話

ローカルで開発してせっかくだからherokuにあげるところまでやって見ると、

やっぱり先走って買ったドメインでアクセスできるようにしてみたくなってくるじゃないですか。

だから

やってみようとなったのが昨日か一昨日のこと

やってみたので

備忘録的に書いてみようと思うのです。

1.前提

お名前.comでドメインを買うまたは買っている
(ぶっちゃけどこでもいいけど僕はGMOが大好きなのでお名前.com。)

Herokuにアプリをすでにあげていて「appname.herokuapp.com」でアクセスできる状態にある。


2.お名前.comをいじる

<img width="655" alt="スクリーンショット 2017-03-17 14.48.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/d41eb281-d663-ed64-0d12-6dc210a458b6.png">

主にここを使っていきます。

ログイン=>ドメイン設定のタブをクリック(ログインすると更新のアレが出てきてしまうのでクリックしないとここには行けない)=>ページ中程にあります。

<img width="171" alt="スクリーンショット 2017-03-17 14.51.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/5fe77bee-67cb-adf5-4973-f52cc729dc21.png">

こっちを使います。

クリックすると内部ドメイン一覧ってのが出るので
herokuに使いたいドメインを選択して次へ進む

するとこんなページに

<img width="681" alt="スクリーンショット 2017-03-17 14.53.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/3df587b6-0e45-de3f-3a43-091fcc90fd23.png">

で、

これを選択

<img width="680" alt="スクリーンショット 2017-03-17 14.53.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/ec68d029-a080-7b8f-6f63-7a46f4bfa69a.png">

次のページのページ中程に

<img width="665" alt="スクリーンショット 2017-03-17 14.54.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/98a727d8-a1c7-28ff-5fe2-9eff607b3d5f.png">

typeははじめ「A」になってると思いますが
「CNAME」に変更してホスト名は他の方のブログとか読むと
なんかしら入れないといけなさそうなので
僕は無難に「www.yourdomain.com」みたいにしました。
ちなみに僕は.tokyoドメインを使ったんですけどつかえたので
.com,net,jp以外でもなんでもいけるんだと思います。
VALUEはyourapp.herokuapp.comみたいな自分のherokuのドメインを入れて
できたら追加を押して、

ページ下部にある

<img width="696" alt="スクリーンショット 2017-03-17 15.00.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/976f981d-3e60-1fa9-9162-f405c42f2e41.png">

チェックボックスにチェックを入れて確認画面へ進むをクリック
(本当はネームサーバーの変更が必要なんですけどチェックボックスにチェックしとけばやってくれます。)

できたらお名前.comいじりは終わり。

2.herokuいじり

お名前.comの準備が終わったので

実際にherokuにドメインを追加します

```
heroku domains:add www.yourdomain.com
```

ターミナルに入力します。
www.yourdomain.comは自分が先ほどホスト名に登録したドメインを使ってください。

これで設定は終了ですが

今の状態で「www.yourdomain.com」にアクセスしても

このドメインはお名前.comで取得されています的なページが表示されるだけです。

このドメインでherokuappにアクセスできるようになるには時間がかかります

僕は3時間程度でアクセスできるようになりましたが

長い人だと6時間~1日かかる人もいるっぽいので気長に待ちましょう。

ちなみに

```
heroku domains
```
とコマンドでたたくと
登録されたドメインがすべて表示されます

で、この状態だと

2つのドメイン(今回登録したやつともともとあるherokuapp.com)でアクセスできるので
1つのドメインだけにするにはgem rack-rewriteを使うとできそうです。

また、独自ドメインを設定しましたがこれだと非SSL状態になっています。
SSLにするにはHOBBYにプランを変更する必要があるっぽいです($7/月)
プランを変えれば買ってきた証明書でSSLにできるっぽいです。

終わりで〜す
PHPでmkdirを呼んだらSELinuxに阻まれた

CentOS7 & Apache & PHP でWebサーバーを作っているわけですが、設定でいくらかトラブったのでメモです。

PHPから、mkdirなどを行おうとしたのですが、失敗しました。インターネットで調べてみると、パーミッションを設定しろ！と言った回答が多かったのですが、私の場合は、SELinuxのコンテキストが原因だったようです。

#コンテキストの追加方法
どうやら、ファイルやフォルダにコンテキストを追加するには以下をインストールする必要がありそうです。

```
yum install policycoreutils-python
```

私の場合は、初めから入っていました。
インストールが終わったら、segmanageコマンドでコンテキストを追加します。

#mkdir等を行えるようにするには「httpd_sys_rw_content_t」

さて、mkdirを行えるようにするには、対象のディレクトリに「httpd_sys_rw_content_t」というコンテキストを追加する必要があるようです。例えば、「/home/test」というフォルダに追加できるようにするためには、

```
semanage fcontext -a -t httpd_sys_rw_content_t /home/test
restorecon -R /home/test
```

といった具合です。「restorecon」を呼ばないと、反映されません。

#その他、Apacheで関連するコンテキストは？

それ以外にも、コンテキストが原因で失敗することがいくらかありました。以下のようなコンテキストが必要になるようです。

- ドキュメントルート : httpd_sys_content_t
- SSLの証明書ファイル : httpd_config_t

失敗した場合は、試してみると良いかもしれません。
SANsymphonyパススルーとRDMAの組み合わせ

初投稿です。試してみたことを書き残しておきたいのでブログを始めてみました。
データコア・ソフトウェアの田中です。

どこにでもあるSATA7200rpm x 8本（RAID5構成）を使用して、DataCore SANsymphonyのループバックvDiskがSMB Directと組み合わせも性能向上するかどうか見てみます。
S2D（Storage Space Direct、記憶域スペースダイレクト）とSANsymphonyのパススルー機能を組み合わせて性能向上が見込めそうかの基礎テストを兼ねています。

テスト内容
Iometerを使って、テストサイズ4GB、IOサイズ4K、ランダムRead100%でやってみました。
では、いきなり結果を見てみましょう。
<img width="241" alt="iops.png" src="https://qiita-image-store.s3.amazonaws.com/0/115778/e8372bdc-2111-2a9d-2242-129df7f074cf.png">
あまりに差があるので縦軸を普通は使わない対数にしました。2桁向上しました。

次は平均レスポンスタイム
<img width="241" alt="平均レスポンスタイム.png" src="https://qiita-image-store.s3.amazonaws.com/0/115778/2c2f03c7-a773-1878-08cd-473c01c33365.png">
こちらも2桁削減できました。

どちらも大きく改善していますね。パススルーにしたことによるキャッシュ効果は非常に大きいです。
ローカルマウントした時よりSMB Directで使用した時の方がIOPSもレスポンスタイムもいいのは謎ですが、ここでは本題ではないので理由を考えるのはやめておきます。

SANsymphonyがWindows2016に対応するのは次のバージョンから（の予定）なので、リリースされたら次回はS2Dと組み合わせてみたいと思います。
Play Frameworkでブラウザキャッシュ対策(Cache Busting)

# はじめに
ブラウザには標準で静的ファイル(javascriptやcss)のキャッシュ機能が付いていますが、
本番環境にソースを挙げてもそのままでは変更が反映されないため、
クエリー文字列を付加(version管理)することでキャッシュコントロールをしていました。

```html:例
<script src="./jquery.js?v=xxxxx"></script>
```
# Play Frameworkでは？
いちいちVersion管理するのは面倒ですし、日付にするとキャッシュが効かなくなってしまいます。
ですので、Play Frameworkではsbt-digestを使います。

##環境
Play Framework 2.5.10

##対応策
`project/plugins.sbt`に以下を追加

```plugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1")
```

`build.sbt`に以下を追加

```build.sbt
lazy val root = (project in file(".")).enablePlugins(SbtWeb)
pipelineStages := Seq(digest)
```

`conf/routes`に以下があることを確認

```routes
GET    /assets/*file           controllers.Assets.versioned(path="/public", file: Asset)  
```

Htmlのスクリプトタグの書き方を以下のように変える

```html:html
<script src="@routes.Assets.versioned("js/jquery.js")" ></script>
```

出力結果

```html:結果
<script src="/assets/js/cbfb54849f63656a2ce73815cdc8a005-jquery.js"></script>
```


##開発環境でも確認したい

もしも開発環境で確認をしたいのであれば、`build.sbt`に以下を追加すればローカルでも同じようになります。

```build.sbt
pipelineStages in Assets := Seq(digest)
```
Laravel 5.3でElementUIを使う

# 概要
LaravelはVue.jsをデフォルトで搭載していて、Vue.js大好きな自分にとっては大変嬉しいです。
Vue.jsを使っているとVue.js用に作られているUIライブラリの「Element UI」を使いたくなります。
Laravelに後からElementUIを追加するにはどうすればいいかを解説したいと思います。

# Element UIとは

![image](https://qiita-image-store.s3.amazonaws.com/0/62429/08ec1313-17f4-5e03-ccb2-1a7d11c9388c.png)
http://element.eleme.io/#/en-US


ElementUIは簡単に言えば「Bootstrapの上位互換でVueで使いやすくした」みたいな感じです！

いろいろなコンポーネントが利用できVueのStoreとのやり取りも簡単です。

# インストール

```bash
$ npm install --save-dev element-ui
```

#　変更箇所
変更点は `app.js` だけです。

```js:resources/assets/js/app.js
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-default/index.css';
import locale from 'element-ui/lib/locale/lang/ja';

Vue.use(ElementUI, { locale })
```


# 試す
今回はカラーピッカーを試してみたいと思います。（たぶん最近追加された？）
適当なViewに下記のコードを追加します。

```
<el-color-picker></el-color-picker>
```

ページを更新してみるとちゃんと追加されていることがわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/62429/f41b4c3e-f0a7-9720-fd83-389ee3b24cf9.png)
legacyシステムからGoogle Cloudへの道のり Part 2

legacyシステムからGoogle Cloudへの道のり
GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯
　　

　
[前回の投稿](http://qiita.com/tstakano-yj/items/1e27dfa5210095805c84)ではいろいろあって若干表現を変えました。





　
　
　
さて、[前回の投稿](http://qiita.com/tstakano-yj/items/1e27dfa5210095805c84)でkube-uiとAuto scaleについて触れたのだが、どうやら現在(2017/3/17)は[kubernetes-dashboard](https://kubernetes.io/docs/user-guide/ui/)と名前が変わっているらしい。
改めて[kubernetes-dashboard](https://kubernetes.io/docs/user-guide/ui/)とAuto scaleについてまとめてみることにする。

# [kubernetes-dashboard](https://kubernetes.io/docs/user-guide/ui/)
まずはdashboard、[前回の投稿](http://qiita.com/tstakano-yj/items/1e27dfa5210095805c84)でnginxが入ったpodを4つにスケールアウトしたが、その続きから。

まず、dashboardの表示方法だが、私の知っている方法は2通りある。

1. kubectl proxyを使用してローカルマシン上でproxyをたてて表示。
2. GKEのkubernetes masterに直アクセスで表示。

まずは１のパターンから。
GKEのコンソールで「クラスタに接続」をクリックすると何をすればいいかすべてが表示される。
<img width="731" alt="スクリーンショット2.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/53ada68f-c3b7-7153-0d33-7df77427d3da.png">

<img width="518" alt="スクリーンショット 2017-03-17 14.10.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/20364c7c-701a-baba-fc38-2f3f825ba37b.png">

kubectlがローカルマシンに入っていないといけないが、インストールは上記画面のkubectlのリンクから辿れる。

書いてあるとおりに打ってproxyを立ち上げたら http://localhost:8001/ui にアクセスして完了。

2のパターン。

GKEのコンソールでエンドポイントを確認する。（下図の赤枠）
<img width="731" alt="スクリーンショット 2017-03-17 14.06.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/3d2bdd9e-c209-4aeb-b548-1cfd61225a3f.png">

https://[エンドポイント]/ui

にアクセス。basic認証がかかっているので、GKEコンソールの「認証情報を表示」(上図の赤枠内)で表示されるuser、passwordを入力。

<img width="1334" alt="スクリーンショット 2017-03-17 14.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/b0ef5cc2-555c-7575-a15a-38d32a9f2e39.png">
アクセス完了。各種情報の閲覧はもとより、yamlのuploadまでできる。


# Auto scale
続いてチーム内でも関心の高いAuto scaleだが、せっかく上述でdashboardを立ち上げたので、podのスケール状況をみながら進めていくことにする。

まずは現在のpodの状況
<img width="623" alt="スクリーンショット 2017-03-17 14.36.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/34029d5b-bafa-4aad-b94b-b5c73b240d42.png">

```bash
kubectl scale rc nginx --replicas=4
```
で4podsにスケールアウトしたが、しばらく時間が経過したのでもとに戻っている。

それではAuto scale設定。
今回はわかりやすいようにpodの消費するcpuが1%を超えたらスケールアウトするように設定する。
クラウドシェルで以下のように設定。

```bash
kubectl autoscale rc nginx --min=2 --max=10  --cpu-percent=1
```
pod数2〜10でスケールアウトするように設定。

実際に負荷をかけてみる今回はApache Benchを使ってローカルのマシンからnginxのwelcomeページに負荷をかけてみる。

```bash
ab -n 3000 -c 2000 http://[serviceのip]/
```

すると

<img width="780" alt="スクリーンショット 2017-03-17 14.48.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/fac0d55f-c2ec-c0f8-6dd2-86ce9ef46caf.png">

podが2個ふえた。

当然だが、しばらくアクセスしないとまたもとに戻る。まぁ便利。

# 所感
StatefulSetsの件（[前回の投稿](http://qiita.com/tstakano-yj/items/1e27dfa5210095805c84)参照）はあるが、例えばプレ層とAPIをコンテナ化して、１つのpodにまとめると相当運用楽でしょうね。もともとそういう使い方を想定しているでしょうし。loggingはCloudLoggingでまとめられるし、それをBigQueryにもワンタッチでexportできる。痒いところに手が届いてますね。自分たちでこういったインフラを作る意味を全く感じさせません。我々のチームも有効に利用して大きな成果を上げていこうと思います。
John the Ripperを使ってパスワードを解析する

## はじめに

悪用厳禁です。
必ず合法的かつ組織的な合意を取った上で実行してください。
またパスワードを解析することが主目的ではなく、「（平易な）パスワードの解析は容易である」ということを明らかにするためのデモンストレーションとして利用してください。

## John the Ripperをインストールする

まずはインストールから。手元ではKali Linuxで実行したので最初からインストール済み、Debian系ならパッケージが提供されているのでapt-getでサクッとインストールできます。
`$ sudo apt-get install john`

なおMacの場合は
`$ brew install john`
でインストール可能です。
CentOSとかのRedHat系は試してませんが、標準のレポジトリには入ってないらしいので、EPEL辺りから探してこないといけないようです。

## 暗号化されたパスワードを入手する
データベースの中に暗号化されて保存されている場合は、それをそのまま持ってくればOKでしょう。フォーマットとしては「ユーザ名:暗号化されたパスワード」の形式で整形します。
ソルト付きの暗号方式の場合は、ソルトもセットでわからないと解析は実質不可能です。まあだからこそソルトの有用性が叫ばれるわけですが。

### LDAPのuserPasswordを使う
ここではLDAPサーバからパスワードだけぶっこ抜きます。ワンライナーで書くとこんな具合。パスワードはハッシュ化した上でさらにBASE64でエンコードされてるので、これをデコードして整形します。

`# slapcat | awk 'BEGIN{uidFound=0};$1 ~ /^uid:/{uid=$2;uidFound=1};$1 ~ /^userPassword::/ && uidFound == 1{printf uid":";system("echo " $2 "|base64 -d"); print "";uidFound=0};$0 == ""{uidFound=0}' > password.txt`

中身はこのような感じになります。この場合はsalted-sha1ですね。
`hogefuga:{SSHA}OyxsENDngHLRTgLMTFh4FNDxDzo=`

### LDAPのsambaNTPasswordを使う
Sambaサーバの認証をLDAPで行っている環境の場合、userPasswordではなくsambaNTPasswordを使うという手もあります。

`# slapcat | awk 'BEGIN{uidFound=0};$1 ~ /^uid:/{uid=$2;uidFound=1};$1 ~ /^sambaNTPassword:/ && uidFound == 1{printf uid":";system("echo " $2 ""); print "";uidFound=0};$0 == ""{uidFound=0}' | sed 's/:/:$NT$/g' | sed '/^$/d' > sambant_password.txt`

中身はこのようになります。

`hogefuga:$NT$480F97CE40A2C72826C293D71BA565E0`

## いざ、実行！
[公式のオプション](http://www.openwall.com/john/doc/OPTIONS.shtml)などはこちらを参照。

`$ /usr/sbin/john --fork=4 --format=salted-sha1 password.txt`

--formatオプションは指定しなくても自動判別して上手いことやってくれます。暗号化方式によってはプレフィックスの部分を調整・整形しないといけない場合があります。
--forkは解析に同時実行するプロセス数を指定できます。利用するマシンのコア数などに併せて適宜指定すると、解析速度に影響します。
モードの指定をしない場合は、singleモード・wordlistモード・incrementalモードの順に実行されます。最終的に総当りを試みるため、複雑なパスワードの場合はとんでもなく無制限に時間がかかりますので、バックグラウンドで実行するとかscreenを起動してから実行するとかした方がよいです。実行するマシンのスペックと暇さにもよりますが、1週間実行しても完走しなかったら挫折するかな。

実行のログと解析に成功した文字列については
`~/.john/john.log
~/.john/john.pot`
にそれぞれ記録されます。

`$ /usr/sbin/john --show password.txt`
と実行すれば解析済みのパスワードを再確認できます。

## 辞書の設定
/etc/john/john.confである程度の設定ができます。と言ってもあまり設定のしがいのある項目はありません。
wordlistモードで辞書ファイルを指定しない場合は、john.confの設定に従うようで、デフォルトでは/usr/share/john/password.lstが指定されますが、これは3559行しかないのでこの辞書にヒットするようなら噴飯モノです。
開発元の[OpenWallからは4000万語のリストが27.95ドルで販売されてる](http://www.openwall.com/wordlists/)ので、これを買ってみるというのもまた一興かも。ただし英語由来の単語が大半で、日本語由来のものも10万ほど含まれていますが、まあ微妙と言えば微妙です。

なおwordlistモードの場合、辞書にある単語との完全一致しかヒットしない模様。incrementalモードの時に「辞書単語+1文字」とかはヒットするけど、辞書を参照した総当りをしているのかはよくわからん。

## 最後に
実行するパスワードリストの「意識の高さ」によりますが、一定の条件下で時間をかけさえすればだいたい解析できます。具体的には、ランダム文字列でも文字種が少ない（小文字と数字だけ）とか、そもそも文字数が8文字以下とかですね。もちろん理論的には果てしない時間をかければ解析はできるんでしょうけど、どの辺りを解析が非現実的だとするのかは難しいところです。手元で実行した範囲では、一般的にボーダーラインと言われる8文字でもそこそこの時間で解析できるものはできます。
なので、よく情報漏洩のニュースで「パスワードも流出しましたが暗号化されています」と言われても、単なるハッシュ化程度では解析可能なので、実質無意味です。

暗号化されたパスワードですら、平易なら現実的な実行時間で解析できてしまうという事実を前にどうするかというのは、それぞれの人次第。せめて自衛として自分の使うパスワードは長くて複雑なものにするというのも良し、組織内での啓蒙活動を行うも良し、関わっているサービスで強力なパスワードを強いるようにするのも良し。いずれにせよ、この解析の簡単さはもうちょっと世に知らしめてもいいと思います。
サービス実装の観点からは、そもそも漏洩しないような対策をすることはもちろんですが、ソルトを付けるとかストレッチングをするというのはそれなりに有効でしょう。
How to Use Environment Variables in Ruby On Rails

■Japanese Version↓
[RubyOnRailsで環境変数を使用する方法]
(https://qiita.com/alokrawat050/items/c68ec9578c12fe5a93a3)

# Environment Variables
Every applications require a configuration settings such as email account credentials or API keys for external services(security purpose). You can pass local configuration settings to an application using environment variables.
There are several methods to use the environment variables in Ruby On Rails and also we have a gem like a Figaro Gem.

# Keep Your Environment Variables File As a Private
If you are using the GitHub, to store and share code and your project is open source,it means any developer will have access to your code. You don’t want to share your private details or API keys with the public. If you are collaborating on a team with a private git repository, your local settings may not be suitable for all members of the team. 

# Using a local_env.yml File:
We will create a simple file that contains key/value pairs for each environment variable using the standard YAML file format. 

**Create a file config/local_env.yml:**
'# makes 'Your_Gmail_Username' available as ENV["GMAIL_USERNAME"]

```yaml
MAIL_USERNAME: 'Your_Username'
MAIL_PASSWORD: 'Your_Password'
```
**Setting in .gitignore**
If you have created a git repository for your application, your application root directory should contain a file named .gitignore.
add below line in your .gitignore file.

```
/config/local_env.yml
```

This prevents the config/local_env.yml file from being checked into a git repository and made available for others to see.

**Rails Application Configuration File**
After setting env variables,we have to set local_env.yml file into config/application.rb file.
in the config/application.rb file:
add the below code:

```rb
config.before_configuration do
  env_file = File.join(Rails.root, 'config', 'local_env.yml')
  YAML.load(File.open(env_file)).each do |key, value|
    ENV[key.to_s] = value
  end if File.exists?(env_file)
end
```
The above code sets environment variables from local_env.yml file.

**Use environment variables in your code**
Use ENV["MAIL_USERNAME"] anywhere in a Rails application. 
for example,

```rb
ActionMailer::Base.smtp_settings = {
    address: "smtp.gmail.com",
    enable_starttls_auto: true,
    port: 587,
    authentication: :plain,
    user_name: ENV["MAIL_USERNAME"],
    password: ENV["MAIL_PASSWORD"],
    openssl_verify_mode: 'none'
    }
```
Enjoy Coding.

**Thanks & Best Regards,
Alok Rawat**
Stripeのカスタマーを作成するときはStripeIDを必ず控えておく


Stripeのカスタマーはメールアドレスで一意性をとっているというわけではなく、同じメールアドレスでも`stripe.customers.create()`を複数回実行するとその度にカスタマーが作成される。

![スクリーンショット 2017-03-17 14.23.28.png](https://qiita-image-store.s3.amazonaws.com/0/23936/dc4e3b56-15a3-38af-0627-a2a7f9a28591.png "スクリーンショット 2017-03-17 14.23.28.png")

カスタマーとメールアドレスを一意に保つには、Stripe IDで参照できるようにしておく必要がある。Stripe IDは`stripe.customers.create()`の戻り値のidに入っている。

## カスタマー作成後にStripe IDを取得するサンプル
```js
const stripe = require("stripe")(
  "sk_test_XXXXXX"
);

const customers = {
  'email': 'customer1@example.com'
}

stripe.customers.create(
  customers,
  function(err, customer) {
    if(err) {
      console.log(err)
    }
    console.log(customer.id)
  }
);
```

このStripe IDで`stripe.customers.retrieve()`することでカスタマーの存在を確認できる。

## カスタマーが存在しない場合のみ、カスタマーを作成するサンプル
Stripe IDが存在しない場合、`stripe.customers.retrieve()`のエラーに`message: 'No such customer: STRIPE_ID'`という値が入っているので、それを見てカスタマーの有無を確認できる。

```js
const stripe = require("stripe")(
  "sk_test_XXXXXX"
);
var customers = {
  'stripeId': 'cus_XXXXXX',
  'params': {
    'email': 'customer1@example.com',
    'description': 'This is example customer',
    'metadata': {
      'sampleKey': 'sampleValue',
      'sampleKey001': 'sampleValue001'
    }
  }
}

stripe.customers.retrieve(
  customers.stripeId,
  function(err, customer) {
    if (err) {
      if (err.message == 'No such customer: ' + customers.stripeId) {
        // カスタマーを新規に作成する
        stripe.customers.create(
          customers.params,
          function(err, customer) {
            if(err) {
              console.log(err)
            }
            console.log(customer)
          }
        )
      } else {
      	 // ここはカスタマーが存在しない場合以外で出たエラー
        console.log(err)
      }
    } else {
      // カスタマーを更新する
      stripe.customers.update(
        customers.stripeId,
        customers.params,
        function(err, customer) {
          if(err) {
            console.log(err)
          }
          console.log(customer)
        }
      )
    }
  }
)
```

多分Promiseとか使っていい感じにラップしてやったほうがわかりやすい。
Facebook APIのバージョンを2.2から2.3へ上げる時の落とし穴

## はじめに
FacebookのAPIは定期的に古いバージョンのAPIが使用不可になると共に、APIのバージョンが強制的にアップグレードされます。その際には事前にFacebookより「（アプリ名）の新しい開発者アラート」というメールが届き、いついつまでにバージョンを上げろ（上げないと勝手に上げるよ）という指令が届きます。

例えば2017/02/28には「2017/03/27までにAPIのバージョンを2.3以上にしなさい」というメールが、Facebookより配信されました。

ここでは具体例として、omniauth-facebookを使っている際（Deviseと併用している時含む）、使用するFacebook APIのバージョンを2.3以上にする時に必要なことを説明します。

その他のライブラリを使っている方は「落とし穴の説明」をご覧になって、自前で対応いただけると幸いです ( _ _)

## 落とし穴の説明
結論としては[Facebook APIの仕様がバージョン2.3未満と2.3以上で異なり](https://github.com/mkdynamic/omniauth-facebook/issues/204#issuecomment-153395375)、2.3以上ではアクセストークンAPIのレスポンスフォーマットが異なるので、受け側もそれに対処しなければならないという問題です。レスポンスがJSONで返ってくるようになってるので、パースしてトークンを取り出してあげる必要があります。

Facebook公式の該当[Change Log](https://developers.facebook.com/docs/apps/changelog?locale=ja_JP#v2_3)は以下になります。

> [OAuthアクセストークン]フォーマット - access_tokenのコードを交換した際に返されるhttps://www.facebook.com/v2.3/oauth/access_token の応答フォーマットが、**URLエンコードされるのではなく、有効なJSONを返すようになりました**。 この応答の新しいフォーマットは、{"access_token": {TOKEN}, "token_type":{TYPE}, "expires_in":{TIME}}です。RFC 6749のセクション5.1に準拠するために、このアップデートを行いました。

[Upgrade Guide](https://developers.facebook.com/docs/apps/upgrading#v22tov23)は以下。

> Manually Build a Login Flow
> If you build your own Login flow, there is an update to the OAuth code exchange that now conforms to the latest OAuth RFC spec. See details in the changelog entry, see Facebook Platform Changelog, API version 2.3.

2.2以下にしか対応していないライブラリでこの問題に遭遇すると、例えば以下のようなエラーが出力されることがあります。返ってきたレスポンスであるJSONを丸々トークンとして使おうとしているので、invalid credentialsエラーが出ています。

```
E, [2017-03-17T14:37:04.698743 #71992] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials: OAuth2::Error, :{"access_token":"xxx","token_type":"bearer","expires_in":000}
```

## 対応の具体例
APIのバージョンを現在（2017/03/17）の最新である2.8に上げる場合を説明します。ポイントはどちらも`token_params: { parse: :json }`です。以下はomniauth-facebookを使っている場合です。

### Deviseと併用している場合

```ruby:config/initializers/devise.rb
  config.omniauth :facebook, ENV['APP_ID'], ENV['APP_SECRET'], image_size: :large,
    client_options: {
      site: 'https://graph.facebook.com/v2.8',
      authorize_url: "https://www.facebook.com/v2.8/dialog/oauth"
    },
    token_params: { parse: :json },
    info_fields: 'name,email' # 取得情報がバージョンアップに伴い絞られているので、必要な場合はこちらも
```

### omniauth-facebook単体の場合

```ruby
use OmniAuth::Builder do
  provider :facebook, ENV['APP_ID'], ENV['APP_SECRET'],
    client_options: {
      site: 'https://graph.facebook.com/v2.8',
      authorize_url: "https://www.facebook.com/v2.8/dialog/oauth"
    },
    token_params: { parse: :json },
    info_fields: 'name,email' # 取得情報がバージョンアップに伴い絞られているので、必要な場合はこちらも
end
```

もしくは、omniauth-facebook gemのバージョンを4.0.0以上に上げることでも対応できます（[修正コミット]((https://github.com/mkdynamic/omniauth-facebook/pull/245/files#diff-999bca448145eb14d3025d6b5dff0048L20))）。
連番画像を動画として再生するHTML5アプリ

複数の連番画像を一連のアニメーションとして再生するだけのごく単純なHTML5アプリです。
Chrome v56, Firefox v52にて動作確認しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/152179/d87781d7-ff36-2b8d-0fdc-1cea700ba808.gif" height="300">

---

[実行サンプル(jsdo.it)](http://jsdo.it/a-nakanosora/6YG5/fullscreen)

ダウンロード＆使い方はGitHubからどうぞ：
https://github.com/a-nakanosora/Image-Sequence-Animation-Preview

## 用途
いくつかのソフト(Blenderなど)で出力された動画の元となる連番画像を、動画形式に変換する手間なく手軽にプレビュー表示したいときに

## 注意点
メモリ効率が悪いため、巨大な画像を数百枚開くとメモリ使用量が大変なことになる危険性があります
[GoogleComputeEngine]GCEにてf1-microを利用してWPを運用した結果(状況、料金等)

超お久しぶりです！
racheです！
最近更新をさぼっていたので、ブログの方からネタを一つ。

#wordpress運用サーバの状況について f1-micro（vCPU x 1、メモリ 0.6 GB）

まず初めにwordpressの状況を。
topで見た時の状況です。

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/146205/b4ad4a7c-df8c-6e10-35bc-3cf0fe3d8eaa.png) 

一番安いプランをわざと選択してるので、ロードアベレージがやばいことになってます。
正直、個人ブログの運用にも耐えないレベルです。
また、CPUも常時90％超えとすっごく恐ろしいことになっています。

まあ、ほぼほぼapacheが悪いんですけどね…
nginxとか使ったらもうちょっと軽量化できるのかしら。

#GCPの毎月の請求額について(f1-micro)

今現在利用しているのはこんな感じです。

GCP:
f1-micro（vCPU x 1、メモリ 0.6 GB）
スナップショット:10GB利用

請求額は以下。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/146205/99b56b9f-f142-78c9-0f02-0dbe6136e83f.png)


大体一月800円ほどでroot付きサーバ（ただしゴミスペック）を運用できています。

請求金額詳細は以下。

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/146205/735d8906-1c22-145c-545c-80a8981415a9.png)

一番、使っているのは、GCEの利用料金。
774円となっています。

ただし常時稼働なので30％の割引がかかり、542円となってます。
（GCEには稼働時間による割引があります）

また、ネットワーク間のトラフィック通信料が114円、スナップショットの料金が78円かかってます。
(正直、中国にアクセスしてるけど意味わかんない…)

為替レートにて金額が変わっていくので、費用にばらつきがあるから怖い…

#f1-microでブログを運営してはいけない（戒め）

11月ごろからGCEの最低料金でブログを運営していますが、

正直f1-microで運用するのは難しいと感じます。
apacheがメモリを食って、mysqlがメモリ使い過ぎで落ちるからです。

StackDriverという無料監視ツールを利用していますが、
鯖止まったよアラートがすっごいたくさん来ます。ほんとつらい…

~~あまりにも、稼働時のエラーが多いのでもう一つ上のプランの
g1-small「（vCPU x 1、メモリ 1.7 GB）」
に変更をかけました。
今後、どのくらいの費用が掛かってくるのかを見ていきたいなと思っています。
(気が向いたら記事にしたいです)~~

何とか解決しました。
詳細は追記に記載しています。

そんな感じです！

# 追記

自環境の軽量化をしたらどうにかなったので追記します。

・php5.3→php7.1にバージョンアップ
・OPcacheの導入
・mysqlの設定ファイルの改善

上記を行うと、以下のような感じでf1-microでもある程度改善は見込めます。
ただ、お客さんに出す環境としては難しいです。
また、落ちる可能性も無きにしも非ずなのでお勧めできません。
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/146205/0651caf2-cd49-d90e-1648-36d145933a1e.png)


![image1.png](https://qiita-image-store.s3.amazonaws.com/0/146205/ad931ef7-ab51-bc0d-e2ad-0571b2138b02.png)

…案の定、DBに接続するページでDOSしたら落ちたよ…ママン。
DB側のチューニングも課題に追加しないとなぁ

#直近のインスタンス料金も出してみた(2019年1月)
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/146205/4dda7e73-553a-e66f-0d57-1128d522dac9.png)

1月の料金が安いのは、「asia-northeast1」のリージョンで利用していたインスタンスを、
無料枠のある「us-central1-b」に移行したからです。
まだ移行して全然たってないけど、とてつもなく安くなってるんだろうなぁ…
XAMPP for Mac 環境にOpenPNE3をインストール

ローカル環境でOpenPNEを動かしたかったので、やってみました。

バージョンは以下の通り

|MacOS|XAMPP|OpenPNE|
|---|---|---|
|Sierra|5.6.30|3.8.23|

# XAMPP環境を用意する
## インストール
公式サイト　https://www.apachefriends.org/jp/index.html

インストーラーをダウンロードして、XAMPPをインストールします。
手順は省略。

## Apacheの実行ユーザーを変更
Apacheの設定ファイルを開きます。

    vi /Applications/XAMPP/xamppfiles/etc/httpd.conf

UserとGroupが`daemon`になっているので、以下の例のように管理者権限のある任意のユーザー名に変更します。
変更後は、XAMPPのApplication ManagerからApacheを再起動してください。

```
<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.  
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User username
Group admin
</IfModule>
```
この設定を変えておかないと、OpenPNEのcacheの書き込み権限でエラーが出ます。

# OpenPNEをダウンロード

公式サイト　http://www.openpne.jp/pne-downloads/

解凍したフォルダを`/Applications/XAMPP/xamppfiles/htdocs/`に置いて、フォルダ名を適当に変更します。
ここでは`OpenPNE3`とします。

ディレクトリに移動

    cd /Applications/XAMPP/xamppfiles/htdocs/OpenPNE3

以下のファイルをコピー

    cp config/ProjectConfiguration.class.php.sample config/ProjectConfiguration.class.php

さらに、以下のファイルをコピーして編集

    cp config/OpenPNE.yml.sample config/OpenPNE.yml

    vi config/OpenPNE.yml

OpenPNE.ymlの`base_url`を変更します。

    base_url: "http://127.0.0.1/OpenPNE3"

# データベース作成

XAMPPのApplication ManagerからMySQLを起動してPHPMyAdmin（`http://localhost/phpmyadmin/`）を開き、データベースを作成します。
ここでは`openpne_db`とします。

# OpenPNEをインストール

OpenPNE3ディレクトリでインストールコマンドを実行

    ./symfony openpne:install

以下の項目を入力するとインストールが始まります。

```
Choose DBMS : mysql
Type database username : root
Type database password (optional) : （なし）
Type database hostname : 127.0.0.1
Type database port number (optional) : （なし）
Type database name : openpne_db
Type database socket path (optional) : （なし）
Is it OK to start this task? (Y/n) : Y
```

# ログイン画面にアクセス

無事インストールが終了したら、ログイン画面にアクセスしてログインできるかどうか確認します。

- ユーザー用ログイン画面
http://localhost/OpenPNE3/web/
メールアドレス : `sns@example.com`
パスワード : password
　

- 管理画面
http://localhost/OpenPNE3/web/pc_backend.php
アカウント名 : admin
パスワード : password

---
cacheのエラーが出る時は、以下を試すとうまくいくかも。

```
rm -rf cache/*
chown 777 cache/
```

## 追記

デバッグモードにすると大量にNoticeエラーが出まくるので、よく確認してみるとOpenPNEの最新版で使われているSymfonyのバージョンは1.4.13でした。
Symfony1系の最新バージョン1.4.20に更新すればいくつかエラーは消えますが、そもそもSymfony1系は2012年で更新が終了しているので、あまり意味がない感じ。
PHP5.6環境下でも一応、動いています。
Windowsでのpostgresqlのデータベースのセットアップ用のバッチについての質問

Postgresqlのデータベースのセットアップ用のバッチを作成することになったのですが、DBが存在すればCreateのバッチ、存在しなければAlterのバッチを実行するように指示されています。
DBの存在チェックの方法が分からないのですが、スキーマが数個あり、そのうちの一つだけの存在の有無だけで判定するとすればどうすればよいでしょうか。
また他にもっと良い方法があればおしえていただけないでしょぅか。
よろしくお願いいたします。
RetinaディスプレイでVirtualBox上のWindows10を使うときに、フォントがぼやけてしまう問題の解決方法

久しぶりにVirtualBoxを触ったら、新オプションの追加でかなり簡単になっていたのでメモ。

## 環境情報

### ホスト
* MacBook Pro (Retina, 15-inch, Late 2013)
* macOS Sierra 10.12.1

### 仮想化ソフト
* VirtualBox 5.1.18 r114002 (Qt5.6.2)
    * デバイスメニューより、**Guest Additions インストール済み**

### ゲスト
* Windows 10 Home


## 事象

Retinaディスプレイの解像度の問題で、Windowsをセットアップ直後はフォントがぼやけてしまう（にじんでしまう）。


## 解決方法

以前はWindows側で画面の解像度の選択肢を増やしたり対応していたが、VirtualBoxのオプションで簡単に解決できるようになった。手順は次の通り。

1. MacのVirtualBoxの設定画面から**「スケールしないHiDPI出力を使用」**を**有効**にする。
<img width="1045" alt="i1" src="https://qiita-image-store.s3.amazonaws.com/0/170816/d083e3fb-a6e9-2502-fcb8-16383515908b.png">
⇒ この段階でフォントのぼやけはなくなるものの<font color="Red">アイコンやフォントがかなり小さく感じる。</font>

2. Windowsの「デスクトップを右クリック＞ディスプレイ設定」から、**「テキスト、アプリ、その他の項目のサイズを変更する」**をお好みで設定する。個人的には200%ぐらいがちょうどいい感じ。
<img width="1128" alt="i2" src="https://qiita-image-store.s3.amazonaws.com/0/170816/a80860c6-4d31-bb7a-f616-c9b8c6220e7e.png">

3. 表示を確認して完了。
<img width="1110" alt="i3" src="https://qiita-image-store.s3.amazonaws.com/0/170816/08d1b848-1ccd-70b4-ed15-0f0ea47727b4.png">

## 補足

「スケールしないHiDPI出力を使用」オプションは、VirtualBox5.0から追加されているそうです。
https://orablogs-jp.blogspot.jp/2015/07/oracle-vm-virtualbox-50-officially.html
【PHP】コンストラクタの引数を取得してオブジェクトを注入

#ReflectionClassを使ってオブジェクトを注入

サンプルとして、UserServiceにReflectionClassを使ってUserRepositoryを注入します。

##サンプルクラス

```UserService.php
class UserService
{
    /**
     * @var UserRepository
     */
    private $repo;

    /**
     * UserService constructor.
     * @param UserRepository $repo
     */
    public function __construct(UserRepository $repo)
    {
        $this->repo = $repo;
    }

    /**
     * @return User
     */
    public function getUser()
    {
        return $this->repo->getUser();
    }
}
```

```UserRepository.php
class UserRepository
{
    /**
     * @return User
     */
    public function getUser()
    {
        // サンプルなので直接生成して返す
        return new User('User Name');
    }
}
```

```User.php
class User
{
    /**
     * @var string
     */
    private $name;

    /**
     * User constructor.
     * @param $name
     */
    public function __construct($name)
    {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}
```

## 実際にやってみる

```main.php

#ReflectionClass生成
$reflection = new \ReflectionClass(UserService::class);

$args = [];

# コンストラクタが定義されているか
if ($reflection->hasMethod('__construct')) {

    /**
     * コンストラクタの引数取得
     *
     * @var \ReflectionParameter[] $parameters
     */
    $parameters = $reflection->getConstructor()->getParameters();

    # 引数に指定されているオブジェクトの生成
    $args = array_reduce($parameters, function ($args, $parameter) {
        /**
         * 引数に指定されているClassの取得して生成する
         * 
         * @var \ReflectionClass $parameterClass
         */
        if ($reflectionClass = $parameter->getClass()) {
            $className = $reflectionClass->getName();
            $args[$parameter->getName()] = new $className;
        }

        return $args;
    }, []);
}

/**
 * ReflectionClassを使用してUserServiceを生成
 *
 * @var UserService $userService
 */
$userService = $reflection->newInstanceArgs($args);

$user = $userService->getUser();

var_dump($user->getName());
// string(9) "User Name"

```

今回は簡単なサンプルですがもうちょっとちゃんとしたのを[GitHub](https://github.com/su-mi-lab/Persona)に置いてみました！
[俺の備忘録シリーズ] DataTablesを使ってサーバーサイドのページネーション


## 準備
CakePHP2でAjaxでjson使うので、.jsonでアクセス出来るようにする

```php:route.php
Router::parseExtensions('json');
```

jsを読み込む

```php:index.ctp
<?= $this->Html->script('https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js') ?>
```

## クライアントサイド実装
とりあえず、Userテーブルの名前だけを出す感じのTableをコーディング

```html:index.ctp
<table id="table">
	<thead>
		<tr>
			<th>名前</th>
		</tr>
	</thead>
	<tbody>
	</tbody>
</table>
```

サーバーサイドでページネーションをする場合は、serverSideをtrueにする

```javascript:index.ctp
$(document).ready(function() {
	$('#table').DataTable({
		"ajax": "/hoge/read_users.json",
		"dataSrc": "data",
		"columns": [
			{ data: "name" },
		],
		"serverSide": true,
	});
});

```

## サーバーサイド実装

Ajax使うので、コントローラにRequestHandlerを追加

```php:HogeController.php
var $components = ['RequestHandler'];
```

メソッドの追加

```php:HogeController.php
public function read_users() {
  if (!$this->request->is('ajax')) {
    throw new BadRequestException('そこはダメよ！');
  }
  $this->response->header('X-Content-Type-Options', 'nosniff');
  // 単独テーブルアクセス
  $options = [
    'recursive' => -1,
  ];
  // 全件数取得
  $count = $this->User->find('count', $options);
  // クライアントから送られてきたページ位置をセット
  $options['offset'] = $this->request->query('iDisplayStart');
  $options['limit'] = $this->request->query('iDisplayLength');
  $options['page'] = 0;

  $data = $this->User->find('all', $options);
  // TODO: エラー処理
  $data = Hash::extract($data, '{n}.User');

  $this->set('draw', $this->request->query('sEcho'));
  $this->set('recordsTotal', $count);
  $this->set('recordsFiltered', $count);
  $this->set('data', $data);
  $this->set('_serialize', [ 'draw', 'recordsTotal', 'recordsFiltered', 'data' ]);
}
```
Express4でpublic以下のstaticファイルにBasic認証をかける

express-generatorを使って、Expressプロジェクトを生成した場合、プロジェクトフォルダ以下に静的ファイル置き場として*public*が作成されます。(一般的なExpressプロジェクトのディレクトリ構成)
この記事では、この*public*以下に配置した静的コンテンツのみにBasic認証をかける方法を紹介します。

##必要パッケージ
必要なパッケージをインストールしておきます。

```
$ npm install serve-static
$ npm install http-auth
```

##app.jsの変更

requireします

```js:require.js
const serveStatic = require('serve-static');
const auth = require('http-auth');
```

ミドルウェアの定義

```js:defMiddleware.js
let basic = auth.basic({
  realm: "fail"
}, (username, password, callback) => {
  callback(username === "root" && password === "pass");
});

let authMiddleware = auth.connect(basic);
```

ミドルウェアの読み込み

```js:useMiddleware.js
app.use('/', authMiddleware, serveStatic(__dirname + '/public'));
```
Pepperディスプレイのスクリーンショットを取得

#この記事の内容
　Pepperのアプリ開発でスクリーンショットを取得したいことがあります。PepperのディスプレイはWebブラウザになっており、PC側で該当ファイルを開きスクリーンショットを撮る方法がありますが、レンダリング結果が違うため根本的な解決策にはなりません。
　以下で紹介する方法で本物のスクリーンショットが取得可能です。
#前提条件
 - Pepper
 - NAOqi 2.4.3（今回は一般販売モデルで試しましたが、OSが2.4.3であればモデルは関係ないと思います）
 - SSHクライアント

##検証環境
Mac OS：10.10.5
NAOqi：2.4.3
#手順
1.SSHクライアントからPepperにログインします。
2.以下のコマンドを入力し、実行します。

```sh:
Pepper> /var/www/apps/j-tablet-browser/adb shell screencap -p | sed 's/\r$//' > ~/display.png
```

3.ユーザーnaoのホームディレクトリにファイル display.png が作成されます。
4.ユーザーのホームディレクトリからスクリーンショットファイルを取得できます。

```sh:
PC> scp nao@<pepper.local>:~/display.png ~/
```
Xcode8.2.1でThe certificate used to sign "アプリの名前" has either expired or has been revoked. An updated certificate is required to sign and install the application.

#エラー内容

The certificate used to sign "アプリの名前" has either expired or has been revoked. An updated certificate is required to sign and install the application.


# 解決方法

Xcode -> Preference -> Account -> ViewDetails -> Download All


# 参考

http://qiita.com/90_jill/items/1303dc41ab0b9c3a4056
Cent OS 6 でWifiに接続する方法

# はじめに
## 環境
OS：Cent OS 6
　インストールタイプ：Basic Server

アクセスポイント：
　認証方式：WPA2-PSK
　暗号化の方式：WPA2

## 実行ユーザ
　全てのrootユーザで実行

# 無線のインターフェイスが認識されているか確認

```bash:コマンド
iwconfig
```

以下の様な結果になれば認識されています

```text:結果
wlan0     IEEE 802.11bgn  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=0 dBm
          Retry short limit:7   RTS thr=2347 B   Fragment thr:off
          Power Management:on

eth0      no wireless extensions.

```

# 無線を有効にするための設定

## WPAのクライアントをインストール

```bash:コマンド
yum install wpa_supplicant
```

## ネットワーク・インターフェイスの設定

無線のファイルがない場合は下記のファイルを作成する
ネットワークインターフェイスそのものの設定を行うファイル
必要に応じてIPアドレスやサブネットマスクなども指定できる
今回はDHCPでIPアドレスが自動的に割り振られるため、IPアドレスの設定等は行っていない

```text:ファイル名
/etc/sysconfig/network-scripts/ifcfg-wlan0
```
```text:内容
DEVICE=wlan0
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Wireless
MODE=Auto
ESSID=XXXXXXXXXXXXXXXX
IPV6INIT=no
NAME="System wlan0"
```

ESSIDの「XXXXXXXXXXXXXXXX」にアクセスポイントのSSIDを設定する

## アクセスキーの暗号化

アクセスポイントに接続するときのキーを暗号化する

```text:コマンド
wpa_passphrase "SSID名をここに記述" "アクセスキーをここに記述"
```

```text:実行結果
network={
        ssid="SSID名が表示"
        #psk="暗号化前のアクセスキーが表示"
        psk=暗号化されたアクセスキーが表示
}
```

標準出力で出た結果を、接続するネットワークの設定を記述するファイル、『/etc/wpa_supplicant/wpa_supplicant.conf』に保存する
併せて必要となる設定も追記しておく

完成イメージは下記の通り

```text:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

network={
        ssid="SSID名"
        #psk="暗号化前のアクセスキー"
        psk=暗号化されたアクセスキー

        key_mgmt=WPA-PSK   # 暗号化キー管理方式
        proto=WPA WPA2 # 暗号化の方式
}
```

## 起動時に無線を有効にする

『/etc/rc.d/rc.local』へ起動時に実行するコマンドを追記する
『rc.local』に記述した内容は起動時に1回実行される
編集後の例

```text:/etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -iwlan0 -B
ifup wlan0 
```

すべての設定が完了したら、再起動する

# 接続先を変更したい場合

以下を修正する
　1. /etc/sysconfig/network-scripts/ifcfg-wlan0
　   SSIDを変更
　2. 『wpa_passphrase "SSID" "キーワード"』でキーワードを暗号化する
　3. 『/etc/wpa_supplicant/wpa_supplicant.conf』に２．で暗号化したキーワードとSSID、暗号化の方式等を必要に応じて変更
　4. 再起動
ssh_config とは > コマンド入力の手間を省いてくれるエイリアス設定

# ssh_config とは

単なるエイリアス設定のようなものだ、と考えるのが分かりやすいと思う。(単純な使い方では)
「これを書くことで、魔法のようにどこかにアクセスできるようになる」わけではない。

# 基本

たとえば、以下のコマンドでアクセスできる接続先があるとする。

```bash
ssh example.com
```

```bash
Hi yuma! welcome to example.com
```


## 設定

ssh_configを書くと、この example.com に対して、別名でアクセスできるようになる。

```bash:~/.ssh/config
Host my_favorite_server
  HostName example.com
```

Host と Hostname があって、**どっちがどっちだよ！** って非常に分かりにくいと思うが、

- 先頭に書く `Host` がエイリアスの名前
- `Hostname` が実際の接続先

という書き方だ。

## 実行

```bash
ssh my_favorite_server
```

```bash
Hi yuma! welcome to example.com
```

## バリエーション

これはエイリアスみたいなものなので、同じ接続先への設定を、いくつも書くことも出来る。
使える文字もわりと自由だ。

```:~/.ssh/config
Host my_favorite_server
  HostName example.com

Host Hey~Jude-don't-let-me-down
  HostName example.com
```

どちらでも同じ結果。

```bash
ssh my_favorite_server
```

```bash
Hi yuma! welcome to example.com
```


```
ssh "Hey~Jude-don't-let-me-down"
```

```bash
Hi yuma! welcome to example.com
```

## 接続先の上書き

エイリアスに別の接続先(かのように見えるような文字列)を書くことも出来てしまう。
この場合はエイリアスが優先されて、本来の接続先には、普通にはアクセスできなくなってしまうので注意だ。

```:~/.ssh/config
Host example.net
  HostName example.com
```

example.net にアクセスしようとしたはずなのに....

```
ssh example.net
```

example.com にアクセスしてしまう。

```bash
Hi yuma! welcome to example.com
```

（挙動が分かってさえいれば、使い所があると思う）

# デフォルトの指定

デフォルトのユーザーなどを指定できる。

```:~/.ssh/config
Host my_favorite_server
  HostName example.com
  User inaura
```

ログインユーザーが変わる。

```bash
ssh my_favorite_server
```

```bash
Hi inaura! welcome to example.com
```

ただし、コマンドの指定の方が優先される。

```bash
ssh yuma@my_favorite_server
```

```bash
Hi yuma! welcome to example.com
```

# 他にも

- 秘密鍵のパスを指定できたり、色々出来るので調べてみてください。
















<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
「Ruby on Rails」 rescue_fromで例外を捕捉できない

はじめまして、

話題の件なんですが、下の記事も参考しましたが、MySql::Errorの例外を捕捉できないです。

# 参考した記事：
- http://qiita.com/r7kamura/items/2e88adbdd1782277b2e7
- http://qiita.com/ma2ge/items/938d9f8f4839eb336318

# 現時点発生エーラ![error-sql.PNG](https://qiita-image-store.s3.amazonaws.com/0/159866/01733600-f995-2108-8754-4e08889e9705.png)

# Enviroment
  Ruby: 2.2.0
  Rails: 4.2.1

ちなみにenv["action_dispatch.exception"]を検討しますか、この変数は存在しないです。

みなさん、なんか例外を捕捉できる方法がありますか？
Node.jsでStripeのカスタマーを追加する


Stripeで決済をするには、まずカスタマーの登録が必要です。

Node.jsのSDKでは、こんな感じで簡単にStripeにカスタマーを追加できます。

```
const stripe = require("stripe")(
  "sk_test_XXXXX"
);

stripe.customers.create({
  description: 'Customer for natalie.johnson@example.com',
  source: "tok_XXXXX" // obtained with Stripe.js
}, function(err, customer) {
  // asynchronously called
});
```
via:https://stripe.com/docs/api/node#create_customer

## 空のカスタマーも作れる

第一引数は空のオブジェクトでもいけるので、こんな感じで情報なしのカスタマーも作れます。

```
const stripe = require("stripe")(
  "sk_test_XXXXX"
);

stripe.customers.create(
　{},
  function(err, customer) {
    if(err) {
      console.log(err)
    }
    console.log(customer)
  }
);
```

## メタデータを登録する
`metadata`にオブジェクトを入れると、Stripeのカスタマーにメタデータを登録できます。
タグ付けとかをしたい場合に便利そうです。

```
const stripe = require("stripe")(
  "sk_test_XXXXX"
);

const customers = {
  'email': 'customer1@example.com',
  'description': 'This is example customer',
  'metadata': {
    'sampleKey': 'sampleValue',
    'sampleKey001': 'sampleValue001'
  }
}

stripe.customers.create(
  customers,
  function(err, customer) {
    if(err) {
      console.log(err)
    }
    console.log(customer)
  }
);
```



## 環境変数でテスト・本番を切り替えれるようにする
Lambdaとかでいろんな環境から実行したい時は、環境変数使うといいと思います。

```js
console.log(process.env.STRIPE_ENV)
let stripe_secret = "sk_test_XXXXX"
if (process.env.STRIPE_ENV === undefined){
  console.log('process.env.STRIPE_ENV not defined')
  return
} else if (process.env.STRIPE_ENV == 'prod') {
  stripe_secret = "sk_live_XXXXX"
}
const stripe = require("stripe")(
  stripe_secret
);

const customers = {
  'email': 'customer1@example.com',
  'description': 'This is example customer',
  'metadata': {
    'sampleKey': 'sampleValue',
    'sampleKey001': 'sampleValue001'
  }
}

stripe.customers.create(
  customers,
  function(err, customer) {
    if(err) {
      console.log(err)
    }
    console.log(customer)
  }
);

```
GitHubで後からライセンスを指定する方法

# tl,dr
GitHub上でリポジトリトップに [LICENSE] ファイル作ればよろし

## やりたいこと
GitHubでリポジトリを作る時にライセンスを指定できるのは有名ですが、ライセンスを指定しないで作っちゃったリポジトリに後からライセンスを適用したい、ってこともあると思います。
実は楽勝です。

## やりかた

GitHubの当該リポジトリを表示し、(やりたいのであればブランチ切るとか選択するとかなんとかしてから)リポジトリのトップディレクトリで [Create New File]
<img width="1007" alt="スクリーンショット 2017-03-17 12.50.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/67742/6fe6c3e5-2bcf-326d-39c0-e62cf05c3528.png">

ファイル名を指定できるので、そこに [LICENSE] と入力
すると右側にライセンス選択のプルダウンが現れる
<img width="1020" alt="スクリーンショット 2017-03-17 12.50.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/67742/2925b357-83a7-bdb7-26ff-eb65298a464c.png">

選んでコミットしておしまい
MITライセンスを選べばちゃんとライセンス文章の名前の所をGitHubに登録した名前に変えてくれてますし、そのまま使えるものになっています
<img width="1004" alt="スクリーンショット 2017-03-17 12.51.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/67742/1c68115c-ae48-c87c-0033-39ea06a99c68.png">


参考 : [Open source license descriptions and metadata](https://github.com/blog/2335-open-source-license-descriptions-and-metadata)
osigファイルとは

Gear VRのアプリはOculus Storeで配布(販売)することを前提に作られています。そしてOculusはOculus Store以外の非公式なストアアプリみたいなものができないようにするため、**Oculus Store経由でインストールしていないアプリ(apk)は動作しない**ようになっています。これでは開発する時に毎回ストアにアップロードしてからインストールしなくてはならず不便です。

もちろん、こんな不便なことをしなくていいようにするための仕組みがあります。Gear VRでは**osigファイル**という仕組みでこれを実現します。osigファイルをアプリ内に組み込んでビルドする(apkファイルを作成する)と、このアプリはOculus Store経由でインストールされたかどうかのチェックをバイパスすることができます。

osigファイルは**端末ごとに用意する必要があります。**たとえば開発に使用するGalaxy S6が10台あるとしたら、10台それぞれのosigファイルを作成する必要があります。「新しくこの端末にもインストールしたい」ということになったら、新しい端末のosigファイルを作成して、アプリをビルドし直す(apkファイルを新たに作成し直す)必要があります。
一つのアプリ(apk)内には複数のosigファイルを組み込むことができます。なので、開発に使用する端末は早いうちに用意しておいて、先にosigファイルを用意して開発初期の段階で組み込んだ状態にしておくのが良いです。後から端末を追加するためだけにAndroid StudioやUnityを起動してビルドし直すのは面倒ですからね。


## osigファイルの作り方

osigファイルを作るには、下記のように2つのステップの工程があります。

1. 端末IDを取得する
2. osigをファイルを発行する

以下、順番に見ていきます。


### 端末IDを取得する

Android開発者であれば`adb`コマンドを使って簡単に取得できます。
Android SDKがセットアップされており、端末の開発者モードが有効になっている状態で、端末をUSB接続してターミナル(コマンドプロンプト)で`adb get-serialno`と入力すれば端末IDが取得できます。
*05057dr5w5d0x730*のような文字列が表示されます。これが端末IDです。

Android開発者でない場合や`adb`コマンドを使用することができない場合は、端末IDを表示するアプリを使うのが簡単です。
下記URLからGoogle Playストアへアクセスして端末にアプリをインストールして起動すると、端末IDが表示されます。
https://play.google.com/store/apps/details?id=com.eje_c.showdeviceid

Googleアカウントを端末に設定したくない等の理由でGoogle Playストアが利用できない場合は、こちらからAPKをダウンロードできます。
https://www.dropbox.com/s/583deud6slz0q8t/Serial%20No.apk?dl=0


ちなみに、端末IDはJavaのコードからは`android.os.Build.SERIAL`で取得できます。


### osigファイルを発行する

端末IDが取得できたら、下記URLへアクセスしてください。
https://dashboard.oculus.com/tools/osig-generator/

Oculusアカウントでのログインが必要です。Oculusアカウントは開発者・一般利用者の区別は特にありませんので、普段Oculus Storeにログインするために使っているアカウントで大丈夫です。アカウントがなければ作ってください。無料です。

ログインできたらフォームが表示されます。
フォームに端末IDを入力して、Download Fileをクリックするとosigファイルがダウンロードできます。

![osig.png](https://qiita-image-store.s3.amazonaws.com/0/56668/48ad36f7-11e2-bd4e-3426-69f12a284be5.png)


## osigファイルをアプリに組み込む

Android Studioのプロジェクトであれば、`PROJECT_ROOT/app/src/main/assets/`の中にosigファイルを入れます。
Unityのプロジェクトであれば`Project/Assets/Plugins/Android/assets/`の中にosigファイルを入れます。
Unreal Engineのプロジェクトであれば`<Unreal-directory>/Engine/Build/Android/Java/assets`の中にosigを入れます。

そしてapkをビルドします。


## 番外編 ConstructVR

[ConstructVR](https://www.constructvr.io/dashboard/apps)というサービスは、**上記で説明している工程を自動化してくれます。**
具体的には

1. 端末IDの取得
2. osigファイルの作成
3. アプリへの組み込み

という部分を自動化してくれます。
端末IDの取得は[ConstructVRアプリ](https://play.google.com/store/apps/details?id=com.archonware.constructvr)が行い、ConstructVRアプリからのインストールリクエストに応じてosigファイルの作成とアプリへの組み込みはConstructVRのサーバー上で行われます。アプリがビルドされるとConstructVRアプリがapkをダウンロードして、インストール画面が開きます。

こちらも無料で使用開始することができますが、無料アカウントではパブリック設定(URLを知っていれば誰でもダウンロードできる、Dropboxの共有リンクのようなもの)にしかできません。また、有料アカウントにアップグレードしても非公開設定のアプリは三つまでしか作成できず、それ以上は要相談とのことです。

このあたりが許容できるなら、とても便利なサービスだと思います。