OmniAICreator/Qiita-1.07M huggingface dataset:
なにはともあれ、ロジスティック回帰で機械学習してみる

# 概要

有名なアヤメのデータをもとにしてアヤメの種類を推測するモデルを作成して、
実際にどの程度、正確に予測できるのかを確認する。

# 前提
- 必要なモジュールはimport済み。

```python

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import  metrics
```

# やっていく
## アヤメのデータを読み込んで、トレーニング用とテスト用に分ける

```python
iris_data = load_iris()
X = iris_data.data
Y = iris_data.target
```

データの中身はこんな感じ

- iris_data  
dataとしてがく片や花弁の長さ(*Length)と幅(*Width)が入っていて、  
targetとしてアヤメの種類(Species)が載っている。

```python
{'data': array([[5.1, 3.5, 1.4, 0.2],
        [4.9, 3. , 1.4, 0.2],
        [4.7, 3.2, 1.3, 0.2],
        [4.6, 3.1, 1.5, 0.2],
        [5. , 3.6, 1.4, 0.2],
        [5.4, 3.9, 1.7, 0.4],
        [4.6, 3.4, 1.4, 0.3],
(中略)
'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
(後略)
```

Xにはdataのみが、Yにはtargetのみが入っている。


## モデルを作る

```python
# インスタンスを作る
logreg = LogisticRegression()

# トレーニング用のデータとテスト用のデータにXとYを分ける。
# test_size=0.4はテストようにデータの4割を確保するということ。
# random_state=3 はデータを分けるときの乱数の種を固定にします。
# (test_sizeのパラメータを変えても分け方が一緒なのでどう変わるのかわかりやすいかも。)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.4, random_state=3)

# モデルを作る。
logreg.fit(X_train, Y_train)

# モデルを使ってテスト用のXからYを予想する。
Y_pred = logreg.predict(X_test)

# Y_test と Y_pred の値を比べてどれくらい正しく推測できたか確認する
metrics.accuracy_score(Y_test, Y_pred)
```

`metrics.accuracy_score(Y_test, Y_pred)` の結果が
*0.9333333333333333* で9割3分くらいは正しく推測できていました。
git初心者デザイナー向けSourceTreeの使い方2019（図説付き）for MAC part2

# はじめに
超初心者向けです。とりあえず使えるようになる情報しか記載しません。
実作業（ブランチ切る〜マージする）編です。

# 1. ブランチを新規作成する（ブランチを切る）
(1-1)「ブランチ」ボタンを押下。
(1-2)のウィンドウが開く。
(1-3)にブランチ名を入力すし（※日本語は不可！！）「チェック」の項目にチェックが入っているか確認。
(1-4)「ブランチを作成」のボタンを押下。
![1_branch_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/a386f039-d3b5-d13f-5579-ba8781dc4746.png)
ブランチ作成と同時に作成したブランチに移動（チェックアウト）した状態になる↓
![1_branch_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/bb5f4cc6-15b1-39d0-f79f-5783cbe6cdf4.png)

# 2. 修正・変更作業〜コミットボタンを押下
(2-1)各種エディタで変更を加えるとSourceTree側に変更内容が表示される。
(2-1)'変更内容の詳細も表示されるので、さらっと確認。
(2-2)左上の「コミット」ボタンを押下。
![2_edit_code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/b3122954-4fb0-b348-9ad0-9b4c9ec08f3a.png)

# 3. コミットする
(3-1)コメント記入欄が表示されるので、コメントを記入する。
※後々、履歴を検索する時にヒットしやすいコメントを意識して記入するのがおすすめ。

あわせて、変更ファイルの一覧や変更内容詳細が表示されるので、さらっと確認する。
**コメント記入欄下の「コミットをただちに〜プッシュする」にはチェックを入れない！！**
（慣れない内は事故を起こしやすい為。）

(3-2)右下のボタン押下。（コミット完了）
![3_commit_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/35cb3d31-0066-43df-1692-24ad090071c6.png)
コミット完了後の画面↓
![3_commit_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/a30f5262-a468-e4cf-d047-f7a567ff6c80.png)

# 4. プッシュする
(4-1)左上の「プッシュ」ボタンを押下。
(4-2)のウィンドウが開くので、作業ブランチにのみチェックする。
**※masterは絶対チェック入れない**（他諸々、プロジェクト単位で要確認）

「すべてのタグをプッシュする」はタグを作らなければスルーで可。気になる場合はチェックを外す。
（初心者はタグは作らない！と思っておくのが良いです）

内容を確認して右下の「OK」ボタンをクリック。
![4_push_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/09c0522c-60a5-3321-13b5-8774871ae307.png)
プッシュ完了後の画面↓
![4_push_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/a9bc8819-bda6-fc57-4c72-0f5c08d44eef.png)

# 5. マージリクエストを作成（gitlab ver）
SourceTreeから離れます。
お好みのブラウザで対象プロジェクトのページを開く。
(5-1)左メニューの　Repository > Branches と選択し、ブランチ一覧のページを表示する。
（左メニューがない場合はブラウザの幅を広げてみる）
(5-2)対象ブランチの「Merge request」のボタンを押下。
![5_merge_request_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/784153a2-0b30-cef4-ad07-712f7ba9ca1b.png)
(5-3)タイトルテキストの入力（任意）
(5-4)コメントの入力（任意）
他、念の為、ブランチ名、マージ先ブランチのチェックをする。
(5-5)緑のボタンを押下。（マージリクエストの完了）
![5_merge_request_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/e331eb61-0f53-50c1-499e-765559b67a69.png)

# 6. マージする
* 自分以外の作業ブランチをマージする場合、コードの添削（コードレビュー）もできるだけ行ってください。
* 複数人の修正箇所が重複（コンフリクト）していると修正するまで押せません。
* 「Delete source branch」にチェックを入れて、不要なブランチは削除してください。

(6-1)緑の「Merge」ボタンを押下でマージ完了。

※以下の画面が表示されない方は権限がない（と思う）ので、権限ある方にマージしてもらってください。
![6_merge_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/c4c22c3e-2685-335c-e5a3-efcf21867c27.png)

part 1 ↓
[git初心者デザイナー向けSourceTreeの使い方2019（図説付き）for MAC](https://qiita.com/tsukapin/items/c0c7d8654634c19af625)
gasで作ったslackbotにDMすると匿名化されてチャンネルに投稿されるのを作った

以前に書いた[ライブラリを使わずgasだけで作るオウム返しするslack botの作り方](https://qiita.com/y-murata/items/0d41eddf09bc17f5af86) とほとんど同じ作りです。

# 作り方

- `Google Drive>新規>その他>google apps script`から無題のプロジェクトを作成
- 下記スクリプトをコピペ
- `公開`に関しては[以前作成したqiita](https://qiita.com/y-murata/items/0d41eddf09bc17f5af86)をご覧ください。

```js
function doPost(e) {
  var postData = JSON.parse(e.postData.getDataAsString());

  // Event Subscriptionsに必要な部分
  if(postData.type == 'url_verification') {
    return ContentService.createTextOutput(postData.challenge);
  } else if (
    postData.event.channel_type == 'im'
  ) {
    return reply(postData);
  }
  
  return 0;
}

function reply(postData){
  // Incoming WebhooksのURL
  var slackUrl = 'Incoming WebhooksのURL';

  var messageData = {
    'text': text
  };

  var options = {
    'method'  : 'POST',
    'headers' : {'Content-type': 'application/json'},
    'payload' : JSON.stringify(messageData)
  };

  return UrlFetchApp.fetch(slackUrl, options); 
}
```
- Event Subscriptionsの設定
  - `Add Workspace Event`と`Add Bot User Event`の設定は下記の様に設定
<img width="699" alt="スクリーンショット 2019-08-20 14.33.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120339/0e5dddda-83ae-243c-47a4-25655ed88555.png">

# 使い方

このBOT相手にDMを送ることで、Incoming Webhooksに指定したチャンネルへ匿名化されて投稿されます。
Redux Formのdecoratorで受け取れるpropsについて

Udemyの「[フロントエンドエンジニアのための React ・ Redux アプリケーション開発入門](https://www.udemy.com/react-application-development/)」から引用しています。

表題のとおり、デコレートすることで受け取れるpropsについてです。

## importとexportの設定

まずはredux-formの設定を行います。

``` javascript:hoge.js
import React, { Component } from 'react';
import { reduxForm } from 'redux-form';

class hoge extends Component {
 constructor(props) {
  super(props);
 }
}

export default reduxForm({ form: 'hogeForm' })(hoge);
```
これで`hoge`componentのpropsにredux-formが提供するpropsを受け取れるようになりました。
そのなかで今回説明するpropsは下記になります。

- handleSubmit
- pristine
- submitting
- invalid

## handleSubmit

文字通りsubmitをしたときにinputのvalueを引数で取得できるpropsです。
設定は下記のようになります。

``` javascript:hoge.js
class hoge extends Component {
 constructor(props) {
  super(props);
  this.onSubmit = this.onSubmit.bind(this);
 }
 
 onSubmit（values） {
  // valuesが各inputのvalue
 }
 
 render() {
  const { handleSubmit } = this.props;
  return (
   <form onSubmit={handleSubmit(this.onSubmit)}>
   </form>
  ) 
 }
}
```

## pristine

フォームに入力されるとfalseを返す。
送信ボタンの活性化/非活性化するときに使用。

``` javascript:hoge.js
class hoge extends Component {
 render() {
  const { pristine } = this.props;
  return (
   <form onSubmit={handleSubmit(this.onSubmit)}>
    <input type="submit" value="Submit" disabled={pristine} />
   </form>
  ) 
 }
}
```

## submitting

フォームのSubmitボタンを押下するとtrueを返す。複数回連続で押下できるのを回避。
上記の`pristine`を併用して、送信ボタンの活性化/非活性化するときに使用。


## invalid

validate errorがあるときはtrueになる。
上記の`pristine`と`submitting`を併用して、送信ボタンの活性化/非活性化するときに使用。

``` javascript:hoge.js
class hoge extends Component {
 render() {
  const { handleSubmit, pristine, submitting, invalid } = this.props;
  return (
   <form onSubmit={handleSubmit(this.onSubmit)}>
    <input type="submit" value="Submit" disabled={pristine || submitting || invalid} />
   </form>
  ) 
 }
}
```

以上になります。
Nuxt で全てのページで index.html をルーティングの対象にする方法

1. Nuxt は vue-router をつかってルーティングしている
2. vue-router は `alias` つかって対象のパスをルーティングに追加できる
3. `nuxt.config.js` の `extendRoutes` で vue-router のルーティングを変更できる

ということをふまえて、 `extendRoutes` をつかって全ての route に `index.html` を付与した `alias` を追加することで実現できました。

```js:nuxt.config.js
import { resolve } from 'path'

const nuxtConfig = {
  router: {
    extendRoutes(routes, resolve) {
      for (const route of routes) {
        route.alias = resolve(route.path, 'index.html')
      }
    }
  }
}
```

## 参考
[vue-router の alias について](https://router.vuejs.org/ja/guide/essentials/redirect-and-alias.html#%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)
[extendroutes について](https://ja.nuxtjs.org/api/configuration-router/#extendroutes)
[React Native] upgrade-helperが便利

以前、React Native製アプリの React Nativeのバージョンアップに関する[記事](https://qiita.com/sekitaka_1214/items/4e0fb73586a008c9887e)を書きました。
そして今回0.59.8から0.60.5にバージョンアップしようとしたところ、リリースノートに見慣れないこんな表示がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18273/8e9c2038-64af-12f7-d956-23a9debf3962.png)

どうやらアップグレード用のサポートツールが出来たらしい。
URLはこれです。
 https://react-native-community.github.io/upgrade-helper/

アクセスしてみると、現在のバージョンと上げたいバージョンの差分が見れるようです。
rn-diffが公式に作られたようなイメージですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18273/f8df968c-b68f-e49c-f29d-5101ceec6c83.png)

これで以前書いた記事の「スケルトンとの比較」の部分の確認が簡単になりそうです。
ペコビジョンでプロジェクションマッピングやってみた

## 前書き

プロジェクションマッピングがカッコイイので試してみたい。
無料で試せないかな。20分位でできた。
![ezgif-4-ae490521e5d4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/60c22536-9419-3291-d9df-6e984c4476d2.gif)

## 必要機材

* PC
    * ソフト：ペコビジョンmore
    * ソフト：adobe air
* プロジェクター
* 箱

## 試した

### 1.ペコビジョンmoreをPCにインストールする。
http://pecovision.hara-peco.com/more/

無料のペコビジョンもあるみたいだけど、紹介ページの「INSTALL NOW」ボタンが見当たらなかったので、
有料のペコビジョンmoreの7日体験版で試してみた。

ペコビジョンは簡単で、「選んで・貼って・遊ぶだけ！」

### 2.素材を選ぶ

[![ペコビジョンの紹介映像](http://img.youtube.com/vi/lq5U3087jJQ/0.jpg)](http://www.youtube.com/watch?v=lq5U3087jJQ)

動画の通り、素材を選んでドラッグ＆ドロップでセット。体験版では２つまでセットできます。
1個目. WEB CAMERA
2個目. FILE.    ←ここにmp4形式の動画をドラッグ＆ドロップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/49e417e0-be3f-c87f-cc67-d932dc0a6366.png)

### 3.プロジェクターと箱を置く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/7af39414-4ed8-d65c-4679-e76c4c930149.png)

* この画面になったら、プロジェクターをつなぐ
    * 箱に投影するので、下向きになるよう、なんか後ろにはさむ。今回はセロハンテープ。
* 投影先の箱を置く
    * 素材を２つ投影するので、箱は２つの面がプロジェクターに投影されるように置く。
    * 箱（=木工室の椅子）で面が１つしかなかったため、自作PCの側面鉄板を置いてみた。

こんな感じになった。
![IMG_3252.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/2b277083-bb52-aea3-f594-9e8e16ef66d9.jpeg)

### 4.投影しながら設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/d5759215-bcde-a18d-16e3-60ba5547dcce.png)

こんな画面になるので、投影しながら、プロジェクターを前後させたり箱を前後させたりしながら、設定する。
初期はコントロールポイント（青●黄●）が多いため、キーボードの↓で減らす。

減らした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/390b8716-7cd7-20e4-d974-54a5c90094f5.png)

それで箱に対して、素材を合わせあげるとこうなった。
![IMG_3249.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/75de404d-0bbe-3293-0530-92a9399ebce9.jpeg)
![IMG_3251.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/75f2bce8-bf4b-15c4-3185-2fb5dea1b113.jpeg)

気軽にできた。
Mac上でanyenvのnodenvで管理しているnpmで入れたモジュールにパスを通す

### この記事を書いたきっかけ：

Node.jsをnodebrewで管理していたのをやめ、anyenv経由で入れたnodenvでインストールし直したが、npmでグローバルインストールしたモジュールにアクセスできなくて困ったから

**参考： nodebrew管理からnodenv管理への移行ははこちらを参考に行いました**

- [node、npmのコマンドの場所がわけわからなくなってたのでnodenvで整理した](https://qiita.com/ttokdev/items/be675ac7bee0109db986)
- [nodenv を使って Mac に Node.js の環境を構築する](https://qiita.com/1000ch/items/41ea7caffe8c42c5211c)

注意：上記記事ではanyenvではなく、`git`経由でnodenvがクローンされています。anyenv経由でnodenvをインストールする方法も調べると出てきます。

#### 前提

- Node.jsをanyenvのnodenvで管理している
  - nodenvのバージョン： `1.1.2-1-g18489d7`
  - Node.jsのバージョン： `9.11.1`
  - npmのバージョン： `5.6.0`

## 実際の手順

作業の順番に沿って説明します。

### npmがnodenvで管理されたNode.jsのものであることを確認する
nodenvでのNode.jsのインストールは完了していると考えます。
Node.jsをインストールした際に自動的にnpmもインストールされています。

npmがnodenvで管理されたNode.jsのものであることを確認します↓

```bash
$ which npm
/Users/{your_user_name}/.anyenv/envs/nodenv/shims/npm
```
`/usr/local/bin`などが表示された場合、nodebrewなどを利用してインストールされていると思われます。

### npmのパスが通らない場合

`.bash_profile`に以下の記述を追加します。
zshを使用している場合は書き込み先を `.zshrc`にするなど、適宜読み替えてください。

- 方法1: ファイルに直接追記する

```bash:bash_profile
export PATH="$HOME/.anyenv/envs/nodenv/bin:$PATH"
```

- 方法2: echoする

```bash
$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile
```

- 更新する（方法1,2共通）

```bash
$ source ~/.bash_profile
```

では、このnodenv配下のnpmでモジュールをグローバルインストールします。

### どのNode.jsのnpmか確認する

npmでグローバルインストールする対象のNode.jsが何か、念のため確認します。
nodenvで複数の環境を管理している場合は特に注意です。

- nodenvでNode.jsのバージョン管理をしているか確認する

```bash
# インストール済みのNode.jsバージョン一覧
$ nodenv versions
8.11.1
* 9.11.1 (set by /Users/{your_user_name}/.anyenv/envs/nodenv/version)
```

ローカル環境のNode.jsを参照している場合、参照先のファイルが `$ nodenv local {バージョン番号}`実行時に作成されたファイル `.node_version`になります。

```bash
$ nodenv versions
* 8.11.1 (set by /{where_your_locally_set_node_is}/.node-version)
9.11.1
```

#### グローバルバージョンを設定する場合

```bash
$ nodenv global {バージョン番号}
```

#### ローカル環境のNode.jsバージョンを設定する場合

```bash
$ nodenv local {バージョン番号}
```
`.node_version` というファイルが作成され、nodenvがローカルバージョンを認識できるようになります。

### npmでモジュールをグローバルインストールする

今回は例として `aws-cdk`というモジュールをインストールしようとしていますが、適宜読み替えてください。

- npmで `aws-cdk`をグローバルインストールする
 
```bash
$ npm install -g aws-cdk
/Users/{your_user_name}/.anyenv/envs/nodenv/versions/9.11.1/bin/cdk -> /Users/{your_user_name}/.anyenv/envs/nodenv/versions/9.11.1/lib/node_modules/aws-cdk/bin/cdk
+ aws-cdk@1.4.0
updated 1 package in 10s
```
インストールできたっぽいです。


### モジュールのコマンドを確認する

```bash

$ cdk
-bash: cdk: command not found
# そんなコマンドねえよと怒られます

$ which cdk
# 反応なし
```

はい、通っていません。

**追記：fifnel様からコメントでご指摘いただいた内容に修正しています**

- 以下のコマンドを実行する

```bash
$ nodenv rehash
```

>
~/.anyenv/envs/nodenv/shims/ 以下に実行ファイルがコピーされてそのまま使えるようになるみたいです (手元では確認済)
以下、nodenv 1.3.2 のヘルプより
rehash Rehash nodenv shims (run this after installing executables)


コマンドが通っているか確認します。

```bash
$ cdk
Usage: cdk -a <cdk-app> COMMAND
# （略）

$ which cdk
/Users/{your_user_name}/.anyenv/envs/nodenv/shims/cdk
```

通りました！
git bash で予測変換が邪魔をするとき

■問題点
git bash を使っていて、
「develop」ブランチに切り替える時、「git checkout de」でTabキーを押すと「git checkout develop」まで予測変換してくれる。

「dev-2」というブランチを適当に作ってしまい、そのブランチはマージ後削除（リモート/ローカルともに）。
しかし、削除したのにも関わらず、予測変換には相変わらず出てきてしまい、予測変換の邪魔をする。地味にイラッとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/7d4b7209-3df2-2782-95f5-5d0296fdeed7.png)

■解決策
「\.git\refs\remotes\origin」内に、ブランチ名のファイルがある。
そのファイルを削除すると、予測変換からいなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/a74b6298-79a1-9d53-4fb8-42358668cd3d.png)

※「\.git\logs\refs\remotes\origin」内にあるファイルも消す必要があるかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/1f1bac38-cbdf-347e-7d94-6451b7e455f5.png)
rbenvの使い方

rbenv(アールビーエンブ)はRubyのバージョンを管理する**gem**


`rbenv install version`
で指定したversionのrubyをinstallしている。
 現在インストールしたrubyのversionは`rbenv versions`で確認できる。
現在反映されているrubyのversionは`rbenv version`で確認できる。

`rbenv local version`
でrbenv install versionでinstallしたRubyの設定をlocal環境に反映させれる。
例）
<img width="354" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/8257dcf7-82df-d8c5-6aca-dcc8c6d407e0.png">

.ruby-versionがバージョンを管理している。中身を除くと、あら単純！！
<img width="364" alt="Default_と_「rbenv_bundler等」を編集_-_Qiita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/f2e43a8e-b292-356b-dbd6-19ba8ac10ff4.png">

以下おまけ
rbenvでrubyをインストールするとbundlerがないので、gem install bundlerをする必要がある。

その後、`bundle install`を実行した。
もしかするとmysqlのインストールでエラーになるかも、、、
下記のを参考にした。
[ファーストトライ](https://qiita.com/Yutazon/items/8d1e538b8c89fc7bda3c)
[セカンドトライ](https://qiita.com/nagative/items/b15424a6d04881d4df86)
[サードトライ](https://qiita.com/nagative/items/b15424a6d04881d4df86)
tensorflowによる画像スタイル変換

## はじめに
画像のスタイル変換について学んだので、体験することを目的として詳しい部分には触れず、とりあえず誰にでも画像のスタイル変換の体験ができるように書いてみた。

## 準備

今回試すことは、画像のスタイル変換で、自分の好きな画像を他の画像の画風に変換する、といったような感じにすることができる。
なので、今回はりんごの写真をスタイル変換してみることにした。

![apple.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298735/1e84c492-bed3-9c77-d812-3122c0ef8d6f.jpeg)

綺麗なりんごだ。
これがどんな感じになるんだろうか。

まずGithub上から`lengstrom/fast-style-transfer`をダウンロードする。

Github
https://github.com/lengstrom/fast-style-transfer

```
$ git clone https://github.com/lengstrom/fast-style-transfer.git
```
そして、先程ダウンロードした`fast-style-transfer`ディレクトリにまで移動する。

```
$ cd fast-style-transfer 
```

この中の`evaluate.py`に画像のスタイル変換のコードが書かれている。
このファイルを実行すれば画像のスタイル変換がなされるのだが、まずは画像と変換したいスタイル様式の準備が必要だ。
今回はりんごの画像を、
葛飾北斎の
![wave.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298735/ac2f9b0e-0a74-8636-240f-4ac096dbd5ea.jpeg)

と、


ピカソの
![la_muse.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298735/56296fdf-e012-e73b-4508-44aea46554ce.jpeg)

のようなスタイルに変化してみたいと思う。

これら２つのスタイルに変換するためのファイルを以下のリンクから取得し、`fast-style-transfer`ディレクトリ以下におく。
今回の２つのスタイルのファイルは`wave.ckpt`と`la-muse.ckpt`であるので、それらのファイルを以下のリンクから取得した。

Google drive
https://drive.google.com/drive/folders/0B9jhaT37ydSyRk9UX0wwX3BpMzQ

一応、確認。

```
$ ls
README.md		la_muse.ckpt		style.py
apple.jpg		transform_video.py  docs.md
wave.ckpt       evaluate.py		    setup.sh
examples		src
```


これで準備完了。

## 実行

実行するときのコマンドは以下を参照にしてほしい。

```
$ python evaluate.py --checkpoint ./参照ファイル名  --in-path 選択画像名 --out-path ./出力画像名
```

もし、

```
ImportError: No module named 'moviepy'
```


というエラーが出ましたら、`evaluate.py`ファイルの13,14行目の部分を

```
# from moviepy.video.io.VideoFileClip import VideoFileClip
# import moviepy.video.io.ffmpeg_writer as ffmpeg_writer
```

のようにコメントアウトしてください。


まずは葛飾北斎の画像のスタイルのりんごの画像を作成してみる。
出力画像の名前は`output1.jpg`とした。

```
$ python evaluate.py --checkpoint ./wave.ckpt  --in-path apple.jpg --out-path ./output1.jpg
```

このコマンドの実行が完了したら、同ディレクトリに`output1.jpg`ファイルが作成されている。
その結果がこれ。
![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298735/26547707-e5a1-ed1b-001b-ed00955a9d45.jpeg)

おお、ぽい！！って感じ笑


次はピカソの画像のスタイルのりんごの画像を作成してみる。
出力画像の名前は`output2.jpg`とした。

```
$ python evaluate.py --checkpoint ./la_muse.ckpt  --in-path apple.jpg --out-path ./output2.jpg
```

結果がこれ。
![output2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298735/de269403-c72c-c56f-064d-f08f3348c625.jpeg)

おおお、なんかいい感じ！！


## 終わりに

画像のスタイル変換についてわからない部分は多いながらも、体験はできたかと思います。
示しましたGoogleDriveのリンクには他のスタイルのファイルも存在していますので、ぜひそちらでも試してみてください。

今回は試すことをメインにしたので、どうして出力されるのかが気になる方は`evaluate.py`の中のコードを読んだり、他の説明されているサイトなどを参考にしてください。

最後まで見ていただき、ありがとうございました。
Python3.6 sourceインストール時のエラーであわてた



## 環境

- Ubuntu16.04LTS
- Vagrant/virtualbox



## 必要なライブラリと最新化

```
sudo apt update && sudo apt upgrade
sudo apt install build-essential
sudo apt install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev 
```

## Pythonのソースを入手

```
wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
```


## make＆install：システム全体にインストール


```
tar -xvf Python-3.6.7.tgz
cd Python-3.6.7/

./configure --enable-shared --enable-optimizations
sudo make altinstall

```

### エラー

と、ここで躓きました

__エラーメッセージ__

```
python3.6: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory
```

## 原因

共有ライブラリが参照できていないようです
ありかを探して見える場所に配置します

```

sudo find / -name libpython3.6m.so.1.0
=> /lib64/libpython3.6m.so.1.0

sudo ln   /usr/local/lib/libpython3.6m.so.1.0 /lib64/libpython3.6m.so.1.0
sudo ldconfig
```

めでたし、めでたし
今日も一慌てしました、何事も勉強ですね
.Net(C#)を用いてZipアーカイブから解凍無しにOpenCV：Matに変換する方法（短報）

# abstract
Deep LearningによるCVが多用されるようになり、これにかかわる技術開発をされている方が多いでしょう。
出力結果の画像を管理・表示する際、PythonのプログラムでGUI（それこそPyOpenCVなど）を表示することもできるでしょう。
ただ、windowsでプログラムをされている方は何となく.Netで作りたくならないでしょうか（？）。近年は.Net coreによってLinux環境下でも同じソースで動かすことができるようになっております。

# method
さて、学習させて何らかの予測・画像生成を行ったとき出力を何らかの圧縮形式で一つのファイルにすることがあるでしょう。これを.Net Form上に表示しようとしたとき.Net の画像形式ImageもしくはBitmapが用いられる。これらのコンストラクタは開いたファイルオブジェクト引数にとれる。

```
using (var entry = ZipFile.GetEntry(filename).Open())//filenameはzipファイル内の画像ファイルを指す
{
    var bit = Bitmap(entry);
}
```
しかし、以下のコードは動かない。

```
var Mat = Mat(entry); //開いたファイルは引数にとれない
```

ただ、表示するにもただ結果を出力するだけでなく、少し画像の加工が必要な場合OpenCVで加工したくなる。ただ、zipの解凍はしたくない。
そこでBitmap -> Mat変換が可能であれば、それができる。
少し調べたところ

```
using OpenCvSharp.Extensions;//ここが重要。ToMatメソッドが追加される。

using (var entry = ZipFile.GetEntry(filename).Open())//filenameはzipファイル内の画像ファイルを指す
{
    var mat = Bitmap(entry).ToMat();
}

```
以上、zipの解凍を行わず,Matを生成して画像処理できるようになった。
被りのない数字を一つだけ取り出す

# 問題

Example:
Input: [4, 3, 2, 4, 1, 3, 2]
Output: 1
Here's the function signature:

def singleNumber(nums):
  # Fill this in.

print singleNumber([4, 3, 2, 4, 1, 3, 2])

一つだけ2回出現しない数字のリストを与えられて、一つの数値を見つける関数
ただし使えるメモリはO(1)である

例:
Input: [4, 3, 2, 4, 1, 3, 2]
Output: 1

.
.
.
.
.
.
.

# 回答

O(1)で回答しなければいけないためマップを作って重複チェックは使えない。O(N)使うことになるため。
計算量O(N^2)なら計算はできそうだが、もう少し良い方法を考えたい。

XORを使えばいい感じにできそうだ

同じ数のXORは必ずゼロになる例えば 4^4
またXORは交換法則があるため
```
4 ^ 3 ^ 2 ^ 4 ^ 1 ^ 3 ^ 2 = 1 ^ 4 ^ 4 ^ 3 ^ 3 ^ 2 ^ 2
```

と変換出来る
これを変換して行くと最終的に

```
1 ^ 0 = 1
```

となり`1`を抽出できる


コード

```js
function singleNumber(nums){
    let sum = nums[0]
    for(let i = 1; i < nums.length; i++){
        sum ^= nums[i] 
    }

    return sum
}
```


ちょっと難しかった
DockerでGitLab

古くなったGitLabサーバを刷新することになった。
折角なのでDockerでやってみた。

###Docker定義
```php
web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  container_name: 'gitlab'
  hostname: 'xxx.yyy.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://xxx.yyy.com/gitlab'
  ports:
    - '10080:80'
    - '10443:443'
    - '10022:22'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'
```

特に工夫はない。ポートを既存のものと被らないようにしただけ。
volumesはパスを変えたらうまく動作しなかった気がする？
メモリは4GBでやっと動いた。そこそこリソースは必要みたいです。

起動まで時間がかかるので、起動しきったかを以下のコマンドで確認した。

```
docker-compose logs -f
```
LeetCode / Linked List Cycle II

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/20/125944)からの転載）

[https://leetcode.com/problems/linked-list-cycle-ii]

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

Note: Do not modify the linked list.
<img width="516" alt="スクリーンショット 2019-08-20 10.07.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/a550ac3e-aa5e-91e7-2691-8d0a454ef590.png">
Follow-up:<br>
Can you solve it without using extra space?

[こちらの問題](https://mhiro216.hatenablog.com/entry/2019/08/17/103553)に続き、連結リストがお題。
この問題では、与えられた連結リストに循環構造(cycle)が含まれている場合、cycleが始まる地点を返す必要があります。
そしてこの問題でも、空間計算量を定数時間に抑えて行う方法を考えます。

#### 解答・解説

##### 解法1
空間計算量を定数時間に抑えるということで、ポインタを使うんだなということは想像がつきます。実際、今回も1ずつ進むslowと2ずつ進むfastのポインタを使います。しかし今回はcycleが始まる地点も返す必要があり、これをどうメモリを使わずに計算するかです。

これはなかなか自力で思いつきづらい気がしますが、下図のような状況を考えます。
![図1_190820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/e1212bde-7a37-bd3a-4206-d8396abcc559.png)
slowとfastを同じ地点からスタートさせ（前の問題ではスタート地点を1ずらしていました）、次にslowとfastが出会うまでの間に、slowがH+D進み、fastはH+L+D進む状況を考えます。
すると、fastはslowの2倍の距離進んでいるので、2(H + D) = H + D + L の関係が成り立ちます。移項すれば、H = L - D の関係が成り立ちます。

求めたいcycleが始まる地点はHに相当しますが、H = L - D ということは、下図のようにslowをfastと出会った地点からスタートさせ、一方でheadというポインタを始点からスタートさせたとき、ちょうどcycleの始点で出会うことを意味します。
![図2_190820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/79454d6f-9d10-b7db-bd7e-37c9702603b5.png)
つまり、まずslowとfastを同じ地点からスタートさせ、slowとfastが出会ったら、そこからslowだけスタートさせ、同時に始点からheadをスタートさせれば、slowとheadが出会った地点が求めたい答えである、ということになります。

コードに落とすと、以下の通りとなります。

```python
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        slow = fast = head
        # まず、slowとfastが再び出会うまで動かす
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
            if slow is fast:
                break
        else:
            return None
        # slowとheadが出会うまで動かす
        while head is not slow:
            slow = slow.next
            head = head.next
            print(head.val, slow.val)
        return head
```
CWLをyamlで書くのが大変な場合 cwl-ex はどうでしょうか？

# CWLをyamlで書くのが大変な場合 cwl-ex はどうでしょうか？


CWLを、yamlで書くのが大変というのは結構るかとおもいます。
そんなときの選択肢として cwl-ex というのがあります。
公式サイトにレポジトリがあります

こちらであれば、yamlよりは、普通のプログラムっぽく書けるかもしれません。


- [GitHub \- common\-workflow\-language/cwl\-ex: CWL experimental grammar](https://github.com/common-workflow-language/cwl-ex)


書き方やサンプルは、上記のサイトにありますが、一例を引用すると以下のようになります。

>Define a command line tool
Define a tool called `reverse`. It takes an input parameter called msg which is a File. Run the command `rev` with msg as an argument. Redirect to `reversed.txt` and `return reversed.txt` as the output parameter `reversed`.


```
def tool reverse(msg File) {
  rev $(inputs.msg) > reversed.txt
  return File("reversed.txt") as reversed
}
```

# TODO

- 実行例をのせる
- 変換例をのせる
AzureのデータセンターのIPの取り方

まずこちらの記事をお読みください。
[Azure データセンターの IP 範囲 (XML ファイル) は 2020 年 6 月 30 日までに廃止予定](https://azure.microsoft.com/ja-jp/updates/azure-datacenter-ip-ranges-xml-files-to-be-deprecated/)


深淵なる理由で、AzureのDataCenterのIP Rangeを欲しくなることがあります。

今までは[Microsoft Azure Datacenter IP Ranges](https://www.microsoft.com/en-us/download/details.aspx?id=41653)からXMLをGetしていたと思いますが、これが2020年6月30日に廃止予定となりました。

代わりに[Service Tagsの一覧を得るRest API](https://docs.microsoft.com/en-us/rest/api/virtualnetwork/servicetags/list)があるので、これを使う事が出来ます。

[Azure CLI](https://docs.microsoft.com/en-us/cli/azure/network?view=azure-cli-latest#az-network-list-service-tags)からも利用可能で、例えば東日本のデータセンターのIPの一覧は以下のようにして取れます。

```
az network list-service-tags --location japaneast | python -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d['values'] if x['id']=='AzureCloud.japaneast'][0], indent=2))"
```

``` json
{
  "id": "AzureCloud.japaneast",
  "name": "AzureCloud.japaneast",
  "properties": {
    "addressPrefixes": [
      "13.71.128.0/19",
      "13.73.0.0/19",
      "13.78.0.0/17",
      "20.37.96.0/19",
      "20.38.116.0/23",
      "20.40.88.0/21",
      "20.40.96.0/21",
      ...
    ],
    "changeNumber": "17",
    "region": "japaneast",
    "systemService": ""
  }
}
```

上記は東日本のデータセンター全てでしたが、Service Tagの単位で管理されているようなので、例えば全てのAppService、東日本のAppServiceのIP Rangeといったレベルでも取れます。
【Laravel】setVisibilityで権限はどう変わるのか

Laravelで保存したファイルに権限を設定することができる。

`setVisibility`というメソッドを使うことで、ユーザから見れるようにするかどうかという設定を変えるものである。

使い方は、

`Storage::->setVisibility($file_path, 'private or public');`

となる。

`Storage`はローカル環境ならローカルに、本番環境ならs3にするなど、環境変数で振り分けたりする。

## provateとpublicの権限の違い

```
protected static $permissions = [
    'file' => [
        'public' => 0644,
        'private' => 0600,
    ],
    'dir' => [
        'public' => 0755,
        'private' => 0700,
    ]
];
```

上記のように設定されているので、`public`ならユーザからも見ることができるし、`private`だとユーザからは見ることができない。

画像の使い道は、アイコンとか、商品画像が多いような気がするので`public`でいいんじゃないかなと思うが、管理画面でしか使わない画像など、見せたくない画像があった時は、`private`にしておく方が良いと思う。
Ansible Blockinfile の tips

# blockinfile を使う場面で

「blockinfile って便利なんだけどファイルの後ろへ順次追加していきたいだけ」って事ありますよね。
- 単一行だけどどんどん追加していきたい(/etc/hostsなど
- 出来れば登録した人とかわかると嬉しい
- 時と場合によっては複数行を扱いたい

って場面があるかと思います。

Blockinfile の動きとしては
「定義されているBEGIN〜ENDまでをチェックして無ければ追加、存在すれば書き換え」となります。

という事は、こんな風に記述すると

```yaml:blockinfile
  task:
    - blockinfile:
        path: /etc/hosts
        backup: yes
        insertbefore: EOF
        marker_begin: "BEGIN {{ HOST_NAME }}"
        marker_end: "END {{ HOST_NAME }}"
        marker: "# {mark} ANSIBLE basic setup."
        block: |
          {{ HOST_IP }}    {{ HOST_NAME }}
```

```shell:/etc/hosts
# BEGIN hogehoge ANSIBLE basic setup.
192.168.0.1    hogehoge
# END hogehoge ANSIBLE basic setup.
```
と出てくれるので
- 同じホスト名なら更新
- 違うホスト名なら自動で追加
と言う動きをしてくれます

# Ansible AWX を使った場合

以下のような書き方をすると実行した人と日時が記録されます。

```yaml:blockinfile
  gather_facts: yes
  task:
    - blockinfile:
        path: /etc/hosts
        backup: yes
        insertbefore: EOF
        marker_begin: "BEGIN {{ HOST_NAME }}"
        marker_end: "END {{ HOST_NAME }}"
        marker: "# {mark} ANSIBLE basic setup."
        block: |
          # {{ tower_user_name }} {{ ansible_date_time.iso8601 }}
          {{ HOST_IP }}    {{ HOST_NAME }}
```
【結果】

```text:/etc/hosts
# BEGIN hogehoge ANSIBLE basic setup.
# nakacya 2019-08-20T01:56:37Z
192.168.0.1    hogehoge
# END hogehoge ANSIBLE basic setup.
```

blockinfile の扱いで2時間ほど悩んだので Tips として残しておきます。
*案外書かれてない事項なので*
Postman で HTML の要素値・属性値を取得する

# 概要

Postman の Tests タブで JavaScript を記述できます。
ここでアクセスしたWebページのHTMLから要素値・属性値を取得することができます。

# 例: example.com のページ要素の検証

Postman の URL を GET https://example.com に設定し、Tests タブに下記を入力します。

```js:Testsタブ
const $html = cheerio(pm.response.text());

pm.test('Example.com is working.', function() {
  pm.expect($html.find('h1').text()).to.equal('Example Domain');
  pm.expect($html.find('a').attr('href')).to.equal('http://www.iana.org/domains/example');
});
```

※[cheerio](https://github.com/cheeriojs/cheerio) は jQuery ライクにDOMを扱えるライブラリです。
　上の例では https://example.com の `<h1>` の値の検証と `<a>` の `href` 属性の値を検証しています。

Send ボタンを押すとレスポンスが帰ってきて、テスト結果が表示されます。
テスト結果はページした半分の Test Results タブに表示されます。
既存プロジェクトのESLintをアップデート&自動修正させる

## はじめに

既存プロジェクトのESLintのバージョンを見たら `v1.10.3` 。
さすがに古いので、最新バージョン `v6.2.0` までジャンプアップします。

ここでは主にeslintのインストールとファイル一括自動修正、
あとはオマケでVS Codeでたまに起きるエラーについて書きました。

## 既存のESLintをアンインストール

    $ yarn remove eslint

## ESLintをインストール

    $ yarn add -D eslint
    ## eslint v6.2.0

## `—init`オプションで初期設定する

configファイルを作成するため、 `--init` オプションを使います。

    $ ./node_modules/.bin/eslint --init

対話形式で色々聞かれるので、適宜選択していきます。

    ? How would you like to use ESLint?
      To check syntax only
    ❯ To check syntax and find problems
      To check syntax, find problems, and enforce code style

    ? What type of modules does your project use? (Use arrow keys)
    ❯ JavaScript modules (import/export)
      CommonJS (require/exports)
      None of these

    ? Which framework does your project use?
      React
      Vue.js
    ❯ None of these

    ? Where does your code run? (Press <space> to select, <a> to toggle all, <i> to invert selection)
    ❯◉ Browser
     ◯ Node

    ? How would you like to define a style for your project? (Use arrow keys)
    ❯ Use a popular style guide
      Answer questions about your style
      Inspect your JavaScript file(s)

    ? Which style guide do you want to follow? (Use arrow keys)
    ❯ Airbnb (https://github.com/airbnb/javascript)
      Standard (https://github.com/standard/standard)
      Google (https://github.com/google/eslint-config-google)

    ? What format do you want your config file to be in? (Use arrow keys)
    ❯ JavaScript
      YAML
      JSON

    ? Would you like to install them now with npm? 
    ❯ Yes
    	No

これで `.eslintrc.js` が作成されているはずです。

```.eslintrc.js
module.exports = {
      env: {
        browser: true,
        es6: true
      },
      extends: [
        'airbnb-base'
      ],
      globals: {
        Atomics: 'readonly',
        SharedArrayBuffer: 'readonly'
      },
      parserOptions: {
        ecmaVersion: 2018,
        sourceType: 'module'
      },
      rules: {
      }
    };
```

## `—fix`オプションで自動修正

eslintのルールも新しくなりコードの修正が必要です。

ファイルを一つひとつ開いて直すのは非効率なので、 `—fix` オプションを使って一括修正します。

    ## srcフォルダ内のjsファイルを修正する
    $ ./node_modules/.bin/eslint --fix src/

自動修正できるものは修正され、できないものはエラーメッセージ等が吐き出されます。

変更前のルールと差異が大きい＆ファイル量が多いとエラーメッセージだらけになると思いますが、どうかめげずに。

## おまけ

複数プロジェクトでeslintを使ってて、かつVS Codeのprettier（プラグイン）の自動修正を使ってると、たまに変な修正をすることがあります。
そんなときはprettierプラグインをアンインストールして再度インストールすると直ります。

たぶん一つのeslintのルールに依存してしまってるぽいですね。
複数プロジェクトを行き来するときは気をつけましょう。
PCoIPで60fps出す

#PCoIPで60fps出すための設定
1. Active directoryの設定
2. Zero Clientの設定
3. 動画で確認

---
参考URL
https://docs.vmware.com/jp/VMware-Horizon-7/7.2/com.vmware.horizon.remote.features.doc/GUID-0AD7962F-22DC-4FC1-B31B-D48946BF1D47.html

http://office-qa.com/win/win71.htm

---
#Active Directoryの設定
Extras-Bundleを展開して、フォルダーにコピーし、gpediterで編集
 
まずはActive Drectory（Windows Server 2016）のサーバーにログインして、
VMwareのWebからVMware-Horizon-Extras-Bundle-5.1.0-13920927をダウンロード。
ところが、すでにHorizonをダウンロードしていたからかダウンロードは出来ないと。
*この製品のダウンロード権限がないか、ダウンロードが許可されていません。*
![vmware download.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/42161e15-64aa-aeaf-89f9-cf9f710decc8.png)


前も似たような事があってVMwareのUSサイトから取れた事があるので、
VMware.comからUSを指定してHorozonを検索し、ダウンロードを掘り下げていくとこんな感じで
ダウンロードサイトに行けた。
![vmware download2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/4dab79cb-2663-41d8-ddf8-c41679bf1edd.png)

出だしからかなり躓いた感があるものの、とりあえずunzipして展開。
展開して出来たpcoip.admxをグループポリシーに追加するとのことだけど、gpeditのAddからはコピーが出来ない。（フォルダまでは選べるけど.admxファイルは選択できない。）

よって、展開したファイルの中にあるadmxファイルをC:\Windows\PolicyDefinitionsの中にそのままぶち込む。
ついでに言語系のファイルもフォルダの中に入っているので、何も考えず全部コピーしてC:\Windows\PolicyDefinitions\USの中にぶち込む。
また、もう一か所コピーする必要があるのでC:\windows\Sysvol\domain\PoliciesにPolicyDefinitionsというフォルダを新規作成して同じようにadmxファイルをそのまま投入。言語ファイルはフォルダ事コピー。
![policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/600bb0a4-d5c5-547d-e456-ffe426694074.png)

これでもう一度gpeditを検索から開き
 [コンピュータの構成] > [ポリシー] > [管理用テンプレート] > [PCoIP セッション変数] > [上書き可能な管理者デフォルト]
と
[ユーザーの構成] > [ポリシー] > [管理用テンプレート] > [PCoIP セッション変数] > [上書き不可の管理者設定] 
の設定を編集。
私の環境は英語OSなので、**PCoIP Session Variables/Overdidable Administrator**になります。
![pcoi_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/b14a3373-cd2f-f9c6-1bb9-c40aa7e9b43b.png)

その中で、**Configure PCoIP image quality levels**を開き、Enableにマークを入れてからFrame Rateを60にして、Use image setting from zero client if availableにも✔を付けてみる。
もしかしたらどちらかだけでも良いのかもしれないけど、うまくいかなかったので両方編集。

ComputerとUserの両方で同じ設定をしてからエディタを閉じで、PowerShellで>gpupdate を実行。

クライアントPCを念のため再起動してZero clientの設定へ

#Zero Clientの設定

今回はAtrustのW100を使用。
本体の画面からも設定はあるが、フレームレートに関する設定はブラウザでゼロクラのアドレスに
アクセスする管理画面からしか設定できない。（その他いろいろの詳細設定もこちらから。）
![teradici.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/cd58ec1b-1a47-dc77-3559-97ed4885a661.png)

---
#動画で確認

今回はストリートファイター４のベンチマークで測定。
Remote Display Analyzerというフリーソフトを入れて、リモート側にどの程度のfpsや帯域で
送り出しているかを測定。
見事60fps!(字小っさ)

![st4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/91b71ac9-9b3e-273e-3811-04367ac4694c.png)

ちゃんとした？測定としてはTeradici側でも。
![fps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/a2f01e92-7a9f-3873-88ea-7a8865a2f2f4.png)

---

丸一日かかりましたが、ADの知識とか無くても何とかなりましたよ。
GoでC++のcin的な改行、空白まで入力を読み込む

Go言語の入力、一行ずつ読み込むとかは記事が出てきたんですけど、次の改行まで読み込むとかは見つけれなかったので自分で作ってみました。

###cinとは

```cpp
#include <iostream>

int main() {
	int n;
	std::cin >> n;
	std::cout << n << std::endl;
}
```

こんな感じで使います。次の改行か空白まで読み込んでくれるので非常に便利な標準入力です。


###Goのコード

```go
package main

import (
	"os"
	"bufio"
	"strconv"
)

var(
	stdin = bufio.NewReader(os.Stdin)
)

//次のスペースか改行まで読み込む
func gostring() string {
	byte_ls := make([]byte,0)
	for  {
		b, _ := stdin.ReadByte()
		//区切り文字を何にするのか指定
		if b == 32 || b == 10 || b == 0{
			return string(byte_ls)
		} else if b == 13 {
			continue
		} else {
			byte_ls = append(byte_ls,b)
		}
	}
}

//上の関数のintバージョン
func goint() int {
	n,_ := strconv.Atoi(gostring())
	return n
}
```

ReadByte()で１バイトずつ読み込むことができるのでこれで指定した文字コードが出てくるまで読み込み、[]byteにappendします。13の時にcontinueしているのは、動く環境によるのかわからないんですけど、\r\nという改行があるのでその場合に\rを文字列に追加しないようにしています。一応、atcoderでいくつかの問題に使ってみましたが正解できたのでまあ使えるのかなと思います。もうちょっと区切る文字が必要になるかもしれないです。
基本情報技術者試験の道のり[3]

# 作戦と計画
お盆中にサクッと参考書を見たところテクノロジ系の知識が壊滅的であったことが判明しはやくも雲行きが怪しくなってしまった

しかし、まだ時間に余裕はあるかなというところでW1,W2,W3をテクノロジ系に振り切って対策をしようかなと思います(実際テクノロジ系が試験の6割強を占めるので先に潰しておくしかない、、、)

ということでテクノロジ系の分野から埋めていくことになりました

#1日のスケジュール
基本的は10時から18時まで勤務しているので家について勉強できる時間は20時から23時の3時間くらいかなとそれと休日5〜6時間くらいなので1週間で約25時間程の勉強時間が確保できそうです。

朝通勤しながらこの投稿して整理していく感じになりますかね
後は暇な時間に
[基本情報技術者試験ドットコム](https://www.fe-siken.com/)
で一問一答繰り返す

あとはいかにイレギュラーな時間を減らすかが課題ですね(ゲームという誘惑をどう断ち切るか)

次回からは試験勉強の内容の備忘録になります
やっとちゃんとした投稿になりますね
【論文読み】ディープラーニング×ガウス過程

カーネル主成分分析やSVM、ガウス過程で使われる「カーネル」は試行錯誤で
選定する必要があり、黒魔術的な要素を持っています。

今回ご紹介する論文は、**ディープラーニングにカーネルの選定を任せて**しまう
非常に意欲的な研究です。

※本稿の図は論文（[Differentiable Compositional Kernel Learning for Gaussian Processes](https://arxiv.org/pdf/1806.04326.pdf)）より引用しています。

#論文の概要
+ ガウス過程で使われる「カーネルの選定」をディープラーニングに任せてしまう
+ 全体は微分可能な形式となっており、勾配法で学習が可能
+ 「回帰」、「ベイズ最適化」、「テクスチャーの補完」のタスクで良い成果を上げた

#カーネルとは？
カーネルは、一般的に入力を非線形な空間へ飛ばし、そこでゴニョニョすることにより
線形分離不可能なデータであっても、うまく処理できる非常に便利なものです。

しかし、カーネルには種類があり、そして組み合わせも多くあり、どのように設計
すべきか非常に頭を悩ませます。

#Neural Kernel Network
論文では、「ガウス過程」におけるカーネルの選定をディープラーニングに
任せてしまうことにより、最適な組み合わせを選ばせています。
これをNeural Kernel Network(NKN)と呼んでいます。

ガウス過程で使われるカーネルは、基本的に二つの入力に対し似ているもの
同士であれば小さい出力を、似ていないもの同士だと大きな出力を出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/e6575a08-5d31-d7b4-b29e-3455afb7f823.png)

上の図は、ニューラルネットワークによるカーネル選定の様子を示しています。

$x_1$、$x_2$は入力を意味しています。二層目では多項式カーネルやガウスカーネルなど
を用意しておきます。三層目ではそれらに重みを付けて和をとります。四層目では
それらの積をとっています。ご覧のようにカーネル自体をニューラルネットワークに
埋め込んでいます。

そして、カーネルのパラメータもニューラルネットワークのパラメータとして
学習させています。

これにより人間はカーネルの設計や重みづけに悩まされることなく、ガウス過程を
使うことができます。要は楽になります。

#実験結果

+ 回帰

まずは、回帰の結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/4d762804-3aa1-2f6e-252a-fd51a7606537.png)

上の図は航空機の利用客数の推移をガウス過程で学習させたものです。
赤い点は学習データ、予測値は黒い線、グレーの領域は$1\sigma$です。

ご覧のように、ヒューリスティックな手法よりNKNの方が良くフィッティング
しています。1961年以降、実測値はありませんが、恐らくNKNの方が誤差が
小さいと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/e0d40339-21bf-0f7a-2c1f-5e977e20db50.png)

上の表は、種類の違う回帰のデータセットに対し、テストデータのRMSEを
計算したものです。他の手法に比べ、NKNの方がRMSEが小さくなっており、
より高精度に予測できているのが分かります。

+ ベイズ最適化

次にベイズ最適化です。ベイズ最適化はよく油田の探索に使われています。

油田を探索するために穴を掘る必要がありますが、1つの穴を掘るのに莫大な
コストがかかるため、なるべく掘る回数を少なくしたいです。そのために、
堀った穴の状況から石油の分布を推測して、石油が一番多く埋蔵されている
場所を逐一予測する必要があります。そのときに使われるのがベイズ最適化です。

つまり、ベイズ最適化とは「できるだけ少ない試行回数で最適値を見つける」
タスクです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/bc12413d-6fac-e3ef-99f2-265006e2da45.png)

上の図は、異なるデータセット(a),(b),(c)でベイズ最適化を適用したものです。
横軸は試行回数、縦軸は評価関数の値です。評価関数の値をできるだけ小さくする
タスクだと思われます。

NKNは、Oracleには劣るものの、一般的に使われるRBF（ガウスカーネル）より
少ない試行回数で小さい値を見つけ出しています。

+ テクスチャーの補完

最後にテクスチャーの補完です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/9c91e52f-4f06-ab47-c002-bf05f42f74a0.png)

上の図で一番左(a)は学習データを意味し、真ん中がマスクされた図となっています。
(b)の図は正解を表しています。

ご覧のとおり、NKNが一番うまく再現できています。
個人的には、これが一番の驚きでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/f8d863bd-7173-e2d0-e0d6-c0bd6478fd90.png)

上の図も意味は同じです。
RBFだと歯が立たなかったものが、NKNだとうまく再現できています。

#実装
著者による[TensorFlowの実装](https://github.com/ssydasheng/Neural-Kernel-Network)が公開されています。

#感想
+ NKNはカーネルの設計をお任せできるが、基礎となるカーネルは設計者の手で選ばなければならない。
+ 回帰やベイズ最適化で良い性能を示しており、カーネル選定で迷ったらNKNという使い方もアリだと思われる。
+ テクスチャーの補完はかなり高精度で、非CNN（畳み込みニューラルネットワーク）ベースを考慮すると、かなりの成果だと思われる。

実はテクスチャーの補完は**ある応用**が可能で、私の方でコードを改造して
既に良い成果も出ています。その報告は[次回](https://qiita.com/shinmura0/items/95bb7f0bffc936cb3c2e)させていただきます。
Vue基礎：インスタンスライフサイクル

Vue.jsはReactと同じようにライフサイクルがあります。
開発を入る前に第一歩として、インスタンスライフサイクルの理解は重要です。

#インスタンスライフサイクル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/44496778-b165-5e04-7ce0-96fb0286871a.png)

赤い枠の文字はメソッド名です。
※図の元：　https://jp.vuejs.org/v2/guide/instance.html

#コード例

```javascript
new Vue({
  data: function () {
    return {
      a: 1
    }
  },
  created: function () {
    // `this` は vm インスタンスを指します
    console.log('a is: ' + this.a)
  },
  mounted: function () {
    this.$nextTick(function () {
      // ビュー全体がレンダリングされた後にのみ実行されるコード
    })
  }
})

```

参考記事：https://jp.vuejs.org/v2/guide/instance.html

以上
Coralの夏の更新：トレーニング後の量的サポート、TF Lite delegate、および新しいモデル！

Coral’sは、顧客との仕事、流通の拡大、新機能の構築に忙しい夏を過ごしました。もちろん、R＆Rには時間がかかります。ローカルAIのプラットフォームの更新、初期の作業、新しいモデルを皆さんと共有できることを楽しみにしています。

![1_Jryu97esXxkonWBj4t62fw.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/3750388c-a63a-1eba-2252-4133284f883b.jpeg)


コンパイラがバージョン2.0に更新され、トレーニング後の量子化を使用して構築されたモデルのサポートが追加されました（完全な整数量子化を使用する場合のみ（以前は量子化対応トレーニングが必要でした））、いくつかのバグが修正されました。 TensorflowチームがMedium postで言及しているように、「トレーニング後の整数量子化により、ユーザーはトレーニング済みの浮動小数点モデルを完全に量子化して、8ビット符号付き整数（つまり `int8`）のみを使用できます。」モデルサイズを縮小すると、この方法で量子化されたモデルは、Coral製品にあるEdge TPUによって高速化できるようになりました。

また、Edge TPU Pythonライブラリをバージョン2.11.1に更新して、Coral製品の転移学習用の新しいAPIを追加しました。新しいデバイス上の逆伝播APIを使用すると、画像分類モデルの最後のレイヤーで転送学習を実行できます。モデルの最後のレイヤーはコンパイルの前に削除され、デバイス上で実装されてCPUで実行されます。ほぼリアルタイムの転送学習が可能になり、モデルを再コンパイルする必要がありません。以前にリリースされた刷り込みAPIは、既存のクラスをすばやく再トレーニングしたり、他のクラスをそのままにして新しいクラスを追加できるように更新されました。事前に訓練された基本モデルのクラスを保持することもできます。デバイス上での転送学習の両方のオプションの詳細をご覧ください。

これまで、Edge TPUでモデルを高速化するには、Edge TPU Python APIまたはC ++を使用してコードを記述する必要がありました。しかし、TensorFlow LiteインタープリターAPIを使用すると、Edge TPUのTensorFlow Liteデリゲートがリリースされたため、Edge TPUでモデルを高速化できます。 TensorFlow Lite Delegate APIは、TensorFlow Liteインタープリターがグラフ実行の一部またはすべてを別のエグゼキューターに委任できるようにするTensorFlow Liteの実験的な機能です。この場合、他のエグゼキューターはEdge TPUです。 Edge TPUのTensorFlow Liteデリゲートの詳細をご覧ください。

![微信截图_20190820104427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/995b31b9-5c95-e294-4bf5-bf45d8e8da25.png)



CoralはEdge TPUおよびAutoMLチームとも協力して、EfficientNet-EdgeTPUをリリースしています。EfficientNet-EdgeTPUは、Edge TPUで効率的に実行するようにカスタマイズされた画像分類モデルのファミリです。モデルはEfficientNetアーキテクチャに基づいており、Edge TPUでの低遅延に最適化されたコンパクトなサイズでサーバー側モデルの画像分類精度を実現します。 Google AIブログでモデルの開発とパフォーマンスの詳細を確認し、コーラルモデルのページでトレーニングおよびコンパイルされたバージョンをダウンロードできます。

また、夏の終わりに合わせて、今年の授業や研究室での実験をお望みの方には、アローが学生教師割引を提供していることもお知らせしたいと思います。

Coralプラットフォームの進化を続けられることを嬉しく思います。coral-support@ google.comでフィードバックを送信してください。

_____
Coral Dev Boardは、Edge TPUコプロセッサーを搭載したシングルボードコンピューターです。 機械学習モデル用の高速なデバイス上の推論を必要とする新しいプロジェクトのプロトタイピングに最適です。

![6.27-DEV-无logo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/290dbc9f-94e9-eae6-a16f-7fa88cd4a405.jpeg)

![6.27-USB-无logo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/ce632273-0c7c-f250-7c81-61bc809a57e1.jpeg)


Google Coral EDGE TPU 海外代理店薦める，グローバル出荷：https://store.gravitylink.com/global
Coral USB Acceleratorは、コンピューターのコプロセッサーとしてEdge TPUを提供するUSBデバイスです。 Linuxホストコンピューターに接続すると、機械学習モデルの推論が高速化されます。
Moment.jsで週・月・年の操作

日付操作って使うよね。せっかくまとめたし残しておく。

ちなみに、以下の提供サイトでDevTools開けばお気軽に検証可。
https://momentjs.com/

週単位 （月曜はじまり

```js
//先週初
moment().add('isoWeek', -1).startOf('isoWeek').format("YYYY/MM/DD HH:mm:ss")
//先週末
moment().add('isoWeek', -1).endOf('isoWeek').format("YYYY/MM/DD HH:mm:ss")

//今週末
moment().startOf('isoWeek').format("YYYY/MM/DD HH:mm:ss")
//今週末
moment().endOf('isoWeek').format("YYYY/MM/DD HH:mm:ss")

//来週末
moment().add('isoWeek', 1).startOf('isoWeek').format("YYYY/MM/DD HH:mm:ss")
//今週末
moment().add('isoWeek', 1).endOf('isoWeek').format("YYYY/MM/DD HH:mm:ss")
```


月単位

```js
//前月初
moment().add('month', -1).startOf('month').format("YYYY/MM/DD HH:mm:ss")
// 前月末
moment().add('month', -1).endOf('month').format("YYYY/MM/DD HH:mm:ss")

//今月初
moment().startOf('month').format("YYYY/MM/DD HH:mm:ss")
//今月末
moment().endOf('month').format("YYYY/MM/DD HH:mm:ss")

//来月末
moment().add('month', 1).startOf('month').format("YYYY/MM/DD HH:mm:ss")
//来月末
moment().add('month', 1).endOf('month').format("YYYY/MM/DD HH:mm:ss")
```

年単位

```js
//前年初
moment().add('year', -1).startOf('year').format("YYYY/MM/DD HH:mm:ss")
//前年末
moment().add('year', -1).endOf('year').format("YYYY/MM/DD HH:mm:ss")

//今年初
moment().startOf('year').format("YYYY/MM/DD HH:mm:ss")
//今年末
moment().endOf('year').format("YYYY/MM/DD HH:mm:ss")

//来年初
moment().add('year', 1).startOf('year').format("YYYY/MM/DD HH:mm:ss")
//来年末
moment().add('year', 1).endOf('year').format("YYYY/MM/DD HH:mm:ss")
```

Moment.js 最高
Giới thiệu

<header>
<p style="text-align: justify;"><em><strong><a href="https://viemphequan.net/">Viemphequan.net</a></strong> là trang cung cấp các thông tin về bệnh viêm phế quản và các bệnh đường hô hấp khác. Nội dung, thông tin mà website viemphequan.net cung cấp được đội ngũ chuyên gia Hô Hấp đầu ngành, trình độ chuyên môn cao trực tiếp biên tập, xây dựng.</em></p>
<img class="aligncenter" src="https://viemphequan.net/wp-content/uploads/2016/01/viem-phe-quan.png" alt="Just another WordPress site" width="469" height="211" />

</header>
Pillow-SIMDとaccimageでTorchVisionを速くするときのメモ

# なにをしたいか
TorchVisionをpillow-simdとaccimageで速くしたい

# はじめに
https://github.com/pytorch/vision#image-backend
torchvisionのバックエンドは、デフォルトでPillowであり、Pillow-SIMDがインストールされているとデフォルトが変更されます。accimageはset_image_backend関数でバックエンドに設定できます。
ちなみに、デフォルトのPillowは最近のCPUだったらPillow-SIMDに乗り換えたほうがいいかもしれません。

# Pillow-SIMD

### Benchmarks
https://github.com/uploadcare/pillow-simd#benchmarks
- 通常のPillowの4-6倍程度速いらしいです。
- AVX2が有効なCPUであると、ImageMagickより16-40倍速いらしいです。

### Installation
https://github.com/uploadcare/pillow-simd#benchmarks

```
$ pip uninstall pillow
$ CC="cc -mavx2" pip install -U --force-reinstall pillow-simd
```

# accimage
https://github.com/pytorch/accimage

### Benchmarks
不明です。たぶんデフォルトのPillowよりは速いんじゃなかろうか…（根拠なし

### Installation
オフィシャルはconda推奨ですが、以下の通りでpipからもインストールできます
https://github.com/pytorch/accimage#installation
https://github.com/pytorch/accimage/issues/18

```bash:一応conda推奨です
pip install git+https://github.com/pytorch/accimage
```

### Activation
`torchvision.set_image_backend('accimage')`でOKです

```python:デフォルトとset_image_backend後を確認
>>> import torchvision
>>> # デフォルト
>>> torchvision.get_image_backend()
'PIL'
>>> # バックエンド変更後
>>> torchvision.set_image_backend("accimage")
>>> torchvision.get_image_backend()
'accimage'
```
オンラインで図、プレゼンテーションを作成するツール

図を作るツールとしては、ローカルでソフトウェアをインストールするなどは多いと思いますが、
オンラインで作成、共有できると嬉しいですね。

人気があると思うオンラインツールをメモします。

#draw.io　
https://www.draw.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/aee3e740-3843-8bc0-dd8c-d4c1cc94799f.png)

#Googleプレゼンテーション
https://docs.google.com/presentation/u/0/?tgif=d
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/94288eb5-e5fa-8bd2-b8a5-844c488eadcf.png)


#staruml.io　（インストール必要）
http://staruml.io/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/9a5084d5-cb54-ff7e-5660-88e533be180b.png)



以上
kubeadmでkube-apiserverへAdmission Controllerの「DefaultStorageClass」を追加する

参考資料
---------------
[kubeadmを使ったコントロールプレーンの設定のカスタマイズ (kubernetes.io)](https://kubernetes.io/ja/docs/setup/independent/control-plane-flags/)

手順
---------------

### 1/3, 設定ファイルを作る(名前は何でもOK、今回は→`cluster-conf.yaml`)

```
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.15.2
apiServer:
  extraArgs:
    enable-admission-plugins: AlwaysPullImages,DefaultStorageClass
```

### 2/3, クラスタを作る

```
sudo kubeadm init --config=cluster-conf.yaml
```

### 3/3, クラスタ情報からAdmission Controllerの情報を見る

```
kubectl cluster-info dump | grep admission

"--enable-admission-plugins=AlwaysPullImages,DefaultStorageClass",
```

メモ
- `kubectl apply`では`kind: ClusterConfiguration`は使用不可能
HTAで超簡単なデスクトップアプリを作ってみる

# はじめに

Windows環境であれば、何もインストールしないでHTMLベースのデスクトップアプリが作れます。私、凄く気に入っていてかなり愛用し続けていますが、とってもマイナーな様子…

「HTMLは書いたことあるけど、アプリ作るのって…難しいんじゃね？」
という方に一回これを実行してみて欲しいです！

# スクリプト

```html:test.hta
<!doctype html>
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta charset="utf-8">
<title>秘密のアプリ</title>
<ul>
    <li><a id="notepad" href="#">メモ帳を起動する</a>
    <li><a href="https://qiita.com/sozaiya/items/475211daf85bbb208635">IEでsozaiyaさんの記事を表示する</a>
    <li><a id="shutdown" href="#">今すぐシャットダウンする</a>
</ul>
<script>
    var data = {
        shell: new ActiveXObject('wscript.shell')
    };
    document.getElementById("notepad").addEventListener("click", function () {
        data.shell.exec("notepad");
    }, false);
    document.getElementById("shutdown").addEventListener("click", function () {
        if (window.confirm("本当にシャットダウンしますか？")) {
            data.shell.exec("cmd /c shutdown -s -t 0");
        }
    }, false);
</script>
```
上記ファイルを作成したらダブルクリックで実行します。

# 解説
メモ帳を開いたり、シャットダウンしてみたりと、あまり実用的ではないですが、応用すれば色んなことできるかも？と感じてもらえたら嬉しいです(^^)
Vue基礎：コーディングスタイル

コーディング規約ですが、JAVAでは歴史長いし、守ったらメリットが多いです。
特に可読性、保守性はよくなります。

Vue.js、Node.jsなどもeslintなどのツールでコーディングスタイルも統一できるようになりました。

#有名な【コーディングの心得5か条】
・見やすさを重視せよ
・ネーミングはわかりやすく
・サンプルを鵜呑みにしない
・同じコードを二度書かない
・役割は一つに

#JAVAのコーディング規約
Javaコーディング規約
https://future-architect.github.io/coding-standards/documents/forJava/Java%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84.html

同じようにJavascriptもいくつかのコーディングスタイルがあります。

#Airbnb JavaScript スタイルガイド
Airbnb JavaScript スタイルガイド
https://mitsuruog.github.io/javascript-style-guide/

#Felix's Node.js Style Guide
Felix's Node.js Style Guide
http://popkirby.github.io/contents/nodeguide/style.html

#Vue.jsのスタイル
スタイルガイド： https://jp.vuejs.org/v2/style-guide/index.html

prettier、eslintなどのチェッカー、フォーマッタのツールを設定し、スタイルを統一しましょう

以上
SCPコマンドでホスト上のファイルをローカルにコピーする

ネット回線のスピードの遅さが原因であったのか、大きなサイズのファイルをサーバーからSFTPツールでうまくダウンロードが出来ないことがありました。
何度やっても、ダウンロードが出来なかったので(他のファイルは正常にダウンロード出来る)、SCPコマンドでローカルPCに転送をしました。

## SCPコマンドでファイル転送
以下、方法と例です。

- ホスト名: example.com
- SSHのポート: 22345
- リモートのコピー元ファイルのパス: /home/Taro/works/taro_no_test.zip
- ローカルのコピー先のパス: /Users/Taro/works/

SCPコマンド

```
scp -P [ポート番号] -i [公開鍵のパス] [ユーザー名]@[ホスト名]:[コピーしたいファイルのパス] [コピー先のパス]
```

SCPコマンド例

```
scp -P 22345 -i /Users/Taro/.ssh/example.com/id_rsa taro@example.com:/home/Taro/works/taro_no_test.zip /Users/Taro/works/
```