OmniAICreator/Qiita-1.07M huggingface dataset:
rsyncで、リモートとローカルのディレクトリを同期

## コマンド概要

ファイル同期（バックアップ）をする際に使用するコマンド。
私は、リモートにある開発環境のディレクトリと同期して、ローカルで編集する際に使用してます。

## 環境

ローカルOS：Mac
リモートOS：Linux（CentOS）

#### 前提条件
ローカル・リモート共に、`rsync`が使用できること

## 書式

#### 基本

```bash
rsync <オプション> 同期元 同期先
```


```bash
# ローカルでの同期
rsync -avz hoge1/ hoge2/

# リモートサーバとの同期
rsync -avz ホスト名:パス パス 

# リモートサーバとの同期　ユーザ名指定する場合
rsync -avz ユーザ名@ホスト名:パス パス 
```

## オプション

ググればいろいろ出てくるので、以下は私がよく使うオプションのみ。

| オプション | 説明 |
|-----------|------------|
| -a | アーカイブモード。「-rlptgoD -no-H -no-A -no-X」相当<br>基本的に、これはいつもつけとく|
| -v | ログ・動作内容を表示 |
| -z | 圧縮して転送（勝手に展開してくれる）   |
| -u | 追加・変更されたファイルのみコピー |
| --delete | 同期元にないファイルを同期先から削除 |
| --exclude | 除外したいファイルを指定 |


参考：http://www.atmarkit.co.jp/ait/articles/1702/02/news031.html

## では使ってみよう

#### リモートのサーバ（`hostname.jp`）のディレクトリと同じ状態にする

```bash
# 初回
rsync -avz hostname.jp:/home/user/hoge1/ hoge2/ 

# 更新時は、-uで追加・変更されたファイルのみコピー + --deleteで同期元で削除されているファイルは同期先でも削除
rsync -avzu --delete hostname.jp:/home/user/hoge1/ hoge2/ 

# 反映させたくないファイル・ディレクトリがあれば、--exclude="パス"（同期元ディレクトリからの相対パス）
rsync -avzu --delete --exclude="nbproject/" hostname.jp:/home/user/hoge1/ hoge2/ 
```


## ディレクトリ指定の際の注意点

このように 同期元のパスで`/` を省いた場合

```bash
rsync -avz hostname.jp:/home/user/hoge1 hoge2/
```

ローカルの`hoge2/`以下に`hoge1`ディレクトリが作成されてしまうので注意。

###
3 step wallet を作成した話　その２　〜コピペとライブラリ〜

#エンジニアじゃないけどアプリが作りたかった

こんにちは。まつもとかづまさと申します
僕はこの記事を書いている現在は障害者支援施設で支援員として働いています。

今回は３ step wallet　という知的障がいの方でも「暗号通貨決済をできるようにする」という目的で作成したアプリの話です

3 step walletは[こちら](https://3step.app/#/)

##今日の記事の流れ
<img width="1023" alt="スクリーンショット 2018-09-30 10.52.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/bf043345-d653-3384-9762-e36f72034b83.png">


コピペとライブラリをインストールする場所の危険性

この記事の話になります。
[PWAとVue.jsでNEMウォレットアプリを作ろう！TypeScript導入 〜 TypeScriptで書いてみる]
(http://hobbydevelop.info/pwa_vuejs_nem_1)

##まずはアプリの基礎となる記事を参考にしました。
[PWAとVue.jsでNEMウォレットアプリを作ろう！環境構築 〜 PWAアプリの起動](http://hobbydevelop.info/pwa_vuejs_nem_0)
[PWAとVue.jsでNEMウォレットアプリを作ろう！TypeScript導入 〜 TypeScriptで書いてみる]
(http://hobbydevelop.info/pwa_vuejs_nem_1)
[PWAと Vue.jsでNEMウォレットアプリを作ろう！ウォレット作成]
(http://hobbydevelop.info/pwa_vuejs_nem_2)

##では本編へ
今回は[前回の続き](https://qiita.com/drafts/1d1dbfc3273c0bc9c140/edit)でまだウォレットの話には入りません。

なぜかって？

そりゃ、後々詰まる原因をここで作っていたからね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253981/6d19272a-78f3-8061-4653-251b2b93a9d2.png)

##コピペ・・・絶対ダメ！！
僕みたいな非エンジニアで何か作りたい！！という時はコピペはオススメしません。
作ったものに対して責任が取れないからです。
僕のメンターの人も会社員時代にコピペする部下で大変困った話を聞かせてもらいました。そこから僕は心を入れ替えてコピペだけでは終わらせない。
一度自分で書いて見て、それでうまくいかないときは別ファイルを作ってコピペして、間違い探しをするという勉強法になっています。
（コピペでうまくいくとくは１００％書き方が間違っているだけなのでその間違っている場所を探すという意味があります）

偉そうなことをいっていますが。最初はコピペばっかしてました。
そしてある時言われたのです。コピペ禁止と。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253981/3a0d73e0-4057-a948-710c-83c3c8fb465c.png)


その効果は絶大です。コピペをしなくなってから、自分でコードを見ながら書いていくので、関数の細かい機能まで見るようになりました。

※エンジニアのみなさん、「細かい」という表現は適切ではないのはわかっています。初心者にとっては「細かい」と感じてしまうのでご了承ください。

※初心者の皆さんは素敵なメンターさんと共に何かを作ることをオススメします。特に僕みたいに学習能力も低く、上っ面だけで生きてきた人間にとって一人でなんとかなるような世界では絶対になかったです。素敵なメンターさんと出会えて、少しずつその人の考え方や学習法、取り組み方を真似して僕も今なんとかやっています。
（なんとかやっているのかな？）

##コピペをした結果
コピペをした結果何が起こったかと言いますと。

・typescriptで引数や返り値の意味がわからず、progateで学び直すことになった。しかも結構進んでいた時に起こるので、わからないときは焦らずです。
（開発に使えるリソースが限られているのに、無駄な時間を過ごしてしまう）

・vuetifyのライブラリの使い方がわからず、テンプレートをいじる時にどこをいじればいいのかをわからず、かなり立ち往生する。

・結局「聞くばっかり」になってしまう。

※今の僕の課題でもあります。*「問題が起こった時に自分で解決する力」*というのが伸びなくなります。


<img width="1019" alt="スクリーンショット 2018-09-30 10.55.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/435337a3-d13a-c609-ffe4-7ad2ca939691.png">


**なんせコピペで済ませているので。**

##ライブラリのインストールでの問題
この記事の話になります。
[PWAとVue.jsでNEMウォレットアプリを作ろう！TypeScript導入 〜 TypeScriptで書いてみる]
(http://hobbydevelop.info/pwa_vuejs_nem_1)
Typescriptを導入しようとした時につまづいたことは。

この記事だと
**easy-walletに移動して**
この文章を見てなかったことです。

＊なんでなん？ていうツッコミはなしで。それを含めて僕の基本能力が低いということです。

うまくいかねぇ、うまくいかねぇ。といっていますが、
```cd easy-wallet```
で済む話でした。

これ以降は基本的に初めてライブラリをインストールするときはインストールする場所にまで気をつけてやっています。

なので僕からみなさんにとっては変な質問をすることが多々あると思います。

その時はああこいつはライブラリのインストールがどういう構造になっているのか理解していないんだなぁと思いつつ、小動物をかわいがるように教えてください。お願いします。
<img width="768" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/68b44d4d-8ac1-9d4a-0ab8-e35f18419083.png">

次回からは実際に[PWAと Vue.jsでNEMウォレットアプリを作ろう！ウォレット作成]
(http://hobbydevelop.info/pwa_vuejs_nem_2)の記事を実践した話になります。そこから自分が欲しい機能を付け加えていったので次回も読んでもらえると嬉しいです。
DjangoのSECRET_KEYをバージョン管理対象外にする

#SECRET_KEY

Djangoで開発を始めるときに作成される`settings.py`にはランダムな50文字からなる`SECRET_KEY`が含まれるが、この値は秘密するようにと警告されている。

https://docs.djangoproject.com/ja/2.1/ref/settings/#std:setting-SECRET_KEY

このためSECRET_KEYをGitのバージョン管理の対象外にしようと思い、その時の方法をメモする。

#local_settings.py

`settings.py`はバージョン管理対象にしたいので、`SECRET_KEY`の記載は削除する。削除しただけではDjangoが動作しないので、別のファイルに記載して`settings.py`からインポートする。

`local_settings.py`というファイルを作成して`settings.py`から削除した`SECRET_KEY`の記載をこのファイルに追加し、

```python:local_settings.py
SECRET_KEY = '01234567890123456789012345678901234567890123456789'
```

`settings.py`の末尾に以下の様に追記して`local_settings.py`の記載をインポートする。

```python:settings.py
...
try:
    from .local_settings import *
except ImportError:
    pass
```

[(参考)Djangoのsettings.py周りのメモ](https://qiita.com/jp_ibis/items/0ac1ba8aba1398f2a492)

インポートするファイルの名前は何でも良いはずだが、python用の`.gitignore`に記載があるので、`local_settings.py`がオーソドックスなのだと思う。

https://github.com/github/gitignore/blob/master/Python.gitignore

#get_random_secret_key()

`local_settings.py`はバージョン管理対象外としたため、開発中のプロジェクトを別の開発環境（PCなど）で`git clone`した場合、当然このファイルはダウンロードされず、`SECRET_KEY`が設定されない。

このため、`SECRET_KEY`を生成するスクリプト`generate_secretkey_setting.py`を用意して、最初にプロジェクトを`git clone`したときに実行することにする。

```python:generate_secretkey_setting.py
from django.core.management.utils import get_random_secret_key

secret_key = get_random_secret_key()
text = 'SECRET_KEY = \'{0}\''.format(secret_key)
print(text)

```

`git clone`した後、`settings.py`と同じディレクトリで

```bash
$ python generate_secretkey_setting.py > local_settings.py
```
と実行する。（Djangoはインストールされている前提）

`get_random_secret_key()`はDjangoで開発を始めるときに`setting.py`内の`SECRET_KEY`を生成する関数。

https://github.com/django/django/blob/2.1/django/core/management/utils.py#L76

スクリプトはこの関数が生成する50文字の値を`SECRET_KEY`に代入する文字列を出力するので、これを`local_settings.py`に書き込む。

`local_settings.py`ではなく、`generate_secretkey_setting.py`を、開発中のDjangoプロジェクトと一緒にバージョン管理の対象とすれば、他の開発環境と共有できる。


#まとめ

以下のことをして、Djangoの`SECRET_KEY`をバージョン管理対象外にすることができた。

　1.　`SECRET_KEY`をバージョン管理の対象外である`local_settings.py`に記載する。
　2.　`SECRET_KEY`を生成するスプリプトを用意する。（他の環境で開発を始めるときに困らない様に）


動作は以下のバージョンで確認した

 * Python 3.6.5
 * Django 2.1
Jestを試してみる

JavaScriptでTDDするためのフレームワーク探してて、Jestがよいという記事があったので試してみた。

ネタ元： https://postd.cc/a-complete-guide-to-testing-javascript-in-2017/

## 環境

- Mac Mojave
- パッケージ管理：yarn 1.10.1

yarnは以下手順で導入

```
$ npm install -g yarn
```

## Jestを試す

### package.json作成

yarn initの質問はすべてデフォルトで。
package.json作成したあと、licenseとかのいらない箇所は消した

```
$ mkdir jestSample
$ cd jestSample
$ yarn init
yarn init v1.10.1
question name (JestSample):
question version (1.0.0):
question description:
question entry point (index.js):
question repository url:
question author:
question license (MIT):
question private:
success Saved package.json
✨  Done in 24.45s.
```

あとはJestの公式ページの通りにやってみる
ただし、プロダクトコードとテストコードはディレクトリを分けて作成した

### jestの導入

```
$ yarn add --dev jest
yarn add v1.10.1
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
success Saved lockfile.
success Saved 353 new dependencies.
info Direct dependencies
└─ jest@23.6.0
info All dependencies
(省略)
✨  Done in 8.57s.
```

### テストする

テスト対象のjsを作成

```src/sum.js
function sum(a, b){
  return a + b;
}
```

テストコードを作成
テスト名は日本語にしてみた

```test/sum.test.js
const sum = require('../src/sum');

test('1 + 2  が 3 になること', () => {
  expect(sum(1, 2)).toBe(3);
});
```

package.jsonにtestの定義を追加
scriptsの上のカッコ後ろにカンマをつけるのを忘れないように

```package.json
{
  "name": "JestSample",
  "version": "1.0.0",
  "devDependencies": {
    "jest": "^23.6.0"
  },
  "scripts": {
    "test": "jest"
  }
}
```

テスト実行
yarnは実行ディレクトリ配下のテストコードを検索して実行するので、テストコードのディレクトリ定義とかは不要

```
$ yarn test
yarn run v1.10.1
warning package.json: No license field
$ jest
 PASS  test/sum.test.js
  ✓ 1 + 2  が 3 になること (3ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.739s, estimated 1s
Ran all test suites.
✨  Done in 1.32s.
```

テスト失敗したときの出力も確認
sum.jsのreturnを変えて試してみた

```
$ yarn test
yarn run v1.10.1
warning package.json: No license field
$ jest
 FAIL  test/sum.test.js
  ✕ adds 1 + 2  qeuals 3 (11ms)

  ● adds 1 + 2  qeuals 3

    expect(received).toBe(expected) // Object.is equality

    Expected: 3
    Received: 4

      2 |
      3 | test('adds 1 + 2  qeuals 3', () => {
    > 4 |   expect(sum(1, 2)).toBe(3);
        |                     ^
      5 | });
      6 |

      at Object.toBe (test/sum.test.js:4:21)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.919s, estimated 1s
Ran all test suites.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```


## 参考

- https://ics.media/entry/13838
- https://jestjs.io/docs/ja/getting-started

#### Jestで使用できるMatcher
https://jestjs.io/docs/ja/using-matchers
https://jestjs.io/docs/ja/expect
Ant Design の Upload で PUT を使う

# はじめに
Alibaba の [Ant Design](https://ant.design/) が結構イケてます。
特に Upload Component がおしゃれな挙動をしてくれるんですが、デフォルトで POST で送信しちゃうようです。
PUT で送信する要件があったのでそのナレッジを書いておきます。

# PUT を使った Upload
いきなり本題です。
Class / Stateless Functional Component は省略します。
実装箇所がわかりやすいように`render`以降の部分を記載します。
(Stateless Functional Component の場合は`return`以降をご参考ください。)

```JavaScript
import { Upload, Icon } from 'antd';

/*** 中略 ***/

  createButton = () => {
    return (
      <div>
        <Icon type={'plus'} />
        <div className="ant-upload-text">Upload</div>
      </div>
    );
  }

  render() {
    return (
      <Upload
        name={fileName}
        listType="picture-card"
        className="avatar-uploader"
        multiple={false}
        showUploadList={{ showPreviewIcon: false, showRemoveIcon: true }}
        fileList={fileList}
        action={uploadUrl}
        customRequest={(info) => {
          let xhr = new XMLHttpRequest();
          if (!uploadUrl) { return; }
          if (info.onProgress && xhr.upload) {
            xhr.upload.onprogress = function progress(e) {
              if (e.total > 0) {
                e.percent = e.loaded / e.total * 100;
              }
              info.onProgress(e);
            }
          }
          xhr.open('PUT', uploadUrl, true);
          xhr.overrideMimeType(info.file.type)
          xhr.send(info.file);
          xhr.addEventListener('loadend', (e) => {
            info.onSuccess(e, xhr);
          })
        }}
        onPreview={(file) => {
          console.log('onPreview',file);
        }}
        onRemove={(file) => {
          console.log('onRemove',file);
        }}
        beforeUpload={(file) => {
          console.log('beforeUpload',file);
        }}
        onChange={(info) => {
          console.log('onChange',info);
        }
      >
        {fileList.length >= 1 ? null : this.createButton()}
      </Upload>
    );
  }
```

# 処理の説明
#### createButton
アップロード前に表示するボタンアイコンのコンポーネントを作成しています。

#### multiple
一つのコンポーネントに対して、複数ファイルをアップロードできるかどうかの設定。
defaultで`false`なので書かなくても同じ挙動になります。

#### showUploadList
アップロード後のサムネイルにカーソルを当てた際、プレビューアイコンとリムーブアイコンを表示する設定です。

#### fileList
アップロードしたファイルの情報。
初期表示したいときは、この項目に値を設定します。

#### action
アップロード先の URL です。
必須項目ですが、`customRequest`で URL 設定した場合は使われないかもしれません。(※未確認)

#### customRequest
PUT を利用する際、この API を使用します。
私は`XMLHttpRequest()`を使いました。

```javascript
xhr.upload.onprogress = function progress(e) {
  if (e.total > 0) {
    e.percent = e.loaded / e.total * 100;
  }
    info.onProgress(e);
}
```
この処理でプログレスバーを更新します。

```javascript
xhr.addEventListener('loadend', (e) => {
  info.onSuccess(e, xhr);
})
```
この処理で、処理の完了をコンポーネントに連携します。

PUT の処理は比較的簡単に実装できたのですが、customRequest を利用した場合に`Upload`のプログレスバーの UI が動かず色々と試して上記の実装に至りました。

# おわりに
もっといい実装方法や、間違いなどがありましたらご指摘いただけますと幸いです。
JSXでのbooleanのattribute(属性)表記

## きっかけ
react-nativeのプロジェクトでESLint当てて書いているときにboolean型でwarning吐かれました。
ESLint見てみると、booleanの属性表記について書かれていたので、メモを残しておきます。

## attribute(属性)表記について

参考のURLのESLintの設定を見ればわかるが、以下のどっちも書ける。

```JSX
var Hello = <Hello personal={true} />;

var Hello = <Hello personal />;
```

ESLint内でreact/jsx-boolean-valueの設定を"always"と"never"で切り替えるのみで、ルールを変更できる。
詳しくは、参考URL見てください。

### 参考
- [react/jsx-boolean-value](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md)
GitLab CIでTestCafeのE2Eテストを定期実行する


作成したコードは↓においてあります。
https://gitlab.com/tsuemura/testcafe-ci-sample

## TestCafeのインストール

```
yarn add testcafe
```

## サンプルテストケースの作成

公式のサンプルを借りて使ってみます。
https://github.com/DevExpress/testcafe/blob/master/examples/using-assertions/test.js

## .gitlab-ci.yml の作成

Dockerhubの `testcafe/testcafe` イメージを使用し、chromiumで `tests` フォルダ内のテストケースを実行します。

```
test:
  image:
    name: testcafe/testcafe
    entrypoint: ["/bin/sh", "-c"]
  script:
    - /opt/testcafe/docker/testcafe-docker.sh "chromium --no-sandbox" tests
```

`entrypoint: ["/bin/sh", "-c"]` となっているところがミソで、Dockerfile内のentrypointを無視するようにしています。

pushするとCIが動き、テストが走ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/bb677652-020b-77d0-ee83-defe96b65681.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/3c9bc1b3-6c59-6378-03db-8aded2aad254.png)


## 定期実行の設定をする

GitLabの `CI/CD -> Schedules` で定期実行の設定をします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/b1d5a452-46ed-e367-882c-05728d1895cb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/77009dc2-34bc-8458-62f9-778f37d47122.png)

## テストが落ちたらSlackに通知するようにする

せっかくなのでSlackに通知させます。
SlackのIncoming Webhook URLを取得し、GitLabの`Settings > Integrations > Slack Notification` に入力します。
このとき、`Notify only broken pipelines` にチェックを入れると、テストが失敗したときのみ通知してくれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/6edf80eb-df99-3841-2c7e-f61af760eb42.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/174ea171-5711-a6af-3fe4-c8c05556ab49.png)


## 参考

https://www.tmp1024.com/tips/use-chrome-headless-browser-of-gitlab-ci
Swift4 デザインパターン一覧 & 感想

# Swift4でのデザインパターン一覧 

※作成途中です。すいません。

| Number | パターン名 | 
|:-----------|:-----------|
| 1 | [イテレーター](https://qiita.com/dracrowa6539/items/6f5ae5be5fbc44d8b5ed) |
| 2 | [アダプター](https://qiita.com/dracrowa6539/items/a3f59c6f1381e3cddc38) |
| 3 | [テンプレート](https://qiita.com/dracrowa6539/items/b91546caa673322739b5) |
| 4 | [ファクトリー](https://qiita.com/dracrowa6539/items/cdc84abb0daa53fe0154) |
| 5 | [シングルトン](https://qiita.com/dracrowa6539/items/137b367ef891f70aaa76) |
| 6 | [プロトタイプ](https://qiita.com/dracrowa6539/items/fd9628869707702f4b92) | 

# 簡単だったパターン

### [シングルトン](https://qiita.com/dracrowa6539/items/137b367ef891f70aaa76)

- すごく単純で、初心者でもメリットが理解しやすい

# 理解が難しかったパターン

### [プロトタイプ](https://qiita.com/dracrowa6539/items/fd9628869707702f4b92)

- インスタンスをコピーするというもので、classからインスタンスを作成するのと、インスタンスからインスタンスを作成するメリットが見えづらかった
- インスタンスからインスタンスを作成するのに、元からcopyメソッドが用意されているので、それを使えばこのパターンは不要なのではないかと思って、理解が進まなかった

# 使いやすかったパターン

### [ファクトリー](https://qiita.com/dracrowa6539/items/cdc84abb0daa53fe0154)

- プログラムが肥大化し、classが乱立したときに、インスタンス生成の手順が複雑になってくるため、その救世主となりうるパターンだった

# 使わないほうが良いと感じたパターン

### [シングルトン](https://qiita.com/dracrowa6539/items/137b367ef891f70aaa76)

- グローバル変数のように、危険な匂いがするパターン
- とはいえ、わりと使うところはあるので、慎重に使っていく
Framer XのCode Componentでローカルの画像を呼ぶ方法

React ComponentをGUI上のコンポーネント = Code Componetとして表示できるFramer X。
そのFramer XのCode Componetからローカルの（プロジェクトディレクトリに置いている）画像ファイルにどうアクセスするか公式のSlack#framer-xチャンネルで質問して教えてもらえたのでメモを残しておきます。

# 画像ファイルの置く場所

画像ファイルは以下ディレクトリに配置します。

```
+ FramerXのプロジェクトディレクトリ
    + container
        + code
            - Hoge.tsx
        + design
            + assets
                - horse.png
```

この `design/assets` 以下に置くと `http://127.0.0.1:4567/design/asstes/image.png` でアクセスできるようになります。

# Code Componentからの参照の仕方

以下は `Hoge.tsx`のコードです。

```typescript:Hoge.tsx
import * as React from "react";
import { PropertyControls, ControlType, } from "framer";

interface Props {
  image?: string;
}

const defaultImage = 'http://127.0.0.1:4567/design/assets/horse.jpg'

export class Hoge extends React.Component<Props> {
  static defaultProps: Props = {
    image: 'http://127.0.0.1:4567/design/assets/horse.jpg',
  }
  static propertyControls: PropertyControls = {
    imagefile: {
      type: ControlType.Image,
      title: "Choose Image File",
    },
  }

  render() {
    return (
      <div>
        <h2>default image</h2>
        <img src={defaultImage} width={200} height={200} />

        <h2>props image</h2>
        <img src={this.props.image} width={200} height={200} />
      </div>
    )

  }
}
```

- `defaultImage` はFramer Xのインスペクタで画像を任意選択しない場合の指定の方法
- props.imageはFrmaer Xのインスペクタで画像を任意選択できる場合の指定方法
    - デフォルトの画像が不要の場合は `defaultProps` は不要です


### Framer X上の表示
<img width="974" alt="framerx_gui.png" src="https://qiita-image-store.s3.amazonaws.com/0/47955/29e7a4bb-4e79-0899-979d-18dae06bf12a.png">

### Framer XのPreviewモードでの表示
![framerx_preview.png](https://qiita-image-store.s3.amazonaws.com/0/47955/2f602689-2f44-f954-188f-81c58f52b532.png)

### Framer App(Mobile, iOS)での表示
何もでない… 
<img width="375" alt="IMG_4162.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/47955/bc02ac91-3d8f-8cdc-052d-9f4da8d39cb9.png">


と、結局Framer Appで出ない（WiFiは同じ所に接続してますが…）という結果なので実機検証できないプロトタイピングは意味ないわけですが…　当然画像をリモートに置けばでます。


```typescript:Hoge.tsx
import * as React from "react";
import { PropertyControls, ControlType, } from "framer";

interface Props {
  image?: string;
}

const defaultImage = 'https://scontent-nrt1-1.cdninstagram.com/vp/9e0e8228203ef044c5df2be70fa80d36/5C56B0CF/t51.2885-15/e35/41381170_704999723191120_6293607066180249889_n.jpg'

export class Hoge extends React.Component<Props> {
  static defaultProps: Props = {
    image: 'http://127.0.0.1:4567/design/assets/horse.jpg',
  }
  static propertyControls: PropertyControls = {
    imagefile: {
      type: ControlType.Image,
      title: "Choose Image File",
    },
  }

  render() {
    return (
      <div>
        <h2>default image</h2>
        <img src={defaultImage} width={200} height={200} />

        <h2>props image</h2>
        <img src={this.props.image} width={200} height={200} />
      </div>
    )

  }
}
```

<img width="375" alt="IMG_4163.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/47955/5730d075-2f5e-d8e4-773f-e9929d46b109.png">
他の項目を利用して yup でバリデーションチェック（w/ formik）

# はじめに
仕事でコミュニティが活発なライブラリを活用することが増えてきたのですが、日本語の記事がなかったり、英語の記事を見ながら試行錯誤したので、備忘も兼ねてまとめます。
同じ悩みを抱える人の救いになれば幸いです。
(間違いがあればご指摘ください)

# Formik

[Formik](https://jaredpalmer.com/formik) とは、Reactで使えるフォームの管理をしてくれるイケてるライブラリです。

同僚が使う理由として
"its the lib recommended by the formskit team"
を挙げていました。
ごめんなさい、ドヤ顔で言われてもそのすごさを理解できてないヘボヘボエンジニアです。
というか、[Ant Design](https://ant.design/) の Form Component であらかた入力フォームとバリデーション実装したタイミングだったので、「マジかよ…」と思いました。

# yup

[yup](https://github.com/jquense/yup) は、`Yup is a JavaScript object schema validator and object parser.`とあるように、 formik と連携してバリデーションチェックをしてくれるイケてるやつです。

formik の`validationSchema`に yup のオブジェクトスキーマをセットしておけば、handleSubmitの際にチェックして、エラーだと onSubmit が呼び出されません。

余談ですが、yup のバリデーションを通過しているのに formik　の`props.isValid`の値が false になってることがありました。
yup は`async validation`と書かれてるので、この辺りが原因？かもしれません。
`props.isValid`で判断することはやめて、真っ当に`onSubmit`に処理を書いてあげれば問題ないかと思います。

# yup のバリデーション設定
本題に入ります。

他の項目とチェックしたいケースで一番用途が大きいのが確認用パスワードだと思います。
これは`oneOf`を利用すれば簡単に実装可能です。

```Javascript
import * as yup from 'yup';

/*** 中略 ***/

const validationSchema = yup.object().shape({
  password: yup.string()
    .required(),
  passwordConfirmation: yup.string()
    .oneOf([yup.ref('password')])
    .required(),
});
```

次に、もうちょっとダイナミックに他の項目を使う方法ですが、下記の方法で実装可能です。

```Javascript
import * as yup from 'yup';

/*** 中略 ***/

const validationSchema = yup.object().shape({
  optionalValue: yup.string()
    .required(),
  optionalDetail: yup.string()
    .test('optionalDetail', 'otherValidation', function(value) {
      if (this.parent.optionalValue === 'other' && value === undefined) {
        return false;
      }
      return true;
    }),
});
```

`test`のコールバック関数として`arrow function`を使うと`this`が束縛されてしまうので、`function()`の形で記載します。

# おわりに
初めての Qiita 投稿が少しニッチな内容になりました。

もっといい方法あるんじゃないか、あればぜひご紹介いただけると幸いです。
Windows Subsystem for LinuxでDockerを動かす

WSL上でのDocker動作については既に多くの記事がありますが、2018年9月30日時点で改めて動作検証やコミュニティへの投稿をチェックして、情報を整理しました。

#### 動作検証環境

* Windows 10 Pro (April 2018 Update)
* [Ubuntu 18.04](https://www.microsoft.com/ja-jp/p/ubuntu-1804-lts/9n9tngvndl3q) (Windows Subsystem for Linux)

#### まとめ

* 最新版 のdocker-ce（公式パッケージ）は動作しないため、17.09を利用する必要がある。
* docker-composeはWSL上でiptablesが完全にサポートされていないため動作しない。

#### Dockerインストール・起動方法

* Ubuntu 18.04 を起動して、以下のコマンドを実行する。

```shell
# WSLの標準コンソールでは貼り付けが上手くできないため、一度ファイルに出力する。
cat <<EOF > ./install-docker.sh
#!/bin/bash
# 古いパッケージをアンインストールする。
apt-get remove -y docker docker-engine docker.io
apt-get update
# docker-ceの依存パッケージをインストールする。
apt install libltdl7 -y
curl -O https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb
dpkg -i docker-ce_17.09.0\~ce-0\~debian_amd64.deb
# sudoなしでdockerを実行できるようにする。
usermod -aG docker $USER
EOF

sudo sh ./install-docker.sh
```

* 一度Ubuntuアプリケーション（ウィンドウ）を閉じる。
* Ubuntuアプリケーションを管理者として実行してDockerサービスを起動する。（サービス起動時にはUbuntuアプリケーションをWindows管理者権限で実行する必要がある。）

```shell
sudo service docker start
```

* Dockerサービスが正常に動作しているか確認する。

```shell
docker run hello-world
```

#### docker composeの動作検証

* Ubuntu 18.04 を起動して、以下のコマンドを実行する。

```shell
# 最新の安定版をダウンロード
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > ./docker-compose
chmod u+x ./docker-compose
# テスト用のdocker-componse.yamlを作成する
cat <<EOF > ./docker-componse.yaml
version: '2'

services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: redis
EOF
# doCker-composeを実行する
./docker-compose up
```

* 現時点ではiptablesでこけてエラーとなる。

```shell
ERROR: Failed to Setup IP tables: Unable to enable NAT rule:  (iptables failed: iptables --wait -t nat -I POSTROUTING -s 172.18.0.0/16 ! -o br-8838cdb48d77 -j MASQUERADE: iptables: Invalid argument. Run `dmesg' for more information.
```

#### 参考

* https://www.reddit.com/r/bashonubuntuonwindows/comments/8cvr27/docker_is_running_natively_on_wsl/
* https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository
* https://qiita.com/guchio/items/3eb0818df44fdbab3d14
* https://github.com/Microsoft/WSL/issues/767
特定のディレクトリ配下にある大量のGit管理されたプロジェクトを転送する

完全に自分用メモ。

## ネットワーク環境が良好であれば

```
$ sftp 192.168.xxx.yy
> cd AndroidStudioProjects/
> lcd AndroidStudioProjects/
> get -R *
```

でいけるんだろうけど、我が家の環境だとなんか途中でネットワークのコネクションリセットされてしまい、まったくもって進捗ダメです♪だった。

## tarで固めてファイルの数を減らしてみる

転送もとのPCで

```
cd AndroidStudioProjects/
find . -maxdepth 1 -mindepth 1 -type d -exec tar cvf {}.tar {} --remove-files \;
```

```
$ sftp 192.168.xxx.yy
> cd AndroidStudioProjects/
> lcd AndroidStudioProjects/
> get -R *.tar
```

これでも途中で止まった・・・

## もうsftp使うのやめた！！

転送もとのPCで

```
python -m SimpleHTTPServer 8888
```

```
http GET http://192.168.xxx.yy:8888/AndroidStudioProjects/ | grep \.tar |gsed -e 's/<li><a href=".*">\(.*\).tar<\/a>/wget --no-clobber http:\/\/192.168.xxx.yy:8888\/AndroidStudioProjects\/\1.tar/' | bash
```

これならいけた！
WindowsでFlutterインストール

元々JavaでAndroidアプリを開発していたが、flutterを使う機会がありインストールした。
Windowsへのインストールの情報があまりなかったので手順をまとめた。

# 環境
Windows7 SP1 64bit
Android Studio 3.2 インストール済み

# 参考ページ
[Windows install](https://flutter.io/setup-windows/)

# flutterインストール

#### 始める前に以下をインストール

- PowerShell
- Git for Windows 

※参考ページからダウンロード可能

#### flutterを取得
参考ページからダウンロード

![001.png](https://qiita-image-store.s3.amazonaws.com/0/242897/e55be2d2-f7d5-3df7-40d6-2288822de81a.png)

#### C直下に解凍し、flutter.batを管理者権限で実行
![004.png](https://qiita-image-store.s3.amazonaws.com/0/242897/a58b0a96-0ba7-9172-0c4f-0bbb858f0006.png)


#### 環境変数のPATHに以下を追加

`C:\flutter\bin`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242897/78f47ac4-86df-a94d-8638-d0ed37795e06.png)

#### コマンドプロンプトで依存関係を確認
`flutter doctor`
![005.png](https://qiita-image-store.s3.amazonaws.com/0/242897/3aa3d4c2-52ef-b0b8-a3fb-2d45cf2d2a3c.png)
ANDROID_HOMEがない…………

#### ANDROID_HOMEを環境変数に追加
インストールしていたAndroid SDKのパスをセット
![006.png](https://qiita-image-store.s3.amazonaws.com/0/242897/bc38affa-0695-51ea-e47e-eeb4be3d473e.png)

#### 再度コマンドプロンプトを起動し依存関係を確認
`flutter doctor`
※コマンドプロンプトは起動直後の環境変数を利用するため、一度ウィンドウを閉じる必要がある
![007.png](https://qiita-image-store.s3.amazonaws.com/0/242897/b57a7525-eaf7-feda-d4ab-fa9278c77f81.png)
プラグインの問題が出ているが、後程インストールするので一旦無視

#### Android Studioを起動し、プラグインをインストール
![008.png](https://qiita-image-store.s3.amazonaws.com/0/242897/bd39d80e-23d0-d8e8-0004-aaabb03fb220.png)

#### 「Flutter」をリポジトリ内で検索し、インストールボタン押下
![009.png](https://qiita-image-store.s3.amazonaws.com/0/242897/33fe1c16-2b43-eb1a-b964-cf87ad59ac89.png)

#### Dartも併せてインストール
![010.png](https://qiita-image-store.s3.amazonaws.com/0/242897/5b8cb8e2-eabc-b62f-28b1-5f60cbdba138.png)

#### Android Studioを再起動
「Start a new Flutter project」が表示されている。
![012.png](https://qiita-image-store.s3.amazonaws.com/0/242897/e993bba3-aebc-6e0e-93bd-2c47fa741806.png)

# 動作確認
#### 「Start a new Flutter project」を選択
![013.png](https://qiita-image-store.s3.amazonaws.com/0/242897/34ab3c7f-2800-0658-e133-8ce08a389dca.png)
![014.png](https://qiita-image-store.s3.amazonaws.com/0/242897/6fa170c8-8a28-880b-741c-0c64fc37ecb0.png)
![015.png](https://qiita-image-store.s3.amazonaws.com/0/242897/e9bef478-b4e0-94ab-3da6-fab0ef9bd36d.png)

#### サンプルプロジェクトで、デバイスを指定して起動
![016.png](https://qiita-image-store.s3.amazonaws.com/0/242897/ee22edbd-72ac-bb89-d52b-a3395f997f26.png)

#### スマホ画面でアプリが起動することを確認
![Screenshot_20180929-223142.png](https://qiita-image-store.s3.amazonaws.com/0/242897/8951bcb7-56eb-19bb-c0c7-7791f8e89512.png)

インストール自体は簡単だけど、環境設定まわりはちょっと面倒…………
ソースの詳細は[Flutterの基礎](https://qiita.com/nkmk1215/items/7d73b4fd8cb5ec5ac486)参照
Linuxでファイルサイズを表示する

コマンドライン上でふとファイルサイズを確認したいときがある
どうやら`wc`を使うと表示できるようなのでやってみる
[参考記事](https://ameblo.jp/archive-redo-blog/entry-10196055325.html)

# `wc -c < file.txt`
どうやらこう書くとファイルサイズだけがバイト単位で帰ってくる模様

```
$ echo "View FileSize" > filesize.txt
$ wc -c < filesize.txt
14
```

オプションが何かを毎回調べる予感がするのでaliasに登録しておく

# 引数ありのalias
普段からzshを使っているので、zshでの話
Zshでは[無名関数というのが使えるっぽい](https://qiita.com/temmings/items/c1ee9885b2c68581fd22)ので
それを使ってワンライナーで実装する

```shell:.zshrc
alias filesize='(){ wc -c < $1 }'
```

これで`filesize`でファイルサイズをぱぱっと確認できる

```
$ filesize filesize.txt
14
```

dotfilesでGit管理してる方は忘れずPush

~~`du`ではディレクトリ内というちょっと広域すぎる結果が帰ってくる~~ようなので
`wc`を使って任意のファイルのファイルサイズを表示してみた

[修正(2018/10/06)]
`du`にファイルを渡したらファイルサイズが見れるようです
(@masami256 さん、ありがとうございます！)

```
$ du -bh hoge.txt
101K	hoge.txt
```


# [追記] 見た目を改良してみた
ファイルサイズが見れて無事めでたしなのですが
画像ファイルだったりPDFファイルだったりを確認する時に
ファイルサイズがバイト表記だと桁数が多すぎて見るのがしんどくなります
なので良い感じに関数を書いてみました(初めて自分で関数書いた)
深夜テンションで書き上げたのでココこうするといいよ〜みたいなコメント大歓迎です

## `bc`をインストール
小数第一位まで表示させたかったので`bc`をインストールします

```
$ sudo apt install bc
```

## aliasの削除
見た目を整形するにあたり、処理が少々複雑なので
aliasのワンライナーではなくがっつり関数を書きます
なのでさっき追加したaliasを削除

## 関数を追加
おそらくまるっとコピペで動くはずです

```shell:.zshrc
filesize() {
    # 初期化
    filesize=$(wc -c < $1)
    unit="B"

    # 単位を変数にしておく
    GB=$(( 1000.0 ** 3.0 ))
    MB=$(( 1000.0 ** 2.0 ))
    KB=1000.0
    
    # なんちゃって三項演算子で単位を定める
    [ `echo "$filesize >= $GB" | bc` -eq 1 ] && is_GB=true || is_GB=false
    [ `echo "$filesize >= $MB" | bc` -eq 1 ] && is_MB=true || is_MB=false
    [ `echo "$filesize >= $KB" | bc` -eq 1 ] && is_KB=true || is_KB=false

    # GB
    if $is_GB
    then
        filesize=$(( $filesize / $GB ))
        unit="GB"
    
    # MB        
    elif $is_MB
    then
        filesize=$(( $filesize / $MB ))
        unit="MB"

    # KB
    elif $is_KB
    then
        filesize=$(( $filesize / $KB ))
        unit="KB"
    fi

    # 小数点以下第一位まで表示
    printf "%.1f%s\n" $filesize $unit
}
```

流石に1ファイルで`TB`はないと思うので`B`〜`GB`の範囲で準備しました
なんちゃって三項演算子は[こちら](https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d#%E4%B8%89%E9%A0%85%E6%BC%94%E7%AE%97%E5%AD%90%E3%82%82%E3%81%A9%E3%81%8D)を参考にしました

```shell:成果
$ filesize filesize.txt
14.0B
$ filesize kbfile.txt
2.2KB
$ filesize music.mp3
3.7MB
$ filesize movie.mp4
3.5GB
```

我ながらスッキリした表示でとても気に入っています
Docker for Windows で絶対パスのシンボリックリンクを扱う

## 動作確認環境

- Windows 10 Pro 1803
- Docker for Windows 18.06.1-ce-win73


## TL;DR;
Dockerで完全にクロスプラットフォームな開発環境を楽々実現できる！
.
.
.
そう思っていた時期が私にもありました。
実のところ、Linux、Macだけならそう言ってもいい感はあります。
だが、Windows、テメーはダメだ。

今回はそんなWindows上のDockerで絶対パスのシンボリックリンクを扱うためのTips。
そもそも絶対パスなんて環境依存が激しいもの使うべきじゃない、というのはごもっとも。
でもレガシーなシステムのDocker化なんてやってると、こういうの、まれによくあるんですよね。


## 準備

GitHub前提です。
まずは正しくシンボリックリンクをcloneされるよう設定します。

以下を参考にしています。

> Git for Windowsでシンボリックリンクを扱えるようにする
https://qiita.com/ucho/items/c5ea0beb8acf2f1e4772


- Powershellからgitの設定

```
git config --global core.symlinks true
```

これでファイルシステムがNTFSならシンボリックリンクがシンボリックリンクとしてcloneされるための準備ができました。

- cloneする

リンク先のように一般ユーザーにシンボリックリンクを作成する権限を付与するか、Powershellを管理者権限で起動します。
私はめんどくさかったので管理者権限で起動する方を選びました。


- ハマりどころ

絶対パスのシンボリックリンクは当然リンク切れ状態になっていると思います。
それ自体は問題ありません。問題なのが、なぜかリンク先が以下のように変換されてしまうこと。

```
/var/www/htdocs
↓
/mnt/C:/var/www/htdocs
```

これではコンテナを起動したときに、コンテナの中から絶対パスのシンボリックリンクが正しく扱えません。

## 対策

DockerfileのRUNか、entry-point.shの中で以下を実行

```
mkdir /??
ln -s / /??/C:
```

なぜかわかりませんが、NTFS上で/mntだったものがコンテナの中だと/??になっちゃいます。
ためしにmkdirしてみたらフツーにできてしまいました。あとはシンボリックリンクを貼って終了。

ちなみに、WSL上でDockerを動かす方法や、WSLのgitでcloneする方法も試してみましたが、うまくいきませんでした。
WSLだけで完結すればWindows10Homeでも動くのでいいのですが、コンテナのビルドでこけたりして、まだ粗削りな印象を受けております。私だけかな？

ご参考まで！
IBM Cloud Infrastructure (SoftLayer) でDNSのNSレコードを設定する

# 経緯

IBM Cloud Infrastructure (SoftLayer)のDNSはポータルからレコードの編集ができますが、NSレコードは追加や更新ができません。すべてこのDNSで管理する分にはよいのですが、例えば外部のDNSにゾーン委任したい場合はNSレコードの追加が必要です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/18f0caae-314e-85fe-1cb3-f134acfa5ed3.png)

# 方法

slcliを使うと追加できました。

```text:現状の確認
$ slcli dns zone-print xxxxx.com
$ORIGIN xxxxx.com.
$TTL 900
@ IN SOA ns1.softlayer.com. support.softlayer.com. (
                       2018092807        ; Serial
                       7200              ; Refresh
                       600               ; Retry
                       1728000           ; Expire
                       43200)            ; Minimum

@                      86400    IN NS    ns1.softlayer.com.
@                      86400    IN NS    ns2.softlayer.com.
```

```text:NSレコードの追加
$ slcli dns record-add xxxxx.com サブドメイン NS 委任先DNS
(例) slcli dns record-add xxxxx.com yyyyy NS ns000.hoge.com.

```

```text:追加後の確認
$ slcli dns zone-print xxxxx.com
$ORIGIN xxxxx.com.
$TTL 900
@ IN SOA ns1.softlayer.com. support.softlayer.com. (
                       2018092807        ; Serial
                       7200              ; Refresh
                       600               ; Retry
                       1728000           ; Expire
                       43200)            ; Minimum

@                      86400    IN NS    ns1.softlayer.com.
@                      86400    IN NS    ns2.softlayer.com.
yyyyy                  7200     IN NS    ns000.hoge.com.
```

以上です。
LibSVMをC/C++のライブラリとして使う準備(2018/9/30)


#はじめに

LibSVM( https://www.csie.ntu.edu.tw/~cjlin/libsvm/ )をC/C++上でライブラリとして使用するための準備過程がどこにも書かれていなかったので、私が行ったやり方をメモしておこうと思います。

#0.環境
macOS High Sierra version 10.13.6
gccコンパイラ 4.2.1

#1.ダウンロードとインストール

LibSVM は上記のURLからダウンロードできますが、素のソースコードからライブラリ化するのはやや億劫でした。
代わりにhomebrewからダウンロードとインストールを行います。

```bash
$ brew install libsvm;
```

インストールすると、```svm-train```などが実行バイナリとして使えるようになりますが、今回はライブラリの状態で使いたいのでこれ自体に興味はありません。

#2.インストール先の確認

次にhomebrewでのインストール先を確認します。

```bash
$ brew info libsvm;
```

```bash:libsvmの情報
libsvm: stable 3.22 (bottled)
Library for support vector machines
https://www.csie.ntu.edu.tw/~cjlin/libsvm/
/usr/local/Cellar/libsvm/3.22 (10 files, 230.3KB) *
  Poured from bottle on 2018-09-30 at 02:05:39
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/libsvm.rb
==> Analytics
install: 75 (30d), 377 (90d), 1,474 (365d)
install_on_request: 64 (30d), 303 (90d), 1,117 (365d)
build_error: 0 (30d)
```

libsvmは、"/usr/local/Cellar/libsvm/3.22"にあることがわかります。
この場所を```open```コマンドを使ってファイダーで開くと、```include```,```lib```といったディレクトリがあります。この場所をメモできたら準備完了です。


#3.実際にコンパイルしてみる

今回は、えくー様のブログの記事（ http://fe0km.blog.fc2.com/blog-entry-95.html ）のプログラム（おまけ１：unique_ptrとか使ったC++コード）を再現することを行いました。
恐縮ながらライブラリのインクルード表記のみ変えさせていただきました。

```C++:変更前
#include <libsvm/svm.h>
```

↓

```C++:変更後
#include <svm.h>
```

それでは、カレントディレクトリにコード（libsvm_test.cpp）をおいて、コンパイルしてみます。

```bash:libsvm_test.cppをコンパイル
g++ -std=c++14 -o libsvm_test libsvm_test.cpp -I /usr/local/Cellar/libsvm/3.22/include -L /usr/local/Cellar/libsvm/3.22/lib -l svm `pkg-config --libs opencv`;
```

無事エラーもなく、終了。それでは実行してみましょう。

```bash:実行
./libsvm_test
```

![Screen Shot 2018-09-30 at 5.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/147329/139f4d47-2f5c-5460-193d-9a1fe92dfaab.png "Screen Shot 2018-09-30 at 5.27.29.png")


Accuracy[%] = 93となっているところからおおよそ上手く学習できていそうですね。

#4.所感

Makefileがそれほど充実していないライブラリの管理において、homebrewを利用するのはバージョン管理の面でも便利かと思います。少なくとも闇雲にパスやリンクを弄りつづけるよりは、安全かつ精神をすり減らさないので快適です。

あとこの記事、別に機械学習とは関係ないかも・・・。
JavaScriptにあったらいいなと思うもの

あったらいいなと浮かんだものをなんとなく書いてるのだけなのでいろんなところからマサカリが飛んできそうですが...

## 1, Math.sum([value1[, value2[, ...]]])

引数の数値の合計を返す

ES6で追加されたスプレッド構文と一緒に使うことで配列の合計を簡単に求められる

```js
Math.sum(...[1, 2, 3]) // > 6
```

## 2, RegExp.setBacktrackLimit(limit)

PHPとかにある機能ですね

正規表現のバックトラックの回数を制限することでプログラムの実行が止まるのを防ぐことが目的です

参考：[正規表現の落とし穴（ReDoS - Regular Expressions DoS） - Qiita](https://qiita.com/prograti/items/9b54cf82a08302a5d2c7)

## 3, 1 .. 3

1 から 3 の範囲を表す (Rubyなんかのあれと同じなのかな)

for文で余計なコード書く必要がなくなるね！[^1]

[^1]: 実際for文なんてES6以降使う場面無いというか使わないほうがいいんだが

switch文のcaseにも使えれば便利そう

## 4, Array#remove(value)

```js
const i = arr.indexOf('some value')
arr.splice(i, 0)
```

の代わりに

```js
arr.remove('some value')
```

同じ値を消すだけ

えっ？Array#filter使えって？

配列を直接操作できない大人の事情があるんだよ(Proxyとか)

## 5, if式

そう、Kotlinのあれです

```kotlin:kotlin
val max = if (a > b) a else b
```

まぁ素直に三項演算子を使っても良いんですが、ちょっと見やすくなるんじゃないんかな

## 6, スプレッド構文による関数の展開

オブジェクトリテラルでプロパティ付きの関数を書けたら面白いんじゃないかと思った

```js
const fn = () => 1
const obj = { ...fn, prop: 2 }

obj.prop === 2 // true
obj() === 1 // 現時点ではTypeError
```

## 終わりに

この記事はなにか作ってるときになんとなくこれあったら便利じゃねってことで思いついたものを並べてるだけで、実装上のあれとか、あのライブラリであるよ、とか言われるのを想定した上で何も調べず気が向いたときに書いているのであまりまともに受け止めず、暇つぶし程度に読んでください
ゲーム「SAVE THE PLANET: INDONESIA 」

僕は前大学勉強時友達と一緒にゲームを開発しました。
そのゲームはSAVE THE PLANET: INDONESIA という名前で、ゲームのストーリーは地球や動物を守るためです。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/286745/d0b57b6e-bcf6-02cb-6010-d0cc34a39787.png)
##ストーリー
Changes in Season from year to year, even day by day that is currently felt on the face of the Earth is increasingly uncertain, this Season Change is caused by the depletion of the Ozone Layer, other than that another factor that causes increasingly severe seasonal changes is human consciousness lacking in nature conservation, what is happening now is damage to nature everywhere.
Because of this damage to nature that makes living things that live around nature become difficult in adapting to the surrounding environment. There are even living things that have difficulty in adapting to the environment, the more the day they are pressed for life and eventually die, then the living creature is threatened with extinction.
However, many of the people who do not want to interfere with this problem, they consider it to be a very ordinary matter, and is one of God's will changes this season. The lack of awareness of the surrounding community will make this earth's life increasingly unhealthy.
By seeing this very alarming condition, there was a young man (in-game player) who felt compelled to save the endangered animal.

##アイデアツリー
このゲームは6つのステージを持って、各ステージは異なるストーリーとミッションを持って、各段階では、ユーザーは別の動物を保存することによってミッションを完了することができなければなりません。対話はジャンプ、実行に限定され、ユーザーは脅威を回避してそれらを渡すことができなければなりません。
![aaw.jpg](https://qiita-image-store.s3.amazonaws.com/0/286745/b6b37dad-7cd1-44ca-cd46-81870f277487.jpeg)

##画面
![aaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/286745/0c99a417-0f81-5393-05a6-e244eb7112ff.jpeg)
openFrameworks for vs で audioInputExampleが正常に動かない時の対処

殊にsmoothedVolでのビジュアライザが動かない時のメモ書き

アプリケーション起動時(つまりサウンドを取得する前)にinputの値がfloat型の値でないことが原因のようだったので,
条件文を足してやる。


####こいつを
```c++:ofApp.cpp
left[i] = input[i * 2] * 0.5;
right[i] = input[i * 2 + 1] * 0.5;
```

####こう
```c++:ofApp.cpp
left[i] = input[i * 2] * 0.5 > 0 ? input[i * 2] * 0.5 : 0;
right[i] = input[i * 2 + 1] * 0.5 > 0 ? input[i * 2 + 1] * 0.5 : 0;
```

これでひとまず回避できる。
Sublime Text 3 SFTP 「encoding error」resolution 

It's not worked that client don't connect target of server, after Json file(file → SFTP/FTP → Edit server) has been adjusted. Then, you should check to the directory of basename as remote path in your server, and will find for the file names that would might raise error e.g. two-byte character or 『(』and 『)』. if these names are found, these file(name) should be removed or moved. I hope the problem will be solved by the information.
【まつもとゆきひろ氏　特別講演】20代エンジニアのためのプログラマー勉強法 に行ってきた

[【まつもとゆきひろ氏　特別講演】20代エンジニアのためのプログラマー勉強法](https://supporterzcolab.com/event/489/) に行ってきました。

下記は、自分なりにまとめものです。

---

# 学生の勉強

抽象化されており、詳細に踏み込まない。ゆえに理解がしやすい。
皆が勉強した背景知識を活用し、問題を簡潔に把握し、類似性をパターン化して抽出することができる。

しかし、抽象化は万能ではない。

#### keyword
    アーキテクチャ宇宙飛行士
    over simply（シンプルにしすぎ -> 重要な違いの漏れ）

国語と数学は同じ勉強法が有効か。
-> 否

学生と社会人は同じ勉強法が有効か。
-> 否

# 学生と社会人の勉強の違い

|学生|社会人|備考|
|:-----:|:-----:|:--|
|満点がある|満点がない|この違いがポイント|
|苦手を克服する|得意を伸ばす|100点満点のある場合、90点を取れる科目より40点しか取れない科目を勉強した方が、総合点の向上につながるため|
|記憶|把握|社会人は知識のインデックスを作っておく詳細は必要に応じて調べればよい|
|試験会場|常在戦場||
|一次元|多次元|学生は科目での評価、社会人はあらゆる場面での評価|
|メイン|サブ|学生は勉強が本分である、社会人は仕事のために勉強する|
|間接的|直接的|学生の勉強は役に立つか分からない、社会人の勉強はすぐに役に立つ|
|安定|変化|特にIT技術の盛衰は激しい|

# なぜ勉強するのか

いろんな理由があるはず。

ex. 

- 仕事で成果を出したいから
- 高収入を得たいから
- 成功したいから
- 勉強する対象そのものが好きだから

最終的には **尊敬** と **尊重** が目的になっている気がする。

#### keyword
    尊敬 = 人格を高いものと認めること
    尊重 = ないがしろにしないこと（人格が高いかは関係ない）

しかし **知らない** 人を **尊敬** も **尊重** もすることはできないため **知られる（アウトプットする）** ことが大切。

**知られる（アウトプットする）** ことで **成功する** ためには、**キャズム（溝）** を乗り越えなければならない。

#### keyword
    キャズム理論

そのためには

- ニッチに進出すること
- 横展開すること
- ユニークさを表明して、埋没しないこと

が重要である。

つまるところ、社会人の勉強は、自分自身のマーケティングである。

# なにを勉強するのか

勉強に限らず、始めることは簡単だが、続けることは難しい。
始める前に **考えること** が大切。

#### keyword
    内省 (self reflection)
        - 自分についての棚卸し（inventory）
            - 持っているもの/持っていないもの
            - 得意なこと/苦手なこと
            - 好きなこと/嫌いなこと
            - どうなりたいか
            - どこまで妥協できるか

自分が得意なこと、好きなことを勉強するのがよい。
得意なことがわからなければ、好きなことを勉強すればよい。
好きこそものの上手なれ。

未来や将来のことは、どれだけ考えたところで、どうせ外れる。
"自分の傾向" を考えるべき。 

# どう勉強するのか

### モチベーション管理
- 好きなことを勉強する。好きなことは勝手に続けられる
- 漠然とではなく具体的な目的を持つ
- 「ひま」「やることがない」は危険信号

### 時間管理
- 時間管理 = 優先順位をつけること
- 人間は "優先順位が高い" と感じることに自然と時間を割く
- 勉強に時間が割くことができる状態を作る

### アウトプット
- インプットだけでは、他者との差別化ができない
- アウトプットにより勉強した内容が定着する
- 最初はハードル（心理的障壁）が高いので、クオリティは棚上げして繰り返し行う

# アドバイス

### 基礎を学ぶ

- コンピュータ・サイエンス
- コンピュータ・アーキテクチャ

### 英語を学ぶ

- 最低限読むことができるレベル
- 読むなら読む、話すなら話す場数をとにかく増やすこと

### 心地よい空間（comfort zone）を抜け出す

- 居座っても成長できない場所から意識的に出る
- 変化を恐れない訓練をしておく

### 自分を見下さない、誰かを見下さない

- そもそもプログラミングは人間に都合よくできている
- 誰かを見下してコミュニケーションを乱すことは、プログラミングに悪影響する

以上

--- 

最後に印象に残ったMatzさんの一言。

Q. ご自身が20代エンジニアに若返ったら何をしますか。
A. プログラミング言語を作りますかね。


**好きなこと** って強い。
Arduino - 文字列を数値に変換（整数値のみ）

# 概要

Arduinoでシリアル通信で受け取った数字の文字列を数値型に変換する必要があったので、その方法を調べてみました。

この記事は下記の環境で動作確認をしています。

|項目|内容|
|---|---|
|Arduino IDE|1.8.13|
|Arduinoボード|[秋月電子通商 AE-ATmega](https://akizukidenshi.com/catalog/g/gK-04590/) (Arduino Duemilanove互換ボード)|

# toInt()

シリアル通信で受け取った文字列を[String型](https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/)オブジェクトに格納している場合は、`toInt()`を使用します。

`toInt()`は、文字列を整数に変換するメソッドです。変換結果はlong型で返されます。
文字列は数字で始まっている必要があります。文字列が数字以外の文字列で始まっている場合は変換されず、整数0が返されます。
詳しくは、公式のArduinoリファレンスをご覧ください。英語ですが、翻訳サイトなどを使って一度目を通しておくと良いでしょう。

* [toInt() - Arduino Reference](https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/toint/)

なお、`toInt()`は、公式にもサンプルスケッチが用意されています。

* [String to Int Function | Arduino](https://www.arduino.cc/en/Tutorial/BuiltInExamples/StringToInt)

# スケッチ例

LEDの明るさの設定値（0～255）をシリアル通信でArduinoに送信して、LEDの明るさを制御するスケッチ例です。

`toInt()`を使う際の注意としては、文字列が変換できなかった場合も0が返されるという点です。
今回はLEDの明るさを制御するだけなので、文字列が変換できなかった場合は0を指定したときと同じ動作にすることにしました。
0が返されたときにエラー処理をしたい場合は、正常に変換できた場合に返される整数の範囲に0が含まれないようにする必要があります。

```c++:conv.ino
/**
 * @file        conv.ino
 * @brief       LED Controller
 * @author      Keitetsu
 * @date        2021/02/13
 * @copyright   Copyright (c) 2021 Keitetsu
 * @par         License
 *              This software is released under the MIT License.
 */

#define LED_PIN 3        /**< LEDを接続するanalogWrite対応ピン */
#define LED_DUTY_MIN 0   /**< LEDの最小デューティ比．消灯 */
#define LED_DUTY_MAX 255 /**< LEDの最大デューティ比．最大輝度で点灯 */

/**
 * @brief       セットアップ関数
 */
void setup()
{
    Serial.begin(9600);

    // LEDのPWM制御のデューティ比を0に設定する
    analogWrite(LED_PIN, LED_DUTY_MIN);
}

/**
 * @brief       ループ関数
 */
void loop()
{
    String line;    // 受信文字列
    int line_len;   // 受信文字列の長さ
    long led_duty;  // LEDのPWM制御のデューティ比

    // シリアル通信で1行（セミコロンまで）読み込む
    line = Serial.readStringUntil(';');
    // 1行の文字数を取得する
    line_len = line.length();
    // 文字列が1文字から3文字の間であれば，文字列を整数に変換する
    if ((line_len >= 1) && (line_len <= 3)) {
        // 文字列を整数に変換する
        led_duty = line.toInt();
        // デバッグ用文字列をシリアル通信で送信する
        Serial.print("LED Duty: ");
        Serial.println(led_duty);
        // 整数がLED_DUTY_MIN以上LED_DUTY_MAX以下であれば，LEDのデューティ比として設定する
        if ((led_duty >= LED_DUTY_MIN) && (led_duty <= LED_DUTY_MAX)) {
            analogWrite(LED_PIN, led_duty);
        }
    }
}
```

# 実行方法

スケッチを書込みできたら、シリアルモニタを開きます。
はじめに、シリアルモニタで改行コードを送らない設定「No line ending」に設定してください。
そして、Arduinoのシリアルモニタから1桁から3桁かつ0から255の数字とその末尾に半角セミコロンを付加した文字列、例えば「0;」、「64;」や「255;」送ってみてください。
送った数字に応じてLEDの明るさが変わり、シリアルモニタには「LED Duty: 128」などと送った数字が戻ってきます。

![SerialMonitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256195/110f684d-f064-ae7c-81c6-7e13e285895f.png)
Lambdaでお手軽サーバーレス入門（API Gatewayデプロイ編）

前回：[Lambdaでお手軽サーバーレス入門（Lambdaのイベント from API Gateway編）](https://qiita.com/kakken1988/items/e4d92395f17c95a31e24) ~~スカートの下に短パンはやめてほしい~~

さてLambdaも揃ったところで、API Gatewayに戻ってデプロイしてみます。

[API Gateway management console](https://ap-northeast-1.console.aws.amazon.com/apigateway/home?region=ap-northeast-1)

# デプロイ

作ったAPI定義は、デプロイしないと公開されません。
また、変更したあともデプロイが必要です。

Actionsから、Deploy APIを選びます。

![apigw14.png](https://qiita-image-store.s3.amazonaws.com/0/143240/9d619ce4-a2ff-50f4-482d-fbb3ad9dae11.png)

何やらStageを選べと出ます。
ない場合は、選択肢から「[New Stage]」を選びます。

![apigw15.png](https://qiita-image-store.s3.amazonaws.com/0/143240/61f89686-3f46-3aef-0b57-e026dd917d67.png)

Stage nameを入れろと出てきますので、~~適当に~~考えて入れます。
私は安直に`test`にしてみました。

Deployボタンをクリックすると…

![apigw16.png](https://qiita-image-store.s3.amazonaws.com/0/143240/2d8ed576-8242-0e13-e2b4-0a813ddf7386.png)
URLが出てきました。
これが今回作ったAPI GatewayのベースになるURLです。

真ん中のツリーの`test`を展開してみると…

![apigw17.png](https://qiita-image-store.s3.amazonaws.com/0/143240/3c846bcb-94f8-44df-6731-d50905a86152.png)

定義しているResourceやMethodが表示されます。
`/hello-world`の下のGETをクリックすると…

![apigw18.png](https://qiita-image-store.s3.amazonaws.com/0/143240/4378a555-b52b-a967-d1cc-60f22f6ecfed.png)

URLを教えてくれます。

# テスト

では、早速呼び出してみましょう。

## id指定なし版

```bash
curl -X GET https://kmd0f95tsb.execute-api.ap-northeast-1.amazonaws.com/test/hello-world
```

<img width="1179" alt="1. ~ (fish) 2018-09-29 23-53-07.png" src="https://qiita-image-store.s3.amazonaws.com/0/143240/a7551a13-ae18-0f3c-57ae-a81edf2a6d4a.png">

## id指定あり版

idも指定してみます。
レスポンスコードもわかるように、詳細モードで見てみます。

```bash
curl -X GET -v https://kmd0f95tsb.execute-api.ap-northeast-1.amazonaws.com/test/hello-world/railgun
```

<img width="1135" alt="1. ~ (fish) 2018-09-29 23-56-04.png" src="https://qiita-image-store.s3.amazonaws.com/0/143240/0d5464fa-e2a7-5dde-ffde-722fa182571e.png">

```bash
curl -X GET -v https://kmd0f95tsb.execute-api.ap-northeast-1.amazonaws.com/test/hello-world/mental-out
```

<img width="1135" alt="1. ~ (fish) 2018-09-29 23-57-33.png" src="https://qiita-image-store.s3.amazonaws.com/0/143240/3dcb08f6-49a2-87a8-d461-5d45044c8c00.png">

[メンタルアウトさん](https://dic.pixiv.net/a/%E9%A3%9F%E8%9C%82%E6%93%8D%E7%A5%88)は情報を偽装して404を返すそうです（違う
※ネタにネタレス：あのひとは電気系には干渉できないは…やべ、リモコン出てｋ…（以下お察し

というわけで、API GatewayからLambdaが呼び出せました。

# 次回予告

ツリーダイアグラムは、一ヶ月に一度、天気予報（予言）を発表します。（[元ネタ](https://www12.atwiki.jp/index-index/pages/237.html)）
ということで、定期的なイベント、CloudWatch EventsとLambdaを組み合わせてみます。
paizaで使ったメソッド

#　言語
**javascript**

## Numberメソッド
Numberメソッドを使うとstring型の数値をinteger型に変換することができる

```javascript
Number('0');
=>0
```

##splitメソッド
文字列に対して呼び出し、文字列を引数に渡した値で分割し、配列として返す

```javascript
'hoge fuga moge'.split(' ');
=>['hoge','fuga','moge']
```

####文字列を一文字ずつに分割する

```javascript
'OHTANISHOHEI'.split('');
=>['O','H','T','A','N''I','S','H','O','H','E','I']
```

####文字列を行ごとに分割する

```javascript
'a\nb\nc'.split('\n');
=>['a','b','c']
```

##for文
（）の条件の時に、{}の中をループさせる

```javascript
for(var i = 0; i < 100 ;i ++){
console.log(i);
}
```

##pushメソッド
配列の末尾に 1 つ以上の要素を追加することができます。

```javascript
 var arr = [];
    for(var i = 1; i < 10; i ++){
          arr.push(Number(line) * Number(i))
    }
    console.log(arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8]);
});
```

##表示の仕方
pushで配列の中に入れてconsole.logで配列を並べることで、横並びにできる。

```javascript
var obj = {};
var array = ['red','blue','green'];
for(var i = 0; i < array.length; i ++){
	obj[array[i]] = 1;
}
console.log(obj);
```
paizaで使ったmethod

# **言語:point_up:**
**javascript**
## Numberメソッド
Numberメソッドを使うとstring型の数値をinteger(整数）型に変換することができる。

```javascript
Number("0");
=> 0
```
##Splitメソッド
文字列に対して呼び出し、文字列を引数(""の間)に渡した値で分割し、配列として返す

```javascript
"repe zen chikyu".split(" ")
=>["repe","zen","chikyu"]
```
文字列を1文字ずつに分割する

```javascript
"repe zen chikyu".split("")
=>["r","e","p","e","z","e","n","c","h","i","k","y","u"]
```
\n（改行）で分ける

```javascript
"repe\nzen\nchikyu".split("\n")
=>["repe","zen","chikyu"]
```

##for
ループさせる！(:point_down_tone2:1~100)(MDNを参考！）

```javascript
for (var i = 0; i < 100; i++) {
   console.log(i);
}
scikit-learnのLOFでテストデータの判定をする

scikit-learnでは外れ値検知の手法の1つであるLOF（Local Outlier Factor）が提供されていますが、versionが0.19以前ではテストデータに対する正常データ・異常データの判定ができませんでした。version0.20からテストデータに対する正常データ・異常データの判定機能が実装されましたので、そちらを紹介します。

#使い方
One Class SVMのようなscikit-learnに実装されている外れ値検知の手法では、正常データが大多数であるような訓練データを与え、fitメソッドで学習をおこないます。学習済みのモデルのpredictメソッドを使うことで、テストデータが正常か異常かが判定されます。LOFを使う場合にも同様の流れになりますが、fitメソッドを使うときにちょっとだけ違いがあり、<font color="SlateBlue">novelty=True</font>という引数が必要になります。例えば、次のように訓練と予測をおこないます。

```python:lof_ex.py
from sklearn.neighbors import LocalOutlierFactor

model = LocalOutlierFactor(n_neighbors=1,
                           novelty=True,
                           contamination=0.1)
model.fit(train_data) # train_dataは正常データが大多数であるような訓練データ
prediction = model.predict(test_data) # テストデータに対する予測
score = model.score_samples(test_data) # テストデータの異常度
```

#使ってみる
人工的にデータを生成し、それらに対してLOFを適用していきたいと思います。
以下のような訓練データとテストデータを生成しました。緑が正常の訓練データ、オレンジが正常のテストデータ、赤が異常のテストデータになります。（手書き風のグラフはmatplotlibの機能を使っていて、自分の趣味です）。
![lof_features.png](https://qiita-image-store.s3.amazonaws.com/0/295140/41925003-9848-9a14-f478-2876c2c76a5e.png)

上記のデータを生成するコードは以下のとおりです。

```python:データ生成
from sklearn.datasets import make_blobs

X, _ = make_blobs(n_features=2, centers=1, cluster_std=[1], random_state=0, n_samples=100)
test_normal = X[:4]
train = X[4:]
test_anomaly = np.array([[0, 0], [-2.5, 2], [5, 4], [-2, 7]])
```

さて、実際にこれらのデータに対して訓練と予測を適用してみます。

```python:lof適用
model = LocalOutlierFactor(n_neighbors=2, novelty=True, contamination=0.1)
model.fit(train)
normal_result = model.predict(test_normal)
anomaly_result = model.predict(test_anomaly)

print("各正常データのスコア", normal_result)
print("各異常データのスコア", anomaly_result) 

# 次のように出力される
# 各正常データのスコア [1 1 1 1]
# 各異常データのスコア [-1 -1 -1 -1]
```

正常データに対しては1が出力され、異常データに対しては-1が出力されますが、きちんと正しい結果を得られていることがわかります。