OmniAICreator/Qiita-1.07M huggingface dataset:
Reactでテキストボックス入力値を取得する

# Reactでテキストボックス入力値を取得する

Visual StudioでASP.NET Coreを使ってWebサーバを開発する。クライアントはReact.jsで実装する。
両者間でデータを受け渡しするために、Webページのテキストボックスに入力された値を取得したい。

### 環境

Visual Studio Community 2017 ver 15.7.1
.NET Framework ver 4.7.03056
npm ver 5.6.0

### イベント処理の追加

tsxファイルにボタンを設置し、onClickでメソッドを指定する。

```DoSomething.tsx
public render() {
    return <div>
    <input type="submit" value="確定" onClick={() => this.doSomething()} />
    </div>;
}

private doSomething() {
        this.setState({ alert_message: "ボタンが押されました。" });
}
```
テキストボックスを設置し、onChangeでメソッドを指定する。メソッドにはイベントを引数として持たせる。ステートオブジェクトを入力値に応じて変更させる。


```DoSomething.tsx
    <p>ここに入力<input type="text" value={this.state.some_code} 
    onChange={e => this.handleOnChange(e)} /></p>
```

```DoSomething.tsx
private handleOnChange(e: any): void {
        this.setState({ some_code: e.target.value });
}
```

### 変数の追加

ステートに入力値を入れるオブジェクトを追加する。クラスが実装するインタフェースにクラス変数として追加する。

```DoSomething.tsx
interface DoSomethingExampleState {
    some_code: string;
    alert_message: string;
}
```

コンストラクタで初期値を与える。ここで型が決まらなければエラーになる。

```DoSomething.tsx
    constructor() {
        super();
        this.state = { some_code: "", alert_message: "" };
```

### 注意点

テキストボックスの入力値をサーバへ渡すために、document.getElementByIdやgetElementByNameで要素を取得し、そのプロパティ（value）で値を取得したいところだが、ASP.NET上のテキストボックス要素はSystem.Windows.Forms.HtmlElementのためプロパティがなく、取ることができない（xml要素ならnodeValueが取得できるし、textarea要素ならinnerHTMLで値が取得できる）。
そのため、上記コードのように value = { this.state.hoge } としてステートに入れて管理するのがよい。

### Angularの場合

なおReactでなくAngularを同環境で使用した場合、入力値の取得はdocument.getElementByIdで可能。下記のようにconponent.tsファイルにテキストボックスを設置すれば要素を取得した後、HTMLInputElementにキャストすることでvalueが取得できる。

```dosomething.component.ts
    var inputObject= document.getElementById("code");
    var inputValue= "";
    if (inputObject!= null) {
        inputValue= (<HTMLInputElement>inputObject).value;
    }
```
この違いは何でしょう…？
Github — Show Outdated をすべて開くブックマークレット (2018-09-13)

[Bookmarklet to expand all collapsed comments in a GitHub pull request (places where it says "discussed an outdated diff")](https://gist.github.com/peterflynn/5980273#gistcomment-2666382) より

```
javascript:Array.from(document.getElementsByClassName('outdated-comment')).forEach(l => l.setAttribute('open',true));
```

## Google Chromeの場合

ブックマークマネージャから登録する

chrome://bookmarks/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fb851797-2e89-edf5-f023-17559e14a065.png)

## 動作例

### ブックマークレットを選ぶ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9b6a14c7-ad17-33a7-374a-7b2ddeca6889.png)

### 全て開かれる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7f7c528d-7ffb-d261-9044-04f083939eec.png)


## Versions

- Mac OS X Sierra
- Version 69.0.3497.92 (Official Build) (64-bit)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Graphviz 実行時に「Warning: ~ is not a known color.」とエラーが表示された時の対応

「Graphviz」というDOT言語で書かれたツールを使用していた際に
発生したエラーの対応内容を以下に記載致します。

Graphvizを使う際は、solgraphというツールをセットで使うことが多いと思われます。

solgraphとは、Solidityコントラクトの処理フローを、DOT言語と呼ばれるデータ記述言語で出力するツールです。

solgraphで作成された「.dot」ファイルをGraphvizで変換する際に
```
Warning: lilac is not a known color. 
```
というエラーが表示されることがありますが、これはsolgraph側で認識しているlilacという色を
Graphviz側で認識できない場合に起きる様です。

solgraphとgraphizで一部互換性の無い色が存在する為に起きる様です。
https://github.com/Ant-Grand/Grand/issues/4
参照

Graphvizで認識できる色は
https://graphviz.gitlab.io/_pages/doc/info/colors.html 
に記載してある通りです。

解決方法は色をgraphizが認識可能な色にこちらで書き換えて対応することでエラーの表示は無くなります。 
例：lilac→purple
IISで一括でサイトとアプリケーションプールを削除する

Default Siteも消えます。

```powershell
$appcmd = "C:\Windows\System32\inetsrv\appcmd.exe"
$sites = & $appcmd list site
foreach ($site in $sites){
    $site = $site.split("`"")[1] # sitename
    & $appcmd delete site $site
}

$apppools = & $appcmd list apppool
foreach ($apppool in $apppools){
    $apppool = $apppool.split("`"")[1] # apppool
    & $appcmd delete apppool $apppool
}
```

メモ：サイトに与えたユーザが消えない…。
mysql explain 複合インデックス

## where と order by が混在 する場合

```

EXPLAIN SELECT * FROM sample WHERE col1 = 100 ORDER BY col2;

```

※ これだとインデックスが使われない。
よって、複合インデックスを使う必要がある


複合 index を貼る場合は whereのカラムを先に書く。
つまり

col1,col2 の順で複合インデックスを貼る。


## whereの対象が複数ある場合も同様

```

EXPLAIN SELECT * FROM sample WHERE col1 = 100 AND hoge = "man" ORDER BY col2;

```

col1,hoge,col2 の複合インデックスを貼る。

EXPLAINの見方は、以下を参照
https://qiita.com/aidy91614/items/f17ab862986e9e5cdea6
VSTSがAzure DevOpsに改名

# VSTS
正式名称は Visual Studio Team Services。
タスク管理、バージョン管理、CI/CDなど開発者向けクラウドベースのソリューション。

私は、社内の古いPCにGitやらMavenやらを入れており、いつお亡くなりになってもおかしくないので、クラウドに移行したくていろいろ探していたところVSTSにたどり着いた。
VSTS自体は聞いたことがあったのだが、なにせ「Visual Studio ～」という名称から、JavaでWeb開発をしている私には関係ないものかと勘違いしていた。
つい先日「これ名前悪いよ。絶対名称変更するよ。」と同僚と話していたばかりだったw

# Azure DevOpsに改名
2018/9/13の朝、MSからこんなメールが来てた。
![rapture_20180913110546.jpg](https://qiita-image-store.s3.amazonaws.com/0/200478/32ddb649-1d9c-3f88-afd6-9721df915ce0.jpeg)
ん、もしやと思ってニュース検索したら、やはり。
[Microsoft、「VSTS」を「Azure DevOps」に改名して提供開始](http://www.itmedia.co.jp/news/articles/1809/11/news058.html)

# VSTSとAzure DevOpsの違い
### プロジェクトのURL
旧URL
https\://**[organization]**.visualstudio.com/**[project]**

新URL
https\://dev.azure.com/**[organization]**/**[project]**

- 新規organizationを作成した場合は新URLで作成される。
- 旧URLは勝手に変更されることはない。Organization Settingsで新URLに手動で切り替え可能だと思われる。（下記図参照）

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/200478/cb9d1a73-c8b1-2fbc-3051-8c718dee6855.png)

### メニューバーの項目名
||VSTS|Azure DevOps|
|:----------------|:------------------|:------------------|
|タスク管理|Work|Boards|
|バージョン管理|Code|Repos|
|CI/CD|Build and Release|Pipelines|
|テスト|Test|Test Plans|
|ライブラリ管理|Packages|Artifacts|

そもそもまだ検証中の身なので、使い勝手などの変更点があるのかよく分かっておりませんが、気づいたことがあればレポートします。
OGPの設定の仕方

OGP：Open Graph Protocolの略
設定しておくとURLを共有したときに設定した画像、タイトルなどが表示される

こういうの。
<img width="343" alt="スクリーンショット 2019-03-12 18.57.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/252667/d88c2fc5-2257-fa8b-b421-3ba1a0d80435.png">


#OGPの設定
###必須項目
og:title　ページタイトル
og:type　　ページ種類（website、blog、video、article など）
og:image　サムネイル画像
og:url　webページのURL

###任意項目
og:description webページの説明文
og:site_name サイト名
og:email 連絡先
og:phone_number 連絡先
og:locale サポートしている言語（日本語のみの場合は"ja_JP"）
※複数言語をサポートしている場合は"og:locale:alternate"で複数記載

```html:html

<head>
 <meta property="og:locale" content="ja_JP">
 <meta property="og:type" content="website">
 <meta property="og:description" content="サイト説明文">
 <meta property="og:title" content="ページタイトル">
 <meta property="og:url" content="サイトURL">
 <meta property="og:image" content="http://~サイト画像">
 <meta property="og:site_title" content="サイト名">
</head>
```


正しく設定されているかは[ここ](https://developers.facebook.com/tools/debug/)で確認できる。
`no gulpfile found` の解決法

## 私の事象

`gulp -f` のコマンドを打つと、
`no gulpfile found` と怒られる

## 私の解決法

`sudo npm install -g gulp`
でgulpを入れ直した。

この時バージョンが2系から 3.9.1 になった。

2018/09/13現在
CSVファイルのある列名が何番目かをすばやく数えるワンライナー

はじめに
=========

CSVファイルの特定の列の値をささっと調べたい時に、列の番号がわかっていれば（例えば 195列目だったとして）、

```sh
cut -d, -f 195 data_train.csv|sort | uniq -c
```

というように調べられます。
しかし、列名から何列目かすぐにはわからないこともよくありますし、５０個くらいあると数えるのもしんどいです。

そこでこのささやかなTipsです。

CSVファイルのある列名が何番目かをすばやく数えるワンライナー
==================

```sh
head -n 1 data_train.csv | tr "," "\n" | less -N
```

とすると、列名と番号が出力されます。あとは `less` の中で検索したりすればすぐに探せます。

以下のように、

```sh:col_list
#!/bin/sh

head -n 1 $1 | tr "," "\n" | less -N
```

shell scriptにして、PATHの通ったところに置いておけば、

```sh
col_list data_train.csv
```

として使うこともできて尚便利です。

さいごに
======

もっと前に考えておけばよかったです。
【Chrome】よく使うページをアプリケーション化

# よく使うページをアプリケーション化しましょう

## こんな方に
　- ChromeでGmail、チャット、決まったアプリを常に使う人
　- **さっき開いてたページ、どのタブだっけ？**
　- **よく使うサービスを毎回Google検索している**
　- windowsユーザ

## アプリ化するとこうなります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/9e22f7ca-9bdb-9fac-079f-7f923dd26cd5.png)


## やり方
#### 1)よく使うページを開く
    　⇒設定ボタン(縦に点が3つ並んだやつ)をクリック
    　⇒「その他のツール」⇒「ショートカットを作成」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/5692f588-8a23-76d5-ce33-a5afcad37760.png)

#### 2)ショートカットをデスクトップに作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/20d4a2b2-6ceb-e4dd-a421-fde6f7117e3b.png)
 ※「ウィンドウとして開く」のチェックは外さない

#### 3)ショートカットをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/4bdbb1d2-597f-caf8-b5bc-e892153b676d.png)

#### 4)タスクバーにピン止め
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/be7d5c32-0efa-a2b0-34eb-fb6b2ff51ec3.png)

⇒これでワンクリックでページを開けるようになりました

おしまい
今日のちょっとしたエラー

ubuntuにvsftpを入れようとしたら管理用ディレクトリ (/var/lib/dpkg/) をロックできません。これを使う別のプロセスが動いていませんか?というエラーがでた。
なんか色々調べたけどロック自体を消去するほうが早いみたいなので強引に
$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/lib/dpkg/lock
でロックを削除して解決した。
そのあとでvsftpをインストール使用と思ったら今度は
「手動で 'sudo dpkg --configure -a' を実行して問題を修正する必要があります」というエラーが出た。
なので「sudo dpkg --configure -a」を実行したらなおった。
あとviで操作してる時にEscやiでの編集を切り替えたりすることができなくなった。
これはどうもvimがバグってるみたいなので「$ sudo apt-get install vim」を打ち込んだら解決した。
phina.js 1日1ゲーム企画！ 毎日ゲームを作るよ！ 1日目

今日から毎日ゲームを作ります！

1日1ゲームを目指します！

開発には、javscriptのライブラリであるphina.jsを使わせていただきます！

毎日少しずつでもゲームを作り続けることで、
技術力の向上と情報共有をしていけたらと考えています！

さっそく以下にゲーム？？？？を作りました！
ただの決意表明ですが！

https://goo.gl/Xjy6PX

ほとんど、phina.jsの公式サイトに掲載されているサンプルコードのままです。

以下の２点を確認しました！

- Labelで表示される文字が変更できる
- 文字色や背景色が変更できる

1日目は以上です！
2つの配列を比較して差分だけの配列を作る方法

#手順
- 差分を抜きたい配列Aに対してarray.filterをかけます
- その中で別の比較対象の配列Bに対してindexOf(配列Aのitem) == -1してあげる

これで配列Aの要素かつ、配列Bに存在しない要素が残ります。🚀

パフォーマンス面でのベストプラクティスではないかもしれませんが、やり方の1つとして参考になればと思います👍

#コード
```javascript
let arrayA = ["A", "B", "C", "D", "E"];
let arrayB = ["B", "D"];

// 配列Aに対して
let result = arrayA.filter(itemA => 
  // 配列Bに存在しない要素が返る
  arrayB.indexOf(itemA) == -1
);  
console.log(result); // [ 'A', 'C', 'E' ]
```
GoogleスプレッドシートにGoogleDriveのフォルダの中の一覧を書き出す

お世話になります。

##1.初めに
弊社は現場ごとに資材を取り寄せることがあり、資材が良く余ることがあります。
そのため別の営業所と不良在庫になってしまったものをグーグルスプレッドシートで共有したいという相談があり作成しました。
簡単な概要としては特定のフォルダにエクセルをアップするとエクセル名とGoogleDriveのURLをスプレッドシートに出力するスクリプトになっています。

ちなみに私はエンジニアではないのでコードの綺麗さについては個人的には追及してるつもりですが、甘さしかないと思うので
こういう書き方のほうがすっきりするし効率もいいよ！などという指摘がございましたら是非ともお願いしたいです。

##2.見た目
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/237388/302cc8a3-0bd2-3f23-4fb4-61e17aba9d21.png)
フォルダはIDを指定しているので好きなように作成していただいて大丈夫です。
私は一つフォルダを作成しその中に各種フォルダを作成しています。



##3.コード

```java
  var sheet = SpreadsheetApp.openById("出力したいスプレッドシートのID");  //スプレッドシートのIDを指定
  var i = 2; //書き込み初期位置
  var folder; 
　var name;
  var file;
  var sheet1;
  var contents;

function start(){  //全ての関数を実行
  kabe();
  yuka();
  den();
  mizu();
  other();
  reset();
}

function reset(){　　//値を初期化
  i = 2;
  folder = "";
  name = "";
  file = "";
  sheet1 = "";
  contents = "";
}
  
function kabe() {　//壁廻りのシートを編集
  sheet1 = sheet.getSheetByName("壁廻り");　//シート名を指定
  folder = DriveApp.getFolderById("壁廻りフォルダのIDを指定");　//壁廻りのフォルダIDを指定
  go();
}
function yuka(){
  sheet1 = sheet.getSheetByName("床廻り");
  folder = DriveApp.getFolderById("床廻りフォルダのIDを指定");
  go();
}
  
function den(){
  sheet1 = sheet.getSheetByName("電材");
  folder = DriveApp.getFolderById("電材フォルダのIDを指定"); 
  go();
}
  
function mizu(){
  sheet1 = sheet.getSheetByName("水廻り");
  folder = DriveApp.getFolderById("水廻りフォルダのIDを指定");
  go(); 
}  
function other(){
  sheet1 = sheet.getSheetByName("その他"); 
  folder = DriveApp.getFolderById("その他フォルダのIDを指定");
  go();
}

function go(){
  contents = folder.getFiles();
  sheet1.getRange("A2:B1000").clear();
  while(contents.hasNext()) {
    file = contents.next();
    name = file.getId();
    sheet1.getRange(i,1).setValue(file);
    sheet1.getRange(i,2).setValue('グーグルドライブのURLのIDより前を指定' + name + 'グーグルドライブのURLのIDより後を指定');//※1
    i= i+ 1;
   }
  i = 2;
  reset();
} 
```

##4.コードの解説
各functionにてシートのIDとIDをグローバル変数に代入しgoへ飛ばし処理をしています。

goの処理ですが、folder.getFiles()にてfolderで指定したIDのフォルダーの中身を何かの形で全て取得してきます。
※ファイル名とかではなかったはず。ちょっと特殊な形？だったはず・・・詳しくはリファレンスを見てもらえれば・・・。

sheet1.getRange("A2:B1000").clear();で毎回すべての値を消しているのはドライブからファイルがなくなった場合でも
常にスプレッドシートに書き込まれた内容が残ってしまうため、毎回消しています。

whileでcontents（要はフォルダの中身）がすべてなくなるまでループさせています。
fileにファイル名を代入し、nameにファイルのIDを代入しています。

後はスプレッドシートに書き出すだけですが、nameのほうに少し癖があります
IDしか取得してきていないため
"https://~~~"の値がないので手動で追記しています。
Gsuite等でドメインを取っている場合はURL指定にちょっと癖がありますが基本は
IDより前の部分は "d/"より前を丸っとコピー　IDより後の部分は"/view?usp=sharing"あたりでしょうか
URLの確認方法は試しに一つエクセルをフォルダに入れて共有設定の部分のURLをご参照ください。

あとはグローバル変数でsheet1とかを設定している~~宿命~~為、変数の初期が必要になっているので毎回reset()で初期化しています。
これって参照する引数で設定してやれば不要ですよね・・・？~~書き方がいまいちわかっていません~~

ざっくりとこんな感じですが大丈夫ですかね・・・。
1年以上前に作成した物なので本人もだいぶ中身を忘れています。

何かの参考になればいいのですが・・・。
AnsibleでサーバにRubyをインストールする

Ansibleでサーバ（Amazon Linux2）の環境構築をしているのですが、rbenvを使わずにソースからrubyを入れたので、その手順をまとめてみました  

#### インストールするためにやったこと
手順は大まかに次の4つになります  
1. Ansible GalaxyからRubyをインストールするロールを探す
2. ``` ansible-galaxy install ``` コマンドでプロジェクトのroleに追加
3. インストールしたいRubyのバージョンなど設定ファイルを書き換え
4. Playbookを実行し、WebサーバのRubyのバージョンを確認する

##### ※ Ansible Galaxyとは
ロールを共有するためのサービスで、Docker HubやChefのSupermarketのようなイメージです


#### 1. Ansible GalaxyからRubyをインストールするロールを探す
[Ansible Galaxy](https://galaxy.ansible.com/search)でkeywordにRubyと入力し、star数などを確認しながら目的のものを探します
今回はこちら（ [geerlingguy.ruby](https://galaxy.ansible.com/geerlingguy/ruby)）を使ってみることにします  


#### 2. ``` ansible-galaxy install ``` コマンドでプロジェクトのroleに追加
プロジェクトのrole配下にインストールしたかったため、こちらのコマンドを実行しました  

```sh
$ ansible-galaxy install geerlingguy.ruby -p roles/servers/common
```

するとroles/servers/common/geerlingguy.rubyに作成されました  
![ansible2.png](https://qiita-image-store.s3.amazonaws.com/0/64171/b2888de1-8cfc-e502-e448-ee8652a524b2.png)


#### 3. インストールしたいRubyのバージョンなど設定ファイルを書き換え
Ruby 2.4.2をインストールしたかったため、``` geerlingguy.ruby/defaults/main.yml ``` ファイルを書き換えます  

```yml:main.yml
---
workspace: /root

# Whether this role should install Bundler.
ruby_install_bundler: True

# A list of Ruby gems to install.
ruby_install_gems: []

# The user account under which Ruby gems will be installed.
ruby_install_gems_user: "{{ ansible_user }}"

# If set to True, ruby will be installed from source, using the version set with
# the 'ruby_version' variable instead of using a package.
ruby_install_from_source: True
ruby_download_url: http://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.gz
ruby_version: 2.4.2

# Default should usually work, but this will be overridden on Ubuntu 14.04.
ruby_rubygems_package_name: rubygems
```

##### ※注意点
Playbookのgather_factsをtrueにしておかないと、 ``` "{{ ansible_user }}" ``` が取得できないです 
falseにする場合は、``` "{{ ansible_user }}" ```　を書き換える必要があります 

```yml:main.yml

省略

# The user account under which Ruby gems will be installed.
ruby_install_gems_user: "{{ ansible_user }}"

省略

```

Playbookの一例でこんなファイルだとすると

```yml:webserver.yml
- name: webserver
  hosts: web
  gather_facts: true
  remote_user: ec2-user
  become: yes
  roles:
    - servers/common/geerlingguy.ruby
```

#### 4. Playbookを実行し、WebサーバのRubyのバージョンを確認する
サーバにsshし、Rubyのバージョンを確認してみます 
![ansible1.png](https://qiita-image-store.s3.amazonaws.com/0/64171/fff3c04e-bf5d-e61e-c3ab-f4e95a75f362.png)
無事Ruby 2.4.2がインストールされました

## 参考サイト
- [You Don't Need common-roles in Ansible](https://qiita.com/kotarella1110/items/212dceee3e56fbffddd1)
使って覚えるDockerの基本操作

Dockerを最近触り始めました。
WindowsPCのVirtualBox上で起動しているCentOS7を使ってDockerの基本操作を使いながら覚えていきます。

# 環境

Windows7のPC
VirtualBox

CentOS7 (VirutalBox上で起動) IP：192.168.56.101
Docker 1.13.1

CentOS6 (VirutalBoxのCentOS7のDocker上で起動)

※ 前提としてVirtualBox上にCentOS7のインストールまで済んでいるものとします。


# Dockerのインストール

CentOS7にログインして、dockerをyumでインストールします。

```
$ sudo yum install docker
```

# リポジトリの検索

docker searchで[Docker Hub](https://hub.docker.com/)にあるリポジトリを検索することができます。

```
$ sudo docker search centos
```

# イメージのダウンロード

docker pullで<リポジトリ名>:<タグ名>を入力してDockerイメージをダウンロードします。今回はCentOS6をダウンロードします。

```
$ sudo docker pull centos:6
```

タグ名はDocker Hubのサイトで確認できます（[centosタグ一覧](https://hub.docker.com/r/library/centos/tags/)）。タグ名を指定しなければ最新のlatestがダウンロードされます。

# コンテナの起動

コンテナを起動します。WindowsPCからアクセスするために-pオプションでポートフォワーディングを設定します。

```
$ sudo docker run -it -p 8080:80 --name webserver centos:6 /bin/bash
```

# 起動したコンテナにApacheをインストール

docker runコマンドを実行したあと起動したコンテナに自動でログインされるので、Apacheをインストールします。

```
# yum install httpd
# service start httpd
# vi /var/www/html/index.html
Hello!
を入力して保存。
```

Ctrl + PQ (Pを押して次にQを押す)でコンテナからログアウトできます。
コンテナはそのまま起動したままになります。

exitで抜けるとコンテナが停止するのでご注意ください。

# コンテナのWebサーバーにアクセス

WindowsPCのブラウザを立ち上げてアクセスします。「Hello!」が表示されればOKです。

```
http://192.168.56.101:8080
```
# 基本コマンド

psコマンドで起動中のコンテナを表示します。コンテナIDが表示されます。-a オプションをつけると停止中のコンテナも表示されます。

```
$ sudo docker ps
$ sudo docker ps -a
```

起動中のコンテナを停止します。

```
$ sudo docker stop <コンテナ名またはコンテナID>
```

停止中のコンテナを起動します。

```
$ sudo docker start <コンテナ名またはコンテナID>
```

コンテナにログインします。

```
$ sudo docker attach <コンテナ名またはコンテナID>
```

コンテナを削除します。

```
$ sudo docker rm <コンテナ名またはコンテナID>
```

ダウンロードしたイメージを表示します。

```
$ sudo docker images
```

以上で終わります。
Postfixのメールサーバ間通信でTLSを有効にする

#背景

独自サーバからGmail宛てにメールを送信してみた所、「このメールは～で暗号化されませんでした」との警告が出ていました。
調べてみた所、今時はメールサーバ間の通信でもTLSを行うようで、TLS対応していない通信だとこの警告が出るとのこと。
それほど難しい設定でもないので、導入してみました。

#設定

以下の設定を main.cf に追加するだけです。（もちろん、postfixのreloadは行いましょう。）

```
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1
```

##設定内容
設定そのものは他の方のドキュメントを参照させて頂きましたが、念のため、[公式のドキュメント](http://www.postfix.org/TLS_README.html)も参照しました。

###smtp_tls_security_level

この設定でメールサーバ間の通信でTLSを有効にします。
[値にはmayかencryptを選択できる](http://www.postfix.org/postconf.5.html#smtpd_tls_security_level)ようですが、encryptはTLS強制なので専用サーバ間のみ使用しましょうという感じの様子。mayの場合には、送信先のSMTPサーバーが TLSに対応している場合にはTLSを使い、未対応の場合は通常のSMTPで送信するようですね。

###smtp_tls_CAfile

接続先の証明書を検証するためのルート証明書とのこと。
CentOSデフォルトのルート証明書を参照していたのでそのまま利用しました。

###smtp_tls_loglevel

1はTLS接続のサマリーのみログに出力する設定です。
全く出さないのも問題ではありますが、大量に出しても追跡しにくくなるので、これもこのまま利用しました。

#確認

Gmailのメールアドレス宛てにメールを送信してみて、赤い鍵のアイコンや警告が出ていないことを確認しました。
また、メールログにサマリーが出ていることも確認しています。
Windows 10 設定変更色々

再インストールするたびに、前になにを変更していたか忘れるのでメモ(設定変更するたびに追記するので徐々に増えます。主に軽量化関連でいい案あったら教えてください)

# ユーザ アカウントのパスワードについて

設定変更、というわけではないんだが、セットアップ中のユーザアカウント作成時は
パスワードのヒントと再設定用の質問を強制的に入力させられる。
これが、セットアップ中はパスワードを設定せず、
後からCtrl+Alt+Delのメニューからパスワード設定することで入力不要になる、というTips

# コントロール パネル > 電源オプション > 電源ボタンの動作を選択する

|設定項目|初期値|変更後|
|:----|:----|:----|
|高速スタートアップを有効にする|オン|オフ|

# コントロール パネル > エクスプローラーのオプション

|設定項目|初期値|変更後|
|:----|:----|:----|
|エクスプローラーで開く|クイック アクセス|PC|
|最近使ったファイルをクイック アクセスに表示する|オン|オフ|
|よく使うフォルダーをクイック アクセスに表示する|オン|オフ|
||||
|隠し〇〇を表示|しない|する|
|空のドライブは表示しない|オン|オフ|
|フォルダーとデスクトップの項目の説明をポップアップで表示する|オン|オフ|
|フォルダーのヒントにファイル サイズ情報を表示する|オン|オフ|
|常にアイコンを表示し、縮小版は表示しない|オフ|オン|
|登録されている拡張子は表示しない|オン|オフ|

縮小版の設定、個人的にいつも混乱するが、
縮小版(=サムネイル)(の上)に(重ねて)ファイル アイコンを表示する
常に(ファイル形式の)アイコンを表示し、縮小版(=サムネイル)は表示しない
と、脳内補完したらわかりやすくなった。保護されたOSファイルはお好みで

# コントロール パネル > マウス > ポインター オプション

|設定項目|初期値|変更後|
|:--|:--|:--|
|ポインターの精度を高める|オン|オフ|

# 設定 > 個人用設定 > タスク バー

|設定項目|初期値|変更後|
|:--|:--|:--|
|小さいタスク バー ボタンを使う|オフ|オン|
|タスク バー ボタンを結合する|常に結合、ラベルを非表示|結合しない|
|タスク バーに連絡先を表示する|オン|オフ|

## タスク バーに表示するアイコンを選択します

|設定項目|初期値|変更後|
|:--|:--|:--|
|常にすべてのアイコンを通知領域に表示する|オフ|オン|

## システム アイコンのオン/オフの切り替え

「時計」「音量」「入力インジケーター」のみオン

# 設定 > 個人用設定 > スタート

|設定項目|初期値|変更後|
|:--|:--|:--|
|最近追加したアプリを表示する|オン|オフ|
|ときどきスタート メニューにおすすめのアプリを表示する|オン|オフ|
|スタート メニューまたは～～クイック アクセスに最近開いた項目を表示する|オン|オフ|

## スタート メニューに表示するフォルダーを選ぶ

「設定」「ダウンロード」「個人用フォルダー」のみオン

※ どうやらここの「個人用フォルダー」はクイックアクセスと違って
きちんとフルパスで出てくるみたいなので意外と便利かも。

# 設定 > 個人用設定 > ロック画面

|設定項目|初期値|変更後|
|:--|:--|:--|
|ロック画面に、WindowsとCortanaのトリビアやヒントなどの情報を表示する|オン|オフ|

# タスク スケジューラ

`Microsoft` > `Windows` > `Application Experience` > `Microsoft Compatibility Appraiser`を無効化  
これはカスタマーエクスペリエンス向上プログラムの完全無効化

# コマンド プロンプト (管理者)

```powershell
powercfg /hibernate off
```  
これは休止停止の完全無効化(多分GUIからはできない？)
php-master-changes 2018-09-12

[TP](https://wiki.php.net/rfc/typed_properties_v2) の投票始まって、[300 コミット超](https://github.com/php/php-src/pull/3313)とかどうやったら朝の 1 時間で追えるのか？無理だ！みたくいよいよ現実味を帯びてきた脅威に恐々としてる

# 2018-09-12
## dstogov: Additional fix for bug [#76860](https://bugs.php.net/bug.php?id=76860).
- https://github.com/php/php-src/commit/06f056a760bd6db35cfddb41f98ed9ed9482cfd1
- [昨日直したと思った奴](https://qiita.com/sj-i/items/c5655084220eae52a357#dstogov-added-test-for-bug-76860-missed-accessing-static-property-as-non-static-warning)が微妙に修正足りてなかったので追加修正

## dstogov: This increment is not necessary anymore.
- https://github.com/php/php-src/commit/1cc0d78c9b8fa3938d2e2bb1591a6f15952272c2
- VM スタックの初期化で最初にトップをずらしていたのがもう不要なので削除
- コレ経緯追えてないけど、当初 zend_execute.h のほうに zend_vm_stack_init() の実装があった時に[入った行](https://github.com/php/php-src/commit/c69781393cd42db7479d24f39e0f55f1b7f1d355#diff-a171d5105d09d1ca53f1d243a68c4dabR187)っぽい
- https://wiki.php.net/phpng で callframe とか言ってる時期かな?

## dstogov: Use Zend API helper functions
- https://github.com/php/php-src/commit/83fe1f1cc8c90215c32795f59f0725f27d8e5d58
- ext/soap で Zend API のヘルパーを通さず直にデータ構造を触っている部分があったので修正

## dstogov: Simplify method visibility checks
- https://github.com/php/php-src/commit/73efd1b65120797dab253e78afe83049e62b0a79
- メソッドの可視性判定の処理を単純化

## dstogov: Optimisation: Check for private property in parent class makes sense only if we already found a property info. Check for property started with "\\0" makes sense only if we didn't find property info.
- https://github.com/php/php-src/commit/aee4b145ef7af513313a5f082a15c234dadbaae0
- プロパティへのアクセス時の処理の最適化
- 親のプライベートプロパティのチェック処理が property_info の見つからない実行パスだといらなかったので、分岐の中に押し込み
- 逆にヌル文字で始まるプロパティのチェックは見つからない実行パスじゃないといらなかったので、その else へ押し込み

## dstogov: Better ZEND_ACC_CHANGED handling
- https://github.com/php/php-src/commit/beb3594eb8bf3108837d251f57f7d4978b99bb3b
- 継承で protected から public のように可視性を変えてオーバーライドされたメンバを表すのに使われているフラグ、ZEND_ACC_CHANGED の扱いの改善

## dstogov: Fixed bug [#76869](https://bugs.php.net/bug.php?id=76869) (Incorrect bypassing protected method accessibilty check).
- https://github.com/php/php-src/commit/655a99d1312b3dfd72a1b9e59b7b9322203f615b
- protected メソッドが private メソッドをオーバーライドする際、可視性チェックをすり抜けてしまう問題を修正

## weltling: Update binary SDK version for AppVeyor
- https://github.com/php/php-src/commit/49511a5132110ad64f22d0f6c2a6f7df0b25fb13
- AppVeyor の php-sdk バイナリのバージョンを更新

## weltling: Improve error code matching
- https://github.com/php/php-src/commit/19ab91781ed48db3f3bf171f0687f7b4b2a037e1
- ext/openssl のテストコードにあったエラーコード取得処理を修正
HashiCorpJapan Meetupで得たこと

DeNAさんのオフィスで行われたHashiCorpJapan Meetupに参加してきました。
発表を聞いて参考になった箇所をピックアップしていきます。
対象となるツールは次の6種類ですが、Terraformに関する内容が多いです。

- [Vagrant](https://www.vagrantup.com)
- [Packer](https://www.packer.io)
- [Terraform](https://www.terraform.io)
- [Vault](https://www.vaultproject.io)
- [Nomad](https://www.nomadproject.io)
- [Consul](https://www.consul.io)

発表資料はこちら
[DevOpsを支える今話題のHashiCorpツール群について](https://hashicorp.connpass.com/event/98386/presentation/)

## Consul

- あるサービスが別のサービスと通信する場合に、通信相手を見つける（サービスディスカバリ）機能を提供するツール
- Consulにサービスを登録することでサービスイン、Consulが障害を検知するとサービスアウト
- Consul Connectという機能ではサービス間の通信を透過的にTLSで保護することが可能

WebサーバとDBサーバといったサービス間の依存を疎結合にできそうな印象がありました。

## Packer

- DockerイメージやAWSのAMIを作成するためのツール
- イメージの構成管理にはAnsibleを組み合わせることも可能

仕事でAMIの管理をどうするのが良いのか探していたので、ちょうど良いものが見つかりました。
導入予定です。

## TerraformのCI/CD

- 毎回削除するテスト用の環境でplan, apply, destroy
- 削除はしないサンドボックス環境でplan, apply
- ボタンを押すと本番環境にapply

Terraformのテストってどうするのが良いのかって思っていましたが、基本はterraform planを自動化するんですね。
ボタン1つでterraform applyは便利さもありますが、terraform用の機密情報を個々の開発者が持つのではなく、デプロイ用のサーバで一元管理できるのが魅力に思いました。

## Terraformのディレクトリ構成
- Workspaceによる環境の分離は少数、production、developmentといったディレクトリを作る方法が多数

自分もWorkspaceは使わず、環境ごとのディレクトリを分けて運用しています。

## 全サービスのTerraformコードを1リポジトリで管理
- 目的はCIの設定コスト、レビューのコストを下げるため
- リポジトリの中ではサービスごとにディレクトリを分ける
    - 各サービスのディレクトリはGitHubの[CODEOWNERS](https://help.github.com/articles/about-codeowners/)で権限を管理

1リポジトリで管理するメリットは、同じリポジトリで再利用可能なmoduleを作って簡単に参照できることもあるのかと思いました。（Privateリポジトリのmoduleを参照するって有償版でないとできないんでしょうか？）
CODEOWNERSは初めて知りましたが便利な機能ですね。

## クラウドのアカウント管理
- サービスごとにアカウントを分けていることが多い
- 煩雑なアカウントの初期設定はTerraformで自動化している

単純にAWSのアカウントってどの単位で分けているのか気になってました。
サービスごとに分ける理由は他のサービスへの影響をなくすためかな？

# 最後に
製品の紹介ではなく、運用で得た知見が詰まった活用方法の発表だったので業務に活かせる内容が多かったです。
イベントで生ハムの原木と生ビールが出てくるDeNAさんの福利厚生は素晴らしい。
絵で覚える正規表現 — 始まりは太陽、終わりは音楽。

## ここに正規表現がある

![image](https://user-images.githubusercontent.com/13635059/45458710-ca4a1a00-b72f-11e8-9a68-abec234bc6eb.png)

## キャレットが始まりだ

![image](https://user-images.githubusercontent.com/13635059/45458717-d33aeb80-b72f-11e8-91df-25a19b8dd6dc.png)

## 太陽の欠片に似ている

![image](https://user-images.githubusercontent.com/13635059/45458718-d504af00-b72f-11e8-9715-90833e4f9d4c.png)

## ドルマークは終わりだ

![image](https://user-images.githubusercontent.com/13635059/45458719-d7670900-b72f-11e8-92f7-a72ee6232812.png)

## 音楽記号に似ている ( もしくはバイオリンに )

夜は音楽を聴きたい。

![image](https://user-images.githubusercontent.com/13635059/45458724-ddf58080-b72f-11e8-897e-215a98a9594c.png)

## 昼から夜へと向かってマッチする

![image](https://user-images.githubusercontent.com/13635059/45458728-e057da80-b72f-11e8-82f8-9e13090555a6.png)

## Links

- [Gist](https://gist.github.com/YumaInaura/efccafe46834b8a0dbb3d94dc66136f7)
- [Medium—imported](https://medium.com/supersonic-generation/regex-how-to-remember-start-caret-and-end-dollar-sun-and-treble-cref-9a320bf7c319)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SuperColliderの導入(mac編）

#SuperColliderの導入

##ソースコードから
https://github.com/SuperCollider/SuperCollider
https://supercollider.github.io/download

https://github.com/supercollider/supercollider/blob/develop/README_MACOS.md
すでにX-codeは導入済み

```
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

$ brew install git cmake libsndfile readline qt5
$ brew install portaudio
```
ソースコードをコンパイルする方法は、ちょっと休憩。

##バイナリで
https://qiita.com/Hulc_0418/items/ba3e94633e465f7201d0

https://github.com/supercollider/sc3-plugins/releases

3.9.1を導入。3.10はbetaなため

```
$ sudo mv /Users/brew_manager/Downloads/SC3plugins/ .

$ pip install FoxDot
Requirement already satisfied: FoxDot in /anaconda3/lib/python3.6/site-packages (0.7.4)
```

##起動
SuperColliderのアイコンから起動

```
compiling class library...
Found 714 primitives.
Compiling directory '/Applications/SuperCollider.app/Contents/Resources/SCClassLibrary'
Compiling directory '/Library/Application Support/SuperCollider/Extensions'
Compiling directory '/Users/administrator/Library/Application Support/SuperCollider/Extensions'
Compiling directory '/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/BatLib'
Open ended symbol started on line 35 of file '/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/BatLib/LessKeys.sc'
Compiling directory '/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/FoxDot'
Compiling directory '/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/FoxDotQuark'
ERROR: duplicate Class found: 'FoxDot' 
/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/FoxDot/FoxDot.sc
/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/FoxDotQuark/FoxDot.sc

ERROR: There is a discrepancy.
numClassDeps 1668   gNumClasses 3334
Library has not been compiled successfully.
Library has not been compiled successfully.
```
重複があるらしい。

```
$ cd /Users/
$ cd administrator/
$ cd Library/
$ cd Application\ Support/
$ cd SuperCollider/
$ ls
BatLib	FoxDot	FoxDotQuark	quarks
$ mv FoxDot /tmp
```

一方を/tmpに移動。
ファイルを閉じて、再立ち上げ。
アフィルを閉じないとエラーが出たままで起動しない。

```
Open ended symbol started on line 35 of file '/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/BatLib/LessKeys.sc'
WARNING: Could not open directory: '/Users/administrator/Library/Application Support/SuperCollider/downloaded-quarks/FoxDot'
To resolve this, either create the directory or remove it from your compilation paths.
```

どちらを消しても、pathは残ったままという警告が出る。

Preference
remove FoxDotQuark from the path

![スクリーンショット 2018-09-12 9.15.54.png](https://qiita-image-store.s3.amazonaws.com/0/51423/ad899551-51e3-847b-3884-de957e066795.png)

ファイルを閉じて、再起動するとエラーがなくなった。

# 文書履歴(document history)
ver, 0.10 初稿　20180913
ver. 0.11 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Seleniumのブラウザを非表示(Xvfb)

これまで`Xvfb`を別途立ち上げて、`DISPLAY=`で指定していたが、pythonから直接Xvfbを起動終了する方法を知りました。

* [[Python] Selenium RCでブラウザを非表示にすることはできますか？ Selenium-Rc | CODE Q&A 問題解決 [日本語]](https://code.i-harness.com/ja/q/15a362)

```sh
sudo apt install -y xvfb
pip3 install xvfbwrapper
```

```py
from selenium import webdriver

# Xvfbの準備
from xvfbwrapper import Xvfb
display = Xvfb()
display.start()

# FirefoxがXvfb上で起動するため画面には映らない。
driver = webdriver.Firefox()
driver.get('https://www.google.co.jp')

# きちんと表示できているかをtitle値を確認
print(driver.title)

# ブラウザを閉じる
driver.quit()

# Xvfbを終了
display.stop()
```
nifi 新ぷろせっさ

Apache NiFi Updates
NiFi has been upgraded from 1.5.0 to 1.7.0. NiFi 1.7.0 now supports all HDP 3.0 components including Hadoop/HDFS 3.0, HBase 2.0 and Hive 3.

New Features:

NIFI-5214 - Add a REST lookup service
RESTルックアップサービスを追加する
https://issues.apache.org/jira/browse/NIFI-5214

NIFI-5133 - Create a processor to Publish and Subscribe to Google Pub/Sub
Google Pub / Subに公開して購読するプロセッサを作成する
https://issues.apache.org/jira/browse/NIFI-5133

NIFI-4982 - Add a DistributedMapCacheLookupService
DistributedMapCacheLookupServiceを追加する
https://issues.apache.org/jira/browse/NIFI-4982

NIFI-4963 - Add support for Hive 3.0 processors
Hive 3.0プロセッサのサポートを追加
https://issues.apache.org/jira/browse/NIFI-4963

NIFI-4917 - Create a new Controller Service for specifying Keytabs
Keytabを指定するための新しいコントローラサービスを作成する
https://issues.apache.org/jira/browse/NIFI-4917

NIFI-4906 - Add GetHdfsFileInfo Processor
GetHdfsFileInfoプロセッサを追加する
https://issues.apache.org/jira/browse/NIFI-4906

NIFI-4872 - NIFI component high resource usage annotation
NIFIコンポーネントの高リソース使用量アノテーション
https://issues.apache.org/jira/browse/NIFI-4872

NIFI-4833 - Add ScanHBase processor
ScanHBaseプロセッサを追加する
https://issues.apache.org/jira/browse/NIFI-4833

NIFI-4809 - Implement a SiteToSiteMetricsReportingTask
SiteToSiteMetricsReportingTaskを実装する
https://issues.apache.org/jira/browse/NIFI-4809

NIFI-4227 - Create a ForkRecord processor
フォークレコードプロセッサを作成する
https://issues.apache.org/jira/browse/NIFI-4227

NIFI-4185 - Add XML record reader
XMLレコードリーダーを追加する
https://issues.apache.org/jira/browse/NIFI-4185

NIFI-5186 - Update UI to account for asynchronous validation
非同期検証のためのUIを更新
https://issues.apache.org/jira/browse/NIFI-5186

Key Bugs Fixed:

NIFI-5200 - Nested ProcessSession.read resulting in outer stream being closed.
ProcessSession.readをネストして、外部ストリームを閉じます。

NIFI-5033 - Cannot update variable referenced in restricted components
制限付きコンポーネントで参照される変数を更新できません

NIFI-4837 - Thread leak on HandleHTTPRequest processor
HandleHTTPRequestプロセッサのスレッドリーク
Windowsの pipenv shellでも履歴機能が使いたい

# 背景
Python仮想環境として **pipenv** を利用しているのですが、**Windowsのコマンドプロンプトでは、`pipenv shell` で起ち上げた仮想環境のサブシェルの中で ↑↓ によるコマンド履歴表示が効かない** という問題に直面したため、回避策をまとめました。

# 環境
- **OS:** Windows 10 Pro
- **Python:** 3.7.0
- **pipenv:** 2018.7.1
- **PowerShell:** 5.1.17134.228

# 試したが駄目だったこと
### コマンドプロンプトで何とかする方法はないか？
以下の issueで取り上げられていますが、2018/9/12現在解消法はないようです。
[up/down arrow history doesn't work on pipenv shell on windows #876](https://github.com/pypa/pipenv/issues/876)

### Git Bashではどうか？
Git Bashや Cygwinでは、Pythonが パスを取り違えていろいろと不具合が起きるようで、非推奨かつ不具合の素のようです。
[pipenv shell does not work when running Git for Windows' bash on Windows #2623](https://github.com/pypa/pipenv/issues/2623)

実際に試した結果がこちら。
![gitBash_pip.PNG](https://qiita-image-store.s3.amazonaws.com/0/141199/ed4305b4-1341-892c-c855-1a2ea47ee716.png)
`Launching subshell in virtual environment` とありますが、その後文字化けもしていて、かつ `pip list` の結果がサブシェルに入る前後で変わっていません。
本当は、仮想環境中には `flask` などが入っています。

ファイルパスが変わって `os.path` が変わってしまうからしょうがないようです。そもそも Python自体起動できない......
回避策もないことはないようですが、何を変更していてどんな副作用があるか理解できる人でないと、推奨はしないとのことです。

# 回避策
そしてたどり着いた回避策が、**PowerShellを使う** です。

自分の業務だと Windowsではコマンドプロンプトにしか触れず、batファイルを作ることはあっても ps1ファイル[^1]を作ることはなかったため、避けていました。

しかし、PowerShell上では、pipenv shell中 ↑↓ での履歴が呼び出し使えました！
![powerShell_pip.PNG](https://qiita-image-store.s3.amazonaws.com/0/141199/fe2015e5-06f6-6ea6-f29c-17a8d86e5e13.png)
Git Bashのときと違い、ちゃんと `pipenv shell` の前後で `pip list` の結果も変わっていますね。

なお、個人的に PowerShellのデフォルトの背景色、フォントがしっくりこなかったため、変更しています。
フォントは、最近 (言うほど最近でもないけど) 話題の、Adobe・Google製の「源ノ角ゴシック」を TrueTypeに変更した、**源真ゴシック** の等幅フォントを利用しています。
ダウンロードはこちらから。
http://jikasei.me/font/genshin/

解凍後、利用したいフォントの `ttf` ファイルを右クリックからインストールすれば、利用可能となります。

また、PowerShellで文字がない状態でバックスペースを押すとビープ音が鳴るのがいやだったので、こちらのサイト様の記事を参考に設定を変更しています。
https://ite.cexen.info/powershell-%E3%82%92%E4%BE%BF%E5%88%A9%E3%81%AB%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E5%AE%9A/

なお、記事中で実際に対応するのは

- .ps1ファイルを実行可能にする
- プロファイルを作成する
- 補足：ビープ音を消す

だけで大丈夫です。
上記サイト様では emacs風キーバインドの利用を前提にコマンドを書かれています。
標準の設定ならば、ビープ音消去の設定はプロファイルに

```PowerShell:$profile
Set-PSReadlineOption -BellStyle None
```

と記載するだけで問題ありません。

これで最低限の設定も完了し、**Windowsでも快適に pipenv shellが使えます！**

# 補足：それでも気になったこと
それでもやはり気になることが 2点ほど。

#### 1. 利用中の仮想環境を示す表示が出ない  
上に貼った PowerShellの画像を見ていただけると分かるのですが、コマンドプロンプトでの利用時は出ていた、**利用中の仮想環境名を示す表示がありません**。
コマンドプロンプトでは、カレントディレクトリを示す表示の左に、`()` で仮想環境名を表示していて、今仮想環境にいるのかどうかが一目瞭然でした、これが使えないのは残念。

#### 2. PowerShellのプロパティのフォントタブを開くたびに出るダイアログがうるさい
これはフォントの変更に起因するのですが、PowerShellプロパティのフォントタブを開くと、「ポイント サイズには 5 から 72 を指定してください。」というダイアログが 4、5回出てきてうっとうしいです。

軽く調べたり、レジストリいじってみたりしましたが、回避策は現状なさそうです。
一度設定してしまえばそう頻繁に開くところでもないので、我慢。

# 結論
以上、**Windowsで pipenv shellを使う方は、PowerShellで使うと少し快適になる** と思います。
そのほかの回避策や問題の回避策など、ありましたらコメントいただけると幸いです。

[^1]: PowerShell用の batのようなもの
FGO - Apple版における海外からの課金について

## 免責
- <font color="red">__アカウントの生成やクレジットカードの登録、課金処理はご自身の責任でお願いします。当記事の情報に基づきなんらかの損害があっても当方の責任は負いかねます。__</font>
- <font color="red">__If you want to try, Please do it by your own responsibility.__</font>

## 前提
- 長期的な海外暮らし
- 現地（日本国外）のクレジットカード所持
- 日本のクレジットカードは非所持もしくは期限切れ
- 対象FGOは日本語版（FGOjp）

## 結論
- __Androidで課金してAppleでプレイしろ__
- For purchase FGO(JP) quartz from other countries. You'd better purchase on Android edition, Then migrate your account to Apple.

## FGOjp入手について
- FGOjpのダウンロードはAndroid版・Apple版共に日本のストアのみの配信となっている。
- 入手は海外からも難しくなく、VPNで現在位置を偽装する・AppleStoreアカウントのロケーションを日本にする等で対応可能。（2018年8月段階ではクレジットカード非所持でもAppleStoreアカウントは作成可能）
- インストール後はスマホ本体のロケーションがどこであろうがインターネットにさえ繋がっていれば通常どおりプレイ可能。
- なお本題から逸れるが、泥と林檎を比べるとロード速度が圧倒的に異なるので快適な周回を求める場合は林檎版強推奨。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/kd--vnk8E2o/0.jpg)](http://www.youtube.com/watch?v=kd--vnk8E2o)


- ただし、Free-to-playのためインストールまでは上手く行くが、この状態で課金しようとすると以下のようなメッセージが出て課金に失敗する。

> 購入できません　指定されたプロダクトデータが取得できませんでした

![image](https://qiita-image-store.s3.amazonaws.com/0/135051/d6e1a388-f9cb-e13e-24cb-b4335b774bf1.png)

- おそらくGoogle Playはとにかくクレジットカードが登録されていれば問題なく請求できるが、AppleStoreは「日本のアカウントにチャージが存在するorクレジットカードが登録されている」必要があり、なおかつ「ApplreStore日本には日本のクレジットカードしか登録できない」ことによって海外勢にとっては王手詰み状態になっている。
- 課金時、クレジットカードが登録されている海外アカウントにStoreを切り替えても失敗する。おそらく、「対応リージョンのStoreに存在しないアプリ」に課金する処理は止められると思われる。
- 以上の検証により、現実的な対応策は__「課金を行う場合、一度Android版FGOへアカウント引き継ぎを行い、ダヴィンチ工房へ移動。聖晶石を購入する。その後再度アカウントをApple版に引き継ぎ、<font color="red">爆死する</font>」__になると思われる。というか今回の夏イベは実際これで対応した。
- ただし、一度引き継ぎを行ったアカウント（引き継ぎの元となったアカウント）に再度引き継ぐことはできず、__アンインストール→再度のFGOjpインストールを実施する必要がある。__一括ダウンロード行っている場合も当然まとめて消し飛ぶので再度行う必要がある。注意。

## 未確認事項
__以下の情報はここまでの作業からの予想になります。一切の保証は存在しないことを予めお断りします。__

- おそらく「日本のAppleStoreアカウントに残金が存在」すれば課金にも成功すると__思われる__。
- 前提としてクレジットカードは使えない状況を想定しているわけだが、__なんらかの方法で円建てのiTunesカードを購入できればおそらく上記プロセスは必要ないと思われる。__
 - たまたまあなたの海外拠点の近くで円iTunesカードが買える。
 - 知り合いが一時帰国する、もしくは友人が日本から遊びにくるとき買ってきてもらう。
 - オンラインでのiTunesカード通販サービスを利用する。（Kiigo等）
- 上記のような手段でiTunesカード入手、日本アカウントに課金することができれば面倒くさいアカウントピンポンを行わずに__済むかもしれない。__
- 現在下名がプレイしてるゲームがFGOなため、これにフォーカスした記事となったが、同様の（Free-to-play）ゲームも同じようなプロセスでゲーム内課金ができると思われる。
Message Analyzer はじめの一歩

## 今回の記事の実行環境

* Windows Server 2016

## インストール

[Microsoft Message Analyzer](https://www.microsoft.com/en-us/download/details.aspx?id=44226)
[Microsoft Message Analyzer のインストール](https://social.technet.microsoft.com/wiki/contents/articles/26806.microsoft-message-analyzer-ja-jp.aspx)

## ネットワークトレース

ネットワークトレース (いわゆるパケットキャプチャ) は、WireShark など別のツールをインストールしなくても、現在の Windows なら [netsh コマンド](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd878517(v=ws.10))で既定で出力が可能ですね。

```cmd

> netsh trace start capture=yes

トレース構成:
-------------------------------------------------------------------
ステータス:           実行中
トレース ファイル:    C:\Users\XXX\AppData\Local\Temp\NetTraces\NetTrace.etl
追加:                 オフ
循環:                 オン
最大サイズ:           250 MB
レポート:             オフ

// 解析したい処理を実施

> netsh trace stop
トレースを関連付けています... 完了
トレースの結合中... 完了
データ収集を生成しています ... 完了
...
トレース セッションは正常に停止しました。

```

## プロトコルでグルーピングする

[ViewPoints] にて HTTP などを選択するだけです。
![SRV01_Exchange2019-2018-09-11-14-38-39.png](https://qiita-image-store.s3.amazonaws.com/0/218221/58d052aa-9eae-75ac-354c-6111077dd640.png)
まぁ、この辺は WireShark でも普通にできます。

## プロセス名でグルーピングする

WireShark でできないことのひとつですね。解析目的によっては、超便利。

[Tools] - [Windows] - [Field Chooser] を選び、表示された Field Chooser の中から [Global Propeties] - [ProcessName] を選択します。

すると、ProcessName 列が追加されるので、列を右クリックして [Group] を選択。すると、ProcessName ごとにグループ化されます。
![SRV01_Exchange2019-2018-09-11-14-33-28.png](https://qiita-image-store.s3.amazonaws.com/0/218221/0d09e6ee-c0bb-2041-dc26-8521f52baf3c.png)

## イベントログを見る

イベントログも開くことができます。上述のグループ化と併用すると、結構便利。でも結構重たいです。手順／画像は割愛。

## PowerShell の実行結果をパースして分析する

PowerShell コマンドレットの実行結果はオブジェクトで返ってくることが多いですが、これを Message Analyzer でパースして分析することができちゃいます。

Get-Process を分析対象として・・・
![SRV01_Exchange2019-2018-09-11-14-42-05.png](https://qiita-image-store.s3.amazonaws.com/0/218221/2c090e5f-9fdc-0a07-853e-074e0e723db3.png)
色々な情報が、属性ごとにきちんと取れています。
![SRV01_Exchange2019-2018-09-11-14-42-55.png](https://qiita-image-store.s3.amazonaws.com/0/218221/bb444afe-7bbc-99e0-5ac0-e64615f59b5f.png)
フィルタに追加して、昇順に並べ替えると・・・使用量順に並べ替えて確認することができます。
![SRV01_Exchange2019-2018-09-11-14-44-41.png](https://qiita-image-store.s3.amazonaws.com/0/218221/9c7fd846-2d93-469c-73fe-0bd9d62c7f32.png)
まぁ、このくらいのレベルなら、わかっていれば PowerShell だけで取れてしまいますが、出力された表を考えながらポチポチやる解析には便利かもですね。

「Message Analyzer がどんなツールで、どんなことができそうか？」というだけでも知っておくと、トラブルシュートのときに役立てると思います。
JAWS-UG IoT専門支部 2018-09「IoTセキュリティ」まとめ

『JAWS-UG IoT専門支部 2018-09「IoTセキュリティ」トレンドマイクロ、SORACOM、ユビキタスAIが語るIoT時代のセキュリティ』に参加した時の個人的なまとめ

## IoT機器が置かれている場所
- センサーなどのデバイス
  - 測定したいものが屋外の場合などは特に無防備な場所に置かれていることが多い（道路の片隅など）
- 産業用ロボット
  - 今までは攻撃対象として狙われることが少なかったためセキュリティ対策がされていない場所が多い
  - OSがLinuxベースだとより狙われやすい

## 脅威
- デバイスそのものが盗まれて不正使用される（盗みやすく盗まれたことに気づきにくい）
- デバイス内のクレデンシャル情報が抜き取られて不正使用される（さらに気づきにくい）
- デバイスがウィルスに感染したまま使い続けてしまう（これも気づきにくい）

## 損失
- データが盗まれる
- サービス不具合
- クラウドやネットワークを不正利用されて膨大な利用料を請求される
- 踏み台にされて意図せず犯罪に加担してしまう
- 産業用ロボットでは、不良品が製造されてしまう
  - 不良品を使ったことにより大きな事故につながってしまう

## 対策
### 影響範囲を局所化する
 - AWS IoT ポリシー設定を適切な範囲にする
 - SORACOM Private Garden機能
  - 特定のネットワーク・エンドポイントにしか繋げなくする
  - IMEIロック（SIMと端末が一致しないと繋がらない・SIM盗まれ対策）

### IPアドレスを隠蔽する
 - NAPT化
 - IoTイントラネット（インターネットではなく専用閉域網を利用する）(SORACOM Airなど）

### 早期検知（監視）
 - AWSマネージドデバイス管理（利用可不可・ファームウェアアップデートなど）
   - AWS IoT Device Management
 - AWSマネージドデバイス監視（利用ログ監視）
   - AWS IoT Device Defender
 - 透過型トラフィック処理サービス
   - SORACOM Junction

### セキュアエレメント（外部からの解析攻撃に耐えるセキュリティ能力を持った半導体製品の総称）の利用
 - 耐タンパ性（表面を剥がすと回路などが同時に物理的に破壊されるなどの機能を持つこと）
 - SORACOM Funnel（認証情報を預かり、デバイスとクラウド間でプロキシ的な役割をする）
 - SORACOM Krypton（セキュアプロビジョニングサービス）

### IoTレピュテーション
- IoT機器が脅威がある接続先と通信しようとした時にブロックするし、被害を未然に防ぐサービス
	- トレンドマイクロ

### ファームウェアの盗聴・改ざん防止
- セキュアブート
- セキュアファームアップ
- ファームウェア暗号化

### ハードウェアを利用した対策　ハードウエアセキュアIP
- ソフトウェアだけでは実現が難しい強固な秘匿データ管理
  - ARM TrastZone
  - Intel Dynamic Application Loader
  - セキュアプロセス、セキュアストレージ など
  - セキュアIoT機器開発キット for RX65N
	  - ユビキタスAI・ルネサスエレクトロニクス


### Trusted Computing Group標準規格
- TPM 2.0
- TSS 2.0

### アンチパターン
- デバイスをリモートで制御したいためにデバイスにグローバルIPを割り当てる
	- 外部から攻撃されやすくなってしまう
- デバイスにサーバ並みのセキュリティを施す必要があり、運用コストが高くつく

### IoTセキュリティ診断の利用



## 感想

クラウド、デバイス、ネットワーク それぞれに対策する方法があるので、用途や規模に合わせて適切な対策を取っていくこと
Laravel PHPRUNNERで作成する業務ソフト開発

#背景
phprunnerでシステム作成は　顧客案件対応　業務側などの機能はすぐれているものの
問題があると　ソフトだからと　毎回なり　修正も難しいので laravelと　両方同時に使えるようにした

phprunnerの特性はデータベース設定をすれば業務上必要なものをだいたいは作成でき
高機能なので業務には重要だと思っている
＊）この点ではLaravelとも同じだが　業務登録に必要な一通りができるという面でいい

だけれでも　万人受けしないものは批判の対象になるので
もし何かやる場合は　万人受けする物の中に　効率的な物をいれておくのがいい

片方に固執しなく　両方をやり　それぞれのいいところを話した方が
よりよいものはできる

#laravel
![laravel.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/7a6eec60-47a1-7548-6707-292fa6302633.jpeg)

## phprunner
![phprunner.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/0def842d-4d76-80a4-1fc2-265432f98a11.jpeg)

##phprunnerでのシステム作成
###テーブルを設定をすればシステムが出来る
![build.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/f014979d-486b-5909-2fbe-b7514515de8b.jpeg)

##CLOUD9でビルド後はそれぞれ開発（どちらも対応出来るように）
![folder校正.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/39ba79cc-3b58-8bfe-862d-b4b2e33d3efb.jpeg)

#この二つがＢＰＭＳとラインの連携基盤だったらやすいかなと思う
![bpm基盤.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/21501eff-4a6a-cd07-3b5d-281e7a52c77b.jpeg)
メモ：pythonのprintを文字列で受け取る

# モチベーション
外部ライブラリがprintをしてくるとき，それを文字列として受け取りたいことがあった．

# 方法
contextlib.redirect_stdoutを使ってio.StringIOに標準出力をつなぎ変えてしまえばよい
https://docs.python.jp/3/library/contextlib.html

```python
import io
from contextlib import redirect_stdout
f = io.StringIO()
with redirect_stdout(f):
    print("hoge")
    print("huga")
f.getvalue()
```

```
>>> 'hoge\nhuga\n'
```
標準入力を全て繋ぎ変えてしまっている点は注意．
Ubuntu18.04/Mint19でwinbindが再起動後に起動しない

Ubuntu 16.04ではNetBIOS名のホストへTCP接続を行うのに、``sudo apt install winbind libnss-winbind`` とやって、``/etc/nsswitch.conf``へ``wins``と追記すればよかったと思います。

ところがUbuntu18.04やMint19では、上記のインストール直後はうまく行っていたのに再起動後に名前解決が失敗してしまいます。

[winbind does not work after reboot on Mint 19 / Ubuntu 18.04](https://bugs.launchpad.net/ubuntu/+source/samba/+bug/1789097)
こちらを読んだところ、どうやらインストールでデフォルトで作成される ``/lib/systemd/system/winbind.service`` の起動設定の問題らしいです。

``/lib/systemd/system/winbind.service``をエディタで開いてみると``[Unit]``セクションに以下のように記述されています。

```
After=network.target nmbd.service
```

これはsambaがあれば成功する設定で、実際にはsambaが居ないために起動が失敗してしまうとのこと。

```
After=network-online.target nmbd.service
Wants=network-online.target
```

このように設定することでsambaがインストールされていなくてもNetBIOS名の解決が行えるようになりました。
[UE4] C++ で enum の foreach を行う方法

# 概要
Blueprint では enum のタイプ指定で foreach をするノードがありますが、同様のことを c++ で行う方法です。

※BPでの例
![スクリーンショット 2018-09-13 01.45.31.png](https://qiita-image-store.s3.amazonaws.com/0/86339/3c3d8a29-3606-a2fe-0fe2-90c1acc7aa5c.png)


# サンプルコード
```cpp:testenum.h
UENUM(BlueprintType)
enum class ETestType1 : uint8
{
	TypeA,
	TypeB,
	TypeC,
	TypeD,
};

UENUM()
enum class ETestType2 : uint8
{
	Type1,
	Type2,
	Type3,
	Type4,
	
	TypeX100 = 100,
	TypeX120 = 120,
	TypeX121,
	TypeX122,
	
	TypeZero = 0,
	TypeOne,
	TypeTwo,
	TypeThree,
};
```
```cpp:foreach_sample.cpp

// for ループで enum の値を LOG 出力する例.

// ETestType1.
{
	const UEnum* enumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("ETestType1"), true);
	if (enumPtr != nullptr)
	{
		UE_LOG(LogTemp, Log, TEXT("ETestType1 num = %d"), enumPtr->NumEnums());
		for (int i = 0; i < enumPtr->NumEnums(); i++)
		{
			ETestType1 enumValue = (ETestType1)(enumPtr->GetValueByIndex(i));
			UE_LOG(LogTemp, Log, TEXT("%s = %d"), *enumPtr->GetNameByIndex(i).ToString(), (int)enumValue);
		}
	}
}

// ETestType2.　// コード的には ↑ の ETestType1 とほぼ同じです.
{
	const UEnum* enumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("ETestType2"), true);
	if (enumPtr != nullptr)
	{
		UE_LOG(LogTemp, Log, TEXT("ETestType2 num = %d"), enumPtr->NumEnums());
		for (int i = 0; i < enumPtr->NumEnums(); i++)
		{
			ETestType2 enumValue = (ETestType2)(enumPtr->GetValueByIndex(i));
			UE_LOG(LogTemp, Log, TEXT("%s = %d"), *enumPtr->GetNameByIndex(i).ToString(), (int)enumValue);
		}
	}
}

/* output result.
	LogTemp: ETestType1 num = 5
	LogTemp: ETestType1::TypeA = 0
	LogTemp: ETestType1::TypeB = 1
	LogTemp: ETestType1::TypeC = 2
	LogTemp: ETestType1::TypeD = 3
	LogTemp: ETestType1::ETestType1_MAX = 4

	LogTemp: ETestType2 num = 13
	LogTemp: ETestType2::Type1 = 0
	LogTemp: ETestType2::Type2 = 1
	LogTemp: ETestType2::Type3 = 2
	LogTemp: ETestType2::Type4 = 3
	LogTemp: ETestType2::TypeX100 = 100
	LogTemp: ETestType2::TypeX120 = 120
	LogTemp: ETestType2::TypeX121 = 121
	LogTemp: ETestType2::TypeX122 = 122
	LogTemp: ETestType2::TypeZero = 0
	LogTemp: ETestType2::TypeOne = 1
	LogTemp: ETestType2::TypeTwo = 2
	LogTemp: ETestType2::TypeThree = 3
	LogTemp: ETestType2::ETestType2_MAX = 123
*/
```

# 説明
c++ で enum to string をする手法がこちらで説明されています。
https://wiki.unrealengine.com/Enums_For_Both_C%2B%2B_and_BP

enum のタイプ名から FindObject で UEnum 型のObjetを取得し、そこから情報を取っているようで、これを参考にしました。

UEnum 型は、以下のような関数が使えます。
http://api.unrealengine.com/INT/API/Runtime/CoreUObject/UObject/UEnum/

また、ソースコードを見てみると、UEnum オブジェクトは enum の定義名の FName が Key で、int64 の値を Value として持っていることがわかります。

```Engine\Source\Runtime\CoreUObject\Public\UObject\Class.h
class COREUOBJECT_API UEnum : public UField
{
		/*略*/
protected:
	/** List of pairs of all enum names and values. */
	TArray<TPair<FName, int64>> Names;
```

UEnum には GetValueByIndex() や GetNameByIndex() などがあるので、これらを使ってforeachを実現しています。

# 注意
- UEnum オブジェクトから情報を取るには、enum に UENUM() をつけて、エンジンに対して明示する必要があります。UENUM() をつけていないと FindObject で nullptr が返ってきます。
- UEnum 内の情報には、定義したもの以外に、最後に _MAX が自動的に追加されます。ETestType2 のログを見てもらえればわかりますが、最後の定義 +1 がMaxになるわけではないようです。


# 動作確認環境
UnrealEngine 4.20.2
Visual Studio Community 2015
nodejsのpgでcatchを書く方法

これがベスト。以下、例外をキャッチする所と例外をtoStringしたメッセージ

いい例。catchした中でnew ErrorをPromise.rejectで囲んでreturnする。この書き方だと例外で自分のコードのどこでエラーが起きたのか分かる。

```js
await this.dbClient.query("example;").catch(e => Promise.reject(new Error(e)) );
 Error: error: syntax error at or near ";"
    at dbClient.query.catch.e (自分のコード.js:44:65)
    at process._tickCallback (internal/process/next_tick.js:68:7)
```


駄目な例1。catchした例外を再度new Errorでインスタンスを作りthrowする。最初はこれでいいと思ったけど、throwはよくない。

```js
await this.dbClient.query("example;").catch(e => { throw new Error(e) });
 Error: error: syntax error at or near ";"
    at dbClient.query.catch.e (自分のコード.js:44:65)
    at process._tickCallback (internal/process/next_tick.js:68:7)
```

駄目な例2。これはそもそもcatchの意味がない。スタックトレースがpgのモジュールから始まっていて、自分のコードのどこで例外が起きたのか分からない。

```js
await this.dbClient.query("example;").catch(e => { throw e });
 error: syntax error at or near ";"
   at Connection.parseE (node_modules\pg\lib\connection.js:553:11)
   at Connection.parseMessage (node_modules\pg\lib\connection.js:378:19)
   at Socket.<anonymous> (node_modules\pg\lib\connection.js:119:22)
   at Socket.emit (events.js:182:13)
   at addChunk (_stream_readable.js:283:12)
   at readableAddChunk (_stream_readable.js:264:11)
   at Socket.Readable.push (_stream_readable.js:219:10)
   at TCP.onread (net.js:639:20)
```

駄目な例1についてもう少し。

http://azu.github.io/promises-book/#not-throw-use-reject には以下の記述がある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/8130b231-466a-5beb-50e2-2ad58ad7d48d.png)

Promiseオブジェクトの状態がrejectedかどうかという意味。具体的な違いは、上記ページに書いてあるとおりChromeのdevtoolのpause on caught exceptionで止まるかどうかの違いがあるらしい。

catchした後は違いがない感じかな
ReactでHello, World!!

#　前提
Reactインストール済

# Goodle Chrome　Reactの拡張機能追加
[React　Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi)をインストールしていきます。
上記のリンクの右上のChromeに追加を押します。
その後、ブラウザ右上のReact　Developer Toolsを右クリックし、「拡張機能」をクリック。
「ファイルのURLへのアクセスを許可する」をONにする。

# ディレクトリ作成
適当な場所に、React_projectsというディレクトリを作成し、index.htmlファイルを作成します。
このindex.htmlをエディタで開き書き込んで行きます。

# Reactのスクリプトを読み込む
index.htmlをエディタで開き[Try React](https://raw.githubusercontent.com/reactjs/reactjs.org/master/static/html/single-file-example.html)のhtmlの一部を使い下記のように書き込みます。
scriptが使う部分です。

```html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>React Practice</title>
        <link rel="stylesheet" href="css/styles.css">
        <!-- React本体-->
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <!-- Reactの結果をDOMに反映していくライブラリ-->
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <!-- バベルライブラリ-->
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>
<body>
    <script type="text/babel">

    </script>
</body>
</html>
```

上記のようにできたらbodyをこのようにします。

```html
<body>
    <div id="root"></div>
    <script type="text/babel">
        (() => {
            ReactDOM.render(
                <p>Hello, World!!</p>,
                document.getElementById('root')
            )
        })();
    </script>
</body>
```

これをブラウザで表示すると、
![スクリーンショット 2018-09-13 1.21.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/285122/965ffb46-6dfe-4b78-78f4-d90064ad95f7.jpeg)

このように表示できたと思います。