OmniAICreator/Qiita-1.07M huggingface dataset:
Db2 : FETCH FIRST n ROWSとOFFSET、およびLIMIT代替構文

Db2は以前から、FETCH FIRST n ROWS ONLYをつけることにより、SELECTでn行までしか取得しないように限定する書き方ができました。

Db2 for LUW 11.1より、FETCH FIRSTの中にOFFSET節を指定して、スキップする行数を設定できるようになりました。

また、FETCH FIRST ... OFFSET節の代替構文として、LIMIT ... OFFSETも使用できるようになっています。


#FETCH FIRST節を使ったシンプルSQL

FETCH FIRST節はSELECTの中の様々な場所で使用することができますが、こちらはDb2のSAMPLEデータベースのEMPLOYEE表から5行のみを取り出すシンプルな例です。
(ここではORDER BY節がないため、順序は確定的ではありません。)

 
    SELECT LASTNAME FROM EMPLOYEE FETCH FIRST 5 ROWS ONLY 
            
    LASTNAME
    ---------------
    STERN
    PULASKI
    HENDERSON
    SPENSER
    LUCCHESSI

      5 レコードが選択されました。









 

#FETCH FIRST節のOFFSETオプション

FETCH FIRST n ROWS ONLYにOFFSETキーワードを使用して、スキップする行数を指定することができます。

OFFSETキーワードのシンタックスです。



 
    OFFSET n ROWS FETCH FIRST x ROWS ONLY
            
    

      







      





OFFSET n ROWSはFETCH FIRST x ROWS ONLYの前に置き、行を取得する前にスキップする行数を指定します。






この例は、EMPLOYEE表から最初の10行を取得します。(ORDER BY節がないため順序は確定されていません。）



 
    SELECT LASTNAME FROM EMPLOYEE FETCH FIRST 10 ROWS ONLY
    
    LASTNAME
    ---------------
    HAAS
    THOMPSON
    KWAN
    GEYERSPENSER
    STERNLUCCHESSI
    PULASKI
    HENDERSON
    SPENSER
    LUCCHESSI
    O'CONNEL

          10 レコードが選択されました。














OFFSET 0 ROWSは行をスキップしないという指定になります。



 
    SELECT LASTNAME FROM EMPLOYEE OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY
 






以下の例は、5行をスキップし、5行を取得します。



 
    SELECT LASTNAME FROM EMPLOYEE OFFSET 5 ROWS FETCH FIRST 5 ROWS ONLY

    LASTNAME    
    ---------------
    O'CONNEL
    QUINTANAHENDERSON
    NICHOLLASSPENSER
    ADAMSONLUCCHESSI
    PIANKA

          5 レコードが選択されました。
             
       




#LIMIT ... OFFSETの代替構文

Db2 11.1では、PostgreSQLやMySQLなど他のデータベース製品で使用されるSQLも簡単にDb2環境で実行できるようにする機能拡張が含まれており、FETCH FIRST ... OFFSET節の代替として、LIMIT ... OFFSETの代替構文も使用できるようになりました。


| 代替構文  |同等の構文 |
|:----------------|:--------------|
|LIMIT x          |  FETCH FIRST x ROWS ONLY |
|LIMIT x OFFSET y |OFFSET y ROWS FETCH FIRST x ROWS ONLY   |
|LIMIT y,x        |OFFSET y ROWS FETCH FIRST x ROWS ONLY   |











#参考資料



- [Db2 11.1 Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.welcome.doc/doc/welcome.html)

    - [fetch-first-clause](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0059212.html)
    - [offset-clause](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061832.html)
    - [SQL の互換性の機能拡張](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.wn.doc/doc/c0054107.html)
        - FETCH FIRST 節の OFFSET オプション
        - 代替構文
シェルスクリプトで改行する時はバックスラッシュの後に何も入れてはならぬ ( command not found )

# スクリプトの例

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

echo A \
     B \
     C

echo D \
     E \ 
     F
```

# 結果

```
$ bash example.sh

A B C
D E
example.sh: line 7: F: command not found
```

# command not found !!!  Oooooooooooops!!! 

## 何が悪いの？

E の行のバックスラッシュの後ろにスペースがある。

## 理由

おそらく

- Eの行は、改行をエスケープするのではなく、スペースをエスケープしている
- echo コマンドはそこで終了する
- シェルのインタープリタは次の行に進み、コマンドを実行しようとする
- `F` なんていうコマンドは存在しないのでエラーで終わる

# 環境

- bash 3.2

# 参考

- http://linux-training.be/funhtml/ch13.html#idp53723328








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Linux上でバックアップファイル群を適当にrotate

毎日バックアップしている何らかのファイル群を適当にrotateするときに使っています。

```
#!/bin/bash
_BACkUPDIR='/backup'
_limit=10

find "${_BACKUPDIR}" -type f -ctime "+${_limit}" -exec \rm -fv {} \; | logger
```

この例では、バックアップファイルのctimeが10日以前のファイルを削除しています。
rmの処理は怖いですがcronにワンライナー書けばとりあえず動くので便利です。
OpenMBEE MDKの導入

#公式
https://github.com/Open-MBEE/mdk

#導入
MMSやVEはソースから導入したが今回は用意されているものを上書きするという簡単な方法で行う。
もしコンパイルをする場合はgradleを使う。
※gradlew.batを実行

GithubのREADME.mdにあるDownloadをクリックして「mdk-4.4.2-plugin.zip」をダウンロード
中身をMagicDrawのフォルダに上書きする。

#確認
Magicdrawを起動すると以下のようにMDKとMMSのメニューが増えている。
![2019-03-26 171931.png](https://qiita-image-store.s3.amazonaws.com/0/269632/cadd6839-46a5-68c9-a29a-e025aca95055.png)
Mail::Messageをオーバーライドする方法

# Mail::Messageオーバーライドできない問題
`Rails4`くらいから、`Mail::Message`が`ActionMailer::MessageDelivery`オブジェクトにラップされている為、普通に`Mail::Message`のメソッドをオープンクラスして上書こうとしてもできないようになっています。
というのも、`ActionMailer::MessageDelivery`は`Delegator`。
`Delegator`は動的に委譲先を設定するので、`MessageDelivery.new`された時にクラスが評価されます。
オープンクラスはロード済みのクラスに対してオーバーライドやメソッド追加できる機能なので、この場合オープンクラスできない…ということになるのだと思います…（自信薄）

# じゃあどうする
今回の場合`delivery`自体を上書きたかったので、`ActionMailer::MessageDelivery`をオープンクラスして`super`しました。

```ruby:パッチ
module ActionMailer
  class MessageDelivery < Delegator
    def deliver
      ...(略)...
      super
      ...(略)...
    end
  end
end
```

ActionMailerの解説は下記が詳しいですが、機能が込み入りすぎてあと10回読み直したい。
[ActionMailerは何をしているのか](https://qiita.com/fursich/items/bb75a06714bcad6a0afb)

なお、変にパッチをあてるよりも、Railに乗れるなら本来そっちのがベター。
コールバックやフックもちゃんと準備されています。
[Action Mailer の基礎](https://railsguides.jp/action_mailer_basics.html)

## おまけ
REPLで`hoge = Mail::Message.new`すると、`inspect`されるので
ちゃんと上書かれているように見えます。これで余計にハマったのでした。
[Railsでの観察者効果](https://qiita.com/jkr_2255/items/cec5c4b7518899396b04)
JavaScript配列+配列をするとjoin()される

# JavaScript配列+配列をするとjoin()される
Arrayに+演算子を適用したらどうなるのかという話です。
これにハマった人が嘆いていたので気になって調べました:grinning:

## 論よりコード

``` sample.js
a=[1,2];
b=[3,4];
c=a+b;
console.log(c)   // => "1,23,4"
```
JavaScript「配列と配列の+演算？できますできます join()処方しておきますね^^」

配列+配列をしたつもりが面白いことに変数cは文字列になって妙な結合をしていますね:sweat_smile:
~~この程度のことではTypeErrorにならないクールなところが個人的には好きです~~

### 正しくは

``` sample2.js
a=[1,2];
b=[3,4];
c=a.concat(b);
console.log(c)   // => [1, 2, 3, 4]
```
やりたいのはこういうことだと思う:hugging:
# 何が起きているのか
## 簡単に言うと
・配列に+演算はできないので暗黙の型変換がおきる
↓
・変換が行われて内部的に配列に対してjoin()メソッドが適用される
↓
・文字列同士であれば+演算子は連結を行う
↓
・よってcは「"1,2"+"3,4"」の結果となる
:muscle::muscle::muscle:

## もう少し詳しく
JavaScriptは、必要とする値の型について、非常に柔軟な対応をします。

### 型とは
JavaScriptでは
数値でも、文字列でも、論理値でも、nullでもundefinedでもない値はすべて*オブジェクト*です
今回の配列も*オブジェクト*ということですね

### 型変換とは
*オブジェクト*は**すべて**変換メソッドを２つ持ちます
`toString()` メソッドと
`valueOf()` メソッドです

`valueOf()` メソッドについては今回は割愛します。

`toString()`は*オブジェクト*を表す文字列を返します。
通常あまり意味を持ちません

``` sample3.js
({x:1, y:2}).toString() // => "[object Object]"
```
しかし多くのクラスはそのクラス用に`toString()`メソッドを定義しています。
今回の配列Array クラスであれば
`toString()` メソッドは、配列の各要素を文字列に変換し、カンマで区切って結合した文字列を返します。
`join()`と全く同じ動作です。(ECMAScript公式ドキュメントに`join()`を行うと明記されていました)

``` sample4.js
[1,2,3].toString() // => "1,2,3"
[1,2,3].join() // => "1,2,3"
```
つまりいつ何時も配列は上記の動作で文字列として変換可能で必要に応じて変換されることになります

### +演算子について
+演算は数値型か文字列型でしか評価しません。必要とする値の型は数値か文字列です。
数値であれば加算を行い、文字列の場合は連結を行います。

①オペランドの値のどちらかが*オブジェクト*の場合、*オブジェクト*から基本型値への変換アルゴリズムを使って、*オブジェクト*を基本型値に変換します。
ここで`toString()`メソッドが適用されます。
（正確にはDate以外の*オブジェクト*はまず`valueOf()`が適用されますが多くの*オブジェクト*は意味のある`valueOf()`メソッドを持たないので結局`toString()`を使って型変換を行われます。）
②オブジェクトから基本型への型変換の後、オペランドの一方が文字列の場合、もう一方のオペランドも文字列に変換し連結処理を行います。
③それ以外の場合は、両方のオペランドを数値（または NaN）に変換し、加算処理が行われます。

``` sample5.js
1 + 2 // => 3: 加算。
"1" + "2" // => "12": 連結。
"1" + 2 // => "12": 数値から文字列への変換の後、連結。
1 + {} // => "1[object Object]": オブジェクトから文字列への変換の後、連結。
true + true // => 2: 論理値から数値への変換の後、加算。
2 + null // => 2: null を 0 に変換した後、加算。
2 + undefined // => NaN: undefined を NaN に変換した後、加算。
```
要するに+演算するために勝手に配列は文字列に変換されるしそれはカンマ区切りですよってことです

# ちなみにpythonだと
``` sample.py
a = [1,2]
b = [3,4]
c= a+b
print(c) # => [1, 2, 3, 4]
```
あっ・・・

# まとめ
JavaScriptで配列の型変換はjoin()されるので注意って話でした:grinning:

# 参考文献
ECMA-262 - Ecma International
https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Microsoft.ACE.OLEDB.12.0プロバイダーはローカルコンピュータに登録されていません

#「Microsoft.ACE.OLEDB.12.0プロバイダーはローカルコンピュータに登録されていません」と表示されたときの対処方法

##環境
windows10 64bit版
Visual Studio 2017
Visual Studio Community 2017(15.7.5)
Microsoft Office 365 ProPlus(32bit)

##何が起こったのか
Accessのテーブルにあるデータを読み込んでいろいろ集計して表示するだけのツールを作ろうとして、新しいデータ接続を作ろうとしたら、タイトルにあるエラーが発生した。

##解決方法
Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント([ここ](https://www.microsoft.com/ja-jp/download/details.aspx?id=13255))
から
AccessDatabaseEngine.exe
をダウンロードしてインストールすることで解決。

##混乱したこと
OSは64bitだから64bit版(AccessDatabaseEngine_X64.exe)じゃないの？→Officeは32bit版でした
Microsoft Access データベース エンジン 2016 再頒布可能コンポーネントがあるからそちらのインストールをすれば(最新至上主義)→英語版のみでさらに混乱の度合いを増した→AccessDatabaseEngine_X64.exeを実行したら英語でメッセージが出てインストールできなかったみたいだ→きっとそこには「既にインストールしてあるから一度削除してからインストールして」と書いてあったに違いない(未確認)→日本語版の32bit版をインストールしようとしたら「64bit版がインストールしてあるから一度削除して(以下略)」とあった。

##反省点
1. 英語が苦手なのに英語版をインストールしようとした
2. Officeのバージョンを確認せずに64bit版を選択した
Rails + Sass + Bootstrapで動く最小限の基盤

# これは何？
下記のような人に有効な、基盤を作るためのレシピです。

```
- gemはlocalでプロジェクト毎に使い分けたい
- githubで基本的に管理したい
- turbolinksは不明なエラーを招くので回避したい
- envでバージョン管理したい
- dbはmysqlを利用したい
- デザインにはbootstrapを利用したい
```

※ 至らない点はご指摘願います。

# 前提
```
- rbenv
- bundler
- ターミナルでの作業です。
```

# 実行環境
```
- ruby --version
    - 2.4.0
- rbenv --version
    - 1.1.1
- macOS High Sierra
    - 10.13.4
- bundler --version
    - 1.16.3
```


## Gem環境整備
```
- bundle init
```

```
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"
gem "rspec"
gem "dotenv-rails"
gem "bootsnap"
gem "listen"
gem "mysql2"
gem "bootstrap-sass"
gem "jquery-rails"
gem "jquery-ui-rails"
```

```
- bundle install --path=vendor/bundle
- 次回以降はbundle installでOK
```

## Git環境整備
```
- git init
- git remote add origin {{レポジトリ}}
- vim .gitignore
```

```
#Ignore bundler config.
/.bundle
/vendor/bundle

# Ignore log and temp.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore ENV.
.env*
!.env.sample


# Ignore master key for decrypting credentials and more.
/config/master.key
```

## Rails整備
```
- rails new . -d mysql -T -G -skip-turbolinks
- mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
- vim app/assets/stylesheets/application.scss
```

https://www.sejuku.net/blog/14144

```
@import "bootstrap-sprockets";
@import "bootstrap";
```

```
- vim app/assets/javascripts/application.js
```

▼ 前

```
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
```

▼ 修正後

```
//= require rails-ujs
//= require activestorage
//= require jquery3
//= require bootstrap-sprockets
//= require_tree .
```

## ENV整備
```
- touch .env.sample
- vim .env.sample
```

```
DATABASE_NAME=
DATABASE_USERNAME=
DATABASE_PASSWORD=
```

```
- cp .env.sample .env
- .envに環境情報記載
```

## DATABASE整備
```
- vim config/database.yml
    - username: <%= ENV['DATABASE_USERNAME'] %>
    - password: <%= ENV['DATABASE_PASSWORD'] %>
    - database: <%= ENV['DATABASE_NAME'] %>
- bundle exec rails db:create
- bundle exec rails db:migrate
```

## 実行
```
- bundle exec rails server
- bundle exec rails generate controller ~~
- bundle exec rails generate model ~~
- bundle exec rails generate migration ~~
```

# ファイル
https://github.com/jiggaman0412/Rails-Sass-Bootstrap
Wwise for Unity の ビルドサーバ対応

最近のWwiseのUnityインテグレーションは親切で、ビルド時にbnkファイル一式を適切にコピー、破棄してくれる。ローカルの完結した環境ではとても便利なのだが、このままだとビルドサーバで動かない。

とはいえ、そのために独自にまるっと書き直すのもなんだかなーということで、既存の実装を極力利用しつつ、ビルドサーバ対応させてみた。

WwiseのBuildProcessに関わるファイル

- /Wwise/Editor/WwiseSetupWizard/AkBuildPreprocessor.cs
- /Wwise/Deployment/API/Handwritten/AkUtilities.cs

だが、 AkBuildPreprocessor.cs の実装の

```
			else if (!AkUtilities.DirectoryCopy(sourceFolder, destinationFolder, true))
			{
				destinationFolder = null;
				UnityEngine.Debug.LogError("WwiseUnity: Could not copy soundbank folder for <" + platformName + "> platform");
			}
```

にフォールバック処理を追加

```
			else if (
				(!AkUtilities.DirectoryCopy(sourceFolder, destinationFolder, true))
				||
				(!AmWwiseUtilties.S3DirectoryCopy(sourceFolder, destinationFolder, true)) 
			)
			{
				destinationFolder = null;
				UnityEngine.Debug.LogError("WwiseUnity: Could not copy soundbank folder for <" + platformName + "> platform");
			}
```

あとはフォールバック先で、S3からファイルを取得して、AkUtilities.DirectoryCopy() と同等になるよう.bnk一式を配置してやればOK。（ビルド後の削除はオリジナルの処理に任せてOK）

高級な機能も考えたが、とりあえず、失敗した時のフォールバックでS3からコピーする実装にしておけば、何も弄らずに、ローカル/ビルドサーバで両立できると見込んでこの実装で運用中。

S3からバイナリをロードする仕組みを一式作った（ https://qiita.com/karinharp/items/f0c56b69be0c34c5fa30 ）のは、だいたいこのため。
URL Scheme と Universal Links の比較

今更ですが、 Deeplink を実装するにあたり 2 つの方法について調べたので、せっかくなのでまとめてみます

- 2018/7/20 現在
- Xcode 9.4.1
- iOS 11.4.1

# 概要
## URL Scheme
- 任意の scheme へのリクエストがあると対応するアプリを起動してくれる
- scheme → 一般的な URL の先頭にある `http` や `https` の部分

## Universal Links
- 任意のドメイン（のパスまで設定可能）へのリクエストがあると対応するアプリを起動してくれる
- サーバーに設定ファイル（ apple-app-site-association ）を配置する
    - 配置先はドメインの root 直下、もしくは `{root}/.well-known/` の中
    - Android は `.well-known` の中なので、こっちがおすすめかも
- アプリがその設定ファイルを **SSL で**読みに来る

# 比較
||URL Scheme|Universal Links|
|:--|:--|:--|
|サーバー側の対応|対応する scheme のリンクを張る|設定ファイルを配置する|
|アプリ側の対応|[TARGETS]-[Info]-[URL Types] に対応する scheme を設定する|[TARGETS]-[Capabilities]-[Associated Domains] に対応するドメインを設定する|
|アプリ起動時|起動確認ダイアログが出る（ユーザーが1アクション必要）|シームレスに起動する|
|アプリ未インストール時|`ページを開けません` とダイアログが表示される|・リンク先URLがブラウザで表示される<br>・表示されたページに App Store へのリンクを表示してくれる|
|アプリ起動後の処理|`AppDelegate` の `application:openURL:options:` に書く|`AppDelegate` の `application:continueUserActivity:restorationHandler:` に書く|
|リダイレクトした時の動作|アプリを起動しようとする|ブラウザで対象URLを開く|
|その他注意点|scheme は自由に設定できるので、他のアプリと被る可能性がゼロではない|・同一ドメイン内の遷移ではアプリは起動しない（ブラウザ内で遷移する）のでSSL対応の別ドメインを用意する必要があるかも（サブドメインでも可）<br>・ユーザーがリンクタップ時の動作をブラウザで開くように変更できてしまう|

# 雑感
- Universal Links の方がシームレスに起動する分魅力的
- 一方でユーザーがブラウザで開く動作を選択した場合に対象の Web ページが無いと困る
- 両方設定しておいて Web ページで URL Scheme でのリダイレクトをすればいい？（未確認）
- `URLscheme` タグと `URLスキーム` タグ統合したい
- それぞれの詳細については各自で調査、確認をお願いします:bow_tone1:
- 事実と違う箇所があればツッコミお待ちしています
[Unity,ShaderLab] Too many texture interpolators would be used for ForwardBase passについて

Unityでシェーダーを書いていた時に遭遇した、`Too many texture interpolators would be used for ForwardBase pass`について

Googleで検索をかけたところ英語ばかりだったのでまとめておきます

# どの辺で発生するか
頂点シェーダーからフラグメントシェーダーに渡すデータの数が多すぎると発生する

```glsl:例
struct Input
{
    float data1;
    float2 data2;
    float2 data3;
    float3 data4;
    float4 data5;
};
```

# どうすればいいのか
Google翻訳でまずは翻訳してみました
`ForwardBaseパスに使用されるテクスチャインターポレータが多すぎます（最大10のうち11）`

詳しく調べてみたところ
Unityのシェーダーモデルデフォルトは2.5とのこと
そして**shader model 2.5では最大12個のfloatを渡せる**
これに引っかかっているっぽい・・・

ちなみに
**shader model 3.5は最大32までで、4.0では最大45までもてる**
なので解決したい場合は
`#pragma target 3.5`
`#pragma target 4.0`
などの必要数に合わせたシェーダーモデルにする
C#で比較対象の文字列が同じか判定する

C#では、stringクラスを使って文字列を扱います。
Stringは参照型ですが、等値演算子（C#では==）を使って、文字列の内容自体が同じかどうかが比較されます。
等値演算子で文字列を比較すると、2つの文字列が全く同じかを確認できます。つまり、大文字小文字を区別し、カルチャにも依存しない比較（序数比較、バイナリ比較）を行います。

```csharp
string s1 = "test";
string s2 = "Test";
if (s1 == s2) {
   Debug.WriteLine("等しい");
} else {
   Debug.WriteLine("等しくない");
}
```

```text:結果：
等しくない
```

注意：
C#では、Object型にキャストされている文字列を比較するときに==演算子を使うと、参照の等価を調べることになってしまうこと
VSCode SFTP設定

## sftp.json
これをインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181094/94cb6e5d-a495-d057-b90c-04934f7dd944.png)
.vscode/sftp.json
```
{
    "protocol": "sftp",
    "host": "ホスト名",
    "username": "ユーザ名",
    "remotePath": "/絶対パス",
    "uploadOnSave": true,
    "password": "パスワード",
    "ignore": [
        ".vscode",
        ".git",
        ".DS_Store"
    ]
}
```
社外に立てたGitlab CI runner から 社内のGitlabにアクセス（clone）したい

# 前提

- 社内にGitlabがある
- 社外にGitlab runnerを立てた
- CI実行時にcloneするurlは社外からアクセスするとき用のurlでなければGitlabへアクセスできない


具体的に言うと、このようなURLでアクセスするような状況

- 社内からアクセスするとき
  - https://gitlab.example.com
- 社外からアクセスするとき
  - https://gitlabpublic.example.com

# 解決方法

```/etc/gitlab-runner/config.toml
concurrent = 1
check_interval = 0

[[runners]]
  name = "sample project ci runner"
  url = "http://gitlabpublic.example.com"
  clone_url = "http://gitlabpublic.example.com"
  token = "[トークン]"
  executor = "shell"
[runners.cache]
```

`clone_url` が設定されていないので、追記必要でした。
PuTTYgen での鍵作成　SSH-2 RSA　を指定したい場合

# はじめに
- ここでは公開鍵　SSH-2 RSA　を指定の作り方を記載します
- 公開鍵の作り方は色々ありますが、ここでは、PuTTYgenを使った方法を記載します

 
## PuTTYgen のインストール
-  https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
-  上記から環境に対応するインストーラ―を入れてください

## 作成方法
- PuTTYgenを起動するとメイン画面が表示されます
- Gitで使用するような「SSH2 RSA」をParametersで選択したい場合
- 昔の画面だと　SSH-2 RSA　が選択できるようですが、
- Release 0.70　だと SSH-2 RSA がありません
- RSA　はあるんですよね
- これが、SSH-2 RSA のことですので、こちらを選択
- 後は、Action　にある　Generate　ボタンを押下すると鍵の作成が始まります
- 鍵の作成には必要な乱数を発生させるために、Keyの枠内でマウスを適当に動かします
> https://www.u.tsukuba.ac.jp/puttygen-keypair/
chroot 使い方

## <INS>基本的な使い方

```Bash
$ sudo chroot NEW_ROOT_DIRECTORY_NAME [COMMAND]
```

## <INS>ルートディレクトリ変更

### 'bin/bash' No such file or directory

```Bash
$ mkdir /home/miyagawa/chroot_test
$ sudo chroot /home/miyagawa/chroot_test
chroot: failed to run command ‘/bin/bash’: No such file or directory
```

**<INS>調査&解決**

```Bash
$ ls -la /bin/bash
-rwxr-xr-x 1 root root 1037528 May 16  2017 /bin/bash
```

存在する。

chrootの説明文を見てみる。

> プログラムは一般に起動されたときに、一時ファイル、設定ファイル、スペシャルファイル、共有ライブラリなどが特定の位置（ディレクトリ）にあることを期待している。
> chroot されたプログラムがうまく起動するには、chroot したディレクトリにそれらのファイルが正しく配置されていなければならない。
> (引用) http://ja.wikipedia.org/wiki/Chroot

「chroot したディレクトリにそれらのファイルが正しく配置されていなければならない。」とあるので、chroot先にコピーする。

```Bash
$ sudo rsync -a /bin /home/miyagawa/chroot_test
```

再挑戦

```Bash
$ sudo chroot /home/miyagawa/chroot_test
chroot: failed to run command ‘/bin/bash’: No such file or directory
```

まだエラーが出る。
存在するのにNo such file or directoryが出るときは、実行不可能な状態であることが多いので、lddで使用しているライブラリを見てみる。

```Bash
$ ldd /home/miyagawa/chroot_test/bin/bash
        linux-vdso.so.1 =>  (0x00007ffee5ab7000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f5ae4c91000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5ae4a8d000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5ae46c3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5ae4eba000)
```

/libと/lib64以下がchroot先に存在しないので共有ライブラリをリンクできずにNo such file or directoryになっているのではないかと推測。
コピーする。

```Bash
$ sudo rsync -a /{lib,lib64} /home/miyagawa/chroot_test/
```

再挑戦。

```Bash
$ sudo chroot /home/miyagawa/chroot_test/
bash-4.3#
```

成功。

## <INS>chroot内で遊んでみる

```Bash
bash-4.3# pwd
/
bash-4.3# ls
bin  lib  lib64
bash-4.3# touch hoge
bash-4.3# ls
bin  hoge  lib  lib64
bash-4.3#
```

抜けるにはexitを使う。

```Bash
bash-4.3# exit
exit
$
```

## <INS>コマンド実行

```Bash
$ sudo chroot /home/miyagawa/chroot_test/ echo hoge
hoge
$ sudo chroot /home/miyagawa/chroot_test/ touch /foo
$ ls /foo
ls: cannot access '/foo': No such file or directory
$ ls /home/miyagawa/chroot_test/foo
/home/miyagawa/chroot_test/foo
```

## <INS>ユーザ変更

```Bash
$ sudo chroot /home/miyagawa/chroot_test/ id
chroot: failed to run command ‘id’: No such file or directory
```

idが無いようなので入れる

```Bash
$ sudo rsync -a $(which id) /home/miyagawa/chroot_test/bin/
```

再挑戦

```Bash
$ sudo chroot /home/miyagawa/chroot_test/ id
uid=0 gid=0 groups=0
```

ユーザを変更して再挑戦

```Bash
$ sudo chroot --userspec miyagawa:miyagawa /home/miyagawa/chroot_test/ id
uid=1002 gid=1002 groups=1002
```

ユーザが変わっていることがわかる

一応1002のユーザ名を確認

```Bash
$ id
uid=1002(miyagawa) gid=1002(miyagawa) groups=1002(miyagawa)
```
[私的]videoタグ使い方



##基本

```
<video width="960" height="640" src="https://www.video.jp/movie.mp4" poster="https://www.video.jp/movie.jpg" autoplay loop playsinline muted controls>
    <p>動画を再生するにはvideoタグをサポートしたブラウザが必要です。</p>
</video>
```


| 属性   　　　　　  |PC　　　 　　　　　|
|:-----------------|:------------------|
| width            | 幅　　　　　　 　　| 　
| height           | 高さ　　　　　　　 | 
| poster　　　　　　| サムネイル　　　　 |  
| autoplay         | 自動再生　　　　　 | 
| loop             | ループ再生　　　　 | 
| playsinline      | インライン再生（スマホ用） | 
| muted            |  音無し　　　　　 | 
| controls         |  コントロールを表示　 | 

基本上記指定すればよし。
レスポンシブにするには下記スタイルで。

```
video {
  max-width: 100%;
  width: 100%;
  height: auto;
}
```


##スマホ端末での自動再生

動画を実装するにあたって、クライアントから自動再生にしてほしいという要望がある。
結論言うと自動再生できる端末、できない端末がある。

iOS系は多分ほぼ自動再生できる。

アンドロイド系はGoolgeの動画自動再生させない宣言があるためかできない。
controlsでユーザーが再生しないと見れないず、そのためposterを指定してサムネイルを設定しないと再生ボタンがぽつっと浮いてる感じになる。

一度アンドロイドの動画事情を調べたときに下記の記事が参考になった。
無効ってことは有効にもできるかもだけど、社内の端末ではなんか制限かかってた。

>Google Chromeで動画の自動再生を無効にする方法
>https://www.amw.jp/2018/02/16/201802167/


##楽天goldで動画を再生させたい。

楽天goldサーバーにmp4をおいて、pcから見る分には再生できる。
が、スマホ実機からみると何も操作ができない。
posterが設定してある場合はサムネイルだけ表示、
controlsが設定してある場合はサムネイルがはじかれ▶に/が入ったマークがでて操作できないようになる。（見る端末によって表現が違うのかな）

楽天側の仕様で普通にvideoで読み込みだけじゃ再生できないので、プラグインやらスクリプトで頑張ればいけるかもしれない・・・。
か、他のサーバに動画ファイルを置いて外部読み込みすれば再生はできるようです。
しかし楽天テンプレページは外部リンク駄目なのでgold限定です。
ViewPortとメディアクエリについてまとめ

#ViewPortについて

head部分に以下を記述

~~~HTML
<meta name="viewport" content="width=device-width, initial-scale=1”>
~~~

width=device-widthでデバイスに画面の幅を合わせる
initial-scale=1でデバイスと画面の倍率を合わせる

## CSS メディアクエリを利用してレスポンシブにする
レイアウト崩れを防ぐために、要素に相対サイズを指定する

min-width: ブラウザの幅がクエリに定義された値よりも大きい場合にルール適用
max-width: ブラウザの幅がクエリに定義された値よりも小さい場合にルール適用
min-height,max-heightもある
orientation=portrait ブラウザの高さが幅と同じかそれ以上の場合にルール適用
orientation=landscape ブラウザの幅の値が高さよりも大きい場合にルール適用

## ViewPortを基準とした単位
CSSにはViewPortを基準とした単位が4つある
vh: viewportの高さに基づいて指定できる。1vhはviewportの高さ1%のこと。
vw: viewportの幅に基づいて指定できる。1vhはviewportの幅1%のこと。
vmin: viewportの幅と高さで小さい方の寸法に基づいて指定できる。
vmax: viewportの幅と高さで大きい方の寸法に基づいて指定できる。
主要ブラウザでほぼ対応済み

（例）viewportの幅が1200px、高さ1000pxの場合
10vwはwidth:120px,12vhはheight:100pxとなる。
vminは高さの方が小さいので100px
vmaxは幅の方が大きいので120px

## %指定と異なる部分
%指定は子要素の幅や高さは親要素の幅や高さに対して決定されるが、
ViewPort基準の単位を使用すると子要素が親要素より広い幅や高さを持てるようになる。

vhやvhでdivなどの幅高さを指定すると、スクロールバーを存在しないものとして値をとるため、若干ズレが生じる。そのため、ブロック要素の幅は%で指定した方がよい。

ビューサイズによってフォントサイズを変更したい場合などに使うとよい。
form の selectタグの右の矢印を復活させる（reset cssで消えて困りの方に向けて）

## リセットCSSの効能

ブラウザがあらかじめ持っている見出しやフォームUIのデザインを初期化して、異なるブラウザでも見た目が統一できるようにするCSSですね。

### sanitize.cssによるリセット

とあるweb制作案件で、リセットCSS に `sanitize.css` を選択しました。

`sanitize.css`はformのUI部品のデザインがほとんどリセットされます。
問い合わせフォームを組み込む際はinput,select,textareaのスタイルをいちからデザインできます。

## selectを通常のUIに戻すCSS

```css
select {
  -moz-appearance: menulist;
  -webkit-appearance: menulist;
}
```

これでIE,Edge以外のたいていのブラウザは戻せる。

しかし、IE,Edgeは、右の矢印が消えたままで、セレクトボックスであることがわかりにくい状態。

## IE,Edgeの右矢印復活CSS

```css
select::-ms-expand {
    display: block;
}
```

`::-ms-expand`はMS独自の擬似要素だそうです。

### 参考文献

http://shinimae.hatenablog.com/entry/2016/01/06/160731
https://developer.mozilla.org/en-US/docs/Web/CSS/::-ms-expand
localhost以外をhttpsにリダイレクトさせる.htaccess設定

ちょっとしたWEBシステムを作る時に、ローカル環境までhttpsでアクセスできる環境を作るのが面倒。

なので、localhostでアクセスしたときはhttp、それ以外のドメインだとhttpsにリダイレクトする.htaccessの書き方

```text:.htaccess
RewriteEngine on 
RewriteCond %{ENV:HTTPS} !on 
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTP_HOST} !=127.0.0.1
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

```
VScode Setting syncできたのでメモ

# VSCode Settign Syncとは

VSCodeの拡張機能や設定をGithubで共有できる．
メリット：他環境への移行が楽
導入方法：
https://www.lisz-works.com/entry/vscode-setting-sync

## 他PCからのsettingsyncの設定
VSCodeでSetting syncをダウンロードして
Shift + Alt + D を押し、Gist ID を入力すると
~/Library/Application Support/Code/User/syncLocalSettings.json
にgistIDが書き込まれる．
しかし，私の環境ではこれだけではsyncされなかったので
https://gist.github.com/ユーザ名/gistID
に移動して，setting.jsonをコピー
からのVSCodeで ```Command + ,``` でsetting.jsonを開いてペースト

最後にShift + Alt + Dで拡張のダウンロードが始まりました．
なんでうまくいかなかったんですかね？？まぁ共有できたので良かったです
PHP: trait由来の静的プロパティはミックスインした時点の値で束縛される

```php
// トレイトを定義する
trait T {
    public static $value = 0;
}
assert([T::$value] === [0]);

// クラスAが定義され、トレイトがミックスインされる
class A {
    use T; // A::$value = 0で束縛
}
assert([T::$value, A::$value] === [0, 0]);

// トレイトの状態を変える
T::$value = 1; // Aクラスには影響しない
assert([T::$value, A::$value] === [1, 0]); 

// クラスBが定義され、トレイトがミックスインされる
class B {
    use T; // B::$value = 1で束縛
}
assert([T::$value, A::$value, B::$value] === [1, 0, 1]);

// トレイトの状態をもとに戻す
T::$value = 0; // A,Bクラスともに影響しない
assert([T::$value, A::$value, B::$value] === [0, 0, 1]);
```
[もう二度と間違えない] 2>&1 と 2&>1 をいつも間違えてしまう人へ

# 毎回毎回間違えちゃうんだよねー

理屈は何度も読んだ。
でも。。。毎回やりたい事はどっちが正解なのかわからなくなって、エイッってやって、失敗してQiitaをググってませんか?

理屈は何度も何度も読んでると思うので、理屈抜きで二度と間違えない覚え方を伝授しましょう

# どう覚えるの?

## 前提知識
```
$ command > 1
```

こうすると `1` というファイルができますよね?

## ふまえて
わからなくなってエイッってやった時って `1` ってファイルができますよね。

という事は

```
$ command > /dev/null 2&>1
```

最後が `>1` ってなってるので `1` ってファイルができちゃうので間違い。

`1` ってファイルを作りたいわけじゃないので `>` の先は `&1`

って覚えました。
Go言語(Gobot)でミニドローンTelloをプログラミング操作する

# はじめに
GobotというGo言語でIoTやロボットプログラミングするためのライブラリを使って、Ryze Tech社のミニドローンTelloをプログラミング操作して飛ばす方法があまりにも簡単すぎて感動したので手順をシェアします。
前提のバージョンなどは下記の通り。(2019年7月現在)

|Software |Version |
|--- |--- |
|OS |Windows 10 バージョン1809 (OS ビルド 17763.615) |
|Go言語 |1.12.7 |
|Gobot |1.11 |

Go言語プログラム作成用には適宜任意のエディタを導入してください。私はVS Codeを使ってます。

# Go言語セットアップ(Windows)
## インストール
1. 下記URLを開く  
    https://golang.org/dl/
1. `go1.12.7.windows-amd64.msi`リンクをクリックしてインストーラをダウンロード
1. ダウンロードした`go1.12.7.windows-amd64.msi` をダブルクリック
1. デフォルト値のまま`次へ` を押下し続けてインストール完了

## 稼働確認
1. `{任意のフォルダ}/src/hello` の配下にファイル`hello.go` を作成

    ```go:hello.go
    package main
    import "fmt"

    func main(){
        fmt.Printf("hello, world\n")
    }
    ```

1. `hello.go` がある場所で下記コマンドを実行

    ``` cmd
    $ go build
    $ hello
    hello, world
    ```

# Gobotインストール
1. 下記URLを開く  
    https://gobot.io/documentation/getting-started/
1. 上記サイト内の `Installing Gobot` を参考に下記コマンドを実行

    ```cmd
    $ go get -d -u gobot.io/x/gobot/...
    ```

# GobotからTelloを操作する
※ 参考URL  https://gobot.io/blog/2018/04/20/hello-tello-hacking-drones-with-go/

1. `{任意のフォルダ}/src/tello` の配下に `telloTakeOff.go`を作成

    ```go:telloTakeOff.go
    package main

    import (
        "time"

        "gobot.io/x/gobot"
        "gobot.io/x/gobot/platforms/dji/tello"
    )

    func main(){
        drone := tello.NewDriver("8888")

        work := func() {
            drone.TakeOff()

            gobot.After(5*time.Second, func(){
                drone.Land()
            })
        }

        robot := gobot.NewRobot("tello",
            []gobot.Connection{},
            []gobot.Device{drone},
            work,
        )

        robot.Start()
    }
    ```
1. Telloの電源を入れる
1. TelloとPCをWifi接続する
1. `telloTakeOff.go`がある場所で下記コマンドを実行

    ```cmd
    $ go run telloTakeOff.go
    ```
    -> Telloが離陸して5秒後に着陸する  
    ※ コマンド実行時に警告が表示されるので適宜対処

## 動くところ
<blockquote class="twitter-tweet" data-cards="hidden" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://t.co/99nRwDBBDh">https://t.co/99nRwDBBDh</a><br>gobotでTelloとばすの簡単すぎてヤバい。golangセットアップ含めて。<br>ドローンプログラミング教材としてもnode.js +mamboよりこっちのがお手軽かも。<a href="https://twitter.com/hashtag/tello?src=hash&amp;ref_src=twsrc%5Etfw">#tello</a> <a href="https://twitter.com/hashtag/gobot?src=hash&amp;ref_src=twsrc%5Etfw">#gobot</a> <a href="https://twitter.com/hashtag/drone?src=hash&amp;ref_src=twsrc%5Etfw">#drone</a> <a href="https://t.co/nk7c6hWTr8">pic.twitter.com/nk7c6hWTr8</a></p>&mdash; h.fujikawa (@mogumogu_kaeru) <a href="https://twitter.com/mogumogu_kaeru/status/1015627831487811584?ref_src=twsrc%5Etfw">2018年7月7日</a></blockquote>
メソッド内の変数のスコープについて

変数名、メソッド名をつけるセンスがなく見づらいかと思いますが自分なりに理解しながらまとめました:fist:


#変数とは

変数というのは文字や数値を入れる箱で、同じ値を繰り返し使えたり、変更に対応しやすいので楽にコードを書くことができる。

##書き方
変数名＝値　と定義する。


```
fruits = "ringo"   #文字列にはダブルクオーテーションマーク
```
```
count = 3
```

##種類
変数には種類があり、名前の付け方が決まっている。

ローカル変数...　小文字もしくはアンダーバー _ で始まる

グローバル変数... $ で始まる

インスタンス変数...@ で始まる

クラス変数...@@ で始まる

擬似変数...特定の名前がもともと付けられていて、値は変更できない

定数...大文字で始まる（定数はメソッド内で定義できないため省略）


##スコープとは

それぞれの変数が使用できる範囲のこと。
スコープを理解していないとバグの原因や予想外の動作をしてしまう可能性がある。



#それぞれの変数のスコープについて

##ローカル変数

変数が宣言されたブロック、メソッド定義、クラス定義の終わりまでしか使えない。定義された場所でしか参照できない極めて局所的な変数。（グローバル変数と対極）



```sample.rb
def profile
	
  greeting = "こんにちは"

  puts  "#{greeting} , りかです"
end

profile
```

実行結果↓

```
こんにちは、りかです
```
##グローバル変数

プログラムのどこからでも参照でき、同じ名前であれば必ず同じ変数として扱われる。（ローカル変数と対極）
※プログラム全体のどこからでも値を変更できるため、大きなプログラムではグローバル変数を利用することによってプログラムが必要以上に複雑になったりプログラムの流れを追ったり修正を加えたりするのが大変になるため一般的に好まれない。


```sample.rb

$greeting = "こんにちは"

 def profile
  puts  "#{$greeting},りかです"
 end

profile
```
実行結果↓

```
こんにちは、りかです
```
##インスタンス変数
インスタンス...クラス（設計図）を基に作成した実体。
インスタンス変数...データ（変数）と振る舞い（メソッド）をもつ。（ex.車だったら車種や色、速さをメソッドに書く）

同じインスタンス内であればメソッドの定義を越えてその値を参照したり変更したりできる。

```sample.rb

class Introduce

 def initialize(greeting)
  @greeting = greeting
 end

  def profile
    puts "#{@greeting},りかです"
  end

end


aisatsu= Introduce.new("こんにちは")
aisatsu.profile
kibun= Introduce.new("お元気ですか")
kibun.profile

```

実行結果↓

```
こんにちは、りかです
お元気ですか、りかです

```


##クラス変数
クラス...インスタンス（実体）を作るための設計図のようのもの。
クラス変数...そのクラスのすべてのインスタンスから参照したり値を変更したりできる。

```sample.rb

class Introduce
  @@greeting = "こんにちは"

 def profile
  puts  "#{@@greeting},りかです" 
 end
end


int = Introduce.new
int.profile


```

実行結果↓

```
こんにちは,りかです
```


##擬似変数
self...処理内容の実行主体
nil...NilClass クラスのインスタンスであり、「何もない状態」を表します
true...TrueClass クラスのインスタンスであり、「真」を意味します
false...FalseClass クラスのインスタンスであり、「偽」を意味します
＿FILE＿...現在のソースファイル名を表します
＿LINE＿...現在実行中のソースファイル中の行番号を表します
＿ENCODING＿...現在実行中のソースファイルの文字コードを表します
データベースコンバートツールを試してみた

BDE で扱っていた Paradox データベースファイルとか dBase データベースファイルを InterBase にコンバートする楽な方法は無いものかと彷徨っていたら、こんなツールを見つけました。

[Full Convert Enterprise](http://www.fullconvert.com/)

Requirements をみると
32bit/64bit OSで動作するとの事
OS はちょっと古いけど、30日のトライアル版があったので、早速おためし

## インストール
試した環境は Windows 7 32bit 
RAD Studio XE Enterprise がインストールしてある環境
InterBase も少し古めの InterBase XE Developer がインストールしてあります

MSI to redistribute MS VS2010 CRT libraries
.NET Framework 4.6.1
がインストールされていない場合は、インストーラがインストールしてくれます

## 最初の一歩
最初の起動時に送られた activation code を入力する必要がある

## ひとまず何も読まずにやってみよー！

### 最初の画面で「New Project」を選択
![convert01.png](https://qiita-image-store.s3.amazonaws.com/0/164551/13d43296-65ea-e5be-b69a-9f44fdae39c2.png)

### 移行元(Source)データベースの種類と場所を選択
PARADOX と、RAD Studio 付属のサンプルデータベースがあるフォルダを設定
Character Set などはデフォルトのままにした
![convert02.png](https://qiita-image-store.s3.amazonaws.com/0/164551/d2998c42-604d-1819-fa20-91ad295d2a47.png)

### 移行先(Target)データベースの種類と接続設定
InterBase と接続設定、移行先の InterBase データベースファイルを指定
あとはデフォルトのままにした
![convert03.png](https://qiita-image-store.s3.amazonaws.com/0/164551/8013faee-1384-fb67-3bb9-a2aa3006a5ca.png)

### コンバートするテーブルを選択する
フォルダ内にある Paradox データベースを InterBase のテーブルとしてコンバートしてくれる
どれをコンバートするかを選択するのだが、ここでは控えめに items だけにした
![convert09.png](https://qiita-image-store.s3.amazonaws.com/0/164551/4513ce0d-7407-c2f0-a1ee-3a36cfbcd68d.png)

### 確認画面
えーっと、君が指定した内容はコレだよって表示される
問題が無ければ「Start conversion immediately」を選択して「Finish」をクリック
![convert10.png](https://qiita-image-store.s3.amazonaws.com/0/164551/4bce64a9-8f65-3014-3fa8-46ce22e1cf11.png)


### コンバート開始
アレコレ画面が変わって、あー作業しているなぁと思ってひたすら待つ
![convert06.png](https://qiita-image-store.s3.amazonaws.com/0/164551/4313dabc-2116-a4d0-8085-d13bbbf35302.png)

次にコレが表示され
![convert12.png](https://qiita-image-store.s3.amazonaws.com/0/164551/f6a4ca53-ab02-a634-328c-2b3a47468249.png)

### コンバート終了
無事にコンバートされた模様
![convert13.png](https://qiita-image-store.s3.amazonaws.com/0/164551/cbb19ccb-7abe-923f-42e4-49edf3008837.png)

### 終了して InterBase の IBConsole で確認
お、テーブルできてる
![convert14.png](https://qiita-image-store.s3.amazonaws.com/0/164551/7718792d-c475-2d80-e2a7-a8b09b83a09a.png)

お、データも入ってる
![convert15.png](https://qiita-image-store.s3.amazonaws.com/0/164551/e9179d48-5b81-d6f4-dcaf-8ccec4383d62.png)


### トライアル版の制限
コンバートしたデータのおおよそ 30% に watermark (仮のものに変換されたもの) が入るそうです

## 感想

- 直感的に使えるので使い勝手は良さそう
- たとえば、[Paradox に対する説明](https://www.spectralcore.com/databases/paradox) を読む限りでは、どのようにフィールドタイプが変換されるのかが不明瞭なので、実際に試すしかないかも
- 実は最初に画像データ入りの biolife を試したのだが、テーブルはコンバートされたが、多分 watermark の関係でデータが上手くコンバートできなかった。製品版を試した人がいたら教えて教えて欲しい
Xcode初心者Run時のエラーまとめ

※基本的には個人的なメモ代わりとして記録します。

以前他の記事を参考にして解決した問題について、自分のPCの中にだけ保存してあったものを書き起こしました。
コードは正常で警告も出ていないのに実機テストができないときのエラーについて書いています。

早速本題に入ります。

#エラーと対処法
##1.Could not launch "App"
<img width="453" alt="error1.png" src="https://qiita-image-store.s3.amazonaws.com/0/272987/2aca79b8-f0a8-88d2-2f7f-b23d401cbc21.png">
iPhoneで　設定→一般→プロファイルとデバイス管理→デベロッパAPP→(該当するもの)を検証
 
##2.Development cannot be enabled while your device is locked
基本的にはiPhoneのロックを解除すれば大丈夫のはずですが、ロックしていなくてもこのエラーが出ることがありました。
解決策として、私はiTunesに関するデータを外付けのHDDに保存しており、普段は繋いでいないのですが、そのHDDを繋いだら解決されました。

##3.Illegal Configuration - Launch screens may not set custom classnames Main.storyboard
![error2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272987/3bda0bfc-96fc-1619-55a3-705bf20bc075.jpeg)
↓
ここのチェックを変更してみてください。
<img width="257" alt="error3.png" src="https://qiita-image-store.s3.amazonaws.com/0/272987/23d7d543-ea8a-6a27-0bab-4793c043b316.png">
左側のナビゲータエリアでMain(もしくは任意の名称).storyboardを選択し、右側のユーティリティエリアの中で一番左にあるファイルインスペクターの画面です。
ナビゲータエリアやユーティリティエリアが表示されていない場合、Xcode画面の一番右上に表示されている3連のボタン![error5.png](https://qiita-image-store.s3.amazonaws.com/0/272987/91dcc60e-2ef7-b040-cdbd-4c666cf60fb0.png)の左右をそれぞれ押してみてください。

##4.Could not insert new action connection
<Img width="261" alt="error4.png" src="https://qiita-image-store.s3.amazonaws.com/0/272987/3945dd5f-ac7e-5972-c4d8-d1bdd6a674b9.png">
(先にXcodeを閉じてから)(Library/Developer/XCode/DerivedData/の中にある、対象のプロジェクト名のフォルダ内の全てのファイル)を削除しても直る。


#参考
内容は以上になります。
参考にさせていただいたページについて、前に調べたものなので忘れているものも多いです…
思い出したら貼っていきます。
[Stack Overflow - Launch screens may not set custom classnames](https://stackoverflow.com/questions/37764156/launch-screens-may-not-set-custom-classnames)
C++ - What is object slicing?

https://www.geeksforgeeks.org/c-inheritance-question-10/

```c++
#include <iostream>
#include<string>
using namespace std;

class Base
{
public:
	virtual string print() const
	{
		return "This is Base class";
	}
};

class Derived : public Base
{
public:
	virtual string print() const
	{
		return "This is Derived class";
	}
};

void describe(Base p)  <--- Object Slicing Here.
{
	cout << p.print() << endl;
}

int main()
{
	Base b;
	Derived d;
	describe(b);
	describe(d);
	return 0;
}
```

Output
```
This is Base class
This is Base class
```
OpenMBEE nginx設定

OpenMBEEは複数のポートを使用するため、nginxでリバースプロキシを設定した。

設定例を以下に記す

```
vi /usr/local/nginx/conf/nginx.conf
```

```
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}
http {
    server_tokens off;
    include       mime.types;
    default_type  application/octet-stream;
    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location ^~/OpenMBEE/ {
                proxy_pass http://localhost:9000/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header host $host;
        }
        location ^~/alfresco/ {
                proxy_pass http://localhost:8080/alfresco/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header host $host;
        }
        location ^~/alfresco/mmsapp/ {
                proxy_pass http://localhost:9000/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header host $host;
        }
        location ^~/mms/ {
                proxy_pass http://localhost:8080/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header host $host;
        }
        location ^~/share/ {
                proxy_pass http://localhost:8080/share/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header host $host;
        }
        location ^~/solr4/ {
                proxy_pass http://localhost:8080/solr4/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header host $host;
        }
        location ^~/api-explorer/ {
                proxy_pass http://localhost:8080/api-explorer/;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header host $host;
        }
   }
}
```

重要なのはlocation部分

設定を反映

```
/usr/local/nginx/sbin/nginx -s reload
```
備考
・「location ^~/alfresco/mmsapp/」について
mdkから「Open in View Editor」をするとVEのパスが「/alfresco/mmsapp/mms.html」と扱われるためnginxに設定を追加。
mdkのどこかからVEのURLを指定出来るのかもしれない。
恐怖のノンプログラミング開発への道

プログラマー、およびプログラマー志望の皆さまには恐怖の記事になるかもしれません・・
ノンプログラミング＝プログラミングが不要でビジネスシステムを構築できる時代が来ています。

ただ、要件定義などの超上流部分はまだまだ人間が担わなければなりません。
それでも、超上流工程では業務知識の重要性が高いので、実際に業務に携わっている人たちのほうが、そこは有利になります。
さらに、ＡＩが進むと、そのナレッジも人手を介さなくても自動でシステムへ盛り込むことができるようになるので、どんどん人間は不要になってしまいます。

以下は一つの例ですが、２つのフェーズを経てほぼ自動化できてしまいます。

すべての業務要件をこのマトリックス上のルールベースで表現することで、自然言語でのあいまいさを排除できますし、テストケースもこのまま使用できます。
したがって、このフェーズでも、十分既存の開発方式に組み込むことで、メリットは享受できますし、制御機能を組み込むことで、テストまで自動で実施できるようになります。

しかし、ここまでくるともうほぼフェーズ２は目の前で、このマトリックスはＡＩの中に組み込まれ機械学習により、**利用者が自ら**ビジネスシステムを構築できるようになるのです。

こうなれば、もうプログラマーもＰＭも不要になってしまいます。

残るのは、ＩＴストラテジストやシステム監査技術者、システムアーキテクチャー（業務分析・業務設計部分）、セキュリティマネージャーくらいでしょうか？

プログラマーの皆さん、今から準備しておかなければ、職を失ってしまうかもしれませんよ・・

###フェーズ１
**ルールベースアプリケーション**
入力条件からルールベースを検索し、出力を決定する。
例
**入力条件**
年齢：２０歳、性別：男性、曜日：木曜
ルールベースマッチング
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239224/22046021-413d-4973-17fb-44e8086b45ad.png)
**出力**
ルールNo８：割引２０％

構成図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239224/aea389a0-250f-6306-26a4-25452efdcfaf.png)

###フェーズ２
**ディープラーニングルールベース**
このルールベースをディープラーニングにより規定することで、プログラミング不要のシステム構築ができてしまう。
PythonのPILを使って複数の画像を１枚のTiff画像（multi image tiff）に変換する方法

# 経緯
200枚程度の画像を１つのTiff Stack画像として保存したかったが、pythonを使って行う方法がなかなか見つけられなかった。

有名な画像処理ライブラリのPillowで簡単に出来たので、やり方を共有しておきます。

Pillow
https://pillow.readthedocs.io/en/latest/

# 環境、使用するライブラリ
```
$ python -V
Python 3.5.2

$ pip list | grep Pillow
Pillow   5.1.0
```

インストールしてない方は下記のコード実行してください。

```
$ pip install Pillow
```

# 実際のコード
```python

def saveTiffStack(save_path, imgs):
    """
    :param save_path: 画像を保存するパス
    :param imgs: 保存したい画像のnumpy.array  Ex)10枚の32x32のRGBに画像をtiffstackにしたい場合、 imgs.shape => (10, 32, 32, 3)
    :return:
    """
    stack = []
    for img in imgs:
        stack.append(Image.fromarray(img))
    stack[0].save(save_path, compression="tiff_deflate", save_all=True, append_images=stack[1:])

```

圧縮方法として```compression="tiff_deflate"```を指定してますが可逆圧縮なので、jpegのように解像度が低くなることはありません。

# まとめ
参考になれば幸いです。
Webの専門用語についての備忘録①

※注意
頭の中を整理するために執筆したものですので、可読性についてはお察し案件です。理解度に応じて追記とかも全然します。アジャイル執筆です。コメントとか頂けたら嬉しいです。


#セッション
一言でいうと、「会話の始まりから終わりまでを１セットとした単位」「ユーザーがWebサイトにアクセスして行う一連の行動*1」

一般的に「Webサイトを訪問する」的な使い方をされることが多い

ex)「うちのホームページ、最近、セッション増えてる？」（ホームページのアクセスは最近増えてるか？）

*1 ログインやページ閲覧など

参考文献
https://ferret-plus.com/1047
https://wa3.i-3-i.info/word1791.html
https://www.seohacks.net/basic/terms/session/

#リソース
プログラミングの世界において、ソフトを構成する部品やデータを指してリソースということもある。部品といっても、実際にはプログラムなんだけど、今のソフトは部品化されたプログラムの組み合わせでできている。


参考文献
https://www.nttpc.co.jp/yougo/%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9.html
→初見だが死ぬほどわかりやすい。開いたときはNTTの公式かよwと思って馬鹿にしていたが、難しい専門用語を使わず、身の回りの実例を使いながらかみ砕いて説明しているので、このサイトやわかる気がするIT用語のサイトなど、図解が多いサイトを利用すれば、理解が早い
Check out by specifying a tag with git

```
記法

git checkout -b タグからチェックするブランチ名 refs/tags/タグのバージョン

例えば

git checkout -b v555 refs/tags/v5.5.5
```

なんで、忘れてしまうんだろう。
refs/tags/タグのバージョン
refs/tagsの部分がいまいち記憶に残らないんだろうなー。
何回もグーグルで検索してしまう。
CentOS7へnginxのインストールと設定

#yumでインストール
とりあえずWebサーバとして使う場合、yumで簡単にインストールできる。

```
インストール
yum install nginx
確認
nginx -v
設定ファイルの場所
cd /etc/nginx
起動
systemctl start nginx
終了
systemctl stop nginx
OS起動時に起動するようにする
systemctl enable nginx
OS起動時に起動しないようにする
systemctl disable nginx
```

#yumでインストール(最新)
上記の方法だと古いバージョンのnginxが入るが、公式のリポジトリを使うことで最新版のnginxを入れることができる。

リポジトリの追加

```
sudo vi /etc/yum.repos.d/nginx.repo
```

以下を書き込む

```nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```

nginxをインストール

```
sudo yum install nginx
```

バージョンの確認

```
nginx -v
```

自動起動設定

```
sudo systemctl enable nginx
```

起動

```
sudo systemctl start nginx
```


#ソースからインストール
特別なモジュールをインストールする場合はソースからインストール
nginxでは動的ライブラリはなく、静的ライブラリのため、必要な外部モジュールがあればソースからインストールする必要がある。

今回の場合はrtmpモジュールを入れた

```
ダウンロード
wget http://nginx.org/download/nginx-1.13.5.tar.gz
tar -zxvf nginx-1.13.5.tar.gz
rtmpモジュールの取得
git clone https://github.com/arut/nginx-rtmp-module
cd nginx-1.13.5
./configure --with-http_ssl_module --with-http_realip_module --with-http_v2_module --add-module=../nginx-rtmp-module-master
make
make install
```

```
起動
sudo /usr/local/nginx/sbin/nginx
設定ファイル
vi /usr/local/nginx/conf/nginx.conf
再読み込み
/usr/local/nginx/sbin/nginx -s reload
終了
/usr/local/nginx/sbin/nginx -s stop
自動起動設定
vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
RemainAfterExit=yes
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable nginx
```
VirtualCameraを導入しよう

**この記事はUE4.20時点のものです**

ついに来ましたUE4.20！

UE4.20と同時に、新しいサンプルが4つ公開されました
そのうちの1つ、VirtualCameraについての解説と、それを自分のプロジェクトに導入する手順を解説します

# 注意
この記事ではARKitが動作するiPhoneまたはiPadが必要です
https://www.apple.com/jp/ios/augmented-reality/

あとは、プロジェクトを実行するPCとiOS端末は同一ネットワークに所属している必要があります

# VirtualCameraサンプルを動かそう！

まずはダウンロードしましょう
もちろんUE4.20もダウンロードしてくださいね？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/053184b3-0e91-d8d9-a319-95197558a86f.png)

あとは、iOS端末を準備しておいてください。
UnrealRemote2というアプリのインストールが必要です。

https://itunes.apple.com/jp/app/unreal-remote-2/id1374517532?mt=8

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/aa27ea7f-cf77-10f5-5023-403a60a5692e.png)



## 設定確認

Project SettingsのEngine-Inputセクションで、`Always Show Touch Interface`をONにしておきましょう
（サンプルではONになっていない場合があります）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/644350ed-1171-3856-aa2d-32fe95113cbf.png)

うまく動作させるには、`New Editor Window`モードで起動させる必要があります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/800f3f8e-4ed4-cc9d-de0f-6a76d4080ecd.png)

起動させたら、ログにListening Portが表示されるので、FirewallのInbound（受信）ポートを開けておきましょう
（大体は2049でOKです）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/84f74288-aabf-1393-5f07-e1b318f51a30.png)

そして、iOS側でUnrealRemote2を起動し、プロジェクトを動作させているPCのIPアドレスを入力、Connectします。
（NO SIGNALの画面が出れば成功です）

![IMG_2379.PNG](https://qiita-image-store.s3.amazonaws.com/0/117589/5c0be9e7-032c-9610-09fc-2fc384b518d5.png)

## プレビュー

ちょっと画像が荒いですが、PCとiOS端末が同期していれば成功です

![IMG_0018_Moment.jpg](https://qiita-image-store.s3.amazonaws.com/0/117589/b92a183c-def0-1291-e4e6-b836a630c347.jpeg)


## VirtualCameraの機能について

この記事では割愛します
FOV、手ぶれ補正、場所の記録、シーケンサーへの録画、AFなど、いろんな機能があるので、ぜひ触って確かめてみてください


# 自分のプロジェクトに導入しよう

これはぜひ自分のプロジェクトに入れてみたいですよね？
なのでここからは導入してみた記事を掲載します

## Plugin設定

Pluginsから`VirtualCamera`と`Remote Session`の2つのプラグインをONにしましょう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/25e48f2a-c5f2-fc21-0aca-6847bb4b5213.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/46e9fd08-a7d6-f592-675d-a0220be15255.png)


## Gamemode設定

World Settingsで、GameModeを`VirtualCameraGameMode`にオーバーライドしましょう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/a8b680db-9a07-f3dd-1990-ee34978705e1.png)


## その他設定

いずれかのPawnにAuto Possessの設定が入っている場合は外しておきましょう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/cac7f27b-15d8-38a1-2fe5-dd6e02f7c6b6.png)

あとはInput設定から、VirtualCameraJoySticksの設定を忘れずに。
見つからない場合は、右下のView Optionsで`Show Engine Contents`、`Show Plugin Contents`にチェックを入れると出てきますよ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/8c930192-3b44-0d0c-13a6-540d86a04a04.png)


## あとは実行するだけ

ね？簡単でしょう？
【React Nativeメモ】JSXを用いたComponentの記述について

# **1. JSXとは？**

JSXはECMAScript（JavaScript）にXML-likeな記述を追加した言語拡張です．
簡単にいうとJSXはJavaScriptのシンタックスシューで，XMLライクにJavaScriptの記述が出来ます．

# **2. Babelを利用し変換内容を確認**

実際にどのような変換が行われるか，[Babel(バベル)](https://babeljs.io/)のサイトを利用し確認出来ます．

React NativeのText Componentの利用例として，下記のように記述が出来る．

```jsx
<Text>Hello World</Text>
```

下記のようにJavaScriptへ変換される．

```javascript
"use strict";

React.createElement(
  Text,
  null,
  "Hello World"
);
```

![スクリーンショット 2018-07-11 23.07.36.png](https://qiita-image-store.s3.amazonaws.com/0/262328/a5aae072-bb16-ad8c-3639-8b8e054f78a7.png)


# **3. React Nativeの変換例**
React Nativeの例で見てみると，JSXを利用した場合，Componentの記述がスッキリしている事がわかる．

## **3.1. JSXを利用した場合**
```javascript:index.js
// library
import React from 'react';
import { Text, AppRegistry } from 'react-native';

// component
const App = () => (
  <Text>Hello World</Text>
);

// rendering
AppRegistry.registerComponent('sample', () => App);
```

## **3.2. JSXを利用していない場合**
```javascript:index.js
// library
import React from 'react';
import { Text, AppRegistry } from 'react-native';

// component
const App = () => (
  React.createElement(
    Text,
    null,
    React.createElement(
      Text,
      null,
      'Hello World',
    ),
  )
);

// rendering
AppRegistry.registerComponent('sample', () => App);
```

# **4. 参考リンク**
- [Draft: JSX Specification](https://facebook.github.io/jsx/)
- [Introducing JSX](https://reactjs.org/docs/introducing-jsx.html)
lodash/rangeを使わずにlodash/rangeみたいなことをする。

## 背景
バイト先でTypescriptのテストを書く必要があって、非同期処理の関数を指定した回数繰り返し行いたい状況が生まれました。なんとなく僕はそういうときlodash/rangeを使って指定した要素数を持つ配列を作成してmapして、Promise.allをしていたのですが、CTOから「この場合はわざわざlodashをいれるほどじゃないっすね」と言われlodashを使わない場合の方法を教えてもらったのでメモ書き程度にこの記事を書いています。

## 実装
```js
> [...new Array(6)].map((v, i) => i)
[0, 1, 2, 3, 4, 5]
```

## 感想
実行速度的にはlodash/rangeの方が速かったりしそう。

## 追記(2019/08/23)

```js
> [...new Array(6).keys()];
[0, 1, 2, 3, 4, 5]
```
Dockerのコンテナで"ssh: command not found"と表示されたときの対処法

```terminal
~ $ ssh
sh: ssh: not found
```

Dockerで動かしているプログラムから、他のサーバーで動いているプログラムにssh接続して操作したい、ということがあると思います。
そのときに、Dockerのコンテナにsshコマンドが無いと動かすことができないので、sshをインストールしましょう。

## 1 . DockerのOSを調べる
以下のコマンドをコンテナ内で実行して、そのコンテナのOSを調べます。

```terminal
$ grep -H "" /etc/*version ; grep -H "" /etc/*release
```

軽量のAlpineを使用していれば以下のように出るはず。

```terminal
/etc/alpine-release:3.4.6
/etc/os-release:NAME="Alpine Linux"
```

OSによって、sshのインストールの方法は異なるので、それぞれのOSに合わせてください。
ここでは、Alpine Linux, CentOS, Ubuntsuの場合のsshインストール方法を掲載します。

## 2 . 1 Alpine Linuxにsshをインストール
以下のコマンドを実行すれば、sshをインストールできます。

```terminal
$ apk add openssh
```
ただ、毎回コマンドを実行するのは大変なので、Dockerfileに記載しておくことをお勧めします。

```dockerfile
RUN apk add openssh
```

## 2 . 2 CentOSにsshをインストール
以下のコマンドを実行すれば、sshをインストールできます。

```terminal
$ yum -y install openssh-server
$ yum -y install openssh-clients
```

同じくDockerfileに記載推奨です。

## 2 . 3 Ubuntsuにsshをインストール
以下のコマンドを実行すれば、sshをインストールできます。

```terminal
$ apt-get install openssh-server
```

上に同じ。

これでHOMEディレクトリに.sshディレクトリが作成されて、sshコマンドが有効になっているはずです。
.sshディレクトリに必要なconfigファイルやpemファイルを格納して、sshを実行してください。

ちなみに、Dockerに限らずOSを調べたい時は多いので、OSを調べるコマンドは便利だったりします。
GASでSendGridを使ってメールを1日100件以上送信する方法

GAS（Google Apps Script）でSendGridのWEB APIを利用してメールを送信する方法をまとめました。これでメール送信可能数 **100通/日** の限界を突破しましょう:thumbsup_tone1::sunny:

## 背景

### SendGridとは
SendGridはメールを配信できるクラウドサービスです。

### なぜGASでSendGridを使うのか

GASではGmailを操作してメールを送ることができるので、わざわざSendGridのような外部サービスを利用する必要がないと思われるかもしれません。

しかし、GASは一日に送れるメールの数（正確にはメールの受取人の数）に制限があり、普通のGoogleアカウントの場合は100件/日、Gsuiteの場合は1500件/日までしか送ることができません。:frowning2:

https://developers.google.com/apps-script/guides/services/quotas

そこでメールの送信にSendGridを利用することで、Freeプランでも月間12000通まで送ることができるようになります。:kissing_heart:

https://sendgrid.kke.co.jp/plan/

## 手順

### アカウントの登録

よしなにアカウントを登録します。

https://sendgrid.kke.co.jp/

登録の際に審査がありますが、私がやった際は数時間ほどでログイン情報が送られてきました。

### APIキーの取得

https://app.sendgrid.com/settings/api_keys

APIキーを作成します。一度しか表示されないのでどこかに保存しておきましょう。

### DNSにレコードを追加（独自ドメインで送る際）

この時点で送れるようになったのですが、今のままだとメールを送信した際に「sendgrid.net 経由」という文字が送り主の隣に入るようになります。

これを消すためにはDNSにレコードを追加する必要があります。

https://app.sendgrid.com/settings/sender_auth

Domain Authenticationから指示にしたがってレコードを追加すれば設定することができます。

「Use automated security」をチェックするか否かで追加するレコードがCNAMEかMXとTXTになります。私はなぜかCNAMEが追加できなかったのでチェックを外しました。

具体的な違いについては公式サイトを参考にしてください。

https://sendgrid.com/docs/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html

### スクリプトを追加

ここまで設定ができればあとはWEB APIを叩くだけです。

```javascript
SEND_GRID_ENDPOINT = "https://api.sendgrid.com/v3/mail/send";
SEND_GRID_API_KEY = "取得したAPI KEY";

function sendEmailBySendGrid(to,subject,from,from_name,body_text){ 
  var body = {
    "personalizations": [
      {
        "to": [
          {
            "email": to
          }
        ],
        "bcc":[
          {
            "email": from
          }
        ],
        "subject": subject
      }
    ],
    "from": {
      "email": from,
      "name" : from_name
    },
    "content": [
      {
        "type": "text/html",
        "value": body_text
      }
    ]
  }
  var payload = JSON.stringify(body);
  UrlFetchApp.fetch(SEND_GRID_ENDPOINT, {
    method: 'POST',
    headers: { "Content-Type": 'application/json',
             "Authorization": "Bearer "+SEND_GRID_API_KEY},
    payload: payload
  });
}
```

送信できたかを確認するためにBCCに送信者のアドレスを入れていますが、特に必要はありません。また、オプションがあるので、ドキュメントを参考にしてください。

https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/Mail/index.html