OmniAICreator/Qiita-1.07M huggingface dataset:
SQLスニペット

まぁ、他にもあるだろうけどこれだけあれば十分かと

# 新規作成
```sql
/* データベース作成 */
CREATE DATABASE database_name;

/* テーブル作成 */
CREATE TABLE table_name(
  id INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
  mail VARCHAR(100) UNIQUE,
  name VARCHAR(100),
  /* PRIMARY KEY (id) */
);

/* カラム追加 */
ALTER TABLE table_name ADD column_name VARCHAR(100);

/* カラム複数追加 */
ALTER TABLE table_name ADD column_name1 VARCHAR(100)
                      ,ADD column_name2 VARCHAR(200);

/* カラム追加位置指定 */
ALTER TABLE table_name ADD column_name3 VARCHAR(100) FIRST;
ALTER TABLE table_name ADD column_name4 VARCHAR(100) AFTER column_name3;
```
### AUTO_INCREMENT
直訳：自動で増加

### NOT NULL
NULLにならないようにする
Intならデフォルトで0、文字列ならデフォルトで""
このデフォルトは変更可能
これがないやつは値を入れないとデフォルトでNULLになる

### PRIMARY KEY
一つのテーブルに一つだけ
値の重複不可
NOT NULL になる

### UNIQUE
値の重複不可
NULL許可してもいい

### ALTER
変更

# 変更
```sql
/* データベースの指定（元々指定されてるなら省略可） */
USE database_name;

/* テーブル名変更 */
ALTER TABLE table_name RENAME TO new_table_name;

/* カラム名変更 */
ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name;

/* カラム名称・構造変更 */
ALTER TABLE table_name CHANGE COLUMN column_name new_column_name VARCHAR(999) NOT NULL;

/* カラム構造変更 */
ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(888) NOT NULL;
```

# 削除
```sql
/* データベース削除 */
DROP DATABASE databaseName;

/* データベースの指定（元々指定されてるなら省略可） */
USE database_name;

/* テーブル削除 */
DROP TABLE table_name;

/* カラム削除 */
ALTER TABLE table_name DROP COLUMN column_name;

/* カラム複数削除 */
ALTER TABLE table_name DROP COLUMN column_name1
                      ,DROP COLUMN column_name2;
```

# レコード（データ）
```sql
/* 全てのカラムを指定して登録
 * auto increment を使用するときの値は0 */
INSERT INTO table_name VALUES(0, 'mail1@example.com', 'name1')
                            ,(1, 'mail2@example.com', 'name2');

/* 指定したカラムのみに値を入力 */
INSERT INTO table_name (mail, name) VALUES('mail@example.com', 'name');

/* 内容確認 */
SELECT * FROM table_name; /* 全てのカラムを表示 */
SELECT column_name FROM table_name; /* 指定したカラムだけ表示 */
SELECT * FROM table_name WHERE column_name = 1; /* column_name = 1 はcolumn_nameが1のもののみ抽出する例 */

/* 変更 */
UPDATE table_name SET update_column_name = "changed" WHERE condition_column_name = 1;
UPDATE table_name SET update_column_name = "changed", update_column_name_2 = 2 WHERE condition_column_name = 1;

/* 削除 */
```

# 他にくっつけるやつ
## 並び替え
```
ORDER BY column_name ASC  /* 昇順 */
ORDER BY column_name DESC /* 降順 */

/* 例文 */
SELECT * FROM table_name ORDER BY column_name ASC;
```



# データ型の種類（MySQL）
いつか書くかも
[MySQL v8.0 英語版](https://dev.mysql.com/doc/refman/8.0/en/data-types.html)
[MySQL v5.6 日本語版](https://dev.mysql.com/doc/refman/5.6/ja/data-types.html)
Azure Functions で湯婆婆 API を作る

こんにちは。N高等学校3年次の @rikupin1105  です。
3年次にして Qiita 初投稿です。
# 作ったもの
タイトルの通り AzureFunctions で湯婆婆APIを作りました。
https://yubaba.azurewebsites.net/api/Yubaba/?name=名前
# 手順
### リソースの作成
親の顔より見た（？）ポータル画面からリソースを作成します。
![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/9bef60dc-8064-e7a8-be66-1fe3bcb14f97.png)

関数アプリを選択します。
![スクリーンショット (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/76488753-a2b9-2dd8-24f4-26d86f13de94.png)

リソースグループは適当に作成し、関数アプリ名も適当に設定します。
ランタイムスタックは使用したい言語に合わせて設定します。今回はC#を使いたいので .Net Core を選択しました。
地域は写真ではオーストラリアになってますが、Japan East か Japan West あたりにすると良いでしょう。（写真撮った後に JapanEast にしました）
![スクリーンショット (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/34e420ce-fd0c-f96f-a921-c1672d3529dc.png)

ホスティングの項目に移り、ストレージアカウント、オペレーティングシステム、プランの設定をします。
たぶん何も触らなくても写真のような設定になってると思います。たぶん
![スクリーンショット (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/8ec8db3a-0135-bb5a-fa49-1bd9c615d8cf.png)



次に監視に移り Application Insights の設定をします。
今回は必要ないので無効にしています。

タグの項目は特に何も触らずに確認及び作成でリソースを作ります。

しばらくするとリソースが完成し、リソースに移動することができます。
![スクリーンショット (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/b0ccd334-ddcc-1dda-b94f-cb752294c997.png)
### 開発！
関数に移動し、関数を追加します。
今回の開発環境はポータルでの開発。
(本当はVisualStudioを使ったほうがやりやすい)
テンプレートは HTTP triger
関数名は適当に
Authorization lebel は Anonymus
に設定しています。
![スクリーンショット (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/f2b76c02-00ee-dd83-a46f-c2fff72794cd.png)

関数が作成できたら、コードとテストからこのようなコードを作成し、保存します。
ソースコードは @okazuki さんのコードを参考にさせていただきました（参考というかコピペというか）
[C# で湯婆婆を実装してみる（𠮷田さんにも対応）](https://qiita.com/okazuki/items/03049da368222b562da9)

```csharp

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Globalization;
using System.Threading.Tasks;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    string name = req.Query["name"];

    var nameInfo = new StringInfo(name);
    var random = new Random();
    var newNameIndex = random.Next(nameInfo.LengthInTextElements);
    var newName = nameInfo.SubstringByTextElements(newNameIndex, 1);

    string responseMessage = $"今からお前の名前は{newName}だ。いいかい、{newName}だよ。分かったら返事をするんだ、{newName}!!";

    return new OkObjectResult(responseMessage);
}

```
![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/7efc9d93-958b-2d85-3a8e-a4e532d881ec.png)

# 使ってみる
保存ができたらコードとテストのページにある 「関数の URL の取得」から URL を取得してみましょう。
そのままブラウザでURLを開くと名前の入力がないため仕様通り(?)500エラーになります。
URL クエリパラメータで名前を下のように設定します。
https://xxxxx.azurewebsites.net/api/xxxxxx/?name=名前
これで多分動くと思います。たぶん
![スクリーンショット 2020-11-25 152518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261891/76fb5605-208a-0ed7-8714-6d821a480440.png)

# まとめ
他のサービス GCP や AWS などでも同じような事ができると思うので、やってみたいと思いました。
Azure Functions が特に詳しいわけではないので、ここの設定こうしたほうがいいよ、などあれば教えて下さい。
アイデア次第で面白いものがたくさん作れると思うので、是非試してみてください。
異なるVPNプロトコル間の比較：OpenVPN、L2TP / IPSec、SSTP、IKEv2、PPTP


次のVPNプロトコルが発生する可能性があります。

-**OpenVPN**：常にOpenVPN。オープン仮想プライベートネットワークと呼ばれることはありません。
-**L2TP / IPSec**：レイヤー2トンネリングプロトコルとインターネットプロトコルセキュリティの組み合わせ。
-**SSTP**：セキュアソケットトンネリングプロトコル。
-**IKEv2**：MicrosoftとCiscoによって開発されたネットワークキー交換バージョン2。
-**PPTP**：ポイントツーポイントトンネリングプロトコル。

これが紛らわしい、あるいは気が遠くなるようなように思われる場合でも、悲しんではいけません。これらのことを知っている人はほとんどいませんし、技術に精通した人もたくさんいます。

すでに途方に暮れていて、あなたに最適なVPNを選択するのに助けが必要ですか？ VPNを使用して、手順を簡素化し、選択プロセスを簡素化してください。私たちはあなたのためにそれを研究しました。

そうは言っても、VPNプロトコルについて知っておく必要のあるほとんどすべてがここにあります。

## VPNプロトコル

合意がルールです。人々は規則に従うだけでなく、コンピューター、ネットワーク、VPNソフトウェアも規則に従います。これらはこのようにプログラムされています。

データとプライバシーの保護からIPアドレスの変更まで、VPNには同じ効果があります。ただし、VPNは、使用するデバイスのタイプ、実行する内容、または実行する内容に応じて、異なるプロトコルを使用します。

ただし、ほとんどのVPNレビューサイトは、これらのVPNプロトコルに関する次の事実を知りません。

上記のプロトコルは異なるテクノロジーです。

## さまざまなデバイスに適用可能なプロトコル

セキュリティソフトウェア会社（VPNプロバイダーなど）は、VPNプロトコルを含む当社のテクノロジーの改善に懸命に取り組んできました。契約が変更されます。

さらに、電話とタブレットにはさまざまなVPNプロトコルがあり、特定のタスクを実行したり、以前よりも優れたパフォーマンスを発揮したりできます。

そのため、心配する必要はなく、考える必要もありません。

## VPNプロトコルはあなたに何を提供できますか？

VPNはあなたのためにセキュリティとプライバシーを念頭に置いています、彼らはそれが私たちが望んでいるものであることを知っています。

したがって、選択したVPN（信頼できるVPNの場合）がネットワークと保護に最適なVPNプロトコルを提供するのでご安心ください。

他の点では、プライバシー、セキュリティ、および他の制限されたWebサイトへのアクセスを支援するという点で正しいプロトコルを使用します。

ただし、VPNプロバイダー（<a href="https://ja.howprivacy.com/nordvpn-review/">NordVPN</a>、専用インターネットアクセスVPN、Cyber​​ Ghost VPNなど）のWebサイトにアクセスすると、すべてのプロバイダーに通知されます。あなたは彼らがサポートするVPNプロトコルです-あなたが必要とするのと同じように、そこに入力してオプションをテストしたいと思います。

## OpenVPN-今日のトッププロトコル

セキュリティ技術の観点から、OpenVPNはトップVPNプロトコルと見なされています。ほとんどすべてのVPNレビューサイトと専門家が教えてくれます。

ほとんどすべてのVPNは、特にコンピューターの場合、デフォルトのVPNプロトコルとしてOpenVPNを使用します。

アプリケーションで使用されているプロトコルを変更することはできませんが、これはほとんどのユーザーにとって問題ありません。 Android、macOS、および<a href="https://ja.howprivacy.com/windows-vpn/">Windows</a>用のOpenVPNプロトコルを使用して、接続を保護します。これは、より新しく、より速く、より安全でオープンソースであるため、私の好みのプロトコルです。

## 主要なVPNにサインアップする

したがって、VPNの使用を検討するときは、プロトコル部分を怖がらせないでください。これらの点を覚えておいてください。

VPNはあなたをサポートします。彼らはデフォルトであなたのデバイスに最適なVPNと最適なプロトコルを使用するかもしれません。
協定を勉強する必要はありません。 VPNを使用するときに特定の種類のタスクを処理する必要がない限り、オンラインにすることができます。
OpenVPNは、コンピューターの主要なプロトコルです。これはVPNプロバイダーによって選択されたプロトコルですが、一部のモバイルデバイスでは、オプションではありません。

<a href="https://ja.howprivacy.com/">日本に適したVPN</a>を選択すれば、すべてがうまくいくことを忘れないでください。
ruby-VI(hello class)



# 学習内容

-   class,object


# クラス、オブジェクト

-   class
    -   クラスとは: 一種のデータ型、「オブジェクト設計図」や「オブジェクトの雛形」とも呼ばれることもある。
    -   クラスが同じならば保持している属性や使えるメソッドは(原則として)同じになる。

-   object
    -   クラスをもとにして作られたデータのかたまり
    -   同じクラスから作られたオブジェクトは同じ属性、メソッドを持つが、属性に保持されるデータは異なる。


# code

```ruby
require 'colorize'

# method
def hello(name)
  "Hello #{name}."
end

# inherited class
class Hello < String
  def hello
    "Hello #{self}."
  end
end

# extend class
class String
  def hello
    "Hello #{self}."
  end
end

# method call
name = ARGV[0]
puts "method call"
puts hello(name).green

# inherited class call
name = Hello.new(ARGV[0])
puts "inherited class call"
puts name.hello.green

# extend class call, override
puts "extend class call, override"
puts ARGV[0].hello.green

```


# 参考

[講義ページ](https://qiita.com/daddygongon/items/ba94b0f2a73990fc6a07)

[プロを目指す人のための Ruby 入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus-ebook/dp/B077Q8BXHC/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ruby&qid=1605077175&sr=8-1)



------
 - **source** ~/classes/muli_scale/grad_members_20f/members/keita_k7/memo/c10.org
コントローラーとビューを同時に作成

#コントローラーとビューを同時に作成

####作成方法
% rails g controller 'コントローラー名/ビューのファイルの名前' index

(例)　% rails g controller tests index

- testsコントローラーにindexアクションが作られる
- viewsのtestsフォルダにindex.html.erbファイルが作られる


以下の方法を取ると、オプションとして指定したアクションの定義と、
アクションに紐付いたビューファイルが作成できます。
(例)% rails g controller test index new

- app/controllers/tests_controller.rb
- app/views/tests/index.html.erb
- app/views/tests/new.html.erb

が作成されます。
GitLabからGitHubへの移行したときの手順いろいろ

1.https://github.com/new/import で色々入力してBegin importを押す

2.途中出てくるアドレスとパスワードを入力

3.（不要なブランチがいっぱいあったので移行したついでに）developブランチにマージされていないブランチを、developとmasterとreleaseブランチを除いて削除

```
git branch -r --no-merged origin/develop | grep -v -e develop -e master -e release | sed -e 's/origin\///g' | xargs -I {} git push -d origin {}
```

4.developブランチにマージされているブランチを、developとmasterとreleaseブランチを除いて削除

```
git branch -r --merged origin/develop | grep -v -e develop -e master -e release | sed -e 's/origin\///g' | xargs -I {} git push -d origin {}
```

5.変な名前のブランチ(hoge)があったので名前をfugaに修正

```
(hoge)$ git branch -m fuga
(fuga)$ git push origin fuga
(fuga)$ git push -d origin hoge
(fuga)$ git branch --unset-upstream
```

参考URL
https://dev.classmethod.jp/articles/what-github-importer-holds/
https://dev.classmethod.jp/articles/git_remove_merged_branch/
【AWS】 踏み台サーバーを使ったSSH接続の環境構築

#はじめに
プログラミングスクールの演習で踏み台サーバー経由で公開されていないサーバーへのアクセスを可能にする環境の構築をしたのでアウトプットもかねてメモを残します。

#完成図
![スクリーンショット 2020-11-25 13.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744673/a939b1f8-cd9e-da22-8dbe-aad26f40bcac.png)

※サブネットはAZが同じものを利用すると通信のレイテンシを抑えられますが
今回はカリキュラムの構成上異なるAZ間での構築となります。
#構築要件

構築要件は以下の通りです。

- サーバーBはインターネットに公開されていない
- サーバーA（踏み台サーバー）へのアクセスは、PCからターミナルでSSHで接続できる
- サーバーBは、サーバーA（踏み台サーバー）からのみアクセスできる

#前提
以下のように異なるAZにパブリックサブネットとプライベートサブネットを持つVPCが構築されていることを前提とします。
![スクリーンショット 2020-11-25 13.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744673/d081ad2c-fac9-bad3-ffaf-02ae78bf2959.png)


#①サーバーA（踏み台サーバー）からのSSHアクセスのみを許可するようにサーバーBに紐づくセキュリティグループの作成と割当て
[EC2のサイドメニュー▶︎ネットワーク & セキュリティ▶︎セキュリティグループ▶︎セキュリティグループの作成]からセキュリティグループを作成します。
![スクリーンショット 2020-11-25 15.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744673/80db4220-8278-2beb-e70c-d95442379175.png)

次にサーバーB（EC2インスタンス）のセキュリティグループの変更をします。
[右クリック▶︎セキュリティグループ▶︎セキュリティグループを変更]から先ほど作成したセキュリティグループを割当ます。
これでサーバーA（踏み台サーバー）からのSSH接続だけを許可するセキュリティグループを割り当てることができました。
#②サーバーBの鍵をサーバーA（踏み台サーバー）に転送

```
$ scp -i ~/.ssh/○○○.pem ~/.ssh/○○○.pem ec2-user@[サーバーA（踏み台サーバー）のパブリックIPアドレス]:.ssh
```
scp [オプション] コピー元パス 保存先パス　　という構成になっています

- scp -i ~/.ssh/○○○.pem　　-iはオプションでssh接続に使用する鍵ファイルを指定しています
- ~/.ssh/○○○.pem　コピー元のパス
- [サーバーAのパブリックIPアドレス]:.ssh　　保存先パス

#サーバーA（踏み台サーバー）にSSH接続しサーバーA（踏み台サーバー）からサーバーBにSSH接続する
今までの手順で要件を満たす構築ができているので確認します。

サーバーA（踏み台サーバー）にSSH接続

```
$ ssh -i ~/.ssh/○○○.pem ec2-user@[サーバーA（踏み台サーバー）のパブリックIPアドレス]
```

サーバーA（踏み台サーバー）からサーバーBにSSH接続

```
$ ssh -i ~/.ssh/○○○.pem ec2-user@[サーバーBのプライベートIPアドレス]
```
以下のように表示されれば接続できています。

```
  __|  __|_  )
  _|  (     /   Amazon Linux AMI
 ___|\___|___|
```
#最後に
ご覧いただきありがとうございました。
初心者のため間違っている点などありましたらご指摘いただけると幸いです。

#参考
scpコマンド
https://qiita.com/chihiro/items/142ebe6980a498b5d4a7
AWS Lambdaでyum installする簡単な方法

この記事では、yumでインストールできるソフトウェアをAWS Lambdaの環境で使うための方法を解説しています。

この記事で分からない点は [@ts_3156](https://twitter.com/ts_3156) までお気軽にご質問ください。


### AWS Lambdaの環境構築

AWS Lambdaの環境には最小限のソフトウェアしかインストールされていません。例えば、`less`や`curl`も最初はないです。

そのため、使いたいソフトウェアがある場合は、そのソフトウェアを所定のディレクトリにインストールしておき、AWS Lambdaの環境に読み込み専用でマウントする必要があります。

この記事では、yumでインストールできるソフトウェアを例に、AWS Lambdaの環境にソフトウェアをインストールする方法を解説しています。

この記事で対象とするOSはAmazon Linux 2です。Python、Ruby、nodejsのいずれであっても、最新バージョンはAmazon Linux 2の環境で動かす必要があります。



### AWS lambdaレイヤー

AWS lambdaでは、追加でインストールしたソフトウェアをレイヤーという仕組みでAWS Lambdaにマウントします。レイヤーは実行可能ファイルと依存関係をひとまとめにしたzipファイルです。

zipに入れたファイルは、AWS Lambdaの`/opt`にマウントされます。zipに`/bin`というディレクトリを入れることで、AWS Lambdaには`/opt/bin`というパスでマウントされます。

yumでパッケージをインストールすると、`/bin`だけでなく`/etc`、`/lib`、`/share`というディレクトリも作成されます。zipファイルにはこれらのディレクトリも入れる必要があります。



### yumda – yum for Lambda を使う

[GitHub yumda – yum for Lambda](https://github.com/lambci/yumda)

1番簡単でおすすめの方法です。

yumのインストール先を`/lambda`に変更したAmazon Linux 2をdockerで起動し、インストールしたディレクトリだけをzipに圧縮します。さらに、そのzipからレイヤーを作ることで、yumでインストールしたソフトウェアをAWS Lambdaの環境で使えるようになります。

この方法の良い点は、インストールしたソフトウェアが依存しているソフトウェアも全てzipに含まれる点です。

```sh
# インストールできるパッケージの一覧を確認する
docker run --rm lambci/yumda:2 yum list available
```

```sh
# ImageMagickをyumでインストールする
docker run --rm -v "$PWD"/im-layer:/lambda/opt lambci/yumda:2 yum install -y ImageMagick
```

```sh
# ImageMagickがインストールされたレイヤーを作成する
cd im-layer
zip -yr ../im-layer.zip .
cd ..
aws lambda publish-layer-version --layer-name im-layer --zip-file fileb://im-layer.zip --description "ImageMagick Layer"
```

```sh
# インタラクティブなシェルで動作確認をする
docker run -it --rm -v "$PWD"/im-layer:/lambda/opt lambci/yumda:2 /bin/bash

# インストールしたImageMagickの動作確認をする
LD_LIBRARY_PATH=/lambda/opt/lib /lambda/opt/bin/convert --version
```



### ImageMagick for AWS Lambda を使う

[GitHub ImageMagick for AWS Lambda](https://github.com/serverlesspub/imagemagick-aws-lambda-2)


ImageMagickを使いたいだけなら、AWS Lambdaにそのままデプロイできるスクリプトがあります。ボタンをクリックしていくだけでデプロイできますが、このImageMagickは必要最小限の構成でビルドされているため、使いたいフォーマットがある場合は自分でコンパイルする必要があります。

コンパイルするオプション等はリポジトリのMakefileを見れば分かります。また、ImageMagickの他にもrsvg-convertなどもクリックだけでデプロイできるようになっています。




### 必要なパッケージを自分で集めてzipにする

[AWS Lambda デプロイパッケージで Amazon Linux AMI ネイティブバイナリパッケージを使用する方法](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-linux-binary-package/)

特におすすめではないですが、公式ドキュメントに書いてある方法です。

`yumdownloader`や`rpmdev-extract`を使って、必要なパッケージの中身を1つずつコピーすることになります。この記事には、コマンドだけ書いておきます。

`yumdownloader`は依存しているパッケージまで含めないため、依存しているパッケージも集めるにはさらに`repotrack`も必要になります。

```sh
# yumdownloaderをインストールする
sudo yum install -y yum-utils rpmdevtools

# パッケージの中身を展開する
cd /tmp
yumdownloader unixODBC.x86_64 freetds.x86_64 libtool-ltdl.x86_64 gnutls.x86_64
rpmdev-extract *rpm

# 必要なファイルをコピーする
sudo mkdir -p /var/task
sudo chown ec2-user:ec2-user /var/task
cd /var/task
/bin/cp /tmp/*/usr/lib64/* /var/task

# zipファイルを作成する
cd /var/task
zip -r9 /tmp/MyCodeWithLibraries.zip *
```
V-Calendarで日付範囲を指定する

# V-Calendarとは
Vueで使えるカレンダーライブラリです。
https://vcalendar.io/

## 日付範囲モード
まず、日付を範囲指定したい場合は、is-rangeを利用します。

```html
  <v-date-picker v-model="dateRange" is-range />
```

あとは、dateRangeに開始日と終了日を渡すだけで、日付の範囲指定が可能です。

```javascript
var startDate = new Date(2020, 10, 14)
var endDate = new Date(2020, 10, 28)

new Vue({
	el: '#cal',
  	data: {
    	mode: 'range',
    	dateRange:{ "start":startDate,"end":endDate },
  	}
})
```

うまくいくと、こんな感じで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272564/cb653c8f-ba67-3d41-5b9e-2b3ca792d72f.png)
## 日付範囲の指定方法
公式に書かれている日付の渡し方を含めて4つ紹介します。

local.jsのnormalizeDateメソッドを見れば、わかる内容です。
https://github.com/nathanreyes/v-calendar

### 1.Dateオブジェクトで日付を指定
これが公式に書かれている方法です。new Dateで日付を渡します。

```javascript
var startDate = new Date(2020, 10, 14)
var endDate = new Date(2020, 10, 28)
```

### 2.文字列で日付を指定
YYYY-MM-DD形式で文字列を渡すことでも可能です。

```javascript
var startDate = '2020-11-14'
var endDate = '2020-11-28'
```

文字列で渡された場合は、Date.parseメソッドで解釈されるので、
Date.parseで解釈できる文字列であれば何でも良いです。

```javascript
var startDate = 'Nov 14, 2020'
var endDate = '2020-11-28T15:00:00'
```

### 3. 数値（ミリ秒）で日付を指定
数値の場合、1970年 1月 1日 00:00:00 UTC からの経過ミリ秒で渡します。

```javascript
var startDate = 1605312000000
var endDate = 1606489200000
```

なので、getTimeやvalueOfの返り値をそのまま渡すこともできます。

```javascript
var startDate = (new Date(2020, 10, 14)).getTime()
var endDate = (new Date(2020, 10, 28)).valueOf()
```

### 4.オブジェクトで日付を指定
オブジェクトに、year, month, dayを格納して渡すこともできます。

```javascript
var startDate = {year: 2020, month: 11, day: 14}
var endDate = {year: 2020, month: 11, day: 28}
```
year, month, dayは文字列でも正しく動作します。

```javascript
var startDate = {year: '2020', month: '11', day: '14'}
var endDate = {year: '2020', month: '11', day: '28'}
```

objectで渡された場合は、new Date()の引数として処理されます。
monthに13といった存在しない月を渡すと、溢れたぶん加算されて表示されるので注意です。

```javascript
var startDate = {year: '2020', month: '13', day: '14'} //2021-01-14
var endDate = {year: '2020', month: '13', day: '28'} //2021-01-28
```
.zoomから.mp4に変換する

zoomの録画時に.zoomが出来てしまったときの備忘録です。

#はじめに
研究室のzoomゼミを録画したところ、***.mp4が作成されると思いきや、気付けば以下の.zoom拡張子なるものが生成...
`double_click_to_convert_01.zoom`
`double_click_to_convert_02.zoom`
これを.mp4に変換する方法を備忘録的に。
なお、windows10で作業しています。

##必要なもの
`double_click_to_convert_01.zoom`
`double_click_to_convert_02.zoom`
(注)両方必要です。
`zTscoder.exe`
(注)通常は隠しフォルダ内にあります。

##隠しフォルダ/ファイルを表示する
エクスプローラーを開き、上部の「表示」をクリック。
右側の「表示/非表示」なるところに「隠しファイル」のチェックボックスがあるので、それをチェック。
これで隠しフォルダ/ファイルを表示できます。

##.zoomから.mp4に変換する
先の`double_click_to_convert_01.zoom`と`double_click_to_convert_02.zoom`を任意のフォルダに用意します。
（自分はこれらのファイルのみのフォルダを用意しました。）

ファイル名には「ダブルクリック」とありますが、`double_click_to_convert_01.zoom`を右クリックして、「プログラムから開く」を選択します。
その先は「その他のアプリ>このPCで別のアプリを探す」の順で進めます。
`C:\Users\[ユーザー名]\AppData\Roaming\Zoom\bin\zTscoder.exe`を選択します。

ここまで来たら勝手に変換を始めてくれます。
しばらくすると、`zoom_0.mp4`が無事に生成されます。

##参考文献
Zoomレコーディング ローカル録画に失敗しても大丈夫！（たまやん さん, 2020.04.19）
https://tnakamot.hatenablog.com/
EC2でマイナーバージョン指定でpsqlをアップデートする方法


RPMをインストール

```
sudo rpm -ivh --nodeps https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
```

AmazonLinux2 はredhat7をベースにしているようなので$releaseverを7に置換

```
sudo sed -i "s/\$releasever/7/g" "/etc/yum.repos.d/pgdg-redhat-all.repo"
```

元々入っていたバージョンを削除

```
sudo yum list installed | grep postgres
sudo yum remove postgresql-11.5-5.amzn2.0.1.x86_64
```

入れたいマイナーバージョンを指定してインストール

```
sudo yum install postgresql11-server-11.6 postgresql11-11.6
```

参考URL
https://qiita.com/libra_lt/items/f2d2d8ee389daf21d3fb
http://h2shiki.hateblo.jp/entry/2016/04/24/170721
http://zaas.hatenablog.com/entry/2020/01/19/122726
Google recruit problem, exp and prime



# 問題

-   {e(自然対数の底)の値で連続する 10 桁の数のうち，最初の素数} をを ruby で求めよ．ただし，e(自然対数の底)は 200 桁までである。


# 解法

-   愚直な解法
    -   e の値中の、連続する 10 桁の数
        -   数の読み込み
        -   10 桁の整数の生成
    -   素数判定
    -   最初の連続する 10 桁の素数を捜す

→ 計算時間が長く、工夫が必要

-   code

```ruby
# coding: utf-8
def check_prime(n)

  (2...n).each do |q|
    if n % q == 0
      return 0
    else
      puts n,q
    end
  end

  return 1
end

e_num = String.new('2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190')
i = 0
e_num = e_num.delete('.')
# 1.連続する 10 桁の数を読み込む
loop do
  num = e_num[i..i+9]
  if num.size() != 10 
    break
  else
    if check_prime(num.to_i) == 1
      puts num
      break
    else
      i += 1
    end
  end
end

```


# 参考

[講義ページ](https://qiita.com/daddygongon/items/ba94b0f2a73990fc6a07)

[プロを目指す人のための Ruby 入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus-ebook/dp/B077Q8BXHC/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ruby&qid=1605077175&sr=8-1)



------
 - **source** ~/classes/muli_scale/grad_members_20f/members/keita_k7/memo/l2.org
リレーモジュールを理解する為だけにリレー経由の単純Lチカを試してみた

電子工作初めてで、回路図もリレーも良く分からず。。。
教わったけど、まだ理解が足りなかったので、ObnizとリレーモジュールでLチカを実装してみた。※今回の例はリレーを経由する意味はないけど、理解を深める為にやってみた。

リレーについては、オムロンさんが非常に分かり易かった。
https://www.omron.co.jp/ecb/product-info/basic-knowledge-series/basic-knowledge-of-relays/part1/basics

#使った部品
* リレーモジュール：[Y14H-1C-5DS](https://akizukidenshi.com/catalog/g/gK-13573/)　※[リレーモジュールの回路図](https://akizukidenshi.com/download/ds/akizuki/AE-G5V-DRV_schematic.pdf)
* マイコンボード：Obniz Board 1Y
* LED：[抵抗内蔵５ｍｍ青色ＬＥＤ（５Ｖ用）](https://akizukidenshi.com/catalog/g/gI-06247/)
* その他：ジャンパワイヤ、ブレッドボード

#リレー制御でLED点灯を試す
###接続図
※LEDは抵抗内蔵なので、抵抗は考慮しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/006d61b1-98a2-ea9f-6bbd-dcb621c71821.png)

###動作イメージ
単純にObnizのスイッチを押すとリレーが動作して、LEDが光るだけ。
![ihbke-sned4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/ed1f1778-921b-5a6f-090c-b848352e5be1.gif)

###コード
超単純コード。

```javascript:.js
const Obniz = require('obniz');
const obniz = new Obniz('0000-0000'); // Obniz_ID

obniz.onconnect = async function () {
    
    const led = obniz.wired('LED', { anode: 0, cathode: 1 }); //LED利用
    obniz.display.clear(); // ディスプレイ表示（初期画面）

    // スイッチの反応を常時監視
    obniz.switch.onchange = async function (state) {
        if (state === "push") {
            // 押したとき
            obniz.display.clear();
            obniz.display.print('LED ON');
            led.on();  // LED点灯 ※リレーON
        } else if (state === 'none') {
            // 押してないとき
            obniz.display.clear();
            obniz.display.print('LED OFF');
            led.off();  // LED消灯
        }
    }
}
```

#（おまけ）PCのマザーボードのPWRBTN#を制御して電源ON
クラウドに接続したObnizからリレーを遠隔操作し、マザーボードのフロントパネルコネクタ（PWRBTN#）をショートさせて、電源をONにする仕組みを考える。以下の通りの接続で実現できた。
ショートさせるだけなので、導通させれば電源が入ると理解。
※やりたいことは[前回記事](https://qiita.com/PmanRabbit/items/dc265392961b2182b9b0)を参考。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/37de51a5-5bce-2c7b-c9b1-585149d748a5.png)

「VIN：リレー電源（5V）」と「Obniz の"+"（5V）」接続でObnizからリレー電源を確保。
「GND：グランド（0V）」はマイナス。「INPUT：制御信号入力（0V～5V）」をプラス。
「GND」と「INPUT」で電気が流れるとリレースイッチが切り替わる。

※リレーON：「NO」-「COM」間が導通
※リレーOFF:「NC」-「COM」間が導通
リメイク : VirtualBoxのVMをライブ/オンライン/無停止バックアップするスクリプト

# VirtualBoxを止めずにバックアップをとりたい！ と私も思った

VirtualBoxのVMをライブ/オンライン/無停止バックアップするスクリプト
Qiita https://qiita.com/miyanaga/items/39c19f1aa1171b2b402e

の

miyanaga@vbox-live-backup
https://github.com/miyanaga/vbox-live-backup

がそのままだと自宅のcentos8サーバ上でうまく稼働しない
(どーも vbox コマンドが先に入っているとshell内でのエイリアス宣言とカブる)
のでリメイクなどする。

# した

tknr@vbox-live-backup
https://github.com/tknr/vbox-live-backup

# crontab例

手動起動確認したのでcrontabに引っ掛けた。(以下はcrontab記入例)

```
0 6 * * 0 /bin/nice -n 19 /bin/bash /usr/local/bin/vbox-backup-all /home/tknr/Documents/Backup/vm/
```
Heroku上のRailsアプリにScoutを導入

## Herokuの管理画面からアドオンを追加
ダッシュボードから操作する方法と、コマンドラインから操作する方法があります。
アドオンを追加した時点で、環境変数が自動でセットされます。

### ダッシュボードから操作する場合
- Herokuのダッシュボードにアクセス
- Resourcesタブを開く
- Add-onsの下の検索窓に'Scout'と入力
- Provisionをクリック

### コマンドラインから操作する場合
Heroku CLIがインストールされている状態で以下のコマンドを叩く

```zsh
$ heroku addons:create scout
```

## Gemを追加
```rb:Gemfile
gem 'scout_apm'
```
```zsh
$ bundle install
```

これだけ。アプリにリクエストが無いとメトリクスは表示されないので注意。導入直後に見ても多分反映されていなくて、本番のアプリを適当に触った上で、数時間後に確認すると反映されてます。
研究用実験 その1:Qiitaのコメントアウト/htmlタグ除去の仕様

簡単に言うと卒業研究でQiitaを実験台に使うことになった


##Qiitaには基本的に他サイトの埋め込みとかはできない
これはもうセキュリティとか理由が色々あるんだろうけど、基本的にiframeであろうとscriptであろうとhtmlタグは勝手に消去されるはず。
そもそもこれはQiitaだけの問題じゃないし、むしろ何でもかんでも実行できる方が問題なので正しい。

ためしに
<iframe src="https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8">こういう感じで</iframe>

```
<iframe src="https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8">こういう感じで</iframe>
```
記述してみると、プレビュー画面の時点で存在が抹消されている。(当然)


##例外
じゃあすべてのサイトが無理なのかというとそうでもない。
実例としてはCodePenとかはQiitaからも利用できる。
仕組みとしてはpタグエリア(aタグを挟む)とscriptタグを用意すると、読み込んだjsがpタグエリアに挿入してくれる感じ。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="StealthMinor" data-slug-hash="jOMNGdM" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="jOMNGdM">
  <span>See the Pen <a href="https://codepen.io/StealthMinor/pen/jOMNGdM">
  jOMNGdM</a> by StealthMinor (<a href="https://codepen.io/StealthMinor">@StealthMinor</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


このうえに

```html
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="StealthMinor" data-slug-hash="jOMNGdM" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="jOMNGdM">
  <span>See the Pen <a href="https://codepen.io/StealthMinor/pen/jOMNGdM">
  jOMNGdM</a> by StealthMinor (<a href="https://codepen.io/StealthMinor">@StealthMinor</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
```

こういうコードを記述してある。


これはQiitaがCodePenに対応してjavascriptの実行を許しているからできる芸当。
当然個人が卒業研究で製作する程度のwebサービスが許可をもらうとかそんなことは無謀なので、別のやり方を用意しなければいけない。




##手段
Chromeの拡張機能のユーザースクリプトでどうにかする。
まあどうにかするためには、「ここに埋め込みたいんだな」っていう目印を残さないといけないので、そのための実験記事がこれになる。
候補としては
[](
Markdownのコメントアウト
)

```
[](
Markdownのコメントアウト
)
```

とか、
<!-- 
htmlのコメントアウト
-->

```
<!-- 
htmlのコメントアウト
-->
```
とか。

あと<p id="test">このpタグが生きてるか</p>とか。

どれがソース内に生き残るかをこの記事の投稿後に確認して、やりやすい方式を採用したい。




##結果
・Markdownのコメントアウト
ソースコードには影も形もない。ダメ。

・htmlコメントアウト
見るからに見えてる。まさに丸見え。

・pタグ
IDをつけてみたんだけど見事に消える。無理。


##追加策
どうにかしてソース内には残さないといけないので、別の方法を考えることにした。
たぶん目に見える形に残さずソースに残すのはQiitaのシステムでは無理なんじゃないかなと思ったので、できるだけ邪魔にならん方法でやる。

###普通にリンクを張る
<a href="https://www.google.com/" id="link_test" class="link_test">こんな感じ。</a>
リンク自体は生きてると思うから、これを置換すればいいんじゃないか？(idが残ってなかったらかなりめんどくさい)

###折り畳み
<details><summary>Markdownの折り畳み。めんどくさい。</summary><div>

\```
なにしろここにコードを書くわけにもいかないし…
書いててなんだが
これは何も変わらないのでは？
記事を読む以上邪魔にならないということだけしか今回の利点が見当たらない。
\```
</div></details>


これぐらい？
現状はリンク張り優先で考えてみよう……


##結果(2)
aタグは残るんだが、id属性もclass属性も抹消される。
querySelectorでhrefのURLを捕まえて、特定URLだけ処理するとかができれば可能かも。

あともうひとつ、実験用にローカルホストへのリンクが機能するかだけ試してみる。
<a herf="http://localhost:8000/code.html">ふつうはエラーを吐くと思う。</a>

###結果(3)
どうやらlocalhost指定のhrefは抹消されるらしい。
実際にページが存在する場合はいいんだが、デバッグはとても面倒になりそう。
フォームの住所項目で、都道府県とそれ以外で分割する

1.フォームの住所入力欄は１つのテキストフィールドだが、
DBに格納するデータとしては、都道府県とそれ以外に分けたい時。
（1はOKだが、都道府県から始まっていることが前提。）

```form_input_address_1.js
address = '大阪府大阪市中央区〇〇町△番地';
address.replace(/^(.{2}[都道府県]|.{3}県)(.+)/, "$1 $2").split(' ');
// ['大阪府','大阪市中央区〇〇町△番地']
address_data_1 = address[0]; // '大阪府'
address_data_2 = address[1]; // '大阪市中央区〇〇町△番地'
```

2.住所が都道府県から始まっていない時。
（2はNG：都道府県のデータを格納したい変数に市以下が格納されてしまっている。）

```form_input_address_2.js
address = '大阪市中央区〇〇町△番地';
address.replace(/^(.{2}[都道府県]|.{3}県)(.+)/, "$1 $2").split(' ');
// ['大阪市中央区〇〇町△番地']
address_data_1 = address[0]; // '大阪市中央区〇〇町△番地'
address_data_2 = address[1]; // ''
```

3.住所が都道府県から始まっていない時。
（2を配列の要素数で条件分岐。都道府県がなれけば空白にする。）

```form_input_address_3.js
// 住所が都道府県から始まっている場合
address = '大阪府大阪市中央区〇〇町△番地';
address.replace(/^(.{2}[都道府県]|.{3}県)(.+)/, "$1 $2").split(' ');
// ['大阪府','大阪市中央区〇〇町△番地']
if (address.length === 1) {
  address_data_1 = '';
  address_data_2 = address[0];
} else {
  address_data_1 = address[0]; // '大阪府'
  address_data_2 = address[1]; // '大阪市中央区〇〇町△番地'
}

// 住所が都道府県から始まっていない場合
address = '大阪市中央区〇〇町△番地';
address.replace(/^(.{2}[都道府県]|.{3}県)(.+)/, "$1 $2").split(' ');
// ['大阪市中央区〇〇町△番地']
if (address.length === 1) {
  address_data_1 = ''; // ''
  address_data_2 = address[0]; // '大阪市中央区〇〇町△番地'
} else {
  address_data_1 = address[0];
  address_data_2 = address[1];
}
```
AWS 認定 ソリューションアーキテクト – プロフェッショナルに向けて

# はじめに
難易度が高いといわれているソリューションアーキテクト – プロフェッショナル(SAP)に向けて、計画的に学習できるよう記録をつけていきます。
アソシエイトと比べて問題数や回答時間は増え、合格ラインも引き上げられているため、かなりの学習時間が求められます。
なんとなくでは絶対合格できないため、効果的な学習のをして少しでも合格確率を上げていきます。

# 学習教材
・[AWS Web問題集](https://aws.koiwaclub.com/)
・[udemy模擬問題集](https://www.udemy.com/course/aws-53225/)
・[AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説 (日本語)](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E8%A9%A6%E9%A8%93%E7%89%B9%E6%80%A7%E3%81%8B%E3%82%89%E5%B0%8E%E3%81%8D%E5%87%BA%E3%81%97%E3%81%9F%E6%BC%94%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC-%E5%B9%B3%E5%B1%B1-%E6%AF%85/dp/4865942483/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)

# 計画
テキスト→テキスト付属の問題集→Web問題集→udemy疑似問題集　の順番でやっていく。
年内取得は最低限の目標です。
できれば12月中にと考えていますが、難易度と受験料が高いため安定してからとなりそうです。
受験料は受かれば会社から支給されるのですが、落ちると自費になります(AWSからの特典で一回は半額になる)


# なんのために
実務経験がない私にとって、資格の学習こそが知識をつける上で一番効率の良いやり方だと思うからです。
また、プロフェッショナル資格では多くのユースケースを学ぶことができるので、今後実案件に参画していく時に少しでも役に立てると思うからです。

<br>
早く合格記事を書けるように頑張ります。

# 参考
https://qiita.com/fkooo/items/17fa401f4e46ecd00675
plotly.expressのお気に入りグラフ3選

## plotly.expressのお気に入りグラフ3選

[データ可視化アドベントカレンダー](https://qiita.com/advent-calendar/2020/data-visualization)1日目の記事です。     
    
データ可視化する際によく使うグラフは何でしょう？案外折れ線グラフとか、棒グラフとかそんな感じだったりするかもしれません。地味だけど分かりやすいんですよね。でも、そういうのってお気に入りとは言えないような気もします。

お気に入りってのは属人的なものです。その人の性格が現れます。私は能天気＋めんどくさがりなので、少ない文字数で派手なグラフが好きです。というわけで、plotlyのラッパーであるplotly.expressを使って簡単に書ける、お気に入りの3つのグラフを紹介します。

### アニメーション散布図

いきなり普通の散布図かよって感じですが、これは引数animation_frameに渡した要素が再生ボタンを押す、もしくはスライダを動かすと、散布図がanimation_frameで指定した要素をもとに変化します。

次の散布図はplotlyのgapminderデータセットを使ったものです。x軸に1人当たりGDP、y軸に平均寿命、散布図の大きさに国の人口をとなっています。下にスライダがありますが、それはデータのある年を示しており、その横の再生ボタンを押すと自動で動きます。

<a href="https://gyazo.com/42b2a0eef9be61baf380a37f38bdbfb1"><img src="https://i.gyazo.com/42b2a0eef9be61baf380a37f38bdbfb1.gif" alt="Image from Gyazo" width="1235"/></a>

```python 
import plotly.express as px
px.scatter(gapminder, x='gdpPercap', y='lifeExp', size='pop', animation_frame='year', log_y=True, log_x=True, range_y=[20,90], size_max=70, hover_name='country', color='continent')
```

コードの量は「一行です」といいために押し込んだ感ありますが、各引数に対して要素を渡していく感じの作りなのでわかりやすいかと思います。


### ツリーマップ

ツリーマップは最近よく見かける、下のように四角の箱の中にまた箱が入ってみたいなグラフです。箱が並んでいるだけだと面白くないのですが、詳細を見たい箱をクリックするとその箱が見れ、戻したい場合は上にある矢印のようなものをクリックすると戻ります。     
      
<a href="https://gyazo.com/5050e04bb26eb9406bee5b7d1dab32bb"><img src="https://i.gyazo.com/5050e04bb26eb9406bee5b7d1dab32bb.gif" alt="Image from Gyazo" width="1157.5"/></a>

「こういうのを書くのって面倒なんでしょ」と思われるかもしれませんが、plotly.expressなら1行で書けます。

```python
import plotly.express as px 
px.treemap(gapminder_pop_2007, path=['board', 'continent', 'country'], values='pop')
```

簡単！(データセットはplotlyのgapminderセットから2007年の人口を使っています)

### バイオリンプロット

バイオリンプロットは形が可愛らしい。しかし可愛らしい分、単体だとちょっと不安になります。こんなもにょもにょしたやつに何が分かるのか！！！といいたくなります。

そういう強面のおっさんには、基本的なグラフと組み合わせたバイオリンプロットを見せてください。こいつの強さが分かってもらえると思います（下ではplotlyのtipsデータセットを用い、散布図とバイオリンプロットを組み合わせ可視化しました）。

ここでは、お支払額とチップ額を散布図として可視化し、曜日のデータを色で分け、x軸とy軸にバイオリンプロットを付けました。バイオリンプロットにより曜日ごとのデータの違いがより鮮明にわかるようになったと思います。

<a href="https://gyazo.com/96b0c638ad953aed1938a325d34d94dc"><img src="https://i.gyazo.com/96b0c638ad953aed1938a325d34d94dc.gif" alt="Image from Gyazo" width="1237.5"/></a>

ちなみに散布図だけだと次のようになります。

<a href="https://gyazo.com/5277da507fad8e44ff275ca9a5f4e188"><img src="https://i.gyazo.com/5277da507fad8e44ff275ca9a5f4e188.gif" alt="Image from Gyazo" width="1250"/></a>

バイオリンがないせいで分かり難く感じるでしょう（バイオリンより棒グラフをとか言わない）。

「こういうのを書くのって面倒なんでしょ」と思われるかもしれませんが、plotly.expressなら1行で書けます。

```python
px.scatter(tips, x='total_bill', y='tip', color='day', marginal_x='violin', marginal_y='violin')
```

## まとめ

以上、plotly.expressのお気に入りグラフを3つ紹介しました。plotly.expressは複雑に動くグラフをここで見たように、簡単に描くことができます。

グラフを簡単に描くためにはデータの作り方にも工夫が必要なのですが、その辺りの話はまた今度。

参照ページは[plotlyの公式ドキュメント](https://plotly.com/python/)です。
[グラフ作成のコードはcolabを参照ください](https://colab.research.google.com/drive/1hsZVPQMhfT9PG_TS9Es0HbJtNdR1bxui?usp=sharing)。
Rubyで文字列に特定の文字列が含まれているか判定する（include?メソッド）

ruby 2.7.0についての記事です

- include? 文字列中に特定の文字列が含まれていれば真を返す<br> 
<a href="https://docs.ruby-lang.org/ja/latest/method/String/i/include=3f.html">公式ドキュメント（stringクラスinclude?）</a>

```ruby
#公式ドキュメントより
"hello".include? "lo"   #=> true
"hello".include? "ol"   #=> false

#自分なりの活用法
arry = ["hello","string","integer"]
arry.each do |s|
  if s.include? "e"
    puts s
  end
end
# => hello
     integer
```

- include? 配列がvalueと == で等しい要素を持つ時に真を返す <br>
<a href="https://docs.ruby-lang.org/ja/latest/method/Array/i/include=3f.html">公式ドキュメント（arryクラスinclude?）</a>

```ruby
#公式ドキュメントより
a = [ "a", "b", "c" ]
a.include?("b")       #=> true
a.include?("z")       #=> false
```
Ubuntu 20.04 で Python3.6

Ubuntu 20.04　では　Python3.8が入っている。
テストのためにPython3.6を使いたかったので、以下のようにしてテストした。


「python3 - Problem with creating Python 3.6 virtual environment on Ubuntu 20.04 - Ask Ubuntu」
https://askubuntu.com/questions/1231543/problem-with-creating-python-3-6-virtual-environment-on-ubuntu-20-04
ここを参考に


```

$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
$ sudo apt-get install python3.6

```

としました。この時点で

```

$ python3.6
```

とすると

```

Python 3.6.12 (default, Aug 17 2020, 23:45:20) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
```

となります。


次に、

```

$ sudo apt-get install python3.6-venv
$ python3.6 -m venv mypy36venv

```


単に python を起動すると 3.8.5 が起動します。

```

$ python --version
Python 3.8.5
```

環境を切り変えると、3.6.12が起動するようになります。


```

$ source mypy36venv/bin/activate
(mypy36venv) $ python --version
Python 3.6.12
```

この状態で、


```

$ sudo python3.6 -m pip install pip
```

とすると

```

Requirement already satisfied: pip in /usr/lib/python3/dist-packages (20.0.2)
(mypy36venv) $
```

となり、pipが使えました。(多分、sudo python3.6 -m pip install pip の操作自体はいらないはず：未確認)

```

$ pip3.6 install pyserial
$ pip3.6 install pyftdi
```


# sudo 環境で使う


上記はローカルユーザの環境なので、sudo して動かすような　python プログラムだと反映されない。

```

$ sudo  pip3.6 install pyserial
```
としても、

```

sudo: pip3.6: コマンドが見つかりません
```
となる。



なのでrootで環境を作ります。

```

$ sudo python3.6 -m venv rootpy36venv
```

ここから先は root のシェル環境で作業しました。

```

$ sudo bash
# source rootpy36venv/bin/activate
# pip3.6 
# pip3.6 install pyserial
# pip3.6 install pyftdi
```

これで　sudo python3.6 で起動する python 環境でも必要なモジュールが使えるようになりました。
jQueryを使ってタブを切り替える

備忘録として残しておきます。

#HTML
``` tab.html
<div class="tab">
    <ul class="nav-tabs">
      <li class="active"><a href="#tabs1" data-toggle="tab">あ行</a></li>
      <li><a href="#tabs2" data-toggle="tab">か行</a></li>
      <li><a href="#tabs3" data-toggle="tab">さ行</a></li>                
      <li><a href="#tabs4" data-toggle="tab">た行</a></li>
      <li><a href="#tabs5" data-toggle="tab">な行</a></li>
    </ul>
    
    <div class="tab-content">
      <div class="tab-pane active" id="tabs1">
        <p>あいうえお</p>
      </div>
      <div class="tab-pane" id="tabs2">
        <p>かきくけこ</p>
      </div>
      <div class="tab-pane" id="tabs3">
        <p>さしすせそ</p>
      </div>
      <div class="tab-pane" id="tabs4">
        <p>たちつてと</p>
      </div>
      <div class="tab-pane" id="tabs5">
        <p>なにぬねの</p>
      </div>
    </div>
</div>

``` 

#CSS
``` tab.css
ul {
  list-style: none;
}
li {
  margin-top: 10px;
}
a {
  text-decoration: none;
  color: #000000;
  padding: 5px 30px;
  border-radius: 20px;
}
.tab{
  display: flex;
}
.tabs > li > a {
  padding: 11px 25px;
  min-width: 100px;
  text-align: center;
  border: 2px solid #e8e8e8;
  
}
 li.active a {
  color: #fff;
  border-color: #000000;
  background-color: #000000;
 }
.tab-content{
  padding: 0 80px;
  margin-top: 10px;
}
.tab-content .tab-pane { 
  display: none;
 }
.tab-content .active { 
  display: block;
 }

``` 

#jQuery
``` tab.js
$(".nav-tabs a").on("click", function() {
  $(this).parent().addClass("active").siblings(".active").removeClass("active");
  var fade = $(this).attr("href");
  $(fade).addClass("active").siblings(".active").removeClass("active");
    return false;
});
``` 

#結果
あ行をクリックすると、あ行だけ表示され
![スクリーンショット (40).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221011/9a547aab-90ce-99bd-c9bb-fd008551a917.png)
か行をクリックすると、か行だけ表示されます。
![スクリーンショット (41).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221011/3e8e5bab-a907-ebb1-3deb-7ced0c88de9a.png)



#参考リンク
https://www.design-memo.com/coding/jquery-tab-change
sFlow/NetFlowによるトラフィックフロー・レポート

#sFlow/NetFlowによるトラフィックフロー・レポート

sFlow/NetFlowを受信分析するシステムでは、時間帯別のSourceAddress、SourcePort、DestinationAddress、DestinationPort別のフローレポートを作成することが一般的と思われる。
以下にInMon社のシステムでの作成例をご紹介します。

###TrafficSentinel
####レポート
以下TrafficSentinelの時系列トラフックレポート作成画面
初期画面より、レポート＞クエリのカテゴリ：Traffic、セクション：Traffic Totals by Time を選択し、下記画面を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/3485f5e2-60b9-186a-52ca-d5caae99c273.png)

フロー情報を表示するので、キーの選択で必要な項目を選択；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/eb4a580f-c4b1-62ed-ff97-b9eef1af4074.png)

今回は、time,sourceaddress,sourceport,destinationaddress,destinationport で集約；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/b54a49fe-552e-7804-163c-b1a02704388a.png)

そして、実行；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/76b00b39-98c3-a4eb-c2ff-25d44510ddc9.png)

このレポートは、システムが保持しているフロー全体からレポートしましたが、検索条件にて、
特定のエリア、エージェント（ネットワーク機器）、インターフェースなどで、集約して表示するのが効果的です。
例；
sourcegroup = '東京港区データセンター'
agent = 192.168.10.3
agent='192.168.10.3' & inputifindex = '1'

####スクリプト
スクリプトでは;
初期画面より、レポート＞スクリプトで、スクリプトを記述；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/a47baa27-c264-1e59-748c-617e66c2448c.png)
実行；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/8d19b88d-8c40-83c0-f6da-1ec468c88d1e.png)
別のプログラムやシステムからスクリプトを実行してデータ取得する事も可能

###sFlowTrend
sFlowTrendでのフローレポートは、
レポート＞レポートの基本設定で、クエリを「Top source-destination flows」で作成；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/23cf71da-5502-bd9d-d4c9-3ea8ddb86761.png)
実行し表示；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/73d1f18d-37a9-fe2b-b806-b33ae6a35047.png)
[GCP][CI/CD]Cloud Buildを使ってGitリモートリポジトリからCloud Storageへ自動デプロイ

Advent calendar3日目です🎉
引き続きGCPの話です。
[パーソンリンク](https://www.person-link.co.jp/)では[kibera](https://kibe.la/?gclid=CjwKCAiA8Jf-BRB-EiwAWDtEGhq_4-FdgaUqR29YRwpJmGgA_zwiHrzTk7Zq_qd-aUhQfkheIMHU1hoCPB8QAvD_BwE)というツールを使って社内で技術系の知見を共有しています。
そこで投稿したものを外部にも公表します🌞

## 本題

Cloud Storageに置いてある静的ページに対して、Cloud BuildでGitリモートリポジトリ(ここではBitbucket)へのpushをトリガーに自動デプロイするまでの設定手順です。

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/666c69e9-e5d9-c429-ab34-c166d471e886.png)

## 前提条件
以下は行っている前提で書きます。

- GCPアカウント作成
- GCPプロジェクト作成
- GCPアカウントの決済情報登録
- Gitリポジトリ作成

## Cloud Storageの作成
[ホーム画面](https://console.cloud.google.com/) > メニュー > [Storage](https://console.cloud.google.com/storage/browser)

1. 「バケットを作成」をクリック
2. 名前、リージョン(asia-northeast1(東京))、ストレージクラス(Standerd)、アクセス制御(均一)を設定。
3. 「作成」をクリック

## Cloud Builder トリガーの作成
[ホーム画面](https://console.cloud.google.com/) > メニュー > [Cloud Builder](https://console.cloud.google.com/cloud-build)

1. 初期状態だとAPIの画面に飛ばされるので「有効にする」をクリック
2. [トリガー](https://console.cloud.google.com/cloud-build/triggers) > 「トリガーを作成」をクリック
3. トリガー名、イベント(ブランチにpushする)、ソース(新しいリポジトリに接続>Bitbucket>リポジトリ選択)、ビルド構成(Cloud Build構成ファイル)を設定。
4. 「作成」をクリック

## Cloud Build 構成ファイルの作成

1. プロジェクトのルートディレクトリに**cloudbuild.yaml**を作成する
2. cloudbuild.yamlの内容に以下を記載する

```cloudbuild.yaml
steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  args: ['gsutil', 'rsync', '-d', '-r', '.', 'gs://STORAGE_NAME/']
```

書き方は一般的なCI設定で書くのと同じような感じです。
nameフィールドでコンテナイメージを指定し、argsフィールドでコマンドの引数をリストにして指定します。
以下は構成ファイルの公式ドキュメントです。
[ビルド構成の概要  |  Cloud Build のドキュメント  |  Google Cloud](https://cloud.google.com/cloud-build/docs/build-config?hl=ja)

**gsutil**はGoogle Cloud Storage (GCS) を操作するためのコマンドラインツールのことです。
**rsync**コマンドは2つのバケットやディレクトリの内容を同期するためのコマンドです。
参考：[gsutil rsync についての簡単なメモ | Yucchiy's Note](https://blog.yucchiy.com/2017/11/20/how-to-using-gsutil-rsync/)


**STORAGE_NAME**には最初の手順で作成したストレージの名前を記載します。



## 自動デプロイ実行

上記ファイルをコミットしてpushします。
Cloud Builderの[履歴](https://console.cloud.google.com/cloud-build/builds)でログを確認し、成功になっていることを確認します。
![スクリーンショット 2020-11-25 11.55.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/9a580eb2-50f0-9861-4fab-172f2ca09508.png)

Cloud Storage上でも、ファイルがアップロードされていることが確認できました。
![スクリーンショット 2020-11-25 11.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/64e2e190-eae6-15df-47ef-0039f0bb127b.png)

## 参考
[Cloud Build を使って静的ページを Cloud Storage にデプロイする](https://qiita.com/ktoshi/items/f5bccb96513f1a1c957d)
nuxt-composition-apiを導入したら、fs in ./node_modules/fs-extra/lib/index.jsなエラーが出る

nuxt-property-decoratorからnuxt-composition-apiに移行する際
下記のようなエラーが出ました。

```
 ERROR  Failed to compile with 3 errors                                    friendly-errors 13:54:01

This dependency was not found:                                             friendly-errors 13:54:01
                                                                           friendly-errors 13:54:01
* fs in ./node_modules/fs-extra/lib/index.js, ./node_modules/graceful-fs/graceful-fs.js and 1 other
*
```

え、node・・？とイミフと思いますが、[公式githubのissue](https://github.com/nuxt-community/composition-api/issues/234)に書いてありました。

```
buildModules: [
    ~~,
    ~~,
    'nuxt-composition-api',
  ],
```

buildModuleにnuxt-composition-apiを追加する必要があります。

というか、githubみなくてもgetting-startedに書いてたんですよねぇ・・。
まず公式見よう、ホント。

https://composition-api.nuxtjs.org/getting-started/setup
Node.js: Google Cloud Translation API の使い方 (Advanced)

```js:advanced01.js
#! /usr/bin/node
//
//	advanced01.js
//
//						Nov/25/2000
//
// ---------------------------------------------------------------
'use strict'

// ---------------------------------------------------------------
const projectId = "project-translation"
const location = 'global'
const text = "Es war einmal ein kleines Mädchen."

const {TranslationServiceClient} = require('@google-cloud/translate')

const translationClient = new TranslationServiceClient()

async function translateText() {
	const request = {
		parent: `projects/${projectId}/locations/${location}`,
		contents: [text],
		mimeType: 'text/plain',
		sourceLanguageCode: 'de',
		targetLanguageCode: 'ja',
	}

	try {
		const [response] = await translationClient.translateText(request)

		for (const translation of response.translations) {
			console.log(`Translation: ${translation.translatedText}`)
		}
		console.error ("*** 終了 ***")
	} catch (error) {
		console.error(error.details)
	}
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")
translateText()
// ---------------------------------------------------------------
```

実行方法

```bash
export GOOGLE_APPLICATION_CREDENTIALS=./***.json
#
./advanced01.js
```

実行結果

```text
*** 開始 ***
Translation: 昔々、小さな女の子がいました。
*** 終了 ***
```
A2019.16/.17のUI変更点

#最近のバージョンでのUI変更点
A2019.16や.17で、デバイス登録やレコーダー周りのUIが変更されていますので、簡単にまとめておきます。

##デバイス設定
まず、デバイス登録時に出てくる画面がこんな感じに変更されています。
シングルユーザー、マルチユーザーデバイス。。。
正直、多くのユーザーさんは意味分からないかと思います。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/cc372677-ba4e-b3bf-c6f6-490dd6dc2cce.png)

ということで、違いを説明します。

|  | シングルユーザーデバイス | マルチユーザーデバイス |
|:-:|:-:|:-:|
| どの様なときに使う  | 通常のPC  | ターミナルサーバー、AWS等の仮想環境 |
| Botの実行  | Bot Agent - CRのセッション内で指示  | RDPで接続に行く  |

つまりリモートデスクトップを張りに行くかどうかの違いになります。
リモートデスクトップを張りに行くことで、マルチユーザーデバイスの場合は複数のユーザーが同時にログインしてBotを走らせることが可能となっています。

もう一つこの機能の利点として、AWS等の仮想マシンの場合、物理的なモニターデバイスがないため、従来のシングルユーザーデバイス状態では、うまくBotが稼働しないという事がありました。
「マルチユーザーデバイス」「同時１接続」という設定をすることで、このような問題を回避させることが可能となっています。

##デバイス設定の変更
尚、シングルユーザー・マルチユーザーデバイスの設定は、後からも変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/9dc2557f-7cca-e612-ad29-a1c2a82a9ddd.png)

##レコーダー
こちらは、A2019.17からとなりますが、レコーダーの入り口が、「ユニバーサルレコーダー」と「AI Sense」で一つになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/b1839ef2-ff80-b2e4-dd13-41ed3627c3ed.png)

ただし、現時点では、両レコーダー機能が完全に一つに融合されているわけではなく、
あくまでも入り口の統合という事になっており、レコーダーを開くと下記の画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/7b583e00-a843-0df7-a238-49eb8cdb1081.png)

「Universal Recorder」・・・従来のレコーダー
「AI Sense Recorder」・・・AI Sense。AI（画像認識・機械学習）を使ったレコーダー
となっていますので、基本的には、Universal Recorderを使って貰い、
RDP経由のアプリケーションアクセスや、Universal Recorderでオブジェクトが認識できなかった場合に、AI Sense Recorderを試してみてもらえると良いかと思います。

レコーダーのUI自体も変わってますね。ちょっとかっこ良くなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/1169b669-1bdd-3bb3-d9aa-8f2480abb8e4.png)
Node.js: Google Cloud Translation API の使い方 (Basic)

```js:basic01.js
#! /usr/bin/node
//
//	basic01.js
//
//						Nov/25/2000
//
// ---------------------------------------------------------------
'use strict'

async function translateText() {
	let [translations] = await translate.translate(text, target)
	translations = Array.isArray(translations) ? translations : [translations]
	console.log('Translations:')
	translations.forEach((translation, i) => {
		console.log(`${text[i]} => (${target}) ${translation}`)
		console.error ("*** 終了 ***")
	})
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")
const {Translate} = require('@google-cloud/translate').v2

const translate = new Translate()


const text = "Es war einmal ein kleines Mädchen."
const target = "ja"
translateText()

// ---------------------------------------------------------------
```

実行方法

```bash
export GOOGLE_APPLICATION_CREDENTIALS=./***.json
#
./basic01.js
```

実行結果

```text
*** 開始 ***
Translations:
E => (ja) 昔々、小さな女の子がいました。
*** 終了 ***
```
L2-constrained Softmax Loss for Discriminative Face Verification【Abstract】【論文 DeepL 翻訳】

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[L2-constrained Softmax Loss for Discriminative Face Verification](https://arxiv.org/abs/1703.09507)
Rajeev Ranjan, Carlos D. Castillo, Rama Chellappa

前: 無し
次: [【1 Introduction】](https://qiita.com/tomato_/items/a346d9ae53ed6a2d72ec)

# Abstract

## 訳文

近年, 深層畳み込みニューラルネットワーク (DCNN) を用いた顔照合システムの性能が大幅に向上している. 顔認証のための典型的なパイプラインは, ソフトマックス損失を用いて被写体分類のための深層ネットワークを訓練し, 最後の層の出力を特徴記述子として使用し, 顔画像のペアを与えられたコサイン類似度スコアを生成することを含む. ソフトマックス損失関数は, 正のペアでは類似度スコアが高く, 負のペアでは類似度スコアが低くなるように特徴量を最適化していないため, 性能にギャップが生じてしまう. 本論文では, 特徴記述子に L2 制約を加え, 固定半径の超球上に存在することを制限する. このモジュールは, 既存のディープラーニングフレームワークを用いて簡単に実装できる. 本研究では, この単純なステップを学習パイプラインに組み込むことで, 顔認証の性能が大幅に向上することを示す. 具体的には, IJB-A という難度の高いデータセットにおいて, 顔認証プロトコルの真偽判定率 0.0001, 真正判定率 0.909 を達成し, 最先端の結果を達成した. さらに, LFW データセットでは 99.78% の精度で最先端の性能を達成し, YTF データセットでは 96.08% の精度で競合する性能を達成した.


## 原文

In recent years, the performance of face verification systems has significantly improved using deep convolutional neural networks (DCNNs). A typical pipeline for face verification includes training a deep network for subject classification with softmax loss, using the penultimate layer output as the feature descriptor, and generating a cosine similarity score given a pair of face images. The softmax loss function does not optimize the features to have higher similarity score for positive pairs and lower similarity score for negative pairs, which leads to a performance gap. In this paper, we add an L2-constraint to the feature descriptors which restricts them to lie on a hypersphere of a fixed radius. This module can be easily implemented using existing deep learning frameworks. We show that integrating this simple step in the training pipeline significantly boosts the performance of face verification. Specifically, we achieve state-of-the-art results on the challenging IJB-A dataset, achieving True Accept Rate of 0.909 at False Accept Rate 0.0001 on the face verification protocol. Additionally, we achieve state-of-the-art performance on LFW dataset with an accuracy of 99.78%, and competing performance on YTF dataset with accuracy of 96.08%.