OmniAICreator/Qiita-1.07M huggingface dataset:
GCPドキュメント漁り「ストレージとデータベース」

# 今日のお題
GCPの数あるサービスの中でも特に「ストレージとデータベース（一部、ビッグデータ）」に関して、
どういう時にどのサービスを使うべきなのかを知りたく、ドキュメントを漁ってみる。

# 経緯
実は、このお題に対しては以下のサイトに使い分け方が載っている。
https://cloud.google.com/storage-options/?hl=ja

ちなみに、↑からFirebase分を端折り、拙い日本語で表現してみたのが↓
![GCP_Storage_Selection.png](https://qiita-image-store.s3.amazonaws.com/0/180599/13735759-4557-d534-6d8a-fb15dcf9df3a.png)

なんとなくは、わかる。でも、仕事で「こういう時はこのサービスだ！」と自信を持って言えない。
まあ、仕事レベルでとなると、実際に経験を積まないと到達できない領域ではあるけど、せめてもう少し上の図より正確な「モノサシ」が欲しい。
というわけで、まずはドキュメント漁り。
調べる観点としては、「どういう時に、なぜ他のサービスでなくてこのサービスなの？」がわかること。

# 調査
## GCS (Google Cloud Storage)
### ■参考
https://cloud.google.com/storage/docs/?hl=ja

### ■ユースケース
- マルチメディア（画像・音楽・動画）の保存とストリーミング
- 複数のVMで読み取り専用データの共有
- [静的ウェブサイトのホスティング](https://cloud.google.com/storage/docs/static-website?hl=ja)
- VMのバックアップ

### ■特徴的な機能
- [用途別のストレージクラス](https://cloud.google.com/storage/docs/storage-classes?hl=ja)
- [オブジェクトが変更されるとCloud Pub/Sub（or Cloud Functions）に通知](https://cloud.google.com/storage/docs/pubsub-notifications?hl=ja)
- [オブジェクトのバージョニング](https://cloud.google.com/storage/docs/object-versioning?hl=ja)
- [バケット・オブジェクトのライフサイクル管理](https://cloud.google.com/storage/docs/lifecycle?hl=ja)
- [時間制限のある署名付きURL](https://cloud.google.com/storage/docs/access-control/signed-urls?hl=ja)

## Cloud SQL
### ■参考
https://cloud.google.com/sql/docs/mysql/?hl=ja

### ■ユースケース
- リレーショナル・データベースを必要とする、ただしオートスケールは不要なあらゆるケース
- ウェブサイト・ブログ・CMS等
- ERP・CRM・Eコマース等

### ■特徴的な機能
- 自動フェイルオーバーにより複数のゾーン間でデータを複製
- 自動orオンデマンドのバックアップとポイントインタイムリカバリ
- [Cloud SQL Proxy](https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja)

## Gloud Datastore
### ■参考
https://cloud.google.com/datastore/docs/?hl=ja

### ■ユースケース
- ゲームデータ

### ■特徴的な機能
- [アトミックトランザクション（結果が「すべて成功」と「何も起こらない」のどちらかになる一連のオペレーションを実行可能）](https://cloud.google.com/datastore/docs/concepts/transactions?hl=ja)
- 分散アーキテクチャによるオートスケーリング
- [祖先クエリによる強整合性クエリとその他の結果整合性クエリ](https://cloud.google.com/datastore/docs/concepts/structuring_for_strong_consistency?hl=ja)
- [複合インデックス](https://cloud.google.com/datastore/docs/concepts/indexes?hl=ja)

## Spanner
### ■参考
https://cloud.google.com/spanner/docs/?hl=ja

### ■ユースケース
- ミッションクリティカルなシステム（AdTech・金融サービス等）

### ■特徴的な機能
- [強く一貫した二次インデックスを含む強い一貫性](https://cloud.google.com/spanner/docs/secondary-indexes?hl=ja)
- [TrueTimeと外部整合性](https://cloud.google.com/spanner/docs/true-time-external-consistency?hl=ja)

## BigQuery
### ■参考
https://cloud.google.com/bigquery/docs/?hl=ja

### ■ユースケース
- 大容量データの分析レポート
- SQLを用いたビッグデータ処理

### ■特徴的な機能
- [スロット](https://cloud.google.com/bigquery/docs/slots?hl=ja)

## Bigtable
### ■参考
https://cloud.google.com/bigtable/docs/?hl=ja

### ■ユースケース
- 低レイテンシーな読み書きを要するシステム（IoT・AdTech・金融サービス等）
- 時系列データを扱うシステム
- 購入履歴や顧客の好み等のマーケティングデータを扱うシステム
- グラフデータを扱うシステム

### ■特徴的な機能
- 散在して格納されるテーブルであり、数十億行、数千列の規模にスケール可能
- [時系列データ](https://cloud.google.com/bigtable/docs/schema-design-time-series?hl=ja)

# まとめ
おおよそのユースケースや特徴的な機能は集約してみたものの、案件として用途を聞いて「それなら、◯◯！」と即決できるまでには理解進まず・・・。
まだまだドキュメントの読み込みも実践も必要。
PHPで文字列を暗号化


[openssl_encrypt](http://php.net/manual/ja/function.openssl-encrypt.php)

* 第三引数までで良いのかと思ったら警告が出る

```
Using an empty Initialization Vector (iv) is potentially insecure and not recommended
```

[利用可能な暗号メソッド](http://php.net/manual/ja/function.openssl-get-cipher-methods.php)

openssl_random_pseudo_bytesだとバイナリになりコードに書けないのでivは一旦文字列化しています。
固定する必要が無ければopenssl_random_pseudo_bytesのままでOK

```
// バイナリを16進数に変換
$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);// 16進数をバイナリに変換
```

または

```
// バイナリをbase64に変換
$base64_iv_string = base64_encode(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = base64_decode($base64_iv_string);// base64をバイナリに変換
```

```php
$target_string = '暗号化したい文字列';
$method_name = 'AES-256-CBC';
$key_string = 'キー文字列';
// 固定する必要がある場合はこれを実行した値で固定
$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);
// 暗号化
$base64_encrypt_string = openssl_encrypt(
    $target_string,
    $method_name,
    $key_string,
    0,
    $iv
);

// 復号
$decrypt_string = openssl_decrypt(
    $base64_encrypt_string,
    $method_name,
    $key_string,
    0,
    $iv
);

var_dump($target_string);
var_dump($base64_encrypt_string);
var_dump($decrypt_string);
```

```
string(27) "暗号化したい文字列"
string(44) "BLUJX2CNbIy+kSps/0xhNt7yMDZIBuomh5jpuVQD+aQ="
string(27) "暗号化したい文字列"
```

```php
$target_string = '暗号化したい文字列';
$method_name = 'AES-256-CBC';
$key_string = 'キー文字列';
// 固定する必要がある場合はこれを実行した値で固定
$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);

// 暗号化
$encrypt_bin = openssl_encrypt(
    $target_string,
    $method_name,
    $key_string,
    OPENSSL_RAW_DATA,
    $iv
);

$hex_encrypt_string = bin2hex($encrypt_bin);// バイナリを16進数に変換

// 復号
$decrypt_string = openssl_decrypt(
    hex2bin($hex_encrypt_string),// 16進数をバイナリに変換
    $method_name,
    $key_string,
    OPENSSL_RAW_DATA,
    $iv
);


var_dump($target_string);
var_dump($encrypt_hex_string);
var_dump($decrypt_string);
```

```
string(27) "暗号化したい文字列"
string(64) "c327a6ce0bc8e8b88078652dc4a8ce29d1da36444f8cce45340639104c6f04e0"
string(27) "暗号化したい文字列"
```

```php
$target_string = '暗号化したい文字列';
$method_name = 'AES-256-CBC';
$key_string = 'キー文字列';
// 固定する必要がある場合はこれを実行した値で固定
$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);

// 暗号化
$encrypt_bin = openssl_encrypt(
    $target_string,
    $method_name,
    $key_string,
    OPENSSL_RAW_DATA,
    $iv
);

$base64_encrypt_string = base64_encode($encrypt_bin);// バイナリをbase64エンコード

// 復号
$decrypt_string = openssl_decrypt(
    base64_decode($base64_encrypt_string),// base64デコードしてバイナリに変換
    $method_name,
    $key_string,
    OPENSSL_RAW_DATA,
    $iv
);

var_dump($target_string);
var_dump($base64_encrypt_string);
var_dump($decrypt_string);
```

```
string(27) "暗号化したい文字列"
string(44) "TVg7Xt1Z0PHTmzhCTVEMukvU7nHtgDSfz/qCiqs5/lI="
string(27) "暗号化したい文字列"
```
Apple Watchアプリのseries 4対応化

Apple Watch series 4が発表されました。
画面が大きくなり、iPhone Xのような角丸のOLEDが搭載されています。
iPhone Xのノッチや角丸に対応させるためにiOS 11ではSafe Areaというのが導入されたように、watchOS5でもseries 4の角丸に対応させるためSafe Areaが導入されました。
その点色々とややこしくなったので、そのまとめです。

基本的にはここの内容になってます
[Designing for Apple Watch Series 4](https://developer.apple.com/videos/play/tech-talks/802/)

# 画面サイズ

| モデル | 画面解像度 | ポイント | 倍率 |
|------:|:--------:|:-------:|:---:|
|38mm|272x340|136x170|2|
|40mm|324x394|162x197|2|
|42mm|312x390|156x195|2|
|44mm|368x448|184x224|2|

40mmと42mmを比較すると、40mmのほうが少しだけ画面解像度が大きいですが、ほとんど違いはありません。
なので、画面をレイアウトするときは、40mmと42mmのサイズを共通にし、38mmではそれをスケールダウン、44mmではスケールアップをすればいいみたいです。

画面サイズによって実行するプログラムを変えたい場合、
```WKInterfaceDevice.current().screenBounds```でポイントの値が取得できるので、それを使ってif分岐しましょう。

# Safe Area

Apple Watch series 4ではiPhone Xのように画面四隅が丸くなっています。
そのため、画面いっぱいにコンテンツを表示すると、四隅が欠けてしまいます。
Safe Areaはそれを防ぐために、コンテンツが欠けることなく表示できる長方形のエリアを定めたものです。
Apple Watch series 4では、下の表に書いてあるサイズで上下に余白を設けて定義してあります。

| モデル | top | left | bottom | right |
|:-:|:-:|:-:|:-:|:-:|
| series4 40mm | 28pt | 0.5pt | 28pt | 0.5pt |
| series4 44mm | 31pt | 0.5pt | 31pt | 0.5pt |

## Storyboard

Storyboardでは自動でSafe Area内に配置されます。
HeightをRelative Containerで1倍にすればSafe Area内で最大の高さになりますし、
Vertical AlignをBottomにすればSafe Areaの下部につきます。

しかし、スクロールをしない1画面のレイアウトではSafe Area外の領域も使っていっぱいに表示させたい場合がほとんどでしょう。
そんなときは、Interface ControllerのFixed to screen edgesをオンにすれば、Safe Areaを無視して画面いっぱいにレイアウトされるようになります。

<img width="556" alt="スクリーンショット 2018-09-18 19.53.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/242402/d96ec34e-3a5d-b9f5-c2a1-6b350d535323.png">

実行結果はこんな感じ

![watch1.png](https://qiita-image-store.s3.amazonaws.com/0/242402/9118df26-a962-8ad4-ce27-ab3cfcd1ed86.png)

左からそれぞれ

- series 3 42mm
- series 4 40mm, Fixed to screen edgesオフ
- series 4 40mm, Fixed to screen edgesオン

です。

ちなみに、StoryboardのプレビューはSafeAreaや画面の角丸を反映していないので、シミュレータで実行しないとレイアウトの確認はあんまりできない。早く対応してくれないかな。

## Swift

watchOS5では、WKInterfaceControllerがcontentSafeAreaInsetsという値を持っており、これがSafe Area外部の余白のサイズになります。

ただし、僕の環境で確認すると、初回にawakeとwillActivateが呼び出されるタイミングではcontentSafeAreaInsetsがゼロになっており、didAppearの時点では正確な値が格納されていたので、プログラムからInterfaceController表示時にレイアウト調整を行なっている人は注意してください。
環境構築

# MacOSXにReact.js環境を構築する

夜です。眠いです。少し書いたら寝ます。普段はWindows PCのNodistを使ってReact環境を作ってます。
今回はMacで環境を作っていこうと思います。とりあえず、今日はcreate-react-app できるところまで。

## brewインストール
https://brew.sh/

```sh
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

brewはインストール済みだったぽいので、最新版にアップデート

```sh
$ brew update
$ brew -v
> Homebrew 1.7.5
```

### anyenv で開発環境を構築

Nodistと似たような感じで、様々な言語をサポートしてるので anyenv を使います。

https://github.com/riywo/ndenv

```sh
$ brew install ndenv
$ ndenv -v
> ndenv 0.4.0

$ echo 'export PATH="$HOME/.ndenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(ndenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
```

node自体をインストールするのに、node-build も勧められてるので入れます。

```sh
$ git clone https://github.com/riywo/node-build.git $(ndenv root)/plugins/node-build
```

早速 node をいれます。安定ビルドバージョンの 8.12.0 （2018年9月19日現在）を指定します。

```sh
$ ndenv install 8.12.0
/usr/bin/env: bash\r: No such file or directory
```

!?

bash\r が無いと言っている。どうやらwindowsの改行コードがだめらしい。
dos2unix という改行コード変換を試す。

```sh
$ brew install doc2unix
```

参考にしたコマンドが、ユーザーディレクトリ以下の全てのファイルを変換しようとしたので、あえて掲載しない。正直ミスったと思った。
途中で止めたが、一応動作した。

```sh
$ ndenv install v8.12.0
$ ndenv versions
 v8.12.0

$ ndenv global 8.12.0
$ node -v
v8.12.0
```

## yarn インストール

```sh
$ brew install yarn --without-node
```

## create-react-app インストール

```sh
$ yarn global add create-react-app
$ create-react-app my-app
$ cd my-app
$ yarn start
```

動いた。寝る。
XcodeのBuildPhase RunScript でxcfilelistを使う

##注意
本対応はCarthageのv0.31.1以降でのみ使用可能です。

##はじめに

Carthageでライブラリ管理を行うような場合、Build Phases に 以下のようなRunScriptを追加する必要があります。

<img width="563" alt="carthage_runscript_before.png" src="https://qiita-image-store.s3.amazonaws.com/0/154099/125a4d7e-4017-a7f5-b4e1-d7e7ea454bac.png">

Carthageを例にとりますと、ここでInput FilesにCarthageで導入したライブラリのBuild成果物のPathを記載する必要がありましたが、ライブラリの数が増えると以下のような問題が発生します。

* 単純に記入が手間
* 記入漏れ等に気づきにくい、逆に重複があっても気づきにくい
* 意味のあるまとまり（通信ライブラリ、Alphabet順など）に整理しづらい

このあたりの仕組みに関してXcode10で改善があったため共有します。

##検証環境
以下の環境を使用しています。

* macOS High Sierra Version 10.13.6
* Xcode Version 10.0.0


##何が変わったか
先ほどの画像に注目していただくと、 Input Files以外に見慣れない Input File Lists項目があることに気づかれるかと思います。Xcode10にてFileだけではなく、xcfilelistをInputやOutputとして取り扱えるようになりました。
以下、具体的な対応方法を記載します。

##対応方法
ここで具体的な対応方法について記載します。

###xcfilelistの追加方法
Xcodeの File > New > File と辿っていくとよく見る追加ファイル種別の選択画面が表示されます。これを下に辿っていくと Other内に Build Phase File List という項目があります。こちらを選択することでxcfilelistを追加することができます。

<img width="729" alt="スクリーンショット 2018-09-20 0.35.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/154099/6b957c12-f15a-49d4-d4d2-0935efd04d17.png">

作成直後のファイルの中身は下記のようになります。

```Swift
#  CartfileTargets.xcfilelist
#  ReduxSample
#
#  Created on 2018/09/20.
#  Copyright © 2018年 iganin. All rights reserved.

# This file may be set as an input or output file list for a shell script build phase.
# List file paths below; one per line. These paths will be considered inputs or outputs for the script phase.
# Build settings will be expanded, e.g. $(SRCROOT)/fileName
```

こちらに先ほどの画像のResourcePathを追記していきます。
ファイル内はコメント記入もでき、改行も可能なため意味のあるまとまりに分けることもできます。

```Swift
#  CartfileTargets.xcfilelist
#  ReduxSample
#
#  Created on 2018/09/20.
#  Copyright © 2018年 iganin. All rights reserved.

# ReSwift
$(SRCROOT)/Carthage/Build/iOS/ReSwift.framework

# Reactive Libraries
$(SRCROOT)/Carthage/Build/iOS/RxBlocking.framework
$(SRCROOT)/Carthage/Build/iOS/RxCocoa.framework
$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework
```

最後に作成したxcfilelistをInput Filesに追加します。
先ほどと同じライブラリのcopy-frameworks RunScriptですが随分とすっきりしました。
<img width="570" alt="carthage_runscript_after.png" src="https://qiita-image-store.s3.amazonaws.com/0/154099/9f665386-a15f-be77-3b6d-d86d92c068c7.png">

##所感
以下のメリットがあると考えています。

* 記入漏れや重複記入に気づきやすい
* ファイル内で意味のあるまとまりに分けることができる
* そもそもファイルを分けることができるので、Test用、社内ライブラリ、社外ライブラリなどでファイルを分割可能
* Enterprise、Productなど複数Schemeで同一のライブラリを読み込んでいる場合などに追加の手間が大きく省ける

今回はCarthageのcopy-frameworksでご説明しましたが、他のRunScriptフェーズでも同様に使用可能です。
今後は各ファイルを追加するのではなく、xcfilelistに記載しxcfilelistを追加する形が良いのではないでしょうか。

## 追記（9/21）
手元で実行した際に問題がなかったためうまくいったと判断いたしましたが、
DerivedDataを消したところdyldのエラーがでてしまい実行時エラーとなりました。。
上記の方法ではうまくいかない可能性が高いです。。。
何か解決方法をご存知の方は共有いただけますと幸いです。

こちらですが、Carthageがxcfilelistに未対応だったためそもそも現時点では上記方法が使えない状況でした。。
先走ってしまい申し訳ありません 🙇🏻‍♂️ Carthangeが対応されましたら上記対応に変えるのが良さそうです。

##追記（10/15）
@k_katsumiさんが対応してくださり、Carthageの0.31.1よりxcfilelistがサポートされたようです。（ありがとうございます！）
以下、該当のリリースノートになります。
https://github.com/Carthage/Carthage/releases/tag/0.31.1

##参考
* [WWDC - Building Faster in Xcode](https://developer.apple.com/videos/play/wwdc2018/408)
* 13分ごろから本記事記載の内容に関して言及されています
C++11 をベースに考えよう

C++ 言語は　C言語の文法やライブラリを引きずりやすい。
私の場合も、C++言語をなるべくC言語のライブラリを引きずらないように書くようにしてきた。
どうやら、C++言語も　C++11以降のスタイルで書くように徹した方がいいらしいことを理解してきたのでメモを示す。

## [C++11](https://ja.wikipedia.org/wiki/C%2B%2B11)自体が利点が多い。
[Effective Modern C++ ―C++11/14プログラムを進化させる42項目](https://www.oreilly.co.jp/books/9784873117362/)
![表紙](https://www.oreilly.co.jp/books/images/picture978-4-87311-736-2.gif)
この本の目次を読んでみれば、C+11へ移行すべき理由がわかるだろう。

## OpenCV4ではC++11ベースに
OpenCVもOpenCV3では、C++を標準とするものに変わりきったし、OpenCV4ではC++11をベースとするものになるとのことだ。

[OE 4. OpenCV 4](https://github.com/opencv/opencv/wiki/OE-4.-OpenCV-4)
> Switch to C++ 11. OpenCV 3.0 is C++ 98 library, whereas many C++ developers switched to C++ 11 or even later standards. We finally need to follow this route. Migration to C++ 11 means breaking “binary compatibility promise”, so this move alone would require OpenCV 4.0.


## C++11　とPythonとのよいbindingがある。
[pybind11](https://pybind11.readthedocs.io/en/stable/)

[[python高速化]pybind11によるc++組み込み](https://qiita.com/exy81/items/e309df7e33d4ff20a91a)

[pybind11でC++の関数をpythonから使う](https://qiita.com/ignis_fatuus/items/c7523c0fe2bc2f415d50)
プログラミングで使えるGoogle Homeの機能(随時更新)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">え。Google Homeって<br>「180の16進数は」って聞くと答えてくれるんだ…。<br><br>地味に便利・・・<a href="https://t.co/5PT9ggojGS">https://t.co/5PT9ggojGS</a></p>&mdash; 高見ちえたん (@TakamiChie) <a href="https://twitter.com/TakamiChie/status/1042418851949031424?ref_src=twsrc%5Etfw">2018年9月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ということで、こんな機能を発見して「あ、これは開発に使える・・・」と思ったので勢いで作ってしまったエントリです。

今後も見つけたらどんどん追加していこうと思います。

# 変換系
## ○○の16進数は
たとえば「150の16進数は」などと聞くと「150は、0x96です。」などと返してくれます。
カラーコードの変換などでこのような基数変換は良く使うと思うので、暗算で基数変更ができる！という方でなければ重宝するのではないかなと。

ただ、基数変換の結果両方アルファベットとなった場合など、よくわからない発音をされてしまうケースがあるようで、そこは注意です(0xACなど、「アーク」と発音されてしまう)

ちなみになぜか255だけは16進数変換できませんでした(お役に立てそうにありませんと言われた)
gzipコマンドの出力には入力ファイル名が含まれている（空データを圧縮させて調べてみた）

こんにちは。
```gzip``` コマンドで空データ（ゼロサイズ）を圧縮させ、その出力内容を調べてみました。出力（出力ファイル）の内部には入力ファイル名（もしくは入力先名）が含まれていました。出力のサイズを確認してもその分が格納されていることが分かります。

また ```less``` コマンドで確認することで、その入力先名が表示されますが、空データを圧縮させたものに対しては、その旨の警告らしき文字化け(?)が表示されました。macOS で動かしています。

```console
$ echo -n "" | gzip > temp.txt.gz
$ ls -ld temp.txt.gz
-rw-r--r--  1 foo  staff  20  9 19 23:38 temp.txt.gz
$ echo "" | gzip > temp.txt.gz
$ ls -ld temp.txt.gz
-rw-r--r--  1 foo  staff  21  9 19 23:53 temp.txt.gz
$ touch temp.txt
$ gzip -c temp.txt > temp.txt.gz
$ ls -ld temp.txt*
-rw-r--r--  1 foo  staff   0  9 19 23:10 temp.txt
-rw-r--r--  1 foo  staff  29  9 19 23:16 temp.txt.gz
$ less temp.txt.gz
^_<8B>^H^H<F3>X<A2>[^@^Ctemp.txt^@^C^@^@^@^@^@^@^@^@^@
temp.txt.gz (END)
$
```
AWS勉強 -VPC作成&サブネットに分割-

## VPC作成

作成する前に,
どんな記事でもいいのでIPアドレスの基本を抑えるとよい!

[IPアドレスについて](https://www.infraexpert.com/study/ip5.html)

### VPCを開く

<img width="843" alt="スクリーンショット 2018-09-19 23.47.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/eb5cafa2-8207-c646-d001-be0728dd072b.png">

### リージョンを設定する

<img width="875" alt="スクリーンショット 2018-09-19 23.49.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/9ff960ad-0a01-65da-d3f9-9106204d8fc2.png">

### VPC領域を作成する

<img width="855" alt="スクリーンショット 2018-09-19 23.56.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/0e3ef4ed-c846-30f9-d7c6-efe4e86cc255.png">

これで領域が作れた.

## サブネットに分割

上記の作業で「10.0.0.0/16」というCIDRブロックを持った「VPC領域」というプライベートなネット空間ができた.

### サブネットの考え方
実際のネットワークではこのCIDRブロックをさらに分割して利用することがほとんどだ.
さらに分割したCIDRブロックのことを「サブネット(Subnet)」という.

よく行われる分割方法は,

* 「/24」の大きさで切って256分割する

という方法がよく行われる.

サブネットを分割してネットワークを分けたい主な理由として,

1. 物理的な隔離
2. セキュリティ上の理由

が挙げられる.

#### 物理的な隔離

例えば社内LAN構築の際に1階と2階で別のサブネットに分けたとき,
どちらかのサブネットが障害を起こした際にもう片方に影響が出にくくなる.

#### セキュリティ上の理由

サブネットを分けるとそれぞれに対して別々のネットワーク設定ができるため,
ある部署のネットワークだけ他部署からアクセスできないようにするといったことが可能になる.

### VPC領域をサブネットに分割する

VPC領域を2つのサブネットに分割する.

1. パブリックサブネット(10.0.1.0/24)
→インターネットからアクセスすることを目的とする.
Webサーバーを設置する予定

2. プライベートサブネット(10.0.2.0/24)
→インターネットから隔離したサブネット
データベースサーバーを設置する予定

### パブリックサブネットを作成する

#### サブネットを作成

<img width="895" alt="スクリーンショット 2018-09-20 0.21.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/60e02886-10eb-cd1f-3d94-3285ef938dc8.png">

#### サブネットの名称やIPアドレスを入力

<img width="837" alt="スクリーンショット 2018-09-20 0.26.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/320c0cf8-f5c2-a783-6268-93141e981169.png">

### 感想

やってる感が出てきた笑
会社のネットワーク構成も気になってくるな...
CentOS6 RabbitMQ3.7 管理画面の有効化

# 環境
OS：CentOS6.9 64bit

# 参考URL
https://qiita.com/ajitama/items/53ce21f3c8169496c563
https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example

# 事前準備
[CentOS6環境にRabbitMQ3.7をインストール](https://qiita.com/mtomoaki_96kg/items/cf7bc2945d02a5a0acaf)

# rabbitmq_managementプラグインの有効化
```
rabbitmq-plugins enable rabbitmq_management 
（rabbitmqが起動していないとエラーになる。）
```

# Web管理画面へログイン出来るユーザの追加
管理画面へログインするためには、administrator権限が必要
(guestは、デフォルトではローカル以外から接続出来いないため、ユーザ追加する必要がある。)

```
## フォーマット
# rabbitmqctl add_user <ユーザ名> <パスワード>
# rabbitmqctl set_user_tags <ユーザ名> <権限>
rabbitmqctl add_user mtomoaki 96kg
rabbitmqctl set_user_tags mtomoaki administrator

## 作成確認
rabbitmqctl list_users
---
Listing users ...
mtomoaki        [administrator]
guest           [administrator]
---
```

# 設定
```
cd /etc/rabbitmq
wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-server/master/docs/rabbitmq.conf.example
cp rabbitmq.conf.example rabbitmq.conf

sed -i "s/# listeners.tcp.default = 5672/listeners.tcp.default = 5672/" rabbitmq.conf
sed -i "s/# management.listener.port = 15672/management.listener.port = 15672/" rabbitmq.conf

## 確認
diff rabbitmq.conf rabbitmq.conf.example
16c16
< listeners.tcp.default = 5672
---
> # listeners.tcp.default = 5672
492c492
< management.listener.port = 15672
---
> # management.listener.port = 15672
```

# rabbitmq再起動
```
/etc/init.d/rabbitmq-server restart
```

# 管理画面確認
ブラウザでアクセス確認。IPアドレス部分は自分の環境に合わせて読み替えてください。

http://＜IPアドレス＞:15672/
Jetson　TX2日本語化＋日本語入力の方法（20180921更新）

自分メモなので限定共有でもよかったのですが
やり方を見かけないので
Jetson　TX2を日本語化＋日本語入力追加の方法を記載します

おまけで自分良く使う開発環境関係のライブラリのメモも最後に記載

※△１　20180921（日本語化の設定、日本語入力のセットアップ、おまけを修正）

#日本語化の設定

通常のubuntuのように日本語化します

**※2018年9月21日にjetpackを再インストールし確認したところ**
**　普通にlanguage supportから日本語追加出来ました**
**　ダメな場合は下記の3つのコマンドを実行すると解決するかもしれません**

(1)下記実行

```
$sudo apt-get install aptitude
$sudo aptitude reinstall dbus
$sudo apt autoremove
```

(2)language supportで日本語を追加します
(3)reboot

#update
日本語化ができましたら、とりあえずupdateします

```
$sudo apt-get update
$sudo apt-get upgrade
```

#日本語入力のセットアップ
Mozcをインストールします・・・が・・・
Arm64の呪いでパッケージがないので自分でビルドします
内容は[ここ](http://matoken.org/blog/2017/06/02/ubuntu-16-04-since-there-is-no-mozc-pkg-in-the-aarch64-environment-build-from-source-pkg-to-build/)の内容と同じですが、リンク先が無くなると困るので自分用メモ

(1)キーボードを１０９に変更
※あたりまえですが１０９以外のを使うときは、使うキーボードを選択してください
(2)下記を実行

```
$sudo apt install build-essential devscripts
$sudo apt build-dep fcitx-mozc
$apt source fcitx-mozc
$cd mozc-2.17.2116.102+gitfd0f5b34+dfsg
$cp debian/control debian/control.org
```


(3)debian/controlファイルを開き，必要なパッケージのArchtectureにarm64を追加
何か所かあるので抜けもれなく修正します

```
元の文章
+Architecture: i386 amd64 armel armhf
arm64を追加
+Architecture: i386 amd64 armel armhf arm64
```

(4)ビルドします

```
dpkg-buildpackage -j4 -us -uc
```

(5)作成されたものをインストール

```
sudo apt-get install ../mozc-server_2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1.1_arm64.deb ../mozc-data_2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1.1_all.deb ../fcitx-mozc_2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1.1_arm64.deb ../mozc-utils-gui_2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1.1_arm64.deb
```

(6)reboot

(7)fcitxの指定
$im-config
↑を実行し「fcitx」 を明示的に指定
(8)reboot

(9)入力メソッドの設定
　1)「Fcitx設定」を探し起動
　2)タブを「全体の設定」に
　3)入力メソッドのオンオフで「zenkakuhannkaku」設定

#おまけ
セットアップしたら入れるもののメモ

```
$sudo apt-get install python3-setuptools
$sudo apt-get install python3-pip

$sudo apt-get install python-dev
$sudo apt-get install python3-dev
$sudo apt-get install spyder3
$sudo apt-get install libhdf5-dev hdf5-tools

#ビルドがめんどくさいのでtensolflowはwhlをありがたく使用させていただきます
$sudo pip install tensorflow-1.9.0-cp35-cp35m-linux_aarch64.whl
$sudo pip install keras

#cupyはArm64のため要ビルド、よって下記コマンドでインストール
$sudo pip install cupy
```
OpenCVのインストールは[こちら](https://qiita.com/tom_speed_ltd/items/a63f07997c2f8b3f2b66)
Vue.js＋Firebase+Stripeをさわさわしてみるーその１

久しぶりにプログラミング言語の海をさまよっていると、何やら「Vue」という聞きなれないフレームワークが流行っているのだとか。なんでも、Reactさんがとってもフレンドリーになったイケメンのようなフレームワークだとか。

雑食系としては手を付けないわけにはいきません！というわけで早速さわさわしてみたのでちょっとまとめておきます。

#やること
Vue-cliを使ってアプリケーションを作ってみます。
+ 認証とDBにはFirebaseを採用します。もちろん無料枠で！
+ 外部APIとの連携についてもちょっとトライしてみます。jalanさんとyelpを使いたいと思います。
+ せっかくなんで課金機能もちょちょいと組み込んでみましょう。stripeでいいかな。

開発環境はwindowsにubuntsuのっけてやってます。nodeとnpmが入ればぶっちゃけなんでもOKです。

##ステップ1：vue-cliの準備
まずはnodeとnpmをインストールしましょう。当方のバージョンは以下。

```
$ node -v
v8.11.3

$ npm --v
5.10.0
```

迷ったらここらへんをどうぞ。
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea

続いてvue-cliをインストールしましょう。バージョンは3を使いました。

```
$ npm install -g @vue/cli
$ vue --version
3.0.1
```
ここらへんも参考にしちゃってください。
https://qiita.com/Junpei_Takagi/items/603d44f7885bd6519de2


##ステップ2：早速vueアプリを作りましょう

名前は何でもいいのですが、とにかくアプリケーションをつくりましょう。

```
$ vue create my-app

? Please pick a preset:
  default (babel, eslint)
❯ Manually select features
```

「Manually select features」を選択してください。babelとrouterだけ◎をつけておきます。その他はyesマンで進めましょう！

しばらくするとごにょごにょと画面が動き出します。そして、ノートパソコンのファンの回転数が激上がりします。

```
Vue CLI v3.0.1
✨  Creating project in /ubuntu/vue/app/my-app.
🗃  Initializing git repository...
⚙  Installing CLI plugins. This might take a while...
```

色々インストールしてるので結構時間がかかります。

```
⚓  Running completion hooks...

📄  Generating README.md...

🎉  Successfully created project my-app.
👉  Get started with the following commands:

 $ cd my-app
 $ npm run serve
```

無事作成完了。おめでとうございます！今日はここまでにしておきましょう。
つぎはvueのroute周りをみていきますよー
tsv,csv,jsonの変換

次のようなtsv,csv,jsonを変換するプログラミングをしました。

```:meibo.txt
john	m	18
paul	m	20
alice	f	15
dabid	m	17
jasmin	f	17
```
```:meibo.csv
john,m,18
paul,m,20
alice,f,15
dabid,m,17
jasmin,f,17
```
```:meibo.json
[{"name":"john","gender":"m","age":"18"},
 {"name":"paul","gender":"m","age":"20"},
 {"name":"alice","gender":"f","age":"15"},
 {"name":"dabid","gender":"m","age":"17"},
 {"name":"jasmin","gender":"f","age":"17"}]
```
- tsv→csv

Rubyにはarrayに要素を追加するのに<<でできるんですね、なかなか便利そう。

```ruby:tsv_to_csv.rb
require 'csv'
meibo_array =[]
File.foreach("meibo2.txt") do |line|
  meibo_array << line.chomp.split("\t")
end
CSV.open("meibo2.csv","w") do |csv|
  meibo_array.each do |person|
    csv << person
  end
end
```

- json→tsv

```ruby:json_to_tsv.rb
require 'json'
File.open("meibo.json") do |file|
  hash = JSON.load(file)
  File.open("meibo_from_json.txt","w") do |text|
    hash.each do |person|
      data = [person["name"],person["gender"],person["age"]]
      text.puts(data.join("\t"))
      #text.puts(person.values.join("\t"))
      #キーの順番に依存するのでよくない
    end
  end
end
```
最初はコメントアウトしてあるコードで書いてたんですが、jsonはkeyの順番を保証せず、
{"name":"john","gender":"m","age":"19"} と
 {"name":"john","age":"19","gender":"m"}を区別しないようなので
tsvにする時はkeyをちゃんと指定してあげる必要があるようです。

- tsv→tsv

```ruby:tsv_to_json.rb
require 'json'
File.open("meibo_from_tsv.json","w") do |file|
  keys=["name","gender","age"]
  hash_array=[]
  File.foreach("meibo.txt") do |line|
    array = [keys,line.chomp.split("\t")].transpose
    hash_array << Hash[*array.flatten]
  end
  JSON.dump(hash_array,file)
end
```
これで作ったjsonを見やすく表示するにはjqコマンドを使用するようです。

```
$ jq . meibo_from_tsv.json
```

または

```
$ cat meibo_from_tsv.json | jq
```

今回ので
do |value| 処理 end
の書き方に結構慣れた気がする。

次は標準入出力を使って

```
$ ruby json_to_tsv.rb < meibo.json >meibo.txt
```
のようにして、プログラム内でFile.openしないプログラムを書きます。標準入出力しっかり理解しなきゃ。
ネットワーク内にいるMACアドレスを取得する。

社内で出勤管理したくて、社内ネットワーク内にいるMACアドレスを掻き集めたい。
<h2>
やったこと
</h2>
MACのターミナルで下記を実行

```bash
arp -a
```

おぉ、取れた。

でも、MACアドレスを収集したいのはこのマシンではなく、Linuxをいれたラズパイ。
このコマンド使えない…

なので、下記を実行

```bash
ip n
```

おぉ、取れん…
nはneigh(neighbor：隣の方)の略。
MACでipコマンドを使う場合はインストールが必要。

```bash
brew tap brona/iproute2mac
brew install iproute2mac
```

Homebrewが入ってる前提。

あとはこのコマンドをpythonで実行して結果をリストにいれてぐるぐるしつつsplitすれば…
できると思われる。
私がDoxygenを使う理由

# Doxygenについて
[Doxygen](http://www.doxygen.jp/)についてはリンク先を参照
私が個人的にまとめた[Doxygenチートシート](https://qiita.com/yuta-yoshinaga/items/84887a89f6a21a7dcfd5)も参考までに参照してもらえると幸いです。

## Doxygen言語別出力サンプル
私がGitHubに公開しているプロジェクトの言語別の出力サンプルです
[Java](https://yuta-yoshinaga.github.io/reversijava/)
[PHP](https://yuta-yoshinaga.github.io/reversiphp/)
[C#](https://yuta-yoshinaga.github.io/reversiform/)

## Doxygen言語別設定ファイルサンプル
私がGitHubに公開しているプロジェクトの言語別の設定サンプルです
[Java](https://github.com/yuta-yoshinaga/reversijava/blob/master/Doxygen/Doxyfile.doxy)
[PHP](https://github.com/yuta-yoshinaga/reversiphp/blob/master/Doxygen/Doxyfile.doxy)
[C#](https://github.com/yuta-yoshinaga/reversiform/blob/master/Doxygen/Doxyfile.doxy)

## Doxygenを使うことのメリット
私は仕事で2011年頃からDoxygenを使い始めました。
当時は組み込みソフトウェアエンジニアだったので、C言語でITRONを用いたプログラミングをしていて、社内の同僚がVisual C++で作成したWindows GUIプロジェクトにDoxygenを使用しているのを真似し始めたのがきっかけです。
関数コメントを付けたりつけなかったり、もしくはI/Oの仕様記述方法が人により違ったり、設計資料と整合性がとれていなかったりなどなどの課題があり、`コメントはどうせ書かなければいけないのなら資産になるコメントを書こう`と思い立ったのが使い始めた理由です。
Doxygenを使うことでコメントから設計資料が作成できることが大きなメリットです。

## Javadocなどのコメントと何が違う？
私がGitHubに公開しているプロジェクトのサンプルを見てもらうとわかると思いますが、クラス図やメソッドの呼び出し関係、参照関係などがオプション機能として図で出力できます。
人によってはコーディング規約などの縛りでコメントも自由には記載できないでしょうが、個人的には色々な言語で同一の書き方ができるDoxygenは一度覚えてしまえば学習コストも低く済むのでお勧めです。
ISUCON8に参加して轟沈した話

# ISUCON8に参加して轟沈した話

[ISUCON8][]に参加したのでその時のログ。
まとまりきらないので箇条書きでがっさがっさと残しておきます。

## tl;td;
* ポータルサイトを舐めろ。話はそれからだ。
* 事前準備は大事。
* 取れるデータは一発で全て見ろ

## チームとメンバー(TwitterID)

チーム : typoの達人

* でるた([@0Delta](https://twitter.com/0Delta))
* ディケイド([@akihiro_k2k](https://twitter.com/akihiro_k2k))
* waku([@waku91304284](https://twitter.com/waku91304284))

## やった準備
* slackワークグループを作成してメンバとの会話を集約
* VMを4つほど立ててメンバそれぞれが自習できる環境を用意
* zabbix-grafanaを建ててすぐ監視できるように
* ansible,gitを建ててzabbixインストールとバックアップができるように
* isucon6を軽く解いてみる
* 役割分担

## やった準備(個人)
* 各種メトリクスの取り方を色々試す
* Golang勉強する
    * ついでにpprofが出力するpngをslackに投げるツールを書いた。

## いざ本番、しかし…
* とりあえずGo実装に変更(ディケイド+waku)
    * 公式のマニュアルに気づかず10分ほど自力で探してた。
* 公開鍵を配置、hosts書き換えて相互にsshできるように(でるた)
    * 上手くデプロイする方法が無くて手動...
* ansible-playbookを流して監視スタート、ディレクトリをバックアップして有事に備える(でるた)
    * バックアップに結構時間かかったので、途中からzabbixだけ並行で流す。
    * tag付けて個別実行に備えていたのが効いた
* h2oをnginxに変更 (ディケイド)
* giteaにwebappをデプロイ、以降git管理に(waku)
    * この辺で10:30
* netdata配置(ディケイド)
* pprof配置(でるた+waku)
* デプロイ態勢変更、goバイナリだけ投げるようにした(ディケイド)
    * この辺からデプロイ作業がwakuさん専任になってしまった
* ク○SQLの撲滅開始(waku)
* app.goの高速化開始(でるた)
    * ここで**`getEvents`**の修正を始めてしまったのがマズかった…
* キャッシュ機構追加、があまり効果が出せず(ディケイド)  
-- お昼 --  
* LB挟むと死ねると思われたので、APP+DB の2台体制で挑むことに(でるた)
* ここからしばらくの間ベンチに失敗するように
    * 2台体制にした際に、初期化スクリプトが正常に動かないトラップだった
    * 幸い、`SUZUKI`が悪さしている事は即わかったので手動でリセットしてしばらく回してた
    * 気づいて修正できたのは15:30過ぎた頃
* 並行して高速化を測るが、goぢからの不足により難航……(でるた)
* SQLでハッシュを求めていた所をgoに移動するもスコア上がらず(waku)
* アプリのデプロイ作業をJenkinsおじさんに任せるべく構築(ディケイド)
    * しかしアプリ改修に追われて利用できず…
    * 既に16:00
* そういえばまだ取ってないと思ってSQLのslow_logを取る。(でるた)
    * `getEvents` **ではなく`GetEvent`**が遅い事に気づく
    * これが17:00頃。時既に🍣
* でも諦めるか。ここからgo修正猛ダッシュ(でるた)
    * DBの中のデータと`GetEvent`を見て、次々と湧き上がる疑問と○ソコード。
    * 席数固定だよねこれ？　固定値書いていいよね？！
    * 残席数とか計算で出てくるよね？　席数引くだけだよね？！
* 18:00、間に合うことはなく無事fail

## 反省点
* **何故最初にslow_logを取らなかった**
    * これに尽きる。これさえ行っていれば、無駄な場所を効率化して消耗することはなかった。
* goアプリのデプロイ方法が一人にしかできない状況だった
    * デプロイ方法なら共有できたはず……　事前にスクリプト書いて全員できるようにしておけば楽だった。
* golangちから/デバック環境の不足
    * シンタックスエラーとかはgofmtで検出できたのだが、変数の定義ミスとかは検出できる環境がそろっておらずデプロイ速度が下がってた。
* 最初はマニュアルを読むべきだった -> ポータルサイトを一通り見渡すべきだった。
    * マニュアルに実装の切り替え方法やホストの情報etc、大量のデータが転がっていたが気づけなかった。

## 改善方法
* 事前準備をもっと頑張る
    * 具体的には各種ログのON、集積,ローテートスクリプトまではだいたい共通のハズ。全部Ansibleで投下できればかなりスピードアップできそう。
    * golangのデバック環境を作る。DBを先に入れておいてローカルでアプリが動けばなおよし。
* 競技開始と同時にポータルサイトを全部見る。
    * 環境にログインするのは少し待つ。
* 監視はできるだけ全部一発で見る
    * それぞれ見比べて、どれが一番重いかを踏まえたうえで挑む。
    * 本当のボトルネックを探すのだ。

## やっといてよかったこと
* 役割分担
    * これのおかげで競技開始から午前中あたりまでは各自が独自にもくもくできて効率よかった気がする。
* slackに画像をぶん投げるツールをgoで書いたこと  
    * golangの扱いが大分わかったし、pprofの画像をコピーする手間が省けてかなり楽だった。
    * 競技終了後に気づいたが、 [slackcat](https://qiita.com/tearoom6/items/dfebed94f1efbddd8962)なるツールが既に存在する。先人は偉大である。
<details><summary>こんな感じに投稿される</summary><div>

![slackyomibot.png](https://qiita-image-store.s3.amazonaws.com/0/150591/a5bcc134-edcb-ec57-2511-3fb30155d703.png)
</div></details>


[ISUCON8]:http://isucon.net/archives/52193980.html
jsonってどんなやつ？どうやってくる予定？

requestしてreturnされてきたjsonを受け取ればいいよ。

っていわれても、jsonって
どんなやつなんですか？？
どうやってくるんですか？？？

って、そいつの生い立ちが気になって仕方がない。
それで、今日わかったこと。



```
JSON (JavaScript Object Notation)：軽量のデータ交換フォーマット
どんなやつか：キー・バリュー型（基本的には）
どうやってきたか：HTTPのbody
```

送るときも、受け取るときも、とりあえずjsonってやつはbodyが大好き。

<img width="1071" alt="スクリーンショット 2018-09-19 23.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/283300/87825d8a-0f8c-2d66-1f44-fe8596f2ee8e.png">

Google Chromeの拡張機能「Restlet Client」を使って試してみたら、イメージがつかめました。
React Redux でvalidatorjsを使ったHOC Validationを作る

ソースは以下
https://github.com/ichi944/with-validation/tree/master/src

# 動機

- react-redux でいい感じのバリデーションはないか?
- redux-form -> 覚えることがたくさんありそう(特に他のUIライブラリとの連携など)
- 上記の理由からコンポーネントとして実装されているやつはやめたい
- Laravelに馴染みがあるのでバリデーションルールを同じ感じで書きたい
- VueにはVee-Validateという使いやすいやつがある
- validatorjsというライブラリがあるがインターフェースがいまいちreactっぽくない
- HOCで穏便すればいいのでは


# 実装

かいつまんでいうとwithValidatorでFormをラップすることによって

- Form側にdirty, errorsというメンバーが生える
- makeAllDirty(), makeValidator()メソッドが生える
- HOCするときにオプションを2つ渡す
    - setData: propsからチェックする値を取り出す関数
    - rules: validatorjsに渡すバリデーションルール文字列
- HOC内のcomponentDidUpdate時に対象の値が変更されていればバリデーションを行いFormにerrorsとdirtyを渡す
- Formはerrorsとdirtyの値で適当にメッセージを表示したりなどする
- SubmitのときはmakeValidator()でvalidatorjsのインスタンスが取得できるのでそれでなんとかする


```react
//... 省略
import withValidator from './withValidator';
//... 省略

// Define Form
class Form extends Component {
  //... 省略
  render() {
    const { dirty, errors, email, password, handleChange } = this.props;
    const styles = {
      error: {
        color: 'red',
        fontSize: '0.8em',
      },
    };
    return (
      <div>
        <div>
          <label>email: </label>
          <input
            type="text"
            name="email"
            value={email}
            onChange={handleChange}
          />
          { dirty.email && errors.has('email') ?
            <span style={styles.error}>{errors.first('email')}</span> : null }
        </div>
        <div>
          <label>password: </label>
          <input
            type="password"
            name="password"
            value={password}
            onChange={handleChange}
          />
          { dirty.password && errors.has('password') ?
            <span style={styles.error}>{errors.first('password')}</span> : null }
        </div>
        <div><button onClick={this.handleSubmit}>送信</button></div>
      </div>
    );
  }
}

// Wrapp with Validator
const FormWithValidator = withValidator({
  setData: ({email, password}) => ({
    email,
    password,
  }),
  rules: {
    email: 'required',
    password: 'required|min:8',
  },
})(Form);

// Connect to Store
const mapStateToProps = ({email, password}) => ({
  email,
  password,
});

const mapDispatchToProps = (dispatch) => ({
  handleChange(e) {
    const { name, value } = e.target;
    dispatch({
      type: 'UPDATE_FORM',
      name,
      value,
    });
  }
});

const ConnectedForm = connect(mapStateToProps, mapDispatchToProps)(FormWithValidator);

// Mount
class App extends Component {
  render() {
    return (
      <div>
        <h1>Validator Form</h1>
        <ConnectedForm />
      </div>
    );
  }
}

render(
  <Provider store={store}><App /></Provider>,
  document.querySelector('#app')
);
```

残りはコード参照。
もっと色々できそうではあるのですが、窮屈になってきそうなのでここまでにとどめています。
Python スクレイピング関連のメモ

# Beautiful Soup

### インストール

```
pip install beautifulsoup4
```

* parserについて
  * <https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser>

### 例

```python
from bs4 import BeautifulSoup

soup = BeautifulSoup(open("./index.html", encoding='UTF-8'), "html.parser")

for link in soup.find_all('a'):
    print(link.get('href'))
```

# 正規表現

### インポート

```python
import re
```

### 文字列の先頭でのみのマッチを確認する 

```python
re.match(pattern, string)
```

### 文字列内の位置にかかわらずマッチを確認する (Perl でのデフォルトの挙動) 

```python
re.search(pattern, string)
```

### 判定

* [match-objects](https://docs.python.org/3.6/library/re.html#match-objects) 

> match() と search() はマッチしなかった場合に None を返すので、単純な if ステートメントによってマッチしたかどうかをテストできます

```python
match = re.search(pattern, string)
if match:
    process(match)
```

# Data pretty printer

> pprint モジュールを使うと、Pythonの任意のデータ構造をインタープリタへの入力で使われる形式にして "pretty-print" できます。

```python
import pprint

stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff[:])
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(stuff)
```

# 参考

* [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/)

* [6.2. re — Regular expression operations](https://docs.python.org/3.6/library/re.html#module-re)

* [8.11. pprint — Data pretty printer](https://docs.python.org/3.6/library/pprint.html#module-pprint)
ラズパイの温度を表示できるプログラムを作ってみた

# はじめに
ラズパイはsshで接続し操作したりと遠隔で操作する事が多いと思いますが、様々な人が温度問題で苦しんでいると思います。そこでXserver等で外部からグラフィカルにCPUとGPUの温度を表示させることのできるプログラムを作りました。  

# このプログラムを動かした環境
- python2.7
- Tkinter
- RaspberryPi3 model B
- raspbian

# 使い方
プログラムを実行すると　　
<img width="174" alt="window0.png" src="https://qiita-image-store.s3.amazonaws.com/0/292551/3d837070-fb90-b8e2-3803-ffe5e6c26ddb.png">　　
このようなウィンドウが出てくるので後はボタンをクリックするだけです。  
<img width="175" alt="window1.png" src="https://qiita-image-store.s3.amazonaws.com/0/292551/d3d63d8e-a7c3-9d8b-73b5-c209be6ccc50.png">
　クリックした結果



# 実際に作成したコード

python3系を使用する際はTkinterをすべてtkinterに置換すれば動くと思われます。
検証はしていないので必要な人はやってみてください。
Githubのリンク貼っておきますので是非cloneして使ってください。

- ryo/raspi_temp  https://github.com/ryo1107/raspi_temp

```python:raspi_cpu_gpu_temp.py

    # coding:utf-8
    import os
    import Tkinter

    #make window
    root = Tkinter.Tk()
    root.title(u"RasPi_temp")
    root.geometry("350x50")

    #button push command
    def DeleteEntryValue(event):
        cpu_temp,gpu_temp=Temp_get()
        EditBox.delete(0, Tkinter.END)
        EditBox.insert(Tkinter.END,"    CPU_temp="+str(cpu_temp)+"℃  "+"GPU_temp="+gpu_temp+"℃")

    #get temp
    def Temp_get():
    
        cpu_file="/opt/vc/bin/vcgencmd measure_temp"
        gpu_file="cat /sys/class/thermal/thermal_zone0/temp"

        cpu_line = os.popen(cpu_file).readline().strip()
        gpu_line = os.popen(gpu_file).readline().strip()
        cpu_temp = cpu_line.split('=')[1].split("'")[0]
        gpu_temp = float(gpu_line)/1000

        return cpu_temp,str(gpu_temp)

    #make empty box
    EditBox = Tkinter.Entry(width=35)
    EditBox.insert(Tkinter.END,"")
    EditBox.pack()

    #button setting
    Button = Tkinter.Button(text=u'raspi_temp', width=25)
    Button.bind("<Button-1>",DeleteEntryValue) 

    Button.pack()
    root.mainloop()
```

# さいごに
個人的には初めて使ったTkiterで、初めて作るラズパイのプログラムの割には面白い物が作れたかなと思います。  
今後はいちいちXserverを使用するのは面倒なので、端末やターミナル、コマンドプロンプト等に温度を表示し続けるプログラムも作ってみようかなと思います。
PHP Code SnifferのSniffを自作するにあたって知っておいてよかったこと

前稿で[phpcs-psr4-sniff:クラスがPSR-4に準拠しているかチェックするツールを作った](https://qiita.com/suin/items/f3749d27b740cdbc1f80)という話をしたが、PHP Code SnifferのSniff(プラグイン)を作るのは今回初めてだったので、そこで得た知見を共有したい。

## ディレクトリ構成に決まりがある

* PSR-0のディレクトリ構成でないとならない。(PSR-4はだめ)
* そして、ベンダーネームスペース(下でいう「StandardName」)にruleset.xmlを置かないとならない。
* Sniffsというディレクトリが必要。
* Sniffsディレクトリのは以下はネームスペースで改装を作って良い。
* ファイル名は`Sniff.php`で終わる必要がある。

```
project-name
├── StandardName
│   ├── Sniffs
│   │   └── Classes
│   │   │    └── ClassNameSniff.php
│   │   ├── MyCustomSniff.php
│   ├── ruleset.xml
└── composer.json
```

## テストにはslevomat氏作のTestCaseクラスを使うと楽

作ったSniffの単体テストをPHPUnitで行う場合、PHP Code Sniffer本家の書き方を真似したいところだが、それをしてしまうとテストコードが複雑になってしまう。

そこで、テストにはPHP Code Sniffer界の重鎮(？)である、slevomat氏作の[TestCase](https://github.com/slevomat/coding-standard/blob/master/SlevomatCodingStandard/Sniffs/TestCase.php)クラスを継承するのがおすすめ。テストコードを宣言的に書ける。

## slevomat氏作のヘルパークラスが便利

カスタムSniffは`PHP_CodeSniffer\Sniffs\Sniff`インターフェイスを実装するわけだが、実装に渡ってくる`PHP_CodeSniffer\Files\File`オブジェクトはAPIが低レイヤーなので、解析に必要な情報を取り出すのが大変だ。

それを補うために、slevomat氏が[ヘルパークラスを数多く作ってくれている](https://github.com/slevomat/coding-standard/tree/master/SlevomatCodingStandard/Helpers)ので、それを利用するとコードがすっきりする。

## Packagistで配布するなら`type`は`phpcodesniffer-standard`にする

作ったSniffをPackagistで配布する場合は、`type`を`library`にするのではなく、`phpcodesniffer-standard`にすると良い。

```json:composer.json
{
    "name": "owner/phpcs-standard-name",
    "description": "A set of phpcs sniffs for modern php development.",
    "type": "phpcodesniffer-standard",
}
```

そうしておくと、[Dealerdirect/phpcodesniffer-composer-installer](https://github.com/DealerDirect/phpcodesniffer-composer-installer)を使っているユーザが、あなたのSniffをインストールするとき、あなたのSniffが自動的に`installed_paths`に入るようになる。

## 参考になるブログ記事

* [Creating Sniffs for a PHPCS Standard – Payton.Codes](https://payton.codes/2017/12/15/creating-sniffs-for-a-phpcs-standard/)
    * おすすめ
* [How to Write Custom Sniff for Code Sniffer 3 | Tomas Votruba](https://www.tomasvotruba.cz/blog/2017/07/17/how-to-write-custom-sniff-for-code-sniffer-3/)
    * ただし、EasyCodingStandard向けに書かれているので全部は参考にならない

## 参考になるカスタムSniffリポジトリ

* [suin/phpcs-psr4-sniff](https://github.com/suin/phpcs-psr4-sniff)
    * 手前味噌だがSniffがひとつしかないリポジトリなので参考になるかも
* [bmitch/Codor](https://github.com/bmitch/Codor)
    * 比較的シンプルなので参考になった
* [slevomat/coding-standard](https://github.com/slevomat/coding-standard)
* [object-calisthenics/phpcs-calisthenics-rules](https://github.com/object-calisthenics/phpcs-calisthenics-rules)

__あまり参考にならないリポジトリ__

* [Symplify/CodingStandard](https://github.com/Symplify/CodingStandard)
    * phpcsではなくEasyCondingStandardというツール向けに実装されているため参考にならない
PILによる画像リサイズ＆イコライズ

画像処理のイコライジングメモ。

```PIL_test.py
from PIL import Image
from PIL import ImageOps
import numpy as np

#画像ファイルオープン
fpath = "./main.jpg"
imgorig = Image.open(fpath)

#リサイズ
imgresize = imgorig.resize((256,256), Image.NEAREST	)

#平均化
img2 = ImageOps.equalize(imgresize)

#numpy配列へ
arr = np.array(img2)
print(arr)

#平均化前後を表示
imgresize.show()
img2.show()

```
こんな感じ
![スクリーンショット_2018-09-19_22-34-08.png](https://qiita-image-store.s3.amazonaws.com/0/283529/b0053688-2e51-62e4-188a-df490fc6281f.png)
vSphere Web Client6.0で仮想マシンにローカルのisoイメージをマウントする

#課題
今回直面した問題は、以下の通り。
**「vSphere Web Client6.0では、ローカルディスクに置いているisoイメージを仮想マシンにマウントできない」**
これまで、普段の業務はvSphere Web Clientを用いて行い、ローカルにあるisoファイルを仮想マシンにマウントするときだけvSphere Clientのコンソール画面から作業していた。
（※デフォルトでは、[vSphere Web ClientでローカルのisoファイルをVMにマウントできない](https://kb.vmware.com/articleview?docid=2114139&lang=ja)）

しかし、vSphere ClientとvSphere Web Clientを行ったり来たりするのはめんどくさいので、自分自身の作業を全てvSphere Web Clientで完結できるようにした。

#環境
環境は、クローズドで構築している。
- vSphere Web Client 6.0.0
- ESXiバージョン 6.0.0 
- VCSAバージョン 6.0.0
- VMRC 10.0.2
- VMバージョン 11


#解決方法
###①スタンドアロンVMRC(VMware Remote Console)をVCSA環境にインストールする
私はWindows環境でvSphere Web Clientを用いているので、VMRCのWindows版を以下のページよりダウンロードした。

【VMRCダウンロード】
https://my.vmware.com/ja/web/vmware/details?downloadGroup=VMRC1003&productId=742#product_downloads
※Windows版以外にも、Mac・Linux版をインストールすることが可能。

VMRCのダウンロードが完了したら、アプリケーションを実行しデフォルト設定のままインストールを完了させる。

###②USBコントローラを仮想マシンに追加する
VMRCを使い始める前に以下の設定をする必要がある。
リモートコンソール画面では、自分の端末のマウスと仮想マシンのマウスが全くというほど合わない。仮想環境のマウスがすぐぶっ飛んでしまうので、VMに「USBコントローラ」が追加されているか確認する必要がある。

【変更方法】
対象VM右クリック>設定の編集>デバイス追加でUSBコントローラを選択
※USBコントローラは2.0と3.0があるが、どちらでも問題なし。

※VMware toolsが既にインストールされているVMであればマウス操作に不自由を感じることはない。（実際に確認済み）しかし、VMを新規作成した場合はVMware toolsが入っていないので、ゲストOSをインストールする作業を行うときはUBSコントローラを追加しておくと便利だと思う。

###③VMRCを起動させる
リモートコンソールを使用するVMのサマリタブを開き、画面中央部の「リモートコンソールを起動する」をクリックすると別画面でVMRCが起動する。

###④ローカルisoイメージをマウントする
この作業は仮想マシンがパワーオンでないとできないので、事前に電源状態を確認しておく。

【isoイメージマウント手順】
VMRCを起動>画面上部のVMRCをクリック>取外し可能デバイス>CD/DVDドライブ> ディスクイメージファイル (iso)>isoイメージマウントする

- ゲストOS上で使用するisoイメージの場合：ゲストOSにログインしてイメージがマウントされているか確認する。
- OSイメージをマウントした場合：VMにisoイメージをマウントしただけでは自動的にブートしないので、一度コンソール画面で[Enter]を押すとisoブートが開始する。

通常のコンソール画面より、操作しやすいので使ってみる価値ありだと思う。
MySQLのデータベースを作成する

記載内容は、Version：8.0.12で確認したものです。


##1. データベースを作成する 
まずデータベースを作成します。
作成する際は、CREATE DATABASE文を使います。
'DB'の部分にデータベース名を入力します。

```ruby:データベースの作成
mysql> create database DB;
```
DBという名称のデータベースが作成されます。
作成したデータベースの確認はSHOW DATABASES文を使います。

```ruby:データベースの確認
mysql> show databases;
```
作成済みのデータベースの一覧が表示されます。

##2. テーブルを作成する
次にテーブルを作成します。
作成する際は、CREATE TABLE文を使います。
'TABLE01'の部分にテーブル名を入力します。

```ruby:テーブルの作成
mysql> create table TABLE01;
```

TABLE01という名称のテーブルが作成されます。
作成したテーブルの確認はSHOW TABLES文を使います。

```ruby:データベースの確認
mysql> show tables ;
```

##３. データを追加する
データの追加は、データベースへ接続
phpcs-psr4-sniff:クラスがPSR-4に準拠しているかチェックするツールを作った

PSR-4(Autoloader)はPHPのクラスをファイルパスからオートロードするための規約だ。今回はクラスがPSR-4に準拠しているかを、自動的にチェックしてくれるツールを作った。(といっても、[PHP Code Sniffer]のSniffを書いただけだが)PSR-4でオートロードできないクラスがあると以下図のように警告してくれる。

<img width="717" alt="demo.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7f94d863-8678-0318-4ae7-2b34e70b7411.png">

## 作ったもの

:octocat: [suin/phpcs-psr4-sniff: PHP_CodeSniffer sniff that checks class name matches PSR-4 project structure.](https://github.com/suin/phpcs-psr4-sniff)

## なぜ作ったか？

テストコードを含めて2,700クラスくらいある、やや大きめのプロジェクトのコードレビューをしていたのだが、PSR-4非準拠のクラスが紛れ込むことがあった。典型的なパターンとしては:

* テストクラスの名前空間が間違っている
    * テストクラスはPHPUnitでロードされるため、PSR-4非準拠でも動いてしまうから気づきにくい
    * これが結構多い。
* 大文字小文字が合っていない (PSR-4で大文字小文字区別が必須)
    * プロダクション環境がLinuxなので、大文字小文字が一致していないとオートロードが失敗するが、開発環境がMac/Windowsなので開発時は気づかない
    * たまにある。

人力のコードレビューでは発見しつくせないことがあったため、CIでチェックする必要が出てきた。

### 既存で類似のツールがあるがなぜ作ったか？

既存の類似ツールとして、PHP-CS-Fixerの[Psr4Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/master/src/Fixer/Basic/Psr4Fixer.php)があるが、これはファイル名とクラス名のチェックをしてくれるだけで、名前空間までは見てくれない。ディレクトリ構成と名前空間が一致していることをチェックするツールが必要だった。

他に、[SlevomatCodingStandard.Files.TypeNameMatchesFileName]という類似ツールがあり、これはクラスがPSR-0/PSR-4に準拠しているかチェックしてくれる。当初はこれを使おうとしていたが、いざ導入してみるとチェックされないクラスがあったり、PSR-4のプロジェクト構造をXMLで表現しないとならなかったりと問題があった。

[SlevomatCodingStandard.Files.TypeNameMatchesFileName]: https://github.com/slevomat/coding-standard#slevomatcodingstandardfilestypenamematchesfilename

## 特徴

### classだけでなく、interfaceやtraitもチェックできる

当たり前だが、classだけでなく、interfaceやtraitもチェックできる。

### クラス名だけでなく、名前空間もチェックできる

これも当然できる。

### 複雑な設定が不要

composer.jsonのautoload.psr-4の設定を読み取るので、このチェックツールのために名前空間プレフィックスとベースディレクトリの対応付けをいちいち書かなくて良い。

## インストール方法

```
composer require --dev suin/phpcs-psr4-sniff
```

## 使い方

PHP Code Snifferの設定ファイル(phpcs.xmlやphpcs.xml.distなど)を作る:

```xml:phpcs.xml
<?xml version="1.0"?>
<ruleset name="My Project">
    <!-- プロジェクトルートへの相対パス。大抵はプロジェクトルートにphpcs.xmlを置くのでドットで良い -->
    <arg name="basepath" value="."/>

    <!-- phpcs.xmlから見たphpcs-psr4-sniffのruleset.xmlへの相対パス -->
    <rule ref="vendor/suin/phpcs-psr4-sniff/src/Suin"/>

    <!-- 任意の設定: もし何らかの理由でbasepathにcomposer.jsonが置いてない場合、basepathからの相対パスでcomposer.jsonの位置を指定する必要がある -->
    <rule ref="Suin.Classes.PSR4">
        <properties>
            <property name="composerJsonPath" value="sub-dir/composer.json"/>
        </properties>
    </rule>
</ruleset>
```

それをphpcsコマンドで実行する:

```
vendor/bin/phpcs src
```


[PHP Code Sniffer]: https://github.com/squizlabs/PHP_CodeSniffer

## 所感

* 初めてPHP Code SnifferのSniff(プラグイン)を書きましたが、設計が思ったよりレガシーでちょっと大変でした:joy:。ちなみに学びはこちらにまとめました。[PHP Code SnifferのSniffを自作するにあたって知っておいてよかったこと - Qiita](https://qiita.com/suin/items/34393032bb5f4cf49cbb)
Task.Runでクロージャを使うと意図しない挙動を取ることがある(追記あり)

#どー言うことか

```cs

static void Main(string[] args)
{
	for (int i = 0; i < 10; i++)
	{
		Task.Run(()=> Console.WriteLine(i));
	}

	Console.ReadLine();

}

```

こんな風に書いたら

```
6
10
5
8
5
10
8
8
6
5
```

こんな結果になった。

#なぜこんなことが起きたのか

一見すれば、上記のコードは`Task.Run`メソッドは同期的に実行される`i`も、問題なくインクリメントしていくように見えるが、実際は予想できない結果になった。
これは、`Task.Run`メソッド内で`i`をキャプチャしてるので、クロージャになっている。そのため、以下のように展開されてしまっているのだ。

```cs

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
	public class Program
	{
		private class Anonymous
		{
			public int i;

			public void Proc()
			{
				Console.WriteLine(i);
			}
		}

		static void Main(string[] args)
		{

				var anony = new Anonymous();

			for (int i = 0; i < 10; i++)
			{
				anony.i = i;
				Task.Run(anony.Proc);
			}

			Console.ReadLine();

		}
	}
}

```

このように、匿名クラスのフィールドへいったん1度代入して、その後にそのフィールドをコンソールへ出力する形となる。
なので、従って、`anony.i`の更新と、Task内での`Console.WriteLine`の実行が制御されることなく行われるので、意図しない予見不可能な結果となる。

#わーくあらうんど(追記)

何も難しいこと考えずに、@munielさんや、[@acple](https://twitter.com/acple/status/1042408608300843008)さんから頂いたご指摘の通り、
下記のように、ループブロック内で一時変数に代入すれば解決が出来る。

```cs

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
	public class Program
	{
		static void Main(string[] args)
		{

			for (int i = 0; i < 10; i++)
			{
				var tmp = i;
				Task.Run(() => Console.WriteLine(tmp));
			}
			Console.ReadLine();
		}
	}
}

```

##これが問題なく動く理由

なぜ一時変数に代入することで、問題なく動くようになったのかはデコンパイル結果を見ればわかる。
下記は、デコンパイルした結果を再構成したソース。

```cs

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
	public class Program
	{
		class Anonymous
		{
			public int tmp;

			public void Proc()
			{
				Console.WriteLine(tmp);
			}
		}
		static void Main(string[] args)
		{

			for (int i = 0; i < 10; i++)
			{
				var anonymous=new Anonymous();
				anonymous.tmp = i;
				Task.Run(anonymous.Proc);
			}
			Console.ReadLine();
		}
	}
}



```

最初と異なり、匿名クラスのインスタンスが、ループ毎に作成されそのフィールドに値が代入されて`Proc`メソッドが呼ばれる。
従って、Procが見ている`tmp`フィールドは実行されるタスク毎に独立する形となり、齟齬無く実行されることになる。

但し、匿名クラスがループ毎に作成されると言うことはループの数が大きい場合、GCが走りまくってパフォーマンスが悪化する恐れがあることは
意識しておかないとマズいかも知れない。



##まとめ

λの中でクロージャを使用した場合、大体は意図通りに動くけど、時として上記のようにぱっと見、意図通り動くはずのものが動かないことがある。
なので、クロージャを試用したときはその変数はローカル変数とは別の性質を持つと言うことを意識する必要があると思う。

また、ワークアラウンドのご指摘を頂いた@munielさんや、[@acple](https://twitter.com/acple/status/1042408608300843008)さん
有り難うございました!
VSCodeでC言語を実行

# はじめに
VSCodeで、ctrl + shift + bでコンパイル + 実行をさせる方法
見栄えはあまりよくないです
毎回忘れるので、自分用のメモです


#　前提条件
VSCode インストール済み
MinGW pathを通してある

# 手順

1. 適当なC言語のソースコードを保存
2. ctrl + shift + b を押す
3. ビルドタスクをがないといわれる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183842/e67635b2-cdd5-c98a-7020-ea4f8fa2f7bc.png)
4. ビルドタスク(task.json)を作るかと言われる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183842/a5857c9c-1c8a-b894-4e6f-aaa224367db6.png)
5. 一番下のその他を選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183842/f01e79e0-3ca7-7db7-ca44-47be99861b9b.png)
6. task.jsonができるので、以下のものをコピペする

```json:task.json
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "c",
      "type": "shell",
      "command": "gcc",
      "args": [
        "${file}",
        "-o",
        "main.exe",
        "\n",
        "./main.exe"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}
```

7.`ctrl + shift + b`を押してcを選ぶ
[Unity]オブジェクトをドラッグで移動させる

#概要
オブジェクトをドラッグで動かす。
![50hob-ka647.gif](https://qiita-image-store.s3.amazonaws.com/0/113502/279375fa-6d64-6a30-ddbb-57684a0e4e37.gif)


###対象
3DなゲームオブジェクトかつColliderがあるもの

#コード
```C#:MovableBox.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovableBox : MonoBehaviour {

	private Vector3 moveTo;

	private bool beRay = false;

	// Use this for initialization
	void Start () {
		camera = Camera.main;
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetMouseButtonDown(0)) {
			RayCheck();
		}

		if (beRay) {
			MovePoisition();
		}

		if (Input.GetMouseButtonUp(0)) {
			beRay = false;
		}
	}

	private void RayCheck() {
		Ray ray = new Ray();
		RaycastHit hit = new RaycastHit();
		ray = Camera.main.ScreenPointToRay(Input.mousePosition);

		if (Physics.Raycast(ray.origin, ray.direction, out hit, Mathf.Infinity) && hit.collider == gameObject.GetComponent<Collider>()) {
			beRay = true;
		} else {
			beRay = false;
		}

	}

	private void MovePoisition() {

		Vector3 mousePos = Input.mousePosition;
		mousePos.z = 10;

		moveTo = Camera.main.ScreenToWorldPoint(mousePos);
		transform.position = moveTo;

	}
}


```

#解説

###Ray
ある点からある点まで光線のようなものを飛ばして、それに何か当たったかを検知するもの。これが無いとドラックではなく瞬間移動してマウスの場所まで行く。

###mousePos
Input.mousePositionでマウス自体の座標は取れるが、それではUnityの3D座標にはならないので、z座標を変え、ScreenToWorldPointで検出できる座標にしている。

###moveToPos
現状では(マウスのx,マウスのy,0)に移動するので、z座標を書き換えるときはmoveToPos.z=値というように指定する必要がある。