OmniAICreator/Qiita-1.07M huggingface dataset:
UiPath v19.10LTS→v20.10LTSのメリットとは？(ロボット実行者編)

# はじめに

みなさん、こんにちわ！

v19.10LTS→v20.4FTS→20.10LTS→v21.4FTSでリリースされていますが、LTSをターゲットにバージョンアップする企業が多いのではないでしょうか。そこでv19.10LTS→20.10LTSバージョンアップしたら、どんなメリットがあるのか、本記事ではAttended Robotユーザーを対象にダイジェストでご紹介します！

###免責事項
本記事は、ダイジェスト版です。v20.4FTSからの変更点も含まれ、元となった資料の頁数が膨大になったため、ここでは主だった新機能・変更点に絞り、説明（設定方法、制限事項など）も、かなり削減して掲載しています。

# バージョンアップのメリット要約と必要性
- バージョンアップの一番のメリットは何と言ってもピクチャインピクチャの製品版リリースですね。ロボットトレイもAssistantになり、ピクチャインピクチャの活用も合わせて、ユーザーとロボットの協働が可能です。

- Automation Cloud Orchestratorをご利用の場合、既に(21.4リリース以降)、19.10 Robotはサポートされなくなり、クラウドOrchestratorサービスでの動作が保証されなくなってます。

https://docs.uipath.com/installation-and-upgrade/lang-ja/v2020.10/docs

# 1.ロボット実行中でもPC操作ができる！
ロボット実行中は、PC操作が出来ない。時間がもったいないと言ったことはないでしょうか。ロボット実行中でもPC操作を続行できますので、本当の意味でロボットがアシスタントとなり、作業を分担してやってくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/9fd22664-afa7-0bb7-951c-e2e9d865a9fc.png)

https://docs.uipath.com/robot/lang-ja/v2020.10/docs/picture-in-picture

# 2.アシスタントでサインイン！OC接続がシンプル！
マシンキーを使用することなく、 Orchestratorに登録されたユーザー情報を使ってサインイン接続できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/6c7d2303-cbaa-fd58-3202-71516f8b05fc.png)

https://docs.uipath.com/robot/lang-ja/v2020.10/docs/setting-up-interactive-sign-in

https://docs.uipath.com/robot/lang-ja/v2020.10/docs/interactive-sign-in

# 3.ロボットトレイが新しくなりアシスタントに！
単なるプロセスを実行するだけのトレイでしたが、ロボット利用者のアシスタントとしての役割になってきました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/caa49540-f48a-2508-3d21-20905754efe9.png)

※v20.10からロボットトレイのアップデートは実施されません。2021.4からサポート対象外となるので注意！

https://docs.uipath.com/robot/lang-ja/v2020.10/docs/uipath-assistant

# 4.実行する時刻になったら知らせてくれる！
設定した時刻になったら、アシスタントがロボット実行を知らせてくれます！勝手には実行されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/8a31e031-b841-a817-7c48-11c939830dcd.png)

# 5.Assistantからプロセスの引数値設定が可能！
プロセスに引き渡す値を、利用者ごとに、クイックに変更したいケースはないでしょうか。
アシスタントにプロセス実行時の引数の値を保存しておくことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/ff21428b-a150-bf3f-2649-217e9fb8f8dc.png)

# おわりに
開発者、ロボット実行者、Orchestrator有無で、それぞれの利用者が見やすい様に３部構成にしています。
本記事が参考(LGMT)になるなら、また次の2021.10LTSがリリースされた後に同様の観点で記事にしようかなと思います！

https://qiita.com/Jun96427231/private/8baaab1a9e49652c8333

https://qiita.com/Jun96427231/private/ff7b40ca1186156bc496

https://qiita.com/Jun96427231/private/a6d57cb4d1b74cc94e0f

尚、バージョンアップの方法は下記のガイドをご参考に！

https://www.uipath.com/ja/resources/knowledge-base/uipath-version-up-guide
React入門 - Part7 - mockサーバを利用してみる

# 目次

# mockサーバとは

外部APIにRESTアクセスし、結果を使用しフロント側のみ実装のテストをする場合などに使用します。
私が参加したプロジェクトだと、フロントのReactの実装が完了しAPIイベント部分の単体テストは、mockサーバで行っていました。
（実際のAPIへの接続は結合テスト段階で行っていました。）

# mockサーバを試してみよう

[ここを参考にしました。](https://qiita.com/Neufo/items/93c3642b1ca636ca55bd)
「リクエストを投げてみる」までやればOKです。

**手順はこれだけですね。**
1. VSCodeにSwagger Editor拡張をインストール
2. prism-cli.exeをダウンロードしておく
3. sample.ymlをコピペで作成しておく
4. ./prism-cli.exe mock sample.ymlで起動
5. 画面で確認

1.2.は参考URLを見て準備してください。

3.のサンプルymlです。※UTF8で保存してください。

```yaml
openapi: '3.0.2'
info:
  title: API Title
  version: '1.0'
servers:
  - url: https://api.server.test/v1
paths:
  /test:
    get:
      responses:
        '200':
          description: OK
```

5.表示画面はこのようになります。
データがないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/ae6f4878-29e1-41fa-5712-55ea40fe9fb5.png)



# 取得データを表示してみよう

sample.ymlを拡張して、以下のようにします。
（yamlの書き方は、ググれば沢山でてきますのでここでは割愛します。）

```yaml
openapi: '3.0.2'
info:
  title: API Title
  version: '1.0'
servers:
  - url: https://api.server.test/v1
paths:
  /test:
    get:
      responses:
        '200':
          description: OK
          content:
            application/json: # レスポンスの形式指定
              schema: 
                type: array
                items:
                  $ref: '#/components/schemas/User' # 参照するモデル
                example: # サンプルデータ
                  - id: 1
                    name: John Doe
                  - id: 2
                    name: Jane Doe
components:
  schemas: # スキーマオブジェクトの定義
    User: # モデル名
      type: object # 型
      required: # 必須フィールド
        - id
      properties:
        id: # プロパティ名
          type: integer # 型 
          format: int64 # フォーマット(int32, int64等)
        name:
          type: string
    Product:
      type: object
      required:
        - id
        - price
      properties:
        id:
          type: integer
          format: int64
          example: 1
        name:
          type: string
          example: Laptop
        price:
          type: integer
          example: 1200                    
```

データが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/d5505630-34f9-bd94-b526-e44aeed5976a.png)
JS~要素の書き換え~

#概要
DOM取得した後の、要素の中身操作についての記事です。
JSでは、イベント発生（ユーザーがクリックしたとき）などに処理が始まります。
今回はクリックイベントから要素の書き換えを行う操作についの記事です。

実装内容は以下のようになります。
1,クリックイベント
2,要素の書き換え
３,classの追加

#イベント
Webページでは、ユーザーが操作したときにイベントが発生します。また、イベント発生時の処理をJSで登録することができます。
またそれらのユーザーからのイベントを関数で登録します。

```main.js
window.addEventListener(イベント名,コールバック関数)
```

#要素の取得

#HTML

クリックイベントはボタンにしました。
クリックイベント発生後に、ul要素の中身に色がつくように実装します。


```index.html
<button>ボタン</button>
<ul id="task">
  <li>リスト</li>
  <li>リスト</li>
  <li>リスト</li>
</ul>

```

#JS

最初に、クリックイベントに登録するbuttonというタグ名を取得します。
定数button（わかりやすいように）にquerySelectorでタグ名を代入。
console.logで取得しているか確認しました。

次に、取得したbuttonをクリックイベントに登録します。
クリックイベント時に、li要素を書き換えたいのでli要素を取得します。

ボタンをクリックして、li要素が取得されているか確認してみてください。

```main.js
const button = document.querySelector('button');
console.log(button);
  
button.addEventListener('click',() =>{
  const li = document.querySelectorAll('li');
  console.log(li);
});
```

#書き換え

ボタンを押したときにli要素が書き換わるように実装しました.
forEachで繰り返し、innerHTMLで書き換えました。

```index.js
button.addEventListener('click',() =>{
  const li = document.querySelectorAll('li');
  console.log(li);
  // li[2].innerHTML = 'abcd';
  li.forEach(list =>{
    list.textContent = 'OK!!';
  });
});
```

書き換えプロパティにはいくつか種類があるにで、使用目的で使い分ける必要があります。

https://developer.mozilla.org/ja/docs/Web/API/Node/textContent

#class属性の操作

1,classList.add();

次に、class属性の操作していきます。
クリックしたときに、文字色が赤になるように実装していきます。

```main.js
const button = document.querySelector('button');
console.log(button);
button.addEventListener('click',() =>{
 const li = document.querySelectorAll('li');
 console.log(li);
 // li[2].classList.add('list');
 li.forEach(list =>{
   list.textContent = 'OK!!';
   list.classList.add('list');//class属性
  });
});
```
クリックしたときにJS側からクラス属性を付けます。なお、CSS側でスタイルを設定します。

```style.css
.list {
  color: red;
 }
```

2,classList.toggle

クラス属性の付け外しを行います。

```index.html
<li class="lis">リスト</li>
<li class="lis">リスト</li>
<li class="lis">リスト</li>
```

```style.css
.lis {
  color: yellow;
}
```

```main.js
list.classList.toggle('list');
```

先程のclassList.addを書き換えると、listクラスのつけ外しをすることができます。
備忘録！Windows Home でも簡単にDocker環境を作る

今や開発では欠かせないDockerについて、この記事で簡単に解説します。
基本をひととおり学んだ後に、実際にWinsows Homeで環境開発を構築していきます。

以前はDockerをWindows HomeではHyper-Vが使えずでDocker Toolboxが主な選択でしたが、WSL2、Hyper-V対応と進みDocker Desktopが使えるようになりました。

今ではHomeでも簡単にDockerを導入できます。
__<font color="red">Dockerは開発者なら必ず全員知っておくべき内容です</font>__

##開発環境
* OS : Windows 10 Home
* Docker Desktop for Windows 3.0.0

##Dockerとは？
「コンテナ型」の仮想化サービスを提供しています。
非常に軽量なコンテナ型の実行環境です。

Dockerについて詳しくは別記事で解説します

##Dockerのメリット
* 開発が効率的になり早くなる

##インストール手順

#### 1.Docker Desktopをインストールする

[Docker Desktop Installer ダウンロード](https://www.docker.com/product/docker-desktop)

上記よりダウンロードしたDocker Desktop Installer.exeを実行します
※チェックはデフォルトのままでOK

インストールの終了後に再起動します

#### 2. WSL2 インストール追加作業
上記の手順でWindowsを再起動すると「WSL 2 installation is incomplete.」という次のダイアログが表示されます。
WSL2のインストールで追加の作業が必要です。

1.  ダイアログをそのままにしてリンクを開きます。
![2021-05-03 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647214/e3493e5e-9e0b-2813-e61b-d51a7c6fb9f1.png)

1. リンク先から[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ]をダウンロードして実行します

![2021-05-03 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647214/aae78995-d20d-9b2b-34d7-5c02866e077c.png)

#### 3. Dockerを再起動して完了
ダイアログのRestartをクリックしてください。
特に問題がなければこれでインストール作業は完了です。
### エラー時の確認
下記によりDockerの起動時にエラーがでるので注意してください

* BIOSの仮想化機能が有効になっていない場合
* "レガシーコンソールモード(従来のコンソール)"にチェックがはいっている場合

##Dockerをはじめて体験してみる
###hello-worldコンテナを実行します
docker runコマンドでイメージを取得、コンテナの実行をしてみましょう。

```:powershell
>docker run hello-world
```
現在のイメージとコンテナを表示して確認してみます。
hello-worldイメージが確認できるはずです

```:powershell
>docker images
```

起動中のコンテナを確認します
何も入っていないでしょう
（hello-worldコンテナはメッセージ出力後に終了します)

```:powershell
>docker ps
```

オプションに-aをつけることで停止中のコンテナが表示されます。

```:powershell
>docker ps -a
```
コンテナを削除します

```:powershell
>docker rm [コンテナID]
```
つづいてイメージを削除します

```:powershell
>docker  [イメージ名]
```

これでhello-worldのチュートリアルを完了します
Django REST Framework 関連性のないモデルを同時に登録したい

## 例: 本モデルと国モデルを同時に登録したい

```models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)

class Country(models.Model):
    name = models.CharField(max_length=100)
```

## serializers.Serializerを使う
単一モデルを登録する時にはserializers.ModelSerializerを使うが、関連性のないモデルを同時に登録する際は自分で設定を自由にできるserializers.Serializerを使う

```serializers.py
from rest_framework import serializers

class UnrelatedModelsSerializer(serializers.Seralizer):
    title = serializers.CharField(max_length=100)
    name = serializers.CharField(max_length=100)
```

```views.py
from rest_framework import generics, status
from .serializers import UnrelatedModelsSerializer

class CreateUnrelatedModelsView(generics.CreateAPIView):
    serializer_class = UnrelatedModelsSerializer
    
    # postメソッドをオーバーライドし、その中で関連性のないモデルのレコードを同時に作成する
    def post(self, request):
        serializer = self.get_serializer(data=request.data)
        
        # serializers.Serializerを使用している場合は自動的にバリデーションを行わないので、
        # 明示的にis_validメソッドを実行する
        if serializer.is_valid():
            # ポイント
            book = Book.objects.create(
                title = serializer.validated_data["title"]
            )
            country = Country.objects.create(
                name = serializer.validated_data["name"]
            
            return Response(status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
```

### 注意
バリデーションを通ったデータを上記viewではserializer.validated_dataから取り出していますが、**入力がblank, またはnullを許容している場合**、それらの値はserializerでチェックされないのでis_validを実行後serializer.validated_dataから取り出せません。そのような場合はrequest.dataから取り出します。
WSLにTerraformインストール

## 概要

- WSLにTerraformをインストールする方法のメモ
- homebrewでtfenvをインストール
- tfenvでterraformをインストール

## 環境

Windows Subsystem For Linux (Ubuntu 18.04LTS)

## インストール方法

```bash
# まずはお決まりのやつ
$ sudo apt update
$ sudo apt upgrade

# homebrewをインストール
$ sudo apt install linuxbrew-wrapper

# homebrewのセットアップ
$ echo 'umask 002' >> ~./bashrc
$ echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >> ~/.bashrc
$ echo 'export PATH="/home/linuxbrew/.linuxbrew/sbin:$PATH"' >> ~/.bashrc

# ここでいったんターミナルを再起動
$ sudo mkdir -P /home/linuxbrew/.linuxbrew/var/homebrew/linked
$ sudo chown -R ($whoami) /home/linuxbrew/.linuxbrew/var/homebrew/linked

# homebrewの動作確認
$ brew doctor

# tfenv インストール
$ brew install tfenv

# Terraform インストール
$ tfenv list-remote
$ tfenv install 0.14.8
$ tfenv use 0.14.8
$ terraform -v
Terraform v0.14.8
# 成功！
```
Reactとの連携（４）


```rb
rails g model data name:text mail:text
```

dataの複数形で単数形はdatumです。

モデルを用意してバリデーションを設定します。
内容はnameが空でないこととメールがからでないこと

```rb:
class Datum < ApplicationRecord
  validates :name, presence: true
  validates :mail, presence: true
end
```
テーブル設定してマイグレーションします。

```2021050293420_create_data.rb
class CreateData < ActiveRecord::Migration[6.0]
  def change
    create_table :data do |t|
      t.text :name
      t.text :mail

      t.timestamps
    end
  end
end
```

ダミーデータを３件ほど入力します。

```rb:db/seed.rb
Datum.create(id:1, name:'Taro', mail:'taro@yamada')
Datum.create(id:2, name:'Hanako', mail:'hanako@flower')
Datum.create(id:3, name:'Sachiko', mail:'sachiko@happy')
```

```rb:terminal
rails db:seed
```

実行します。

```rb:terminal
rails g controller data index ajax
```
コントローラを作ります。

```rb:app/controllers/data_controller.rb
class DataController < ApplicationController
  def index
  end

  def ajax
    if params[:name] then
      data = Datum.where 'name like ?', "%" + params[:name] + '%'
    else
      data = Datum.all
    end
    render plain:data.to_json
  end
end
```
jsonデータとしてとり出してrender plainでテキストとして送信します。
【AWS】セキュリティグループについて。no.8

![AWS (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5865e3fe-525a-443e-e6bf-b1862ce45feb.png)


こんにちは、まゆみです。

AWSについての記事をシリーズで書いています。

今回は第8回目になります。


前回、前々回の記事では、AWSの主要なサービスの概要を書かせていただきました。

今回の記事から、そのサービスの詳細について書いていきます。

今回の記事では、<font color="Red">AWSのセキュリティグループについて</font>書いていきますね。

ではさっそくはじめていきます

#AWSセキュリティグループとは？

![EC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/335b776d-329d-6a13-f229-cf848719b4b8.png)


AWSのセキュリティグループとは、EC2においてファイアーウォールとして働くもののことです。

ファイアーウォール(防火壁)とは文字通り、

『どのようなアクセスを許可するのか？』

のアクセスコントロールになります


#外からと内からのアクセスコントロール

![EC2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/cfe4cb91-cd67-996f-ec2d-e493610269b3.png)


セキュリティグループはさらに

>外からインスタンスに向かうアクセスコントロールと

>インスタンスから外に向かうアクセスコントロール

に分かれます

デフォルト値では、

>インバウンドは全てのアクセスが拒否され

>アウトバウンドは全てのアクセスが許可

されます

#セキュリティグループを設置するときのルール

では、セキュリティグループにはどんなルールがあるのか見ていきます


<ul>
<li>一つのセキュリティグループを複数のインスタンスに設置する事ができる</li>
<li>セキュリティグループは特定のリージョン/VPCのなかで作られる</li>
<li>セキュリティグループはEC2の外に作られる</li>
</ul>

セキュリティグループは特定のリージョン/VPCのなかに作られ、そこにとどまるので、リージョンを変更したら新たにセキュリティグループを作らないといけません。


#AWSのセキュリティグループは実際どうなってるの？

では、実際にコンソールでセキュリティグループがどのように表示されているのか見てみましょう

EC2のインスタンスの詳細を見るため、指定したいインスタンスのボックスにレ点を付けます。

セキュリティグループのIDと、インバウンドルールとアウトバウンドルールが記載されているのが分かります

![2021-05-03_11-17-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d3a1146d-e28d-32c0-8614-38ab45d904b8.png)

インバウンドルールとアウトバウンドルールを開きます


![2021-05-03_11-25-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0357808b-2938-2808-8bb4-46e631767e11.png)


もしくは、セキュリティーグループID(セキュリティーグループと書かれた下の青い英数字の羅列部分)をクリックして、下記のページにアクセスしてみることもできます。
![2021-05-03_11-32-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9df11180-2d10-8f17-9e99-cf105c8cfabd.png)

インバウンドルールとアウトバウンドルールのタブを押すと、それぞれのルールを見ることができます

![2021-05-03_11-35-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/02e6040c-1da3-ca58-07b0-3321b0ecbc70.png)

##インバウンドルールを編集すると。。。

今の時点で、インバウンドルールに付与された、『http』からのアクセスに関するルールを取り外すとどうなるか見てみましょう

ちゃんと、インスタンスにアクセスできているが。。。
![2021-05-03_11-41-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5f400548-87cb-710a-570e-f0f289b4447a.png)


インバウンドルールを編集をクリックして、ルールを編集します

![2021-05-03_11-42-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f5e8ddf3-7451-d10d-02b6-5592a5923328.png)

HTTP関連のルールを削除！
![2021-05-03_11-44-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7c98f909-fbfb-1fac-5d16-af5cd1fc7d69.png)

先ほどインスタンスにアクセスしたものを再ロードすると、アクセスできなくなりました。


![2021-05-03_11-49-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/b9c19c92-c833-5450-9b52-52b7c49ca0b5.png)


実験が済んだら、もとに戻しておきましょう。(笑)

ルールを追加をクリックして、インバウンドルールを編集して、変更を保存します


![2021-05-03_11-54-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e817a5b5-b8c1-5c54-3446-92cbc9090f4e.png)


#まとめ
今回の記事では、具体的にセキュリティグループがどのように働くか例を出しながら書かせていただきました。


お役に立てれば幸いです。
listの使い方

#競プロでのlistの使い方

某競プロの初心者用の問題で各桁の和を出すというものがあった。
各桁の和というものがピンとこなくて？？？状態であったが、解説によると例えば[14]の場合だと[ 1 + 4 ]となり、[2]の場合だと[ 0 + 2 ]のようにみるらしい。
問題はここからで、[14]のような整数を与えられた場合、pythonでどうやって[ 1 + 4 ]のように分けるのか全く想像が付かなかったが、pythonのlistを使って無理やり分けることができるので紹介したい。

**解説**

```python:Python
list('14') #リストの中に文字列の14を入れる
print(list('14')) #printで出力する
['1', '4']  #このように出力される
#よって各桁の和を表現したいときは以下の記述でできます
i = 14
print(sum(list(map(int, list(str(i))))))
5 #各桁の和、つまり[ 1 + 4 ]を出力してくれている
```
#感想

listをこのように使えるとは知らなかったので、非常に勉強になりました。
SSL/TLSの理解が曖昧な方向けの記事

#はじめに
SSL化がどうのこうのという話を現場の同僚としたのですが、会話についていけず焦ったので学び直すことにしました。
**SSL/TLSについてあまり詳しくない初心者の方向けの記事になっています。**

#SSL/TLSとは
SSL(Secure Sockets Layer)/TLS(Transport Layer Security)とは、インターネット上で通信を暗号化する技術です。
SSLとTLSは表記が異なるだけで同じ機能を指しており、SSLは3.0までバージョンアップを重ねた後、TLS 1.0という名称に変更されました。

**SSL/TLSの一番重要な役割は通信の暗号化による盗聴の防止です。**
共通鍵暗号方式によってデータを暗号化してサーバとクライアントがデータをやりとりします。

また、**SSL/TLSは改ざんとなりすましの防止においても重要な役割を果たします。**
認証局がサーバ証明書をドメインの所有者に発行して、サーバから改ざんやなりすましのないデータが送られることを認証します(ドメイン認証)。

#公開鍵暗号基盤(PKI)によるドメイン認証
SSL/TLSのドメイン認証は、公開鍵暗号方式と認証局で構成された公開鍵暗号基盤(Public Key Infrastructure = PKI)によって行われます。

まずはサーバ側でサーバ証明書を認証局に発行してもらう必要があります。
手順は以下のようになります。

1. サーバ内で秘密鍵とペアになるCSR(公開鍵)をつくる
2. サーバ証明書の発行申請のため認証局へCSRを送る
3. 認証局でCSRを秘密鍵で署名しサーバ証明書をつくる
4. 申請者(サーバ)へサーバ証明書を送る

![スクリーンショット 2021-05-03 9.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/aa1a1373-b632-24f9-49ed-356f84f81419.png)

#共通鍵暗号方式によるデータやり取り
ドメイン認証はPKIで行いますが、Webサイトとのやりとりには共通鍵暗号方式が使われます。

**公開鍵暗号方式で安全に暗号化通信を行おうとすると、鍵長(RSAで2048ビット以上)が長くなり、鍵長が長くなると復号に時間と負荷がかかってパフォーマンスが悪くなってしまいます。**
そのため、HTMLファイルなどのやりとりをする際には、サーバとクライアントで共通の鍵を使って暗号化と復号を行います。
暗号化のアルゴリズムはAESがメジャーで、鍵長は128~256ビットのものがよく使われます。

暗号化通信の流れと使用する暗号化のアルゴリズムは以下のようになります。

1. クライアントがサーバにSSL/TLS通信をリクエスト
2. サーバがクライアントにサーバ証明書(公開鍵)、中間CA証明書(公開鍵)、暗号スイート(暗号方式の設定)などを送信
3. 公開鍵暗号基盤を用いてクライアント内でドメイン認証 → RSA, ECDSA
4. 鍵交換用のアルゴリズムを使って共通鍵の素を交換しお互いに共通鍵を生成 → DHE, ECDHE
5. サーバが共通鍵で暗号化したデータを送信 → AES, ChaCha20
6. クライアントが暗号化されたデータを共通鍵で復号

https://www.iij.ad.jp/dev/report/iir/031/03_03.html

##「3. 公開鍵暗号基盤を用いてクライアント内でドメイン認証」の補足
クライアントにおけるドメイン認証の流れについては以下のようになります。

1. サーバから取得したサーバ証明書(公開鍵)が中間CA証明書(秘密鍵)で署名されていることを中間CA証明書(公開鍵)で検証
2. 中間CA証明書がクライアント(PC, スマホ)内のルート証明書で署名されていることを検証
3. 認証局へサーバ証明書の有効性を確認(実施方法はブラウザに依存)
4. サーバ証明書記載のドメインと通信先のドメインが一致していればドメイン認証完了(有効性を確認)

![スクリーンショット 2021-05-14 7.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/65fa7086-cfff-4aeb-d50b-f116dffe14b4.png)

#SSL証明書の種類
暗号化通信の流れの中に、サーバ証明書と中間CA証明書というものがでてきましたが、これらはSSL証明書に含まれます。
Webサイトで利用するSSL証明書には、他にもルート証明書といったものがあります。

##ルート証明書
ルート証明書はPCやスマホなどのクライアントにインストールされた状態で存在しています。
ルート証明書は他者の署名はされておらず、厳格な審査を経たルート認証局によって発行される自己署名の証明書となります。

##中間CA証明書
ルート証明書の秘密鍵は秘匿性が高く、オンラインでアクセスできるところにはおけません。
そのため、サーバ証明書の発行時に利用するのは現実的ではありません。

そこでルート証明書の署名で発行された中間CA証明書を利用します。
中間CA証明書のおかげで、ルート認証局から認定を受けた企業がSSL証明書を発行できるようになります。

##サーバ証明書
サーバ証明書は中間CA証明書で署名される証明書です。
ルート証明書と結びつきはありませんが、中間CA証明書がルート証明書によって発行されているので、**結果的にサーバ証明書もルート証明書から信頼されていることになります。**

この信頼の連鎖をトラストチェーン、信頼の起点となるルート証明書をトラストアンカーと呼びます。
中間CA証明書の設定し忘れなどをしてしまうと、トラストチェーンが崩れてドメイン認証は失敗してしまいます。

それぞれのSSL証明書の性質を理解した上でクライアント内のドメイン認証の過程を整理すると以下のようになります。

1. サーバから取得したサーバ証明書(公開鍵)が中間CA証明書(秘密鍵)で署名されていることを中間CA証明書(公開鍵)で検証
2. 中間CA証明書(公開鍵)がクライアント(PC, スマホ)内のルート証明書により署名されていることを検証
3. 認証局へサーバ証明書の有効性を確認
4. サーバ証明書記載のドメインと通信先ドメインが一致し、有効性が確認される

#おわりに
応用情報の試験勉強で学んだときよりもSSL/TLSに関する理解が深まりました。

#参考資料

https://www.geotrust.co.jp/ssl_guideline/ssl_beginners/

https://gihyo.jp/magazine/SD/archive/2021/202104
Android＋Kotlin null安全が崩れるパターン

v1がnullの場合、`Integer.parseInt(null)`になる。

```kotlin
var v1: String? = getVal()
val v2 = v1.let { // [1]
    Integer.parseInt(it) // [2]itはnon nullであって欲しい
} ?: run{
    return // ここには決して処理は来ない
}
```
java側の定義が↓こうで、引数のStringにアノテーションが無いからだと思う。

```java
public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
}
```

kotlinとしては完全に正しい、`Integer.parseInt`の引数はアノテーションがないからnullの可能性もある だから[2]のitはString?で問題ない。というロジックだろう。

letの前に`?`を付けてもコンパイルは成立する。
nullableかどうかはkotlinの最重要ポイントなのに、`?`が有っても無くてもどっちでも意味が通るのが違和感ある。
個人的には、こういう場合は以下のコードに強制して欲しいけどそういうlintあるかな

```kotlin
var v1: String? = getVal()
val v2 = v1?.let {
    Integer.parseInt(it)
} ?: run{
    return // 今回、こっちは実行される可能性ある
}
```

というお話でした
rails日本語化

# このドキュメントの目的

rails全体を日本語化する

下記はdeviseのみ

deviseを日本語化する
https://qiita.com/you8/items/921e0dd1210eb0d158df

# デフォルトの言語を日本語化

https://qiita.com/tai_tai_work/items/3af41931958456a73211

```ruby:config/initializers/locale.rb
Rails.application.config.i18n.default_locale = :ja
```

# 多言語ファイルの導入

```ruby:Gemfile
gem 'rails-i18n'
```

# modelなどの日本語化

```ruby:config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```

上記の記述でファイルで分けた場合に読み込まれるようにする

https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5#4-configlocales%E4%BB%A5%E4%B8%8B%E3%81%AB%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%85%8D%E7%BD%AE

ファイル構造は上記
Eclipse 動的Webプロジェクトのフォルダ変更

Eclipse 2021-03以降、動的Webプロジェクトを新規作成する際の初期フォルダが変更されているようです。

https://www.eclipse.org/webtools/releases/3.21/NewAndNoteworthy/#Modernized%20default%20paths

Javaのフォルダは「src」が 「src/main/java」 に
HTMLなどを置く「WebContent」は「src/main/webapp」に

なお、このフォルダは新規作成時のWizardで「次へ」を押した画面で変更できます。
書籍によっては「WebContent」を前提に説明されていることも多いので、「src/main/webapp」だけ「WebContent」に変えておいた方が分かりやすいかもしれません。

###追記
既に「src/main/webapp」で作成した場合の「WebContent」への変更方法

1. プロジェクトを右クリックし、[新規]-[フォルダ]で WebContentフォルダを作成
2. プロジェクトを右クリックし、プロパティを表示
3. 「デプロイメント・アセンブリー」を選択
4. /src/main/webapp を選択し、「除去」を押す
5. 「追加」を押し、「フォルダ」を選び、「次へ」を押し、「WebContent」を選び「完了」を押す
6. 「適用して閉じる」を押す
vue-slick-carouselでautoplayをリセットする

# vue-slick-carouselとは？
[Vueのカルーセルライブラリ](https://codesandbox.io/s/vueslickcarousel-autoplay-15qjq)です。
autoplayの設定をすると、一定のタイミングで自動で送ることができます。
※ 現在このライブラリーの開発は止まっていそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147946/4204d498-ca8a-4904-cbd4-5bc8d775a2f2.png)


# やりたいこと
autoplayを設定すると、一定のタイミングで自動で送ることができるようになります。また、矢印をクリックすることで手動でスライドを進めたり戻したりもできます。この自動送りと、手動送りは独立して動いているため、手動で戻してもすぐ次に送られてしまう問題が発生します。
これを防ぐのが今回の目的。

# 完成形

[完成形](https://codesandbox.io/s/vueslickcarousel-autoplay-15qjq)
Components/Carousel.vueが今回のことを実装しているファイル。

# Vue-slick-carouselでどうやって自動送り(autoplay)にするの？
vue-slick-carouselのタグには設定を引数として渡せて、そこにautoplayを追加してあげれば自動送りになります。

```vuejs
<template>
 ...
 <VueSlickCarousel v-bind="setting">
 ...
</template>
<script>
...
export default {
 ...
  data() {
    return {
      setting: {
        autoplay: true,       // <--ここ
        autoplaySpeed: 1000,
        ...
      },
    };
  },
 ...
</script>
```

# 今回の対応
スライドにフォーカスを合わせると（スライドを選択すると）、autoplayのタイマーをリセットするオプションがあり、今回はこれを利用します。下記手順で進めます。
<b>1. フォーカスするとリセットするオプションをTrue</b>
<b>2. クリックしたらスライドにフォーカスしたような処理をする</b>

#### 1. フォーカスするとリセットするオプションをTrue
```vuejs
      setting: {
        autoplay: true,
        autoplaySpeed: 1000,
        pauseOnFocus: true,   // <--ここをTrue
        ...
      },
```
settingに `pauseOnFocus`にtrueで設定するとスライドにフォーカスされるとautoplayのタイマーがリセットされます。正確には、タイマーのリセットだけでなく、一時的にautoplayが停止されます。

#### 2. クリックしたらスライドにフォーカスしたような処理をする
マウントしたタイミングでクリックイベントを登録します。
elementsのfocus()でスライドにフォーカスさせます。

```vuejs
  mounted() {
    const elements = document.getElementsByClassName("slick-arrow");
    Array.from(elements).forEach((element) => {
      element.addEventListener("click", function (e) {
        const sliderElement = document.getElementsByClassName("slick-slide");
        if (sliderElement.length > 0) {
          sliderElement[0].focus();
          sliderElement[0].blur();
        }
      });
    });
  },

```

今回、下記コードで複数枚あるスライド全ての情報が取得されます（１、２、３と表示されているスライド情報）。

```
const sliderElement = document.getElementsByClassName("slick-slide");
```
vue-slick-carouselの `pauseOnFocus`オプションでは <b>いずれか</b>のスライドにフォーカスされるとリセット処理が発動するので、今回は矢印をクリックされるとスライド[0]にフォーカスされるようにしました。

# おわりに
実際には、[完成形](https://codesandbox.io/s/vueslickcarousel-autoplay-15qjq)を見て確認してみてください。
pi picoでmicropython その23

#概要

picoでmicropythonやってみた。
手動で、逆アセンブラしてみる。

#バイナリー


```
e101
e100

```

#逆アセンブル

```
.program test
    set pins 1 [1]
    set pins 0 [1]

```

以上。
【Ruby】chromedriverのバージョンエラー（seleniumでスクレイピング）

また同じことをやる日が来る予感しかないので、備忘録的にメモ

※ 環境はmacで、catalina(バージョン10.15.7)です

## 経緯

いつものようにスクレイピングをしようとすると、chromedriverのバージョンが違うというエラー

```bash
session not created: This version of ChromeDriver only supports Chrome version 88 (Selenium::WebDriver::Error::SessionNotCreatedError)
Current browser version is 90.0.4430.93 with binary path /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
```

上記のエラーだとバージョンが88しかサポートしてないのに、現在は90のバージョンを使っているのでできませんと怒られています

なので90のバージョンを拾ってくる必要がある



## 欲しいバージョンをダウンロード

https://chromedriver.chromium.org/downloads

↑このサイトからzipファイルをダウンロードしてきます

`90.0.4430.24`みたいに細かいバージョンが書いてますが、たぶん先頭のバージョンが合ってれば問題ないはず

解凍したファイルをそのまま使おうとすると以下のようなwarningが出て使えない可能性があるので、Controlキーを押しながらアプリケーションアイコンをクリックして、ショートカットメニューから「開く」を選択すればOK

![スクリーンショット 2021-05-02 10.26.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/6210bc58-1cfa-0d31-0893-c4c2d1aab9e8.png)

warning解消の詳細は[こちら](https://support.apple.com/ja-jp/guide/mac-help/mh40616/mac)

アプリを開くとターミナルが立ち上がると思いますが、とりあえずそのまま閉じてOKです


## chromedriverの保存場所確認

```bash
$ which chromedriver
# => /usr/local/bin/chromedriver
```
特に変な設定してなければ上記のように`/usr/local/bin/chromedriver`にあるはず


## ファイルを移動
ダウンロード直下にファイルがあれば下記のコマンドで移動しておきましょう

```bash
$ mv ~/Downloads/chromedriver /usr/local/bin/
```

これで通常通り動くはず

## 参考
ほぼ同じ内容ですが下記の記事を参考にしました
https://qiita.com/iHacat/items/9c5c186f0d146bc98784
$router.push()でqueryを変更したときに反映されない場合

ちょっとハマったのでメモ。
VueのRouterは変更を完全一致でチェックしているそうです。

例えば以下のようにソート条件を加えて新しいクエリストリングに変更してURLを変える場合。

```js
sort() {
  const query = this.$route.query
  query.sort = this.sort
  this.$router.push({ path: '/search', query })
},
```

これだと反映されません。
なぜかとしうとシャローコピーで `this.$route.query` と `query` が同じ値になるからです。

これを回避するには

```js
sort() {
  const query = Object.assign({}, this.$route.query)
  query.sort = this.sort
  this.$router.push({ path: '/search', query })
},
```

してやると動きます。
【Vue × Firestore】ユーザーが投稿した記事のみをマイページに表示させる


#ユーザーが投稿した記事のみをマイページに表示させる



```html:mypage.vue
<h3 class="post-list flex">{{ profileData.name }} さんの投稿一覧</h3>
        <div class="profile-posts">
        <List v-for="(list, index) in listData" :index="index" :list="list :key="list.id"/>
        </div>
```

```javascript:mypage.vue
  created() {

    firebase
      .firestore()
      .collection("posts")
      .where("uid", "==", this.$route.params.uid)
      //uidをフィルタリングして現在のURLと合致するもののみを参照
      .get()
      .then(snapshot => {
        //"posts"(参照先)のスナップショットを得る
        snapshot.forEach(doc => {
          //上記で得たデータをforEachでドキュメントの数だけ"doc"データに格納
          this.listData.push(doc.data());
          console.log(doc.data());
          //更にlistDataの空箱に格納した"doc"データを格納
        });
      });
  },
```

キーワードは.where()を使うということです。

公式サイト：[クエリ演算子](https://cloud.google.com/firestore/docs/query-data/queries?hl=ja#query_operators)

```javascript:mypage.vue
.where("uid", "==", this.$route.params.uid)
```

.where()を使わずに.doc()取得をしようとしても.doc()の結果は単一のドキュメントになります。
その為、表示すらされません。

```javascript:mypage.vue
.doc(this.$route.params.uid)
```

where()メソッドは、フィルタリングするフィールド("uid")、比較演算子("==")、値("this.$route.params.uid")の 3 つのパラメータを受け入れます。

フィルタリングをして決まったものだけを取得する時は.where()メソッドを使用しましょう。
（備忘録）AWSではじめるLinux入門ガイドのデモ(管理者コマンド、インストールコマンドなど)

# 1. はじめに
2021年5月2日に[ヤマムギ](https://yamamugi.connpass.com/)様主催にて開催された[ヤマムギ vol.16 AWSではじめるLinux入門ガイドのデモ(管理者コマンド、インストールコマンドなど)](https://yamamugi.connpass.com/event/211608/)でのAWS学習内容について、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学んだ内容

- EC2インスタンスの作成
- EC2への接続方法3つ（ssh、セッションマネージャー、EC2インスタンスコネクト）
- 管理者コマンド
- インストールコマンドなど

# 3. 学習サイト
- [YouTube：AWSでLinuxサーバーを起動するデモ(「AWSではじめるLinux入門ガイド」のデモ)](https://youtu.be/aOJ6UgpryAc)
- [YouTube：Linuxでインストールを管理するデモ(「AWSではじめるLinux入門ガイド」のデモ)](https://youtu.be/HQzA9aJ05dU)
- [YouTube：Linux管理者権限でコマンドを実行するデモ(「AWSではじめるLinux入門ガイド」のデモ)](https://youtu.be/bdxPE6b-E_k)

# 4. 参考サイト
- [AWS IP アドレスの範囲](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html)
- ip-ranges.json

```
{
    ip_prefix: "18.206.107.24/29",
    region: "us-east-1",
    service: "EC2_INSTANCE_CONNECT",
    network_border_group: "us-east-1"
},
```

# 5. ハンズオンで得た豆知識
- sshでEC2へ接続する場合は、接続元IPアドレスを許可（セキュリティグループ設定：ssh、22番ポート、IPアドレス）をおこなう必要あり
- セッションマネージャーでEC2へ接続する場合は、事前にIAMロールを作成しSSM(SSMManagedInstanceCore)が利用できる権限付与が必要、設定後はEC2を再起動し設定反映をおこなうとよい
- EC2インスタンスコネクトでEC2へ接続する場合は、AWSバージニアのIPアドレスを調べて、AWSバージニアのIPアドレスを接続元IPとしてアドレスを許可（セキュリティグループ設定：ssh、22番ポート、AWS北部バージニアが使っているIPアドレス（EC2_INSTANCE_CONNECT））をおこなう必要あり

# 6. おわりに
AWS学習の参考になれば幸いです。
ハンズオン開催してくださいました[ヤマムギ](https://yamamugi.connpass.com/)様、感謝いたします。

2021/05/02 NISHIZONO Takahiro
オープンソースの自動運転 OpenPilot - PC simulatorで動かす

オープンソースの自動運転OS「Autoware」がありますが、シンプルなオープンソースの自動運転 OpenPilotを学習としてPC simulatorで動かしたいと思います。

# オープンソースのOpenPilot
2015年9月、Hotz氏は自動車に自動運転機能支援システム「OpenPilot」を開発した。しかし、最初のバージョンは、カリフォルニア州自動車局からの認可を受けず、免許なしで自動運転車をテストしたと非難された。

その後、OpenPilotは「Comma One」と呼ばれるデバイスにパッケージ化された。Comma Oneは米国連邦自動車安全基準に違反と指摘される。結局、当局からの圧力を受け、Comma Oneの開発は断念し、GitHub上でOpenPilotはオープンソース化された。

https://github.com/commaai/openpilot

# OpenPilotのバージョン
## Eon Devkit
Comma.aiは以前、フロントガラスに取り付ける型の改良版OnePlusスマートフォンである「Eon Devkit」を販売していた。599ドルからの価格で、OpenPilotがインストールされるとCANネットワークトラフィックを分析することで自動車モデルが自動認識される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/79a3a06c-d1f2-8c45-6d08-66148e6d9ecb.png)

## Comma Two
Comma TwoはEon Devkitの機能をアップデート、路上カメラ・CAN・GPS・慣性測定ユニット・磁力計・温度センサー・オペレーティングシステムの情報を基に、Comma.aiの​​サーバーに運転データをリアルタイムでアップロードする。値段は1,000ドルから、[今すぐに購入可能だ](https://comma.ai/)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/2f39bfe3-83af-3e9c-b032-a802ae1a7239.png)

<iframe width="560" height="315" src="https://www.youtube.com/embed/Vr6NgrB-zHw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# OpenPilotのインストール
## System Requirements
OpenPilot simulatorは、[CARLA](http://carla.org/)を使用しています。CARLAをスムーズに稼働には、NVIDIAグラフィックスカードが必要です。

- Nvidia Driversのインストール

推奨した（recommended）ドライバをインストールします。

```
ubuntu-drivers devices
...
driver   : nvidia-driver-450 - distro non-free recommended
...

sudo apt install nvidia-driver-450
sudo reboot
```

- Dockerのインストール

```
sudo apt install curl

curl https://get.docker.com | sh \
&& sudo systemctl start docker \
&& sudo systemctl enable docker
```

- openpilotとcarlaのインストール

```
sudo apt install git
git clone https://github.com/commaai/openpilot.git
cd openpilot/tools/sim
./install_carla.sh
```

# simulatorの起動

- ドライバをインストール、carlaを起動

```
cd openpilot/tools/sim
sudo ./start_carla.sh
```

- openpilotの起動

```
cd openpilot/tools/sim
sudo ./start_openpilot_docker.sh
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/c71a936f-6d2d-9bac-ad65-0cdb302abf14.png)

# simulatorの操作
キーボードを使用してsimulatorを操作します。

| key | 操作 |
|:-:|:-:|
| 1  | 5 mphの速度を増やす  |
| 2  | 5 mphの速度を減らす  |
| 3  | 速度をキャンセル  |
| q  | 終了  |

<iframe width="560" height="315" src="https://www.youtube.com/embed/sWx0TBGt6Hc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
venvによる仮想環境の作り方

# [venv](https://docs.python.org/ja/3/library/venv.html)とは

- python3.5から標準搭載になった，仮想環境を作成するためのツール
- 学習コスト低め
- 同様の仮想環境作成用ツールには，`pyenv`, `pipenv`, `virtualenv`などがある．仮想環境の機能"も"持つツールとしては`Anaconda`, `Docker`等も挙げられる

# 依存環境

- Python >= 3.3


# 使い方

## 仮想環境の作成

```bash
$ cd [workdir]
$ python -m venv .venv
```

これにより，`.venv` フォルダが作成される．

## activate

#### windowsの場合

コマンドプロンプトから以下を実行．（PowerShellで実行する場合は[PowerShellスクリプトを実行できるようにする](https://www.python.jp/install/windows/virtualenv.html#20oC5v)必要があります）．

```
$ .venv\Scripts\activate
```

#### Linux, Mac

```
$ . .venv/bin/activate
```

または

```
$ source .venv/bin/activate
```

## deactivate

windows, linux, mac 共通．

```
$ deactivate
```

## パッケージのインストール

仮想環境を**activate**した後に，普通にpipで好きなものをインストールすればOK．例えば`pytest`をインストールする場合：

```
$ pip install pytest
```

`requirements.txt`から一括でインストールする場合：

```
$ pip install -r requirements.txt
```

## パッケージをメンバーと共有する場合

パッケージ群の情報を`requirements.txt`に出力して，メンバーと共有する方法がよく使われます：

```
$ pip freeze > requirements.txt
```

# 参考にさせていただいたページ

- [Windows 環境のPython](https://www.python.jp/install/windows/virtualenv.html)
- [チームで使うPython3開発環境の比較検討と構築手法](https://qiita.com/po3rin/items/5c853bc172e5de330148)
- [pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)
JSでcssのクラスを追加・削除する方法(Jqueryを使わない）

JavascriptでClassを追加・削除する方法を毎回忘れてしまうので、
備忘録として記載残しておきます。

```.index.html
  <style>
    .addclass {
      color: red;
    }
  </style>
  <button id="addButton" onclick="addclass()">テスト文字です</button>
  <button onclick="delclass()">クラス削除</button>

  <script>
//#addButtonへクラスを追加します
    function addclass() {
      const buttonstyle = document.getElementById("addButton");
      buttonstyle.classList.add("addclass");
    }
//クラスを削除します
    function delclass() {
      const buttonstyle = document.getElementById("addButton");
      buttonstyle.classList.remove("addclass");
    }
  </script>
````

jQueryに慣れてしまうといざというときにできなかったりするのでメモしておきます。
Laravelで簡単なCMSを作成(認証)

Laravelで簡単なCMSを作成してみます。

環境構築とデータベースのマイグレーションは以下の記事を参考にどうぞ。

https://qiita.com/kiyo27/items/c09273bdae62422fc009

https://qiita.com/kiyo27/items/8ddb01bf5ef3d769cf66

今回は認証機能を追加してみます。

## スターターキットで認証機能を作成

素晴らしいことにLaravelには認証機能をサクッとつくれるようにスターターキットが用意されています。Laravel breezeを使用してシンプルな認証機能を作成します。

https://readouble.com/laravel/8.x/ja/starter-kits.html

```
// パッケージをインストール
composer require laravel/breeze --dev

php artisan breeze:install

npm install

npm run dev

php artisan migrate
```

上記のコマンドを実行するだけで、/loginにログイン画面が表示されます。ユーザーを登録するためには、/registerにアクセスします。

ログインページ
![スクリーンショット 2021-05-02 013133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/9f043fb9-6b55-dd35-1d6e-9c6f47e33240.png)


ユーザー登録ページ
![スクリーンショット 2021-05-02 013118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/38640a42-c9f4-73ca-337d-6c26fec1bcde.png)


記事を登録する場合は、下記の記事を参考に。

https://qiita.com/kiyo27/items/e4bbaf96ed970be5c746
Windows版CARLAのインストールメモ

インストールメモです。[こちらのHP「Windows build」](https://carla.readthedocs.io/en/latest/build_windows/)と[こちらのHP](https://takenokonosato.sakura.ne.jp/blog/2020/07/25/windows%E7%89%88carla-0-9-9%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)を参考にしました。
以下は「Windows build」のHPに沿ってインストールした補足メモです。

（１）CMakeをインストール　cmake-3.20.0-rc1-windows-x86_64.msi
インストール時に以下のチェックを入れておけば、環境変数が自動的に設定されます。
Add CMake to system PATH for the current user

（２）Gitをインストール　Git-2.30.1-64-bit.exe
インストール時デフォルトの設定を使用しました。

（３）Makeをインストール　make-3.81.exe
インストール後、[PATHの環境変数にインストール先を追加](https://www.atmarkit.co.jp/ait/articles/1805/11/news035.html)します。デフォルトだと以下です。
C:\Program Files (x86)\GnuWin32\bin

（４）Pythonをインストール　python-3.9.2-amd64.exe
インストール時に以下のチェックを入れます。
Add Python 3.9 to PATH

（５）Visual Studio Community 2017をインストール
インストール時に、以下をチェックします。
– ワークロード->「C++ によるデスクトップ開発」にチェック入れます->右側の概要部分「Windows 8.1 SDK と UCRT SDK」
– 個別のコンポーネント->.NET Framework 4.7.2 SDK

（６）Unreal Engineをインストール
[GitHub account と Unreal Engine's account](https://www.unrealengine.com/ja/ue4-on-github?sessionInvalidated=true) をリンクさせます。

コマンドプロンプトでc:直下で次のコマンドを実行します。
git clone --depth=1 -b 4.24 https://github.com/EpicGames/UnrealEngine.git

クローンが終わったら次のコマンドを順に実行
cd UnrealEngine
powershell -Command "(New-Object System.Net.WebClient).DownloadFile('https://carla-releases.s3.eu-west-3.amazonaws.com/Backup/UE4_patch_wheels.patch', 'UE4_patch_wheels.patch')"
git apply UE4_patch_wheels.patch
Setup.bat

GenerateProjectFiles.batを実行したら
.NETFramework,Version=v4.6.2が無いといわれたので、[インストール](https://ja.ojit.com/so/.net/41423)して再度実行。

次はCompile the modified engine
sln読み込んだら次のエラーがでました。
![20210225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/5bbfa97f-a5ed-c162-4ff5-262451bd4eb5.png)
sln読み込む途中で.NETFramework4.5がないと出てきたので、
次は4.5の開発者キットを探してインストールしてみます
JS~DOMの取得~

#概要
DOM操作では必ず要素を取得します。
要素の取得についての記事です。

#要素の選択
DOMの操作は、HTMLタグの要素を取得することから始めます。
ElementとはNodeを継承したオブジェクトです。
継承とは、親クラスの特徴を継承して新しいクラスを継承することです。元になったクラスを親クラス、新しいクラスを子クラスと言います。
JSからの要素の選択は、querySelectorとquerySelectorAllが使われます。この２つのメソッドはCSSセレクターを引数として要素を選択します。

```index.html
<div class=header>
  <h1 class="title">ToDoリスト</h1>
</div>
```

1,querySelector();

```main.js
const title = document.querySelector('.header');
console.log(title);
```
上記のように取得することにより、コンソールに取得した要素が表示されます。
指定した要素が存在しない場合はNullを返します。

*CSSセレクターとは
CSSで要素を指定する方法です。クラス名は「.class名」、id名は「#id名」とします。

2,document.querySelectorAll();

```index.html
<ul id="task">
 　<li>あいうえお</li>
   <li>かきくけこ</li>
   <li>さしすせそ</li>
</ul>
```

ul要素の中のli要素を取得する場合、すべての要素の選択は以下のように取得します。

```main.js
const li = document.querySelectorAll('li');
console.log(li);
```
すべての要素を取得することができました。

li要素の１つのみを取得する場合は以下のように添え字を記述することで指定することができます。

```main.js
console.log(li[2]);
//さしすせそ
```

すべてのli要素に処理を実施する場合は、forEachを使用します。

```main.js
li.forEach((list,index) =>{
  console.log(`${index}番目の${list}です`);
});
```

3,document.getElementById

```main.js
const task = document.getElementById('task');
console.log(task);
```

HTMLのid名の取得は上記のように記述します。
設定：ドライバ：Raspberry Pi Mouse

またまた久しぶりに触りました。
まずは、ubuntuのアップデートから行いました。
sudo apt-get update

久しぶりなので「[Raspberry Piで学ぶ　ROSロボット入門](https://www.nikkeibp.co.jp/atclpubmkt/book/17/261040/)」を最初から読み直しています。

192.168.11.30

ubuntuのノートPCのCPUファンがうるさいので設定してみました。
私のノートPCは「escキー」で[BIOS画面](https://www.brain-network.ne.jp/example/example11.html#:~:text=BIOS%E7%94%BB%E9%9D%A2%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E6%96%B9%E6%B3%95,%E6%96%B9%E6%B3%95%E3%81%8C%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%A7%E3%81%99%E3%80%82)に入れました。

[Raspberry Piで学ぶ　ROSロボット入門](https://www.nikkeibp.co.jp/atclpubmkt/book/17/261040/)の3.2項でエラーが出ました。
insmod: ERROR: could not insert module rtmouse.ko: Invalid module format
[このページ](https://tomosoft.jp/design/?p=4867)によると、「カーネルのバージョンと コンパイルしたドライバのバージョンが異なるのが原因のようです。」とのこと。
[OSのバージョンを確認する](https://qiita.com/glires/items/a2a07565207509af0e83)と、VERSION="16.04.7 LTS (Xenial Xerus)
[過去の自分の記事](https://qiita.com/RYO_/items/f981f584236215c55bf3)を見ると、「3.2.1章でデバイスドライバをインストールしなおしたら、うまく行くようになりました。」とのことなのでやってみます。
たしかに「ピッ」となって成功しました。

```
ubuntu@ubuntu:~$ ls -l /dev/rt*
crw-rw-rw- 1 root root 242, 0  5月  3 00:53 /dev/rtbuzzer0
crw-rw-rw- 1 root root 243, 0  5月  3 00:53 /dev/rtled0
crw-rw-rw- 1 root root 243, 1  5月  3 00:53 /dev/rtled1
crw-rw-rw- 1 root root 243, 2  5月  3 00:53 /dev/rtled2
crw-rw-rw- 1 root root 243, 3  5月  3 00:53 /dev/rtled3
crw-rw-rw- 1 root root 240, 0  5月  3 00:53 /dev/rtlightsensor0
crw-rw-rw- 1 root root 236, 0  5月  3 00:53 /dev/rtmotor0
crw-rw-rw- 1 root root 238, 0  5月  3 00:53 /dev/rtmotor_raw_l0
crw-rw-rw- 1 root root 239, 0  5月  3 00:53 /dev/rtmotor_raw_r0
crw-rw-rw- 1 root root 237, 0  5月  3 00:53 /dev/rtmotoren0
crw-rw-rw- 1 root root 241, 0  5月  3 00:53 /dev/rtswitch0
crw-rw-rw- 1 root root 241, 1  5月  3 00:53 /dev/rtswitch1
crw-rw-rw- 1 root root 241, 2  5月  3 00:53 /dev/rtswitch2
```

Qiitaの記事の[Markdown記法のページ](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)見つけました。参考になります。

時刻も手動で設定しました。

```
sudo date -s "05/03 10:37 2021"
```
ドローンをROSで動かしたい

まずはwebでいろいろ調べてみてます。

[ROS対応してるドローン調査＠201911](https://qiita.com/mmt/items/b40a53184b83de6d23e6)

[Parrot Bebop 2](https://kakakumag.com/hobby/?id=3864)
[Bebop2をゲーム用コントローラで制御する](https://dronebiz.net/tech/ros/joypad)
[体験！小型ドローンのプログラム制御 ～初級コース～](https://soha-seminar.connpass.com/event/167036/)
[テキスト：体験！小型ドローンのプログラム制御 ～初級コース～](https://speakerdeck.com/k_akiyama/ti-yan-xiao-xing-doronfalsepuroguramuzhi-yu-chu-ji-kosu?slide=24)
[ROSを利用したドローンの制御について(BebopDrone編)](https://www.ntt-tx.co.jp/column/yasui_blog/20160203/)
[小型ドローンの屋内自律飛行テスト（STEP1）](https://dronebiz.net/jisseki/ar-marker_step1)
[オープンソースを用いたドローンの自律制御ソフトウェア技術](https://swest.toppers.jp/SWEST18/public/material/s2b_proceeding.pdf)

[Bebop Drone専用コントローラー Parrot Skycontroller](https://www.drone.jp/news/20150704172225907.html)
[Bebop2のセットアップや操作の方法](https://dronemedia.jp/bebop2-for-beginner/)
[【準備】さっと接続Bebop2のフライト準備](https://dration.com/parrot-bebop2-firstfly)
[動画FreeFlight Pro -- Parrot Bebop 2 -- Settings Overview](https://www.youtube.com/watch?v=YYN5yb5r69U)
[動画[How to]FreeFlight Proの基本的な使用方法（Parrot Bebop 1&2）](https://www.youtube.com/watch?v=dpCsGUOfBJI)


bebop2購入しました！

bebop2とsky controllerの立ち上げ手順（悩みました）
1.sky controllerを電源ON
2.iPhoneのwifiをsky controllerに接続
3.free flight proを起動
4.bebop2の電源ON

いろいろ触っていきたいと思います。
Spring Boot のjarファイルを作成する

###Maven installで作れた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/a6a10a75-3b6e-e2a0-cadc-5bda4654b828.png)

プロジェクトエクスプローラーで右クリック→実行→Maven installで作成できました

targetの中にjarファイルができたので、virtualBoxにデプロイして実行！

と思ったら、MySQLとか入れてないから動かん。

でもとりあえずこれでjarは作れるようになりました。


試してできるようになっただけなので、やり方として良くないかも。

デフォルトでできると思ってたらできなかったので、いろいろ調べたけどうまく行かなかったのはなぜだろう？
Laravelで簡単なCMSを作成(環境構築)


Laravelの開発環境をdockerを使ってnginx + php + sqliteの構成で作ってみます。

## docker-composeで管理

ディレクトリ構成は以下です。``src``ディレクトリ配下にはLaravelのコードがインストールされます。

```
.
├── docker
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
│
├── docker-compose.yml
└── src
```

docker-composeでコンテナを管理します。

```yaml:docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx
    ports:
      - 8080:80
    volumes:
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./src:/var/www
    depends_on:
      - php
  php:
    build: ./docker/php
    volumes:
      - ./src:/var/www

```

### nginxの設定

```conf:default.conf
server {

    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name localhost;
    root /var/www/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }
}
```

### phpコンテナ

```dockerfile:Dockerfile
FROM php:7.3-fpm

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
#Composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer

RUN apt-get update &&\
    apt-get install -y libzip-dev &&\
    docker-php-ext-configure zip --with-libzip && \
    # Install the zip extension
    docker-php-ext-install zip && \
    docker-php-ext-install pdo_mysql

COPY php.ini /usr/local/etc/php/

WORKDIR /var/www
```

```ini:php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

## コンテナ起動

docker-compose.ymlファイルが置いてある場所で``docker-compose up``を実行するとコンテナが起動します。バックグラウンドで起動するために``-d``も付けて起動させます。

```
docker-compose up -d
```

## Laravelインストール

コンテナが起動できたらLaravelをインストールするために、phpコンテナに入ります。

```
# docker-compose exec php bash
```

phpコンテナに入れたらLaravelをインストールします。

```
# composer create-project laravel/laravel .
```

``.env.example``を``.env``にリネームします。

```shell
cp .env.example .env
```

アプリケーションキーを作成します。

```bash
php artisan key:generate
```

インストールが完了したら、[http://localhost:8080](http://localhost:8080)にアクセスして環境が正しく構築出来ているか確認します。下の画像のように表示できていればOKです。

![スクリーンショット 2021-05-02 131652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/15e9fa57-91b4-94c8-83ba-4ee2a7f9cac9.png)

## SQLiteの設定

laravel/database 配下に database.sqlite というファイルを作成します。次に``.env``ファイルをsqliteを使用するために修正します。

```config:.env
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
# DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

これで設定は終わりです。

作成したデータベースにデータを登録する場合は、以下の記事を参考に。

https://qiita.com/kiyo27/items/8ddb01bf5ef3d769cf66
pi picoでmicropython その22

#概要

picoでmicropythonやってみた。

#pioアセンブラの、命令セット。

命令は、９個
命令長は、16bit
メモリーは、32語

+ JMP  条件分岐。
+ WAIT 一定の条件が成立するまで停止。
+ IN   受信シフトレジスタへビット列を読み込む。
+ OUT  送信シフトレジスタからビット列を書き出す。
+ PUSH 受信シフトレジスタから受信バッファへデータを読み出す。
+ PULL 送信バッファから送信シフトレジスタへデータを書き出す。
+ MOV  レジスタ等の間でデータをコピーする。
+ IRQ  割り込みフラグの読み書き。
+ SET  GPIOピンやレジスタに即値を書き込む。


|命令\bit| 15| 14| 13| 12| 11| 10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|JMP | 0| 0| 0| Delay/side-set| ||||Condition||| Address||||
|WAIT| 0| 0| 1| Delay/side-set| ||||Pol| Source|| Index||||
|IN  | 0| 1| 0| Delay/side-set| ||||Source||| Bit count||||
|OUT | 0| 1| 1| Delay/side-set| ||||Destination||| Bit count||||
|PUSH| 1| 0| 0| Delay/side-set| ||||0| IfF| Blk| 0| 0| 0| 0| 0|
|PULL| 1| 0| 0| Delay/side-set| ||||1| IfE| Blk| 0| 0| 0| 0| 0|
|MOV | 1| 0| 1| Delay/side-set| ||||Destination||| Op|| Source|||
|IRQ | 1| 1| 0| Delay/side-set| ||||0| Clr| Wait| Index|||||
|SET | 1| 1| 1| Delay/side-set| ||||Destination||| Data|||||

以上。
新しい Azure サービスが使えるリージョンを Azure CLI で調べてみた

## 背景と目的

Azure Web PubSub サービスという新しい Azure サービスがパブリックプレビューになったとの事で、どのリージョンで使用出来るのかとても気になります。

[リージョン別の利用可能な製品](https://azure.microsoft.com/ja-jp/global-infrastructure/services/?products=web-pubsub&regions=all)というサイトで調べる事は出来るのですが、Azure CLI で調べる方法を調べてみたくなり、その結果を残しておきます。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

Azure Web PubSub の CLI を利用するためには、2.22.0 以上にする必要があります。

```zsh:zsh
% sw_vers
ProductName:    macOS
ProductVersion: 11.3
BuildVersion:   20E232

% az version                            
{
  "azure-cli": "2.22.1",
  "azure-cli-core": "2.22.1",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## 実施内容

事前に[リージョン別の利用可能な製品](https://azure.microsoft.com/ja-jp/global-infrastructure/services/?products=web-pubsub&regions=all)というサイトで東日本リージョンは利用出来ない事が分かっているので、検証する為にあえて東日本リージョンを選択しています。

```zsh:zsh
# webpubsub を有効にします
% az extension add \
  --name webpubsub
The installed extension 'webpubsub' is in preview.

# リソースグループを作ります
az group create \
  --name webpubsub-rg \
  --location japaneast

# あえて東日本リージョンで webpubsub を作ります
az webpubsub create \
  --name webpubsubtest \
  --resource-group webpubsub-rg \
  --location japaneast \
  --sku Free_F1
(LocationNotAvailableForResourceType) The provided location 'japaneast' is not available for resource type 'Microsoft.SignalRService/WebPubSub'. List of available regions for the resource type is 'eastus,northeurope,southeastasia,westeurope,westus2'.
```

利用可能なリージョンは、eastus,northeurope,southeastasia,westeurope,westus2 だと教えてくれます。

また、リソースタイプが Microsoft.SignalRService/WebPubSub であることも分かります。

## 実施結果

上記のように適当なリージョンでリソースを作成してみるのも良いのですが、リソース作成前に利用可能なリージョンを調べたいので、リソースプロバイダーの情報を調べてみます。

```zsh:zsh
# WebPubSub がリソースプロバイダーにあるのか調べます
% az provider list | grep -i webpubsub
        "resourceType": "WebPubSub"

# リソースタイプに WebPubSub がある namespace を調べます
% az provider list \
  --query "[?resourceTypes[?resourceType=='WebPubSub']].namespace"
[
  "Microsoft.SignalRService"
]

# リソースプロバイダーの情報からロケーションを表示します
% az provider show \
  --namespace Microsoft.SignalRService \
  --query "resourceTypes[?resourceType=='WebPubSub'].locations[]" \
  --output tsv
East US
North Europe
Southeast Asia
West Europe
West US 2

# ロケーション名からリージョン名を調べます
% az account list-locations \
  --query "[?displayName=='Southeast Asia']" \
  --output table
Name           DisplayName     RegionalDisplayName
-------------  --------------  -----------------------------
southeastasia  Southeast Asia  (Asia Pacific) Southeast Asia
```

## 参考

[Microsoft Azure Web PubSub service now in public preview](https://azure.microsoft.com/ja-jp/updates/microsoft-azure-web-pubsub-service-now-in-public-preview/)

[az webpubsub create](https://docs.microsoft.com/ja-jp/cli/azure/webpubsub?view=azure-cli-latest#az_webpubsub_create)
1本のUSBメモリでISOイメージからマルチブートさせる (YUMI)

## YUMI

https://www.pendrivelinux.com/yumi-multiboot-usb-creator/

* MBR版はNTFSフォーマットに対応している。
     * USBメモリ上の格納もEFI版よりスッキリしているので自分はこちらを採用した。
* EFI版はNTFSフォーマットに対応していない。FAT32で用意する。

### USBメモリのGRUBから削除するには

YUMI上から削除をしても消えなかったので、
以下を適宜 編集・削除する

D:\multiboot\Installed.txt
D:\multiboot\syslinux.cfg
D:\multiboot\menu\
D:\multiboot\ISOS\

### 動作状況

以下動作した。全てYUMI MBR版から `Grub partition 4` での登録をした。

* Clonezilla (Ubuntu版)
* Xubuntu 21.04
* Acronis TrueImage
* Windows 10 64bit 20H2

以下はブート途中で止まった。

* Proxmox-ve 6.4

## 参考

* [【UEFI・MBR対応】ブータブルUSBを作成するツールを徹底比較してみた - まがったミニマリスト](https://ventzana.com/2020/03/01357/#%E6%9C%80%E3%82%82%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%EF%BC%9AWinSetupFromUSB)