OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】ドットインストールLaravel5.5入門でハマった話

こんにちは。
今回はドットインストールの『Laravel5.5入門』を進めていたときにぶつかった問題と対処法についての記録です。
*注:以下はプレミアム会員限定のコンテンツをご紹介しています。*


##Laravelとは
そもそもLaravelとはなんなのでしょうか。
**PHPを開発する際に使うWEBフレームワークの一種**、つまりより簡単にPHPを用いた開発を行うためのテンプレということでしょうか。
PHP用のフレームワークには特に日本での人気が根強い「CakePHP」や海外で人気が伸びている「Codeigniter」などがあります。

##ドットインストールのLaravel5.5入門#27でハマった話
ドットインストールを使ってLaravelの学習を進めていたとき、#26までは順調に来ていました。
しかし、ブログの記事とコメントをひもづける回の#27で詰まってしまいました。

そのときのエラーがこちら。

<img width="640" alt="スクリーンショット 2018-11-28 11.13.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/5282c52c-d9cf-8962-4034-3244486d31ed.png">
*title2(title1)*をクリックすると#26でmigrationしたコメントのモデルがbodyの下に表示されるはず、、、、。



**ん？**

<img width="631" alt="スクリーンショット 2018-11-28 11.14.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/5bdd5601-72b0-f593-26fd-e6db4ef41e23.png">
※エラー全文
```SQLSTATE[HY000]: General error: 1 no such column: comments.post_id (SQL: select * from "comments" where "comments"."post_id" = 2 and "comments"."post_id" is not null) (View: /home/vagrant/laravel_lessons/myblog/resources/views/posts/show.blade.php)```

ドットインストールの手順に従って進めてきたのにcomments.post_idのカラムが存在しない？
ドットインストールのソースコードをコピペし再実行してもうまくいかず。

もしかしたらサーバーの設定の問題かな？とか思いつつドットインストールに質問をしてみると以下のような回答が。

<img width="606" alt="スクリーンショット 2018-11-28 11.29.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/dc51b5a7-1128-579a-0e5a-6391ef7524c2.png">

どうやら#26のmigrationがうまく実行できていなかった様子。
言われるままにもう一度実行するものの、ちゃんとファイルは作られており効果なし。
次に```php artisan migrate:refresh```でコマンドを最初の状態に巻き戻します。



<img width="638" alt="スクリーンショット 2018-11-28 11.36.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/850013dd-04b3-3fff-cd80-cbe3ef8b0fa4.png">

すると今度はうまくいきました。
データベースの中に入っていたテーブルは空になっていたものの、データを新しく追加してあげると以下のように元の状態に。

##まとめ
以上、今回はドットインストールのLaravel5.5入門でハマった際に行った対処法の備忘録を書きました。
```migrate:refresh```の後に```--step=number```を入れると直近の入れた数字分のマイグレーションをリセットしてくれるような機能もあるようです。
頑張って使いこなせるようにこれからも勉強に励みます。
複数のバージョン管理ツールを使う方法

# 複数のバージョン管理ツールを使う方法
新規のバージョン管理ツールでバージョン管理をするきっかけがあったので共有
基本的に管理ツールをちょこっと弄るのと，コマンド叩くだけなのでそこまで難しくないはず


# 手順1
まずはバージョン管理ツール(bitbucket，GitLabなど)に登録
これをしないとリモートでGitのバージョン管理をすることができない.
登録後プロジェクトを作成して，プロジェクトのURLと自分の管理したいプロジェクトと紐付け
以下のコマンドを叩けばいい

```bash:自分が管理したプロジェクト
git init
git remote add origin バージョン管理ツールで発行したリンク
```

で紐付け完了

# 手順2
rsa鍵を生成しバージョン管理ツール側への登録.
鍵の生成は`ssh-keygen -t rsa`のコマンドで生成できる.生成されたものは`~/.ssh/`の直下にある.生成時に自分が生成したい場所を指定できるので，自分はバージョン管理ツールごとに行なっている.
git hubとbitbucketとgitlabを使っているので
階層的には

```Directory:ディレクトリ
~/.ssh/- bitbucket/
       |
       - gitlab/
       |
       - github/

```

というふうになっているこの各々ディレクトリの中に秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が入っている.

このようにバージョン管理ツールごとに作っておくと，一つのrsaで複数のバージョン管理ツールに登録しなくでもすむ.

# 手順3
push，pullをする時にどの鍵を使うかをConfigに書いてあげる.
push pullの際にバージョン管理ツールに登録した鍵と対になる鍵を指定するようにconfigに設定
一応自分の環境だと以下のようになる.

```Congig:~/.ssh/config
Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/bitbucket/id_rsa
  User git

Host github
  HostName github.com
  IdentityFile ~/.ssh/gitlab/id_rsa
  User git


Host gitlab.com
  HostName gitlab.com
  IdentityFile ~/.ssh/github/id_rsa
  User git
```

これでgit push pullは登録してあるバージョン管理ツールにしたがって行なってくれる.
GloVeをファインチューニングして記事分類


事前学習済みのモデル<b>GloVe</b>を利用してEmbedding層の重みの初期値を設定する
タスクはNew York Times紙の記事分類

GloVeを使わずに分類した結果は過去記事に掲載
https://qiita.com/Phoeboooo/items/dbc8bb5308c9ec5af6a0

#①　GloVeに含まれている単語とベクトルを辞書にして整理する
```python

embeddings_index = {}
GLOVE_DIR = os.path.join('Downloads', 'glove.6B')
f = open(os.path.join(GLOVE_DIR, 'glove.6B.300d.txt'), "r", encoding="utf-8" )
for line in f:
    values = line.split()
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    embeddings_index[word] = coefs
f.close()

print('Found %s word vectors.' % len(embeddings_index))

```
>Found 400000 word vectors.

#②　使用する単語とGloVeのベクトルを結ぶ
・GloVeに含まれていない単語はすべて0のベクトルとして初期化する

・GloVeの場合、EMBEDDING_DIMは50,100,200,300の中から選べる
　すべて試して一番精度が出た300を使っている

```python

EMBEDDING_DIM = 300
embedding_matrix = np.zeros((len(word_to_index), EMBEDDING_DIM))
for word, i in word_to_index.items():
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        # words not found in embedding index will be all-zeros.
        embedding_matrix[i] = embedding_vector
```
#③ モデル
weights=[embedding_matrix]
weights に先程の embedding_matrixを指定する
その他は同じ

＊Embedding層にtrainable=Falseを追加することで、
　GloVeで定めたベクトルを学習によって変更されないようにすることができる
　今回はtrainable=Falseにするよりもデフォルトの方が結果が良かったため追加していない

```python

# Build model
model = Sequential()
model.add(Embedding(len(word_to_index),
                    EMBEDDING_DIM,
                    weights=[embedding_matrix],
                    input_length=20))
model.add(Dropout(0.3))
model.add(LSTM(64, dropout=0.3, recurrent_dropout=0.3))
model.add(Dense(3))
model.add(Activation("softmax"))

model.compile(loss="categorical_crossentropy", optimizer="adam",
              metrics=["accuracy"])

model.summary()
```
>Total params: 1,294,535
Trainable params: 1,294,535
Non-trainable params: 0

#学習と結果
```python

Train on 2400 samples, validate on 600 samples
Epoch 1/2
2400/2400 [==============================] - 10s 4ms/step - loss: 0.6011 - acc: 0.7633 - val_loss: 0.2866 - val_acc: 0.9100
Epoch 2/2
2400/2400 [==============================] - 8s 3ms/step - loss: 0.3088 - acc: 0.8892 - val_loss: 0.2497 - val_acc: 0.9217
```

<b>val_loss: 0.2497 - val_acc: 0.9217</b>

（参考）ファインチューニングなし
val_loss: 0.3778 - val_acc: 0.8733
Composerとnpmの非公開パッケージのライセンス

Composerやnpmパッケージを非公開にしたい場合は、パッケージのライセンスには何を指定すればよいのか調べたのでメモ。

## Composer
[Composer公式ドキュメント](https://getcomposer.org/doc/04-schema.md#license)にはっきりと書いてあった。
<img width="630" alt="Screen Shot 2018-11-28 at 11.06.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/d6092820-3052-8413-6fb4-0253842a4fc4.png">

```json:compose.json
{
    "name": "pikanji/my-lib",
    "type": "library",
    "description": "foo bar",
    "license": "proprietary",
    "require": {
        "php": ">=5.6"
    }
}
```

## npm
こちらも[npm公式ドキュメント](https://docs.npmjs.com/files/package.json#license)に書いてあった。
<img width="719" alt="Screen Shot 2018-11-28 at 11.13.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/926ef39c-2369-3be9-81ac-a2ef0f4de1ef.png">

間違って公開されないように `"private": true` も入れておくと良いみたい。

```json:package.json
{
    "name": "my-lib",
    "description": "foo bar",
    "dependencies": {
        ...
    },
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
    },
    "author": "pikanji",
    "license": "UNLICENSED",
    "private": true
}
```
Fess における proxy 設定で軽くハマったメモ

# 概要

オープンソース全文検索サーバー [Fess](https://fess.codelibs.org/ja/) を proxy配下で動作させた時に、軽くハマったのでメモ。


# 結論

proxy配下のサーバーでFessを利用するときは、管理画面「クロール設定」の「設定パラメータ」に以下の設定を加える **だけ** で動作する。

```
client.proxyHost=プロキシサーバー名(ex. 192.168.1.1)
client.proxyPort=プロキシサーバーのポート(ex. 8080)
```

![FireShot Capture 31 - Fess I ウェブのクロール_ - http___pt-toybox01-vmg.wni.co.jp_7.png](https://qiita-image-store.s3.amazonaws.com/0/109937/13ad207e-1a8f-133b-2e55-599f1d325517.png)

公式ドキュメント：[クローラ関連の設定](https://fess.codelibs.org/ja/12.4/config/crawler.html?highlight=プロキシ)


# 環境
* Docker version 18.09.0
* docker-compose version 1.23.1
* Fess 12.3 の [Dockerイメージ](https://hub.docker.com/r/codelibs/fess/)を使用。


# ハマりポイント：環境変数 http_proxy の設定をしてはいけない

proxy配下でdockerを利用してコンテナを立ち上げる際、コンテナ内からproxy外へのアクセスをするために通常は環境変数`http_proxy`を設定します。しかし、本ケースでは、これを **してはいけません** 。

例えばdocker-composeを使用する場合は、`environment`で`http_proxy`および`https_proxy`以下のような`docker-compose.yml`となります。

```
version: "3"

services:
  fess:
    image: codelibs/fess:12.3
    # 以下は、設定してはいけない
    # environment:
    #   http_proxy: http://xxx.xx.xxx.x:xxxx/
    #   https_proxy: https://xxx.xx.xxx.x:xxxx/
    ports:
      - "8080:8080"
```

環境変数`http_proxy`を設定すると、初回起動時にFessに内包されているElasticsearchでエラーが発生し、サービス利用ができません。
一方で、webクローラーを動かすためにプロキシが必要。
そういう場合は、プロキシ設定は環境変数で設定せず、起動後に管理画面へアクセス・ログインしwebクローラー設定での設定が必要となるわけです。
Visual Studio 2017 ではじめるTypeScript(1) ~環境構築~

# はじめに
前回、[Visual Studio Code ではじめるTypeScript(1)~環境構築~](https://qiita.com/yoshiati/items/f5a1b625d6720a2253b4)という記事を書いたのですが、色々と調べていると、Visual Studio 2017（VS Communityも含む）（以下VS）でもTypeScriptの開発が可能だとういことがわかったので、仕事でガッツリ使用しているVSで進めていきたいと思います。

また、VSに変更した理由を下記に挙げます。

- Windows上でのTypeScriptの開発環境は、VSCodeを用いた環境構築（開発環境）が検索結果として多いが、各種ツールやPlugin（Node.js、tslint等）を多用する関係で、各種仕組みに詳しくない場合にどツボにハマる。設定項目も多数あり、これまたどツボにハマる。設定項目が1つでも間違っていると、動かないことなどがあり、それらにコストをとられてしまう。
- 最終目的はASP.NETを使用して、Webサービスを作成することなので、VSのほうがいい。

もちろん、各種仕組みや、設定項目を理解するのはとても大事です。ただ、今回はTypeScriptの入門なので、仕組みを理解するのは一通り入門が終了してから進めたいと思います。
ということで、VSを使用してまずは簡単に開発環境を構築します。

# 対象読者
- VSを使用したTypeScriptの入門
- フロントエンドフレームワークの入門（だいぶ後半になるかと）
- Webサービスの構築の入門（同じく、だいぶ後半になるかと）

# インストール作業
まず、VS2017またはVSCommunityをインストールします。
（結構な時間と、容量を必要とします。）

## Visual Studio 2017
購入してください。

## VS Community
下記リンクからインストーラーをダウンロードして実行。
https://visualstudio.microsoft.com/ja/vs/community/

## インストール時の設定
インストール時のワークロードの選択は下記のようにお願いします。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/70325/99109fb8-587f-3499-23ee-d9548178f041.png)
あとはインストーラーおまかせです。
既にVSをインストールしている場合は、Visual Studio Installerの詳細→変更からワークロードを選択してください。
![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/70325/0404d0c9-d84d-cad0-7bb0-4dc3629a442f.png)

# おわりに
今回はVSのインストールだけです。特に難しいことはないです。
次回は、プロジェクトを作成し、実際に動かしてみたいと思います。
pythonプログラムのデーモン化で詰まったところメモ

# はじめに
pythonで常駐系プログラムを書いたのはいいのですが，
現状だと異常終了したらそのままなので，勝手に再起動するようにしたいなぁ，と．

ということで，pythonプログラムをUNIX系システム上でデーモン化してみることにしました．

作り方は[先駆者様](https://qiita.com/croquisdukke/items/9c5d8933496ba6729c78)がいらっしゃるので省略することにして，詰まったところをメモしていきます．

<11/28追記>
改行コードについて書き忘れていたので追記しました．

# システムにPythonが複数入ってる
TensorFlowをビルドするときに複数verが必要だと聞いたのでインストールしていました．
おかげで2.7/3.5/3.6とバージョンが乱立していました．普段使っているのは3.6のはず...

とりあえず，コンソールで普段使っているpythonのバージョンをチェックして，
そこから各種Pythonのパスを直接たたいて，一致するバージョンをチェックします．

```
$ python3

$ /ABSOLUTEPATH/python3
# 出力が一致したバージョンが当たり
# これ echo $PATHでいいような気がする

```

あとは絶対パスでSheBangをプログラムの頭に書いてあげます．

```main.py
#!/ABSOLUTEPATH/python3

import hoge
import huga

...

```

# なぜかserviceがプログラムを認識しない

私の場合，「コードをWindows環境で書いて，Unix系環境上で動かそうとしている」ことが問題でした．
改行コードが違うと正しく認識してくれない(らしい)です．

私の場合はvimで開いて

```
:se ff=unix
:wq
```

これで正しく読んでくれるようになりました．

# なぜか一部モジュールがインポートできない

serviceを動かすと，なぜかImportErrorで止まりました．
試しに対話モードで同じPythonを起動して，同モジュールをimport．
こっちでは成功します．

もしかして，と思って，プログラムにsys.pathを吐かせてみます．

```main.py
#!/ABSOLUTEPATH/python3

# sysを先にimportしてから
import sys
print(sys.path)

```

pipで入れたモジュールのパスだけ通ってない...なんで???

原因がわからなくて歯がゆいですが，強引にパスを通して解決．

```main.py
#!/ABSOLUTEPATH/python3

import sys
sys.path.append("/pipmodulepath/")
#試しに吐かせてみる
print(sys.path)
```

これで，一応問題は解決したのですが...

#別のモジュールがエラーを吐く

今度はTensorFlowがエラーを吐きました．

どうやら，「ビルドしたTensorFlowとは別のTensorFlowが動いている」らしいです．

sys.pathは要素番号の若いほうが優先して読まれるらしいので，

先ほどのpipモジュールが入っているパスの優先順位を上げてあげます．

```main.py
#!/ABSOLUTEPATH/python3

import sys
# 要素番号0はプログラムが入っているディレクトリです
# 1番にpipで入れたモジュールのパスを割り込ませる
sys.path.insert(1, "/pipmodulepath/")

import hoge
import huga

...

```

これでやっと正常に動きました．
プロセスキルしても数秒後に別のPIDでプログラムを動かし始めます．

# おわりに

具体的なプログラムが欠けていて読みにくかったとは思いますが，
かなり急ぎ足で書いたものなのでご容赦を...

余裕ができて気が向いたら，
サンプルコードで同じことをして記事を更新しようと思います．
Egret 5.2.13リリース

昨日の話と重複しますが、[Egret Engine 5.2.13 Baiduスマートゲームの完全サポートをリリース](https://mp.weixin.qq.com/s/F2dgkw5lNWPSNEk4AjH-Dg)と、公式ブログで発表されました

# 更新内容

## 1. 2Dレンダリングの不具合修正
ネイティブDisplayListを開く際に、eui.Imageの塗りつぶしモードが無効化される問題

 
## 百度(Baidu) Small Games

百度(Baidu) Small Gamesの対応。

チュートリアルは[こちら](https://mp.weixin.qq.com/s?__biz=MzA4Mzk1ODYzMw==&mid=2653277171&idx=1&sn=eba5be146b0cda3b00f97ae997923cdd&chksm=843fe5f5b3486ce3a5e726daf4619ca01b1c67b398c20e2ab906221b29f185433a7c99c5f771&scene=21#wechat_redirect)(要注意中国語)
re:invent2018に行ってきた(day2)

こんにちは、ひろかずです
前回に引き続き、書いていきます。

例によって、ヒアリング能力ゼロの上にリアルタイム執筆なので、いろいろ勘弁してください。

# ARC217 - Foundations of AWS Global Cloud Infrastructure

AWSのアクティブユーザーは増え続けていて、安いコストで高いキャオパシティを得て、高い信頼性を得るという好循環
始めの5年間は4リージョンで始まったけど、今では19リージョン
さらに4リージョンの開設が予定されている

## リージョンの構造
### アベイラビリティゾーン
完全に分離された、十分なパワーを備えた施設
電源も独立している
100,000のサーバがスケールできる
分離されたメトロファイバーぜ完全に冗長化されている

メトロファイバー、AZ内のコネクションはフルメッシュで引かれている。
AZ間のコネクションもAZ単位でフルメッシュで引かれている
各センターに5つのAZがある

Amazonのグローバルネットワークは、常用化された100GBの回線で相互接続されている

## グローバルインフラストラクチャ
どうやってリージョンのデータセンターを作っているか？

- 計画
- デザイン
- 憲法？

電力インフラのスケール

- スケールする電力インフラ
- 革新的な商用電源契約
- 再生可能電力へのコミット

再生可能電力へのコミット

- 100%再生可能電力をコミットしている
- 4.8MWバッテリーのPilotをテスラに提供
- [ACORE(American Council on Renewable Energy)](https://acore.org/)
- 拡張された電力供給者グループ
- インディアナに風力発電ファームがある(150MW)
- バージニアに太陽光発電ファームがある(260MW)
- バージニアでは政府やテック企業が太陽光発電に力を入れていて、AWSも例外ではない
- 北カルフォルニアの風力発電ファーム(208MW)

利用する水の再生

- 冷却ユニットのOperation
- その場所の水を汚さない
- 水の再利用(飲料水のレベルまで)

Cloudの効率

- 電力効利用リソース利用
- サーバー利用率は、Cloudは65%なのに対して、オンプレは15%
- PUE(電気効率)は、Cloudが1.07-1.15に対して、オンプレは1.7
- これは84％のエネルギー削減を意味する

## 専用のカスタムインフラを構築する

- カスタムチップ
- カスタムサーバー
- 世界的なインフラ

カスタムサーバのアドバンテージ

- メモリ、HDD、CPUにダイレクトに働く
- 特定のワークロードに適したデザイン

なんでAWSグローバルインフラ名の？

- 未曾有のスケール

## 感想的な何か
AWSの冗長性と高エネルギー効率、エコであることがよく分かるセッションでした！

# STG379-R2 - [REPEAT 2]: Chalk Talk: Deep Dive on Security in Amazon S3 & Amazon Glacier

s3のアクセスコントロールのメカニズム

- IAMポリシー
- SCP
- VPCEポリシー
- バケットポリシー
- ACL
- ブロックパブリック・アクセス(新機能)

s3の暗号化

- 通信の暗号化：HTTP/HTTPS
- RESTでの暗号化

S3デフォルト暗号化

- 一度バッケっとレベルで設定
- すべての新しいオブジェクトは暗号化される
- シンプルなコンプライアンス
- SSE-S3とSSE-KMSをサポートしている

Security設定のモニタ

- S3コンソールでのバケットアクセスコントロールの確認
- Macie
- Trusted Adviser
- AWS Config
- オブジェクト暗号化ステータスの確認
- s3サーバアクセスログ 
- CloudTrail

グレイシアのデータセキュリティ

- restベースでの暗号化
- s3からのライフサイクル
- Glacier Vault Access policy
- Glacier Vault Lock
- CloudTrailインテグレーション

データレイクの一般的なパーミッションモデル

- 最小権限
- 認証されないユーザーのアクセス拒否
- 許可されたリソースへのアクセス許可

## QA
新しいバケットを作って暗号化をセットしたら、キーを設定しないといけない？

- キーの設定は不要です

マスターアカウントのマスターキーは必要ですか？

- KMSはマルチリージョンなのでrootアカウントであれば使える

SSEとKMSの違いは？

- 違いはない

KinesisがBucketに入れる場合のRollポリシー

- E: Allow
- A: s3プットオブジェクト
- R: w(書き込み) /*'xxxx'*

KinesisがBucketに入れる場合のBucketポリシー

- E: Allow
- A: s3プットオブジェクト
- R: w(書き込み) /*'xxxx'*
- P: KinesisRoll

ベンダーがBucketにデータを入れる場合のBucketポリシー

- E: allow
- A: s3put
- R: W /*
- P: ベンダーのIAM ARN

加えて、ベンダーポリシーが以下の設定をする

- E: Allow
- R: W/*
- A: s3Put
- C: x-aws-Bucket-owner-full-control

ベンダーがBucketにデータを入れさせない場合のBucketポリシー

- E: deny
- A: s3put
- R: W /*
- P: ベンダーのIAM ARN

Bucketコピーのポリシーを使えば、s3syncはいらない？

- 同じBucket名は付けられないけど、Bucketコピーのポリシを使えば代用できる

## 感想的な何か
時間が空いてたのでchack talkに突入しましたが、なかなかにハードでした汗
2xx系のセッションは行けたんですがね...
次からはちょっと考えたいと思います

今日はここまでです
お疲れ様でした。
explicitを指定した場合のコンストラクタについて

引数付きのコンストラクタ(conversion constructor)が定義されている場合explicitを指定しない場合は暗黙的な変換が適用されます。
例を見た方が分かり易いので、ますはexplicitを指定していないクラスAの場合、

```c++
class A{
public:
	//default constructor
	A(){				
		printf("A default constructor");
	}

	//conversion constructor
	A(int val1){
		printf("A conversion constructor val1=%d",val1);
	}
};
```

というAクラスがあった場合に

`A a = 1;`

は暗黙的に

`A a(1);`

と変換されます。

explicitを指定したクラスB

```c++
class B{
public:
	//default constructor
	explicit B(){
		printf("B default constructor\n");
	}

	//conversion constructor
	explicit B(int val1){
		printf("B conversion constructor val1=%d\n",val1);
	}
};
```

の場合

`B b = 1;`

はエラーになります。

```C++
//conversion constructor
explicit B(int val1){
	printf("B conversion constructor val1=%d\n",val1);
}
```

がexplicit指定されているので暗黙的な変換が行えない為です。

`B b = (B)1;`

は明示的に変換を行っているのでOKです。あと関数の引数にA,Bを渡す時も

```c++
void testA(A a){

}

void testB(B b){

}

testA(a1);
testA(1);

testB(b1);
//testB(1); error
```

となります。
新しめのWindowsでVisual C++ 2005とPlatform SDKを一緒に使う


もともとの「Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う」では以下のようになっている。

---

Windows Server 2003 SP1 Platform SDK をインストールしてから、

- オプション -> プロジェクトおよびソリューション -> VC++ ディレクトリ
    - 実行可能ファイル C:\Program Files\Microsoft Platform SDK\Bin
    - インクルードファイル C:\Program Files\Microsoft Platform SDK\Include
    - ライブラリファイル C:\Program Files\Microsoft Platform SDK\Lib

- C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults\corewin_express.vsprops
    -  `AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"`

- C:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\html\1041\AppSettings.htm
    - WIN_APP.disabled WIN_APP_LABEL.disabled DLL_APP.disabled DLL_APP_LABEL.disabled をコメントアウト

---

しかし、必要になったのでVisual C++ 2005EEでlibzmqをビルドしようとしたところ、[InitializeConditionVariableを呼び出そうとして](https://github.com/zeromq/libzmq/blob/e3c73d9881180a454b654cd89b2e5b7b07e31581/src/condition_variable.hpp#L96)エラーが出てしまった。今回はVisual C++ 2010EE+Win64のために「Microsoft Windows SDK for Windows 7 and .NET Framework 4」をインストールしてあったので、

- 実行可能ファイル C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
- インクルードファイル C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include
- ライブラリファイル C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib

としたところビルドできた。どうもlibzmqは処理系ではなく実行しているWindowsのバージョンで呼び出しを変えるらしく。古いVisual C++で検証を行う必要がある場合、新しいSDKを読み込ませるのは有用になることもあるかもしれない。

また、stdint.hのC:\Program Files\Microsoft Visual Studio 8\VC\includeへの追加も必要だった。
https://www.vector.co.jp/soft/win95/prog/se432866.html
Amazon Lightsail

##1.Lightsailとは？##
わずか数分で仮想プライベートサーバーを起動して、単純なウェブサーバーとアプリケーションサーバーを簡単に管理できます。



##2.特徴##
仮想マシン、SSDベースのストレージ、データ転送、DNS管理、静的IPアドレスといった、プロジェクトを促進するために、必要なすべてのものが、低額で予測可能な価格で利用できます。



##3.用途#
単純なウェブサイトやeコマースアプリケーションに適しています。



##4.Demo#


とりあえず、適当に↓のような感じで作成してみる。

|項目|入力　|
|------|------|
|インスタンスロケーション|東京、ゾーン A (ap-northeast-1a) |
|インスタンスイメージの選択|Linux・Unix / WordPress|
|インスタンスプランの選択|無料枠で|
|インスタンスの識別|デフォルトの名称で|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/6c4a2eb9-4ccb-e576-f634-798ced8968f7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/84358302-743a-47a3-fa2b-b43d33cca568.png)


作成できた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/4928c1c5-083d-ae6f-dd1d-dadf96552f37.png)

感想は、面倒な設定がなく極シンプルです。
truffleからgethで作成したプライベートブロックチェーンネットワークに接続する


## 概要
truffleを使ってSolidityを勉強していた時に，gethで作成したプライベートブロックチェーンネットワークに接続したくなり，その方法について調べた．自分用の備忘録として投稿する．


## gethを使ってプライベートブロックチェーンを作成する．

1. 任意のディレクトリに移動する．
2. ブロックチェーンのgenesisブロックの設定を記入したjsonファイルを作成する
3. 以下のコマンドを用いてブロックチェーンを作成する．

```
geth --networkid "15" --nodiscover --datadir "directory/path/to/genesis/json/file" --rpc --rpcaddr "127.0.0.1" --rpcport "8545" --rpccorsdomain "*" console 2>> directory/path/to/genesis/json/file/geth_err.log
```

それぞれのオプションについては，他に多くのサイトがあるため割愛．



## truffleでSolidityのプロジェクト作成する．

1. 任意のディレクトリに移動する．
2. ``` truffle init ```を実行して，雛形を作成する．
3. ``` truffle create contract ContractName```でContractNameというコントラクトの雛形を作成する．そして，そのファイルに自分の作成したいコントラクトをSolidityで実装する．
4. ```truffle create migration ContractName```でContractNameのmigrationファイルを作成する．
5. truffle.jsを下のようにする．この設定はgethに合わせる．
6. ```truffle console --network dev```を実行する．


```json:truffle.js
module.exports = {
    networks: {
        dev: {
            host: "127.0.0.1",
            port: 8545,
            network_id: "15"
        },
    }
};

```


## まとめ
truffleの実行をdevelopではなく，consoleで行う点でハマった．
developはtruffle.jsを無視して，テストネットを作成するらしい．
【UWP】FlyoutのTextBox/ComboBoxが使えないときはAllowFocusOnInteraction="True"を設定しよう【AU必須】


**最低ターゲットバージョン： Anniversary Update (1607)**

```xml
<AppBarButton Label="購読グループを追加" Icon="Add" 
              AllowFocusOnInteraction="True"
              >
    <AppBarButton.Flyout>
        <Flyout>
            <StackPanel>
                <TextBox x:Name="SubscriptionGroupNameTextBox"
                    InputScope="Text"
                    />
                <Button Content="追加"
                    Command="{Binding AddSubscription}"
                    CommandParameter="{Binding ElementName=SubscriptionGroupNameTextBox, Path=Text}"
                    HorizontalAlignment="Right"
                    />
            </StackPanel>
        </Flyout>
    </AppBarButton.Flyout>
</AppBarButton>
```

### 参考

[FrameworkElement.AllowFocusOnInteraction Property - Microsoft Docs](https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.frameworkelement.allowfocusoninteraction)

[Can't enter enter text in TextBox control inside Flyout - stack overflow](https://stackoverflow.com/questions/39096758/cant-enter-enter-text-in-textbox-control-inside-flyout)
Twitter のフォロアーを取得 (Python3)

Python3 で Twitter のフォロアーを取得する方法です。

```py:get_followers.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	get_followers.py
# --------------------------------------------------------------------
import sys
import json
from config_twitter import config_twitter_proc

# --------------------------------------------------------------------
def get_info_proc(twitter,id):
	url = "https://api.twitter.com/1.1/users/show.json"
	params = {'user_id': id}
	req = twitter.get(url, params = params)
	if req.status_code == 200:
		json_str = req.text
		dict_aa = json.loads(json_str)
		str_out = str(id) + "\t" + dict_aa['name'] + "\t" \
			+ dict_aa['screen_name'] + "\t" \
			+ dict_aa['location'] + "\t"
		print (str_out)
#
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

url = "https://api.twitter.com/1.1/followers/ids.json"

params = {'screen_name': "ekzemplaro",
	'count': 100}

twitter = config_twitter_proc()

req = twitter.get(url, params = params)
print(req)
#
if req.status_code == 200:
	print ("OK")
	json_str = req.text
	dict_aa = json.loads(json_str)
	print (dict_aa['ids'])
	for id in dict_aa['ids']:
		get_info_proc(twitter,id)
else:
	print ("Error: %d" % req.status_code)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

config_twitter.py はこちらのものと同じです。
[Twitter に投稿する (Python3)](https://qiita.com/ekzemplaro/items/8e000142e5b4cf305bb1)

次のバージョンで確認しました。

```text
$ python --version
Python 3.7.3
```
nodemonのセキュリティ脆弱性対処法

# 概要

`event-stream@3.3.6` に攻撃コードが混入されました。
私のプロジェクトで依存を確認したところ、`nodemon@1.18.6` が対象だったためその時の確認方法と対処法を記載します。

# 確認方法

コマンドを叩いて確認する。

```terminal:ターミナル
npm ls event-stream flatmap-stream
```

結果が以下のように `event-stream@3.3.6` と `flatmap-stream@0.1.1` が表示されれば攻撃コード混入パッケージが依存している。

```terminal:ターミナル
`-- nodemon@1.18.6
  `-- pstree.remy@1.1.0
    `-- ps-tree@1.1.0
      `-- event-stream@3.3.6
        `-- flatmap-stream@0.1.1
```


# 対処法

nodemonの再インストールで `nodemon@1.18.7` 以上にする。

```terminal:ターミナル
npm uninstall nodemon
npm install --save-dev nodemon
```

依存していないことを確認

```
npm ls event-stream flatmap-stream
`-- (empty)
```

確認コマンドでnodemon以外の `event-stream@3.3.6` に依存しているパッケージがあった場合は対処が必要です。

# 参考

* [2018/11/27に判明したnpmパッケージ乗っ取りについて](https://qiita.com/azs/items/b15bc456bee3a7892950)
* [nodemon GitHub Issue Insecure dependency #1469](https://github.com/remy/nodemon/issues/1469)
初めてのvulkanプログラム第１章 ②Vulkan プログラムでの処理の流れ


[目次に戻る](https://qiita.com/tositada_nakada/items/db0f01c1c8c2945f786b)

#step1 インスタンスとデバイスの列挙
Vulkan application は、Instanceの初期化から始めます。アプリケーションごとの状態は、VKInstanceオブジェクトに格納されます。インスタンスが作成されるとvulkanライブラリーが初期化されアプリケーションの情報を実装することができます。vulkanライブラリーを初期化した後、どのデバイスを使用するか探して選択する必要があります。vulkanでは、複数のデバイスを使用することができます。

#step2 キューとデバイス
使用するデバイスをより具体的に記述した論理デバイスを作成する必要があります。
キューファミリーには、いくつかの種類に分かれており、各キューは、制限されたコマンドを使用することができます。例えば計算コマンドのみを行うキューや、メモリーの操作するコマンドキューなどがあります。キューのcommandは、そのグラフィクスデバイスによって異なる場合があります。

#step3 ウィンドウサーフェスとスワップチェーン
Vulkanは、プラットフォームに依存しないAPIなのでそれ単体でウィンドウシステムとして機能させることができません。vulkanと、ウィンドウシステムの間を接続させるには、WSI(Windows system Integration)拡張させる必要があります。そのために**ウィンドウサーフェス**と**スワップチェーン**が必要です。

**サーフェスは**、プラットフォーム上のウィンドウを抽象化したものです。Vulkanでは、この機能は、オプションなので、ウィンドウが必要ない場合には、非表示にすることができます。

**スワップチェーン**は、レンダリング結果をサーフェスに提示する機能を提供します

#step4 Image viewとバッファ
スワップチェーンが作成されたので、その中のImageハンドラーを取得し、その後のレンダリング処理に渡します。
レンダリング処理に渡すものは、2つあり、**vkImageView**と**VkFrameBuffer**です。

**vkImageView**は、Imageオブジェクトをパイプラインに含むには、必要です
**VkFrameBuffer**は、レンダーパスインスタンスが使用する特定のメモリを表します。
#step5 レンダーパス
Vulkanのレンダリングパスでは、レンダリング操作中に、使用される画像のタイプ使用方法、その内容の処理方法などを指定しています。

#step6 グラフィクスパイプライン
3dを2dに変換するといったいわゆるシェーダモジュールに関する処理を記述します。
[グラフィクスパイプライン Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3)
#step7 コマンドバッファーとコマンドプール
Vulkanにおける描写などの操作は、あらかじめキューに登録しておく必要があります。これらの命令は、コマンドプールに記録されます。そしてコマンドプールは、コマンドバッファを通してGPUに処理を渡します。

#step8 メインループ
描写ループは、まずスワップチェーンからイメージを取得します。次にイメージに適切なコマンドバッファを選択しvkQueueSubmit()を行い実行します。最後に画像をスワップチェーンに戻して画像を描写します。

#最後に
つたない文章を最後まで見ていただきありがとうございます。次回からは、上のステップを順にプログラムを書いていきます。拡散してもらえると嬉しいです。

## 連絡先

tweeter: [tositada_nakada](https://twitter.com/nakadasanda17)
mail: nakadasanda@outlook.com

## 寄付

paypal: [tositada_nakada](https://www.paypal.me/nakadasanda)
Amazon: [欲しいものリスト](http://amzn.asia/fGpGuJo)
Property must be declared private because its type uses a private type

#過去に出会ったエラーメッセージとその対処方法備忘録
##環境
- XCode
- Swift4.2

##エラーメッセージ
Property must be declared private because its type uses a private type

##エラー発生コード

```
class test
{
	private enum enums
	{
		case hoge,huga,piyo
	}
	var foo:enums = .hoge //Error
}

```

##原因と対処方法
###原因
privateなenum型を利用して定義した変数がpublicで定義されており、公開範囲がちぐはぐなため
このクラスのfoo変数を外部から参照した時、enums型で編集評価したいが、外部からenums型が見えないために、正しく操作できないことを考えると当然のエラー

###対処方法
変数とenum型の公開範囲を合わせる
この場合、enumをあえてprivateで定義して非公開にしていることを考えると、単純にenum型を公開するのは望ましくない可能性が高い
enum型を公開にする場合は一度よく考えてから行う必要がある

##対処済みコード例1
クラス内でしか利用しないはずのprivateなenum型で宣言した変数は、外部公開する必要がないはずなので、変数の公開範囲もprivateのみに変更する

```
class test
{
	private enum enums
	{
		case hoge,huga,piyo
	}
	private var foo:enums = .hoge //Edit
}
```

##対処済みコード例2
変数fooを外部に公開する必要がある場合は、Enumの公開範囲を変数に合わせる

```
class test
{
	enum enums //Edit
	{
		case hoge,huga,piyo
	}
	var foo:enums = .hoge
}
```
Twitter に投稿する (Python3)

Python3 で Twitter に投稿する方法です。

```py:twitter_post.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	twitter_post.py
#
#					Nov/28/2018
#
# ------------------------------------------------------------------
import sys
from requests_oauthlib import OAuth1Session

from config_twitter import config_twitter_proc
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

twitter = config_twitter_proc()

url = "https://api.twitter.com/1.1/statuses/update.json"


tweet = "テストの投稿。１１月２８日午前９時３９分\n"
tweet += "今日は晴れています。\n"
tweet += "Nov/28/2018\n"

params = {"status" : tweet}

res = twitter.post(url,params = params)

if res.status_code == 200:
	sys.stderr.write("Success.\n")
else:
	sys.stderr.write("Failed. : %d\n" % res.status_code)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```



```py:config_twitter.py
# --------------------------------------------------------------------
#	config_twitter.py
#
#					Apr/25/2019
# --------------------------------------------------------------------
import os
import sys
from dotenv import load_dotenv
from requests_oauthlib import OAuth1Session
# --------------------------------------------------------------------
def config_twitter_proc():
	dotenv_path = '.env'
	load_dotenv(dotenv_path)
	CONSUMER_KEY = os.environ.get("CONSUMER_KEY")
	CONSUMER_SECRET = os.environ.get("CONSUMER_SECRET")
	ACCESS_TOKEN = os.environ.get("ACCESS_TOKEN")
	ACCESS_TOKEN_SECRET = os.environ.get("ACCESS_TOKEN_SECRET")
#
	twitter = OAuth1Session \
		(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_TOKEN,ACCESS_TOKEN_SECRET)
#
	return twitter
# --------------------------------------------------------------------
```

Twitter API Key は取得したものと置き換えて下さい。


```text:.env
CONSUMER_KEY = '******'
CONSUMER_SECRET = '******'
ACCESS_TOKEN = '******'
ACCESS_TOKEN_SECRET = '******'
```

実行結果

```text
./twitter_post.py
*** 開始 ***
Success.
*** 終了 ***
```
Pixelのエミュレータで通知ドットが表示されない


## 経緯
今まで通知の表示には[ShortCutBadger](https://github.com/leolin310148/ShortcutBadger)というライブラリを利用していましたが，API Oreo以上のGoogleデバイスにも対応していくためにGoogleがOreoから用意している公式の通知ドットを実装する必要があった．

## 起きたこと
エミュレータを使ってNexus_API_level_27ので実行したときにはドットが表示されるが，Pixel2のエミュレータでは通知ドットが実装されていない

## 結論
PixelにはNexusと異なり公式のランチャーアプリ(Pixel Launcher)が入っているためそこが悪さをしていた．そこで通知ドットを許可すれば良いだけでした．

このPixel Launcherの設定は以下の手順でできました．

### Launcherの設定
設定で**ランチャー**と検索します．
<img src="https://qiita-image-store.s3.amazonaws.com/0/82263/41c984b7-532a-7b9f-48e6-89edc4a5d41e.png" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/82263/b4e4cc7e-c084-152f-b10a-cacda21be034.png" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/82263/3141c9d9-9668-6c72-bf51-cb0c5ec69686.png" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/82263/c2838a5e-69f9-a75c-c4f3-a3ff22a8a090.png" width=50%>

## 感想
設定＞通知＞アプリケーションの設定ではすでに**通知ドット**を許可していましたが，それだけではダメなようです．
そもそもPixel標準のランチャーアプリが入っていることに気づかなかった．．．
php-master-changes 2018-11-27

今日は PDOStatement::fetchColumn() に範囲外のインデックスが渡された際のエラー処理修正、ドキュメントの更新、EXIF データの文字列化処理の修正、compiler_options へのフラグ追加、複合代入演算子の処理の修正があった！

# 2018-11-27
## morozov: Check column number before trying to fetch the value
- https://github.com/php/php-src/commit/e126ca1557d7169263d2639802985c9e47c2ac19
- [7.2~]
- ext/pdo で、[PDOStatement::fetchColumn()](http://php.net/manual/ja/pdostatement.fetchcolumn.php) に範囲外のインデックスが渡された際にフェッチを試みずエラーとするよう修正

## adambaratz: update NEWS
- https://github.com/php/php-src/commit/2c4425a87a8813604e0c53a51b9c32250aa76e1e
- ↑の修正を NEWS へ追記

## : Fixed bug [#77184](https://bugs.php.net/bug.php?id=77184)
- https://github.com/php/php-src/commit/9ec519e09499c3f2749e298b097da132f746d4d8
- [7.2~]
- ext/exif で [exif_read_data()](http://php.net/manual/ja/function.exif-read-data.php) により EXIF データを読み取った際、GPSLongitude の値が負値になる場合がある問題の修正
- 符号なし有理数を出力する処理で、snprintf() で値を符号なしとして書式文字列を指定する箇所が符号付きとしての指定になっていた

## dstogov: Added ZEND_COMPILE_WITHOUT_EXECUTION and ZEND_COMPILE_PRELOAD to determine when PHP compiler is invoked by opcache_compile_file() or preloading.
- https://github.com/php/php-src/commit/23d3deb8be78cc0dd99bf07c8f33894ad2cc8484
- compiler_options に opcache_compile_file() でのコンパイル中かどうか、preloading でのコンパイル中かどうかを判定するフラグを追加

## dstogov: Avoid early reference check
- https://github.com/php/php-src/commit/5f2817ad61d833f86ca7ffe67ec88d8d5a82a063
- 複合代入演算子の処理での早期の参照チェックをしないよう修正
- このコードが使われるのはオブジェクトプロパティへの複合代入演算のケースかな
setup selenium grid for multiple SP devices testing in Mac

# 趣旨
mac環境でselenium-gridとappiumを組み合わせた、SP実機テストの環境構築。
appium単体では、複数の test script を走らせる場合、混信して正しくテストが実施されない。
複数のtest script clientがある場合、以下のことが求められる

- SPテスト実行中、ほかのテストの割り込みをさせない
- 複数のSP実機のテスト環境がある場合、空いているデバイスで実行させたい

# 準備するもの

- Mac (HighSierra) x 2
- Android端末 x 2

尚、以下設定が終わり、selenium , appiumが動く前提とする。

- <A HREF="https://qiita.com/emurin/items/5cb9632514a74b056217">setup appium in Mac for Android</A>
- <A HREF="https://qiita.com/emurin/items/3420e584d0a7ccbb8834">setup selenium in Mac for safari</A>

# 構成図

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/68fd9ce5-ddb6-f42b-adc1-15d458293f88.png" WIdth=80%>

※selenium hub (hub-1)とappium node (node-1)は共存しても動くことは確認済み。


# Setup

## Selenium hub
Selenium standalone はv.3.12.0を使用した
最初にhubを立ち上げる

```
java -jar selenium-server-standalone-3.12.0.jar -role hub -port 4444 -host hub1
```

hub1は構成図のhub1のhost名。なくても動くかもしれないが、明示的にホスト名を指定したい場合、記載

hubが起動しているかは、ブラウザから確認できる
http://{hub1}:4444/grid/console

## appium node
appium 1.7.2 を使用した
node1,node2順次、起動する
まず、nodeのconfigを作成する

例) node1の記載例

```
{
 "capabilities":
  [
    {
      "platformName": "Android",
      "platformVersion": "8.0.0",
      "deviceName": "GalaxyS8",
      "browserName": "Chrome",
      "language": "ja",
      "maxInstances": 1,
      "platform": "Android",
      "udid": "{UDID}"
    }
  ],
  "configuration":
  {
    "cleanUpCycle":2000,
    "timeout":30000,
    "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
    "url":"http://{node1}:4723/wd/hub",
    "host": "{node1}",
    "port": 4723,
    "maxSession": 1,
    "register": true,
    "registerCycle": 5000,

    "hubPort": 4444,
    "hubHost": "{hub1}"
  }
}
```

※capabilitiesに、node1に接続する、android SPの情報を記載する
※configurationに、node1と接続するhub1の情報を記載する

configを作成後、appiumを起動する

```
appium --nodeconfig nodeconfig.json
```

その後、上記説明した、hubの状況を確認すると、以下のようになる

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/12724559-6858-984f-af2c-d0ca55213faa.png" Width=80%>

## automation testing client
自動化の実施側で、接続先のcapabilitiesの情報を以下のように、udidを未記述にする

```
{
"platformName": "Android",
"browserName": "Chrome",
"deviceName": "galaxyS8",
"platform":"Android",
}
```

これにより、複数テスト実施にて衝突なく複数のSPにてテストを実施できる



※JaSST'18 Hokkaidoでざっくり概要を発表します
ISTQB Certified Tester Advanced Level Syllabus Test Automation Engineer 約10分にまとめてみた


<A HREF="https://www.slideshare.net/slideshow/embed_code/key/N3kfYRG4cRD3Es"><IMG SRC="https://image.slidesharecdn.com/istqb-automation-181127050436/95/slide-1-1024.jpg" WIDTH=70%></A>

原文
<A HREF="https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html">https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html</A>

こちらを読み通すのに（翻訳含めて）結構時間がかかった。
メンバーに説明するのにその訳したものをつらつら説明しても理解しがたい。
そのため、ざっくりどんなことが書いてあるかを１０分くらいに説明できるように抜粋（まとめて）みた。
[JavaScript] 最新ブラウザではwindow.focusが動かない

JavaScriptの`window.focus`について紹介します。（2018年11月現在）

```Markdown:動作環境
OS: Windows 10 Pro
Google Chrome: 70.0.3538.110
Mozilla Firefox: 63.0.3
Microsoft Edge: 42.17134.1.0
Microsoft Internet Explorer: 11.407.17134.0
```

# window.focusとは
window.focusとは、ウィンドウにフォーカスを合わせる関数です。

https://developer.mozilla.org/ja/docs/Web/API/Window/focus

#### サブウィンドウにフォーカスする

下記のデモページでwindow.focusを実行することができます。
[デモはこちら](https://yunbow.github.io/sample-javascript-api/window_open/focus/01/)
[ソースファイルはこちら](https://github.com/yunbow/sample-javascript-api/tree/master/window_open/focus/01/)

「window.open」ボタンを押下してみてください。サブウィンドウが生成されます。サブウィンドウをメインウィンドウの背面に隠してみてください。その状態で「subwindow focus」ボタンを押下すると、サブウィンドウに対して`window.focus`が実行されて、サブウィンドウが最前面に表示されます。ソースコードは以下の通りです。

```JavaScript:index.js
$('#openWindButton').on('click', function () {
    var option ='left=100,top=100,width=500,height=200,menubar=no,toolbar=no,location=no,status=no,resizable=no,scrollbars=no';
    log('window.open option: ' + option);
    winObj = window.open('sub_window.html', 'windowName1', option);
});

$('#focusButton').on('click', function () {
    winObj.focus();
});
```

|ブラウザ名|動作可否|サブウィンドウ|
|:--|:--|:--|
|Google Chrome|○|フォーカスされる|
|Mozilla Firefox|○|フォーカスされる|
|Microsoft Edge|○|フォーカスされる|
|Microsoft Internet Explorer|○|フォーカスされる|

####メインウィンドウにフォーカスする
サブウィンドウを最前面に表示することは、どのブラウザでも動作します。しかし、メインウィンドウを最前面にするとブラウザ毎に挙動が異なります。
メインウィンドウに`window.focus`してみましょう。

以下のデモページを表示してみてください。
[デモはこちら](https://yunbow.github.io/sample-javascript-api/window_open/focus/02/)
[ソースファイルはこちら](https://github.com/yunbow/sample-javascript-api/tree/master/window_open/focus/02/)

「window.open」ボタンを押してみてください。サブウィンドウが表示されます。サブウィンドウを最前面表示している状態で、5秒間待つと、メインウィンドウに対して`window.focus`が実行されて、メインウィンドウが最前面に表示されます。ソースコードは以下の通りです。

```JavaScript:index.js
$('#openWindButton').on('click', function () {
    var option ='left=100,top=100,width=500,height=200,menubar=no,toolbar=no,location=no,status=no,resizable=no,scrollbars=no';
    log('window.open option: ' + option);
    window.open('sub_window.html', 'windowName1', option);
});

var updateTimer = function() {
    updateTask = setTimeout(function () {
        window.focus();
        log("window.focus");
        updateTimer();	
    }, 5000);
}

updateTimer();
```

しかし、ChromeとFirefoxではメインウィンドウが最前面に表示されません。

|ブラウザ名|動作可否|メインウィンドウ|
|:--|:--|:--|
|Google Chrome|×|フォーカスされない|
|Mozilla Firefox|×|フォーカスされない|
|Microsoft Edge|○|フォーカスされる|
|Microsoft Internet Explorer|○|フォーカスされる|

# 引用
[[Javascript] 最新ブラウザではwindow.focusが動かない](https://ameblo.jp/softwaredeveloper/entry-12333587022.html)
git で(Modified Content)が出るとき

# TL;DR
```
cd (modified content)なディレクトリ
git checkout -- .
```

毎回忘れているので自分用のメモとして。

# 例
```
$git status
       :
	modified:   lib/ugfx (modified content)
```

# 対処
```
$cd lib/ugfx 
$git status で再度確認→ファイルごとの変更が出る
$git diff →ファイルごとの差分が出る
$git checkout — .
$git status でもう一度確認→変更なしになるはず
$cd ../..
$git status → (modified content) が消えているはず
```

# 参考
[【Git】reset hardしても差分(modified content)が直らない場合 – GeekBox by ゆばたす](http://blog.jubatus.tokyo/74)
AWS Transfer for SFTPを試す

##はじめに
2018/11/27にAWS Transfer for SFTPが発表になったので試してみます。
https://aws.amazon.com/jp/blogs/news/new-aws-transfer-for-sftp-fully-managed-sftp-service-for-amazon-s3/

##流れ
事前IAMロールを作成
sftpユーザ認証用のSSH公開鍵を作成
sftpサーバを作成
sftpユーザを作成
sftp接続する

今回はクライアント環境はMACで試してみます。

###事前IAMロールを作成
ユーザがS3にアクセスできるようにIAMロールを作成します。
IAM>ロールの作成。 本来であればSFTPサービスを選択したいのですが、現時点(2018/11/27)では設定画面に出てこないので、一旦S3を選択して作成し、作成後に手動で変更します。IAMポリシーはs3アクセスが許可された任意のIAMポリシーを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6b11381e-b07a-3712-bd17-bac921a508c2.png)

信頼関係を編集します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b756f17a-6d6a-6d08-5073-b1d4596b6d30.png)

変更前

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

変更後

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

###sftpユーザ認証用のSSH公開鍵を作成

```
$ ssh-keygen -P "" -f transfer-key
$ ls
transfer-key		transfer-key.pub
```

###sftpサーバを作成

create serverをクリックし、設定はすべてデフォルトで作成します。数分待つとサーバが起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b57facef-92db-58e0-ccb3-a9edb8dbe21e.png)

###sftpユーザを作成
Add userをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/9c0bc7f0-804e-ebf8-9132-7e9926c5dd89.png)

ユーザ名と先ほど作成したIAMロールを指定する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/e11503e7-6f05-67fa-e6d5-0b146bc7db7b.png)

先程作成した公開鍵(transfer-key.pub)を指定してAddをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6b0ae707-d1fe-90cd-610e-e7f69d309201.png)

ユーザが作成される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/4fbdbb08-8b68-d17e-bc41-2a7e03bc716d.png)

###sftp接続する
管理コンソールに表示されているエンドポイントに対してSFTP接続を実施する

```
$ sftp -i transfer-key ftpuser@s-*******.server.transfer.ap-northeast-1.amazonaws.com
The authenticity of host 's-******.server.transfer.ap-northeast-1.amazonaws.com (*.*.*.*)' can't be established.
RSA key fingerprint is SHA256:NT5VxkqjIy9FE3kt1CHfAeA/Vsen3bHuxoPlN/fccJk.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 's-******.server.transfer.ap-northeast-1.amazonaws.com,*.*.*.*' (RSA) to the list of known hosts.
Connected to s-******.server.transfer.ap-northeast-1.amazonaws.com.
sftp> 
```
最速でGCE(Debian)上にNginx+Tomcat環境を構築する

#手順
1. Java をインストール
2. Java の設定
3. Tomcat8 をインストール
4. Tomcat8 の設定を変更
5. GCEファイヤーウォール設定
6. Nginx をインストール
7. Nginx の設定 

##Javaをインストール
```
sudo apt-get install default-jre 
```

##Javaの設定
```
readlink $(readlink $(which java))
> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
```
Javaのパスが出てくるので、/bin/java の手前までを設定する。

```
echo "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre" >> /etc/profile
echo "export JAVA_HOME" >> /etc/profile
```

##Tomcat8をインストール
```
sudo apt-get update
sudo apt-get install tomcat8
```

##Tomcat8の設定を変更
server.xml を編集する。

```
sudo cp -a /etc/tomcat8/server.xml{,.old}
sudo vi /etc/tomcat8/server.xml
```
8080で検索して

```xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
```
を

```xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />
```
と、「URIEncoding="UTF-8"」 を追加。

##GCEファイアーウォールを設定
1. Google Cloud Platform のサイドメニュー→VPCネットワーク→ファイアウォールルール
2. 上側にある「ファイアウォールルールを作成」をクリック
3. 内容をそれぞれ設定し、作成をクリック
    - 名前：firewall-8080（一例）
    - ターゲット：指定されたターゲットタグ
    - ターゲットタグ：firewall-8080
    - ソースIDの範囲：0.0.0.0/0
    - プロトコルとポート：tcp:8080
4. VMインスタンスの画面で、公開するインスタンスの名前をクリック
5. 上側にある「編集」をクリック
6. 中段付近にある「ネットワークタグ」に「firewall-8080」を追加
7. 保存をクリック

###Tomcatの起動と、ポートが通っているか確認
起動は、

```
sudo /etc/init.d/tomcat8 start
```
ポート確認は、

```
wget http://localhost:8080
```
ここでステータスコード 200 が返ってきてればOK。

```
> HTTP request sent, awaiting response... 200 
```

##Nginxのインストール
```
sudo apt-get install nginx
```

##Nginxの設定

tomcat用のドキュメントルートを作成。

```
sudo mkdir -p /var/www/tomcat
```

/etc/nginx/sites-enabled ディレクトリに設定ファイルを追加する。

```
sudo vi /etc/nginx/sites-enabled/tomcat.conf
```
tomcat.conf の内容は、

```
server {
  listen 80;
  server_name XXX.XXX.XXX.XXX;

  root /var/www/tomcat;

  access_log /var/log/nginx/tomcat_access.log;
  error_log /var/log/nginx/tomcat_error.log;

  location / {
    proxy_pass http://127.0.0.1:8080/;
  }
}
```
「XXX.XXX.XXX.XXX」には、GCEのVMインスタンスの外部IPを書く。独自ドメインを取得していれば、ドメイン名を書く。

Nginxを起動。

```
sudo /etc/init.d/nginx start
```

##サイトへ接続

GCEの外部IPをブラウザに入力（例：**http\:**//XXX.XXX.XXX.XXX）。80番ポートから繋がり、「It works !」の表示がされれば成功。

※GCEのVMインスタンス画面の外部IPをクリックした場合、HTTPSで繋げようとするため、SSLの設定が済んでいない場合は、ブラウザにIPアドレスを直打ちして、HTTPで接続しないと繋がらない。
君はできるかな？Cookie ＆ Same Origin Policyセキュリティークイズ4問


##クッキーやSame Origin Policyの問題です。

結構HTTPのセキュリティーってややこしいです。

理解が混乱しがちなポイントを問題にしてみました。

もしよろしければ、遊びで作った以下4つの問題にお付き合いください。

※基本的にブラウザの原則(Policy)の話をしているので例外はあります。

##問題1
https://example.com のサイトから https://example2.com にXMLHttpRequestを送る事ができるか。

答え
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓

###回答  → 送る事ができる。
Same Origin Policyの問題です。

Same Origin Policyとは、同じOriginからのリーソースにしかscriptはアクセスできないという原則です。そして、同一Originかどうかは　「プロトコル、ドメイン、ポート」の3つの組み合わせで決定します。

...あれ、https://example.com から https://example2.com ってドメインが違うからリクエストは送信されないんじゃないの！？と思う人もいるかもしれません。

しかし、正しくはリクエストが送信されないのではなく「レスポンスをスクリプトが読み取らない」が正解です。

リクエストの送信自体はできてしまうので、スクリプトインジェクションなどで第三者サーバーに情報が送信されてしまわないように注意しましょう。

また、第三者サーバーがOriginのリクエストがきた場合にデータの更新などの処理をしてしまわないように注意しましょう。

##問2
http://example.com:3000 から受け取ったクッキーは http://example.com:3001 へのリクエスト時に送信されるか

答え
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓

###回答  → 送られる。
これも注意！Same Origin の定義を理解していると引っかかりやすいです。
2はSame Origin Policyの問題ではなく、Cookieの問題です。
Cookieはプロトコル、ポートは関係なくDomainでCookieを送るかどうか判断します。


##問3
http://example.com から受け取ったクッキーには"Domain=example.com"の指定がされていた。http://example.com から受け取ったクッキーは  https://subdomain.example.com に送信されるか。
答え
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓

###回答  → 送られる。

これも送られます！
Same Origin Policyではサブドメインでoriginを区別しますが、Cookieのdomain設定をした場合、指定したドメインのサブドメインにもCookieを送信してしまいます。プロトコルも関係ありません。サブドメインで動かしているアプリケーションがある場合、アプリケーションが相互に干渉しあわないようにCookieの設定に注意を払いましょう。

##問4
http://example.com から受け取ったクッキーのメタデータにはDomainの指定はなかった。http://example.com から受け取ったクッキーは https://subdomain.example.com に送信されるか。

答え
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓

###回答  → 送られない。(但し一部例外クライアントあり)
3と非常に似ているので紛らわしいのですが、明示的にDomain指定をしない限りサブドメインにはCookieは送信されません。但し、ドメインを指定しない場合はDomain=example.comと記述したと同じ扱いをしてしまうクライアントも存在するようです。



###終わりに

セキュリティーの仕組みを理解していると何故クッキーやセッションなどを暗号化したりしているかの理解が深まりソースコードが分かるようになります。

セキュリティー関係は可視化されにくいですが非常に重要な知識で、ちゃんと正しくリスクを把握して説明できるととても重宝されると思います。

興味を持ったら学習してみると良いでしょう。

###参考
[RFC6265](https://tools.ietf.org/html/rfc6265)
【プログラマのためのSQL 1章】データベースVSファイルシステム

## はじめに

「プログラマのためのSQL」を頑張って読んでいこうと思います。

第1章は「データベースとファイルシステムは何が違うのか」
言われれば当たり前な内容なのですが、
SQLを正しく理解するにあたってまず理解しておかなければならないことだと思います。

第1章の構成として、
「ファイルでは〇〇だがテーブルは△△だ」
のような論調が続くのですが、それぞれ分けてまとめてみました。


## ファイルとデータベースの違い


ざっくり言うと、

- ファイルは**物理的**なデータ
- データベースのテーブルは「集合」という**論理的**なデータ

です。
そのため、以下のように特徴が全く異ります。

### ファイル
- 紙を元にした概念なので非常に物理的な存在である
- 物理的配置によってアクセスされる一連のレコード群である
- ファイルシステムが物理ドライブにマウントされた時に名前が割り当てられる
- アプリケーションが読み込むことで初めてレコードやフィールドに意味を持つことができる
- アプリはファイルをオープンし1行ずつレコードを読み込みEOFまで読んだらクローズする
- アプリがアクセスする際はファイル毎に接続が必要である
- レコードはシーケンシャルで順序を持ち、その順番に意味がある
- 整合性やデフォルト値を持たない
- 他ファイルとの相互の関連は定義されない
- 整合性や関連はアプリケーション側で意味を持たせる必要がある
- 受動的であり、アプリケーションから変更を全て受け入れる
- 物理的なのでNULLという概念がない


### データベース
- 集合としてのデータであり、論理的な存在である
- SQLはスキーマ単位で操作を行う
- データベースへのアクセスもスキーマ単位である
- スキーマ内に同じ名前のテーブルは定義できない
- テーブルはスキーマの一部の集合に過ぎないので論理的である
- 同じ集合に含まれる要素(テーブルの行)はどれも構成である
- テーブルの行は順序を持たない(ORDER BY句があるが、あれはSQLの一部ではない)
- 順序を持たないため、集合に対して操作を行う場合、全要素に対して一度に行われる
- テーブルは0以上の行の集合であり論理的である
- 行は1つ以上の列の集合であり論理的である
- 列は論理的な存在なのでNULLが存在し得る
- テーブルはデータベース内に定義された時点で初めから名前を持っている
- 行も列もスキーマの中で定義された段階で意味を持つ
- 整合性やデフォルト値を定義できる
- トリガーや制約によって、能動的にデータの整合性を保とうとする
- アクセスする際に物理的配置を気にする必要がない



## その他

### SQLと、他の手続き型言語との違い
- 通常、手続き型言語は何回実行しても同じ結果になる
- SQLは実行するたびに実行プランが変わる可能性がある

### SQLにおける集合と、一般的な集合論との違い
- 数学の集合論では空集合は1つしか存在しない
- SQLではテーブル毎に構造が異なるので別の空として扱われる



## まとめ

上記を意識しているだけでもSQLに対する見方が少し変わりそうです。
ここを理解していると、今後SQLを本格的に学ぶ上で納得しやすくなるのかなと思います。
「ファイルのフィールドは受動的、テーブルの列は能動的」という表現が印象的でした。

かなり端的にまとめたので、意味が分からなかったらぜひ本書を読んでみてください。
FreeBSDでFujiXeroxの複合機ApeosPort-VI C4471に印刷できるようにする

# はじめに

この記事は、以前書いた「[FreeBSDでBrotherのプリンタMFC-8520DNに印刷できるようにする](https://qiita.com/HirotoKagotani/items/83618bfbde77dc028fff)」のFujiXerox版です。Brotherの場合と同様にlinuxulatorとCUPSを使用しますので、必要に応じて参照してください。

# linux用CUPSライブラリのインストール

FujiXeroxのドライバが使用しているフィルタがlinux版libcups.so.2を必要とするのでインストールしておきます。linux_base-c7を入れている場合はc6を読み替えてください。

```
# pkg install linux-c6-cups-libs
```

[フィルタのソースコード](https://www.fujixerox.co.jp/download/apeosport/download/c4300series/linux_module.html)も公開されていて、一部修正（`"wait.h"`→`"sys/wait.h"`）すればFreeBSDネイティブのバイナリもすぐコンパイルできます。この場合はlinux版ライブラリは不要になるので、手間と天秤にかけてもかまいません。

# ドライバの入手とインストール

https://www.fujixerox.co.jp/ から、ダウンロード → ApeosPort → ApeosPort-VI C4471 → その他のOS → Linux → [Linux用プリンタードライバー（32ビット）](https://www.fujixerox.co.jp/download/docuprint/download/p450d/linux)に進みます。検索からでも到達できます。amd64のFreeBSDでも32ビット版でかまいません。64ビット版でも動くと思いますが検証していません。

ページの末尾にある、「使用許諾条件に同意してダウンロード」よりrpmファイル（執筆時点で Ver.1.1.2-1）をダウンロードします。[Ver.1.0.4-1] (https://www.fujixerox.co.jp/download/apeosport/download/c4300series/linux)と本質的には何も変わっていないと思われます。


/opt あたりに展開して、/usr/local に必要なファイルをシンボリックリンクで持ってくるのが私の好みです。あるいは直接ファイルをコピーしても問題ありません。特にPPDファイルは圧縮されていますが元に戻しておいてもいいし、場所も/usr/local/share/cups/model/内なら任意です。

```
# mkdir -p /opt/FujiXerox
# tar xf <downloaddir>/fxlinuxprint-1.1.2-1.i386.rpm -C /opt/FujiXerox
# ln -s /opt/FujiXerox /usr/local/share/cups/model/.
# ln -s /opt/FujiXerox/etc/cups/* /usr/local/share/cups/mime/.
# ln -s /opt/FujiXerox/usr/lib/cups/filter/* /usr/local/libexec/cups/filter/.
```

# プリンタの登録

ブラウザで http://localhost:631/admin/ にアクセスすると、CUPSの設定ができます。設定変更等には、途中で認証を求められますが、rootとそのパスワードを入れます。

「管理」 → 「プリンターの追加」に進みます。

「発見されたネットワークプリンター」にFUJI XEROX ApeosPort-VI C4471 v 42. 88. 0 Multifunction Systemが含まれているはずなので、それを選択します。

その次に進んで、「プリンタ名」、「説明」、「設置場所」を設定します。この「プリンタ名」だけはWeb UIで変更できません。変更するには、削除して追加するしかありません。（printer.confを直接いじるという手もありますが）

次のページで、「メーカー」一覧の中からFXを選択し（(Fuji Xerox)があるかもしれませんが、これではありません）、「続ける」に進むと、「モデル」としてFX Printer Driver for Linux (en, ja)が選択されているはずですので、「プリンターの追加」で登録完了です。

# デフォルトオプションの設定

登録さえしてしまえば各種アプリから好きなオプション設定で印刷できるようになります。しかし、CUPS未対応アプリやlprを直接使いたい場合はオプション設定できないので、そのデフォルトを設定しておく必要があります。

「管理」 → 「プリンターの管理」 と進んで、目的のプリンタを選びます。

「管理」と書かれたプルダウンメニュー（上の「管理」とは別。ややこしい）から「デフォルトオプションの設定」を選びます。

次の「プリンターオプションの設定」のページで、「General」を開くと、印刷オプションがいくつかあるので、好みに設定します。
Microsoft Hyper-V Server 2016でS.M.A.R.Tをみる

どうもはにおかさいです。
Microsoft Hyper-V Server 2016でS.M.A.R.Tをみたいと思い、方法を模索しました・

#CUI編
Powershellにて、smartが見れるようです
詳細はあまり見れない（ドライバのせい？）

```powershell:結果
PS C:\Users\Administrator> Get-Disk 0

Number Friendly Name                                      Serial Number                    HealthStatus         OperationalStatus      Total Size Partition
                                                                                                                                                  Style
------ -------------                                      -------------                    ------------         -----------------      ---------- ----------
0      HGST HTS545050A7E680                               AAAAAAAAAAAAJ       　　　　      Healthy              Online                  465.76 GB MBR


PS C:\Users\Administrator> Get-Disk 1

Number Friendly Name                                      Serial Number                    HealthStatus         OperationalStatus      Total Size Partition
                                                                                                                                                  Style
------ -------------                                      -------------                    ------------         -----------------      ---------- ----------
1      WDC WDS256G1X0C-00ENX0                             なにがしなにがし... 　　　　　　　　　Healthy              Online                  238.47 GB MBR


PS C:\Users\Administrator>
```

```
C:\Users\Administrator>wmic diskdrive get status, size, model
Model                   Size          Status
HGST HTS545050A7E680    500105249280  OK
WDC WDS256G1X0C-00ENX0  256052966400  OK
```

＃GUI編
そもそも、CrystalDiskInfoが使えました。何らかの手段(e.g.USBメモリ、ネットワークドライブ）でポータブル版のexeを置くかインストールすることで使えた。

```console:cmd.exe
D:\>cd CrystalDiskInfo7_8_3
D:\CrystalDiskInfo7_8_3>DiskInfo64.exe
```
(32でもいけた）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/af818cad-f5fe-85ab-7fb3-7a5d26589c42.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/b4c8219a-3e83-faed-7429-57847e14882f.png)

#まとめ
GUIで見れた方が早かったね。


#Ref
https://blogs.msdn.microsoft.com/san/2012/09/26/determining-disk-health-using-windows-powershell-on-windows-server-2012-and-windows-8/
http://support.moonpoint.com/os/windows/commands/wmic/diskdrive.php