OmniAICreator/Qiita-1.07M huggingface dataset:
GhostscriptがCLIから実行できない

## 問題点
ec2イスタンス上で使用できるフォント一覧を確認する際に
ghostscriptで確認しようとしたらこんなエラーが出てgsの起動に失敗した

```shell
$ gs
GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GPL Ghostscript 8.70: Cannot open X display `(null)'.
**** Unable to open the initial device, quitting.
```

## 対処

`-sDEVICE=png256` のオプション追記で実行できた

```shell
$ gs -sDEVICE=png256
GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS> (*) { == } 256 string /Font resourceforall
(Adobe-Japan1-UniJISPro-UTF8-V)
(Utopia-Regular)
...
```

## 参考
[仮想マシンのCentOS7にLaTeXとGhostScriptとImageMagickをインストール](https://water2litter.net/rum/post/vm_setup_tex/)
SpreadSheetを簡易データベースのように使う最も簡単な方法

この記事は [StudioZ Tech Advent Calendar 2019](https://qiita.com/advent-calendar/2019/studioz) の6日目の記事です。

先日、ちょっとしたWebサイトの開発において不定期で企画側で表示上の数値を変更したいという要望がありました。
そんなとき、SpreadSheetなら誰でも扱えるし、スマートフォン上からでも操作できるし、DBマスタのように使う事ができればエンジニアの手を使わずに好きなタイミングで更新できるよね、ということで調べ、対応した内容を手順を追って記述します。

## 新しいSpreadSheetを作る

特になにも考えず、新しいシートを作りましょう。
https://docs.google.com/spreadsheets/create

## DBのごとく必要な情報をまとめる
以下の画像は記事のマスタを扱うような感じで捉えてもらえればいいです。
![スクリーンショット 2019-12-02 17.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467966/bd00854c-1bf6-7e1e-2768-dea941754a7e.png)

id、title、detailはそのままキー名の通り、delete_flgは削除フラグとして。
開発環境と本番環境があるとして、open_flgが立っていたら本番で公開等、考えていただければいいでしょう。

## さて、早くも公開です
早くも作成したSpreadSheetを公開します。

![スクリーンショット 2019-12-02 17.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467966/a9752caf-6116-00f9-60f6-6b311786da06.png)
![スクリーンショット 2019-12-02 17.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467966/d3095f78-1c68-7e3e-c7aa-cc2bfc4b3865.png)

画像のとおり、[ファイル]→[ウェブに公開]→[公開]で公開できます。

さて、ここで疑問に思った人も多いでしょう。
そんなことしたらこのファイルは誰でも閲覧できるようになってしまうのでは？
お察しの通り、この方法では編集はできないまでにしてもpre_flgが立っていてもdelete_flgが立っていても、この公開urlの存在を知ってしまった人は全員アクセスできてしまうのです。
このため、秘匿したい情報を含む場合はこの方法を使用することをおすすめしません。
（全体公開しない方法は「最も簡単な方法」ではなくなるのでまたの機会に・・・）

## 公開したSpreadSheetをJson化する

サーバ側で扱うために取得はJsonで行います。
なんら難しいことはありません。

例えば、SpreadSheetのurlが以下だとします。
https://docs.google.com/spreadsheets/d/1n6_Ix7VHcswzjcWN3tRE8h3qF-uCQ9ywojAtZXrl8g0/edit#gid=0

コレに対して、jsonで取得する場合は、以下のようになります
https://spreadsheets.google.com/feeds/list/1n6_Ix7VHcswzjcWN3tRE8h3qF-uCQ9ywojAtZXrl8g0/od6/public/values?alt=json

見ての通り、今回使用したSpreadSheetのシートIDは元のurlより
「1n6_Ix7VHcswzjcWN3tRE8h3qF-uCQ9ywojAtZXrl8g0」であることがわかります。

jsonで取得する場合は、このIDを以下に当てはめてあげるだけです。
https://spreadsheets.google.com/feeds/list/{シートID}/od6/public/values?alt=json

以下のような感じで取得できると思います。
![スクリーンショット 2019-12-02 18.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467966/f63add49-afd7-c8f3-4b3e-3f9a4585f51b.png)

これでSpreadSheet側の準備は整いました。
このJsonをサーバ側で取得し、整形して表示します。

## サーバ側でJsonを取得・整形する

今回はサンプルとしてphpで記述します。
必要な情報だけを引っこ抜きます。

```php:getSpreadSheetData
/**
 * 対象のスプレッドシートデータを取得
 * @return array
 */
public function getSpreadSheetData($sheetId){

	$data = "https://spreadsheets.google.com/feeds/list/{$sheetId}/od6/public/values?alt=json";
	$json = file_get_contents($data);
	$json_decode = json_decode($json, true);
	$list = $json_decode["feed"]["entry"];
	foreach ($list as $key => $item) {
		foreach ($item as $id => $value) {
			if (!preg_match("/^gsx/", $id)) {
				unset($list[$key][$id]);
				continue;
			}
			$list[$key][str_replace('gsx$', '', $id)] = $value['$t'];
			unset($list[$key][$id]);
		}
	}
	return $list;
}
```

以上で終了です。
とても簡単ですよね！

ただ、この方法は前述した「urlを知っている人は誰でも閲覧できてしまう」点以外にも、
アカウント(SpreadSheetの所持側)あたり100秒間に100リクエストの制限が存在するという弱点も存在します。
アクセスが多いサイトではそのまま使用しないほうがいいでしょう。
もちろん、キャッシュ等を使用してアクセス回数が100秒/100リクエストを超えないように操作すれば問題ないと思います！

もし、他人から閲覧されたくない場合やもう少し込み入ったことをしたい場合は、[SheetsAPI](https://developers.google.com/sheets/api/reference/rest)を使用しましょう。
lxdコンテナをイメージファイル化して、そのままS3バケットへアップロードするスクリプト

## 環境
Ubuntu 18.04 LTS 
## 前提条件
- LXDが利用できる
- awscliがインストールされている
- aws configureが完了している
- IAMロール または IAMユーザーの認証情報が設定済み
## 実行方法
スクリプトのファイル名が、```lxd_publish_image_to_s3.sh```の場合
```
# ./lxd_publish_image_to_s3.sh <LXDコンテナ名>
```
## コード
IMAGE_OUTPUT_DIRに、lxdコンテナイメージファイルのアップロード先ディレクトリを指定
S3_BUCKETに、アップロード先のS3バケットを指定
```
#!/bin/sh
set -eu
IMAGE_NAME=${1}
IMAGE_OUTPUT_DIR=/data/lxd_images
S3_BUCKET=lxd-images
lxc publish ${IMAGE_NAME} --alias ${IMAGE_NAME}
lxc image export ${IMAGE_NAME} ${IMAGE_OUTPUT_DIR}/
mv `lxc image info ${IMAGE_NAME} | grep "Fingerprint:" | sed "s/Fingerprint: //g"`.tar.gz ${IMAGE_NAME}.tar.gz
aws s3 cp ${IMAGE_OUTPUT_DIR}/${IMAGE_NAME}.tar.gz s3://${S3_BUCKET}/
```
GitHub + Travis-CI + pycodestyle で Pythonスクリプトを自動チェック

# travis-ci + pycodestyle で自動チェック
本記事は，DSL アドベントカレンダー 3日目の記事です．

内容としては travis-ci の機能を使ってレポジトリにpushする度にそのPythonコードがPEP8に則っているか自動でチェックしてやろうみたいなお話です．
以前このようなことをやろうとして日本語の記事が全然なかった印象があるので，今回書くことにしました．
**pycodestyleの自動チェックであり，pushやmergeを自動的に拒否するわけではないことは注意してください．**

## travis-ciとは
[さくらのナレッジ](https://knowledge.sakura.ad.jp/3754/) がわかりやすいです．
ざっくり抜粋すると，GitHubと連携した自動テスト実行サービスで以下のようなことが簡単に実行できます．

- 設定したGitHubリポジトリから自動でソースコードをチェックアウトしてあらかじめ指定しておいたビルドやテスト処理を実行する
- テスト結果をTravis CIのサイト上や各種API、メールなどで開発者に通知する
- テストが正常に完了して問題がなかった場合、あらかじめ指定しておいたホスティングサービスにソフトウェアをデプロイする

便利ですね．

## pycodestyleとは
[PEP8](https://www.python.org/dev/peps/pep-0008/)というPythonのコード規約があり，その規約にコードが則っているかどうかチェックしてくれるライブラリです．
詳しいPEP8やpycodestyleの出力結果についてのお話は他記事が参考になると思います．

## 使ってみる
### 導入手順
手順は[travis-ciのチュートリアルページ](https://docs.travis-ci.com/user/tutorial/)にも載っています．
1. [Travis-ci.com](https://travis-ci.com/) にて GitHub連携で[アカウント登録](https://travis-ci.com/signin)
2. Activateボタンを押して，機能を使いたいレポジトリを登録
3. レポジトリのrootに `.travis.yml` を置く．
4. リモートレポジトリにpush
5. travis-ciで結果をチェック

簡単にまとめるとこんなところです．


### .travis.yml
`.travis.yml` の中身にどんな処理を行うかを記述します．
今回は python パッケージの pycodestyle でコードチェックを行いたいので以下のような感じ

```.tavis.yml
language: python3
cache: pip
sudo: false
install:
  - pip install pycodestyle
script:
  - pycodestyle .
```

### sample code
動作を確かめるために下記の簡単なコードでチェックしてみます．

```python:helloworld.py
print("hello",end="")  # hello
print("world") # world

```

ちなみにこのコードでは，
1行目: 「,」の後にスペースが空いていない．
2行目: コメント文の「#」までにスペースが１つしか入っていない(正しくは2個)．
がPEP8に則っていないのでここを自動で検出してほしい．

### 動作確認
#### 修正前
諸々の設定を済ませ，githubにpushしてみます．
するとtravis-ciのlogで以下のようなログが出ていました．(一部抜粋)

![スクリーンショット 2019-12-02 18.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153871/c99b83b2-8325-1fd5-cbf0-62e6e119fdaf.png)

```:log

$ pycodestyle .
./helloworld.py:1:14: E231 missing whitespace after ','
./helloworld.py:2:15: E261 at least two spaces before inline comment
The command "pycodestyle ." exited with 1.
store build cache

Done. Your build exited with 1.
```

pushした時点でpycodestyleのチェックが始まり，
引っかかると status code 1 で返してくれるので build faild となっているみたいです．
やはり2点がPEP8に則っていないと出ているようです．
修正します．


#### 修正後
引っかかったところを修正して再びpush

```python:helloworld.py
print("hello", end="")  # hello
print("world")  # world

```

![スクリーンショット 2019-12-02 18.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153871/928da96c-391e-1b86-cbb8-6fbe9b180dec.png)

```:log
$ pycodestyle .
The command "pycodestyle ." exited with 0.
```

はい！綺麗なコードになったみたいです．

## まとめ
travis-ciとpycodestyleを用いてPythonのcodeが更新される度に自動チェックが入るようになりました．
自動で修正したい場合はautopep8などのモジュールを使うとコード整備がより楽になるかもしれません．
一人で開発する際はコードの綺麗さなどあまり気にしないかもしれませんが，現実ではそうも言っていられないので気にするようにしておくといいと思います(ブーメラン)．

## 参考
[さくらのナレッジ](https://knowledge.sakura.ad.jp/3754/)
[travis-ciのチュートリアルページ](https://docs.travis-ci.com/user/tutorial/)
第一回 Backbone.jsのextendについて

## 本記事の目的
* Backbone.jsのextendを理解する

---
## Backbone.jsでは至る所で使用する

```javascript
export default Backbone.Model.extend({
})
export default Backbone.Collection.extend({
})
export default Backbone.View.extend({
})
```

---
## まずはModelのextendから
Backbone.Model を拡張し、独自のModelクラスを作成する機能です。
インスタンスプロパティとクラスプロパティをそれぞれ指定で引数可能です。

```javascript
Backbone.Model.extend(properties, [classProperties])
// properties:インスタンスプロパティ
// classProperties: クラスプロパティ
```
参考：https://backbonejs.org/#Model-extend

---
## extendの使用例
```javascript
// Backbone.Modelを拡張したサブクラス(ExtendModel)
const ExtendModel = Backbone.Model.extend({
  idAttribute: 'id2',
  extendProp: 'Extend!!',
})

const model = new Backbone.Model()
const extendModel = new ExtendModel()

// ExtendModelはBackbone.Modelのプロパティが上書きされている
console.log(model.idAttribute)          // 'id'
console.log(extendModel.idAttribute)    // 'id2'

// モデルに存在しないプロパティはundefined
console.log(model.extendProp)           // undefined
console.log(extendModel.extendProp)     // 'Extend!!'
```

---
## extendの使用例2
下記のようにサブクラスをさらに拡張することも可能です。

```javascript
// Backbone.Modelを拡張したサブクラス(BaseModel)
const BaseModel = Backbone.Model.extend({
  baseProp: 'Base!!',
})
// BackModelを拡張したサブクラス（ExtendModel）
const ExtendModel = BaseModel.extend({
  baseProp: 'Base2',
  extendProp: 'Extend!!',
})

const baseModel = new BaseModel()
const extendModel = new ExtendModel()

// basePropは両方あるがExtendModelは上書きされている
console.log(baseModel.baseProp)      // 'Base!!'
console.log(extendModel.baseProp)    // 'Base2'

// extendPropはExtendModelのみ
console.log(baseModel.extendProp)    // undefined
console.log(extendModel.extendProp)  // 'Extend!!'
```

---
## 親オブジェクトの機能の呼び出し
下記の手順で親オブジェクトのメソッドを明示的に呼び出すこともできます。

```javascript
const Note = Backbone.Model.extend({ 
  set: function (attributes, options) {
    Backbone.Model.prototype.set.apply(this, [attributes, options])
    ... 
  }
})
```
これにより、setやsaveなどのコア関数をオーバーライドし、拡張することも容易です。

---
## extendとは
今回はModelのextendについて説明でしたが、基本的に他のモジュール（`Collection`や`View`）も同様です。
イメージとしては `Java` のクラスでいう継承にあたります。

---
## まとめ
* Backbone.Modelのextendとは  
Backbone.Model を拡張し、独自のModelクラスを作成する機能
初めてエイリアスを触った備忘録

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の2日目の記事です。

今日は最近ようやく手を出したエイリアスについて書いていきます。

どうでもいい話ですが、よく`alias`を`alies`とtypoしてしまうのを治したいです。

# エイリアスとは
>エイリアスとは、偽名、別名、通称などの意味を持つ英単語。ITの分野では、ファイルなどの実体を別の名前で参照するためのシンボルといった意味で使われることが多い。[エイリアスとは - IT用語辞典 e-Words](http://e-words.jp/w/%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9.html)

ということでよく使うコマンドや、いつまでたっても覚えられないコマンドを、自分好みの別名をつけることができます。

今回は僕が定義しているエイリアスの一部を載せていきたいと思います。
### エイリアスの設定場所

`.bashrc`というbashを起動したときに読み込まれるファイルにエイリアスを定義していきます。

```title:ターミナル 
vi ~/.bashrc
```
# Git関連
まず最初にGit関連のショートカットを定義していきます。
この辺りはよく使うので一度エイリアスを定義して覚えてしまうと作業が捗ります。

```bash

# .bashrc
alias gco='git checokut'
alias gcb='git checokut -b'
alias glo='git log'
alias gad='git add'
alias gcm='git commit -m'
```
# ショートカット
`dt`(デスクトップに移動)や`..`(一つ前のディレクトリに移動)は本当によく使います。

またVSCodeのコマンドとして`code`コマンドがあり、`code {path}`という形で該当パスの新しいウィンドゥを開くことができます。
なのでよく使うワークスペースを登録しておくととても楽になります。

VSCodeのショートカットは以下記事が参考になりました。
https://qiita.com/naru0504/items/c2ed8869ffbf7682cf5c

```bash
# .bashrc
alias dt='cd ~/Desktop'
alias ..='cd ..'
alias vbr='vi ~/.bashrc'
alias sbr='source ~/.bashrc'
alias vbp='vi ~/.bash_profile'
alias sbp='source ~/.bash_profile'
alias vsc='open -a "Visual Studio Code"'
alias v='code .'
alias jn='jupyter notebook'

alias now='date +%Y%m%d%H%M'
```
`Bash`のDateコマンドを用いた`nowは一時的なファイルを作る際に名前を考えなくていいので個人的に好きです
### e.g.
```title:ターミナル
$ now
201912040000 // このようにYYYYMMDDHHMM形式で出てくる

$ touch `now`.txt
$ ls
YYYYMMDDhhmm.txt
```

参考: [Bash Date – Format Options and Examples](https://www.tutorialkart.com/bash-shell-scripting/bash-date-format-options-examples/)

# 関数を作る
もう少し汎用性を上げるために、関数を定義していきます。
`mkdir` と `cd`を組み合わせた関数を作成します。
参考: [シェルスクリプトで関数を利用する](https://qiita.com/kaw/items/034bc4221c4526fe8866)

```bash
# .bashrc

function mkcd(){
  mkdir $1 && cd $1
}
```
### e.g.
```title:ターミナル 
$ mkcd qiita   // mkdir qiita && cd qiita と同意
```

# 変更を保存する
最後に定義したエイリアスを保存します。
`~/.bash_profile`に`~/.bashrc`を読み込ませるのがいいみたいで
`~/.bash_profile`に`source ~/.bashrc`を追記し、さらにその変更を`source ~/.bash_profile`で更新しています。

```title:ターミナル 
$ echo "source ~/.bashrc" >> ~/.bash_profile
$ source ~/.bash_profile
```
# まとめ
- エイリアスを設定すると作業効率が上がる
- よく使うコマンドはエイリスでショートカットにしよう
- Bashで関数を使ってより汎用的な定義もできた


以上明日も頑張ります！！
[tomowarkar ひとりAdvent Calendar Advent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)
CircleCiのビルドでSentryのreleaseを更新しSourceMapを追加(Nuxt.js編)

こちら[CircleCI Advent Calendar 2019](https://qiita.com/advent-calendar/2019/circleci)の記事です。
お声がけいただいたのでCircleCI, Sentry, Nuxt.jsというニッチな小ネタですが書きます。

# 目的
Nuxt.jsのプロジェクトをCircleCIでデプロイする際にSentryのreleaseを更新してSourceMapを追加する

# 手順
Sentryプロジェクトは既に存在すると想定して、CircleCI側の設定とNuxt.jsアプリの設定手順を記載します。
参考に使うプロジェクトは[こちら](https://github.com/AlisProject/frontend-application)ですべてソースを公開しております。

## CircleCI側
- CircleCIのContextに以下の項目を追加
    - Context名: `SENTRY_AUTH_TOKEN`
        - トークンは[Sentryのアカウントの設定画面](https://sentry.io/settings/account/api/auth-tokens/)から取得可能
    - Context名: `SENTRY_ORG`
        - **すべて小文字の** Sentryのorganization名
            - 例: AlisProject -> `alisproject`
    - Context名: `SENTRY_PROJECT`
        - Sentryのproject名
            - ex: `foobar`
- 本記事とは直接関係しませんが、参考までに:
    - [参考プロジェクトのconfig.yml](https://github.com/AlisProject/frontend-application/blob/da400fedc562ccada673b240f4199a61d6d8bbdb/.circleci/config.yml)

## Nuxt.js側

次にNuxt.jsアプリ側の設定です。

- 設定ファイル: [nuxt.config.js](https://github.com/AlisProject/frontend-application/blob/da400fedc562ccada673b240f4199a61d6d8bbdb/nuxt.config.js)

Sentry用npmパッケージを入れる

```bash
npm i --save @nuxtjs/sentry
```

`nuxt.config.js`に設定を追加。

```bash:modules部分
...
modules: ['@nuxtjs/axios', '@nuxtjs/markdownit', '@nuxtjs/style-resources', '@nuxtjs/sentry'],
...
```

```json:sentry用の項目を追加
...
  sentry: {
    dsn: `${process.env.SENTRY_DSN}`
  },
...
```
`${process.env.SENTRY_DSN}`にはSentryの設定画面で取得したDSNが入ります。
本プロジェクトではCircleCIでのビルド時に、[AWS SSMから値を取得して環境変数に格納しています](https://github.com/AlisProject/frontend-application/blob/23d45fed9fed5641ea9dd8b2459f706b03b24972/build.sh#L31L34)。
また、リリース名にはgitのハッシュを使用しています。デプロイ戦略として、細かいものは必ずしもバージョンを振らない運用をしているためです。



# まとめ
以上の設定でSentryにrelease等が反映され、トレースがしやすくなります。

リリースごとに **New Issues** が確認できるのはデグレ観点で強いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/7a41cf03-4da5-cad5-6230-a53ebf1cbebf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/e2a75094-b7f3-d09c-ee0f-9e34486a5cd3.png)

画像が少々わかりにくいですが、リリース(縦線)を境にバグが急増するなどしても可視化されます。
(スクリーンショットで細かいバグまで手が回っていないことがばれますね..)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/34719e46-127b-6ea8-ed09-5a4f13b8cae2.png)

SourceMapも追加され、ミニファイしたプロダクション環境でもバグ発生箇所のソースをSentry上で追うことができるようになるのでおすすめです。
laravel初歩的シンタックスエラー

laravel覚えようとlogin機能作成中につまづいた

```
syntax error, unexpected 'extends' (T_EXTENDS) 
```
シンタックスエラー起こしてたから調査



***.blade.phpファイルだから【<?php】いらないんだよね
ってだけ
削除したら正常に動作した。

```
<?php
@extends('layout')
```
[UE4]Reimportウィンドウを必ず出す

FBXファイルなどをインポートするとき、以下のImport Optionsが出てくると思います。
<img width="318" alt="2019-12-02_18h30_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/0371f63b-5197-36bc-724a-b3e8687d58ff.png">
しかしこちらは新規ファイルとしてインポートする時は出てくるのですが、再インポートする際には出てきてくれません。
（昔は出てきたと思うのですが、ある日から出てこなくなっちゃいました。）
ですので、再インポート時にImport設定を変えたい時はスタティックメッシュエディタのImport Settingsを変更する必要があります。
<img width="1179" alt="2019-12-02_18h33_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/fb0ef36e-9131-3339-d652-07afadeb9d1e.png">
でも再インポート時も毎回Import Optionsを出して欲しい…！という方は、
エディタ設定の、「Show Import Dialog at Reimport」にチェックを入れてみて下さい。
<img width="956" alt="2019-12-02_18h25_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/57f7e6db-f859-45ce-c42f-bce45492c7a8.png">
再インポート時も必ずImport Optionsを出してくれます。
（前職でこれを教えてくれたIさんありがとう！）
<img width="816" alt="2019-12-02_18h22_41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/77107507-b956-f5db-7313-30c2c386ee17.png">
シェルスクリプト bash 条件式

##### 条件式 [[]]

bash では条件式 [[]] を使って、条件を評価することが可能。

```bash:conditions1.sh
num=10

if [[ "$num" -ge 5 && "$num" -le 15 ]]
then
  echo "Between 5 and 15."
fi

char="abc"

if [[ "$char" == "abc" ]]
then
  echo "char is abc."
fi

if [[ "$char" != "xyz" ]]
then
  echo "char is not xyz."
fi
```

##### test コマンドの [] に似ている
非常によく似ているが、使用できる演算子に一部違いがある。

|条件式[[]]  |test コマンド[] |
|---|---|
|条件式1 && 条件式2  |条件式1 -a 条件式2  |
|条件式1 ll 条件式2  |条件式1 -o 条件式2  |

上記と同じ意味を持つコマンドを test コマンドで書き直すと、以下のようになる。

```bash:conditions2.sh
num=10

if [ "$num" -ge 5 -a "$num" -le 15 ]
then
  echo "Between 5 and 15."
fi

char="abc"

if [ "$char" == "abc" ]
then
  echo "char is abc."
fi

if [ "$char" != "xyz" ]
then
  echo "char is not xyz."
fi
```

ただ、シェルスクリプトの互換性(bash以外では使えないケース)を考慮すると、初めから test コマンドで書く方がよさそう。
SalesforceにGoogleMapを使う

１．[GoogleApiKeyを取得する](https://qiita.com/k2999/items/a9f41ea697a4f955ec1c)
２．GoogleApiKeyはラベルで保存する
３．VisualForceソース：`https://github.com/jinzongyu/googlemap`
４．地図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393170/7afdabd4-7a04-92b2-82a4-5832bb815a4d.png)

※「このページでは Google マップが正しく読み込まれませんでした。」
上記のエラーを出る場合、クレジットカードでGoogleアカウントと関連する。（一年目無料）
Node.js & Express & MySQL & React でTODOリスト Herokuにデプロイ編

## はじめに
前回の続きです。
https://qiita.com/hcr1s/items/0e5970c5af496c221a24

今回は、前回作成したAPIをHerokuへデプロイしていきます。

## 前提
今回は、Herokuのアカウントを所持しており、クレジット登録していることを前提とします。

## Heroku app作成
まずは、git initやheroku createを実行していきます。

```
# 既にgit initしている場合は省略
$ git init
$ git add .
$ git commit -m 'commit名'

# herokuでアプリ作成
$ heroku create アプリ名
$ heroku git:remote -a アプリ名

$ git push heroku master

```

とりあえず本番環境へpushは完了です。

## MySQL
本番環境でMySQLへ接続するための設定を行なっていきます。

```
$ heroku addons:add cleardb
```

Herokuでは、cleardbというクラウドサービスのMySQLを使用できます。

```
$ heroku config | grep CLEARDB_DATABASE_URL
↓
CLEARDB_DATABASE_URL: mysql://user名:password@host名/database名?reconnect=true
```

このコマンドで、必要なデータベースの情報を取得できます。
この情報をconfigに設定していきます。

```
$ heroku config:set DATABASE_URL='mysql://*********?reconnect=true'
```

mysql://のあとは、grepの結果をそのままペースとしてください。

以上でcleardbの設定は終了です。

## index.jsの編集
実際にプログラムに必要なコードを記述していきます。
まずは、前回も書いたcreateConnectionの編集をしていきます。

```file:index.js
--- 省略 ---

const databaseName = 'database名'
const connection = mysql.createConnection({
  host: host名,
  user: user名,
  password: 'password',
  database: 'database名'
})

--- 省略 ---
```

中身に関しては、MySQLの設定時のgrepを参考に記述していきます。
そして、必要なデータベースやテーブルが存在しない場合、つまり初回に限り実行されるSQLを記述します。

```file:index.js
connection.query('create database if not exists ??;', databaseName)
connection.query('use ??', databaseName)
connection.query('create table if not exists todo_list(id int auto_increment, name varchar(255), isDone boolean, index(id))')
```

前回も書きましたが、SQL文にフィールドを使用する際は??と記述します。

以上で、コードの編集も終了です。

## package.jsonの編集
Herokuにデプロイした際に、package.jsonに記述がないとnpm startが実行されてしまうので編集します。

```package.json
{
  "name": "todo-api",
  "version": "1.0.0",
  "description": "",
  "engines":{
    "node": "12.13.0",
    "npm": "6.12.0"
  },
  "main": "index.js",
  "scripts": {
    "start" : "node index.js"
  },
--- 省略 ---
```

## デプロイ
最後にデプロイをして終了です。

実際に使ってみましょう。

<img width="992" alt="スクリーンショット 2019-12-02 18.28.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539611/cca11aaa-337c-01d6-4101-df68c2790d2a.png">

実際にPOSTを送ってみた際のスクショです。
いい感じですね。

## 終わり
次回は、このAPIを使用してTODOアプリを開発していきます。
何か間違いがある際はおしらせください！
MacBookを冬の味方カイロにする

この記事は「ちゅらっぷす Advent Calendar 2019」の2日目の記事です。
https://qiita.com/advent-calendar/2019/churapps

#前置き (飛ばしてもよかです)
みなさん12月はいかがお過ごしでしょうか？
沖縄にはやっと冬が来ました。
暑かった先月が嘘のように寒くなっています。

指先が冷える中記事を書くのは...もとい仕事をするのはとても辛い。
ならば使用してるPCをカイロにしてしまえばいいじゃない！

#注意
※PCをカイロにするために負荷をかけます。<font color="Red">PCの寿命が縮む</font color>と予想されるので利用する方は注意されたし。
※負荷が上がるのだから作業に支障が出ることでしょう。
※沖縄の人は覚える必要はないでしょう。実はそこまで寒くないので。
※大人しくカイロを買いましょう。手袋をはめましょう。温かい飲み物を飲みましょう。暖房をかけましょう。

<font color="Red">※実行は自己責任でお願いします...！</font color>


#本題 -PCをカイロにする-
ではさっそくPCをカイロにしてしましょう。

PCをカイロにするにはどうしたらいいか。
皆さんご存知、負荷をあげればいいのです。
下記サイトを参考に負荷を上げていきましょう。
[謎のコマンドyesの使い方(Linux標準コマンドでCPU・メモリに負荷を掛ける方法)](https://tech-mmmm.blogspot.com/2015/02/yeslinuxcpu.html)

```
// ターミナルで下記を入力・実行！
$ yes > /dev/null
```
これで負荷がどんどんかかります。
一回の実行で負荷が足りなければ、もう一度実行しちゃいましょう。
command+t でターミナルの新しいタブを作り再度`$ yes > /dev/null`を実行すればいいのです。

今回私の方では4回実行してみました。
するとPCは「しゅこおおおおおおおおおお！！！！」と音を立て始め...
<img width="375" alt="スクリーンショット 2019-12-02 17.33.09のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275803/843853a6-e3c5-6a8e-59a8-c6bb28ac0618.png">
①yesコマンド実行時
②1分後
といった感じで負荷が跳ね上がりました。

<img width="512" alt="スクリーンショット 2019-12-02 17.35.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275803/13b62407-6f73-ac23-5aca-56fcbc426727.png">
CPU稼働率もなかなか

このままもうしばらく待って暖を取っても良かったのですが、寿命が縮むのも怖いし
何より沖縄なのでカイロは必要ないと判断しここで終了。
ここから先はここまで呼んでくれた方々にお任せしたいと思います！

<font color="Red">※実行は自己責任でお願いします...！</font color>

#終了 -カイロの任を解く-
負荷状態を元に戻すのは簡単です。
`$ yes > /dev/null`を実行中のターミナルを開き、ctrl+c を入力してください。
ターミナルで実行していたプロセスが終了します。
コマンド入力が面倒な方はそのままターミナルを閉じちゃってください。
「このウインドウで実行中のプロセスを終了しますか?」に「終了」と答えればプロセスを終了してくれます。
<img width="602" alt="スクリーンショット 2019-12-02 18.20.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275803/75a74cf0-f180-cba0-8af0-03e48c854086.png">
おつかれさまです。
それでは、良きWinter Lifeを！

<font color="Red">※実行は自己責任でお願いします...！</font color>
macOS X Catalina上のMacPorts(2.6.2)でossp-uuidがコンパイルできない

# そもそもみんなMacPortsは使ってないだろうし…
多分これは[MacPorts](https://www.macports.org/)の開発者グループも気がついていて、すぐに修正される不具合なのかもしれませんが、macOSをMojaveからCatalinaへとアップデートしたらMacPortsのアップグレードでエラーになってしまったので、とりあえずの対処方法です。

具体的にはossp-uuid-1.6.2_11+perl5_26.darwin_19.x86_64をコンパイルしようとした際に以下の様なエラーが発生しました。

```console:
--->  Computing dependencies for gobject-introspection
--->  Dependencies to be installed: cairo fontconfig ossp-uuid
--->  Fetching archive for ossp-uuid
--->  Attempting to fetch ossp-uuid-1.6.2_11+perl5_26.darwin_19.x86_64.tbz2 from http://kmq.jp.packages.macports.org/ossp-uuid
--->  Attempting to fetch ossp-uuid-1.6.2_11+perl5_26.darwin_19.x86_64.tbz2 from https://pek.cn.packages.macports.org/macports/packages/ossp-uuid
--->  Attempting to fetch ossp-uuid-1.6.2_11+perl5_26.darwin_19.x86_64.tbz2 from https://packages.macports.org/ossp-uuid
--->  Building ossp-uuid
Error: Failed to build ossp-uuid: command execution failed
Error: See /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_devel_ossp-uuid/ossp-uuid/main.log for details.
```

で、「ログを確認しろ」と書かれていたのでログファイルを確認したところ`sysroot`の設定に問題があるようで、sysrootに存在しないディレクトリが指定されていてヘッダーファイル`sys/types.h`が見つからないと言われています。

```text:/opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_devel_ossp-uuid/ossp-uuid/main.log
:info:build clang: warning: no such sysroot directory: '/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk' [-Wmissing-sysroot]
:info:build chmod 644 "uuid.bs"
:info:build In file included from uuid.xs:30:
:info:build ../uuid.h:39:10: fatal error: 'sys/types.h' file not found
:info:build #include <sys/types.h>
:info:build          ^~~~~~~~~~~~~
```

それもそのはずで、`sysroot`には`/Library/Developer/CommandLineTools/SDKs`以下のSDKロケーションが指定されていますが、これはXcode 11をmacOS X Catalinaにインストールした場合は存在していません。([Appleの公式ドキュメント](https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes#3035624)によれば存在することにはなっているのですが…)

そんな訳でとりあえずは存在しないディレクトリに正しいディレクトリのシンボリックリンクを作ってその場しのぎです。
多分、正しくはossp-uuidをビルドする際にスクリプト(Makefile？)がインクルードファイルのパスを設定する際にちゃんと`xcrun --show-sdk-path`が返すロケーションを使ってくれれば済む話なのですが。

```console:
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs /Library/Developer/CommandLineTools/
```
ARMアーキテクチャでのApache Hadoopビルド続編

## まえがき

2018年の年末に [EC2 A1インスタンスでApache Hadoopをビルドしてみる](https://qiita.com/aajisaka/items/4fe9406c8cc1ff22dc5c) という記事を書きました。それからしばらくの間、Apache HadoopコミュニティではARMビルドについて何も音沙汰がなかったのですが、2019年の下期になってから「上記の記事を(翻訳ツールを使って)読んでビルドしてるけど、よくわからないところを教えてくれ」というメールが私宛に何通も届くようになりました。

## OpenLabによる貢献

ここ最近では、[OpenLab](https://openlabtesting.org/) という会社が Apache Hadoop, Apache Spark などのビッグデータ関連のOSSをARMアーキテクチャに対応させようとする取り組みを実施しています。また、OpenLab は HadoopコミュニティでCIを回せるようにApache Software FoundationのビルドインフラにARMアーキテクチャのマシンを寄付しています: https://builds.apache.org/computer/arm-poc/ (Apache Spark向けにも寄付しています: https://amplab.cs.berkeley.edu/jenkins/job/spark-master-test-maven-arm/) 。ありがたいです。

## ARM対応の現状

2019/11/13に開催されたApache Hadoop Community Online Storage Syncでの[資料](https://docs.google.com/presentation/d/1ASwKGwID3JEkKVClm-4-pR1UxEBRrrTiUkX3CxstfKY)によくまとまっています。話は逸れますが、最近はcommunityでZoom meetingを定期的に実施しており、APAC向けの時間帯だと4週間に1回 meeting があります。私も時々出席しています。興味のある方は [カレンダー](https://calendar.google.com/calendar/b/3?cid=aGFkb29wLmNvbW11bml0eS5zeW5jLnVwQGdtYWlsLmNvbQ) をチェック!

やはり問題がいくつかありますが、それぞれ以下のように対処した結果、ビルドは通るようになっています。

* ProtocolBuffers 2.5.0 がまだARMをサポートしていない
  * Hadoopで利用するProtocolBuffersのバージョンが上がったので解決
* protoc-gen-grpc-java 1.15.1 のARM版リリースがない
  * (短期) [前回の記事で作成したリポジトリ](http://home.apache.org/~aajisaka/repository/io/grpc/protoc-gen-grpc-java/1.15.1/)を利用する
  * (長期) ARM版リリースの追加: https://github.com/grpc/grpc-java/issues/6364
  * (追記) 1.26.0 がリリースされて解決: https://issues.apache.org/jira/browse/YARN-10042
* leveldb-jni 1.8 のARM版リリースがない 
  * ARMの場合はOpenLabが独自にリリースしているバージョンを利用することで解決
* などなど

ビルドは通ったものの、テストがいくつか落ちるのでその修正が必要です。テストの修正などこれからやるべきことは [HADOOP-16723](https://issues.apache.org/jira/browse/HADOOP-16723) にまとまっています。パッチ大歓迎。

## おわりに

前回お遊びで書いた記事がコミュニティでARM対応を進めるための手助けになっていて、個人的にはすごく嬉しかったです。また、こんな記事でも英語で書いておいたほうがよかったなぁと思います。
MySQLでクライアント(v8)からサーバー(v5.7)でのDumpファイル取得方法


```sh
# 実行
mysqldump --column-statistics=0 -u root -p -h [HOST] [DB]  > dump.txt
# エラー
mysqldump: Couldn't execute 'SELECT COLUMN_NAME,                      
JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')                
FROM information_schema.COLUMN_STATISTICS                
WHERE SCHEMA_NAME = '[DB]' AND TABLE_NAME = 'action_histories';'
: Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
```

`--column-statistics=0`をパラメタ指定することで実行できるようになる`

```sh
mysqldump --column-statistics=0 -u root -p -h [HOST] [DB]  > dump.txt
```
ltやleなど演算子の略称

シェルやライブラリを使用していると、略称の演算子で指定することがあります。
よく略称の意味を忘れてしまうので、まとめました。

| 演算子  | 略称  | 英語  |
|---|---|---|
| =  | eq  | equal to  |
| !=  | ne  | not equal to  |
| <  | lt  | less than  |
| <=  | le  | less than or equal to  |
| >  | gt  | greater than  |
| <=  | ge  | greater than or equal to  |
【Laravel6】Vueがデフォルトでインストールされなくなっていた件【Vue.js】

# 前提
Laravelは5.3以降、yarn(npm)でインストールコマンドを実行すると
[vueがデフォルトでインストールされるように](https://github.com/laravel/laravel/blob/5.3/package.json)なっていました。

# package.jsonから色々消えた
Laravel6ではいくつかのパッケージがデフォルトから除外されたようで、
package.jsonの中身が[すっきり](https://github.com/laravel/laravel/blob/master/package.json)しています。
## Vue.js
[masterのpackage.jsonからvueがいなくなっていました](https://github.com/laravel/laravel/commit/fc39b073f3f61a22f1b48329e294ebb881700dbe#diff-b9cfc7f2cdf78a7f4b91a753d10865a2L23)。

2019/6/28に消されたようで、
当然、この日付以降に取得したLaravelでは、
yarn installをしてもvueでプロジェクトが作れません。
なので、手動で追加する必要があります。

```console:例(追記参照：非正攻法のようです。)
$yarn add --dev vue vue-router
```

一方、[Laravel5.8を確認してみる](https://github.com/laravel/laravel/blob/5.8/package.json)とvueは残っており、
更新履歴的に特に消える気配はなさそうなので、Laravel6からの方針と思われます。

## 他の消えたパッケージ
上記コミットを見てわかる通り、下記パッケージも同様にデフォルトでインストールされなくなりました。

* bootstrap
* jquery
* popper.js

以上。
~~コミットメッセージを見ても特に消された経緯がわからなかったので、
本件について何か情報をお持ちの方がいらしたらコメントを頂けると幸いです。~~

# 追記
## 既存記事に解決策がありました
[Laravel6でBootstrap, jQueryを使う方法](https://qiita.com/n_oshiumi/items/cf00a3f7def92a472a09)

```console
composer require laravel/ui
php artisan ui vue
```
を使うのが正攻法のようです。

## 公式記事に解説がありました
https://readouble.com/laravel/6.x/ja/frontend.html
質問する側が心がけること

だれしも質問する・される機会はあると思います。
その際にどのような情報があれば聞きたいことが理解され、スマートな回答が得られるのかを個人的にしていることを例に紹介したいと思います。

# 悪い例
##「こういうことしたいんですけどどれぐらいでできますか？」

悪い理由

- この質問の背景が不明(Why)
- 〇〇がざっくりしていてやりたきことも不明(What)
- いつまでに回答が欲しいのかが不明(When)

##「なにがわからないかわからない」

一番質問される側にとって回答しづらいパワーワード。。

悪い理由

- この質問をするまでになにかしたのか
    - なにかしたならしたことは言おう
    - なにもしていないならなにか行動しよう

# どのようにしたら改善されるのか

1. 「自分が求めている情報」がなにか(What)をまず考える
2. Why(なぜ求めているのか)、When(いつまでに回答を求めているのか)を考える
3. 自分なりにしたことを洗い出す

上記、3つがわかれば聞かれた側もある程度汲み取ってくれると思います。(多分)

# 最後に
質問する側の人はもし自分にその質問が来たら理解できるかを一旦、考えてみてから質問をすることを心がけると徐々によくなると思います。

「なにがわからないかわからない」だけはやめましょう！！
ユーザーテスト？モニタリングテスト？フォーカステスト？

### はじめに
***
リリース前(β段階)のアプリを用いて、ターゲットユーザー層にプレイしてもらい、いくつかの観点に関してのアンケートを答えてもらう。そのアンケート結果を分析し、開発側が売りとしている**内容、面白さ**が伝わっているか、**市場のユーザーに刺さっているか**　という内容を定量、定性で評価し課題を抽出する事。

上記のテストのお話をします。
会社によっては、「ユーザーテスト」だったり、「モニタリングテスト」だったり、「フォーカステスト」といろいろな呼称があるのですが、ここでは「ユーザーテスト」で統一します。

### 何でやるの？(Why)
***
- 開発費〇〇億円、想定DAU〇〇、想定ARPPU〇〇、〇〇ヵ月後には回収できます！
 - サービス終了のお知らせ。

- UI/UXは開発工数削減の為、(自社の)アプリを流用します！
 - ストアレビュー　2.X。

- IPものはここが一番有名なところだから実装しよう！
 - え、全然世界観違う！原作の再現性ないけど。。。

みたいな悲しい経験ってありませんか？ありますよね？あるでしょう！


例としてあるあるを記載しましたが、開発メンバーは、どうしても作り手の視点となってしまいユーザー目線での視点が抜けてしまう場合があります。社内のレビューに関しては、Fix会/ブラッシュアップ会がありますが、チェック内容が多岐にわたっておりユーザー目線での評価や課題抽出が必ずしもできているとは言い難いです。

結果として課題を把握できないまま開発が進み、そのままリリースされてしまい、負けるべくして負けている状況に！

### 何をやるの？(What)
***
- 課題の早期発見
- ユーザー目線でのゲームの評価

この2点を目的としてやっていくことが望ましいと思います。
面白いアプリ、ユーザーが求めているアプリを作らないと売れない(継続しない)市場です。売れるアプリを出せる可能性を高める為にQA側として何ができるか。

### どうやってやるの？(How)
***
1. ユーザーテストが実施可能(ここでの「可能」とは想定のペルソナを用意できる)な外部ベンダーの選定
2. 開発側と見たい内容(目的)、観点のすり合わせ
3. 市場ユーザーの定義(ペルソナ)のすり合わせ
4. 2ですりあわせた内容を盛り込んだアンケートの作成
5. 実施日、実施回数の決定
6. アンケートの結果を分析しレポート作成
※ペルソナ：ターゲットユーザー(性別、年代、課金層、ベンチマークアプリのプレイ経験などから選定)

経験談なのですが
「2」と「3」をしっかり決めないと無駄なテストになってしまいます。QA側で大枠を決めてあげると開発側もイメージがしやすく、すぐ決まる傾向でした。

「4」は見たほうが良い4つの大項目があります。
**総合評価**、**継続意向**、**課金意向**、**事前期待**
この4項目は売上に最も関わる内容です。


### やろうとしても大きな壁が立ちはばかる
***
- ユーザーテストの有用性が提示できなくて実行に踏み込めない、上司/プロダクト説得できない
- やれたと思ったら、β終盤じゃないとゲームが動かないのでテストできない
- そのため、改善案が入らずリリースされてしまう
- 分析まで外部ベンダー依頼するとコスト高くて、「予算がない」って言われるし
- 内製でやろうとしても、分析(言葉で伝える力)はスキルいるし、工数ないし

壁ばかりです。
でも安心してください！このブログに解決方法を記載します！



### 解決策
***
>- ユーザーテストの有用性が提示できなくて実行に踏み込めない、上司/プロダクト説得できない

開発側と仲良くしましょう。
市場不具合が出ることはよくあります。開発側が原因でも、QA側が原因でも、開発側全員で解決しましょう。
普段のQA業務でテストだけではなく、仕様のレビューだったり、新規の仕様を提案するなど、**テストをやる人だけ**という概念をなくし信頼関係を築きましょう。

説得するのは上司でなく、経営層もとい会社です！
例えばリリース承認会議で経営者に訴えるのです！経営層はプレリリース結果として見てもらえる可能性が高いので興味ありです。そうすることで会社全体がユーザーテストに興味を持つようになります。

>- やれたと思ったら、β終盤じゃないとゲームが動かないのでテストできない
>- そのため、改善案が入らずリリースされてしまう

実施回数を増やしましょう。
1回目はコア機能だけ実施する、2回目は定常機能を実施する、3回目は全機能で実施する。
こうすることで、段階的に改修の期間を設けることができます。


>- 分析までベンダー依頼するとコスト高くて、「予算がない」って言われるし
>- 内製でやろうとしても、分析(言葉で伝える力)はスキルいるし、工数ないし

最初はQA側で費用もつように上司説得しよう。（ここの説得方法はみなさんにお任せ）
分析は。。。慣れ！何回もレポート作成して、何回もレビューでダメ出しされて、強くなろう。


### まとめ
***
ユーザーテストを実施したほうが良いことは漠然とわかりつつ、実際にどのような成果があるのか、開発側にはどのようなメリットがあるのか、数値としてあらわしづらいのが現状です。
でも業界としてこのテストの重要性は広まりつつあるので、他社の状況など調査してみることも一つの手法だと思います。
SAML でトラブルシューティングする時のメモ

自分用のメモ

# まずは、SAMLのエクステンションをインストールする

- [SAML DevTools extension \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/saml-devtools-extension/jndllhgbinhiiddokbeoeepbppdnhhio)

インストールが完了すると、Google ChromeのデベロッパーツールにSAMLの欄が増えているので、ここに注目する。
（本文関係ないけど、僕はデベロッパーツールは、独立したウィンドウにするのが好きですｗ）

# SAMLによるアクセスを実施し、レスポンスを確認する

実際、アクセスさせてAttributeが正しく送られてきているとか、IdPからレスポンスを確認すると良い。
当然ながら、不具合の内容によって、チェックする観点が変わってくるので、エラー内容ごとに、どの観点でチェックすると良さそうです。

<img width="1468" alt="貼り付けた画像_2019_12_02_17_51.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45733/d49351af-2be2-0726-f86b-080694604a0d.jpeg">

今回は、姓名のアトリビュートが正しく送られて来てなかったので、その内容を確認して原因が突き止められたました。
Railsチュートリアル学習メモ3

## renderの中身はルーティングパスじゃなくてcontrollerの階層を記述する
```ruby
render("users/login_form")
```

## viewで `<%= @user.id %>` などとやらずにechoする方法
```ruby
      <% 
      if @user.id == @current_user.id
        concat link_to("編集", "/users/#{@user.id}/edit")
      end
      %>
```
concatを使う。なんでputsとかprintとかできないんだろ。

## 簡単にループ
```ruby
      <%
        10.times do
          concat "cat"
        end
      %>
```

## いいね機能実装
1. Likesテーブルを作成
2. Likeモデルを作成して、Viewからレコードを追加/削除機能を作成

## FontAwesomeの使用
```ruby:view/lauout/application.html.erb
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
```

## link_toの表示ラベル部分をHTML要素にするための書き方
```ruby
<%= link_to("/likes/#{@post.id}/destroy", {method: "post"}) do%>
<span class="fa fa-heart like-btn"></span>
<% end %>
```
第一引数は不要

## レコードをカウントする
```ruby
@likes_count = Like.where(post_id: params[:post_id]).count
```

## パスワードのハッシュ化はgemのbcryptを使う（例）
1. gemファイルに記述
2. `bundle install` で内容を実行
`has_secure_password` が使えるようになる。
ただmodelに貼り付ければ

## カラム名を `password_digest` にする必要がある。
ただし、インスタンス作成からアクセスする際は `password` で大丈夫のよう。

## has_secure_passwordをmodelに記述すると、authenticateメソッドが有効になる
authenticateメソッドは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定してくれる。

##
PostgreSQLサーバが立ち上がらなくなったとき

# 注意
これは研究室のサーバ上のVMでPostgreSQLの設定をしているときにエンカウントしたエラーについてのメモです. 見づらいのはご容赦ください.
# 前提
- Ubuntu18.04のサーバの`yuki`というVMに`orbit`というNASをマウントしている.
- `orbit/postgresql`にPostgreSQLのデータファイルの実体を保存する設定済み.
- `orbit`の所有者がrootになっており,毎回一般ユーザ(moririn)からsudo権限を発行して実行するのがめんどくさいため,所有者設定を変えたい.

# 問題発生時の行動
所有者を変更するにはchownコマンドを使えばいいはずだと思った自分は以下のコマンドを入力した.

```shell
moririn@yuki:$ chown -hR moririn /orbit
# -h: 指定したファイルがシンボリックリンクの場合、シンボリックリンクのみ所有権を変更
# -R: 再帰的に所有者を変更
```

しかし,postgresqlを再起動してアクセスしようとすると下記のエラーが出現

```
psql:could not connect to server: Connection refused 
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
```

LAN内の他のサーバからアクセスしようとしても同様のエラーが出現していました...このとき,configファイルの`pg_hba.conf`を確認しましたが正しい内容が書いてありました.

# 解決策
とりあえず...statusを確認すると以下のように出力されました

```
moririn@yuki:$ systemctl status postgresql@12-main.service
● postgresql@12-main.service - PostgreSQL Cluster 12-main
   Loaded: loaded (/lib/systemd/system/postgresql@.service; indirect; vendor preset: enabled)
   Active: failed (Result: protocol) since Mon 2019-12-02 06:37:46 UTC; 1min 12s ago
  Process: 4153 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 12-main start (code=exited, status=1/FAILUR
Dec 02 06:37:46 yuki systemd[1]: Starting PostgreSQL Cluster 12-main...
Dec 02 06:37:46 yuki postgresql@12-main[4153]: Error: Config owner (postgres:115) and data owner (moririn:1000) do not
Dec 02 06:37:46 yuki systemd[1]: postgresql@12-main.service: Can't open PID file /run/postgresql/12-main.pid (yet?) af
Dec 02 06:37:46 yuki systemd[1]: postgresql@12-main.service: Failed with result 'protocol'.
Dec 02 06:37:46 yuki systemd[1]: Failed to start PostgreSQL Cluster 12-main.
```

これによるとそもそもサーバが立ち上がっていない...ということがわかります.原因はconfigの所有者(postgres)とdataの所有者(moririn)が異なるためとわかりました.
下記のコマンドより, dataディレクトリの所有者をpostgresに戻したところこのエラーは出力されず,PostgreSQLサーバも立ち上がるようになりました.

```
moririn@yuki:$ chown -hR postgres /orbit/postgresql
```

# 感想
今回はデータディレクトリ`/orbit/postgresql`の所有者を変更する形で対処を行いましたが, configファイルの所有者変更でも対処できたように思います. 多くの方がconfigファイルを`/var/lib/postgresql`内に置いているようで, Web上の多くの記事はこの所有者を変更すれば良いと記載していたのですが, 自分の場合はconfigファイルを`/etc/postgresql`内に置いていたので余計手こずったように思いました.このようにconfファイルを探したいときは下記のようにコマンドを実行することですべてのディレクトリを探索し, ファイルを探すことができることを学びました.

```
moririn@yuki:$ sudo find / -name pg_hba.conf
```
AmazonLinux2 EC2インスタンス作成後、mysql: コマンドが見つかりません の状態からRDS接続するまで

# 環境
- AmazonLinux2（AWS EC2）

# 目的
AmazonLinux2 EC2インスタンス作成後、既存のRDSにmysqlコマンドを使ってデータベース接続したい。

# つまづいたところ
EC2インスタンス作成後に「mysql: コマンドが見つかりません」というトラブルに遭遇。mysqlがインストールされていないようなのでインストールする。
しかし、mysqlのインストールを試みるものの、mysqlではなく下のように**mariadb**をインストールしようとしてくる。[^1]

```console
$ sudo yum install mysql
:
:
========================================================================================================================
 Package                  アーキテクチャー        バージョン                          リポジトリー                 容量
========================================================================================================================
インストール中:
 mariadb                  x86_64                  1:5.5.64-1.amzn2                    amzn2-core                  9.0 M
```

# 解決方法
- mysql-communityリポジトリを使ってmysqlをyumインストールする。

# 以下、mysqlのインストール手順
[MySQL Community Downloadsページ](https://dev.mysql.com/downloads/repo/yum/)よりダウンロードしたいmysql-communityリポジトリのパッケージを選択する。ここでは、「Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package」を指定。
![mysql-communiry-downloads.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483889/1ff4a55b-adc9-b5c1-4d40-fa066d7d6506.jpeg)
↓
上記ページから移動した先のページに記載してあるダウンロードリンクをコピペしてmysql-communityリポジトリのインストールを実行。

```console
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
```

↓
mysqlをインストールする。

```console
$ sudo yum install mysql
:
:
========================================================================================================================
 Package                                アーキテクチャー  バージョン                 リポジトリー                  容量
========================================================================================================================
インストール中:
 mysql-community-client                 x86_64            8.0.18-1.el7               mysql80-community             38 M
 mysql-community-libs                   x86_64            8.0.18-1.el7               mysql80-community            3.7 M
     mariadb-libs.x86_64 1:5.5.64-1.amzn2 を入れ替えます
 mysql-community-libs-compat            x86_64            8.0.18-1.el7               mysql80-community            1.3 M
     mariadb-libs.x86_64 1:5.5.64-1.amzn2 を入れ替えます
依存性関連でのインストールをします:
 mysql-community-common                 x86_64            8.0.18-1.el7               mysql80-community            597 k

```

↓
インストールしたmysqlのバージョンを確認。

```console
$ mysql --version
mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)
```

↓
本件目的のRDS接続を試みる。接続できるようになった。

```console
$ mysql -h 'エンドポイント' -P 'ポート番号' -u 'ユーザー名' -p
Enter password: 'パスワード'
:
:
:
mysql>
```

# 参考
- [MySQL 5.7 を CentOS 7 に yum インストールする手順 | WEB ARCH LABO](https://weblabo.oscasierra.net/installing-mysql57-centos7-yum/)

[^1]: mariadbインストールでもmysqlコマンド使えます。
PHP基礎 Part3

# 概要
PHPの独学で学んだことをアウトプットしていく

# 前回の内容
[PHP基礎 Part2]
[PHP基礎 Part2]:https://qiita.com/k__aizawa/items/7bce8c8f0c88e0ca6d92

## if文
「もし○○の場合、△△となる」といった条件に応じて、分岐が必要な場合に用いる文法
条件成立時は、{}の中の処理が実行される

```php:sample.php
<?php
  $num = 3;
  if ($num > 0){              // 条件式の展開
    echo "変数numは0より大きい";  // 条件を満たす場合、出力される
}
  // 結果:変数numは0より大きい
?>

```

### 比較演算子
比較元の値と比較先の値を、比較する為に以下の__比較演算子__を用いて判定する
判定時の結果が真の場合は、「true」で偽の場合は「false」と表す

| 比較演算子 | 判定基準 |
|:-----------|------------:|
| <       | 右辺が大きい時にTrue |
| <=       | 右辺が大きい時、もしくは等しい時にTrue  |
| >       | 左辺が大きい時にTrue |
| >=       | 左辺が大きい時、もしくは等しい時にTrue |
| ==       | 右辺と左辺が等しい時にTrue |
| !=       | 右辺と左辺が等しくない時にTrue |
| ===       | データ型まで含め、右辺と左辺が等しい時にTrue |
| !==       | データ型まで含め、右辺と左辺が等しくない時にTrue |

### else
「もし○○の場合、△△となり、そうでない場合は□□となる」といった、
if文との組み合わせで条件分岐を作成する
elseを使うことで、if文で条件を満たせなかった場合の処理を実行させることが可能

```php:sample.php
<?php
  $age = 19;
  if ($age >= 20){            // 条件式の展開
    echo "あなたは成年です";     // $age = 19なので、条件に合致しない
 }else{
    echo "あなたは未成年です";   // else文の処理実行
}
  // 結果:あなたは未成年です
?>

```
### elseif
「もし○○の場合、△△となり、◇◇の場合は☓☓となり、そうでない場合は□□となる」といった、
条件の分岐が3つ以上になる時に使用可能
注意点として、複数条件に合致した場合は、先に条件が合致した分岐の処理を行う

```php:sample.php
<?php
  $num = 23;
  if ($num > 30){              // 条件式の展開
    echo "30より大きい数値";      // $num = 23なので、条件に合致しない
 }elseif ($num >= 20){
    echo "20以上30以下の数値";   // 条件に合致するので、この分岐の処理が実行
 }else{
    echo "２０以下の数値";        // elseifで合致する条件があった為、実行されない
}
  // 結果:20以上30以下の数値
?>
```

### 複数条件の組み合わせ

条件式を展開する際に、複数の条件を一纏めにしたい場合に__論理演算子__を使用する
andを表す論理演算子は__「&&」__、orを表す演算子は__「||」__となる

```php:sample.php
<?php
  $age = 30;
  if ($age >= 25 && $age <= 30){    // 条件式の展開
    echo "アラサーです";               // 条件に合致する為、この分岐の処理が実行
 }else{
    echo "それ以外の世代です";
}
  // 結果:アラサーです
?>
```
## switch文
if文では複雑になるような条件をswitch文を使い、読みやすいようにする
if文とは異なり、switchという条件式を展開し、条件式に当てはまるcaseの値が合致した時に、
該当するcaseの処理が実行される
もし、どのcaseにも当てはまらない場合は、defaultの処理が実行される

```php:sample.php
<?php
  $score = 4;
  switch ($score){
    case 1:
      echo "E判定";
      break;
    case 2:
      echo "D判定";
      break;
    case 3:
      echo "C判定";
      break;
    case 4:
      echo "B判定";  //$score = 4の為、このcaseの処理が実行される
      break;
    case 5:
      echo "A判定";
      break;
    default:
      echo "判定外";
      break;
}
  // 結果:B判定
?>
```
【補足】
各caseの末尾にbreakを記述しているが、
これがないと、caseに合致する条件のすぐ後ろのcaseも実行されてしまう為、
breakが入っているかを確認すること

## 次回
* 配列
* 連想配列
PHP案件に配属されたGopherはどうGo言語と向き合うべきか

今いるチームのメインリポジトリはPHPで書かれているのでそれに接する機会が多い。
インフラはガチガチのAWSだ。
普段の個人開発で使う言語はGo一択だしインフラは google app engine にのせてきた。
全然違うじゃん、と思われるかもしれないが雇用されて働く上で技術スタックを気にしてネガティブになる必要はあまりない。
新しい技術に対して前向きな意思決定ができるチームを作れるか、一緒に働きたいと思えるメンバーに恵まれているか、プロダクトは利益を上げているか、そういったことの方がボディに効きやすい。
まぁPHPでお仕事できますか？と聞かれたら当然YESだ。
PHPなんてものは特にその存在を意識しなくても読めるし書けるので勉強するに値しない言語だ。
それがLL言語の唯一の利点であるがどうにもお行儀が悪くて治安が乱れやすい。
PHPとGoどちらが優れていますかとGopherには尋ねない方が身のためだ、お前は朝食に和食と肥溜めどちらにするか聞くのか？という顔になってしまい声に出すのも億劫だとため息をつかれるだろう。

若干言葉が荒れてしまっているがややワイルドな環境で育ったのと実は今アドベントカレンダー前日だということと風邪を引いて咳と鼻水の煩わしさと戦いながら書いているというバックグラウンドを知ってもらうことで共感性をキープしていただきたい。

そういうわけでGoを布教することにはメリットしかないので業務でGoを使う機会をどうやって作っていくかというのがターゲットになる。
まずやるべきは社内の開発プロセスにおけるお役立ちツールを作ることだ。
githubで管理されているプロジェクトが100あるとしてそれらを一気にcloneするツールや複数リポジトリに渡ってローカルでgit grepなどのシェルを一括実行するツールなどを実際に作って調査に役立てている。
便利なものができたなと思ったらそれをチームに配布しておすそわけするとGoって便利だね、というのがじわじわと伝わっていく。
それと時間がない中でもできるだけ綺麗にコードを書いておくと良い。
Goはバイナリで配布できるのだがそうしていてもエンジニアはすぐコードを見せてみろと言い始めるからだ。
オラついたコードを書いてしまっていると読みにくいのはGoのせいだとアンチが湧き始めてしまう。
ここはなるべく手を抜かず学習に適した教材となるように書いておくのがベストだ。

そうして機を伺っていると、とある外部APIのバージョン対応で旧バージョンのインタフェースを新バージョンのインタフェースにプロキシしてくれ！言語は問わない！みたいな案件が降ってくることがある。
とにかく急ぎで手間をかけずにできれば安く、そしてパフォーマンスも出して欲しいみたいな要望に応えるには、サーバにバイナリをおいてデーモン起動させるだけでインフラマンたちの手を煩わせずに動かせてしまうことや、自前でWebサーバを書いてしまえること、ファイルサイズも小さく、メモリも食わないなどの特性を持つGoが狂おしいほど最適なわけだ。

こうして晴れてプロダクション環境で恐らく社内史上初のGo環境を動作させることに成功したわけだが大規模Web開発での信頼度はまだまだこれからだ。

大規模Web開発での目下のライバルはSpring Boot Kotlinだ。
ｺﾄﾗｰ達に言わせるとGoはオールドスクールだと。
ラムダ使いたいとかDI自前で書きたくないとか設定ファイルを自動で読み込んで欲しいとか、まぁ分かる。
バイナリ生成はKotlin Nativeでも出来るとかimmutable思想じゃないとか色々。
Goの思想にシンプルさを保つことで得られる恩恵が色々あるよねというのが根底にある以上、今後は使いどころが分かれていくかもしれないしGo2で破壊的にWeb寄りの実装に変化していくのかもしれないがそこらへんの議論がコミュニティで活発に行われているのもGoの力強い魅力だ。
Sprint Bootフレームワークは重たいが強力だしKotlinはScalaほどやりすぎてなくて程よくモダンなバランスの良い言語なのでPHPの256億倍マシだと思っている。

そもそもエンジニアは世界平和のために美しいプロダクトを世の中に発信したいだけなので技術スタックで争うなんて必要は全くなかったはずなのだ。
いつしか競争社会の都合で限られた時間、限られたリソース、慣習や歴史によって生まれた何かの中で生きるために望まぬ戦争をやらされているのだ。
ひたすらにスキルを研磨することも許されず銃と言論を渡され戦えと焚き付けられているのだ。
今はKotlin案件にもアサインされているので積極的にそれの利点を引き出すことを考えているが、時が来れば僕はコトラーの額に銃口を向けデヴィット・フィンチャー監督作セブンのラストシーンに出てくるブラピのような顔をしているかもしれない。

小さい頃からそう育てられたのでいざという時には引き金をひけるタイプの人間ではあるが生まれる時代を間違えたのかもなぁと思ったところでこの記事は締めようかなと。
記事を書き始めた頃は何か同志にアドバイスを送るつもりだったのだがどうにも最後の言葉が浮かばない。
時計を見ると期日が迫っている。もっと早く書いとけばなぁ、と夏休みの宿題が終わらないあの頃と何も変わらないまま日々は過ぎて行く。
GromacsでRMSF解析を行う。

各アミノ酸残基のCα炭素について揺らぎの根二乗平均偏差をとったRMSF分析がある。  詳しいRMSFについては以下のサイトを参考にしてほしい。
https://www.r-ccs.riken.jp/r-ccssite/wp-content/uploads/2018/06/keisanseimeiIV__ikeguchi.1129.pdf

RMSF解析する前にアミノ酸残基のCα炭素を指定するため[ndxファイル]を作成する。
 
    gmx make_ndx -f [groファイル] -o [ndxファイル]   

次に、RMSF解析を行う。

     gmx rmsf -s [tprファイル] -f [trrファイル] -n CA.ndx -o [xvgファイル] -fit  

これによりxvgファイルにrmsf情報が出力される。
Jenkins ビルド対象のブランチを切り替えられるようにする

# 概要
前回書いた以下の記事の内容の続き
以下の記事で設定した内容に加え、ビルド対象のブランチを実行時に指定できるようにした。
　https://qiita.com/nkk777dev/private/d3dd0e52b5d992e70616


# 詳細
1. ジョブの設定画面内の「ビルドのパラメータ化」にチェックを入れる。
1. 「パラメータの追加」でブランチ名を入力するパラメータを作成。
![Jenkins2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/ab664b1d-c851-7a5b-9bbc-cc324212b434.png)
1. パイプラインスクリプトの記述を以下の内容に変更する。

```
pipeline {
    agent any
    // パラメーター定義
    parameters {
      string name: 'FRONTEND_BRANCH', defaultValue: 'develop', description: 'フロントエンドのビルド対象ブランチ', trim: false
      string name: 'BACKEND_BRANCH',  defaultValue: 'develop', description: 'バックエンドのビルド対象ブランチ', trim: false
    }
    stages {
        // フロントエンドのビルド
        stage('frontend_build') {
            steps {
                node('master') {
                    deleteDir()
                    // ブランチ名をパラメーターから取得し設定
                    git branch: "${params.FRONTEND_BRANCH}", changelog: false, poll: false, url: '【フロントエンドのリポジトリURL】'
                    bat label: '', script: 'npm install'
                    bat label: '', script: 'npm run build_dev'
                    stash name: 'frontend', includes: 'dist/**'
                    echo 'frontend build success'
                }
            }
        }
        // warファイルのビルド
        stage('backend_build') {
            steps {
                node('master') {
                    deleteDir()
                    // ブランチ名をパラメーターから取得し設定
                    git branch: "${params.BACKEND_BRANCH}", changelog: false, poll: false, url: '【フロントエンドのリポジトリURL】'
                    unstash 'frontend'
                    bat label: 'delete_sample', script: 'rd /s /q src\\main\\resources\\static'
                    bat label: 'mkdir_static', script: 'mkdir src\\main\\resources\\static'
                    bat label: 'copy_frontend_build', script: 'xcopy /S dist src\\main\\resources\\static'
                    bat label: 'delete_frontend_build', script: 'rd /s /q dist'
                    withEnv(['JAVA_HOME=C:\\Program Files\\Java\\jdk1.8.0_201']) {
                        bat label: 'bootWar', script: 'gradlew.bat bootWar'
                    }
                    archiveArtifacts 'build/libs/**'
                    echo 'backend build success'
                }   
            }    
        }    
    }    
}
```

# まとめ
検証環境用に作成しているJobで設定しているが、検証ブランチを指定してビルド・検証を行えるようになったため、けっこう便利。
Railsでmodelに動的なカウンターをつける

### 要約
railsで一覧画面に何かしらの集計値とかフラグを表示したいときがあると思います。
いいね数とかそういうの。
それをcounter_cacheとかでデータとして持たずに、動的に集計してきれいに組み込む方法です。

### やり方
```ruby
class Post < ApplicationRecord
  has_many :likes, as: :likable
end

class Like < ApplicationRecord
  belongs_to :likable, polymorphic: true
end

@posts = Post.all.select("posts.*, (select count(*) from likes l where l.likable_type='Post' and l.likable_id=posts.id) as likes_count")

@posts.first.likes_count # as xxxがattributeになる
=> 3
```

サブクエリ`(select count(*) from likes l where l.likable_type='Post' and l.likable_id=posts.id)`の中は好きなように書けるので、かなり汎用性高くフラグなりなんなりつけられるので、これだけ覚えておけば集計付き一覧はだいたいできると思います。

個人的にrailsのjoin+preload/eager_load/includesなどを使ってrailsのオブジェクトとしてしっかりつくる、という方法にこだわってきたのですが、これだとassociationの書かれ方に影響されて毎回違う書き方になってしまいます。フラグがひとつふたつ付けばいい場合にはやりすぎになってしまいがちです。
一方で、この書き方は多少生のsql書いてしまいますが、使い回しが効くのではないかと思います。
Gromacsで分子間距離解析を行う。

__MDシミュレーションで得られた、特定のプロテイン重心間距離の変化を求める。__
<img width="742" alt="スクリーンショット 2019-12-02 17.12.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/3f40be40-887f-fb52-69b3-c0dbc0a80705.png">

__距離解析する前にプロテイン群を指定するため[ndxファイル]を作成する。__
 
     gmx make_ndx -f [groファイル] -o [ndxファイル]     

<img width="449" alt="スクリーンショット 2019-12-02 17.22.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/cfb32c31-f75e-6084-5c0d-87d57a7476ff.png">
<img width="449" alt="スクリーンショット 2019-12-02 17.22.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/c6ec64d5-ba6c-32a6-d1a9-2096ca5e3df5.png">

__以下のコマンドでプロテイン群の重心間距離"ProteinA"、"ProteinB"間距離解析を行う。__
   
    gmx distance -f [trrファイル] -s [groファイル] -n [ndxファイル] -oav distance.xvg -select 'cog of group "ProteinA" plus cog of group "ProteinB"'
さくらインターネットサーバSSLサーバ証明書更新

WEBサイトのSSLサーバ証明書更新手順を纏めたので紹介します。
例 : https://xxxxx.jp/

## 認証ファイルのダウンロード
会員メニューにログイン
      https://secure.sakura.ad.jp/menu/service/index.php

「契約情報」の一覧から該当サービスの「サーバ証明書」ボタンをクリックのうえ詳細画面より認証ファイルをダウンロード
認証ファイル名は、[ランダムな文字列].txtです。ファイル名は申請ごとに異なります。

## 認証ファイルのアップロード
ダウンロードした認証ファイルを、申請時に指定したFQDN(コモンネーム)配下にアップロード
 https://[ルートドメイン名]/.well-known/pki-validation/[ランダムな文字列].txt
 
 アップロードしたファイルがJPRS側からクロールされて、
 200でアクセスされてしばらくすると下記の証明書ファイルが発行されます。
xxxxx.jp.csr
xxxxx.crt
xxxxx.jp.key

 ## 中間CA証明書のダウンロードをダウンロードする。
 https://jprs.jp/pubcert/service/certificate/
 ファイル名：JPRS_DVCA_G3_PEM.cer　（例）
リネーム：xxxxx.jp.ca
 
 ## keyファイルのパスワードを抜く（server_20190709.key）
 keyファイルのパスワードを抜く為に、xxxxx.jp.keyファイルは、xxxxx.jp.key.oldにリネームする。
 
 keyファイルのパスワードを抜くコマンドは下記です。
 openssl rsa -in xxxxx.jp.key.old -out xxxxx.jp.key		
パスワード聞かれるのでパスワードを入力する(keyのpassphrase)		

## confファイル設定
SSLCertificateFile    /etc/httpd/ssl/xxxxx.crt
SSLCertificateKeyFile /etc/httpd/ssl/xxxxx.jp.key
SSLCertificateChainFile /etc/httpd/ssl/xxxxx.jp.ca

## config文法チェック
service httpd configtest

## 状態チェック（rootでない場合：sudo追加）		
sudo service httpd status あるいは
sudo /etc/init.d/httpd status

## 再起動		
sudo service httpd restart あるいは
sudo /etc/init.d/httpd restart		

## サイトで反映＆有効期限を確認
![スクリーンショット 2019-12-02 16.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274686/c6943f95-0811-c7d0-8e7b-8cfd37af7462.png)

## 下記のURLでも各証明書の反映結果を確認			
https://ssltools.digicert.com/checker/views/checkInstallation.jsp			
サイトURL （https://xxxxx.jp/ ）のこの部分（ xxxxx.jp/ ）を入力して「Check」ボタン押下で反映されたかを確認できる。

![スクリーンショット 2019-12-02 17.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274686/be5417f7-fa28-22d0-b7db-febfc665af6d.png)