OmniAICreator/Qiita-1.07M huggingface dataset:
初心者のためのVB.NETの基本 ~変数編~

####はじめに
初心者向けに参考書の0章によくある感じのお話です。
なお、VB.NETに限らずプログラミングのイロハ的な内容も含んでいます。

##各種変数について

####グローバル変数

どのクラス、関数からでも参照できる変数。classの外側に記述する。

※ただ実戦において、グローバル変数を積極的に使用するのは好ましくないみたいです。[このあたり](https://teratail.com/questions/43184)を読むと理解が深まりそう。

####メンバ変数
class内のいずれの関数内でも参照できる変数。classの内側の関数の外側に記述する。変数はアクセス装飾子を付けることで、適用範囲を定めることができます。

```
Public Class Sample
    '↓ここでメンバ変数宣言↓
    Private hensuu As String
    '↑ここでメンバ変数宣言↑

    Public Sub Kansuu()
        hensuu = "変数"
    End Sub
```

上記コードの
`Private hensuu As String`
の部分でPrivateはアクセス装飾子、As Stringは変数の型を表しています。

######※アクセス装飾子とは

| アクセス装飾子|スコープ|
|:-----------------|:------------------|
| Public|他クラスから参照可能|
| Protected|クラス内の派生クラスから参照可能|
| Friend|同一アセンブリ内から参照可能|
| Private|同一クラス内からのみ参照可能|

Friendはつまり、
同一のプロジェクト内からのアクセスに対してはPublic、他のプロジェクトからのアクセスに対してはPrivateと同等の状態を意味する。


####ローカル変数
`Dim hensuu As String`

上記のように関数内に定義される、その関数内でのみ使用する変数。なお一度処理が終わり、再びその関数を参照する際にはhensuuには初期値が再度代入されていることに注意したい！

もしhensuuの中身を関数の外で扱いたいなら、メンバ変数なりより広い範囲で使用できる変数に入れなおす必要が生じる。


######参考リンク
[VB もっと変数 ～ 変数の適用範囲、寿命、同じ名前の変数など](http://rucio.o.oo7.jp/main/dotnet/shokyu/standard8.htm)
今回の記事作成に当たり、特に勉強になったページです。

##リファレンス
初心者はもちろん、玄人の皆さんも参照されていること必至のリンク群です。

[DOBON.NET](https://dobon.net/vb/dotnet/index.html)
具体的かつ詳細に豊富な単元について解説されている。.NETを書く人なら一度はお世話になっていそうな有名なサイトです。

[Microsoft公式](https://docs.microsoft.com/ja-jp/dotnet/#pivot=docs&panel=dotnetguides)
困ったときは公式に当たるのが定石らしい。

[VisualBasic中学校](http://rucio.o.oo7.jp/main/main.htm)、[VB図解](http://rucio.a.la9.jp/main/kiso/index_kiso.htm)
こちらも単元ごとにていねいに解説されています。

[未確認飛行C](https://ufcpp.net/)
VB.NETにフォーカスしていないものの、参考になる部分も多そうです。
【Linuxコマンド】圧縮ファイルの先頭n行をcatで出力

# headと組み合わせる
例えば、bzip2形式で圧縮されたファイルの先頭1行を出力する場合は、以下のコマンドになります。

```bash

bzcat ファイル名.bz2 | head -n1
```
MacOSでpip install mysqlclientが失敗する場合の対処

失敗する原因はいくつかあります。
今回の対処方法は以下ができているのにまだ失敗する場合の対処方法です。

- 最新のXcodeのコマンドラインツールがインストール済み
- 最新のpipインストール済み
- Mysqlインストール済み
- OpenSSLインストール済み

上記問題ないのに下記のようなエラーが出ます。

```
    ld: library not found for -lssl
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    error: command '/usr/bin/gcc' failed with exit status 1
```

この場合、下記の方法でインストールを実行するとインストールできました。

```
LDFLAGS=-L/usr/local/opt/openssl/lib pip install mysqlclient     
```

via [Can't install mysqlclient on MacOS · Issue #131 · PyMySQL/mysqlclient-python](https://github.com/PyMySQL/mysqlclient-python/issues/131)
docker-compose の コンテナ に対して inspect するには docker-compose ps -> docker inspect <SERVICE NAME> : #docker

例

```
$ docker-compose ps
                Name                              Command               State                                Ports
----------------------------------------------------------------------------------------------------------------------------------------------
some_app_1           command ...   Up       0.0.0.0:3001->3001/tcp
```

```
docker inspect some_app_1 
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2742








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
NumPyのaxis

axisを指定してndarray配列を計算する方法
0で列方向に計算
1で行方向に計算

```ruby:
import numpy as np

arr = np.array([[1, 2 ,3], [4, 5, 6]])

print(arr.sum())
print(arr.sum(axis=0))
print(arr.sum(axis=1))
```
```ruby:
>>> 出力結果
21
[5 7 9]
[ 6 15]
```
Search and Replaceで置換できない文字列をブックマークレットでどうにかする

##なにこれ
Webページ内の文字を置換する拡張機能として[Search and Replace](https://chrome.google.com/webstore/detail/search-and-replace/bldchfkhmnkoimaciljpilanilmbnofo?hl=ja)が有名だが、複数のフォームとかモーダル内のフォームには全然使えない。

Webページ内の複数フォームの文字を一括で置換できるようなブックマークレットを作成した。
##ダイアログで置換前→置換後を入力→置換
```henkan_seikei.js
javascript: (function() {
  var s = prompt('検索する文字列');
  var d = prompt('置換後の文字列');
  document.body.innerHTML = document.body.innerHTML.replace(new RegExp(s, 'g'), d);
})();
```

```henkan.js
javascript: (function() {var s=prompt('検索する文字列');var d=prompt('置換後の文字列');document.body.innerHTML=document.body.innerHTML.replace(new RegExp(s,'g'), d);})();
```

これをブックマークに登録。


##参考
http://itouhiro.hatenablog.com/entry/20130411/js
このサイトに書かれているコードではグローバルマッチされなかったため、
https://qiita.com/naoyashiga/items/75bce8cabbbab29b0ccb
を参考にした。
RubyとPHPで簡単なアプリケーションを作ってみる。

##概要
巷では
RubyとPHPどちらを勉強した方がいいですか？
といった質問や

RubyとPHP徹底比較！
といった記事が散見されます。

初学者の方でも書けるじゃんけんアプリをRubyとPHPで作成しました。

##Ruby
```janken.rb
class Play
  def player
    puts '数字を入力してください'
    puts '0:グー'
    puts '1:チョキ'
    puts '2:パー'
    player_hand = gets.to_i
  end

  def enemy
    janken = [0,1,2]
    enemy_hand = janken.sample
  end

  def pon player_hand,enemy_hand
    puts "あなたの手#{player_hand}"
    puts "相手の手#{enemy_hand}"
    
      if player_hand === enemy_hand
        puts "アイコです、もう1回"
        return true
      elsif enemy_hand - player_hand === 1 || enemy_hand - player_hand === -2
        puts "あなたの勝ち"
      else
        puts "あなたの負け"
      end
  end
end

$play = Play.new
$p = $play.player
$e = $play.enemy
$j = $play.pon($p, $e)

if $j == true
  $p = $play.player
  $e = $play.enemy
  $j = $play.pon($p, $e)
end
```

##PHP
```janken.php
<?php
class Play
{
    public function player(){
        echo "数字を入力してください";
        echo "0:グー";
        echo "1:チョキ";
        echo "2:パー";
        $player_hand = (int)fgets(STDIN);
        return $player_hand;     
    }
    public function enemy(){
        $janken = array(0,1,2);
        $enemy_hand = array_rand($janken);
        return $enemy_hand;
    }
    public function janken($player_hand, $enemy_hand){
        print_r('あなたの手'. $player_hand);
        echo PHP_EOL;
        print_r('相手の手'.$enemy_hand);
        echo PHP_EOL;
            if ($player_hand === $enemy_hand){
                echo "アイコです";
                echo PHP_EOL;
               return true;
            }elseif($enemy_hand - $player_hand === 1 || $enemy_hand - $player_hand === -2){
                echo  "あなたの勝ち";
            }elseif($player_hand - $enemy_hand === 1){
                echo  "あなたの負け";
            }
    }
}

$play = new Play();
$p = $play->player();
$e = $play->enemy();
$j = $play->janken($p, $e);

if ($j == true) {
    $p = $play->player();
    $e = $play->enemy();
    $j = $play->janken($p, $e);
}
?>
```

参考にさせて頂いた比較記事。

【超初心者向け】大まかにRubyとPHPを比較してみる
https://eng-entrance.com/ruby-php

気になる！PHPエンジニアの年収と案件。Rubyとの違いも含めて説明
https://blog.codecamp.jp/php-ruby-income

【PHP vs Ruby】Webサービス開発はどっちがオススメ？
https://mynavi-agent.jp/it/geekroid/2017/08/php-vs-rubyweb.html
gitにコミット

gitにコミットするときの呪文たち

```
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/XXX/XXX.git
git push -u origin master
```
gitとの接続がhttpsだとgit push毎にパスワード聞かれるので、
うっとおしいわ！っていう人はorigin以下をsshのほうで設定すればOK
vimiumチートシート

###vimiumとは###
Google Chromeプラグイン。vimっぽくChromeを動かせる。
自分の場合はvimを使ったことがなく、ネットサーフィンをしながら操作に慣れることができそうなので、入れてみました。

###インストール方法###
[vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)

###level 01###
| コマンド         |  操作             |
|:-----------------|------------------:|
| shift + ?        | helpを開く。見やすい。チートシート不要説 |
| j,k,h,l          | 上下左右にスクロール |
| shift + j        | 左のタブへ移動 |
| shift + k        | 右のタブへ移動 |
| shift + h        | 前の画面へ |
| shift + l        | 次の画面へ |
| gg               | 画面最上部へ |
| shift + g　      | 画面最下部へ |
| b                | ブックマークを検索 |
| shift + b        | 新しいタブでブックマークを検索 |

###所感###
jkとshift + jkを使いこなすだけでも結構便利そうです。ctrl + tabより便利ですね。
ほかにも便利だと思ったショートカットは随時追加します。
Ubuntuで環境変数を設定するには

# 環境
Ubuntu 16.04.5 LTS

#はじめに

環境変数を設定する場合、ググると、**~/.bash_profile** に記述するように書かれている記事が多いが、自分の環境では、デフォルトで、**~/.bash_profile**が存在していない。この場合、どうすればいいのだろうか。

# 方法

**~/.bash_profile**は存在していないが、ホームディレクトリによく似たファイルで、**~/.profile**が存在している。この中身を見るとヒントがあった。

>
 ~/.profile: executed by the command interpreter for login shells.
 This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login exists.
 see /usr/share/doc/bash/examples/startup-files for examples.
 the files are located in the bash-doc package.
 
>>
~/.profileは、ログインシェルから実行される。
~/.bash_profile または、~/.bash_loginが存在すれば、~/.profileは、実行されまれません。

ここを見て解決した！
https://askubuntu.com/questions/510709/i-cannot-find-bash-profile-in-ubuntu

つまり、ログインシェルは、**/etc/profile**を読み込んだ後、下記の順番で読み込もうとするようだ。ポイントは、`~/.bash_profileが存在していれば、以下のファイルは読み込まれなくなる`という事。

1. ~/.bash_profile
2. ~/.bash_login
3. ~/.profile

~/.bash_profileがないからと言って、新規で、~/.bash_profileを作ってしまうと、デフォルトで存在していた、~/.profileが読み込まれなくなるという事になる。~/.profileの中を見ると分かるのだが、~/.bashrcは、~/.profileから実行されています。

~/.profileを~/.bash_profileにリネームして、~/.bash_profileに環境変数を追加してもいいのだろうが、~/.profileが存在していれば、環境変数は、素直に、~/.profileに記述しましょうというお話でした。

### 補足

シェルスクリプトの起動順番については、ここの教材でも学習できるよ！
https://www.techpit.jp/courses/190
OracleDBでの大文字小文字を区別しないlike検索について

# Oracle11gで、大文字-小文字を区別しないlike検索をしたい

## 結論
```sql
select col_1
from tbl
where UPPER(col_1) = UPPER('%joken%')
;
```
または

```sql
select col_1
from tbl
where REGEXP_LIKE(col_1, 'joken', 'i')
;
```

のいずれか。

[REGEXP_LIKE - Oracle SQL 関数リファレンス](https://www.shift-the-oracle.com/sql/functions/regexp_like.html)

## 注意
`UPPER()`や`LOWER()`または`REGEXP_LIKE()`を使うとfull scanになる。
そのため、index scanを実行できる曖昧検索は、**大文字小文字を区別する前方一致の検索**のみである。
【minecraft】サバイバルにおいて大事なアイテムは？

# はじめに
minecraftでサバイバルをすることになりました．
さて，生き残るためにすべきことは？作成すべきアイテムは？

※これは拡張ネットワーク法というアルゴリズムを用いて各アイテムの関係や重要性を知ろうとした話です．

jupyter notebookで実行しています．また，可視化はCytoscapeで行っています．


# 拡張ネットワーク法
以下の図で説明されます．
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/0d0f6295-7777-7ce4-0680-b12cbf54fea3.png)

存在するアイテムから現在クラフト可能なアイテムを調べ，それを存在するアイテムに追加します．
これを収束するまで繰り返します．

内部的には以下の行列で扱っています．

・レシピの左辺を表した行列R

||A|B|C|D|E|F|...|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|レシピ1|1|1|0|0|0|0|
|レシピ2|0|1|1|0|0|0|
|...|||||||

・レシピの左辺の要素数を表したベクトルB

||数|
|:--:|:--:|
|レシピ1|2|
|レシピ2|2|
|...||

・レシピの右辺を表した行列P

||A|B|C|D|E|F|...|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|レシピ1|0|0|0|1|0|0|
|レシピ2|0|0|0|0|1|0|
|...|||||||

・存在するアイテムを表した行列x

||A|B|C|D|E|F|...|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|存在する？|1|1|0|0|0|0||


手順ですが，
1. Rとxの内積をとり，それがBと一致するか確かめる
　　　つまり，クラフトに必要なアイテムがすべて存在するかどうか確かめます．
2. 一致した場合，そのレシピがクラフトされたとしてRに対応するPをxに加える
　　　クラフトされたアイテムをxに追加します．

これを収束するまで繰り返します．

#レシピのデータベース作成
minecraftのレシピのデータベース(上の説明でいう「全レシピ」)を作成します．
[minecraft wiki](https://minecraft.gamepedia.com/Minecraft_Wiki)　からレシピを引用しました．
csvファイルでまとめておきます．
![minecraft_reactions.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/cd3e4a36-cde5-9da4-69e6-05eebc31e7c9.png)

""で囲っているのは文字列を取り出す処理で便利だからです．

# 実行
流れをスクリーンショットで紹介します．プロブラムは上の拡張ネットワーク法を実装したものがメインです．

## インポート
![0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/dedf7c6b-adc8-ac1d-78ac-97ee9214b2e1.png)

## アイテム辞書作成
取り込んだレシピをもとに，アイテムの辞書を作成します．
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/169b2e8b-1481-00d5-8b09-8f57b0dcac85.png)

## 初期アイテムを指定
みなさん，サバイバルモードで降り立ったらまず何を手に入れますか？
というわけで今回は比較的初期に揃うであろう木(log)，丸石(cobblestone)，鉄インゴット(iron ingot)を初期アイテムとしました(鉄インゴットの入手はそんなに簡単ではないかもしれませんが．．．)．

## 実行結果
上略ですが，計62個のアイテムがクラフトされました．
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/12606719-f444-8899-e1d3-e39737d2fe12.png)

# 可視化
Cytoscapeで可視化してみましょう．
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/6aa41326-ce57-b0e9-31d9-c5132a457ac4.png)

多数のエッジが伸びているノードが重要アイテムということになります．

今度は初期アイテムにダイヤモンドを追加してみました．
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/6570851b-5d75-21b3-e01f-5d9dfcb5f229.png)

# 結論
棒，大事．

ご覧いただきありがとうございました．

# 参考文献
https://www.cell.com/fulltext/S0092-8674(17)30133-2
拡張ネットワーク法について書かれています．
CentOS8.0にPHP7.3をdnfでインストールする

# サポート期限を確認しておく
バージョンについておさらい...:writing_hand_tone2:
参考: [PHPのリリース日とサポート期限](http://qiita.com/bezeklik/items/72d1ff8393f66673e2bc)

今回はPHP7.3をインストールしてみる:baby_tone2::point_up_tone1:

#CentOS8.0にPHP7.3をdnfでインストールする

まずは、おまじない :ok_hand_tone1:
EPELリポジトリとRemiリポジトリを追加します。

```console
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
```

必要最小限でインストール。

```console
$ sudo dnf module install -y php:remi-7.3
```

できたできた:clap_tone2:
バージョンを確認する

```console
$ php -v
PHP 7.3.12 (cli) (built: Nov 19 2019 10:24:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.12, Copyright (c) 1998-2018 Zend Technologies
```
よしゃ:ok_hand_tone2:

## おまけ(自分用メモ)
個人的に必要そうなものもサクッと追加:muscle_tone1:

```console
sudo dnf install php-mysqlnd php-pecl-xdebug php-intl php-zip
```
JavaScript(ES6) テンプレートリテラルと文字列の連結

##はじめに
プログラミング言語ではよく文字列の連結が行われる。
JavaScript(ES6) では文字列の連結も使用することができるが、
テンプレートリテラルという便利なものがあるので紹介したいと思う。

##結論から
<b>長く読みづらい文字列の連結をシンプルに書ける。</b>
『文字列の連結』

```javascript

const name = "デク";
const age = 16;
const food = "リンゴ";

console.log("私の名前は"+ name + "です。" + "年齢は" + age + "歳です。" + "好きな食べ物は" + food + "です。");
//出力結果：私の名前はデクです。年齢は１６歳です。好きな食べ物はリンゴです。
```
『テンプレートリテラル』

```javascript
const name = "デク";
const age = 16;
const food = "リンゴ";

console.log(`私の名前は${name} です。年齢は${age}歳です。好きな食べ物は${food}です。`);
//出力結果：私の名前はデクです。年齢は１６歳です。好きな食べ物はリンゴです。
```

##詳細
【文字列の連結】
文字列と文字列を「+」で繋げることで一つの文字列とする
変数や定数も繋げることができる

```javascript
console.log("私が" + "デクだ");
//出力結果：私がデクだ
console.log("20" + "15");
//出力結果：2015
//数字を文字列として扱っているので計算されず、連結されて出力されている

const name = "デク";
const age = 16;
console.log("私の名前は"+ name + "です。" + "年齢は" + age + "歳です。" );
//出力結果：私の名前はデクです。年齢は16歳です。
```


【テンプレートリテラル】

文字列の中の<b>${}</b>に定数や変数を囲むことで文字列に埋め込むことができる。
そのため、どれが定数や変数かということが分かりやすくなり、
コードに「+」を書く必要がないため、コードを短く書くことができる。
文字列はバッククォーテーション（`）で囲む



```javascript
const name = "デク";
const age = 16;

console.log(`私の名前は${name} です。年齢は${age}歳です。`);
//出力結果：私の名前はデクです。年齢は16歳です。
```

※バッククォーテーション（`）はJISキー(日本語配列)とUSキー(英語配列)によって出力方法が異なる。
下記の図を参照


![9581922i.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529836/a2a018af-dc8d-2956-d60d-5d2536dafde6.jpeg)

##まとめ
テンプレートリテラルを使用することで「+」を書く手間を削減し、そして読みやすい書き方をすることができる。
本記事では単純な文字の連結について説明したが、もっと詳しく知りたい方は下記も参考にしてください。
[■MDN web docs(テンプレート文字列)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings)
2019年にIE 11に対応するためのbabel設定

絶対また忘れるのでメモしておきます。
余裕ができたら検証したい…！

```package.json
{
  ...
  "scripts": {
    "build": "webpack --config webpack.config.js"
  },
  "devDependencies": {
    "@babel/core": "^7.7.2",
    "@babel/preset-env": "^7.7.1",
    "babel-loader": "^8.0.6",
    "core-js": "^3.4.1",
    "regenerator-runtime": "^0.13.3",
    "webpack": "^4.41.2",
    "webpack-cli": "^3.3.10"
  }
}

```

```babel.config.js
module.exports = {
  presets: [
    [
      '@babel/preset-env',
      {
        targets: {
          ie: '11'
        },
        useBuiltIns: 'usage',
        corejs: 3
      }
    ]
  ]
}
```

```webpack.config.js
module.exports = {
  ...
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader',
          }
        ]
      }
    ]
  }
}
```

```main.js
import 'core-js/stable';
import 'regenerator-runtime/runtime';

...
```
応用カリキュラム jQuery 01

jQueryはjavascriptと同じく、htmlから要素を取得してそれに対して操作する。

```js
// HTML要素の取得
IDセレクタ $("#aaa")
クラスセレクタ $(".aaa")
要素セレクタ $("h1")
属性セレクタ $("[ 属性 = '値' ]")
// javaScriptで書いていたDOM要素の取得を全て共通の$("セレクタ名") で書き換えることができる
```

```js
// ノードのクラス削除
removeClass()
// ノードのクラス追加
addClass()
// DOMの集合から指定したDOMと同じ要素番号を取得
index("セレクタ")
// javascriptのように一旦配列として読みこむ処理が不要
```
PowerShell 文字数を指定して変数に格納された文字列 を 取得する

# 目的

- PowerShellで変数に格納された文字列の文字数を指定して出力する方法を知る。

＃書き方の例

- 変数には任意の文字列が格納されているものとする。
- 基準文字から何文字を出力、基準文字から後ろの文字を全て出力、文字列末尾から何文字を出力などなどいろいろなことができる。
- 下記に当該処理の書き方の例を記載する。

```powershell
# X文字目からY文字出力する
Write-Host $変数.Substring(X, Y);

# X文字目から後ろの文字全て出力する
Write-Host $変数.Substring(X);

# 文字列末尾からX文字を出力する
Write-Host $変数.Substring($変数.Length -X, X);
```

＃より具体的な例

- 変数`number`には「123456789」が格納されているものとする。
- 3文字目から6文字目までを出力、6文字目から後ろの文字を全て出力、文字列末尾から2文字を出力する方法を記載する
- 下記に当該処理の書き方の例を記載する。
- `->`の後に記載されている文字は出力を表す。

```powershell
# 変数への値の格納
$number = '123456789';

# 3文字目から6文字出力する
Write-Host $number.Substring(3, 6);
->456789

# 6文字目から後ろの文字全て出力する
Write-Host $number.Substring(6);
->789
# 文字列末尾から3文字を出力する
Write-Host $number.Substring($number.Length -2, 2);
->89
```
CentOS8 firewalld iptables 肝

firewalldとiptablesの違いは他のページで沢山説明されているのでここでは省略w

長年使用していたCentOS6もそろそろ限界（セキュリティ的に）だし、使用しているマシンも限界だし次の１０年に向けてリニューアルを考え、CentOS8への移行準備中に解った肝の部分を公開。
公開と言うと自分的には大げさなんだが、まぁ、誰かの助けになればと言うことです。

今回、自宅サーバ環境で必須のファイアウォールを一新することにもなるのでまずはそこから。

現行はCentOS6のiptables PREROUTINGを使って基本的なポート管理。
CentOS7からこのiptablesがfirewalldになって使いやすくなったということで、ならば試すかという次第。

ネットでfirewalld PREROUTINGを探るも、皆さま苦労してるのねという結果と
実際にそれを試して、あ～こうなっちゃうのねという理解から、これで良し！ということまで漕ぎつけたので公開します。（思考錯誤、Try and Error、楽しかった）

では結論。
iptables　PREROUTINGは忘れましょう。PREROUTINGという言葉も忘れましょう。
firewalldではrich ruleを使います。

###firewall-cmd --list-all --zone=external
       external (active)
       target: default
       icmp-block-inversion: no
       interfaces: eth0
       sources:
       services: ssh
       ports:
       protocols:
       masquerade: yes
       forward-ports:
       source-ports:
       icmp-blocks:
       rich rules: <-- here!

###firewall-cmd --permanent --zone=external --add-rich-rule 'rule family=ipv4 forward-port port=22 protocol=tcp to-port=22 to-addr=172.xx.xx.1'
       defGW
        ↑
		□  zone=external
	/------------+
	| Firewall-1 | □ zone=dmz(172.xx.xx.3) 
	+------------/
		□ zone=internal

上記で、externalに届いたport22 sshパケットは172.xx.xx.1へ届けられた。
当然接続確認済。

       external (active)
       target: default
       icmp-block-inversion: no
       interfaces: eth0
       sources:
       services: ssh
       ports:
       protocols:
       masquerade: yes
       forward-ports:
       source-ports:
       icmp-blocks:
       rich rules:
             rule family="ipv4" forward-port port="22" protocol="tcp" to-port="22" to-addr="172.xx.xx.1"

今回は、ここまで。　2019/11/20
【Rails】deviseをインストールするだけで一時的に詰まったお話。

極々普通にdeviseのインストールをしたかっただけなのですが詰まったので備忘録として。

極々普通にGemfileに下記を記載。

```:Gemfile
gem 'devise'
```

極々普通にbundle installを実行。

```:ターミナル
$ bundle install
```

ローカルサーバー立ち上げてる場合は再起動。
devise専用のコマンドを利用して設定ファイルを作成。

```:ターミナル
$ rails g devise:install
Running via Spring preloader in process 26467
Could not find generator 'devise:install'. Maybe you meant 'css:assets', 'assets' or 'generator'
Run `rails generate --help` for more options.
```

何を言っているんだ君は？😫


```:ターミナル
$ bundle list
…中略…
* devise (4.7.1)
…中略…
```

おるやんけ？:thinking:

調べたら稀によくあるとのことで、ここを参考に一度アンインストール。
https://qiita.com/kazto/items/63d7b78980ff299de210

```:ターミナル
$ bundle exec gem uninstall devise
```
すると何故か

```:ターミナル
Select gem to uninstall:
 1. devise-4.6.2
 2. devise-4.7.0
 3. devise-4.7.1
 4. All versions
> 4
Successfully uninstalled devise-4.6.2
Successfully uninstalled devise-4.7.0
Successfully uninstalled devise-4.7.1
```

devise-4.6.2とdevise-4.7.0、君らをインストールした覚えないんやが？😫
愚直に全消し。

一旦springを止める。

```:ターミナル
$ spring stop
```


bundle update または bundle installを実行し、Gemfile.lockから削除。

```:ターミナル
$ bundle update
または
$ bundle install
```

Gemfile.lockを確認し、削除されていることを確認したら最初からやり直し。

```:Gemfile
gem 'devise' #を最終行に追記
```

```:ターミナル
$ bundle install
```

```:ターミナル
$ rails g devise:install
Running via Spring preloader in process 26751
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
```

迷子になったdevise君なんておらんかったんや…:ok_woman:
オブジェクト指向の利点について

## はじめに
自分の中の「オブジェクト指向っておそらくこういう利点があるんじゃないか説」を記事にします、よろしくお願いします。

## オブジェクト指向とそうじゃない指向の説明
よく見る「車」を例にあげて考えたいと思います。

車には車体、エンジン、タイヤなど多くの情報があります。

「オブジェクト指向」では車を「１つ１つの部品が組み合わせられたもの」として考えて作成しようとします。

部品を一つに組み上げるクラスを作って、車体を作るクラス、エンジンを作るクラス、タイヤを作るクラスなどそれぞれの部品を作るクラスをインスタンスとして呼び出すことで車を作ります。

対して「そうじゃない指向」では車を「全体で１つのもの」として考えて作成しようとします。

車という１つのものを作るので、車体、エンジン、タイヤなどのデータ作成をメソッドとして内蔵したクラスを１つ作ります。

## オブジェクト指向の利点
どちらも「車を作る」ということには成功しています。

しかし、「そうじゃない指向」では、機能を追加する・改造するのにめちゃくちゃ手間がかかります。

例として、タイヤの大きさが違う車を作ることを考えます。

「そうじゃない指向」では部品が全て１つのクラスに入っているため、タイヤの大きさを変更できるようにする時、クラス全体に問題が起きていないかを確認する必要が出てきます。

タイヤメソッド内部だけでなく、クラス全体の確認までしなければいけないので非常に効率が良くありません。

しかし、「オブジェクト指向」では、それぞれの部品が独立したクラスで出来ています。
そのため、タイヤの大きさを変更できるようにする時、タイヤを作っているクラスを修正・確認すれば良いのです。

いくつもメソッドが入っている大きなクラスのテストより、タイヤを作るだけの機能しか持っていない小さいクラスをテストする方が簡単に済みます。

## まとめ
オブジェクト指向を利用する利点を自分なりに考えてみました。

プログラムを作成していると、どうしても後から「ここを変更できるようにしたい」という改修点は出てきます。
そういった改修を容易にする手段としてオブジェクト指向があるのかな、と思います。

## 参考にしたWebページ
[初心者向けに徹底解説！オブジェクト指向とは？](https://eng-entrance.com/what-oop)
[オブジェクト指向とは何か？わかりやすい例で説明してみた。](https://www.sejuku.net/blog/5973)
--max_old_space_sizeか--max-old-space-sizeか--max_old-space_size

ググると両方でてくる。ハイフン、アンダースコア。どっちが正しいのか

## TL;DR;

全部OK、混ぜてもOK

```sh
node --max_old_space_size ./server.js # アンダースコアOK
node --max-old-space-size ./server.js # ハイフンOK
node --max-old-space-size ./server.js # 混ぜてもOK
```

`v8.2` 以前だとアンダースコアのみOK

```
$HOME/.nvm/versions/node/v7.10.1/bin/node --max_old_space_size ./server.js # OK
$HOME/.nvm/versions/node/v7.10.1/bin/node --max-old-space-size ./server.js # NG
```
## リンク

- [v8\.2\.0 proposal by addaleax · Pull Request \#13744 · nodejs/node](https://github.com/nodejs/node/pull/13744)
    - [src: whitelist v8 options with '\_' or '\-' by sam\-github · Pull Request \#14093 · nodejs/node](https://github.com/nodejs/node/pull/14093)

- "All options, including V8 options, allow words to be separated by both dashes (-) or underscores (_)."
    - https://nodejs.org/docs/latest-v12.x/api/cli.html
RHEL サービス起動の確認方法

#サービス起動の確認方法とは？
##systemctlコマンドの利用
下記コマンドを使って個々のサービスの起動確認を実施します。

```
[定型文]
# systemctl status サービス名

[使用例]
# systemctl status kdump
```

##起動したい場合
```
[定型文]
# systemctl start サービス名

[使用例]
# systemctl start kdump
```

##停止したい場合
```
[定型文]
# systemctl stop サービス名

[使用例]
# systemctl stop kdump
```



##自動起動を有効にしたい場合
```
[定型文]
# systemctl enable サービス名

[使用例]
# systemctl enable chronyd
```



##自動起動を無効にしたい場合
```
[定型文]
# systemctl disable サービス名

[使用例]
# systemctl disable snmpd
```

##サービス一覧を参照したい場合
サービスのみの一覧を参照したい為、--type=serviceと指定します。

```
# systemctl list-unit-files --type=service
```

##systemctlコマンドの結果の見方

| 表示                 |  説明　　　　                     |
|:---------------------|:---------------------------------|
| active(running)      | 起動中(常にクライアントからの問い合わせ待ち)      |
| active(existed)      | 起動中(サービス起動時に処理された後はのんびり待つ)    |
| inactive(dead)       | 起動しておらず、起動失敗もしていない  |
| failed      　　　　  | 起動失敗         |


##引用

systemctlコマンドの使い方
>https://milestone-of-se.nesuke.com/sv-basic/linux-basic/systemctl/

以上がサービス起動確認方法でした。
最後までご覧いただきありがとうございました！
応用カリキュラム javascript 02

いよいよ、html/cssとの連携

HTML上のボタンをjavascript上で扱えるようにする。

###DOM

DOMとはDocument Object Model(ドキュメントオブジェクトモデル)の略
HTMLは階層構造になっている。これを、DOMツリーとしてjavascriptが取得して自由に操作する。

DOMツリーの一つ一つのタグをノードと呼ぶ。javascriptでは、CSSと同じくid名やクラス名でノードを取得する。

```js
ID名でノード取得 document.getElementById("id名");
クラス名でノード取得 document.getElementsByClassName("class名");
// ID名で取得と比較して、複数定義されるクラスは全ての定義済みクラスを取得するので
// getElement「s」になっていることに注意しておく。
セレクタ名でノード取得 document.querySelector("セレクタ名");
// 合致する最初のノードをセレクタを取得(万能のメソッド？)
```

```js
// 各種イベントの取得 イベントリスナ
(ノードオブジェクト).addEventListener("イベント名", 関数);
// イベントリスナはHTML読込時のヘッダで読み込まれるが、イベントリスナの読込元のボタンなどは
// ボディーに書き込まれていることが多い為、ヘッダ読み込み時点ではイベントを取得できない。
// そこで、ページの読み込みを先に行う。
window.onload = function() { 処理 };
// もしくは
window.addEventListener('load', function() { 処理 });
```

```js
// ノードの中身を書き換え
ノード.innerHTML = 'aaa';
// ノードにクラスを追加
ノード.classListadd("aaa");
// ノードのクラスを削除
ノード.classList.remove("aaa);
// ノードの取得 イベントの発生元となった要素を取得する
this
```
```js
// オブジェクトを配列に変換
Array.prototype.slice.call()
// 繰り返し処理
配列.forEach( 配列の各要素に対して行う処理(コールバック関数) )
// 配列に対して、引数のDOMと一致した要素番号を取得
配列.indexOf(ノード);
```
redirect_toメソッドの引数内で || 演算子を用いる。その動作の解説（Railsチュートリアル 第10章より）

# これは何の解説？

Railsチュートリアル第10章内、[フレンドリーフォワーディングの実装](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#code-friendly_forwarding_code)内`redirect_back_or`メソッドの実装において出現する「`redirect_to`メソッドの引数内で`||`を用いたコードの動作解説」となります。

# 解説

```ruby:
session[:forwarding_url] || default
```

上記は`redirect_to`の引数です。`||`演算子を用いることによって、以下の動作を実現しています。

* `session[:forwarding_url]`が`nil`でなければ`session[:forwarding_url]`を返す
* `session[:forwarding_url]`が`nil`であればデフォルトのURLを返す

しかし、`||`演算子でこのような動作が実現できるのはなぜでしょうか。それを説明するためのポイントは以下です。

* Rubyのオブジェクトを真偽値として評価した場合、`false`と`nil`を除く全てのオブジェクトが真として評価される
* Rubyの`||`演算子は、式が真になることが決定した時点で評価を打ち切る[^短絡評価]

[^短絡評価]: 逆に、Rubyの`&&`演算子は「式が偽になることが決定した時点で評価を打ち切る」という動作となります。このような評価方式のことを「短絡評価」と言います。

Railsチュートリアルのサンプルアプリにおける一時cookiesの使い方では、`session[:forwarding_url]`が`false`になることはありません。`session[:forwarding_url]`を真偽値として評価した結果が偽となるのは、`session[:forwarding_url]`が`nil`である場合に限られます。

結果、上記コードは以下のようなコードと同様の動作となります。

```ruby:
unless session[:forwarding_url].nil?
  session[:forwarding_url]
else
  default
end
```
Androidで文字列選択時に表示されるメニューをカスタマイズする

こんにちは。当社で2年目を迎えた@knagauchiです。
この記事は弊社の [Advent Calender 2019](https://qiita.com/advent-calendar/2019/access) の 3 日目の記事です。

前日の@irisTa56さんはかなり詳細に書いてくれていますね😁
本日は私が興味あって調べたことのTips的な内容です。短いです。

# 調べたきっかけ

[前回](https://qiita.com/knagauchi/items/64dd9d57f123a24a4e14)は英語生活中でしたが、来年上海に行く用事ができたので、英語と同時並行で中国語を学び始めました。
とても便利な英中辞書アプリ[Pleco](https://play.google.com/store/apps/details?id=com.pleco.chinesesystem)を使っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/ea7d7391-a611-bcdb-7d0b-40d6a4b1207b.jpeg" width=50%>
このようにPlecoには、ブラウザで長押し選択した文字列を翻訳する機能があります。
Google翻訳もそうですよね。

これ、Google以外のアプリでも出来ることを知らなかったので、技術的にどうやって実現するんだろう？と思って調べました。

とても簡単でしたが、Qiitaには載っていなかったので、紹介します。

# 実装方法

```xml:AndroidManifest.xml
<activity android:name=".view.ProcessTextActivity"
        android:label="@string/process_text_name">
    <intent-filter>
        <action android:name="android.intent.action.PROCESS_TEXT" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>
```

```kotlin:ProcessTextActivity.kt
class ProcessTextActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT)?.toString()

        // textを使う
    }
}
```

これだけです。

# 動作

実際に動作を見てみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/02580dff-522b-d938-ff5a-05466aaa5902.jpeg" width=50%>
`android:label`で設定した文字列がメニューに表示されるようです。「**もらった！**」が、設定した文字列:joy:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/f6acb907-fad3-ea56-ba9e-4475aa7f572a.png" width=100%>
選択した文字列がアプリで受け取れました。

# 補足

`Intent.EXTRA_PROCESS_TEXT`の部分が黄色いのは、`minSdkVersion`を23未満にしているからです:sweat_smile:
[EXTRA_PROCESS_TEXT](https://developer.android.com/reference/android/content/Intent.html#EXTRA_PROCESS_TEXT)はAndroid 6.0以上で有効なフラグのようですね。

Google Chrome以外に、SlackやLINEのメッセージ入力欄など、文字列選択ができる多くのアプリに対応できます。

# もっと詳しく

以下の記事が参考になります（英語）
[Creating custom Text Selection actions with ACTION_PROCESS_TEXT](https://medium.com/androiddevelopers/custom-text-selection-actions-with-action-process-text-191f792d2999)

次回は@keigo1450さんの投稿です。お楽しみに！🤗
DataCore vFilo データの耐久性(Durability)を上げてみる

[前回](https://qiita.com/tsurun/items/8ac784d2f2d0f179e20c)の続きです。

DSXが2台になり負荷分散させられることが確認できました。
次はこの2台を使ってデータを2重化させてみます。

変更したいShareのApplied Objectivesにあるペンのアイコンをクリックします。
durability-5-ninesにチェックを入れてSaveで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/1762a6dd-402b-514e-508c-4c486aa19e8f.png)

8 Objectivesになり、"durability-5-nines"に反しているためFile Alignentがイエローになりました。バックグラウンドでコピーが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/4fdbf81a-f98b-bed3-0728-3ab92a7cdf8c.png)

変更した"/test"の中を見ると、全てのファイルが2台のDSXに保存され、データが二重化さていることが分かります。簡単ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/8f17653b-8145-4b9b-11b0-64c74e3c1a9f.png)

一方で明示的に保存するDSXを指定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/2e2f0402-873b-e98e-3ffc-0108e8b4396e.png)

今は2台しかないので結果は同じですが、Objectiveを使えばvFiLOに任せて2～40台の任意の2箇所（orそれ以上）に保存することも可能ですし、"明示的にこの2台"と指定することも可能です。
Flutter でジェスチャーを使いWidgetの形を変える

Flutter にはGestureDitectorというWidgetが存在しますが、ドラッグでピンチイン・ピンチアウトが実装されているので、
ピンチイン・ピンチアウトとドラッグを併用することができません。
Flutterのジェスチャーに関しては下記リンクを確認してください。
https://flutter.dev/docs/development/ui/advanced/gestures

##解決策
matrix_gesture_detectorを使って対応する

[matrix_gesture_detector (github)](https://pub.dev/packages/matrix_gesture_detector)

```dart
return MatrixGestureDetector(
   shouldRotate: false,
   onMatrixUpdate: (Matrix4 m, Matrix4 tm, Matrix4 sm, Matrix4 rm) {
     matrix = MatrixGestureDetector.compose(matrix, tm, sm, null);
     notifier.value = matrix;
   },
   child: AnimatedBuilder(
     animation: notifier,
     builder: (_, Widget child) {
       return // 変形させるWidget
     },
   ),
 );
```
※変形させるWidgetにtransformがない場合はConteinerのtransformで変形させることが出来ます！
JMeterを初めて触ってみた感想＋α

# JMeterとは
Apache JMeter（アパッチ ジェイメーター）はApacheソフトウェア財団にて開発されているソフトウェアで、クライアント・サーバシステムのパフォーマンス測定および負荷テスト（英語版）を行うJavaアプリケーションである。HTTPレスポンスの内容の妥当性を判定することもできるため、パフォーマンステストのみならず、機能テストに使用することも可能である。
[JMeter - Wikipedia](https://ja.wikipedia.org/wiki/JMeter)

# やりたいこと
SFCCの負荷テストを行いたい！

# 困ったこと
プロジェクトの作成方法、設定項目など試行錯誤しながらやったので時間が思ったよりかかった。
もっとわかりやすくしてもらいたいがパフォーマンステストも機能に含まれているので仕方なし。。。

# 感想
SFCCでは、負荷テストの基準の目安があり、それを参考に自分で目標値、達成の条件などを設定する必要があり、それをクリアするための設定に時間がかかった。
1回のテストに8時間かかったりするので、いかに少ない回数で、SFCCの負荷を高めていけるか、目標値に近づけるかを考える必要があった。

# 意識しておけばよかったこと
負荷をかけるにあたって、サーバ以外にボトルネックとなるものも意識しておいた方がよかった。
例えばパソコンの性能やネットワークの部分。当たり前ですが忘れやすいのでメモしておきます。

また、負荷テストの際にスレッドを多くすればするほど、正規分布曲線のように負荷スピードが上下するため、負荷の最初は負荷がちょうどよくても途中で負荷があがることがあります。スレッド数と1スレッドあたりの実行回数の設定にあたり、性質をよく理解しておく必要があります。
Tobii4Cでどこを見ているかを測定し、視線を表示した動画をtwitchに配信する

#やりたかったこと
私がどこを見ているか？をtwitchの視聴者がわかるようにしたかった。
でも、視線ポインターがこちらの配信画面に写ってしまうと配信しづらいので、こちら側ではポインターは表示されず配信動画にのみ表示させたかった。

#使ったもの

[tobii ghost](https://gaming.tobii.com/software/ghost/)
[twitch](https://www.twitch.tv/)
[OBS Studio](https://obsproject.com/ja/download)（動画配信ソフト）

##twitchをtobii ghostにつなげる
twitchでログインし、クリエイターダッシュボードで拡張機能をクリックし、tobii ghostと検索する。　
出てくる奴をアクティベートする。

##tobii ghostをtwitchにつなげる
tobii ghostでsettingからtwitchにログインする

##twitchとOBSの連携
OBSで「設定」→「配信」→「サービス」でTwitchにログインする。

##OBSとtobii ghostの連携
ソースで+でゲームキャプチャを選択→モードを「特定のウィンドウをキャプチャ」に、ウィンドウを「[SSOverlay.exe]....」にして、下のチェックボックスで透過を許可にチャックする。

ポイントはtobii ghostの設定で透明にしておく（全ての色要素を0に）（previewのon、offで確認可能）
そうすることで、配信者側では視線ポインターが見えなくなる。

次に表示したい画像、動画をソースから追加する。



##配信
最後にOBSの画面の右下の「配信開始」を押すと、twitchに配信が開始される。

twitch上でtobiiの設定をいじると、視聴者側から視線ポインターのデザインを変更可能。

##配信した動画をダウンロード
[twitch leecher](http://twitchdown.hatenablog.com/entry/2016/08/01/142559)というソフトでダウンロード可能らしいですが、未検証...


###参考サイト　
[STREAMING WITH AN EYE TRACKER ON TWITCH](https://gamingcareers.com/guides/twitch-streaming-with-eyetracker/)
Laravel の getMimeType() と getClientMimeType() の違い

https://laravel.com/docs/6.x/requests#retrieving-uploaded-files
Laravel でアップロードしたファイルについて情報を取得したいときは `$request->file('file_name')` とすれば取れる。
（ちなみに遡っていくと、Symfonyの `Uploaded files` を使っているらしい）

これを使ってファイルの種類を判別したいときにあった二つのメソド

- `getMimeType()`
- `getClientMimeType()`

がちょっと紛らわしかったのでまとめ。

## ちなみにやりたいこと
ユーザーのアップロードしたファイルがCSVであるかのバリデーションをかけたい。

## CSVをアップロードしたときにそれぞれが返すもの

### `getMimeType()`

```
"text/plain"
```

### `getClientMimeType()`

```
"text/csv"
```

## どっちを使うべきなの？

`"text/csv"` を返す `getClientMimeType()` を使うのが良いかと思ったけど、
これはファイルの拡張子を見てるだけみたいなので、拡張子はあってるけど安全でないファイルがアップロードされてしまう危険性がある。

一方の `getMimeType()` はテンポラリディレクトリにアップロードされたファイル（拡張子がない状態）を見るので、テキストファイルであることしか保証はできなくなるが、とりあえずはこっちを使う方が安全そう。

## 参考
https://nobuhiroharada.com/2019/06/19/laravel-how-to-get-uploaded-file-info/
https://polidog.jp/2018/07/19/symfony_validator/
https://stackoverrun.com/ja/q/10859443
強化学習１５　Google Colaboratoryを使ってみる。

※　chainerRLからtorchRLに替えて、やり直します。

Google　Colaboratory使ってみます。
マイブームで、どぶろっくの「やらかしちまった」なんですが、
♫あー、準備が終わった後にColaboを知った。♫

環境設定の準備がとても楽みたい。
しかも、時間限定でGPUが使えます。cudaで困らないじゃん。
ただし、時間限定がポイントで、gpgpuは10時間以上かかることがよくあるので、いろいろと工夫が必要になります。
学習を分割するとか。
それでも、強化学習の勉強には最適と思われますが。
特に画像入力をするときに、GPUが必要になるので、こちらにします。

#最初の一歩
Googleアカウントを取得する。
https://support.google.com/accounts/answer/27441?hl=ja

#Google　Colaboratoryに入る。
こちらから
https://colab.research.google.com/
Corlaboratoryにようこそ

#pip freeze
インストールされているリストを見ます。

```
!pip freeze
```
gymはありますが開発が修了しています。gymnasiumに引き継がれています。
また、torchRLもありません。
アクセラレータをgpuに変更すると、cudaが追加されています。
vFilOをスケールアウトさせてみる

***[前回](https://qiita.com/tsurun/items/59f498eb7d8dc85b40be)***の続きです。

DSXノードを追加してフローティングIPを振ってみます。
1台目と同じようにDSX VMを作成、セットアップしましょう。

はい、できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/0f36fbb9-552d-7c34-0f21-dd256f94c6a7.png)

AnvilのIPアドレスにSSHでログインします。"floating-ip-add"でフローティングIPを追加しましょう。

```
admin@anvil1.datacore.jp> floating-ip-add --portal --ip 10.10.108.222/21
ID:                                        (消しました)
Name:                                      CLUSTER1
State:                                     Standalone
IP:                                        10.10.108.200/21
Cluster floating IPs:                      [10.10.108.200/21]
Portal floating IPs:                       [10.10.108.222/21]
Since:                                     2019-11-20 01:53:10 UTC
Timezone:                                  Asia/Tokyo
VVOL support:                              true
EULA accepted date:                        2019-11-15 05:56:47 UTC
Online activation support:                 true
Activation ID:                             (消しました)
License activation date:                   2019-11-20 01:53:29 UTC
License expiration date:                   2020-11-07 23:59:59 UTC
License details:
                         Name:                        Datacore
                         Status:                      VALID
                         Expiration:                  (消しました)
                         Number of acquired licenses: 2
NAS volume capacity:                       [Total: 214.6GB, Used: 12.3GB, Free: 202.3GB]
Share space (quota):                       [Total: 100GB, Used: 12.8GB, Free: 87.1GB]
Data directors:
                         [Object type: DATA_SPHERE, Node name: anvil1.datacore.jp, Role: PRIMARY, Oper state: UP, Admin state: UP]

admin@anvil1.datacore.jp>
```

はい、追加できました。簡単ですね。それでは開けるか試してみます。
認証情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/b7a49040-fdf5-597e-9db2-785cba051fd2.png)

フローティングIP、DSX1、DSX2どのIPアドレスにつないでも同じものが見えていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/e6d12ba2-29d1-47e9-cf6e-35aa40829f7a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/c04dd881-a40b-b423-a8de-cb9592d4995e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/4943019d-6694-c0f4-9109-f49d215002de.png)

2台になったところでファイルをコピーしてみます。10GBのファイルをコピーしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/87395635-94c9-8271-3215-902babfd6d67.png)

2つに分散配置されていることが分かりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/0b0a01d1-6f44-c2ac-b2aa-ea9f4e684763.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115778/32abb18f-b250-44f5-ea5c-3a698efbc015.png)
一定件数を超えたら更新日時が古い順にディレクトリを消す

もともとは更新日時が一週間以上立ったら削除するとかしてたけど
容量問題で件数フィルタがほしかったので作った

```shell
ls -dt `find /Users/tsune/path/ -mindepth 1 -maxdepth 1` | tail -n +11 | xargs rm -rf {} \;
```

- lsはtオプションで更新日時でソートしてくれる
- lsはdオプションでdirectoryの中身を表示しない
- tailは -n +11で10件以降を表示

cronに登録してハッピー
【C++Builder】TChartで自分で作成したAxesをAutomaticに戻す場合


前回、[【C++Builder】TChartでX軸・Y軸の目盛りを自分で作成する方法](https://qiita.com/taka_tofu/items/1647a5c171b89ba903f4)で、

	Chart1->BottomAxis->Automatic = false;
	Chart1->Axes->Bottom->Items->Clear();   // 自動生成する目盛りを一度クリアする

とした後に、もう一度目盛りをAutoに変更する方法がわからなかったのだけど、

	Chart1->LeftAxis->Automatic = true;
	Chart1->Axes->Left->Items->Automatic=true;

Chart1->LeftAxis->Automatic = true;　だけではなくて、Chart1->Axes->Left->Items->Automatic=true;　と、Itemsの方もAutomaticに設定してあげないといけないみたい。

忘れないようにメモ。
RHEL kdump設定方法

#Linux RedHat kdumpの設定方法とは？
##2つのファイルの中身を書き換えます
書き換えるファイルは次の2つです。
1:/etc/default/grub
2:/etc/kdump.conf

###1:/etc/default/grub
/etc/default/grubとは、OSを起動するときに必要なブートローダーと呼ばれるプログラムの一つです。
まず中身を変更する前に、lessコマンドで現在の設定値を確認します。

```
# less /etc/default/grub
```
次にファイルを書き換えます。書き換えを行う際はviコマンドを利用します。

```
# vi /etc/default/grub
```
ファイルの中身を変更し終わったら、historyコマンドで変更内容を確認します。
そしてログを読み、エラーが起きていないことを確認してから再起動します。

```
# history | grep kdump  
# less /var/log/messages
# systemctl restart kdump
```
再起動後、再度反映され、正常に稼働していることを確認します。

```
# less /etc/default/grub
# systemctl status kdump
```
ここで変更が終わったのではなく、grub.cfgにも設定内容を反映させなければなりません。
そこで下記コマンドを実行します。

```
# grub2-mkconfig -o /boot/grub2/grub.cfg
  Generating grub configuration file ...
  Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
  Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
  Found initrd image: /boot/initramfs-0-rescue-f7553ca5fb094cd0a58e6d7604177d4a.img
  done
```
これでdoneと表示されれば、設定が反映されたことになります。
ここまでで一つ目の設定が完了しました。


###2:/etc/kdump.conf
/etc/kdump.confとは、カーネルダンプの出力先設定をするファイルです。
設定方法はviコマンドを使用します。

```
# vi /etc/kdump.conf
# reboot
```
.confと名の付くファイルは全て再起動が必要なので、再起動します。
再起動後、設定が反映されているのかをcatコマンドにて確認してください。


##引用

めもめも　GRUB2で知っておくとよいこと
>http://enakai00.hatenablog.com/entry/2015/11/27/152442

GRUBについて
>https://www.express.nec.co.jp/linux/distributions/knowledge/system/grub.html

以上がkdumpの設定方法でした。
最後までご覧いただきありがとうございました！
変更が必要な箇所等ございましたら教えていただけますと幸いです。
よろしくお願いいたします。
phpenvのwebpサーポート

メモ的な感じですが、phpenvでgdプラグインのwebサーポートする方法をまとめてみました。私はanyenvベースなので内容をanyenv基準で説明させて頂きます。

# build設定の変更
- 前提：phpenvのbuildプラグインがインストールされている
既存設定([anyenvをsystemwideにインストールしたので](https://qiita.com/FattyRabbit/items/91d42568438754716543)）

```bash:/opt/anyenv/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
--with-gd
--enable-sockets
--with-jpeg-dir=/usr
--with-png-dir=/usr
```
こちらを以下のように追加します。

```bash:/opt/anyenv/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
--with-gd
--enable-sockets
--with-jpeg-dir=/usr
--with-png-dir=/usr
--with-freetype-dir=/usr
--with-webp-dir=/usr
```

# libwebp インストール
上記の状態でphpをインストール（build）すると以下のエラーが出ました。

```
configure: error: webp/decode.h not found
```
WebP関係のヘッダーファイルが必要といっていますので同様にlibwebpをインストールします

```
# sudo yum --enablerepo=epel install libwebp libwebp-devel libwebp-tools
```
ついでに freetype もインストールしておきます

```
# sudo yum --enablerepo=epel install freetype freetype-devel
```

# 確認

```
# php -r 'var_dump(gd_info());'
Command line code:1:
array(13) {
  'GD Version' =>
  string(26) "bundled (2.1.0 compatible)"
  'FreeType Support' =>
  bool(true)
  'FreeType Linkage' =>
  string(13) "with freetype"
  'GIF Read Support' =>
  bool(true)
  'GIF Create Support' =>
  bool(true)
  'JPEG Support' =>
  bool(true)
  'PNG Support' =>
  bool(true)
  'WBMP Support' =>
  bool(true)
  'XPM Support' =>
  bool(false)
  'XBM Support' =>
  bool(true)
  'WebP Support' =>
  bool(true)
  'BMP Support' =>
  bool(true)
  'JIS-mapped Japanese Font Support' =>
  bool(false)
}
```
apacheでの利用ではapacheの再起動を忘れずに。
インライン展開はどのくらい速い？

#執筆動機
インライン展開が速いものという知識はあったが，具体的にどのくらい速いか計測したことが無かったので，計測してみた．

#対象読者
「インライン化するとどのくらい早くなるの？」にうまく答えられない方．

#コード
カウンタをインクリメントする関数をインラインとそうでないものを実装した．

```inline.cc
#include <chrono>
#include <cstdint>
#include <iostream>

#define GIGA 1000000000

using namespace std;

__attribute__((always_inline)) void inline_add_one(uint64_t& ctr) 
{
  ++ctr;
}

void add_one(uint64_t& ctr) 
{
  ++ctr;
}

int main()
{
  chrono::system_clock::time_point start,end;
  uint64_t sum(0);

  start = chrono::system_clock::now();
  for (auto i = 0; i < GIGA; ++i) {
    inline_add_one(sum);
  }
  end = chrono::system_clock::now();
  cout << "inline function :\t" 
    << sum << " :\t"
    <<  chrono::duration_cast<chrono::milliseconds>(end-start).count() 
    << " [ms]" << endl;
  sum = 0;

  start = chrono::system_clock::now();
  for (auto i = 0; i < GIGA; ++i) {
    add_one(sum);
  }
  end = chrono::system_clock::now();
  cout << "normal function :\t" 
    << sum << " :\t"
    <<  chrono::duration_cast<chrono::milliseconds>(end-start).count() 
    << " [ms]" << endl;

  return 0;
}
```

#アセンブリコードの確認
>g++ -S -O0 -std=c++17 inline.cc

以下， inline 化されていた関数．
確かにインライン化されている．

```part_of_inline.s
## %bb.2:                               ##   in Loop: Header=BB2_1 Depth=1
        leaq    -40(%rbp), %rax
        movq    %rax, -8(%rbp)
        movq    -8(%rbp), %rax
        movq    (%rax), %rcx
        addq    $1, %rcx
        movq    %rcx, (%rax)
## %bb.3:                               ##   in Loop: Header=BB2_1 Depth=1
```

以下，inline 化されていなかった関数．
確かにインライ化されていない．
add_one を call している．

```part_of_inline.s
## %bb.6:                               ##   in Loop: Header=BB2_5 Depth=1
        leaq    -40(%rbp), %rdi
        callq   __Z7add_oneRy
## %bb.7:                               ##   in Loop: Header=BB2_5 Depth=1
```

#実行結果
>$ g++ -O0 -std=c++17 inline.cc
$ ./a.out
inline function :	1000000000 :	1414 [ms]
normal function :	1000000000 :	1760 [ms]

結果，無視できない性能差分を観測できた．
本実験では 1.24 倍程度である．
関数の長さ，中での処理によって，更に性能差が発生することは考えられる．
Qiita vs Qrunch vs  HatenaBlog vs Crieit  vs note  ブログ用途【個人的評価】

#どうプラットフォームを使い分けるか
私はアウトプットするために書き続けてきた。
ハッカー、プログラマー、エンジニア、技術系etc...
己の能力（スキル）を吐くためだけにQiitaに書いてきた.
個人ブログ（CMS:WordPress等）の有料系は使わない。
書けても成果が出る自信がないから。

#テーマによって使い分ける　今の自分 2019/11/20

|Platform|用途|
|---|---|
|Qiita|技術系アウトプット|
|HatenaBlog|日記：薄い内容、Twitter文字数より長く書くとき|
|note|日記：濃い内容、心境を語る、気持ちを書きなぐりたい時|
|Twiiter|告知、宣伝、一言|
|YouTube|メイン活動、自己表現|

#Qiita○ 2019/11/22
○インターフェース（使いやすい、見やすい。）
○SEOに強い。
○自動保存がある。
○貢献(Contribution)を受けやすい。

改善して欲しい機能
→バックアップ欲しい。
→記事エクスポート、インポート。
→外部連携サービスからの投稿

#Hatenablog△ 2019/11/22
×SEO弱い。
○カスタマイズができる。
×「いいね👍」がもらいにくい。

#Qrunch△ 2019/11/22
○新しい。早めに始めた方が流行に乗れるかも、
○Qiitaにはない機能がある。（ログ、アクティビティ）

機能追加を要求
以下の理由でまだ使わない。
×タグ円グラフポートフォリオの追加（スキル円グラフ？）
△2画面ブラウザエディタ 左側Markdwon/HTML, 右側プレヒュー

#Crieit×  2019/11/22
×正式アカウント登録ではなく、**浅い紐付け**なため、利用しない。
Twiiter連携アプリ認証を解除するとブログ記事は全部消されるかもしれない。

#note△　2019/11/22
○Webライター向け。
○自動保存がある。
○誰でも「スキ💓」できる。
△ビジュアルエディタが独特。WordPressと同じように。
△縦スクロールを上手く利用しなければならない。
×Markdownで書けない。

#結局は見られるか
結局は、SEO。アクセス数や検索上位によって自分の居場所を確立する。
Hatenablogとnoteは日記だが、どちらも続けて反応が良ければ乗り換えるよ。
モチベーション的に。

プラットフォーム（ブログ）に求めるもの 見られやすさ(SEO)>書きやすさ(UI)

#皆さんはどのように使い分けていますか？

##参考
[もっと気軽にアウトプットできる技術ブログサービス「Qrunch（クランチ）」をリリースした【個人開発】](https://qiita.com/c0domisu/items/95a561d163d26bbfe274)
[QiitaとQrunchとCrieitを比較してみた](https://crieit.net/posts/Qiita-Qrunch-Crieit)
CEATECにいってみた 2/2

#はじめに
前回は主に基調講演をメインに書いたのですが、いくつかブースも回った中で一番興味をひかれたDMP関連の話について纏めてみようかなと思います。
ご存知の方がほとんど且つ醜態さらしになるのは若干気が引けますが、「ほぇぇ～」っていう純粋な心をもった少年をあやす気持ちで見てください。

#テーマ：DMP
Data Management Platform。
インターネット上でビッグデータを連携、分析、管理することで、自社以外から多様なデータを取り入れ更なるイノベーションの創出を図るというもの。
広義の意味では「Web上で収集された情報」を指し、アクセスログや会員登録等を基にした属性データなどがそれに値します。
ユーザのWeb行動ログの収集や最適なターゲティングを見出すことが期待されます[1]。

#気になったところ
そんなデータの宝箱みたいなDMPですが、実際にどのように提供されているんだろう、のようなおはなし。

###TreasureData
Arm Treasure Data株式会社の提供するeCDP（エンタープライズ・カスタマーデータプラットフォーム）[2]。

Web上でのユーザの行動ログ収集や自社の広告効果の測定などを自社で一から行おうとすると、基盤作りだけで多大なコストと時間を要し、それでも見合ったデータが集められるとは限りません。
そういった基盤やデータそのものを提供したり、分析を行ったうえで様々なサービスに連携したりできるのがこのeCDP。

![image.png](https://www.treasuredata.co.jp/wp-content/uploads/2016/10/arm-td-diagram-2D-flat-1-01.svg)

ただ単にどんな人がどんなサイトに訪れているかとか、これに興味がある人はどんな人なのかのようなデータが収集できる・利用できるのもいい点ですが、個人的に強いなって思ったのは「他サービスへの連携」です。

当たり前といえばそれまでかもしれませんが、企業によってどのクラウドサービスを使用しているのかは異なったりしますし、多くのサービスとの連携をプラットフォームをインターフェースとして行えるのは非常に便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521034/19d629b5-4229-b91c-a3ff-e488d6b23550.png)


###Rtoaster
プレインパッドが提供するRtoasterのレコメンド・機械学習機能が気になりました[3]。

直感的には、Arm Treasure DataのeCDPはデータの収集・分析/可視化/統計・連携と題している中で「多様なデータの可用性向上と、分析基盤の提供」を主に掲げているのに対し、Rtoasterは「眠っているデータに機械学習なりをぶっこんで、何か新しい知見を見つけよう」というイメージですね。

<img src="https://www.rtoaster.com/img/functions/detail4/img01.png" width=33%><img src="https://www.rtoaster.com/img/functions/detail4/img02.png" width=33%><img src="https://www.rtoaster.com/img/functions/detail4/img03.png" width=33%>

レコメンドエンジンによる顧客一人ひとりに最適な商品や記事等を自動的にお勧めしてくれたり、さらにそこにユーザーの興味傾向や購買周期、購入商品の関連性からその品質を向上させ、テキストマイニングを用いた類似度計算から更なる別視点からの関連付けも可能になる、というものでした。

機械学習、アルゴリズムゴリゴリで、ぼんやりと「自社の使ってないまま蓄積していくデータ、なんとかなんないかなぁ」という考えには、割と適した内容なのかなとも感じました。

#まとめ
数万とある企業がそれぞれで抱えているデータは膨大で、上限を知らず増える世の中、抱えていることの価値より解析によるデータの更新に価値を見出すことが、この先の未来にもつながる考え方だなぁと。

マーケティングもITもそれぞれにニーズが変化していき、解決難易度の向上に対抗するために、保持データをどのように料理することを常に考えたいものです。


**参考資料**
[1] [DMPについて](https://dmlab.jp/adtech/dmp.html)
[2] [eCDP](https://www.treasuredata.co.jp/integrations/)
[3] [Rtoaster](https://www.rtoaster.com/functions_services/detail4.html)
RHEL ランレベル(runlevel)確認方法

#Linux Redhatのランレベルを確認するには？
##runlevelコマンドの利用
runlebelの設定値を確認する為には、runlebelコマンドを利用します。
実行コマンドは下記の通りです。

```
# runlevel
```

runlevelとは、Linuxの起動するプログラムを設定する箇所です
レベルは0~Sまでの7段階あり、それぞれ意味があります。

| ランレベル  |  説明　　　　                     |
|:-----------|:---------------------------------|
| 0         | システムの停止                     |
| 1         | シングルユーザーモード              |
| 2         | マルチユーザーモード(CUI,NFSなし)    |
| 3         | マルチユーザーモード(CUI)         |
| 4         | 使わない                        |
| 5         | マルチユーザーモード(GUI)　　　   |
| 6         | 再起動                         |
| S(s)      | シングルユーザーモード             |

※CUI：全ての操作をキーボードでコマンド入力のみで行うこと
　GUI：Windowsのように画面がありマウスなどで操作することができること

因みに、AWSでrunlevelの設定を参照したところ、デフォルトで3と設定されていました。

```
# runlevel
N  3
```


##runlevelを変更したい場合
変更したい場合はinitコマンドを利用します

```
[定型文]
# init 設定したいランレベル

[使用例]
# init 5
3   5
```
上記で表示された3と5は、3の部分が前回のランレベルで5が現在のランレベルを指します
設定を終えた後、再起動を実施し反映されているのかを確認してください。


###引用
ランレベルとは
>https://www.atmarkit.co.jp/flinux/rensai/linuxtips/156whatrunlv.html

起動設定・ランレベル設定
>http://linux.kororo.jp/cont/intro/init.php
機械学習とはなにか―人工知能は人間を超えるか第4章に学ぶ

**参考資料: [人工知能は人間を超えるか](https://www.amazon.co.jp/dp/4040800206/ref=cm_sw_r_tw_dp_U_x_ekk1DbP5B45C4) 第4章「機械学習」の静かな広がり**

## 機械学習とは

> 機械学習とは、人工知能のプログラム自身が学習する仕組みである。

機械学習は、プログラムが学習する仕組みです。
例えば

## 教師あり学習とは



## 教師なし学習とは

## 強化学習とは
[PlayCanvas]カメラを複数並べて表示する方法

# はじめに
この記事はPlayCanvasでカメラを45個表示する方法を紹介します。

## スターターキットを使用して新規プロジェクト作成を作成する
<img src="https://user-images.githubusercontent.com/39250588/69203623-bf152a00-0b3c-11ea-8ac1-a91daca60b0a.PNG" width=500 />

PlayCanvasの公式サイトから登録をして新規プロジェクト作成を作成します。
[https://playcanvas.com/](https://playcanvas.com/)

PROEJECTS → Model Viwer Starter Kitを選択


## カメラを追加
<img src="https://user-images.githubusercontent.com/39250588/69203622-bf152a00-0b3c-11ea-9798-b00daa05f487.PNG" width=500 />

PlayCanvasのヒエラルキーからCameraを追加します

## ViewPortの設定をする
<img src="https://user-images.githubusercontent.com/39250588/69203621-be7c9380-0b3c-11ea-911e-030a1c4e9e1c.PNG" width=500 />

ViewPortにカメラの表示する位置に合わせた値に設定します

## カメラの複製をする
<img src="https://user-images.githubusercontent.com/39250588/69203625-bf152a00-0b3c-11ea-95b4-e9651616b4b3.PNG" width=500 />

こちらのカメラ複製し、配置をします。
Shift + クリックで複数選択ができます





3DモデルをPlayCanvasのキャラクター [サンディーちゃん](https://playcanvas.jp/sandy/)に置き換えて起動したものがこちらになります。
[今回作成したプロジェクトプロジェクト](https://playcanv.as/p/QxRqSS3C/)

<img src="https://user-images.githubusercontent.com/39250588/69204014-ba04aa80-0b3d-11ea-8218-e032672eb351.PNG" width=500 />




### カメラに


<font color="OrangeRed">
PlayCanvas開発で参考になりそうな記事の一覧です。
</font>
<font color="OrangeRed">
入門

- [PlayCanvas入門- モデルの作成～ゲームに入れ込むまで](https://qiita.com/yushimatenjin/items/2a2c35fe7b1d08f9e361)
- [JavaScriptでスロットを実装する。【PlayCanvas】](https://qiita.com/yushimatenjin/items/e84c42da74df1eb07386)
- [3Dモデルのビューワーを3分で作る【初めてのPlayCanvas】](https://qiita.com/yushimatenjin/items/4b09c9e2076a0b2a6933)
</font>
<font color="OrangeRed">
応用
</font>

- [PlayCanvasのコードエディターでes6に対応する](https://qiita.com/yushimatenjin/items/a61a21c64c1c1a550dd4)
- [Gulpのプラグインを書いたらPlayCanvasでの開発がめちゃくちゃ便利になった](https://qiita.com/yushimatenjin/items/5f0f178e8a4ba4a5ee57)
- [PlayCanvas Editorに外部スクリプトを読み込む新機能が追加されたので開発方法を考える。- Reduxを組み込む](https://qiita.com/yushimatenjin/items/7a64220cceac66843d7d)
</font>
<font color="OrangeRed">
その他の記事はこちらになります。

- [React Native + PlayCanvasを使ってスマートフォンゲームを爆速で生み出す](https://qiita.com/yushimatenjin/items/7c7ad5d35473c11f32f2)
- [PlayCanvasのエディター上でHTML, CSSを組み込む方法](https://qiita.com/yushimatenjin/items/814b4a32db53397219df)
- [【iOS13】新しくなったWebVRの使い方 ](https://qiita.com/yushimatenjin/items/344d86b3d193e0a88567)
</font>

<font color="OrangeRed">
その他関連
- [PlayCanvasタグの付いた記事一覧](https://qiita.com/tags/playcanvas)
</font>


### PlayCanvasのユーザー会のSlackを作りました！
少しでも興味がありましたら、ユーザー同士で解決・PlayCanvasを推進するためのSlackを作りましたので、もしよろしければご参加ください！

[日本PlayCanvasユーザー会 - Slack](https://t.co/IdSRIfJhN5?amp=1)
WordPress 確認画面と完了画面を作ろう

今のこのサイトの入力画面と確認画面と完了画面、全部一緒のURLじゃん！
変えた経緯メモしとこう。

#目標
入力画面・確認画面・完了画面を全て違うURLにする

#やったこと
WordPressで元々入力画面はあり、確認画面・完了画面で出る文章は設定されていたのでこの2つを固定ページとして新規作成する。
**3ページで同じフォームのショートコードを使う**

###確認画面を作る
入力画面を複製し名前を「確認画面」に変更。
「公開」をクリックし、そのページのURLをコピー。
入力画面の設定で【URL設定】というところに【確認画面URL】があるから、そこにペースト。

###完了画面を作る
入力画面を複製し名前を「完了画面」に変更。
「公開」をクリックし、そのページのURLをコピー。
入力画面の設定で【URL設定】というところに【完了画面URL】があるから、そこにペースト。