OmniAICreator/Qiita-1.07M huggingface dataset:
AtomのRemote-FTPを使ってファイル保存と同時にアップロード

テキストエディタ(Atom)を使って、ローカルでファイル保存と同時にサーバーに自動アップロードする手順です。

・macOS Mojave 10.14.5
・Atome 1.38.2
・remore-ftp 2.2.2

# 1. 「Atom」のインストール
https://atom.io/

# 2. 「Remote-FTP」のインストール
メニューバーから Atom > Preferences > Install の順に進み、Search packages （検索窓）から「remote-ftp」を検索します。
![「remote-ftp」のインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129766/96977fd3-25ff-e93d-99eb-c53d4ceabb7e.png)
インストール完了後はAtomを再起動します。
ちなみに、起動の度にWelcome画面が出てくるので、「Show Welcome Guide when opening Atom」のチェックを外しておくとよいかもです。

# 3. Projectフォルダの追加
メニューバーから File > Add Project Folder の順に進み、Projectフォルダを選択します。
個人的にProjectフォルダはFTPのホスト名にしてプロジェクトを管理しています。

# 4. 設定ファイルの作成
続けて接続に必要な設定ファイルを作成します。メニューバーから Packages > Remote FTP の順に進み、 「Create FTP config file」または「Create SFTP config file」を選択します。

※ FTPは暗号化されていないため、運用には注意しましょう。

# 5.「.ftpconfig」の更新

## FTP設定
```
{
    "protocol": "ftp",
    "host": "example.com",
    "port": 21,
    "user": "user",
    "pass": "pass",
    "promptForPass": false,
    "remote": "/",
    "local": "",
    "secure": false,
    "secureOptions": null,
    "connTimeout": 10000,
    "pasvTimeout": 10000,
    "keepalive": 10000,
    "watch": [],
    "watchTimeout": 500
}
```

## SFTP接続の場合
```
{
    "protocol": "sftp",
    "host": "example.com",
    "port": 22,
    "user": "user",
    "pass": "pass",
    "promptForPass": false,
    "remote": "/",
    "local": "",
    "agent": "",
    "privatekey": "",
    "passphrase": "",
    "hosthash": "",
    "ignorehost": true,
    "connTimeout": 10000,
    "keepalive": 10000,
    "keyboardInteractive": false,
    "keyboardInteractiveForPass": false,
    "remoteCommand": "",
    "remoteShell": "",
    "watch": [],
    "watchTimeout": 500
}
```

# 6. サーバーに接続
メニューバーから Packages > Remote FTP > Connect の順に進みます。
![Connected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129766/2c4f8ffa-fd3c-0e48-e1c1-405a68b814fe.png)
画面右上に「Connected」の表示が出れば接続OKです。接続できない場合は「.ftpconfig」を見直します。

# 7. ダウンロード
![remote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129766/4536583d-afb8-e6af-523d-d52aee5240a5.png)
ダウンロードする場合は、Packages > Remote FTP > Toggleの順で表示します。
Toggleを選択すると画像の赤枠に「Project（ローカル）」と「Remore（サーバー）」のタブが出現するので、「Remore」タブに切り替えてサーバーのディレクトリにアクセスします。
右クリックで対象ファイルをダウンロードすると、FTPのユーザーディレクトリ構成でダウンロードされます。

# 8. アップロード
「Project」タブに切り替え、任意のファイルを更新して保存すると自動でアップロードされます。
または、右クリックで「Upload」を選択してもOKです。

# 9. 自動でアップロードしたくないとき
メニューバーの Atom > Preferences > Packages の順に進み、「remote-ftp」のSettings（歯車）をクリックします。
「Auto Upload On Save」がデフォルトで「always」になっているため、「never」に変更します。
Pythonでソートアルゴリズムの再発明をしてみる: ボゴソート

# 概要
* Pythonでソートアルゴリズムを再発明してみるだけ
* 今回はボゴソートについて
* 参考サイトのサンプルコードをできるだけ見ずに実装する
* とりあえず昇順ソートのみの対応とする

# ボゴソートの概要
* 配列内の要素をランダムにシャッフルする処理を、偶然ソートされた状態になるまでひたすら繰り返すという狂気のアルゴリズム
* 当然のことながらソートが完了するまで非常に時間がかかり、実用性は全くない

## 基本的な手順
1. 配列内の要素をランダムにシャッフルする
2. ソートされた状態になっているかどうかチェック。ソート済みの状態なら終了し、そうでない場合は1に戻る

# ソース
```python
import random
from datetime import datetime

def is_sorted(lst):
    for i in range(1, len(lst)):
        if lst[i-1] > lst[i]:
            return False
    return True


def bogo_sort(lst):
    while True:
        random.shuffle(lst)
        if is_sorted(lst):
            break


lst = list(range(10))
random.shuffle(lst)

print(datetime.now(), end="")
print("  ソート前: " + str(lst))

bogo_sort(lst)

print(datetime.now(), end="")
print("  ソート後: " + str(lst))
```

どれくらい遅いか見たかったので、適当にタイムスタンプを出すようにしました。
私の手元で試した感じだと速ければ数秒、遅くても1分くらいでした。
要素数が10程度では期待（？）してたほどは遅くないですね。
要素数を増やしたらどうなるか、試したい人は試してください。

# 参考サイト
* https://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%B4%E3%82%BD%E3%83%BC%E3%83%88
laravelのvalidateAlpha()は日本語でのイメージとは違う

# 結論
* [公式](https://laravel.com/)や
[日本語訳](https://readouble.com/laravel/5.5/ja/validation.html#available-validation-rules)の解説文を読むだけではだめで、コードを読むべき。  
* Laravelの `alpha` バリデーションは正規表現でいう `[a-zA-Z]` ではない。  

ということを分かっているならこの先は読む必要はない。  

# 内容
### `alpha` バリデーションはA,B,C,...をバリデートしない
→日本語の日常会話で「アルファベット」というと「A,B,C,...」と英字を指すことが多い。  
が、本来の意味は「文字そのもの」で、海外ではこちらの意味で使われる。
>アルファベット（英: alphabet）は、ひとつひとつの文字が原則としてひとつの子音または母音という音素をあらわす表音文字の一種であり、
また、それを伝統的な配列で並べたものをいう。
「アルファベット」という語は、ギリシア文字の最初の2文字 α, β の読み方である「アルファ」（ἄλφα）、「ベータ」（βήτα）に由来する。

(以上[weblio](https://www.weblio.jp/content/%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%99%E3%83%83%E3%83%88)より)

Laravelの定義済みバリデーション `alpha` ,  `alpha_num` , `alpha_dash` も、恐らくこのような意味で名づけられている。  
もし、「 `[a-zA-Z]` であること」をバリデートするバリデーションが必要な場合は、オーバーライドするか、独自のバリデーションを新たに定義しなければならない。  

###  `alpha` ,  `alpha_num` , `alpha_dash` に共通する、 `[\pL\pM\pN]` とは何か
バリデーションの定義をみると、次のように書いてある。


```php
    /**
     * Validate that an attribute contains only alpha-numeric characters, dashes, and underscores.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    public function validateAlphaDash($attribute, $value)
    {
        if (! is_string($value) && ! is_numeric($value)) {
            return false;
        }

        return preg_match('/^[\pL\pM\pN_-]+$/u', $value) > 0;
    }
```
pL, pM, pNとは、[PHPマニュアル](http://php.net/manual/ja/regexp.reference.unicode.php)によるとUnicode 文字プロパティのこと。  
つまり、 `[\pL\pM\pN]` は、以下の文字を含むということになる。

```
L  アルファベット (Letter)	Ll、 Lm、Lo、Lt および Lu を含む
M  記号 (Mark)
N  数字 (Number)
```
Unicode 文字プロパティに含まれる、実際の値はこのサイトに書かれているものだと思われる。
https://www.fileformat.info/info/unicode/category/index.htm


# 参考
https://blog.tes.co.jp/entry/2018/06/29/145450  
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/character-classes-in-regular-expressions#unicode-category-or-unicode-block-p  

# 未確認
* 正規表現の中で日本語などのマルチバイトを使ってマッチさせるには、パターン修飾子の u を付けて、  
パターンと対象文字列を UTF-8 として処理するように明示する必要があるらしい（文字コードが UTF-8 であるのが前提）。  

以下参考サイト  
[PHP の preg_replace には u 修飾子をつけた方がいい](https://tinybeans.net/blog/2016/03/14-110954.html)  

[[PHP]preg_matchの正規表現の中で日本語（マルチバイト文字）を使う](http://codaholic.org/?p=1671)  

[私の正規表現におけるポリシー](https://qiita.com/mpyw/items/8dd5378cb01c877e1f7b#pcre%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E9%96%A2%E6%95%B0%E3%81%AE%E4%BF%AE%E9%A3%BE%E5%AD%90%E3%82%84%E3%83%A1%E3%82%BF%E6%96%87%E5%AD%97%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%B3%A8%E6%84%8F)  

* [numericは[0-9]であることをバリデートしていない(未確認)](https://hnw.hatenablog.com/entry/20180414)  
→ギリシャ数字だけでなく、ローマ数字なども含むらしい。  

# 疑問
[a-zA-Z0-9_-]は、_以降という表現にならないのか？  
`[-{] ` だと、`{` まで、という意味になるのに・・・？ 
[ASCII](https://ja.wikipedia.org/wiki/ASCII)が基準だから、 `[-{] ` は「最初から{までの文字」ということになるのだろうか...｡
土壌水分センサー


#はじめに
土壌水分センサーをArduino Unoに接続してみました。

参考にしたページは -> [ここ](http://www.circuitstoday.com/arduino-soil-moisture-sensor)

購入したセンサは、　＝＞　[これ](https://www.amazon.co.jp/gp/product/B01H6WK51I/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1)

#用意したもの
土壌水分センサー：(MH-Sensor Series)
マイコン：Arduino UNO
環境：Arduino IDE

#接続方法
アナログポートのA0からA3に、センサーのピンを直接接続しました。
A0とA1をアナログポートとして利用しました。　A2とA3をデジタル出力に切り替えて、電源として利用します。

A0 アナログ信号（土壌水分量が増えると電圧が下がる）
A1 デジタル信号（土壌水分量の電圧の閾値を設定して、その値を下がると、電圧がLowになる）
A2 GND,デジタルポートのLOWとして設定
A3 VCC,デジタルポートのHighとして設定

#プログラム
プログラム例の　Basic の中から、　AnalogReadSerial.ino を選び、書き直して利用。


``` CPP:SoilMoistureSensor.ino
/*
　SoilMoistureSensor.ino 
   e-lab2020 Ltd.       2019-07-03

  参考にしたサンプルプログラム　 AnalogReadSerial
  Reads an analog input on pin 0, prints the result to the Serial Monitor.
  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
  This example code is in the public domain.
  http://www.arduino.cc/en/Tutorial/AnalogReadSerial
*/

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(A2,OUTPUT);digitalWrite(A2,LOW);   //for GND
  pinMode(A3,OUTPUT);digitalWrite(A3,HIGH);   //for VCC
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.print(analogRead(A1)); 
  Serial.print(",");
  Serial.println(sensorValue);
  delay(1);        // delay in between reads for stability
}

```
Scalatraを試してみる

# 前置き
以前、仕事でPlayFrameworkを使っていたのですが、その他のScala系Webフレームワークは全然触った事がありませんでした。
今回は勉強がてらその他のフレームワークを触ってみようと思います。

今回触ってみるのは、[Scalatra](http://scalatra.org/)です。
> Scalatra is a simple, accessible and free web micro-framework.
It combines the power of the JVM with the beauty and brevity of Scala, helping you quickly build high-performance web sites and APIs.

公式サイトによれば、シンプルでScalaの美しさと簡潔さを兼ね備えていて、高性能のWebサイトやAPIを迅速に構築できます。とのことです。
現在のstableな最新バージョンは2.6.5のようです。

# 事前準備
Scalatraを動かすのに必要な次のものをインストール

- Java 1.8以上
- sbt 0.13.13 

# Scalatraプロジェクト作成
好きなところにディレクトリを作成して次のコマンドを実行
`sbt new scalatra/scalatra.g8`
↑を実行してしばらくすると色々聞かれるので適宜入力する
※今現在、デフォルト設定のままだと、`scalatra_version [2.7.0-RC1]`をダウンロードするようです。

# 動かしてみる
出来上がったプロジェクトを実行してみます。
プロジェクトルートで次のコマンドを実行します。

```
$ sbt
sbt:My Scalatra Web App> jetty:start
```
これによりhttp://localhost:8080 でサーバが起動します。
アクセスして下の画面が表示されれば起動成功です。
<img width="577" alt="Menubar_と_Scalatra__a_tiny__Sinatra-like_web_framework_for_Scala_と_App Store.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7572/e54a581b-6c64-cb69-b854-fd92b15a5965.png">

#### 補足
開発中は、```~;jetty:stop;jetty:start```でサーバを起動することにより、ソースコードに変更が入った場合に自動的に反映されるので、サーバの再起動が不要になり便利です。
※ただし、自動検知されるのはScalaのソースのみで、テンプレートエンジン(Twirlなど)に変更が入った場合はスルーされるようです。

# 作成されたプロジェクトの中身を見てみる
自動生成されたプロジェクトのツリーはこんな感じになっています。
<img width="299" alt="my-scalatra-web-app____work_scalatra_my-scalatra-web-app__-_____src_main_scala_ScalatraBootstrap_scala__My_Scalatra_Web_App_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7572/92c3dcaf-26e3-d3cd-1c82-ab476bf257f6.png">

- ```ScalatraBootstrap``` ⇒ 起動クラス。ここにControllerが登録されている。別Controller追加可能。
- ```MyScalatraServlet``` ⇒ Controller。ここにルーティングとAction処理を書く
- twirlディレクトリ配下 ⇒　[Twirl](https://github.com/playframework/twirl) Scalatraデフォルトで使用可能なテンプレートエンジン。Playで採用されているものと同じ

# ルーティング
Scalatraのルーティングの例をいくつか挙げてみます。

```scala:MyScalatraServlet
package com.example.app

import org.scalatra._

class MyScalatraServlet extends ScalatraServlet {

  // GET / に対応
  get("/") {
    // twirlのテンプレート呼び出し
    views.html.hello()
  }

  // 条件による分岐 GET /で何かしらクエリストリングがあるケースに対応
  get("/", request.queryString.nonEmpty) {
    // 単純な文字列でもOK
    "query string is existing"
  }

  // GET /test?name=***に対応 paramsからnameの値を取得可能
  get("/test") {
    // HTMLタグをそのままでもOK
    <h1>Hello, { params("name") }</h1>
  }

  // GET /test/***に対応 こっちもparamsからnameの値を取得可能
  get("/test/:name") {
    <h1>Hello, { params("name") }</h1>
  }

  // 403を返す
  get("/forbidden") {
    Forbidden { <h1>Forbidden !!</h1> }
  }

  // 404を返す その1
  get("/notFound1") {
    // NotFoundメソッドを呼ぶやり方
    NotFound { <h1>Not Found !!</h1> }
  }

  // 404を返す その2
  get("/notFound2") {
    // haltメソッドで詳細な情報を返すやり方
    halt(
      status = 404,
      body = <h1>Not Found!!</h1>,
      headers = Map(
        "X-Hoge" -> "hoge",
        "X-Fuga" -> "fuga",
      )
    )
  }
}

```

触れ込み通り、シンプルですね。わかりやすいと思います。

# 最後に
ほんの触りだけ紹介してみました。かなり使いやすそうなニオイがします。
PlayFrameworkはちょっと色々含まれすぎていて大仰すぎる、といった場合にはScalatraを採用するのもありかも知れません。
今後、簡単なREST APIサーバを書く機会があった場合は是非使っていきたいと思います。
FATAL: Module nvidia-uvm not found in directoryの対処法

AWSのGPUインスタンス(Ubuntu 16.04)で
`FATAL: Module nvidia-uvm not found in directory`
というエラーが出たのでその対処法

CUDAをインストールしたら解決した

- まず既存のドライバを無効に

```
$ echo -e "blacklist nouveau\nblacklist lbm-nouveau\noptions nouveau modeset=0\nalias nouveau off\nalias lbm-nouveau off\n" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
$ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
$ sudo update-initramfs -u
$ sudo reboot
```

- カーネルモジュールをインストール

```
$ sudo apt-get install -y linux-image-extra-virtual
$ sudo reboot
$ sudo apt-get install -y linux-source linux-headers-`uname -r`
```

- CUDAをインストール
    - https://developer.nvidia.com/cuda-downloads
    - ここで登録を行ってから
    - 自分の環境にあったものを選んでいく
        - `$ cat /etc/lsb-release`でUbuntuのバージョンとか確認できる

```
$ https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1604-10-1-local-10.1.168-418.67_1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604-10-1-local-10.1.168-418.67_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda
$ rm cuda-repo-ubuntu1804_10.1.168-1_amd64.deb
```

- この後　~/.bashrc　の末尾に以下を追記

```
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

- その後再ログインして`nvidia-smi`で動作確認できる

```
$ sudo reboot
$ nvidia-smi
```

### 参考にしたサイト
- http://blog.algolab.jp/post/2016/08/03/torch-aws-gpu-ubuntu/
- https://qiita.com/yukoba/items/4733e8602fa4acabcc35
AWSマネジメントコンソールの色をアカウントによって変更するChrome拡張機能「AWS COLOR CHANGER」を作った！

# はじめに
タイトルの通り
AWSのマネジメントコンソールのヘッダーとフッターの色をアカウントによって変更するChrome拡張機能を作成してリリースしました。
下記リンクよりインストール可能です。
https://chrome.google.com/webstore/detail/aws-color-changer/kmkpghoahklaglhoeljgnhdijhpainph?hl=ja

# 使い方
１.インストールしたらアイコンから「オプション」をクリックして下さい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/99400381-12f7-ad8b-f15a-4db904f189a9.png" width=40%>

クリックすると
アカウントとカラーコードの設定画面が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/494038cd-8c01-2e5c-559a-437a39d28532.png" width=60%>


2.アカウント(アカウントがデフォルトの数値の場合は「-」ハイフンを除いて)と対応するカラーコードを入力して保存ボタンをクリックして下さい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/a22b6e98-5dc7-7e53-51d8-96f376149eee.png" width=60%>

3.AWSにログインするとヘッダー、フッターの色が変更されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/3658e798-d1f3-7210-4a77-dfb5bce97e9e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/f0b7e845-a642-ec4a-af7c-1b882c70f337.png)

# 終わりに
本番アカウント、テストアカウント、別のお客様環境等で
リリース作業中、検証作業中にアカウントを間違えた！
なんて事のないように防止策の一つとして作成しました。
現在、登録できるアカウントは８つまでですが、
今後は可変式の入力フォームにする予定です。

その他、要望がありましたらコメントにて

※当拡張機能の実装詳細は別記事にて紹介しております。
[AWSマネジメントコンソールの色をアカウントによって変更するChrome拡張機能を作った(実装編)](https://qiita.com/Shi-nakaya/items/ef11f69cca1e216b6d3e
)
適当なHooks入門【useEffect前編】

## 概要
Reactで開発するにあたってHooksちゅう新しい機能を使うので、公式ドキュメントで勉強したことを投稿していこうと思います。

[公式ドキュメント](https://ja.reactjs.org/docs/hooks-effect.html)

## Hooksとは？
> state などの React の機能を、クラスを書かずに使えるようになります

つまり関数コンポーネントで従来のクラスのように、Stateの管理やらライフサイクルっぽいことができる機能みたいです。

## 副作用フックをやってみる
### 副作用フックとは？
>副作用 (effect) フック により、関数コンポーネント内で副作用を実行することができるようになります

ん〜、これだけだとよくわからん。てかヒントの方がわかりやすい！  

>ヒント  
React のライフサイクルに馴染みがある場合は、useEffect フックを componentDidMount と componentDidUpdate と componentWillUnmount がまとまったものだと考えることができます。

つまり関数コンポーネント内でライフサイクルっぽいことができる関数ってことなんですかね？

### クリーンアップを必要としない副作用
1. React が DOM を更新した後で追加のコードを実行したい場合

~~~JSX  
import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    alert(count)
  });

  return (
    <div>
      <p>clicked {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
~~~
上記のコードではボタンをクリックするとcountが更新され`useEffect`が呼ばれアラートが表示されます。

`useEffect`内の処理は初回のレンダー時および毎回の更新時に呼ばれるため、ライフサイクルで言う所の「componentDidMount」や「componentDidUpdate」と同じような動作となります。

### クリーンアップを有する副作用
2. 購読をセットアップしたい場合 
 
~~~JSX
import React, { useState, useEffect } from 'react';

function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);

  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    // Specify how to clean up after this effect:
    return function cleanup() {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}
~~~
※ 公式ドキュメントの例

すごい適当に言うと、「componentWillUnmount」内でやるような処理はuseEffect内で関数（上記の場合cleanup関数）を返せば同じようなことができるみたいです。

## ざっくりまとめ
1. `useEffect`を使うと関数コンポーネント内でライフサイクルっぽいことができるで
2. 「componentDidMount」「componentDidUpdate」でやる処理は`useEffect`内に書くんやで
3. 「componentWillUnmount」でやる処理は`useEffect`内でやりたい処理を書いた関数を返してや

## おわりに
一見簡単なように見えましたが、実際に既存のクラスコンポーネントをfooks化した際はハマるところが多かったです。
でもとりあえずは、まとめのような感じの理解でいいのかもしれない。。。
Identityの設定メニューについて

#証明書と鍵の管理
Salesforce 証明書と鍵のペアは、要求がユーザの組織からのものであることを確認する署名として使用されます。証明書と鍵は、外部 Web サイトとの認証済み SSL 通信で使用されるか、組織を ID プロバイダとして使用するときに使用されます。使用している外部 Web サイトで要求が Salesforce 組織から行われていることを確認する必要がある場合は、Salesforce 証明書と鍵のペアの生成のみ必要です。

#シングルサインオン設定
シングルサインオンを設定して、Salesforce 組織はIDプロバイダとしてSAMLによるログインなしにサービスプロバイダへアクセス可能。

#認証プロバイダ(ソーシャルサインオン)
認証プロバイダは外部サービスプロバイダのログイン情報を使用して、Salesforce 組織にユーザがログインできるようにします。Salesforce では、Google、Facebook、Twitter、LinkedIn など、OpenID Connect プロトコルをサポートするアプリケーション用の認証プロバイダが提供されます。OpenID Connect をサポートしないアプリケーションには、カスタム認証プロバイダを作成するための Apex の Auth.AuthProviderPluginClass 抽象クラスが提供されます。
#ID プロバイダ
ID プロバイダは、ユーザがシングルサインオン (SSO) を使用して他の Web サイトにアクセスできるようにする信頼済みプロバイダです。サービスプロバイダは、アプリケーションをホストする Web サイトです。Salesforce を ID プロバイダとして有効化し、1 つ以上のサービスプロバイダを定義できます。これにより、ユーザは SSO を使用して、Salesforce から他のアプリケーションに直接アクセスできるようになります。SSO を使用すると、いくつものパスワードを覚える必要がなく、1 つだけ覚えておけばよいため、ユーザは非常に助かります。
#リモートサイトの設定
Sコントロールやカスタムボタンで XmlHttpRequest を使用して、Visualforce ページ、Apex 呼び出し、または JavaScript コードで外部サイトを呼び出せるようにするには、事前に [リモートサイトの設定] ページにそのサイトを登録しておく必要があります。登録していないと、呼び出しは失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/84ead963-5105-a49d-ebd0-e0b5e6e7147e.png)

#CSP 信頼済みサイト
Lightning Component フレームワークは、Content Security Policy (CSP) を使用してコンテンツに制約を適用します。主な目的は、クロスサイトスクリプト (XSS) 攻撃や他のコードインジェクション攻撃を阻止することです。外部 (Salesforce 以外の) サーバに対する要求を実行するサードパーティ API や、WebSocket 接続を使用するには、CSP 信頼済みサイトを追加します。

SP ヘッダーディレクティブへの変更によって、Lightning コンポーネントがサイトから画像、スタイル、フォントなどのリソースを読み込むことができます。また、クライアント側のコードでサイトへの要求を行うこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/dff3cf09-d4e2-4a83-3e4f-53dbe467fa9c.png)

#指定ログイン情報
コールアウトエンドポイントの URL と必要な認証パラメータを 1 つの定義内に指定する、指定ログイン情報を作成します。
指定ログイン情報をコールアウトエンドポイントとして指定することで、Salesforce ですべての認証を処理できます。

指定ログイン情報で定義されたサイトについては、外部サイトへのコールアウトに必要なリモートサイト設定もスキップできます。
#Identity Connect
Identity Connect は、Microsoft Active Directory (AD) と Salesforce を統合します。AD で入力されたユーザ情報は、すばやくシームレスに Salesforce と共有されます。ユーザ管理に AD を使用している会社は、Identity Connect を使用して Salesforce アカウントを管理できます。
#Oauth カスタム範囲
カスタムアプリケーションが外部エンティティからアクセスできるデータに関する権限を定義するには、Salesforce で OAuth カスタム範囲を作成します。カスタム範囲は、接続アプリケーションがどの情報にアクセスできるかを外部エンティティに指示します。
#その他
**Salesforce Identity を実装するには、次のいずれかを使用します。**

- Security Assertion Markup Language (SAML)
- OAuth 2.0
- OpenID Connect
- 私のドメイン
- 接続アプリケーション
- アプリケーションランチャー
- Identity ライセンス
- External Identity ライセンス
- ID プロバイダおよびサービスプロバイダインテグレーション
- Salesforce Identity Connect
- 2 要素認証

**次の Salesforce 機能を使用するには [私のドメイン] が必要です。**

- 外部 ID プロバイダを使用したシングルサインオン (SSO)
- Google や Facebook などの認証プロバイダを使用したソーシャルサインオン
- Lightning コンポーネントタブ、Lightning ページ、Lightning アプリケーションビルダー、またはスタンドアロンアプリケーションの Lightning コンポーネント

#Resource
- [Salesforce 指定ログイン情報で自組織にAPIアクセス](https://qiita.com/yhayashi30/items/1100905ad673ec7b68d9)
- [SalesforceをIDプロバイダとして、外部アプリケーションとSAML認証する](https://qiita.com/comefigo/items/b06d28066cea214869e5)
- [Salesforceのシングルサインオンをまとめてみる](https://www.terrasky.co.jp/blog/2014/140116_001330.php)
[Flutter備忘録] FireStoreからのテキストを改行して表示する方法

## 概要
初歩的なことだが、自分的につい嵌りがちなところだと思ったのでメモ

FireStoreにStringデータを保存するときに改行がつめられて保存されてしまう。
なので意図的に改行文字「\n」を入れるのだが、そのまま表示させても改行されないので少し工夫が必要。

## サンプル
```dart:文字列
text = "一行目は改行されません。\n二行目は改行されます。"
```

```dart:改行方法
Text(text.replaceAll('\\n', '\n'))
```

サーバーからのレスポンスでは、`\`に対してエスケープ文字が付いて`\\n`として返ってくるので
クライアント側でreplaceしてあげる必要がある。

自分がよくやってしまうので、
ご参考になれば幸いです。
今日学んだ事

#7/3(水)

###●resourcer メソッドのネスト

```routes.rb
resources :books do
    resources :reviews
```
・1つの本に対して、複数のレビューを行うためのレビュー

###●form_for
・特定のモデルを編集、追加するためのフォームを作成するヘルパーメソッド。
・特定のテーブルにレコードだけ新規作成、更新する時に使用。

```
<%=form_for(モデルクラスのインスタンス) do |変数|%>
```


###●ヘルパーメソッド
・viewをよりシンプルに書くためのもの
EC2へElastic IPを設定できない

AWSの[10分間チュートリアル](https://aws.amazon.com/jp/getting-started/tutorials/?awsm.page-tutorials-all=1)の
- [WordPress ウェブサイトの起動](https://aws.amazon.com/jp/getting-started/tutorials/launch-a-wordpress-website/?trk=gs_card)
- [ドメイン名の登録](https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/)
の流れにおいてElastic IPを既存のEC2へ設定できなかった。

#事象
<img width="820" alt="スクリーンショット 2019-07-03 19.46.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228538/1b9f4173-e1ee-f060-12f9-2e2734fedd51.png">

インスタンスに何も表示されない。インスタンスIDを入力しても何もでてこない。

#原因
リージョンが違ったよ〜；；

EC2ではオハイオ、Elastic IPではバージニア北部を選択していたため、設定できていなかった。
どちらもオハイオにすると設定できました。
どこで変わったのかは謎であるが、同一リージョンでないと関連付けできないと学習できる良い機会でした。
Terraform で AWS のポリシー JSON にリストを埋め込みたいとき

AWS のポリシーを書くときに JSON を heredoc で書くことがあると思います:

```json:elastic_search_domain_policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSpecificIpAddresses",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "es:*"
      ],
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "9.8.7.6",
            "10.11.12.13",
            "100.101.102.103",
            "11.22.33.44"
          ]
        }
      },
      "Resource": "arn:aws:es:ap-northeast-1:000000000000:domain/my-aws-elasticsearch/*"
    }
  ]
}
```

このなかで特定の IP のリストに対して、たとえば

```hcl:allow.tf
locals {
  allowed_ips = ["9.8.7.6", "10.11.12.13", "100.101.102.103", "11.22.33.44"]
}
```

のように Allow 対象の IP をリストで持っている + リストは `variable` とかで渡ってくるという場合、この `list` を埋め込む必要があります。

## Interpolation?

これに対し普通に Interpolation とかを使うとエラーになりますね:


```hcl:allow.tf
resource "aws_elasticsearch_domain_policy" "elasticsearch_policy" {
  domain_name = "${aws_elasticsearch_domain.elasticsearch.domain_name}"

  access_policies = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSpecificIpAddresses",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "es:*"
      ],
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "${local.allowed_ips}"
        }
      },
      "Resource": "${aws_elasticsearch_domain.elasticsearch.arn}/*"
    }
  ]
}
  POLICY
}
```

> *Error: Invalid template interpolation value*
> **local.ngw_public_ips** is list of string with 2 elements

## どうするか

この場合、リソース + heredoc で書くのをやめて、データソースで定義する方法があります

→ `aws_iam_role_policy` リソースに対して 
`aws_iam_policy_document` データソースを使えるように:
 https://www.terraform.io/docs/providers/aws/guides/iam-policy-documents.html

ただ、`aws_elasticsearch_domain_policy` のようにデータソースで記述できないケースがあります:
https://www.terraform.io/docs/providers/aws/r/elasticsearch_domain_policy.html

## `jsonencode` を使う

その場合 `join` を駆使して……とか考えますが、
そうしなくとも [`jsonencode`](https://www.terraform.io/docs/configuration/functions/jsonencode.html) を使うのが楽です:

```hcl:allow.tf
resource "aws_elasticsearch_domain_policy" "elasticsearch_policy" {
  domain_name = "${aws_elasticsearch_domain.elasticsearch.domain_name}"

  access_policies = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSpecificIpAddresses",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "es:*"
      ],
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": ${jsonencode(local.allowed_ips)}
        }
      },
      "Resource": "${aws_elasticsearch_domain.elasticsearch.arn}/*"
    }
  ]
}
  POLICY
}
```

こうすることで `${jsonencode(local.allowed_ips)}` は
 `["9.8.7.6", "10.11.12.13", ...]` と JSON の `Array` に展開されるので、
そのまま書くことができます。

## 余談

もし各要素に対して `map` 的な操作が必要であれば、
バージョン `0.12` から List Comprehension が使えるようになったので、
簡単に各要素を変更することができるようになりました:
https://github.com/hashicorp/terraform/issues/8439

---

そもそも IP 制限とかではなく IAM ロールを使ったほうがいいってのはあります……
【Python】pandasで複数データのグラフ化

Excelデータから指定列の組合せをグラフ化

##テストデータ
Test.xlsxの内容

| A1 | B1  | C1 | A2  | B2   | C2 |
|----|-----|----|-----|------|----|
| 1  | 3.3 | 15 | 0.5 | 3.6  | 25 |
| 2  | 3.4 | 18 | 1   | 3.5  | 30 |
| 3  | 3.6 | 20 | 2   | 3.4  | 40 |
| 4  | 3.7 | 25 | 4   | 3.7  | 42 |
| 5  | 3.8 | 28 | 5   | 3.8  | 44 |
| 6  | 3.9 | 30 | 6   | 3.9  | 45 |
| 7  | 4   | 35 | 7   | 4.1  | 48 |
| 8  | 4.1 | 38 | 9   | 4.15 | 50 |
| 9  | 4.2 | 40 | 9.5 | 4.2  | 52 |
| 10 | 4.2 | 42 | 10  | 4.17 | 53 |

##１．２グループのデータ（Ａ１－Ｂ１とＡ２－Ｂ２）を１つのグラフにする

~~~python
import pandas as pd
import matplotlib.pyplot as plt

df= pd.read_excel('Test.xlsx', sheet_name='Sheet1', usecols=[0,1,3,4],header=0) 

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.plot('A1', 'B1', data=df, label='No 1', marker='o')
ax.plot('A2', 'B2', data=df, label='No 2', marker='o')

plt.show()
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439291/bedd61ea-400a-e938-f136-8143ea8dfd55.png)

##２．２軸（Ａ１－Ｂ１とＡ１－Ｃ１）のあるグラフ

~~~python
import pandas as pd
import matplotlib.pyplot as plt

df= pd.read_excel('Test.xlsx', sheet_name='Sheet1', usecols=[0,1,2] ,header=0) 

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.plot('A1', 'B1', data=df, label='B1', marker='o',color="g")
ax1 = ax.twinx()
ax1.plot('A1', 'C1', data=df, label='C1', marker='X',color="r")
plt.show()
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439291/71a31b85-8741-6785-37a8-db034aaed31a.png)
ドットインストール での学習環境の準備方法(Mac版)

#学習を開始する準備

1. ターミナルを立ち上げて、MyVagrantのファイル(ディレクトリ)に移動する

```
$ cd MyVagrant
```

2.同じくcdコマンドで、MyVagrantのファイルの中のMyCentOSファイル(ディレクトリ)に移動する。

```
$ cd MyCentOS
```

3.仮想マシンを立ち上げる方法
vagrant upコマンドを実行して、仮想マシンを立ち上げる（時間がかかる）。

```
$ vagrant up
```

以下のコマンドで仮想マシンの状態を確認し、runningになればok!
https://gyazo.com/9778b3109e2c0a3ff828aa47c1cac108

```
vagrant status
```

4.仮想マシンのログインする方法
vagrant sshコマンドを実行して、仮想マシンにログインする。

```
$ vagrant ssh
```

そして、vagrant@localhost ~になっていれば、ログンカが完了する。

```
[vagrant@localhost ~]
```

https://gyazo.com/76045c48684d1b309d9d7827752e4f7b

5.Cyberduckにアクセスして、ブックマークしたレッスンのファイルを開く。

６.ターミナルの方で、cdコマンドでレッスンのファイルに移動する(phpのレッスンの場合)。

```
$ cd php_lessons
```


7.sa-ba-を立ち上げる(phpのレッスンの場合)

```
$ php -S 192.168.33.10:8000
```

以下のアドレスにアクセスして、プログラムの動作確認を行う。

```
http://192.168.33.10:8000　
```

分からなくなったら、ドットインストールを見る
https://dotinstall.com/lessons/basic_localdev_mac_v2/38506


#学習を終了する準備

1.ターミナル上の終了方法
 ・コントール＋cで、サーバーダウンさせる。

2.**仮想マシンからのログアウト**
　・exitコマンドを実行すして、macにもどる。　

3.**仮想マシンの停止方法**
　・vagrant suspendコマンドを実行して、仮想マシンを停止させる。

4.ターミナルの終了方法
　・exitコマンドでシャットダウンする。
ベクトルタイル将来計画

![link text](https://un-vector-tile-toolkit.github.io/signature/logo.png "the UN Vector Tile Toolkit logo")
ベクトルタイルに関する将来構想について[英語で書いてみました](https://hackmd.io/@hfu/system). これまで数回の間に Qiita で書いたことを少し抽象度をあげて整理したものになりますね。
Discordの絵文字IDを確認する方法

# Discordの絵文字IDを確認する方法
Discordのbotで絵文字を利用したくて、色々調べた結果あんまり日本語の記事がなかったので備忘録代わりに。
## 結論
絵文字IDを調べたいサーバー(開発側だとGuild(ギルド)って言うらしいですね！）で、
```\:emojiname:```
バックスラッシュを付けて絵文字表示しようとすると
```<:emojiname:275938272957>```
と言うような表示になりIDを取得できます。

## 余談(discordgoでの絵文字の使い方)
[discordgo](https://github.com/bwmarrin/discordgo)を使ってDiscordのbotを作ろうかなって思っていて、botで絵文字表示をしようとしたところ絵文字にならない！ということに気づき、[godoc](https://godoc.org/github.com/bwmarrin/discordgo)を読んでいたところ、Emojiという構造体があることを発見。
Emojiを取得できそうな関数がないかなと思って見てみると
> func (*State) Emoji
func (s *State) Emoji(guildID, emojiID string) (*Emoji, error)
Emoji returns an emoji for a guild and emoji id. 

説明文を見る限りこれっぽい！で、GuildIDとEmojiIDってなんだろ？となり、調べてみるとguildIDはサーバーのIDのこと、emojiIDは上で書いた方法で調べられるみたい。
最後にEmojiのままでは出力できないのでフォーマットをStringに変換する関数
>func (*Emoji) MessageFormat
func (e *Emoji) MessageFormat() string
MessageFormat returns a correctly formatted Emoji for use in Message content and embeds 

を利用して、絵文字の表示に成功しました。
### ソースコード

```go:discord_emoji.go
emoji,err := s.State.Emoji(GuildID,"123456748392")
if err != nil{
   panic(err)
}
sendMessage(s,c,emoji.MessageFormat())
```


## 参考文献
[Can bots display custom emojis](https://steamcommunity.com/app/682130/discussions/0/1621724915784032145/)
[ユーザー/サーバー/メッセージIDはどこで見つけられる？] (https://support.discordapp.com/hc/ja/articles/206346498-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8ID%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%89%E3%82%8C%E3%82%8B-)
シェルスクリプトでBigQueryからデータ取得

シェルスクリプトでBigQueryからデータ取得（bqコマンドの活用）
（サンプルはGCP課金を取得するクエリ）

# 前提
gcloudアカウント認証済み（gcloud auth login）の環境。

# シェルスクリプト
```shell:countGCPbilling.sh
#!/bin/bash
# GCP課金の集計

# 1時間前に出力されたGCP課金を集計（export_timeがUTCなので、JST時差9時間+1時間の10時間をマイナス）
YMDH=`date -d '10 hour ago' "+%Y-%m-%d %H"`
bqSQL="select project.id as project_id, replace(service.description, \" \", \"-\") as descript, round(sum(cost), 2) as total_cost from \`project-id.billing.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX\` where cost>0 and export_time between timestamp('${YMDH}:00:00') and timestamp('${YMDH}:59:59') group by project_id, descript order by project_id, descript"
echo "bqSQL=$bqSQL"
# bqコマンドで、BigQuery実行
bqResult=(`bq query -n 15000 --format=csv --use_legacy_sql=false "$bqSQL"`)
echo ""

# 集計結果の出力
i=1
while [ "$i" -lt "${#bqResult[*]}" ]
do
	j="${bqResult[$i]}"
	k=${j//,/ }
	m=(${k})
	# ここを改造してSlackに投げたり、prometheusでデータ取得できるようにしたり等用途は色々
	echo "count_gcp_billing_1hour:${m[0]} ${m[1]}=${m[2]}"
	
	i=`expr $i + 1`
done
```

# 参考情報
https://cloud.google.com/billing/docs/how-to/export-data-bigquery
https://cloud.google.com/bigquery/docs/reference/bq-cli-reference?hl=ja#bq_query
【Laravel、Composer】appフォルダのコントローラやモデルの削除やクラス名、ファイル名の手変更をクラスローダに反映する。

備忘録として残します。


artisanコマンドでモデルやコントローラを作成すると思います。
しかし、中には、コントローラ移動や、微妙にクラス名および、ファイル名を直接変更する方もいると思います。
変更しただけだとLaravelがwhoopsとエラー吐くだけなので、下記のコマンドを実行して、クラスローダの更新をしましょう。

#■やり方

```
composer dump-autoload
```

#■おわりに
appフォルダ以下はpsr-4準拠のクラスなので、エラーが発生する人は名前空間や、クラス名、ファイル名を見直してください。
配列内の要素が持つ関数を実行する

タイトルそのままですが，配列の要素が持つ関数を実行する方法をメモ的に残したいと思って書いておきます．
配列と言いつつメモ程度なのでlistで記述してますが，そこはご愛嬌でお願いします✌︎('ω'✌︎ )

# 環境
- macOS Mojave 10.14.5
- python 3.7.3

# 対象読者
- 筆者自身(万が一読まれても不快に思われない程度に書いてるつもりです)

# 実行方法
仮に下記のようなclassが存在するとします．

```python:sample_class.py
class sample():
    def __init__(self, hoge, fuga):
        self.hoge = hoge
        self.fuga = fuga

    def add(self):
        return self.hoge + self.fuga
```

そして配列はこんな感じです．

```python:run.py
from sample_class import sample

hogehoge = [sample(hoge=i, fuga=i*2) for i in range(10)]
```

当たり前ですが，以下のような実行はできません．

```zsh
>>> from sample_class import sample
>>> hogehoge = [sample(hoge=i, fuga=i*2) for i in range(10)]
>>> hogehoge.add()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'add'
```

こんな風に`list`オブジェクトに`add`なんて関数は存在しないと怒られてしまいます．
考えれば当然ですが`add`を持っているのは配列内の要素だからです．
なので要素を取り出す必要があり，取り出した要素の関数を1つずつ実行していきます．

## for文で実行する
このやり方が一番わかりやすいかと思います．先ほど作成した配列`hogehoge`から1つずつ取り出して要素`h.add()`で実行しています．ただこれだけだと新しい配列にならないので，空の配列`hoge_add`に`append`で追加しています．

```zsh
>>> hoge_add = []
>>> for h in hogehoge:
...     hoge_add.append(h.add())
...
>>> hoge_add
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
```

## 内包表記を使用する
わざわざ実行してリストに追加するなら，それを1行にしてしまえ！という感じでかけます．

```zsh
>>> hoge = [h.add() for h in hogehoge]
>>> hoge
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
```

わざわざ空の配列を宣言する必要もなくなり，`append`も不要になりました！とてもシンプルですね！

## mapを使用する
一風変わって関数を使用して実行します．
[map](https://python.ms/type/for/map-filter/#_1-map)の説明や[lambda](https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df)の紹介はここでは省きます．

```zsh
>>> hoge = list(map(lambda x: x.add(),hogehoge))
>>> hoge
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
```

内包表記との違いは速度面などにあるみたいです．これについても詳しく知りたい方は[こちら](https://utgwkk.hateblo.jp/entry/2017/03/09/154314)をご覧ください．

# まとめ
今回は3つの方法で配列の要素の持つ関数を実行してみました．一概にどの方法がいいとかいうわけではなく，場合によっては冗長でも`for`で書く必要もあると思います．なので，コーディングする際の引き出し程度に覚えておくと便利かと思います．
また，この他にもっと楽な方法とかご存知の方は，コメントお待ちしてます！！

# 参考
[map と filter ってなに？](https://python.ms/type/for/map-filter/#_1-map)
[Python の map とfor内包表記(リスト内包表記)は結局どっちが速い？](https://utgwkk.hateblo.jp/entry/2017/03/09/154314)
[Pythonのlambdaって分かりやすい](https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df)
矢印を表示させるためのショートカットキー(メモ書き)

矢印を表示させるためのショートカットキー

キーは、全角モードにする(かなキーを押す)。

```
←　z + h

↓　z + j

↑　z + k

→　z + l
```

キーボードの整列順で左からh,j,k,lの順番でzキーを一回押した後にそれぞれのキーを押してみる。
Google fontsをMaterial ui と一緒にReactで使いたい！

reactで作成しているウェブサイトでおしゃれなフォントを使いたいと思って実装してみました。
material ui を使う前提になるのでそこは悪しからず

環境：
　react@16.8.6
　@material-ui/core@4.1.1

<br>

↓Google fonts適用前はこんな感じ↓
<img width="175" alt="スクリーンショット 2019-07-03 18.32.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/0a401f2b-b814-623b-eff3-acd0cab7b3ae.png">
↓適用後はこんな感じです↓
<img width="171" alt="スクリーンショット 2019-07-03 18.36.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/716162a0-ba5c-9dda-0983-1793824ec181.png">
おしゃれさがぐんとアップしました。




#styled-componentsをインストール
```
$npm install --save styled-components
```
#grobalStyles.js のファイルを作成する
場所はどこでもいいです。自分がわかりやすいような場所に作ってください。
因みに私は、componentsやcontainerがあるフォルダと同じ階層にフォルダを作り、
その中にgrobalStyles.js　というファイルを作っています。

#作ったファイルで「createGlobalStyle」をインポート
```javascript:grobalStyles.js
import {　createGlobalStyle } from 'styled-components';
```
続いて、このようにかっこでくくる

```
createGlobalStyle``
```

#google fontsからとってきたurlを貼り付ける
urlの見つけ方は、好きなフォントを見つけたあと、プラスマークをクリックして、ページ下部に表示されたFamily selectedを開く


urlを追加したコード↓

```javascript:grobalStyles.js
import {　createGlobalStyle } from 'styled-components';

export default createGlobalStyle`@import url("https://fonts.googleapis.com/css?family=Ubuntu+Condensed&display=swap");
`
```

#componentsの中の親元のファイルでGlobalStyleをimportする
私の場合は、App.jsに書きました。

```javascript:components/App.js
import GlobalStyle from "../materialui/grobalStyles";

const App = () => (
  <div>
    <GlobalStyle />
  </div>
);

export default App;
```

#material uiのthemeにてGoogleFontを指定する

```javascript:theme.js
import {createMuiTheme} from '@material-ui/core/styles'

export const theme = createMuiTheme({
  typography: {
    "fontFamily": "\"Ubuntu Condensed\", \"sans-serif\"",
  },
})
```

#material uiのthemeをアプリに適用する
index.jsに theme を import して、MuiThemeProvider を追加する

```javascript:追加前のindex.js
render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);
```


```javascript:追加後のindex.js

import { theme } from "./materialui/theme";
import { MuiThemeProvider } from "@material-ui/core/styles";

render(
  <MuiThemeProvider theme={theme}>
    <Provider store={store}>
      <App />
    </Provider>
  </MuiThemeProvider>,
  document.getElementById("root")
);
```
一番上の階層のindex.jsに書いてます↑


これでお好みのフォントが適用されるはずです！
<br>

注意点：
この記事はmaterial uiがあることを前提としているので、
このコードの書き方だとmaterial ui のtypographyで指定した文字しか適用されない。
ただの＜h２＞や＜h2＞などのタグで指定したテキストには効かないので注意が必要です。
2019年6月27日以降に契約したさくらのVPSでHTTPやportを変更したSSHなどが繋がらない時

2019年6月27日より、さくらの VPS では、「パケットフィルタ」という機能が提供されるようになったようです。

- https://vps.sakura.ad.jp/feature/packetfilter.html

さくらの管理画面上から設定できる、簡易的なファイアウォールです。


CentOS7 インストール直後は、この機能がデフォルトで有効になるようで、**初期状態では 22 番ポート(SSH) 以外が、塞がった状態になっています。**

この事を知らないと、私のように**無駄な時間**を費やす事になってしまうかもしれませんので、これから契約する方は注意してください。

--------------------------------------------------------------------------------

## 中途半端な機能

この「パケットフィルタ」で制御できるのは、「決め打ち」で以下のポートです。

- 22（SSH）
- 80/443（HTTP/HTTPS）
- 20/21（FTP）
- 25/110/143/465/587/993/995（メール関連）

特に SSH は、ポート番号を変えて運用する方も多いと思いますので、中途半端な機能ですね。

今後は機能改善されるかもしれませんが、Firewalld などを扱える方は、現時点では「パケットフィルタ」を無効にして、そちらで運用することをオススメします。

--------------------------------------------------------------------------------

### オマケ：SSH はなぜ 22 番ポートなのか

これだけではあれなので、最後に小ネタを…。

- https://gigazine.net/news/20170505-ssh-port-number-22/
macOS Mojaveでpip installしたときに'ios' file not foundエラーが出る

`CFLAGS='-stdlib=libc++' `を先頭につけて`pip install`すれば良い。

```bash
# before
pip install pyworld

# after
CFLAGS='-stdlib=libc++' pip install pyworld
```

追記: `ld: library not found for -lstdc++`というエラーが出たときもとりあえずこれで解決できた。
あなたはRaspberry Pi 4、またはJetson NanoよりGoogleのサンゴを好むでしょうか？

あなたはRaspberry Pi 4、またはJetson NanoよりGoogleのサンゴを好むでしょうか？

どちらが機械学習に適していますか？

最高の柔軟性：Jetson Nano

逆さまに：あなたはあなたのコンピュータ上で走ることができる（4GB RAMに収まる）良いパフォーマンスと何かを走らせる

欠点：4歳のSOC、まともなオールラウンドパフォーマンスだが最も効率的ではない

ボーナス：素晴らしいソフトウェア/ライブラリのサポート、ヒートシンクなどが付属しています

最高の性能/ワット：コーラルDevBoard（また最も高価）

逆：最新チップ、最も効率的

欠点：TF Liteに縛られて、あなたは彼らが何をサポートしているのかどうかに苛立ちがある

ボーナス：あなたが何をしているのか知っていれば、おそらく最良の選択（perf / watt）、時にはJetson Nanoよりも速いです

Google Coralの販売代理店：https://store.gravitylink.com/global
![微信截图_20190520145825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/1e44a675-4a6b-e1d7-57d2-dc0fb26f6c02.png)


最低価格：Raspberry Pi 4

逆さまに：ほとんどのもののための安くて良いチュートリアル、おそらくCPUでどんなモデルでも走ることができる

欠点：CPUのみ、私の推定（RPi 3から推定）は、通常のTF + MobileNetで3?5 FPSを得ることができるというものです。 持続的な推論を実行するための追加のヒートシンク+ファンが絶対に必要です。

ボーナス：それはラズベリーパイです、私は何らかの理由でこれらのボードが大好きです。必要に応じて、後でUSBアクセラレータと組み合わせることができます。 また、あなたはlulzのためにそれをオーバークロックすることができます。
ラズベリーパイのバージョンを調べる

#ラズベリーパイのバージョンの調べ方
lsb_release -a

```
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.4 (stretch)
Release:	9.4
Codename:	stretch
```

LSB = Linux Standard Base
ディストリビューション = Raspbian
OS バージョン = GNU/Linux 9.4
コードネーム = stretch
stretch = トイ・ストーリーの紫色のゴム製のタコ
[ストレッチ](https://kids.disney.co.jp/character/stretch.html)
[Debian系コードネームwiki](https://ja.wikipedia.org/wiki/Debian#cite_note-stretch-release-news-3)

以上、よろしくお願いします。
bash で N行ずつバルク処理したい


ってあるよね？

# とりあえず 1000件ほどの tsv を適当に作って

```bash
cat /dev/urandom | base64 -w0 | fold -w 10 | paste - - - | head -n 1000 > huge.tsv
```

```bash
$ head huge.tsv
Posc8lji4o  2cwngkuL+q  SwowWLktkr
0MLQqvEx24  y4ZfM375H4  KdIhH9itax
iGzqpBq95C  7BmgvHrEsW  z/gIhZgo14
14K8v6wTqI  mh30NtgYou  Tj6qx6pE2n
nNy4svr68R  jdsSB6FYiY  +IAAsN53BC
8Pwjh53HhV  73IIKzPz5v  2j1GKgu35l
yvxzKpsJia  8LrRjxfrFD  ywFhlezZPS
xiDZKQf0Da  1227YQU5ya  +fMcvOYe0j
6rQ78nGsJd  kAvubrqgTG  N4XRAVQ3TD
bEwk7AEFbZ  NoREai/dtu  K6nm7sAdir
```

# 10行ずつに区切って適当なヘッダを付けてみます

## コツ

* `export -f` で function をexport して
* split の `--filter` にコールバックで指定する

```bash:a.sh
#!/bin/bash

function _bulk() {
    echo -e "c1\tc2\tc3"
    cat
}
export -f _bulk

cat huge.tsv | split -l 10 --filter _bulk
```

```bash
$ bash a.sh > out

$ wc -l out
1100 out

$ head -n 30 out
c1  c2  c3
Posc8lji4o  2cwngkuL+q  SwowWLktkr
0MLQqvEx24  y4ZfM375H4  KdIhH9itax
iGzqpBq95C  7BmgvHrEsW  z/gIhZgo14
14K8v6wTqI  mh30NtgYou  Tj6qx6pE2n
nNy4svr68R  jdsSB6FYiY  +IAAsN53BC
8Pwjh53HhV  73IIKzPz5v  2j1GKgu35l
yvxzKpsJia  8LrRjxfrFD  ywFhlezZPS
xiDZKQf0Da  1227YQU5ya  +fMcvOYe0j
6rQ78nGsJd  kAvubrqgTG  N4XRAVQ3TD
bEwk7AEFbZ  NoREai/dtu  K6nm7sAdir
c1  c2  c3
hWdqhFrK2B  hSbBavFqgR  idwa4ZvuZC
QrsXnSUXdN  k66wnHwi6k  g6DBRX14JX
izNslRLZVr  qmjCxAqvLG  lJ1nEwQNni
6UHA+nsKwW  gEE42phePd  gPnduaQKVn
QO3nKJi0Zs  jJcM/DfZJ5  PwwF9bocQS
NrvMzsIXWK  h4hnJyYt0p  20JVJBSJq5
22tRFn70W3  L0PG+uUpej  vPuPBws2m2
wyJhguYB1v  bH4HlBKl+4  UB6QaYntOe
o1YJ0c/O5t  fbiUKOiPBg  iKOOhDWRMK
aRu8DmegEW  Xf9PQWVhiS  KcRNN+vq//
c1  c2  c3
tDH9/+rB+z  PZCfl2p97S  wxbK/amAuK
rS4baCQ8SH  JS0pQujmvB  RnKEULeQL8
GX1DhRno99  HuY+vDUmyu  Qy2Pz/a/kz
QposxDvS9t  G27lJO64fZ  LLakF/D9bd
ExRSv1PSqv  kXDVf9WFyC  Y3TlhPPpIG
DLNn7NXVbM  EsZ54L1YW9  cvinfcaxwg
GNdpww4HU4  UkF5BjrXrc  SsDhVsy3bD
```

おわり。
Swift：タッチパッドの圧力を取得する（Force Touch）

```swift
import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var label: NSTextField!
    var monitor: Any?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear() {
        monitor = NSEvent.addLocalMonitorForEvents(matching: NSEvent.EventTypeMask.pressure) { (event) -> NSEvent? in
            DispatchQueue.main.async {
                self.label.stringValue = "pressure: \(round(100 * event.pressure) / 100)"
            }
            return event
        }
    }
    
    override func viewWillDisappear() {
        if let monitor = monitor {
            NSEvent.removeMonitor(monitor)
        }
    }

    override var representedObject: Any? {
        didSet {
        }
    }
    
}
```
Vagrant+VirtualBoxで共有ファイルが反映されないときの解決例

### 環境
Host OS: Windows 10 Home (バージョン 1809(OSビルド 17763.557))
Vagrant 2.2.4
Virtual Box 6.0.8
Vagrant Box(Guest OS): CentOS/7

## 発端
VagrantのゲストOS(CentOS)にある共有ディレクトリに設置したファイルをホストOS(Windows 10)から操作しようとしたところ、共有ファイルが相互に反映されない状態だったので原因を調べてみた。

## 結果
Vagrantに`vagrant-vbguest`というプラグインをインストールすることでファイル共有に成功した。
ファイル共有に失敗する現象は、`VirtualBox`と`Guest Additions`というソフトウェアのバージョン不一致によって起こり、`vagrant-vbguest`はそのバージョン不一致を解消するプラグインということだ。

## 試したこと
Vagrantの環境構築が初めてだったため、設定に問題があるのかと考え、様々な記事を参考に`Vagrantfile`を見直してみる。
主に`config.vm.synced_folder`やその`mount_options`でディレクトリのアクセス権限を変更してみたが状況は変わらず。

どのようなエラーが発生しているのか調べたところ、

```powershell
 > vagrant up
```
を実行したとき、以下のようなエラーメッセージが表示されていた。

```powershell
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' version '1902.01' is up to date...

.
.
.

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 home_vagrant_workspace /home/vagrant/workspace

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

[[vagrant mount フォルダ共有ができない問題を解決する | ふらっと考える]](https://omohikane.com/vagrant_mount_error_foldersync/)
を参考に`kernel-devel`をインストールしてみたが、

```powershell
 > vagrant up
```

```powershell
.
.
.

The error output from the command was:

mount: unknown filesystem type 'vboxsf'
```
というエラーメッセージが表示され、この場合の解決策にはならなかった。


## 解決にいたった経緯
以下の記事を参考に、`vagrant-vbguest`プラグインをインストールしたところ、ファイルの共有に成功した。
[[Vagrantでマウントエラーが発生したときの解消方法 - Qiita]](https://qiita.com/chubura/items/4166585cf3f44e33271d)
[[Vagrantで共有フォルダのマウントに失敗するときの対処方法 - Qiita]](https://qiita.com/ozawan/items/9751dcfd9bd4c470cd82)


```powershell
 > vagrant plugin install vagrant-vbguest
```

```powershell
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching: micromachine-2.0.0.gem (100%)
Fetching: vagrant-vbguest-0.18.0.gem (100%)
Installed the plugin 'vagrant-vbguest (0.18.0)'!
```
また、VirtualBox公式ドキュメントにもこの方法が紹介されているが、あくまでも公式サポートされている方法ではないとのこと。
[[Synced Folders - Getting Started - Vagrant by HashiCorp]](https://www.vagrantup.com/intro/getting-started/synced_folders.html)
## 参考
[[Vagrantでマウントエラーが発生したときの解消方法 - Qiita]](https://qiita.com/chubura/items/4166585cf3f44e33271d)
[[Vagrantで共有フォルダのマウントに失敗するときの対処方法 - Qiita]](https://qiita.com/ozawan/items/9751dcfd9bd4c470cd82)
[[Synced Folders - Getting Started - Vagrant by HashiCorp]](https://www.vagrantup.com/intro/getting-started/synced_folders.html)
Nuxt.js scrollBehaviorが効かない時

Nuxt.jsでページ遷移時に設定した scrollBehavior にしていた挙動が動かなくなりました。

原因としては全体に関わるcss内で、modal表示にその背景となるページをスクロールさせないために

```css

html, body {
 overflow: auto;
 height: 100%;
}
```

としていたのがよくなかった模様。

なのでmodal表示時のみに上記の指定をさせるために

```css

html.modalopen, body.modalopen {
 overflow: auto;
 height: 100%;
}
```

とクラスを設定し、modal表示時にpage componentに

```javascript:pages/contact.vue

head() {
   return {
     htmlAttrs: {
       class: this.isModal ? 'modalopen' : ''
     },
     bodyAttrs: {
       class: this.isModal ? 'modalopen' : ''
     },
     ...
```

としてbodyとhtml要素にクラスを設定するようにしました。
ほかにもhead の属性も操作できる模様。

こちらを参考にさせていただきました。　
https://qiita.com/ykoizumi0903/items/c79b577d6ca52cec6295
https://nuxtjs.org/guide/views#app-template
HC-SR04を使った距離計測

#はじめに

超音波センサーモジュールのHC-SR04を使って、距離を計測する装置をArduino Unoで作りました。
![IMG_1869.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453444/82bff269-b7bf-52a2-815d-81c9aacd5373.jpeg)

HC-SR04のアマゾンで購入はー＞[こちら](https://www.amazon.co.jp/%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%EF%BC%88SainSmart%EF%BC%89-HC-SR04-HC-SR04-%E8%B6%85%E9%9F%B3%E6%B3%A2%E8%B7%9D%E9%9B%A2%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB/dp/B004U8TOE6)


(参考にしたサイトはこちらー＞　DreamWalker さん[[ARDUINO] 超音波SENSOR(HC-SR04)を使って距離測定。](https://qiita.com/Dreamwalker/items/c22cac4b6bd07e4b2b9f)






# 準備するもの
使用するセンサー：HC-SR04
マイコン：Arduino UNO
開発環境：Arduino IDE


#接続方法
HC-SR０４を　UNOのデジタル入出力ポートの4番から７番に差し込みます。
トリガーポート(TRIGと書いてあるピン)を５番に、距離の出力端子（ECHOと書いてあるピン）を６番にさします。
VCCが４番、GNDが７番にささります。

![IMG_1868.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453444/a5755915-2da9-b226-bbd5-c3619e1ede34.jpeg)


![IMG_1870.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453444/9710d93e-6a7b-792e-7859-f73a82063a94.jpeg)

(ブレッドボードで配線するのがめんどくさかったので、)
４番と７番のデジタルポートは、それぞれを　HIGHと　LOWにすることで、　
5Vと0Vを提供して、電源端子として利用しました。

#プログラムの動作
トリガーに２０μsのワンショットパルスを出力して、　その直後から、Echo端子にパルスが出力されるまでの時間を計測します。　計測は、Arduino　の　pulseIn()関数を使いました。（便利ですね。^^）

puleIn()の戻り値は、超音波のパルスが跳ね返ってくるまでの時間ΔTなので、音速V（340m/s)から、
距離Dが求まります。　
　D= ΔT・V　[m] ・ここで、　pulseIn()の戻り値のΔTは単位がμs（マイクロ秒）なので、1000000(１×10の６乗倍なので　1E6)で割ってやる必要があります。　距離もメートルだと使いにくので、cm（センチメートル）単位にするために１００倍しました。


#プログラミング
プログラムの例：

```CPP:HC-SR04test.ino
/* HC-SR04  Test */
/* e-Lab2020 Ltd. 2019-07-03  */

const int VCC = 4;
const int TRIG = 5;
const int ECHO = 6;
const int GND  = 7;   

void setup()
{
    Serial.begin(9600);
    pinMode(GND,OUTPUT); digitalWrite(GND,LOW);  //GND: LOW 0V
    pinMode(VCC,OUTPUT); digitalWrite(VCC,HIGH); //VCC: HIGH 5V
       
    pinMode(TRIG, OUTPUT);    //Trig: output
    pinMode(ECHO, INPUT);    //Echo: input
}

void loop()
{

  // Start Pulse for HC-SR05
    digitalWrite(TRIG, LOW);        
    delayMicroseconds(2);            
    digitalWrite(TRIG, HIGH);    
    delayMicroseconds(10);      // 10us pulse      
    digitalWrite(TRIG, LOW);       

    //Echo 
    long duration = pulseIn(ECHO, HIGH);  //return : time (us)

    //音波の反射の時間計算
    //1cm移動時間 29.412us. ,1秒間で,340m/s  
    //音波の移動距離 = 往復時間/1cm移動距離 / 2
    //音波の移動距離　= 往復時間(ms) * 340*100(cm) / 1E6 (ms) / 2(往復から片道へ）
   float f_distance = (float)duration * 340.0 * 100.0/1000000.0 / 2.0;        

    Serial.print(f_distance);
    Serial.print(" cm");
    Serial.println();
    delay(100);
}

```
#動作確認
壁から６cmの位置に置いて確認しました。
![IMG_1873.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453444/fbb6dc6e-5440-864f-3105-8eed7189b616.jpeg)

#出力結果
ツールからシリアルプロッタを選んでグラフを表示させてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453444/10dae8ad-12d0-4e6b-27c0-82a798cd1516.png)

ツールで、シリアルポートをシリアルモニタで、表示させてみた結果がこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453444/e281e94f-2388-5f98-c705-8cfcdf22a744.png)

以上で試作報告を終わります。
(2019-07-03)
Netlify forms で項目を入力必須にする方法

Netlify であるかどうかは全く関係なく、HTMLのinputタグの機能として、ブラウザに入力必須であることを示す`required`属性が存在していることが分かりました。

http://www.htmq.com/html5/input_required.shtml

こんな感じで指定すると、

```html
<input type="text" name="name" required>
```

ブラウザ側でバリデートしてくれました。

↓Google Chrome
<img width="648" alt="Screen Shot 2019-07-03 at 17.54.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79577/399db31d-cc97-b197-0494-c6758acd819d.png">

↓Firefox

<img width="657" alt="Screen Shot 2019-07-03 at 17.56.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79577/0a8558f7-bf79-a1f0-1b91-acf6a0509d7d.png">


参照：
https://eleventy-netlify-boilerplate.netlify.com/contact/