OmniAICreator/Qiita-1.07M huggingface dataset:
PHPの言語仕様 (命令文とセミコロン)

# 環境

```
$ php7.2 --version
PHP 7.2.24-0ubuntu0.18.04.6 (cli)
```
記事中のコードについては上記環境で確認を行っています


# 命令文の区切り文字としてセミコロン (;) を使用する

動作する

```
<?php
$lang = 'PHP';
```

動作しない

```
<?php
$lang = 'PHP'
```
> PHP Parse error:  syntax error, unexpected end of file in ~/aaa.php on line 3

# 閉じ括弧後のセミコロンは省略できる

動作する

```
<?php
if (true) {
    echo 'Hello, PHP!';
};
```

動作する

```
<?php
if (true) {
    echo 'Hello, PHP!';
}
```
省略した記法のほうが一般的である。

# PHP終了タグの直前のセミコロンは省略できる

動作する

```
<?php
echo 'PHP'
?>
```

動作するが、統一性を持たせるため基本的に記載したほうがよい。
> 省略可能な箇所であっても、セミコロンをつけておくことをお勧めします。あとからコードを読み直す際に、そのほうがわかりやすくなります。 (参考書籍 p.18)

# 参考書籍
[プログラミングPHP 第3版](https://www.oreilly.co.jp/books/9784873116686/)
Amplify UI Componentsの日本語化

#概要
Nuxt+Amplifyで認証周りを組むことを想定していますが、そのままVueを使ってもReactでもAngularでも可能かと思います。

<img width="400px" alt="signin" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126654/1da18b77-f19d-08d8-b534-ed4c669f0f6e.png">

こちらを日本語化していきます。
## 結論の前に
2020年の4月くらいにAmplify UI Componentsに新バージョンがリリースされた模様です。
具体的には
Latest `@aws-amplify/ui-<framework>` と Legacy 版である `aws-amplify-<framework>`
でして、現時点で Amplify hogehogeみたいな形でググると大体Legacy版のブログやQiita記事が出てきます。
最初よくわからなかったのでLegacy版でコーディングしていましたが、Latest版の恩恵が大きいので、後に続く方は必ずLatest版を使いましょう。
ちなみに自分は公式ドキュメントがすべて英語なため読み解くのが面倒だったので、楽をしようとしたらやり直す羽目になりました。

## 日本語化について
Latest版では日本語化についてもちゃんと公式ドキュメントに書いていました。
https://docs.amplify.aws/ui/customization/translations/q/framework/vue
旧版では見受けられなかったので、新版の恩恵の一つかもしれません。

## 実装
実際上記のドキュメントから自分がどのように実装しているかが下記になります。
ちなみに私はNuxtどころかVueを使うのが初めてで、ろくすっぽ公式ドキュメントを読んでいないのでベストプラクティスかどうかわかりません。良い方法あれば教えて下さい。
Nuxtで開発した場合、まずはAmplify用の初期設定ファイルをplugin直下に作ると思うので、そちらに日本語化の処理を書きます。
多分vueで構築している場合は`main.js`です。

```amplify.js
import Vue from 'vue'
import Amplify, * as AmplifyModules from 'aws-amplify'
import '@aws-amplify/ui-vue'
import awsExports from '../src/aws-exports'
import { vocabularies } from './dictionary.js'

AmplifyModules.I18n.putVocabulariesForLanguage('ja', vocabularies)

Vue.prototype.$Amplify = AmplifyModules
Vue.use(AmplifyModules)
Amplify.configure(awsExports)
```

公式通りですね。
I18クラスの`putVocabulariesForLanguage`メソッドを呼び出します。
第一引数に翻訳する言語をstringで、第二引数に実際の翻訳する対象の箇所と翻訳語の日本語をobjectで指定します。私は変換ファイルを別途pluginフォルダ内に作成しています。
第2引数を具体的に説明すると、上記画像の中で `Sign in to your account`という英語を日本語化したいとします。すると

```dictionary.js
{[Translations.SIGN_IN_HEADER_TEXT]: 'ログイン',}
```
このような形のObjectを作ります。
ではどの英語がどのkeyに対応しているのかといいますと、下記のリンクに書いています。
https://github.com/aws-amplify/amplify-js/blob/main/packages/amplify-ui-components/src/common/Translations.ts

ちなみにエラーメッセージ系は下記でした。
https://github.com/aws-amplify/amplify-js/blob/main/packages/auth/src/common/AuthErrorStrings.ts

では上記を元に辞書ファイルを作っていきましょう。
表示してほしくない文字列は空文字にしています。
※なお、Qiitaの仕様で括らないと表示されないためkeyをシングルクォーテーションでくくっていますが、実際は外してください。

```dictionary.js
import { Translations } from '@aws-amplify/ui-components'

export const vocabularies = {
  '[Translations.CREATE_ACCOUNT_TEXT]': 'アカウントの作成',
  '[Translations.EMAIL_LABEL]': 'メールアドレス *', 
  '[Translations.EMAIL_PLACEHOLDER]': ' ',
  '[Translations.FORGOT_PASSWORD_TEXT]': 'パスワードをお忘れの場合',
  '[Translations.PASSWORD_LABEL]': 'パスワード *',
  '[Translations.PASSWORD_PLACEHOLDER]': ' ', 
  '[Translations.RESET_PASSWORD_TEXT]': 'パスワードを変更する',
  '[Translations.SIGN_IN_ACTION]': 'ログイン',
  '[Translations.SIGN_IN_HEADER_TEXT]': 'ログイン',
}
```
このように翻訳用のObjectを用意してあげると、、、

<img width="400px" alt="signin" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126654/ac8bc1fd-b9e8-d546-15cd-dc524b595e99.png">

成功しました。
placeholderとか不要なので空文字にしてます。

## 学び
1. 英語でもめんどくさがらずに、ちゃんと公式を読みにいきましょう。
読んだら読んだで大した量ではないです。

2. Amplify UI Componentsは最新版を利用しましょう。
公式通りTutorialを進めたら最新版で構築するような流れになっています。

## お願い
一部エラーメッセージの定義ファイルがどこにあるのかわかりませんでした。
もし発見された方は教えていただけますと幸いです。

エラーメッセージ例
`Custom auth lambda trigger is not configured for the user pool.`
`An account with the given email already exists.`
LaTeXでauthblkとtitlingが衝突する。

## maketitleの衝突
要旨集を作成するにあたって複数回 `maketitle` を使いつつ著者などの指定には `authblk` を使おうと奮闘していました。どうやら `titling` と `authblk` は両方が内部で `maketitle` を定義しているので `usepackage` した順番によって `maketitle` の挙動がおかしくなる、という問題があります。`titling` を先に `usepackage` すると `There's no line here to end` というエラーメッセージが出て、`authblk` を先に `usepacakge` すると出力されるタイトルのフォーマットがおかしくなります。

## 解決方法
`titling` 内で定義された `maketitle` を `authblk` が再定義しているので、それをもとに戻す定義を加えます。

```latex
\documentclass[uplatex]{jsarticle}

\usepackage{titling}
\usepackage{authblk}

\makeatletter
\def\maketitle{\AB@maketitle}
\makeatother

\begin{document}
% authorやらaffilやらを指定する
\maketitle
% authorやらaffilやらを指定する
\maketitle
\end{document}
```
LaravelでAPI単位で接続先DBを切り替える

## TL; DR
Laravelでは、接続先のDBのホストの[read/write接続](https://readouble.com/laravel/5.5/ja/database.html#read-and-write-connections)が自動的に設定されすが、OracleDatabaseへの接続を[yajra/OCI8](https://github.com/yajra/laravel-oci8)を用いると、このread/write接続が行えません。

そのため、[Middleware](https://readouble.com/laravel/5.7/ja/middleware.html)にて、エンドポイント単位で接続先のDBを切り替えます。

## 環境
- Windows 10
- PHP 7.2
- Laravel 5.5
- Oci8 5
- Oracle database

## Middleware作成
今回は、read接続先指定用とwrite接続先指定用のMiddlewareを作成します。
作成手順は、以下の要領です。

```
/var/www/html# php artisan make:middleware ConnectWriteDatabase
Middleware created successfully.
/var/www/html# php artisan make:middleware ConnectReadDatabase
Middleware created successfully.
```

これで、以下のMiddlewareが作成されました。

ConnectWriteDatabase.php

```php
<?php
namespace App\Http\Middleware;
use Closure;
class ConnectWriteDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}
```

ConnectReadDatabase.php

```php
<?php
namespace App\Http\Middleware;
use Closure;
class ConnectReadDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}
```

## Middlewareの登録

作成したMidllewareはそのままでは使用できません。そのため、使用できるようにするためには、Karnel.phpへの登録が必要です。通常ですとMiddlewareを全HTTPリクエストに適用するにはGlobal MiddlewareとしてKarnerl.phpへの登録を行う必要があります。

ですが、今回は特定のHTTPリクエストに対してMiddlewareを適用するため、Kernelの`$routeMiddleware`への登録を行います。

App\Http\Kernel.php

```php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/** 省略 */
    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
		// ここにMidlewareを追加
        'connect.write' => \App\Http\Middleware\ConnectWriteDatabase::class,
    ];
}
```

## Middlewareのエンドポイントへの適用

指定したエンドポイントに作成したMiddlewareを適用するには、大きく2つの方法があります。

1. routes/api.phpに記載
2. ハンドラメソッドのコンストラクタに記載

ここでは、「1.routes/api.phpに記載」の方法をとります。
Laravelでは、[Routing](https://readouble.com/laravel/5.5/ja/routing.html)の設定では、routesディレクトリ直下のルートファイルで定義をします。
このとき、`RouteGroup`を使用することで、複数のRoutingの定義対象に対して、適用するMiddlewareを指定することができます。

例：公式ドキュメント[Routing](https://readouble.com/laravel/5.7/ja/routing.html)から抜粋

```php
Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // firstとsecondミドルウェアを使用
    });
    Route::get('user/profile', function () {
        // firstとsecondミドルウェアを使用
    });
});
```

この要領で、write接続を行うエンドポイントを定義するRouteメソッドをGroupで定義し、Middleware`connect.write`の指定を行います。

例

```php
Route::middleware(['connect.write'])->group(function () {
    Route::post('/user', '/Api/User/StoreAction');
    Route::put('/user/{user}', '/Api/User/UpdateAction');
});
```
Vue.jsでVuetifyを使ってページを作成してたら変に上部のスペースが空いて困った件

こんにちは、[Yui](https://twitter.com/yui_active)です。

今回Vue.jsの案件でVuetifyを使って簡単なサイト制作をしている際に、ページの上部に謎の空白が空いてしまって丸1日悩んだので、その件に関して書きます。

#環境
```
$ node -v
v12.18.2

$ npm -v
6.14.5

$ vue -V
@vue/cli 4.4.6
```

UIフレームワークはVuetify2系を使ってます。

#何が起こったか
ホームページの上部に特にcssを使ってないのに謎の空白が空いてしまった。
<img width="1030" alt="スクリーンショット 2020-08-01 3.10.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670446/0677b85c-766f-2e84-d974-fb458f283bf7.png">

ページの構成としては、ヘッダーとフッターという全ページ共通の部分だけ`App.vue`に記載していて、YouTube埋め込み部分は`Home.vue`に記載していました。

書いていたコードは下記

```vue:App.vue
<template>
  <v-app>
    <v-app-bar app color="primary" dark>   
    </v-app-bar>
    //この辺は省略
    <v-content>
      <router-view/>
    </v-content>
    //この辺は省略
  </v-app>
</template> 
```

```vue:Home.vue
<template>
  <v-app>
    <v-main>
      <v-container>
        <v-row>
          //ここにYouTubeの動画部分のコンポーネントをはさむ
        </v-row>
      </v-container>
　　　　　//この辺は省略
    </v-main>
  </v-app>
</template>
```

#解決策
どうやら、デベロッパーツールでコードを見ると、Vuetifyのappプロパティがもつ性質により、paddingを挟んでしまっているらしいということで、`<v-content></v-content>`と`<v-main></v-main>`を削除。

※そもそも、入れ子構造になりすぎていて汚いので、きちんと考えて書くべきだった。
今までなんとなく書いてたので反省。

```vue:App.vue
<template>
  <v-app>
    <v-app-bar app color="primary" dark>   
    </v-app-bar>
    //この辺は省略
    <router-view/>
    //この辺は省略
  </v-app>
</template> 
```

```vue:Home.vue
<template>
  <v-app>
    <v-container>
      <v-row>
        //ここにYouTubeの動画部分のコンポーネントをはさむ
      </v-row>
    </v-container>
　　　//この辺は省略
  </v-app>
</template>
```

#結果
<img width="1021" alt="スクリーンショット 2020-08-01 3.29.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670446/c0e070a7-b454-1e37-6a24-be4d54617fff.png">
レイアウトが整った〜〜〜！

Vuetifyは便利だが、appプロパティがもつ性質をきちんと理解してコードを書いていきたい。
もっと良い書き方はあるはずなので引き続き勉強します。
enum ではなく union を使うべし[Typescript]

# まとめ
すべてはここに
https://www.kabuku.co.jp/developers/good-bye-typescript-enum

この記事を見れば全てが書いてあるが、備忘録として残しておく。

# enum で書くと

```ts
enum PositionValue {
  Top = 'top',
  Bottom = 'bottom',
}
```

# union で書くと(の一例)

```ts
const PositionValue = {
  Top: 'top',
  Bottom: 'bottom',
} as const;
type PositionValue = typeof PositionValue[keyof typeof PositionValue];
```

## なぜあえてこの書き方をピックアップしたのか

列挙された値を `Object.values` で取得してなんやかんや、ということを行うことが多いので、その場合、この書き方の方が都合が良い。
Windows Home で Docker Toolbox を導入しようとして詰まる

# 手順
基本はこの手順で OK
https://qiita.com/zeffy1014/items/dda78f4ab0449989dfe1

# 詰まりポイント

**Docker Quickstart Terminal** を実行すると、「CPCの仮想化を有効にしろよ」って怒られる。

```
Running pre-create checks...
Error with pre-create check: "This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory"
Looks like something went wrong in step ´Checking if machine default exists´... Press any key to continue...
```

タスクマネージャーで確認。
有効化されてる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/af713e00-9af9-3b9d-c597-1d6f4cc5603d.png)

どお゛じでえ゛え゛え゛

## 使用CPU

AMD Ryzen 7 3700X 8-Core Processor

# 調べる

参考:
https://hepokon365.hatenablog.com/entry/2019/07/28/012617
https://github.com/docker/toolbox/issues/873#issuecomment-583378427

CPU が悪いのか tool 側が悪いのか、このバージョンからは動かない って問題があるらしい

# 解決する

> The latest version WITHOUT this bug is DockerToolbox-18.09.0.exe so I assume that the bug was introduced in DockerToolbox-18.09.1.exe and it still remains in current release.
https://github.com/docker/toolbox/issues/873#issuecomment-583378427

らしいので、入ってるものをアンインストールして、DockerToolbox-18.09.0.exe をインストールする。

(ここで [Chocolatey](https://chocolatey.org/install#installing-chocolatey) の存在を知ったので、ここからはコマンド操作)

```powershell
PS choco install -y docker-toolbox --version 18.09.0
```

shell を再起動して

```powershell
docker-machine create -d virtualbox toolbox
```

```powershell
PS docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER      ERRORS
toolbox   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.12
```

動いた！
PHPで書いたレガシーコードをテスト可能にする

## はじめに

久々にPHPの酷いコードにテストを足したのでまとめるよ。

## 患者さん事例

PHPって地の文ベタ書きで全然かけてしまう。
なので雑に書いたコードが適当なフォルダに突っ込まれていて、それをApatchが直接参照していたりするわけだ。
拡張されまくったり炎上したりで結果的にとんでもなく酷いコードが出来上がる。
そう、こんな感じに。

```php:index.php
<?php
require_once "External.php"; // global変数定義

// おもむろに追加された認証ロジック

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    // 業務ロジック
    echo "<html>";
    if (/* なんかややこしい判定 */) {
         echo "へんなとこでボディを返したり";
         if (/* if文の深淵で */){ exit; } // なんてされてたら目も当てられない
    }
    else{
         header("クレイジーなところでヘッダを返していたりする");
    }
    echo "</html>";
}
else {
    // 業務ロジック
    echo "<html>どうのこうの</html>";
}
```

テストコードを加えたいところだがこのままでは無理だ。
なので最低限の修正でテスト可能にしておこう。

## 地の文いきなり走り出す問題の対処

最悪なことに地の文は読み込まれても実行されてしまう。だからまずはそれを封じる必要がある。

```php:IndexTest.php
<?php
require_once "product code"; // ここでプロダクトコードが動いてしまう！

class IndexTest extends TestCase
{
    public function testPostWithNoParameter()
    {
        /* ここで実行したいのに！ */
    }
}
```

これはもうなんともできんのでプロダクトコードに変更を加える。

```index.php
<?php
require_once "External.php"; // global変数定義

function run($globalVarA, $globalVarB)
{
    // 元あった地の文
}

if (http_response_code() !== false) {
    run($globalVarA, $globalVarB);
}
```

末尾のIF判定のおかげでUT実行時は `run` は実行されない。
（もっといいアイデアがあればよこしやがってください）

注意したいのはグローバル変数で、それだけで死刑に相当するのだが今は粛清より修正だ。
こればっかりは埋まっているのを探し当てるしか無い。最もリスクのある部分。

これで一旦画面ポチポチしなくてもUTから `run` をけるだけでテストできるようになった。

## echo/headerの追放

コイツラはapatch側に処理を返しているデータだ。
だからUTでこの値をチェックしたい。なので `run` の返り値にしてやろうじゃないか。

```php:index.php
<?php
require_once "External.php"; // global変数定義

class HttpResponse
{
    // なんかいい感じに定義
};

function run($globalVarA, $globalVarB)
{
    $headers = [];
    $contents = [];

    // 元あった地の文
    //    header(xxx); => $headers[] .= xxx;
    //    echo xxx; => $contents .= xxx;

    return new HttpResponse($headers, $contents);
}

if (http_response_code() !== false) {
    $httpResponse = run($globalVarA, $globalVarB);
    foreach($httpResponse->headers as $header) {
        header($header);
    }
    echo $httpResponse->body();
}
```

## サーバから渡ってくる値も変えたいな

サーバから渡ってくる色んな値を想定してテストしたいよね？
だから引数で渡せるようにしよう。

```php:index.php
<?php
require_once "External.php"; // global変数定義

class HttpResponse
{
    // なんかいい感じに定義
};

function run(
    $globalVarA,
    $globalVarB,
    $requestMethod,
    $requestParameter,
    /* 他にあればどうぞ */
) {
    $headers = [];
    $contents = [];

    // 元あった地の文
    //    header(xxx); --->  $headers[] .= xxx;
    //    echo xxx; ---> $contents .= xxx;

    return new HttpResponse($headers, $contents);
}

if (http_response_code() !== false) {
    $httpResponse = run(
        $globalVarA,
        $globalVarB,
        $_SERVER['REQUEST_METHOD'],
        $_RESUEST,
        /* 他にあればどうぞ */
    );
    foreach($httpResponse->headers as $header) {
        header($header);
    }
    echo $httpResponse->body();
}
```

まぁだいたいこんな感じです。

## その他

- run関数をクラス化したかったらする（自分は関数でいいと思う）
- CookieやSessionの情報もちゃんと切り出す
ESXi 7.0 でvFRCを有効化する

## 経緯
なんかSSDをキャッシュに使えるって書いてあるじゃん！！！
設定したろ！！！

## 手順
[How to configure ESXi 6.5 vFRC using the command line](https://qiita.com/tkprof/items/7a4d89aa861179872c6c)

## 結論
ESXi 7.0 だとvFRCは廃止されてるんだってさorz
キャッシュエリアの確保はできたが、仮想マシン側の設定項目がなかった。。。
激突！フーリエ変換選手権！mathematica vs sympy vs maxima

つまりmathematica vs sympy vs maxima vsダークライということです。わかりましたか？
ぼくはわかりません(💢半ギレ

さて、それはともかくこういう事をしたいわけです(まあなんでこんな事をしたいかはさておき…)。

```math
\begin{align}
\mathcal{F} & = \int \left( \frac{\sin(k/n)}{k/n} \right)^n \cos(k r) \mathrm{d}k\\
& 0 < r < 1
\end{align}
```
ただし$n$は$n \geq 1$の整数。
で、自分の貧弱算数力じゃまともにやるのとか嫌だったから機械にやらせようと思ってsympyにやらせたかったんですが、どうにも上手く行かなかった。
最初に書いたのは(定数倍とかそのへんの細かいことはさておき)これ。

# sympy
```python
def Fourier(n):
    r = sym.symbols('r', positive = True, domain = sym.Interval(0, 1))
    k = sym.symbols('k', positive = True)
    F = sym.fourier_transform((sym.sin(k / n) / (k / n))**n, k, r)
```
これは、$n \leq 2$までなら答えを出してくれたのだが、$n \geq 3$になると正しく答えを出してくれなかった。
そんな馬鹿ななんでやねんと思いつつmaximaを試すワタクシ。

# maxima
```maxima
n: 3;
declare(r , alphabetic);
assume(r > 0);
assume(r < 1);
integrate((sin(k / n) / (k / n))^n * cos(k * r), k, -inf, inf);
```
これは、$n = 4$までは正しく動いた。
しかし、$n = 5$で何故か間違った？答えが帰ってきた。

まあ、なにかFourier変換をするという専用の関数があって、もしかするとそれを使えば正しく動くのかもしれない。
ちなみに、

```maxima
assume(r > 0);
assume(r < 1);
```
のありなしでも挙動が違って、ますます不思議であった。

# mathematica
と言ってもmathematicaは持っていないので、オンライン上で実行できるWolfram scriptを用いた。

```mathematica
n = 3
w = FourierTransform[(Sin[k/n]/(k/n))^n, k, r, FourierParameters -> {1, 1}]
```
これは正しく動いた。
さすがのmathematica様。

# 結論
mathematica様はとりあえず正しい答えを返してくれた。
この程度ならsympyでええやろと思ったんだけれど。

なにかsymyでこういう事をやるときのトリック的な事を知っている人、居たら教えて下さいお願いします何でもはしませんから！
画像処理で賢く飛ぶドローンを作りたい(1)〜ドローンのシステム構成とGCS

画像処理をして考えて飛ぶような賢い自律飛行ドローンを作りたい…
とてつもなく長い道のりの気がするが、やったことをメモしていきます。

## ドローンのシステム構成

ドローンのシステムは、NVIDIAの画像処理を使ったナビゲーションで動くロボットに関する[Redtail Projectサイト](https://github.com/NVIDIA-AI-IOT/redtail)にある[ドローンの情報](https://github.com/NVIDIA-AI-IOT/redtail/wiki/Skypad-TBS-Discovery-Setup)を参考に、ざっとこのような構成を考えた。
![drone-system.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641874/fda5f95a-c5b9-c20d-a4c4-4b77b2d089bf.gif)

フライトコントローラにはOSSで色々と公開されているPixhawkを選択。
ドローン界の巨人:DJIのものはあえて使わない。
Pixhawkは、ドローンの飛行に必要な加速度センサ、ジャイロセンサ、地磁気（方位）センサ、気圧（高度）センサを内蔵したフライトコントローラで、PX4という規格に対応したものを選ぶ。このPixhawkとその中で動くソフトウェアの関係は、ドローンのossプロジェクトの政治的な理由で非常に複雑なことになっている。詳しくは@akachochinさんが[こちら](https://qiita.com/akachochin/items/03a16038b3c20176c0a4)で詳しく解説されている。
かんたんな解説だと[こちら](http://dronejo.hatenablog.com/entry/2017/02/27/000634)。

とりあえず[PX4/autopilot](https://px4.io/)を使う方針としてすすめる。（だめとわかったら[Ardupilot](https://ardupilot.org/)にでも変える…上記NVIDIA Redtail ProjectはArdupilotのようだ…これは悩ましい。実際に画像処理をして飛ばしているという情報が公開されている例は非常に少ないので、少しでも確実なものを選ぶほうが良いのかも。）
さて、PX4の2020/07/30現在での最新安定版はV.1.10.1で、ベータ版はV.1.11.0Beta2のようだ。
[PX4のソフトウェア概要](https://px4.io/software/software-overview/)を読むと、PX4はドローンなどを自動で動かすためのオープンソースのフライトコントロールソフトウェアで、開発者がドローンアプリケーションを開発するための、標準的なハードのサポートやソフトウェアスタックを提供するのが目的だそうだ。
PX4は[Dronecode](https://www.dronecode.org/)の一部で、Linux Foundationが管理しているということで、GCSのQGroundControlや、通信規格MAVLinkとSDKもホストしているとのこと。

ということで、管制塔というか地上の管理用のPCにはGCS(Ground Control System)としておのずとQGroundControlを選択することになる。

## QGroundControlのインストール

まずはこのQGroundControlをubutu 18.04とROS melodicをインストール済みのPCに入れてみる。
Droncodeのページに[QGroundControlのダウンロードとインストールを解説したページ](https://docs.qgroundcontrol.com/en/getting_started/download_and_install.html)があるので、ubuntu linuxのところの手順に従ってやってみる。

まずシリアル通信を妨げるモデムマネージャを削除
（$USERはシェル変数でユーザー名をかえす）

```command:端末
$ sudo usermod -a -G dialout $USER
$ sudo apt-get remove modemmanager -y
```

QGroundControlが使うパッケージをインストール

```command:端末
$ sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y
```

ユーザパーミッションの変更を反映するため一度再起動。

```command:端末
$ sudo shutdown -r now
```

[QGroundControl.AppImageをダウンロード](https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGroundControl.AppImage)
適当な場所に保存して、実行権限をつける

```command:端末
$ chmod +x ./QGroundControl.AppImage
```

実行

```command:端末
$ ./QGroundControl.AppImage
```

地図が描かれたアプリケーションが立ち上がればQGCのインストールは成功。
![Screenshot from 2020-07-31 00-39-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641874/eba4d50e-a7e1-20aa-3943-78a920c0ef44.png)

## PixhawkにPX4をインストール

PixhawkにPX4をインストールするにはQGroundControl(QGC)を使う。
QGCの歯車のようなアイコン→Firmwareと選択して、USBケーブルでPCとPixhawkを接続、ウィンドウの右側にPX4かArduPilotのどちらを選ぶかがでてくるので、PX4を選択、Advanced settingsはStandard Version(stable)にしておいて、OKする。
![Screenshot from 2020-07-31 00-53-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641874/5215676b-4bab-bf5f-62e3-59909646be11.png)
書き込みが成功すると、ウィンドウ右上にPX4とアイコンが出て、音声合成が「manual flight mode」とか喋りだす。

ひとまずここまでで最初の一歩は踏み出せたか？
OAuth 2.1 の標準化が進められています

IETFのOAuth WGでは、今あるOAuth2.0関連の仕様を整理し、一つの仕様としてまとめなおし OAuth2.1 として標準化するとりくみが進められています。

今回は、簡単にOAuth2.1について紹介します。

## OAuth 2.0

OAuth 2.0は2012年10月に「[RFC6749 The OAuth 2.0 Authorization Framework](https://tools.ietf.org/html/rfc6749)」として標準化されています。その後、OAuth2.0の改善は続けられ、セキュリティ向上のために利用すべき機能(PKCE)などが追加されているほか、逆に非推奨になっている機能(Implicit Grant)などがあります。

IETFのOAuth WGではOAuth2.0を安全に利用するためのベストカレントプラクティスを「[OAuth 2.0 Security Best Current Practice](https://tools.ietf.org/html/draft-ietf-oauth-security-topics)」としてまとめています。

このような状況の中でOAuth2.1の議論が出てきます。

## OAuth 2.1

### はじまり
2019年11月に行われた IETF106では、現在のOAuth2.0の仕様は下記のようになっていると発表がありました([スライド](https://www.ietf.org/proceedings/106/slides/slides-106-oauth-sessa-oauth-21-00))。OAuth2.0を安全に扱うためには幾つかのドキュメントを参照する必要があります。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32425/58c72485-5b7a-c0aa-725e-10a68d6f9474.png">

これをOAuth2.1として下記のように整理したいというところから、議論が始まりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32425/59f7eb00-df02-8ffc-21a3-2bb69a882660.png)

ですので、OAuth2.1で新しい振る舞いを追加したり、実験や検証中の機能を追加することは目標に含まれていません。

### 状況

2020年7月30日に、RFCの草案となる「[The OAuth 2.1 Authorization Framework](https://tools.ietf.org/html/draft-ietf-oauth-v2-1-00)」が出されています。すでにWG Draftになっており、IETF OAuth WGで取り組むアイテムとなっています。

### OAuth 2.0 との差分

ドラフトの中で「[12.Differences from OAuth 2.0](https://tools.ietf.org/html/draft-ietf-oauth-v2-1-00#section-12)」として、RFC6749 OAuth2.0との差分について簡単に書かれています。

- Authorization Code grantでは「PKCE ([RFC7636](https://tools.ietf.org/html/rfc7636))」を利用する
- リダイレクトURIは厳密な文字列マッチを使用する([BCP参照](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-4.1.3))
- Implicit Grant は削除([BCP参照](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-2.1.2))
- Resource Owner Password Credentials grant は削除([BCP参照](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-2.3))
- URIのクエリ文字列でのベアラートークンの利用は削除([BCP参照](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-4.3.2))
- リフレッシュトークンは、送信者が制限されるか1回のみ使用される必要がある([BCP参照](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-4.12.2))

## 今後
まだまだ、WG Draftになったばかりなので引き続き議論が進められます。もちろん、内容についても変更が入ることでしょう。

興味のある方は、「[IETF OAuth WGのメーリングリスト](https://mailarchive.ietf.org/arch/browse/oauth/)」を追いかけると良いかと思います。
[Preface] Mastering the FreeRTOS Real Time Kernel-A Hands-On Tutorial Guildの日本語訳

# この記事について
[Mastering the FreeRTOS Real Time Kernel-A Hands-On Tutorial Guildの日本語訳](https://qiita.com/azuki_bar/items/91e12949737f460dbc11)
# Preface
## マルチタスクと小規模組み込みシステム
### 顧客価値
<font color="Red">FreeRTOSは知的財産権が曖昧さを一切含まない。商業利用に完全フリーであり、プロプライエタリのソースコード開示要求も一切ない</font>
### 用語
FreeRTOSではスレッドではなくタスクを使う。

### なぜReal-time Kernelを使うのか？
組み込みソフトにはカーネルなしのテクニックが確立されてはいるが、カーネルを使うとシンプルにできる。複雑なケースになると一層優れているが、どの程度から「Kernel有り」が良いかは、いつも議論となる。
優先度はタスクの処理デッドラインを保証することができるが、ほかにもメリットあるので以下にいくつか記載する。
#### タイミング情報の抽象化
カーネルは実行タイミングと、実行タイミングに関連したAPIを提供する。これはアプリケーションコードをシンプルに、トータルではコードサイズを小さくできる。
#### 保守性、拡張性 (Maintainalibility, Extensibility)
実行タイミングの抽象化は、モジュール間の依存を小さくすることができる。アプリケーションコードのパフォーマンスはハードウェアの影響を受けにくい。
#### モジュール性
タスクは独立したモジュールで、それぞれ目的が明確に定義される。
#### チーム開発
タスクは明確なインターフェースが定義されているので、チーム開発が容易となる。
#### テスト容易性
タスクは明確なインターフェースで独立したモジュールのため、個別にテストが可能
#### 再利用性
モジュール性と独立性によって、再利用性も高まる。
#### 効率性
カーネルはイベントドリブンでソフトを動かすので、ポーリングに比べて処理時間を無駄にしない。コードの実行は必要なときのみに行われる。
効率性とは逆になるが、タスクを切り替えるためにティック割り込みが必要になる。しかし、RTOSを使わないアプリケーションでもティック割り込みのようなものが必要になる。
#### idle time
アイドルタスクはスケジューラーによって自動的に生成されてスタートする。どのアプリケーションタスクも動いていない時はいつも動作をする。アイドルタスクは空いている実行時間の測定に使用される。またプロセッサを省電力モードにいれることもある。
#### 電力管理
RTOSを使った効率性は、プロセッサを省電力モードに入れる頻度が上がる。
電力消費はアイドルタスクが走った時に入れると、かなり改善する。FreeRTOSはtick-lessモードがあり、なかった場合に比べて省電力モードを長く維持できる。
#### 柔軟な割り込みハンドル
割り込みハンドラーはタスクを待たせることによって短さを維持できる
`"Interrupt handlers can be kept very short"は何がショートかわからなかった。文脈からレイテンシのことかなあ`
#### リアルタイム性の要求を混在できる
周期的、連続的、イベントドリブンなアプリケーション、割り込みを組み合わせて、ハードリアルタイム/ソフトリアルタイム両方の要求を実現可能。

### ライセンス
1. FreeRTOSは商業用として利用できる
2. FReeRTOSはすべての人に無料で提供される
3. FreeRTOSユーザーは知的財産所有権を保持する
4. 
詳細情報は http://www.FreeRTOS.org/license を参照。

## ソースコードとプロジェクトファイル
Windows Visual Studio環境で動くコードは http://www.freertos.org/Documentation/code にあります
`お手軽にFreeRTOSを試すにはこちらおすすめです。Visual C++入れておくとすぐ動きます`
Rails初心者がエラーを解決して学んだこと

こんにちは、Shotaです！

現在、Railsでのポートフォリオを作成するうえで、エラーに躓きまくっています。

そして色々なエラーを解決して、改めて学んだことが3つあります。


***１、エラー文の意味を知る
２、質問するときは、ただ単にどうすればよいかと聞かない
３、いったんコードから離れることも重要***


では、初心者なりに１つずつさらっと解説していきます。


**1つ目、エラー文の意味を知る**
エラー文の意味が分かれば本当に変わります。
初心者で英語ができない僕は、見たことのない英語表記のエラー文を見たら、
「なんだこれ！難しい。。。」
と感じてしまいます。しかし、英語の意味やエラー文をググることで、解決にグッと近づきます。
ポイントは、「きちんとエラーの意味を知る」ということです。
初心者によくありがちな
「エラー文を打って、似たエラーの解決策がヒットしたとき、その意味を理解しないまま真似して解決する」
というのはあまり良くないことが分かりました。


***２つ目、質問するときは、ただ「どうすればよいか」と聞かない***
私を含め、初心者の方は特にこういった質問をしてしまうことがあります。
しかし、質問をする際は、「エラー文と、どうすればよいか」だけではなく、
「現状➜質問➜試したこと」を説明した方が良いです。
そうすることで、自分が何を解決してほしいをきちんと伝わりますし、
回答する側としても気持ちよく答えることができるはずです。


***３つ目は、いったんコードから離れることも重要***
一回リフレッシュしたり、寝たりして、次の日また再開したらサクッと解決できた！
なんてことも結構あります。
また、僕みたいな初心者のうちは、
「なんかよくわかんないけど、とりあえず動いたからまぁよしとしよう」
みたいな考えも全然アリだと思います！
完璧を求めてがんばったけど、意味わからなすぎて停滞するよりは、マシだと思いますし。


以上が、エラーを解決したうえで、改めて大事だと気付いたことです。

今後もこの３つ

***１、エラー文の意味を知る
２、質問するときは、ただ単にどうすればよいかと聞かない
３、いったんコードから離れることも重要***

を意識してエラーと戦っていきます！
Swiftでパズルゲーム制作を開始した

## 動機
今まで独自のゲームを作ってばかりでしたが、全然売れなかったので、有名ゲームをパク・・参考にすることにしました。
とりあえず形から入ろうということで、ドラゴンとパズルをテーマにすることにしました。

このテーマで有名なゲームを参考にしていたのですが、「面白いか？」と単純な疑問を抱きました。
もう少し分かりやすいルールのパズルの方が良いのではと思い、別の有名ゲームを参考にしました。
ツムツムかポコパンかよく覚えていませんが、その辺りのゲームのルールが分かりやすそうだったので、パズル部分は隣接するアイテムをなぞって消すルールにしました。

## 現状
TestFlightでベータ版をテストしている状態です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">パズルゲーム制作途中。<br>ベータ版を試してもらっています。<br>TestFlightを使ってiPhoneでテストしてます。<a href="https://twitter.com/hashtag/%E3%82%B2%E3%83%BC%E3%83%A0%E5%88%B6%E4%BD%9C?src=hash&amp;ref_src=twsrc%5Etfw">#ゲーム制作</a> <a href="https://twitter.com/hashtag/IndieGameDev?src=hash&amp;ref_src=twsrc%5Etfw">#IndieGameDev</a> <a href="https://twitter.com/hashtag/%E3%83%91%E3%82%BA%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#パズル</a> <a href="https://t.co/kxb8rFVemw">pic.twitter.com/kxb8rFVemw</a></p>&mdash; 泉芳樹 #voxel (@izumi_yoshiki) <a href="https://twitter.com/izumi_yoshiki/status/1289227888680554496?ref_src=twsrc%5Etfw">July 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



## ゲームロジック
動きの処理は、１つの要素の下の要素と当たり判定をとって、当たってなければ落下する感じです。
消す処理は、同じ色の要素を選択したら消える。同じ番号の要素を選択したら消える。同じ形の要素を選択したら消える。という感じです。


下記は同色の要素がなぞられたかを判断しています。

``` swift
        var i: Int = -1
        var count1: Int = 0
        for e in elements {
            if e.select {
                if i != -1 {
                    if i == e.colorNumber {
                        e.delete = true
                        e.deleteY = e.shape?.position.y
                        count1 += 1
                    } else {
                        count1 = -1
                        break
                    }
                }
                i = e.colorNumber!
            }
        }

        if count1 >= 1 {
            for e in elements {
                if e.select {
                    if i == e.colorNumber{
                        e.delete = true
                        e.deleteY = e.shape?.position.y
                        break
                    }
                }
            }
        
            for e in elements {
                if e.delete {
                    initElement(e: e)
                }
            }
        }
        if count1 > 0 {
            addPoint(p: count1)
        }

```



## まとめ
ソースは [GitHub](https://github.com/minmin0530/dragon_puzzle) にアップしています。
Gitで急いで戻したいならmerge --no-ffを使う

git merge --no-ff のメリットを伝えるのに

* 実案件のログは使いづらいので
* 年齢の commit graph を作ったら
* うまく伝わりました

## --no-ff のログです

* 幼児期おわりはどこですか？
    * 幼児期おわりは ab4ec9c ですね
* git merge --no-ff で明示的に commit が発生しているから
    * 戻りやすいです

```
*   0b5c1f7 Merge branch 'youchien' 小学校入学
|\
| * 97e32e8 (youchien) 6歳
| * 0d14f30 5歳
| * c6e411e 4歳
|/
*   ab4ec9c Merge branch 'youjiki' 幼児期おわり
|\
| * 4c9ea5b (youjiki) 3歳
| * 5cc59f5 2歳
| * f8eeb21 1歳
|/
* cb68c3f 0歳
```

## もし --ff だったら

* 線が分かれていないので
* すっごい迷いますよね？

```
* 716457a (HEAD -> master, youchien2) 6歳
* 6d0f305 5歳
* 25960d4 4歳
* becc580 (youjiki2) 3歳
* 39229cf 2歳
* d8cd3cc 1歳
* cb68c3f 0歳
```

## どういう状況？

実は今日、本番公開だったのですが、わずか数分後に元に戻して欲しいと連絡があり、後輩があたふたしていたので**fast-foward**について話しました。**頻繁に巻き戻しが発生する**私の用途では**--no-ffの見通しのよさ**にメリットを感じていますと。うまく伝わったみたいで嬉しかったです。

##参考
後輩にきちんと教えるために用語は下記を参考にしました。

* [git merge オプションの --ff, --no-ff, --ff-only の違い](https://yu8mada.com/2018/08/15/the-difference-between-the-git-merge-options-ff-no-ff-and-ff-only/)
* [fast-forward とは](https://qiita.com/shoichi0599/items/0bbaef4e224201f9c30f)
* [non fast-forward とは](https://backlog.com/ja/git-tutorial/stepup/04/)

##追記

毎回 commit graph を作成するのが大変だったので、スクリプト化しました。
[年齢の commit graph 作成スクリプト（git merge --no-ff の説明用）](https://qiita.com/mrk461/items/e6b6ac6614656a355016) をご確認ください。
【javascript】Canvasを使ってみる

#準備

```html
<canvas id="sample">
```
##コンテキストオブジェクトを取得
```javascript
let canvas = document.getElementById('sample');
let context = canvas.getContext('2d');
```

getContextの第1引数に何を渡すかでコンテキストオブジェクトの種類が決まる。

|渡す値|説明|
|---|---|
|2d|2次元グラフィックスの描画に使用|
|webgl、webgl2|3次元グラフィックスの描画に使用|

#図形を書く
##長方形

長方形の関数

|種類|説明|
|---|---|
|**fillRect**(x,y,width,height)|長方形(色付き)|
|**strokeRect**(x,y,width,height)|長方形(枠線のみ)|
|**clearRect**(x,y,width,height)|指定された領域を消去し、完全な透明にする|

```javascript:例
//左から40上から60の位置に縦50横50の正方形を描く
context.fillRect(40,60,50,50);
```



#参考
- [HTML上に図形を描ける！Canvas要素の使い方【基本編】](https://www.genius-web.co.jp/blog/web-programming/draw-graphic-on-htmlusing-the-canvas-elements-basic-story.html)
[rails]resourcesでルーティングを設定する方法

#resourcesでルーティングを設定する
ルーティングは、個別に設定も可能です。
ただし、railsでの基本的な7つのアクションは開発の際によく使われるので、
そのたびに設定するのは効率的とはいえません。
こんなときは、resourcesメソッドを利用すると、ルーティングを1行書くだけで自動設定されます。

```
Rails.application.routes.draw do
  resources :blogs
end
```

rails routesコマンドで確認。

```
$ rails routes
```

全てのurlが設定されていることを確認。

```
$ rails routes
                   Prefix Verb   URI Pattern                                                                              Controller#Action
                    blogs GET    /blogs(.:format)                                                                         blogs#index
                          POST   /blogs(.:format)                                                                         blogs#create
                 new_blog GET    /blogs/new(.:format)                                                                     blogs#new
                edit_blog GET    /blogs/:id/edit(.:format)                                                                blogs#edit
                     blog GET    /blogs/:id(.:format)                                                                     blogs#show
                          PATCH  /blogs/:id(.:format)                                                                     blogs#update
                          PUT    /blogs/:id(.:format)                                                                     blogs#update
                          DELETE /blogs/:id(.:format)                                                                     blogs#destroy
       rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

```
【2020.8最新】Pythonのインストール法

#はじめに
ご覧いただきありがとうございます。先日MacBook Pro16インチを購入しPythonを再インストールしました。
今回インストールの仕方調べていたところ、zsh使用者向けのものが少ないように感じたのでインストール法をここに残します。
※Catalinaを使用している方はシェルがデフォルトでzshになっています。zshが何かわからなくてもインストールに問題はありません。


#手順
今回の手順は以下の通りです。
1. Homebrewのインストール
2. pyenvのインストール
3. Pythonのインストール

#1. Homebrewのインストール
ターミナルに以下を打ち込んでください。

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

ターミナルの開き方からわからない方、不安な方は[こちらの記事](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)を参考にしてください。とてもわかりやすいです。
書きながら思ったのですが、Homebrewはbashに入っているんですかね？なぜzshで動いているのかが謎です。
分かる方がいたら教えてください。

#2. pyenvのインストール
###pyenvをインストールする理由
正直、HomebrewのみでPythonはインストールできます。
Mac使用者で、Pythonをインストールする方はPython3を使用するためだと思うのですが、最近のMacにはPython2だけでなくPython3も標準で入っています。
pyenvをインストールする理由は**pythonのバージョンの切り替えが簡単だから**です。

###インストール
Homebrewを使用しpyenvをインストールします。
ターミナルに以下を打ち込んでください。

```
brew install pyenv
```

###パスを通す
はじめにでも少し触れましたが、他の記事ではここでbash_profileに書き込むと記述しているものが多いです。
Catalinaからデフォルトのシェルがzshになっているのでbash_profileに書き込んでも基本読み込むことができません。
以下を1行ずつターミナルに打ち込んでください。

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc　
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```


####※デフォルトのシェルがbashかzshかわからない場合
```echo $SHELL ```でデフォルトのシェルを確認できます。

```
echo $SHELL 
　/bin/zsh             // →zsh
　/bin/bash            // →bash
```
#3. Pythonのインストール
###インストール前のPythonのバージョン確認
インストールする前に現在のPythonのバージョンを確認しておきましょう。

```
python --version　もしくは　python -V 
　=> Python 2.7.16
```

###インストール

今回は2020年8月1日時点で最新の3.8.5をインストールします。

```
pyenv install 3.8.5
```

以下を行うことででインストールできるバージョンを確認することができます。

```
pyenv install --list
```
###バージョンの切り替え
Pythonのバージョンの指定をします。```3.8.5```の部分は先ほどインストールしたものを記入してください。

```
pyenv global 3.8.5
```
Pythonのバージョンをもう一度確認してみてください。先ほどとは違う結果になるはずです。

```
python --version　もしくは python -V 
　=>Python 3.8.5
```

#最後に
Pythonは様々なインストール方法があり、多くの記事を参考にすると逆につまづく可能性がある気がします。
これからPythonをはじめる方のお力になれると幸いです。
わかりにくい箇所や間違えているところがあればコメントなどでお知らせください。
最後までお読みいただきありがとうございました。
【Auth0】IDトークンにカスタムクレームを追加する

# はじめに
Auth0のIDトークンには独自のカスタムクレームを追加することができます。
本記事ではRulesのテンプレートを使ってIDトークンに国名とタイムゾーンを追加してみます。

# Rulesの作成

Auth0の管理画面の`Rules`メニューを開き、`CREATE RULES`ボタンを押して新しいRulesを作成します

![スクリーンショット 2020-07-30 18.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/134c43dc-f564-0150-90d3-07b8eb898324.png)

表示されるRulesのテンプレートの一覧から「Add country to the user profile」を見つけてクリックします。
すると、以下のRulesが作成されます。

```javascript
function addCountry(user, context, callback) {
  if (context.request.geoip) {
    context.idToken['https://example.com/country'] = context.request.geoip.country_name;
    context.idToken['https://example.com/timezone'] = context.request.geoip.time_zone;
  }

  callback(null, user, context);
}
```

これだけでIDトークンのペイロードにカスタムクレームとして国名とタイムゾーンが追加されるようになります。

# IDトークンのペイロード

このRuleが有効になっている状態でログインをします。
取得したIDトークンをデコードしてペイロードを見ると国名とタイムゾーンが追加されていることがわかります。

```json
{
  "https://example.com/country": "Japan",
  "https://example.com/timezone": "Asia/Tokyo",
  "nickname": ".........",
  "name": "........@......",
  "picture": "https://s.gravatar.com/avatar/..............",
  "updated_at": "2020-07-31T11:23:50.341Z",
  "email": "........@......",
  "email_verified": true,
  "iss": "https://......../",
  "sub": "auth0|5eaf03.........",
  "aud": "kj9l3LstiFo................",
  "iat": 1596283831,
  "exp": 1596319831,
  "auth_time": 1596283830,
  "nonce": "dej3nKuIL5i......."
}
```

# カスタムクレームのKey名の制限

IDトークンのカスタムクレームのKey-ValueのうちKey名はURL形式でないといけません。
URL形式以外の名前にすると、そのカスタムクレームは読み捨てられてIDトークンに反映されません。
Valueの方は特に制限がないので文字列や数字やオブジェクトなどを自由に設定可能です。

# おわりに
Rules内で取得できる値であればなんでもIDトークンにカスタムクレームとして追加することができます。
IDトークンにカスタムクレームを追加するとアプリケーションはIDトークンをデコードするだけでその値を取得することができるのでとても便利だと思います。
WSL2+Dockerを導入してみた

# はじめに
今回はWindowsHomeにWSL2+Docker環境をつくったのでまとめてみます

# 環境
|  |  |
|---|---|
|OS |Windows10 Home|
|version|2004|
|ビルド|19041|
# WSL2の導入の前に...
WSL2の導入には前提条件があります
まず、Windows10のversionが2004になっていることと、Virtual Boxを使用していないことです
Virtual Boxが入ってる場合、WSL2をインストールすると起動しません!!
余談ですが、VMwareは最新のバージョンにすると使えます
# WSL2導入
この内容は[ここ](https://qiita.com/tomokei5634/items/27504849bb4353d8fef8)にわかりやすくかかれてますので、省略します
[WSL2導入｜WinアップデートからWSL2を既定にするまでのスクショ](https://qiita.com/tomokei5634/items/27504849bb4353d8fef8)

# docker導入
OSのインストールも無事終わりDockerHubをただインストールするのみです

ここまでは簡単にいくのですがここでまさかの事件です!!
# WSL2+Docker導入PCのプチ事故
Zoom + VMwareを起動するとVMwareで起動したOSの画面がフラッシュするのです

原因は簡単です

Vmmemと呼ばれるプロセスがメモリをChrome並みに食べるのです....

microsoft/WSLのIssueは１年近くOpenのままとなっており、Microsoft側も問題を認識して取り組んでいるものの未だに根本対処されていません。
https://github.com/microsoft/WSL/issues/4166

さぁ、このままだとちょっとまずいのでVmmemの消費量を食い止めましょう!!

# Vmmemの消費量を食い止める
暫定対処でメモリサイズを固定することにしました....(というよりほかの方法がない気がする...)
WSL2のメモリサイズを固定することでWindowsホストのメモリ枯渇を防ぎます。
原因について興味がある人は後述しているのでそちらを参照してください。

%USERPROFILE%\.wslconfigのコンフィグに以下の設定を行います。

+ %USERPROFILE%はC:\Users\taroのようなホームディレクトリを指します。
+ コンフィグが存在しない場合は作成してください。
+ 設定した後は必ずOSを再起動してください。

```
[wsl2]
memory=4GB
```

memoryで使用メモリを固定しています
私的には4GBでも十分動かせます
ここはPCのメモリ量と相談してください....

# Vmmemが大量消費する条件

+ Visual Studio Code + Remote Extension(WSL)を使用してる
+ Docker Desktop WSL2を使用してる
+ 大きなコードベースで開発してる

# 参考URL
[WSL2によるホストのメモリ枯渇を防ぐための暫定対処](https://qiita.com/yoichiwo7/items/e3e13b6fe2f32c4c6120)
[WSL2導入｜WinアップデートからWSL2を既定にするまでのスクショ](https://qiita.com/tomokei5634/items/27504849bb4353d8fef8)
Oculus Quest の初期設定とコントローラー操作方法

購入編の続き、操作方法書きます。
今回は「Oculus Quest」の紹介になります。
# 安全に使用する為には
先ず最初に周りの環境を確認する必要があります。
Oculusヘッドセット使う時、周りが見えない為、
周囲は危険物、貴重な物などをないように確認し、一定なスーベース取りましょう。

ちなみに、ゲームによって手を大幅動いたり、一定な距離歩く場合があるので、
足元は物置かないようにしましょう。

なお、壁を充分注意しましょう。
今のOculus Touch(コントローラー)のデザインだと、手は直接物や壁にぶつかる事はないですが、
コントローラー壊れたら同じく大変ですから、環境をちゃんと整理しましょう。

Oculus使う時、ガーディアンの境界線を設定する必要があります。
境界線出たら、ネットが表示(ヒントになる)しますが、
それはほぼもう出た時間で表示するので、移動が早い場合は間に合わない可能性がありますので、
境界線を実際のスーベースよに、小さいように設置するのがおすすめです。
# 初期設定
「Oculus」使うためには、OculusのAppをインストールする必要があります。
![image_2020_07_31T08_42_10_835Z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/21e98692-1a6b-4625-37b2-1158b87dfaf7.png)
ます、App起動し、アカウントを登録しましょう。
Facebookアカウント持っているなら便利です。
アカウントをお作る場合は、アカウント情報入力しメールアドレス認証すれば完成です。
![image_2020_07_31T08_52_56_534Z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/05be00f3-3f8d-5ba5-ee6a-b7ab9721c5ad.png)
インストール後、ヘットセット選択しOculus起動、ブルートゥースONにして、
ヘットセット装着し、数字を確認し、App内で入力します。

続いて、WIFIを接続し、コントローラーにバッテリーいれ、
言語選択すれば、支払い方法の設定が出ます(後で設定可能)、終わったら完成です。

その後、「Oculus Questを安全に利用するために」の説明が出ます。
これは、必ずちゃんと見てください。
# コントローラー基礎操作
コントローラーの操作方法に関しては、
ゲームによって変化するので、詳しく説明する必要がないですが、

2点覚えれば問題ないです。
![_08_00_792Z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/012da29e-017d-13d1-84a2-a8e3b15a28d5.png)
①メニューボタン
Oculus起動後、コントローラー見つかる必要があります。メニューボタン押せばいいです。
なお、ゲーム途中で押すど、一時停止し、メニューを表示するようになります。
(ゲーム再開するとこも出来ます。)

② = 確定ボタンで考えればいいです。
メニュー選択する時よく使います。
(ゲーム中では機能が変更する時もあります。)

他のボダンは、Oculus使い途中で慣れればいいです。

では…
How to install Docker-Desktop in Windows 10 Pro : Dockerをインストールする

Windows 10 にDockerを導入した過程を残しておきます。

##作業環境
- OS：Windows 10 Pro ver.2004

##基本的な手順
公式ドキュメントに従ってインストールしていきます。
https://docs.docker.com/docker-for-windows/wsl/
**※基本的にPowerShell は管理者権限で実行してください**

##事前準備
###1. Install Windows 10, version 2004 or higher.
Windows をVersion 2004　以上にアップデートします。
###2. Enable WSL 2 feature on Windows.
WSL 2を有効化します。
ここのステップは下記のMicrosoft の公式ドキュメントを参考にしますが、一部違う手順があるので注意してください。

- Install the Windows Subsystem for Linux
PowerShell を管理者権限で起動して、下記のコマンドを実行して、Windows 用のLinux をインストールします。

```
$ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

- Install your Linux distribution of choice
下記のコマンドをPowerShellで実行します。

```
$ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

コマンドが終了してからPCを再起動すると、WSL をインストールしてWSL 2 にアップデートされます。
次に以下のコマンドを実行してWSL 2 をデフォルトの設定に変更しておきます。

```
$ wsl --set-default-version 2
```

- Set up a new distribution
[Microsoft Store](https://aka.ms/wslstore) からお好みのLinux のディストリビューションをインストールします。
私はマニュアル通りに`Ubuntu` を選びました。

###3.Download and install the Linux kernel update package.
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
上記のページからWSL2 カーネルのアップデートをダウンロードして実行します。

####CPU の仮想化を有効にします。
ここでかなり時間を浪費しました。
BIOSメニューをデフォルト表示戻すと仮想化のメニューが表示されてうまくいきました。

####各種機能を有効化する
`コントロールパネル` → `プログラムと機能` → `Windows の機能の有効化または無効化` を開き下記のメニューにチェックを入れます。

- Linux 用Windows サブシステム
- Hyper-V
- 仮想マシン プラットフォーム

####Set your distribution version to WSL 1 or WSL 2
下記のコマンドをPowerShell で実行します。`Ubuntu` 以外をインストールしている場合はコマンドは変わるので注意してください。

```
$ wsl --set-version Ubuntu 2
```

##Dockerのインストール
あとは下記よりインストーラーをダウンロードして実行すればOKです。
https://hub.docker.com/editions/community/docker-ce-desktop-windows/

お疲れさまでした。
Railsのバリデーションの種類と使い方

#プログラミングの勉強日記
2020年8月1日　Progate Lv.226

#バリデーションとは
　不正なデータがデータベースに保存されないようにデータをチェックするシステムを<font color=orange>バリデーション</font>という。バリデーションに引っかかった場合(不正なデータの場合)にはデータベースに保存されない。

#基本的な書き方
　モデルクラスに`validates`メソッドを指定することで、バリデーションをかけることができる。（バリデーションはモデルで設定する。）このときに、validatesを用いてカルム名と内容を指定する。

```ruby:model/ファイル名.rb
validates :カラム名(シンボルで指定),検証ルール（こちらもシンボルで指定）
```

#バリデーションの種類

##空ではい(空のデータを登録できないようにする)
　{presence: true}を用いることでそのカラムの値が存在するかどうかをチェックできる。

```ruby:models/posts.rb
class Post < ApplicationRecord
  validates :content, {presence: true}
end
```

##boolean属性が空でないこと

```ruby:models/users.rb
class User < ApplicationRecord
  validates :birthplace, inclusion: { in: [true, false] }
end
```

##チェックボックス

```ruby:models/users.rb
class User < ApplicationRecord
  validates :gender, {acceptance: true}
end
```

##文字数の指定
　`length`を用いて`{maximum:数値}`を指定することで最大文字数を`{minimum:数値}`で最小文字列を指定することができる。また`in`を使うことで範囲やその文字数のみのバリデーションをかけることもできる。


```ruby:models/posts.rb
class Post < ApplicationRecord
  # 最大140文字(140文字以下)
  validates :content, {length : {maximum:140} }

  # 50文字以上
  validates :content, {length : {minimum:50} }

  # 1文字以上75文字以下
  validates :content, {length: {in: 1..75} }

  # 5文字のみ
  validates :content, {length: {is: 5} }
end
```

##数値の指定
　数値のみの入力を許可するときには、`numericality`を使う。

```ruby:models/actorrb
class Actor < ApplicationRecord
    validates :height, {numericality: true}
end
```
　`numericality`は様々なオプションがあるので、これらを用いることでより詳細なバリデーションをかけることができる。

|オプション|概要|
|:---:|:---:|
|only_integer|integerのみ|
|equal_to|指定された値と等しいか|
|greater_than_or_equal_to |指定された値以上|
|less_than_or_equal_to|指定された値以下|
|greater_than|指定された値よりも大きいか|
|less_than|指定された値よりも小さいか|
|odd|trueに設定した場合、奇数か|
|even|trueに設定した場合、偶数か|

```ruby:models/actor.rb
class Actor < ApplicationRecord
  # 50より大きく250より小さい
  validates :height, numericality: {greater_than: 50,less_than: 250}
end
```

##任意で指定した値が含まれているかどうか
 指定した値が含まれているか確認するときは`inclusion`を使う。

```ruby:models/actor.rb
class Actor < ApplicationRecord
 validates :blood_type, inclusion: {in: ['A','B','O','AB']}
end
```

　指定した値が含まれていないか確認するときは`exclusion`を使う。

```ruby:models/actor.rb
class Actor < ApplicationRecord
 validates :gender, exclusion: {in: ['male','female']}
end
```

##値の重複
　値の重複がないかをチェックするための`{uniqueness: true}`というバリデーションもある。

```ruby:models/posts.rb
class Post < ApplicationRecord
  validates :content, {uniqueness: true}
end
```
　

#おまけ

##複数のバリデーションの指定

　バリデーションの内容はハッシュになっているので、コンマで区切ることで複数指定できる。

```ruby:models/posts.rb
class Post < ApplicationRecord
  validates :content, {presence: true, length : {maximum:140}}
end
```

##自分で決めたエラーメッセージを表示する

　`message`を追加することで自分で指定したエラーメッセージを表示させることもできる。

```ruby:models/actor.rb
class Actor < ApplicationRecord
  validates :height, numericality: {greater_than: 50,less_than: 250, message: " : Please input 50~250"}
end
```
ミドルウェアとは

#ミドルウェアとは

- OSとアプリケーションの中間に位置し、両方を補助するプログラムのこと。

- 主に３種類のミドルウェアがある。

**1. Webサーバー**

**2. APサーバー**

**3. DBMS**

######※使用するOSによってどのミドルウェアを使うかは限定される。


#Webサーバーの種類
| 種類      |特徴     |
|:-----------------|:------------------|
|Apache              |無償。WindowsとLinusで利用可 |
|nginx            |有償でサポートあり             |
|IIS             |Windowsに標準装備              |


#APサーバーの種類
| 種類      |特徴     |
|:-----------------|:------------------|
|Tomcat        | 無償、WindowsとLinusで利用可             |
| Jboss        | 有償、WindowsとLinusで利用可            |
| IIS       |Windowsに標準装備              |


#DBMSの種類
| 種類      |特徴     |
|:-----------------|:------------------|
|  Oracle            |高機能、高額、WindowsとLinusで利用可             |
|MySQL、PostgreSQL、SQLite|シンプルな機能、無償、WindowsとLinusで利用可|
|  SQL Server           |高機能、高価、Windowsで利用可              |
UiPath Terminalアクティビティについて　(第2話)

##前回のあらすじ

Terminalアクティビティについて(自分なりに)解説した筆者ですが、まだまだ分かりにくいところもあるわけです！
今回はTerminalアクティビティをどうやって使用するのかワクワク？しながら見ていきましょう。

###注意
今回の内容は2020年6月に開催されたUiPathFriends内でご紹介したものの一部です。
重複はしますが復習の意味を込めてご覧いただけると幸いです。



##Terminalアクティビティを使用しましょう。

TerminalアクティビティはExcelアクティビティやMailアクティビティのように標準搭載ではありません。
なので、専用パッケージのインストールをしましょう。
※今回使用するUiPathはCommunityEdition(Studio Pro)、バージョンは2020.4.3です。


**1.画面上部のメニューバー→[ManagePackages]を押下**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/6d584d7e-06e8-c64d-b425-ca0adcd136d0.png)


**2.「UiPath.Terminal.Activities」を探して[Install]を押下→[Save]でインストール**
この時、「Official」を選択したうえで検索バーに「Terminal」と選択してからのほうが公式版が見つかりやすいです。
(「All Packages」で探すと見つけるまでに時間がかかりますので、公式版のアクティビティパッケージを探したいときは「Official」を選択したうえで探してみましょう)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/42dafc85-b616-44c0-b2db-62ffce99c8a0.png)

**3.インストール完了**
Available内にあればOKです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4bd819c8-b204-08ee-1aed-10e8b3ef60e1.png)





##Terminalアクティビティの使い方
それでは使い方を説明します。


###その1：Terminal Session
UiPathでは、Excelを使うときには「Excel Application Scope」、Webサイトは「Attach Browser」のようにそのアクティビティの傘下にいないと使用できないですよね？
(「Read Cell」等一部アクティビティはExcel Application Scopeを使わなくても使えるものはあるものの、PythonやWordのアクティビティはScope内でないと使用できません)
Terminal系のアクティビティも同様にTerminalSessionという"器"の中で動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/262dc294-52ce-9d07-c551-130fa1d1d8c2.png)

Provider：使用するオフコンの種類を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/80de8d30-d49b-cc10-0cfe-59e26b0c79d9.png)

今回は「AS400」を使用する想定なので、「IBM Personal Communications」を選択します。
(他は使用したことがありません。。。ので皆さんでやってみてくださいね)

Attachmate Extra：MicroFocus社が展開するエミュレータ
https://www.attachmate.com/products/extra/microfocus-xtreme.html
Rocket BlueZone：これもエミュレータ
https://www.rocketsoftware.com/ja/products/rocket-bluezonepassport-terminal-emulator/rocket-bluezone-terminal-emulation
IBM Personal Communications：IBM向けはこれを使用すればよさそう
https://www.ibm.com/jp-ja/marketplace/personal-communications/details
Reflection for UNIX：使用した実績なし
Reflection for IBM：使用した実績なし
※Reflection系...はよく知らないので誰か教えてください(泣)
IBMEHLLAPI：使用した実績なし
UiPath Internal：使用した実績なし


「IBM Personal Communications」を選択後は、オフコンのファイルの保管場所を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/150f39e9-f282-c44b-4d0e-9f035756f9c4.png)

拡張子はプロファイル「.ws」になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/5c999bbc-faf3-4dc8-7f7f-0d7f98bcdb16.png)

指定して開くと本来は「Configure...」の部分は指定したオフコンのファイル名が出てくる(はず)です。
(下図はファイル名を指定していないのですっからかんの状態です。。。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a6f6e033-9185-ca6a-8849-e638a01adaf2.png)


この後「Do」のシーケンス部分に各種Terminalアクティビティを実装していきます。

##次回予告
よく使うTerminalアクティビティとその使い方(つづき)をご紹介します！
(近日投稿予定！)

多分8月以降になっちゃいます。。。
自分オリジナルのGitHubプロフィールを作る

# はじめに
最近GithubのプロフィールにREADMEを置けるようになりました。[**GitHub Readme Stats を利用してGitHubプロフィールをカッコよくする**](https://qiita.com/zizi4n5/items/f8076cb25bbf64a9bc1c)のように素晴らしい物も登場しているのですが、私は人と被ったりするのがあまり好きではないので自分で作ってみようと思います。

# 完成品
インパクト絶大ですね
![scroll face](https://scroll-face.vercel.app/scroll-face.html)

ちなみにリポジトリは以下になります。<a href="https://github.com/DuGlaser/scroll-face">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274275/3af0d7d1-d645-eb60-2141-863fb7310b0d.png" >
</a>

# 構成
```
.
├── README.md
├── index.js
├── package.json
├── vercel.json
├── views
│   └── scroll-face.html
└── yarn.lock
```

まずviewsディレクトリの中に配信したいsvgを入れます。
基本的にはsvgにアニメーションなどを付けて配信していく形になります。

```html:scroll-face.html
<svg>
  <style>
    ...
  </style>
  ...
</svg>
```

今回は特にbodyやheadなどはいらないと思います。
次にこれを配信するためのserverのコードを書いていきます。

```js:index.js
const express = require('express');
const app = express();

app.use('/', express.static(__dirname + '/views'));
express.static.mime.define({ 'image/svg+xml': ['html'] });

app.get('/', (req, res) => {
  res.end('scroll-face');
});

app.listen(8080);
```

やっていることは単純でviewsディレクトリ以下のファイルを配信しています。
ここで肝になってくるところはここです。

```js
express.static.mime.define({ 'image/svg+xml': ['html'] });
```

こうすることで実際にmarkdown上でsvgが表示されるようになります。

ここではとても簡単なことしかやっていませんがもっとカスタマイズしたい方は[**github-readme-stats**](https://github.com/anuraghazra/github-readme-stats)を読むと色々と参考になると思います。

# デプロイ
今回はvercelを使ってデプロイしていきます。
まずはプロジェクトのルートに以下のようなvercel.jsonを配置します。

```json:vercel.json
{
  "builds": [
    {
      "src": "index.js",
      "use": "@now/node-server"
    }
  ],

  "routes": [
    {
      "src": "/.*",
      "dest": "/index.js"
    }
  ]
}
```

こうすることでindex.jsが実行されます。
次に[**vercel**](https://vercel.com/import)にアクセスしてgithubなどからimportします。
今回は特に設定をいじらずにDeployを押せば完了します。
![ss](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274275/eb3be72b-9150-dd8c-fdc1-fbe604739314.png)

# 最後に
何か間違っているところなどがありましたらコメントお願いします。
特にvercelを初めて使ったので設定周りで不備があれば言っていただけると嬉しいです
【Laravel】名前付きルートを設定して、ルート定義をもっと便利にしよう

Laravelのルートインスタンスには、nameメソッドという「定義したルートに名前をつける」便利なものがあります。
ルートインスタンスに、このnameメソッドをチェーンするだけなので気軽に使用できます。

```php:routes/web.php
Route::get('user/profile', function () {
    //
})->name('profile');
```
上記の例ではルートに「profile」という名前が付いています。
このように名前が付けられることによって、
特定のルートへのURLを作成できたり、
または、リダイレクト時にルート定義で付けた名前を指定することが可能になります。

もちろん、コールバックがクロージャではなく、コントローラアクションの場合でも名前付きルートが設定できます。

```php:routes/web.php
Route::get('user/profile', 'UserProfileController@show')->name('profile');
```

こちらも、「profile」という名前が付きました
こんな感じで、名前付きルートを設定してみましょう。