OmniAICreator/Qiita-1.07M huggingface dataset:
[SSL/TLS] Handshake

## new session ticket

1. *clent -> server* **Client Hello**
  - generate Random Number (RNc)
  - preferred Cipher Suites
2. *clent <- server* **Server Hello**
  - generate Random Number (RNs)
  - selected Cipher Suite
3. *clent <- server* **Certificate**
  - include server public key  
4. *clent <- server* **Hello Done**
5. *clent -> server* **Client Key Exchange**
  - generate Pre Master Secret (PMS) and encrypted with server public key
6. *clent -> server* **Change Cipher Spec**
  - caculate Master Secret (MS) as Symmetric key from PMS, RNs, RNc
7. *clent -> server* **Client Finished (Enc.)**
8. *clent <- server* **Change Cipher Spec**
  - caculate Master Secret (MS) as Symmetric key from PMS, RNs, RNc
9. *clent <- server* **Server Finished (Enc.)**
10. *clent <-> server* **Data (Enc.)**

## within a session

1. *clent -> server* **Client Hello**
2. *clent <- server* **Server Hello**
3. *clent <- server* **Change Cipher Spec**
4. *clent <- server* **Server Finished (Enc.)**
5. *clent -> server* **Change Cipher Spec**
6. *clent -> server* **Client Finished (Enc.)**
7. *clent <-> server* **Data (Enc.)**

## ref.
- [Breaking Down the TLS Handshake](https://www.youtube.com/watch?v=n_d1rCXNrx0)
- [Transport Layer Security and HTTPS (CSS322, L25, Y14)](https://www.youtube.com/watch?v=lND9yuxnwc0)
- [HTTPS and SSL (CSS322, L26, Y14)](https://www.youtube.com/watch?v=hYxtjtfwhqk)
- [TLS/SSL Protocol and Handshake Process](https://www.youtube.com/watch?v=ubHZQrECeew)
【windows+anaconda】 コマンドプロンプト起動時に、自動で環境をactivateする

#背景
　windows+anaconda+コマンドプロンプトでpythonを使っています。ある環境内で作業をする際、コマンドプロンプトを開き、いちいち　`activate hogehoge`　などとするのは非常に面倒です。そこで、コマンドプロンプトを立ち上げた時に、自動的に環境に入る方法を調べました。~~IDE使えばいいんじゃ~~
#環境
windows10 64bit
anaconda 1.6.0

#結論
cmdrc書きましょう

#理由
　[公式の環境操作に関するリファレンス](https://conda.io/docs/using/envs.html)や[stackoverflowの質問](https://stackoverflow.com/questions/28436769/how-to-change-default-anaconda-python-environment)を見る限り、(ana)conda側では、環境の自動アクティベートに対応していないと思われます。
　なので、コマンドプロンプトを起動した際に自動で実行されるファイルを作り、その中で環境をアクティベートする方法が一番簡単だと考えました。 

#方法
**レジストリを編集します。作業は自己責任で行ってください。**

　適当なフォルダ(ここでは`C:\Users\USER\`とします)に`cmdrc.bat`というファイルを作り、以下の内容を書きこみます。

``` bat:cmdrc.bat
@echo off
cd /d %~dp0
if not exist "_TMP" (
type nul > _TMP
activate python_env
del "_TMP"
)
```
　`python_env`は各自の環境に置き換えてください。
　保存したらレジストリエディタを開き、`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor`の中に`AutoRun`という名前で文字列値を作成します。値のデータは`cmdrc.bat`へのパスにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161252/33a511b6-988a-8fbd-c960-ebb5aeee2bc3.png)
　これを保存したあと、コマンドプロンプトを開けば、環境がアクティベートされた状態で起動するはずです。


#cmdrc.batの解説

`@echo off`:コマンドの実行を画面に表示せず行うように設定する命令です。これがないと、このファイル中の実行したコマンドがすべて画面上に表示されます。

`cd /d %~dp0`：カレントディレクトリをバッチファイルがある場所に移動させるコマンドです。コマンドプロンプト起動直後は`C:\WINDOWS\System32`にカレントディレクトリが設定されているので、そのままだと後述する`_TMP`ファイルが作成できません。

```bat
if not exist "_TMP" (
type nul > _TMP
activate python_env
del "_TMP"
)
```
　単に`activate python_env`とするのではなく、`_TMP`が存在するかどうかで処理を変えています（存在する場合は何もしない）。
　場合分けを書かずに`activate python_env`とだけしたところ、コンピューターが大量にメモリを消費し、コマンドプロンプトがフリーズしました。おそらく、activateを実行する際に裏で新たにバッチファイルを起動していて、バッチファイル起動→activateを実行→activateがバッチファイル起動→そのバッチファイルがactivateを実行…と無限にバッチファイルが実行されてしまうのではないかと思います。
　最初の実行で`_TMP`というファイルを作成し、それ以降のバッチファイルでは`activate`を実行させないようにすることで、無限ループを防いでいます。

#参考サイト
http://c4se.hatenablog.com/entry/2012/10/19/230718
http://www.confrage.com/dos/batch-grammar/if/if.html
http://d.hatena.ne.jp/nakamura001/20090203/1233652705
https://www.k-tanaka.net/cmd/del.php
http://qiita.com/is_books/items/44d4cda4e11e194b8345
http://kiyotakakubo.hatenablog.com/entry/20090214/1234622897
ネットワーク変更時のメモ

社内のネットワーク環境を変更する作業を行ったので、そこで調べたことを纏めておこうと思います。

## 前提
- 人数/規模は10人前後→各人の端末(PC/SP)を考えると接続数は約20前後
- 回線は光回線
- スイッチングHUBは使用していない→ルーターのLANポートから直接接続
- 担当エンジニア（私）のspec
	- NWについてはなんとなく理解している程度（基本情報の知識程度）
	- 構築経験は無し
	- 基本他作業と並行でやっている

## 問題
- 無線が途切れる現象が頻発するようになった
- 体感的に、(メンバーが増えて)接続数が増えてきたタイミングで発生するようになった


## 調べたこと
#### 既存環境調査
- "ルーター"だと思っていたもの
	- ONU/ルーター/アクセスポイント一体型の装置(無線は無線LANカードを挿して無線化)
	- ONU: 光回線信号を電気信号に変換する装置
	- ルーター: 複数端末をインターネットに接続させるための機器
	- アクセスポイント: 無線LANに接続をするための中継機器、各端末はこの機器で設定したSSIDに接続する

	上記装置をごっちゃにして認識していました
	
#### その他の調査
- アクセスポイントへの給電方法
	- ACアダプタ: 普通にコンセントを本体に接続して給電
	- PoEインジェクター: LANケーブル経由で給電(Power over Ethernet)
	- PoE機能付スイッチングHUB: 給電方法自体はPoEインジェクターと同様
- ルーターのモード

	機種によってだが、モードを切り替えられるものがある
	
	- ルーターモード: 通常のルーターとして使用する際のモード
	- ブリッジモード: アクセスポイントとして使用する際のモード(ルーター機能はOFFになる)

		
#### 起きてる事象から原因を推測
- オフィスにいる人数が増えると現象が発生しやすい
- １通信そのものは速度問題なさそう
- ドアのような干渉物があると無線届きづらい

	→やはり同時接続が問題？＋さらにスペックの問題もありそう

## 検討
- 同時接続が問題っぽいので、無線での各端末からの無線での接続をうまく捌ければ良い
- 既存NW構成はなるべく変えたくない
	- 業務止めることになる
	- 変更に失敗し、なおかつ切り戻せなかった場合、業務完全停止する
	- 作業コストの問題
- アクセスポイント追加なら既存NWに追加するだけ！
- 同時接続可能数が多い機種をチョイス！


## 変更作業
#### 変更前
[ONU+ルータ+無線一体型] ← [無線] ← [各端末]　　

#### 変更後
[ONU+ルータ+無線一体型] ← [有線] ← [アクセスポイント] ← [無線] ← [各端末]

## 結果
- 途切れるような現象は無くなった
- やはり原因は同時接続数だったようだ
	- ルーター自体は交換していないので、あくまでもルーターに行く手前の交通整理の部分が問題だったのかと。
	- あと単に、既存のONU+ルータ+無線一体型の機器スペックの問題もあったのかも。

作業自体は大したことなかったが、経験薄かつ他エンジニアいない状態だったり、既存環境調べたり等、事前調査を厚めにした（つもり）。おかげでそれなりに勉強になりました。azs!
音泉のWebAPIを使って番組名の一覧や番組情報を取得する

##音泉とは
インターネットラジオの配信を行っているWebサイトです。最新の配信回は、無料で視聴することが出来ます。
http://www.onsen.ag/

##音泉のWebAPI
音泉にはWebAPIが存在しています。例えば、
http://www.onsen.ag/api/shownMovie/shownMovie.json
にアクセスすると、番組名の一覧をJSON形式で取得することができます。
rubyを使えば、以下のようにして番組名が取得出来ます。

```ruby:get_onsen_name.rb
#!/usr/bin/env ruby

require 'open-uri'
require 'json'

def radio_program_name
  url = 'http://www.onsen.ag/api/shownMovie/shownMovie.json'
  name = ""
  open(url) do |file|
    name += file.read
  end
  JSON.parse(name)
end

name = radio_program_name
```
ここで取得できた番組名を使って、番組の情報を取得できるWebAPIもあります。
http://www.onsen.ag/data/api/getMovieInfo/
↑のURLの後ろに、JSON形式で取得した番組名をつけてアクセスすると、番組情報が取得できます。例えば、
http://www.onsen.ag/data/api/getMovieInfo/home
にアクセスすると、「ほめられてのびるらじお（通称、ほめらじ）」の番組情報を取得することができます。
Meteorで作ったアプリで、すでに存在するherokuサーバーに繫げる方法

最近、Macを買って環境を整えるときに困ったので残します。

※Meteorでアプリを作ってherokuで世に公開させる手順はこちら
[Meteorで作ったアプリをherokuを使って独自ドメインで公開するまで](http://qiita.com/macotok/items/aec33c8610b4a1d6dcb3)

## 状況

- すでにherokuアカウントを持っている
- Meteorアプリが世に公開されている
- 新しいMacでデプロイさせたい

## 前提

新しいMacにherokuをインストールする

``` command:command
$ brew install heroku
$ npm install -g heroku-cli
$ heroku --version // versionが表示されれば無事インストール
$ heroku login     // herokuアカウントを入力
```

## すでに存在するherokuサーバーに繫げる

origin masterにpushした後

``` command:command
$ git remote rm heroku
$ git remote add heroku git@heroku.com:yourappname.git
$ heroku domains // Domain NameとDNS Targetが表示されればOK
$ git push heroku maseter // デプロイされる
```

## もしパーミッションエラーになったら

「git push heroku maseter」と打って

``` command:command
Permission denied (publickey).
```

とエラーになったら下記を実行

``` command:command
$ heroku keys:add
```

## 参考サイト

- [Herokuで鍵がPermission denied (publickey).になる時](http://opamp.hatenablog.jp/entry/20110914/1316011399)
Go言語における独自パッケージの扱いについて


##環境
* go歴 初心者
* go1.7.4 darwin/amd64

##これはなに？
Go言語（golang）を学ぶ第一歩として
開発の仕方や、ディレクトリ構造を含めて
`$GOPATH` に依存しない独自パッケージの扱いについてまとめました。

※ 解釈や考え方が間違っている場合はご指摘くださいm(_ _)m

##概要
まず、開発環境の前提として `$GOPATH` というワークスペースパスを指定して開発を行うようです。


ただ、必ず決まった場所で開発するわけでもないと思うので
自由な場所でもできる方法はないかと模索してみました。

##実装
試した環境としては下記の通りです。

■ディレクトリ構造

```
.
├── main.go
└── message
    ├── config.go
    └── post.go

```

```go:main.go
package main

import "./message"

func main() {
	message.FetchSetting()
	message.Post("hogehoge")
}

```

```go:config.go
package message

import "log"

func FetchSetting() {
	log.Print("pkg: message, src: config.go")
	log.Print("FetchSetting")
}
```

```go:post.go
package message

import "log"

func Post(message string) {
	log.Print("pkg: message, src: post.go")
	log.Print("Post " + message)
}
```

■実行

```
suna_suna hello $ go run main.go
2017/07/26 22:44:59 pkg: message, src: config.go
2017/07/26 22:44:59 FetchSetting
2017/07/26 22:44:59 pkg: message, src: post.go
2017/07/26 22:44:59 Post hogehoge
suna_suna hello $
```

##所感
まず、`import` するパッケージの指定ですが、 `./〇〇` とカレントからの相対パスを指定することで、わざわざ `$GOPATH/src` に置く必要がなくディレクトリ単位で完結した開発ができそうです。

また、パッケージの認識はフォルダ名を見ているようなので、その配下にあるファイル名は関連などを気にする必要がなく自由と解釈しています。


独自パッケージに関数をもたせる場合は、先頭文字を大文字にする必要がありますが、こういった書き方はあまりみたことがありません。
どういった意図があるんでしょうか:sweat_smile: 
このあたりの Golang の特徴などはこれから学んでいこうと思います。


##参考
* [MacでGo開発環境構築](http://qiita.com/imakenfever/items/9201198368c51aaea967)

* [Go言語：自作パッケージ](http://sugilog.hatenablog.com/entry/2014/12/28/135722)
Google Domains と G Suiteを使って独自ドメインのメールアドレスを作成する

先日 [Google Domains](https://domains.google/#/) が日本でも解禁されました。
このGoogle DomainsとGoogleが提供しているメールサービス（オフィススイート）である [G Suite](https://gsuite.google.co.jp/) を使うことで、 **設定不要で簡単に独自ドメインのメールアドレスが作れるようになりました**。

今まではMXレコードの設定などが初心者キラーでしたが、この面倒な部分を自動でやってくれるのでとても簡単に作ることができます。

本記事では作成方法を画面キャプチャーを添えて紹介します。


# 前提条件
- Google Domainsを契約済みであること
- G Suiteは未契約であること


# G Suiteメールアドレスの作成

## メールの画面から G Suite のカスタムメールを作成していく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/4701731b-ce4e-c11f-e96f-96f796c5fbcb.png)


## 次へ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/7d977094-7168-868e-d7dc-57e2a990ff4c.png)

## 管理者アカウントとバックアップメールアドレスを入力
バックアップメールアドレスに初期パスワードが送られます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/0c01f64e-463d-3aea-8fdb-b5cbb67e1eee.png)

## 金額の確認
デフォルトはベーシックプランで円課金みたいです。（言語設定でドル課金にもなる？）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/34e62237-f014-b9ae-fccc-d336d17a6360.png)

## カードの選択
[Google お支払いセンター](https://payments.google.com/payments/home)のカードの一覧からどれで決済するかを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/1cb4ff52-ff19-df13-0002-5da135b27eb4.png)

---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/e06145ce-76fb-ec0a-4147-dd832abd6608.png)

## 手続完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/e50d9ec3-56fc-5c50-b438-6c12c430b2af.png)



# DNS設定の確認

## DNS設定の画面を表示
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/f16f6655-fe70-e35d-ba40-19e89ee9db1e.png)

## DNSにG Suiteの設定がされているか
ちゃんとされています。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/5ff4a109-7d4c-f56c-0cd2-80fc4b0dc700.png)


# ログインする

## メールを確認
バックアップメールアドレス宛にメールが送信されています。
一時パスワードが表示されているので、あとは普通にGmailにログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/14b42699-a601-8bd7-203d-d22d1d955ca6.png)

## メールの動作を確認
試しに作ったアドレスに１件送信してみました。
ちゃんと受信できてました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/d935fc1c-c154-527a-b6b0-87b6fd2700af.png)


# 販売者について
販売者はGoogle Domainsになる模様。
つまりGoogle→Google Domains→あなた
の形で買っているということ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/ad26c12f-6de7-de79-b790-f9db8c8db476.png)


## 直接 Googleから買う形にする
プランの変更やライセンスを自分で管理したい場合は直接Googleから買う形にします。（Goolge Domainsから切り離す）
その場合は設定から変更することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/e96da2a8-f4f3-f1c7-e05e-8ff1e51d584d.png)

--- 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/29694e52-8227-e09b-c3ed-6d46e530c4a4.png)

---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/4bc7f0bf-94de-d57f-fbdc-a5e93e594a88.png)

---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/ce0fe0a6-f4d2-3de1-f0c4-3f470a3e283e.png)

### 結果
販売者が表示されていた画面がこうなる。
DNS設定等は残るので、Google Domainsには初期ユーザー作成とDNS設定だけやらせた形になります。
警告が出ているように`お支払い設定`を更新しなければならないのでそこは注意しましょう。
プランをドル建てにすれば若干安くすることもできます。
※それぞれ`5USD`, `600JPY`なのでレートが120切ってればお得
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/e9f08cbd-36a5-1bf0-2d15-a7526df11641.png)






# あとがき
Google Domainsより国内のレジストラの方が安くなりますが、そんな額をケチるより設定で悩まないほうが断然良いのではないでしょうか。
英語のニュースを日本語に翻訳してストリーミングでAlexaに喋らす試み　その１

最近、意識高い系バカをブロックしました。これ本当にストレス解消できますね！話し合いの場で適当に否定することで存在感を獲得するバカ。人の話を最後まで聞かず、揚げ足を取るのが得意なフレンズ。こういった方々は、一生勘違いしたままで構いませんので、なるべく、私の視界には入らないでいただきたい。私の限りある時間を無駄にしないために、**アズスーンアズパッスぃボー**でブロックします。**フェアウェル。**


さて今日は、閉店間際のスタバで荒ぶりながらAlexa Skillのコードを書いてストレス解消しようと思います。

# 目次：

1. Google Cloud Platform準備
2. 英語のニュースRSSを取得するコード書く
3. Google Translate APIで英語のテキストを日本語に翻訳
4. Amazon Polly に日本語テキストを渡して読み上げさせ、音声ファイルを生成し、S3にアップロード
5. 上記をストリーミングするAlexa Skillを作成

Alexa Skillが一向に日本語対応しないので、諦めてストリーミングで流すのです。手っ取り早くFlash briefingでやろうと思います。


# 1. Google Cloud Platform準備

[以前ラズパイでGoogle Assistant SDKを動かした時](http://qiita.com/sitopp/items/8ff12a57500020a5efc7)に使ったGCPのアカウントを使うことにします。

テケトーな名前で新しくプロジェクトを作成したあと、
ダッシュボード＞「APIを有効にする」をクリック

![gcp1.png](https://qiita-image-store.s3.amazonaws.com/0/173392/e8069e28-5f05-19f3-72a8-e6daea15f2a4.png)

API一覧が表示されるので、「Google Cloud Translation API」のリンクを力いっぱいクリックすると、もう有効となっています。

なお、かかった料金は以下のメニューで確認できます。

＞ダッシュボード
＞「 Google Cloud Translation API」のリンクをクリック
＞「割り当て」をクリック


詳しい費用は[「価格の詳細を表示」](https://cloud.google.com/translate/pricing?csw=1)のリンク先に書かれています。

```
1 か月あたりの料金

0～10 億文字
翻訳	20 ドル/100 万文字
言語の検出	20 ドル/100 万文字
```

さて、残念ながらスタバは閉店となってしまうようです。
今日はここまで。続きは週末にやりますね！
concourseを通してpcfにdeploy

## やること
今回はconcourseを通してpcfにdeployまでをやります。
1. credential.ymlの作成
2. pipeline.ymlの作成
3. concourseを走らせる

## 前提環境
pcfとconcourseの環境が整っていること。pcfにあげるアプリがあること
以前書いたpcfの環境構築について
http://qiita.com/yuichi10/items/228f90b6750a715de605
concourseの環境構築について
http://qiita.com/yuichi10/items/c26359b8339186818951

参考のコード
https://github.com/yuichi10/pcf-app

## 下準備
- pcfでつかったアプリを用意してください。(動くなら他のアプリで大丈夫です)

- まずci/というディレクトリを作ってそこにconcoursに関わるファイルを作っていきます。

- また今回はgithubからコードを参照するためアプリをgithubに上げておいてください。

## ci/credential.ymlの作成
まずpcfにdeployするために必要なクレデンシャルな情報をcredentail.ymlというファイルに書いていきます。このファイルはgithubに上げないようにしましょう。.gitignoreにかいておくことをオススメします。

```yaml
pcf-username: admin # pcfで使用したusername
pcf-password: admin # pcfで使用したpassword
pcf-org: pcfdev-org # pcfのデプロイする先のorganization
pcf-space: pcfdev-space # pcfでデプロイする先のspace
```
これでcredential.ymlは完成です。

## ci/pipeline.ymlの作成
ここから実際にconcourseのpipelineを書いていきます

#### リソースの追加
まずresourcesを追加していきます。
resourcesについてですがこれらはバージョンがありpushまたはpullができるような概念を指しています。
まずここにソースコードをとってくるgithubのresourceとdeploy先のpcfを追加します。


```yaml
---
resources:
- name: repo # resourceの名前
  type: git  # リソースの種類(git)
  source: 
    uri: 'https://github.com/<自分のレポジトリ>' # gitのurl
    branch: master # デプロイするbranch
- name: pcf
  type: cf  # リソースの種類(pcf)
  source:
    api: 'https://api.local.pcfdev.io' # pcfのapi url 
    username: ((pcf-username)) # pcf username
    password: ((pcf-password)) # pcf password
    organization: ((pcf-org))  # pcf organization
    space: ((pcf-space))       # pcf space
    skip_cert_check: true      # sslの有効性確認をスキップ    
```
これで必要なリソースは整いました。pcfのsourceのapiについては

```bash
cf api --skip-ssl-validation
```

で確認できます。

#### ジョブの追加
次にjobを追加します。今回のjobのすることはgithubからとってきたリソースをpcfにdeployすることです。

pipelineを見てみましょう

```yaml
resources: 
  ... 
    skip_cert_check: true
jobs:
- name: deploy # ジョブの名前
  serial: true # これをtrueにすることで非同期にせずキューにためて一つづつ実行します。
  plan: # ジョブの実行に必要なinputやoutputを設定
  - get: repo # resourceをgetする(resourceのnameと同じじゃないとだめ)
  - put: pcf  # 出力先。ここもresourceを指定する。
    params:   # タスクを実行するときの環境変数
      manifest: repo/manifest.yml
      path: repo # タスクを実行する場所
```

今回はjobというjobはせずにただgithubからとってきたコードをpcfにアウトプットしています。これだけでdeployができます。

## concourseを回す
まず先ほど作ったpipelineを生成しましょう

```bash
fly -t my-target set-pipeline -p my-app-concourse -c ci/pipeline.yml -l ci/credential.yml
```

-t でターゲットを指定してます
-p はpipelineの名前です
-c はセットするpipelineのymlファイルを指定します。
-l は-cで指定したファイルの(())で指定した場所に値を入れるファイルです。

これでpipelineの作成ができました。
それではconcourseのweb uiをみましょう。
<img width="740" alt="Screen Shot 2017-07-26 at 21.18.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/120527/0c544ecf-ff61-6bed-d0f2-7df81442e72a.png">


1. 左の=みたいなボタンを押すとパイプラインが生成できてるのを確認できると思います。
2. そしたら今回生成したパイプラインの再生ボタンをおしてください。
3. パイプラインの名前が書いてあるところをクリックするとパイプラインが実際に見れると思います。
4. そのごdeployと書かれてるところをクリックしてください。すると下記のような画面が見れると思います。

<img width="734" alt="Screen Shot 2017-07-26 at 21.20.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/120527/a56fe002-93b1-c077-f828-7c99b79f971c.png">

そしたら右上にある＋ぼたんを押してください。実際にdeployが走るはずです。


## 続き
続きは以下になります

http://qiita.com/yuichi10/items/8555a51810230fefa73c
Laravelチュートリアル ~[@extends]編~

Laravel歴０ヶ月の17新卒が継承についてまとめてみた！！

できた内容をアウトプットすることで
他の方のお役に立てればと思っております。

また間違っている場合はご指摘ください。

## 環境紹介

laradockをベースに

| Name | Version |
|:---:|:---:|
| CentOS | 7.x |
| MySQL | 5.5 |
| php | 5.6 |
| Apache | 2.2 |
| Laravel | 5.4 |

で立ち上げております

ディレクトリ構成としては

```
laravel
├ web
└ laradock
     ├ Workspace
     ├ Apache2
     ├ MySQL
     └ php
```

## いざ[@extends]についてのチュートリアル

### [@extends]って何よ？

一言でいうと `テンプレートの継承` に利用されるもの

### 簡単な例をみてみましょう

#### ⭐️layout

ここではレイアウトのメイン部分を作っています。
いわば枠組み的な感じです。

@yield('content')がのちにどういう意味になるかを説明したいと思います。

```
$ mkdir resources/views/layouts
$ vim resources/views/layouts/layout.blade.php
```

```php:layout.blade.php
<!DOCTYPE HTML>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ユーザー一覧</title>
</head>
<body>

    @yield('content')

</body>
</html>
```

#### ⭐️index

@extendsでlayoutsフォルダの中にあるlayout.blade.phpを継承します

@sectionで@extends内の@yield('content')部分に
@endsection部分までを表示させる宣言をしています。

```
$ vim resources/views/index.blade.php
```

```php:index.blade.php
@extends('layouts.layout')

@section('content')
    <h1>ユーザー名: {{ $user_name }}</h1>
@endsection

```

#### ⭐️UsersController

ここではaboutという関数を作り
user_nameという変数にドラえもんを入れ
それをviewのindexの中へリターンするという処理を書いてます

compact関数は変数名とその値から配列を作成する為応用的に使えると思っています。

```
$ php artisan make:controller UsersController
$ vim vim app/Http/Controllers/UsersController
```

```php:UsersController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UsersController extends Controller
{
	public function about()
	{
		$user_name = "ドラえもん";

		return view('index', compact('user_name'));
	}
}
```

#### ⭐️Routes

localhostへアクセスした際UsersController内のabout関数が呼び出されるようになっています

```
$ vim routes/web.php
```

```php:web.php
<?php

Route::get('/', 'UsersController@about');
```

#### ⭐️アクセス

http://localhost

<h1>ユーザー名:ドラえもん</h1>


### 解説

Laravelのテンプレートエンジンであるbladeの書式を使って変数を表示しています。

@extendsではlayoutsの中にあるlayoutを継承するという宣言をここでしています。

```
@extends('layouts.layout')
```

そしてその継承したlayoutの中にあるcontent部分に以下を挿入みたいな感じです

```
@section('content')
    <h1>ユーザー名: {{ $user_name }}</h1>
@endsection
```

公式にはこのように書いてあります

```
子のページを定義するには、「継承」するレイアウトを指定する、
Blade @extendsディレクティブを使用します。
Bladeレイアウトを拡張するビューは、
@sectionディレクティブを使用しレイアウトのセクションに内容を挿入します。
```

つまり、 `@yield` の部分に `contentのsection` が入りますよという感じです。

## まとめ

テンプレートエンジンはとても優秀

次回はデータベースからデータを取得し表示するものを紹介したいと思います。

[成果物](https://github.com/tunagohan/laravel-tutorial)
pcfの環境構築

最近pcfを触ることがあったので忘れないようにメモです

## pcfとは
Pivotal Cloud Foundryの略です
オープンなPaas環境を提供しています。

## 参考にしたサイト
https://blog.ik.am/entries/387
https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html#domain

## 環境
golangのアプリをあげるのでgoの実行環境があるのが望ましいです。

# cloud foundryのインストール
https://network.pivotal.io/products/pcfdev 
からPCF Dev　をダウンロードします。
PCF Devは開発用にローカル環境で簡単にCloud Foundryを試すためのVM環境です。
アカウント登録とかはよしなにしてください。

ダウンロードして来たファイルを展開してください。
pcfdev-v0.26.0+PCF1.10.0-osx
という感じのファイルができると思います。
今回ダウンロードして解答したファイルはPCF DevをインストールするためのCloud Foundryのプラグインです。

## pcfのコマンドのインストール
https://github.com/cloudfoundry/cli/releases
からcliをダウンロードして開いてインストールしてください。

brewからもダウンロードできるそうです。(試してないです)

```
$ brew install cloudfoundry/tap/cf-cli
$ brew upgrade cf-cli
```

## pcf devのインストール・起動
次にpcf devを実際にインストールして起動します。

```
$ cf install-plugin path/to/pcfdev-v0.26.0+PCF1.10.0-osx
$ cf dev start
```
これで来たのが確認できたと思います。

## pcfにログイン
先ほど起動した時にログイン方法が表示がされていたと思います。この情報をつかってログインします。

```
$ cf login -a https://api.local.pcfdev.io --skip-ssl-validation
```
パスワードとかはデフォルトでこんな感じです
Apps Manager URL: https://local.pcfdev.io
Admin user => Email: admin / Password: admin
Regular user => Email: user / Password: pass

Orgはpcfdev-orgを選択しました。

これで下準備は整いました。

## pcfにアプリをpush

まずあげるアプリを作成します。(goで作成していきます。)
アプリも含めたサンプルは
https://github.com/yuichi10/pcf-app
からとってこれます。

main.go

```
package main

import (
	"fmt"
	"net/http"
	"os"
)

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "hello")
}

func main() {
	port := os.Getenv("PORT")
	if len(port) <= 0 {
		port = "8888"
	}
	http.HandleFunc("/", hello)
	http.ListenAndServe(":"+port, nil)
}
```

このコードでhelloを表示するだけのサーバーがつくられました。

```
go run main.go
```
を実行すると実際に動くのがわかると思います。

#### マニフェストの作成
これから実際にpcfにあげるためのmanifest.ymlを作成します。
アプリのルートディレクトリにmanifest.ymlを作成してください。

```
---
applications:
- name: pcf-app
  instance: 1
  buildpack: https://github.com/cloudfoundry/go-buildpack.git#v1.8.5
  domain: tcp.local.pcfdev.io
  env:
    GOVERSION: go1.8.3
    GOPACKAGENAME: github.com/<github ユーザー名>/<appディレクトリ名>
```

- name: アプリの名前です。
- instance: 起動時のインスタンス数です
- buildpack: アプリを動かすランタイム環境を指定しています。
githubにbuildpackはあがってるので、それを選択します。
今回は現時点の最新で、go1.8.3が動くv1.8.5のgo-buildpackを選択しています。
- domain: pcfにはいくつかインスタンスがたっており、そのどこのドメインにあげるかです。pcfからはshared domainとprivate domainという概念があるのですが、今回はshared domainを指定しています。このドメインに関しては```
$ cf domains
```
コマンドで確認できます。

- env: 環境変数を指定しています。今回GOPACKAGENAMEに関しては設定しなくてもいいのですが、glideなどでパッケージ管理をすると必要になったはずです。

#### pcfにpush
ここまで来たらあとはpcfにpushするだけです

```
$ cf push
``` 
これだけでpcfにpushできます。実行するとアプリが動いているurlなども表示てくれているのでぜひ動いているのをみてください！

# 続き
1. concourseの構築
http://qiita.com/yuichi10/items/c26359b8339186818951

2. concourseを通してpcfにdeploy 
http://qiita.com/yuichi10/items/8555a51810230fefa73c
concourseの環境構築

最近concourseをさわったので忘れないように書いてます。

## concourseとは
CI/CDツールです。
簡単にjobやパイプラインをつくることができます。

## 前提の環境
docker
docker-compose が動く
mac (windowsもできるかな？試してないです)

## concourseの環境構築
下記のコードをコピペしてdocker-compose.ymlを作る

```
version: '3'

services:
  concourse-db:
    image: postgres:9.5
    environment:
      POSTGRES_DB: concourse
      POSTGRES_USER: concourse
      POSTGRES_PASSWORD: changeme
      PGDATA: /database

  concourse-web:
    image: concourse/concourse
    links: [concourse-db]
    command: web
    depends_on: [concourse-db]
    ports: ["8080:8080"]
    volumes: ["./keys/web:/concourse-keys"]
    restart: unless-stopped # required so that it retries until conocurse-db comes up
    environment:
      CONCOURSE_BASIC_AUTH_USERNAME: concourse
      CONCOURSE_BASIC_AUTH_PASSWORD: changeme
      CONCOURSE_EXTERNAL_URL: "${CONCOURSE_EXTERNAL_URL}"
      CONCOURSE_POSTGRES_HOST: concourse-db
      CONCOURSE_POSTGRES_USER: concourse
      CONCOURSE_POSTGRES_PASSWORD: changeme
      CONCOURSE_POSTGRES_DATABASE: concourse

  concourse-worker:
    image: concourse/concourse
    privileged: true
    links: [concourse-web]
    depends_on: [concourse-web]
    command: worker
    volumes: ["./keys/worker:/concourse-keys"]
    environment:
      CONCOURSE_TSA_HOST: concourse-web
```

次に下記のコマンドを実行します

```
$ mkdir -p keys/web keys/worker

$ ssh-keygen -t rsa -f ./keys/web/tsa_host_key -N ''
$ ssh-keygen -t rsa -f ./keys/web/session_signing_key -N ''

$ ssh-keygen -t rsa -f ./keys/worker/worker_key -N ''

$ cp ./keys/worker/worker_key.pub ./keys/web/authorized_worker_keys
$ cp ./keys/web/tsa_host_key.pub ./keys/worker
```

そしてこのconcourseにアクセスするためのURLを設定します
この時下記のURLには127.0.0.1やlocalhostを指定しないでください。

```
$ CONCOURSE_EXTERNAL_URL=http://192.168.99.100:8080
```

ここまできたら起動します

```
$ docker-compose up -d 
```

起動したら
http://127.0.0.1:8080
に接続して見てください。concourseのページが見れると思います。
右上のログインボタンを押してもらってmainにログインしてください。
その時ユーザー、パスワードはdocker-compose.yml中の
CONCOURSE_BASIC_AUTH_USERNAME　と
CONCOURSE_BASIC_AUTH_PASSWORD　の値になります
そのまま貼り付けた場合は

username: concourse
password: changeme

でログインできると思います。

環境構築に関しては[このリンク](https://concourse.ci/docker-repository.html)書いてあります

## concourseをclから操作
ここでは基本コマンドラインで作業していきます

### concourseのコマンドインストール
まずconcourse UI上にあるリンゴのマークをクリックしてflyコマンドを使えるようにしてください。
ダウンロードしたら実行権限を渡してpathの通ってるところに入れましょう

```
$ chmod +x path/to/fly
$ mv path/to/fly /usr/local/bin
```

バージョンが見れたら成功です。

```
$ fly --version
```


### ログイン

```
$fly -t <ターゲット名> login -c <concourseのURL> -n <登録済みのチーム名>

# 例
$ fly -t my-target login -c http://127.0.0.1:8080 -n main
```
ユーザー・パスワードがきかれたらmainのユーザー・パスワードをいれてください

これでログインできたはずです。下記のコマンドで実際にconcourseと紐づいたかどうか確認してください。

```
$ fly targets
```
先ほどログインした内容が表示されていたら成功です。

# 続き

1. pcfの構築
http://qiita.com/yuichi10/items/228f90b6750a715de605

2. concourseを通してpcfにdeploy 
http://qiita.com/yuichi10/items/8555a51810230fefa73c
時系列データ分析における予測手法の力業準最適化(SARIMA)【メモ】

#概要
　とある電力データを分析を行う際、「AR,MA,ARIMA,SARIMAモデルを用いて電力需要を予測してほしい。」と依頼がありました。
初Pythonで初予測手法だったので、パラメータを総当たりで探すことにしました。

パラメータは、order=(p,d,q)とseasonal_order=(p,d,q)で、aicが最小のパラメータを採用することにしました。

#ソース
　stackoverflowで見つけたものをいじって組み込みました。ソースを拾ったときにはsが12となっていました。月次データだったのかな？
今回は、1ヵ月の学習データで1週間の電力データを予測するため、ｓが24で最小のaicになりました。
なぜだろう・・・

```

import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels
import time

p = d = q = range(0,3)

import itertools

pdq = list(itertools.product(p, d, q))

seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]

y=TargetData

minaic = 999999
minparam = 0

starttime = time.time()
for param in pdq:
    for param_seasonal in seasonal_pdq:
        try:
            print('fitting開始')
            mod = sm.tsa.statespace.SARIMAX(y,
                                            order=param,
                                            seasonal_order=param_seasonal,
                                            enforce_stationarity=False,
                                            enforce_invertibility=False)

            results = mod.fit()
        
            print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))

            if minaic > results.aic: 
                minaic = results.aic
                minparam = param
                minparams = param_seasonal
            print('aic最小値{} - aic最小値のp,d,q{} - aic最小値のp,d,q,s{}'.format(minaic, minparam,minparams))
            
        except:
            continue
        
duration = time.time() -starttime
print('p,d,qの推定終了\n計測時間:{}'.format(duration))

f = open('results_param(SARIMA).txt','w')
f.write('aic最小値{} - aic最小値のp,d,q{} - aic最小値のp,d,q,s{}'.format(minaic, minparam,minparams))
f.close()
```
# 課題
- 力業で最適化できたかどうかわからない
- 最適かどうかの評価要
- 力業のため速度が劇的に遅いため、速度改善
Google Cloud Shell が少し進化した

ローカルを汚したくないのでCloud Shell愛用している勢，歓喜．

# tl;dr
- エディタとシェルが一画面に表示できるように
- 配色設定，フォント設定，[フォントサイズ設定](http://qiita.com/Yatima/items/c24c46bd4aff3625c8de#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%82%B5%E3%82%A4%E3%82%BA%E8%A8%AD%E5%AE%9A)できるように
- [**Chromeでショートカット登録できるように**](http://qiita.com/Yatima/items/c24c46bd4aff3625c8de#chrome%E3%81%A7%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E7%99%BB%E9%8C%B2) 
- [**vimでvisual block modeが使えるように**](http://qiita.com/Yatima/items/c24c46bd4aff3625c8de#vim%E3%81%A7visual-block-mode)
- [`clear` コマンドが使えるように](http://qiita.com/Yatima/items/c24c46bd4aff3625c8de#clear-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)

他にも何か見つけたら教えて頂きたい．

#少し解説

##フォントサイズ設定
実は以前から `Ctrl + =/-` で微調整は可能だった．
（ `=` は英字キーボード上 `+` と同じキー． `Shift + =` で `+`）

##Chromeでショートカット登録
URLが割り当てられたため，デスクトップなどから直接起動させられるようになった．
ChromeOSでは特に便利．

##vimでvisual block mode
これまではシェル自体に `Ctrl + C/V` がコピペとしてアサインされており，vimに `Ctrl + V` が渡せなかった．
設定にて `Ctrl + Shift + C/V` に切り替えられるようになったため，visual block modeが使用可能になった．

##`clear` コマンド
つい最近まで使えなかった．
なぜこのタイミングなのかは謎．なぜ使えなかったのかも謎．

#公式アナウンスも来ていた
[Cloud Shell’s code editor now in beta](https://cloudplatform.googleblog.com/2017/07/Cloud-Shells-code-editor-now-in-beta.html)

ちなみに上記記事内，（確か前からあった機能だが）エディタは予測変換なんかも出来て案外便利
（ `.vue` が未対応なので，個人的にはエディタはほぼ使っていない）
![content assist](https://1.bp.blogspot.com/-y9mN5nGwSeg/WXbIypI8XJI/AAAAAAAAEKU/U-1-U60uUx85I8nmmDjVzTcPWbFiihE6gCLcBGAs/s640/image7.gif)

## そもそもCloud Shellで出来ること
そのうち別記事で書く．

#個人的にエディタに欲しい
- `.vue` ファイル対応
- `Ctrl + C` を `Esc` の代わりに（vi key bindings）
- というかplugins使えるようにして欲しい（orion ideベース，元来は使える）

デバッグ系もないが，個人的には事足りている．
ガラホ(AQUOS K SHF31) のキーイベント一覧

# ガラホ(AQUOS K SHF31) のキーイベント一覧
## 動機
見た目はガラケー、中身はAndroid なガラホですが、Google Play からアプリをダウンロードできません。
その制約からか、ガラホ対応するための開発ノウハウを検索しても、ほぼありません。
まぁ完全にガラパゴスな端末なので、しょうがないですが……。

そんなガラホですが、以前連絡用として使っていたものが手元にあります。
ちょうど自作アプリを作っている最中なので、ガラホ関連で分かったことはメモしていきたいと思います。

## 本題
今回、```dispatchKeyEvent()``` で取得できるイベントからガラホのキーアサインを調べました。
電源ボタン、アプリ使用履歴キーは、上記イベント取得するためのアプリの制御を奪ってしまうため、調べることができませんでした。
それ以外のキーのイベントは下記でした。

### 物理配置
左 | 左中 | 中 | 右中 | 右
:---: | :---: | :---: | :---: | :---:
MENU |  | UP |  | F2
 | LEFT | CENTER | RIGHT | 
F3 |  | DOWN |  | F4
CALL |  | BACK |  | ?
1 |  | 2 |  | 3
4 |  | 5 |  | 6
7 |  | 8 |  | 9
STAR |  | 0 |  | POUND
 | ? |  | F12 | 

### 対応表
物理キー | KEY EVENT
--- | ---
カーソルキー(左) | KEYCODE_LEFT
カーソルキー(右) | KEYCODE_RIGHT
カーソルキー(上) | KEYCODE_UP
カーソルキー(下) | KEYCODE_DOWN
電話帳キー | KEYCODE_MENU
メールキー | KEYCODE_F3
クリアキー | KEYCODE_BACK
発信キー | KEYCODE_CALL
0 | KEYCODE_0
1 | KEYCODE_1
2 | KEYCODE_2
3 | KEYCODE_3
4 | KEYCODE_4
5 | KEYCODE_5
6 | KEYCODE_6
7 | KEYCODE_7
8 | KEYCODE_8
9 | KEYCODE_9
\* | KEYCODE_STAR
\# | KEYCODE_POUND
アプリ使用履歴キー | ?
センターキー | KEYCODE_CENTER
カメラキー | KEYCODE_F2
ブラウザ / アプリキー | KEYCODE_F4
電源 / 終話キー | ?



## 参考文献
 * [AQUOS K SHF31 取扱説明書](https://www.au.com/content/dam/au-com/static/designs/app/publish/torisetsu/pdf/shf31_torisetsu.pdf) (170720)
WowzaStreamingEngineでAPIを叩いてアプリケーションを作る方法

## はじめに
動画ライブ配信アプリを開発したいと思い[WowzaStreamingEngine](https://www.wowza.com/products/streaming-engine)を利用した際に、WowzaStreamingEngineのアプリケーション(動画配信のルームみたいなやつ)をapiを叩いて作る方法を調べたのでメモ。

## cURLコマンド

下記のようにapiを叩けば`testlive`という名前のライブ配信用のアプリケーション(ルームみたいなもの)ができます。

```
curl -X POST -H "Accept:application/json; charset=utf-8" -H "Content-type:application/json; charset=utf-8" http://[ドメイン・IPアドレス]:8087/v2/servers/_defaultServer_/vhosts/_defaultVHost_/applications/testlive -d'
{
  "restURI":"http://[ドメイン・IPアドレス]:8087/v2/servers/_defaultServer_/vhosts/_defaultVHost_/applications/testlive",
  "name":"testlive",
  "appType":"Live",
  "clientStreamReadAccess":"*",
  "clientStreamWriteAccess":"*",
  "description":"Testing our Rest Service",
  "streamConfig":{
    "restURI":"http://[ドメイン・IPアドレス]:8087/v2/servers/_defaultServer_/vhosts/_defaultVHost_/applications/testlive/streamconfiguration",
    "streamType":"live",
    "liveStreamPacketizer":["cupertinostreamingpacketizer","smoothstreamingpacketizer","sanjosestreamingpacketizer"]
  }
}
'
```

返り値

```
{
   "success": true,
   "message": "Application (testlive) created successfully."
}
```
「春の脆弱性祭り」というタイトルで発表しました

# モチベーション

下記のような理由で脆弱性の勉強を自分でし直してみようと思いました。
* 脆弱性はバグ。とはいえ、ここの脆弱性の起こる技術的仕組みは知っていても、どういう対策が有効かまでは理解しきれていない。
* 一度学んだとしても、その後触れる機会が少ないため、1年後には忘れてしまう。
* 時々Webの記事を読んで勉強しなおしたりするが、各個別の脆弱性について見ることがほとんどなので、俯瞰的に一度見直したい。

⇒ 徳丸本とIPAの出している資料を見て、学び直してみました。

# 資料

https://www.slideshare.net/dcubeio/wip-20170613
TGridLayoutで幅とか高さとか勝手にどうにかしたい

初めての投稿です。

FMX、ドキュメント弱いの、、

TGridLayoutっていう便利そうなコンポーネトがあります。
Orientationっていうプロパティで、横にずらずらとか縦にずらずらとか勝手にコンポーネントを並べてくれるわけです。

でも、ItemHeightとItemWidthという規定の数字で勝手に操作されるの。

いやぁ、おいらはさぁ


、、、縦に伸びるなら、横幅は一定で
、、、横に伸びるなら、縦幅は一定で

って思いますよね！！




見つけました！！！！！！！！！！！！！

ドュメントには一切書いてないけど、


Orientation = TOrientation.Horizontalなら、
ItemHeightを0以下にすればいい

Orientanion = Orientation.Verticalなら
ItemWidthを0以下にすればいい


でも、でも、でもね、Merginとかがかかると、このままではダメなんです。
頑張れ！エンバカデロさん！！
BigQueryストリーミングインサートの仕組み

以下の記事のメモ。図はオリジナルのサイトから引用。

https://cloud.google.com/blog/big-data/2017/06/life-of-a-bigquery-streaming-insert

#Streaming Insertのダイアグラム

![スクリーンショット 2017-07-23 22.54.29.png](https://qiita-image-store.s3.amazonaws.com/0/95399/cb3b022d-a366-90b0-02b5-c4852c8ff71f.png)

| コンポーネント | 概要　|
|:-:|:---|
| Streaming data producers  | BigQueryへストリーミングデータを送るアプリケーション  |
| Streaming Ingestion Workers  |  ストリーミングデータをStreaming Bufferへ入れて、成功・失敗のレポートを行う。 |
| Streaming Buffer | 最近インサートした行を維持するバッファであり、ハイスループットで書き込むために最適化する  |
| Instant availability reader  | クエリエンジンがストリーミングバッファから直接レコードを読み込むことを可能にする |
| Columnar storage  | データはカラムナフォーマットのテーブルに関連付けられる。 |
| Extraction worker  | バッファされたレコードのグループを集めて、カラムナフォーマットへ変換し、データをBigQueryの管理するストレージへコミットする処理 |
| Query Engine | Dremel|

クエリのライフサイクルは以下の３ステージからなる。

#Stage1　データソースからの挿入
- ユーザはtabledata.insertAllメソッドでBigQueryにストリーミングインサートを送信。このインサートは認可情報などをヘッダに加えてJSONフォーマットで送られる。
- 1つのinsertAll呼び出しは1つもしくは複数のレコードが含まれている。
- batch factorとして、いくつの行が1つのinsertAll呼び出しに含まれているか参照することができる。
- インサートは、Streaming Workerによって受信し、処理され、insertAllペイロードの各レコードをストリーミングバッファに保存するために必要な呼び出しを行う。
- workerはinsertAllリクエストの成功/失敗のレポートを行い、ペイロードはより詳細な個々のレコードのステータスを含む。
- insert workerがそれを確認すると、データはstreaming bufferにコミットされる。
- stream buffer storageはカラムナストレージよりもハイスループットでの書き込みが行われるように最適化される。このときのデータは堅牢だが、管理されたストレージより可用性の面で多くの制限がある。

#Stage2　クエリ
- Streaming bufferに届いたレコードは数分間そこに滞在し、この期間レコードはバッファされる。この段階でテーブルにクエリを発行することは可能。
- Instant Availability Readerはワーカーがquery engineからバッファされたレコードを読み取ることを可能としている。

※instant availability経由でデータを読むのは管理されたストレージから読むよりも遅くなる。これはデータのロケーション（streaming bufferはquery treeよりも遠いところにある）とストレージフォーマット、並列性が要因である。

#Stage3
- extraction workerはバッファからレコードを集め、カラムナフォーマットへ書き込む。
- extraction workerはカラムナストレージへ効率的なバッチを作成しようとするので、テーブルに到着するレコードやストリーミングレコードのボリュームは、これらの抽出が行われる頻度に影響される。
- レコードは抽出されると、garbageとマークされ、streaming bufferから削除される。
- 管理されたストレージへコミットされたレコードのグループとして、それらは複数のデータセンターにレプリカされ、アーカイブされる。
不動産取引価格情報取得APIで坪単価を調べるrubyプログラム

#qiitaとrubyとapiと不動産取引価格調査初心者です!!

※ruby2.0では動作しないです。Jsonクラスのdigメソッドでコケました。[どうやらruby2.3から追加されたみたいです](http://qiita.com/vzvu3k6k/items/1705c7f4b29c08787ea0)。Jsonの取り扱いの記事はもっと色々読みたいです。
※手元のmac環境がruby2.0だったため[rbenvでmacのrubyを最新にする](http://qiita.com/kogache/items/5886a6b62f036c1f94c9)を参照してrubyアップデートしました!多謝!

[日本の行政機関等が公開しているAPIについてのまとめ（2016年8月17日暫定版。随時更新）](http://qiita.com/kimuraya/items/3cc6c84bf6eac30851f1)　を読んでapi試してみたいと思って少し前に書いたコード(土地の値段を調べるのも興味ある)

apiの[説明はこちら](http://www.land.mlit.go.jp/webland/api.html)

例のごとく、このコード書いてしばらく経った今何をどう書いていたかきちんと思い出せない...

```ruby:area_price.rb
#area_price.rb

require 'net/http'
require 'uri'
require 'json'

url = "http://www.land.mlit.go.jp/webland/api/TradeListSearch?from=20101&to=20161&city=13421"

uri = URI.parse(url)
json = Net::HTTP.get(uri)
result = JSON.parse(json)

trade_data = []
(0..100).each do |i|
	if result.dig("data", i, "UnitPrice").to_i <= 2000
 		trade_data << result.dig("data", i)
	end
end

json_str = JSON.pretty_generate(trade_data)

puts json_str
```
CloudWatchカスタムメトリクス追加方法（ディスク、メモリ）

#やること
AWSのCloudWatchは、デフォルトだとディスクとメモリ使用率を見ることができません。
そこで利用するのがカスタムメトリクスです。
ディスクとメモリのカスタムメトリクスを追加します。

#前提
- インスタンスに、EC2FullAccessとCloudWatchFullAccessの権限を持ったIAMロールを関連づけている。（推奨）
- もしくは、上記権限を持ったユーザがおり、アクセスキーとシークレットキーを用意している。（非推奨）

#手順
1．対象サーバへログインする

2．スクリプトのインストール

```
# yum install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA
# curl http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -O
```

3.圧縮ファイルの解凍と圧縮ファイルの削除

```
# unzip CloudWatchMonitoringScripts-1.2.1.zip
# rm CloudWatchMonitoringScripts-1.2.1.zip
```

4．crontabへのスクリプト実行設定

```
# crontab -e
```

　以下の内容を記述する。
　今回は、5分に1回の実行に設定する。

```
●IAMロール適用バージョン（推奨）
*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl  --mem-util --disk-space-util --disk-path=/ --from-cron

●アクセスキーとシークレットキーを記載（非推奨）
*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl  --mem-util --disk-space-util --disk-path=/ --from-cron --aws-access-key-id=アクセスキー --aws-secret-key=シークレットキー
```

5．crondの再起動

```
# systemctl restart crond
```

6．追加の確認
　AWSのコンソール画面で、CloudWatchを選択し、DiskSpaceUtilizationが追加されていることを確認する。

参考URL
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html#using_put_script
【IE11】undefinedになるsvg.classListへの対処方法

## 現象確認環境

- Windows 10
- IE11 （見てないですが、IE10以下もダメでしょうね:hand:）

## 上記環境で発生した現象

SVG要素に対して

```js
svg.classList.add('active')
```

などすると、 `未定義または NULL 参照のプロパティ は取得できません` と怒られる。

このとき、`svg.classList`は常に `undefined` であり、`undefined` なので もちろんクラスを付けることも、外すこともできない:sob::anger:

## 対処法

クラス（classList）ではなく、属性（attribute)を操作してやればよいです。

**`svg.classList.add` の代わりに、**

```js
svg.setAttribute('class', 'active')
```

**`svg.classList.remove` の代わりに**

```js
svg.setAttribute('class', '')
```

`class=""` の中身をごそっと書き換えてしまうので、対象の svg がマルチクラスである場合は少し注意が必要ですが、概ねこのようにすると良いですね :ok_hand:

マルチクラスの場合に詰まった時は、参考のリンクまで足をお運び下さい。

## `svg.className = 'active'` ... ?
これはChromeでもダメでした。svg の場合 className は **read only** だそうです。

## 参考
Thank you :two_hearts:
https://stackoverflow.com/questions/8638621/jquery-svg-why-cant-i-addclass
IISの「現在の要求の表示」を表示させる

まどろっこしいタイトルになっちゃった。

IIS で現在処理中のリクエストを確認しようと IIS マネージャーを辿ったけど機能が見当たらず・・・。
表示方法をググっても（ググり方が下手なせいで）すぐに見つからなかったのでメモ。
環境は Windows Server 2012 R2, IIS 8.5 です。

# 「現在の要求の表示」が表示されない

IIS のワーカープロセス機能ページにある機能（？）詳しくは [コチラ](https://technet.microsoft.com/ja-jp/library/hh831576(v=ws.11).aspx) で。
ワーカープロセス機能ページでアプリケーションプールを選択すると右側の「操作」ペインに「現在の要求の表示」があるはずなのに出てきませんでした。

# サーバーマネージャーから機能を追加

IIS マネージャーを探してもダメでした。
日本語でググってもダメでした。
適当に英単語を並べたらすぐ出てきました・・・クソッ！
さすが Stack Overflow ですな。

[iis 8 \- How do I see currently executing web request on IIS 8 \- Stack Overflow](https://stackoverflow.com/questions/15621509/how-do-i-see-currently-executing-web-request-on-iis-8)

ここに書かれている通り、サーバーマネージャーを起動して右上の [管理] → [役割と機能の追加] から
Webサーバー(IIS) ＞ Webサーバー ＞ 状態と診断 ＞ 要求の監視
にチェックを入れてインストールします。

![add_feature.PNG](https://qiita-image-store.s3.amazonaws.com/0/57152/e5f05990-48ba-128c-e1ed-631722c8f578.png)

# GUI いやな人

PowerShell ならこのコマンド一発です。

```
> Install-WindowsFeature Web-Request-Monitor
```
recompose(HOC)を使用したReactコンポーネントのテストでどハマりした件

テストで何も返ってこなくて大変どハマりしたので備忘録。

解決策を見つけたのは私ではないけれどドヤ顔で書いてる(嘘)

私自身、初めてテスト書いていきなりハマったので、常識とかよくわかってないけど書いています。まさかり歓迎。

## 環境
- enzyme
- recompose

## ハマったこと
recomposeのwithHandlersとwithStateを使用したコンポーネントで返ってくるはずのコンポーネントが返ってきてないのでテストに落ちる

## 解決策
enzymeのissueにあるらしい。(見つけたのは僕ではない)

https://github.com/airbnb/enzyme/issues/539

要は、composeの引数の数だけdive()するしかないらしい。

なんてことだ。
SVN memo（自分用）

参考
http://www.thekyo.jp/manual/subversion/

MEMO
http://bhind13.com/info/2645/

MacのSVNクライアントが残念なので結局

#SVN環境構築
#### ■インストール
`brew install svn`
#### ■アップデート
`brew update`
`brew upgrade subversion`


#SVN Command
#### ■動作確認
`svn --version`

#### ■チェックアウト
1. `cd [DIR]` /ワークスペース作りたい階層に移動
1. `svn checkout [URL]` or `svn co [URL]`

#### ■ファイルの追加
`svn add [FILE PATH...]`

#### ■ファイルの削除
`svn delete [FILE PATH...]`

#### ■編集の取り消し、Addとかも取り消し
`svn revert [FILE PATH...]`

#### ■コミット（””内はコメント）
1. `cd [/hoge]` /コミットする階層に移動
1. `svn commit ファイル名 -m "コミットコメント"`
1. `svn commit -m "コミットコメント" でも可

#### ■リビジョンログ一覧
`svn log`
`svn log --limit 10` /これで１０履歴まででてくる

#### ■リビジョンの中身を見る
`svn log -r [rev#] -v`
※ `svn log -r 4 -v` でリビジョン４の中身見るってかんじ

#### ■アップデート
1. `cd [DIR]` /アプデしたい階層に移動
1. `svn update`

※`svn checkout -r [rev#]`　/リビジョン指定してアップデートはこれ

#### ■ローカルで編集したファイル一覧
`svn status`

#### ■クリーンアップ（うまくいかないときはこれ）
`svn cleanup [FILE PATH...]`

#ファイルの属性の意味
？　不明
A　追加
D　削除
U　更新
C　競合
G　マージ

#### ■一括リバート
`svn revert -R .`

#### ■バージョン管理外のファイルやフォルダーを一括削除
`svn status | grep ^? | cut -c9- | xargs -t rm -rf`
Bluemix の Cloudant から、 Node.js の cradle で画像ファイルをダウンロード

次のページで行うことと同じことを、Node.js の cradle を使って行いました。

[Bluemix の Cloudant から、python3 で画像ファイルをダウンロード](http://qiita.com/ekzemplaro/items/5fcc8643a8a7711bca5b)

cradle についての情報は、
[flatiron/cradle](https://github.com/flatiron/cradle)

参考にしたページ
[Cloudant NoSQL データベースを cradle でNode.js から使用する](https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/%E3%81%93%E3%81%BF%E3%81%AD%E3%81%AE%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/page/Cloudant%20NoSQL%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%20cradle%20%E3%81%A7Node.js%20%E3%81%8B%E3%82%89%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)

```js:from_cloudant.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	from_cloudant.js
//
//					Jul/26/2017
// ---------------------------------------------------------------
var cradle = require ('cradle')
var fs = require("fs")

// ---------------------------------------------------------------
console.log ("*** 開始 ***")


const service_username = '44b508dd-f332-4f91-81f2-78369c7d29d9-bluemix'
const service_password = 'efc189dc9dacdfdee596fc371012e08a61e7132d3b21ecaaf1f63a835fae64'
const service_host = 'efc123dc-f332-4f91-81f2-78349c7d19d9-bluemix.cloudant.com'
const service_port = '443'

const options = {
	cache : true,
	raw : false,
	secure : true,
	auth : {
		username : service_username,
		password : service_password
		}
}

var cc = new (cradle.Connection)(service_host, service_port, options)

const name = 'jpg'

var db = cc.database (name)

db.exists(function (err, exists)
	{
	if (err)
		{
		console.log('error', err)
		}
	else if (exists)
		{
		couchdb_fetch_proc (db)
		}
	else
		{
		console.log('database does not exists.')
		}
	})


// ---------------------------------------------------------------
function couchdb_fetch_proc (db)
{
	db.get ('_all_docs',function (err,docs)
		{
		console.log (docs.length)

		for (var it in docs)
			{
			const doc = docs[it]
			const key = doc.key
			console.log(key)
			const file_out = key + '.jpg'

			const id = key
			console.log("id = " + id)
			console.log(file_out)
			var writeStream = fs.createWriteStream(file_out)
			var readStream = db.getAttachment(id,file_out,
				function (err, reply) {
					if (err) {
					console.dir(err)
					return
					}
				})

			readStream.pipe(writeStream)
			}
		})
}

// ---------------------------------------------------------------
```
C > bit演算 > 指定のビット数まで1で埋めた数値の取得 | link:printf()での二進数表記

```txt:動作環境
C
```

### 仕様

ある数値を与えたとき、その数値のビット数まで1で埋めた値を得ること。

例: 
2 -> 0b11
4 -> 0b1111

### 実装

やっていることは「(ビット数+1)の値から1引く」だけ。

http://ideone.com/BGez9v

```c
#include <stdio.h>

#define DISP_BITS (20)

// modified from 
// https://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format
void print_binary(int number, int num_digits) {
    int digit;
    int cnt = 0;
    for(digit = num_digits - 1; digit >= 0; digit--) {
    	if (cnt % 4 == 0) {
    		printf(" ");
    	}
        printf("%c", number & (1 << digit) ? '1' : '0');
        cnt++;
    }
}

//
int getBitFilled(int bitnum)
{
	bitnum--;
	return ((2<<bitnum)-1);
}

void Test_getBitFilled(int val)
{
	if (val < 1 || val > DISP_BITS) {
		return; // error
	}
	int bitFilled = getBitFilled(val);
	printf("%3d -", val);
	print_binary(bitFilled, DISP_BITS);
	printf("\n");
}

int main(void) {
	Test_getBitFilled(3);
	Test_getBitFilled(1);
	Test_getBitFilled(4);
	Test_getBitFilled(1);
	Test_getBitFilled(5);
	Test_getBitFilled(20);
	
	return 0;
}
```

```txt:run
  3 - 0000 0000 0000 0000 0111
  1 - 0000 0000 0000 0000 0001
  4 - 0000 0000 0000 0000 1111
  1 - 0000 0000 0000 0000 0001
  5 - 0000 0000 0000 0001 1111
 20 - 1111 1111 1111 1111 1111
```

## 関連して学んだこと

### printf()での二進数表記

printf()では2進数表記の書式指定子がないということを今さら知りました。

https://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format
のKresimirさんの回答を参考にしました。

## v0.2 

@fujitanozomu さんの[コメント](http://qiita.com/7of9/items/e66341fec3c1fd0a98d9/#comment-f414fd1f4b101608be19)にてgetBitFilled()の訂正をしていただきました。

@shiracamus さんの[コメント](http://qiita.com/7of9/items/e66341fec3c1fd0a98d9#comment-e8c1ab4fcb20dddea269)にてprint_binary()の空白位置の改善とputchar()使用での方法を教えていただきました。

ともに情報感謝です。



http://ideone.com/kCPVTX

```c
#include <stdio.h>

#define DISP_BITS (20)

void print_binary(int number, int num_digits) {
    int digit;
    for(digit = num_digits - 1; digit >= 0; digit--) {
        putchar(number & (1 << digit) ? '1' : '0');
        if (digit > 0 && digit % 4 == 0)
            putchar(' ');
    }
}

//
int getBitFilled(int bitnum)
{
	return ((1<<bitnum)-1);
}

void Test_getBitFilled(int val)
{
	if (val < 1 || val > DISP_BITS) {
		return; // error
	}
	int bitFilled = getBitFilled(val);
	printf("%3d -", val);
	print_binary(bitFilled, DISP_BITS);
	printf("\n");
}

int main(void) {
	Test_getBitFilled(3);
	Test_getBitFilled(1);
	Test_getBitFilled(4);
	Test_getBitFilled(1);
	Test_getBitFilled(5);
	Test_getBitFilled(20);
	
	return 0;
}

```

```txt:run
  3 -0000 0000 0000 0000 0111
  1 -0000 0000 0000 0000 0001
  4 -0000 0000 0000 0000 1111
  1 -0000 0000 0000 0000 0001
  5 -0000 0000 0000 0001 1111
 20 -1111 1111 1111 1111 1111
```
ブレンダー　clothとシェイプキーの組み合わせでカーテンを作るメモ

下記のURLのまとめが秀逸だと思いますが、私の知能だと二つを組みわせて見ないと理解できなかったのでメモしてみます。

なぁんかしよ～:Blender 2.63a SL用 カーテン ： https://goo.gl/q8Cjef

cloth and shape keys in blender 2.5 - YouTube ： https://goo.gl/GckjHA


ちょっとグダグダ書きます。

ここでミソ（だと思うの）が、

a・オブジェクトデータのグループ選択
b・頂点をｓ(縮小）により縮小させるやり方。


理屈がわかると「あぁそういうことね」という感じでしょうが
理解できるまで時間がかかると思います。
とりあえず説明してみます。


カーテンらしい引っかかりのあるシワを頂点制限で表現しようという試みです。
具体的にいうと、現実のカーテンですが布の上の部分が一定間隔で留められていると思います。
それと、真ん中の部分はカーテンタッセルでまとめてる部分の表現ですね。
これをaのやり方でグループ化してみました。（シワを表現したいだけでなので~~適当で良いですね~~※何をもって適当なのかわかりませんが、ままりこの頂点を適当に打ってると最終的にできるシワに差異が生まれてきます。）
![12.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/f1c6a892-d7c0-7996-f826-65fa935ca932.gif)
選択した頂点は頂点グループの項目で「適応」を押しておけば、あとから選択・解除が簡単にできて便利です。

次に、編集からオブジェクトに切り替えて、シェイプキーの+を二回押してみます。

また編集に戻り、カーテンがしまった状態を作り出してみたいと思います。まずは上辺の方から。
コツですが、まずビボットポイントをアクティブ要素に、プロポーショナルモードをスムーズにします。
![14.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/e53274ca-dd8f-16fd-a8c9-76efa7f47d2e.gif)

それで、一番右の頂点をshift+右クリック２回を押して、少し離れた所でｓ（縮小）を押せば細かく頂点の間隔を調整できるかと思います。
右側からカーテンを閉めていく感じですかね。

![17.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/15e8cdb3-d373-9da6-2bc9-24a023b3d46a.gif)

これで頂点移動の下準備はできました。


オブジェクトモードに戻ってシェイプキーの値を移動したらまるでカーテンがしまっているように動くかと思います。
![13-1.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/c249400e-8622-e422-8ba4-40307e1470b2.gif)





<b>本題</b>
さて、ここでやっとこの組み合わせの意味をようやく説明できます。
要するに物理演算中に（布の物理演算）シェイプキーも同時に動かしてリアルな布のシワを作ってみようというわけです。
ピン留めをチェックして先ほどグループ化したグループを選択しないと布が落ちていきますので気をつけてください。
![111-1 36.png](https://qiita-image-store.s3.amazonaws.com/0/193429/9fbc6467-e464-14c5-49c4-3aaed7699fa5.png)

こんな感じで動かすわけですね。
![13-3.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/75faa1f3-38f8-12ee-f480-66e526a3c44c.gif)
（ちょっと、真ん中の頂点を適当にし過ぎたせいかシワが不自然ですが・・・）

物理演算が始まるときは当然布は開いていないといけません。
っとういことは値は0.000の状態にしないといけないわけです。
ベイクしてない状態で、演算が戻ったときシェイプキーの値が例えば1.00の状態だと望むべき形にならなくなるので、当然
シェイプキー0.00の状態ではじめのフレームから演算やり直しです。

いい演算ができたら、ベイクしてモディファイアーでクロスの結果を適応しましょう。
演算結果適応の詳細は
http://qiita.com/funsui/items/2fd67d5c0510a3db3c80
で。

シェイプキーが入ったままだと演算結果は保存できないので、
オブジェクトモードに戻ってシェイプキーは二つとも消しておく必要があります。
name="submit"を持つ入力項目には気を付けて！

javascriptでフォームのデータを送信した場合にsubmit()を使ったが、
特定のページのみエラーが発生。以下がエラーの内容

###エラー内容
```js:エラー
Uncaught TypeError: document.getElementById(...).submit is not a function
```

submit？そんな関数ねぇよと怒られる。
なんで？他のページでは送信出来ているのに・・・

###原因
```html:原因
<input type="button" name="submit" value="更新" />
```

どうやら原因はform内にいる``name="submit"``が原因だったみたい。


idまたはnameがsubmitとなっている入力項目タグが存在する場合、
formのsubmitプロパティは関数ではなく、当該タグの DOM オブジェクトを指してしまっている。
つまり、フォーム上のsubmit()関数がオーバーライドされているってことみたい。


###まとめ
**解決方法はname属性を別の名前に変えるだけ！**

画面のコーディングは別の方が担当していたので、中々気づかなかった。。。
もし、submit関数が動作しないときや、送信機能がうまくアクセスできないときは
submitという名前のフォーム要素を持っていないか確認してみてください。
MarkdownエディタTyporaの日本語フォントがWindowsではダサダサであるのをなんとかする

[**Typora**](https://typora.io/)はシンプルでとても使い勝手のよいMarkdownエディタで、現状では無料で利用できます。私は最近これにハマっています。

# 漢字の表示問題

とても気に入っているのですが、**Windows環境で日本語を使用すると、表示フォントの漢字部分がダサダサになる**という問題があります。これはひょっとしたら私の環境だけに依存した問題かもしれません。一体どのフォントが使用されているのかも分かっていません。

![Image 002.png](https://qiita-image-store.s3.amazonaws.com/0/109898/120865d7-22c6-af22-c2c3-2cb62fad1f55.png)


# フォントのカスタマイズの公式情報

以下に、公式のカスタマイズ方法のガイドを見つけました。但しこの方法で`base.user.css`を`theme`フォルダに置いて、`body`の`font-family`を一括指定する場合、元々のthemeで指定してあったフォント指定を上書きしてしまい、せっかく美しい欧文フォントの指定まで影響を受けます。ここは、下記のようにテーマ毎に対応するべきです。

**Custom Font**　http://support.typora.io/Custom-Font/

**Add Custom CSS**　http://support.typora.io/Add-Custom-CSS/



# 解決策

個別のテーマ毎に、カスタマイズ用のCSSを準備することができます。

Preference > Advanced Settings > Open Theme Folder で次のフォルダが開きます。

```
C:\Users\<username>\AppData\Roaming\Typora\themes
```

個別のtheme毎に（例えばgithub.css）、`body`の`font-family`属性を調べた上で、それを元に日本語フォント指定を追加した、以下のようなCSSを準備して、`github.user.css`と命名して、上記のフォルダに置くと、設定が反映されます。

![Image 001.png](https://qiita-image-store.s3.amazonaws.com/0/109898/1843d8c8-fb2d-58b9-23a6-7e8c1992ef81.png)



# CSSの実例

## github.user.css

```css
body {
    font-family: "Open Sans","Clear Sans","Helvetica Neue",Helvetica,Arial,sans-serif,"Hiragino Kaku Gothic ProN","MS PGothic";
}
```



## newsprint.user.css

```css
body {
	font-family: "PT Serif", 'Times New Roman', Times,"Hiragino Mincho ProN","MS PMincho";
}
```



## night.user.css

```css
html,
body,
button,
input,
select,
textarea {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif,"Hiragino Kaku Gothic ProN","MS PGothic";
}
```



## pixyll.user.css

```css
body {
	font-family: "Merriweather", "PT Serif", Georgia, "Times New Roman", "STSong", Serif,"Hiragino Mincho ProN","MS PMincho";
}
```



## white.user.css

```css
body {
	font-family: "Vollkorn", Palatino, Times,"Hiragino Mincho ProN","MS PMincho";
}

```