OmniAICreator/Qiita-1.07M huggingface dataset:
halconの形状ベースのマッチングを実装してみる

このリポジトリを動かす

https://github.com/meiqua/shape_based_matching

リポジトリの概要

```
halconのエンジニアが書いたマシンビジョンアルゴリズムとアプリケーション、
317ページ3.11.5を参照して、halconの形状ベースのマッチングを実装してみる。
```


# 準備

- docker kinetic image 実行

docker ros kinetic https://qiita.com/seigot/items/9a3a101dbbd7828ee00b

```
docker run -it --rm -p 6080:80 ct2034/vnc-ros-kinetic-full
```

- その中にcloneしてtest.cppのテストフォルダへのパスを修正　ビルド

# 実行結果

- original

![Screenshot from 2022-05-18 21-37-18](https://user-images.githubusercontent.com/40942409/169040638-1aed4d89-dd8c-4b54-8a54-a806d5ef56a9.png)

test.cppに3種類のサンプルがあるみたい,上はangle_test()関数が実行されている

- scale_test()を実行

結果

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/8a150bc1-8bef-2dd7-55ec-e37a62c76071.png)


- noise_test()実行

結果

![together.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/1a8d9df5-38f2-5123-b1d5-793dee26c31e.png)

- angle_test() : モードを"test"じゃなく"train"に変更  ※ 引数を ("test", True)　から ("train", True)にする

結果

![Peek 2022-05-19 22-37](https://user-images.githubusercontent.com/40942409/169306627-d711ef8e-4cba-4af5-9574-1c1958c45b68.gif)

回転用の,テンプレートデータを作成しているみたい

- scale_test()でモードをtestからtrainに変更

以下のような出力がされた

```
empl_id: 0
templ_id: 1
have no enough features, exaustive mode
templ_id: 2
have no enough features, exaustive mode
templ_id: 3
templ_id: 4
templ_id: 5
templ_id: 6
templ_id: 7
templ_id: 8
templ_id: 9
...
```

縮尺を変えたデータセットを作成??

- noise_test() testからtrainに変更

結果


![Peek 2022-05-19 22-40](https://user-images.githubusercontent.com/40942409/169307271-14caedb1-6321-4ff5-9eba-27147550b391.gif)

こちらも回転用のテンプレートデータセットを作成しているみたい

- 画像を変えてみる



angle_test()の画像を変更

train.pngを

![image2](https://user-images.githubusercontent.com/40942409/169337467-45ee0ea3-15d2-4e0f-a4b1-dc541428355d.png)

test.pngを


![image1](https://user-images.githubusercontent.com/40942409/169337496-8be0a3f0-9bc6-41a5-895c-af6b864923c5.png)

プログラムを以下のように変更

![Screenshot from 2022-05-20 00-32-51](https://user-images.githubusercontent.com/40942409/169337605-723f04b4-97e7-48d4-ab99-dda1f4b93621.png)

trainモードで形状データセット作成 => testモードでマッチング処理実行  

結果

![Screenshot from 2022-05-20 00-42-07](https://user-images.githubusercontent.com/40942409/169340179-cb18af75-589d-4693-9487-b7c312bf461b.png)

探索できた
探索にかかった時間は,0.2sくらい,すごい!

```
construct response map
elasped time:0.0653973s

templ match
elasped time:0.0182259s


elasped time:0.0861984s
matches.size(): 41

match.template_id: 0
match.similarity: 100
```

test.pngを変えてみた  
結果

![Screenshot from 2022-05-20 00-41-51](https://user-images.githubusercontent.com/40942409/169340101-ed54b988-488e-4873-b640-7fa52758ac7a.png)



いい感じ!


train画像作成のためにクロップに使用したツール: https://www.iloveimg.com/crop-image/crop-png

# プログラム中身

(test.cpp)

angle_test()最後の方

![Screenshot from 2022-05-26 13-22-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/d75a9195-07be-69d0-f523-a99045a610c6.png)

match.x,match.yが認識位置
traefikにBasic認証を設定

https://qiita.com/error484/items/d5ff9da8385ea2ee720a

:::note info
上記の設定が出来ていることが前提となります。
:::

## ■Basic認証用のID、パスワードを生成

```shell
# ID: test
# PW: test
htpasswd -nb test test
```

## ■ID、パスワードを直接記載する場合のdocker-compose.yml


```diff_yaml
version: '3.7'

services:
  test-app-test:
    .
    .
    .
+    labels:
+      - traefik.http.routers.test-app-test.middlewares=auth
+      # パスワードは test です
+      - traefik.http.middlewares.auth.basicauth.users=test:$$apr1$$eGwwMz30$$..Nko1IUf72kLRzLgS1cA.
```

* `traefik.http.routers.test-app-test.middlewares` に設定した `auth` は `traefik.http.middlewares.【ここにauthが入ります】.basicauth.users` に記載をします。  
* `basicauth.users` の値は複数の設定が可能で「,(カンマ)」区切りで設定を行います。
* パスワードは「htpasswd」コマンドで作成します
* <font color="red">**ymlファイルで`$`を使用する場合、`$$`に変更する必要があります**</font>

## ■認証ファイルにID、パスワードを指する場合のdocker-compose.yml

```diff_yaml
version: '3.7'

services:
  test-app-test:
    .
    .
    .
    volumes:
    .
    .
    .
+      - /tmp/.htpassword:/tmp/.htpassword
+    labels:
+      - traefik.http.routers.test-app-test.middlewares=auth
+      - traefik.http.middlewares.auth.basicauth.usersfile=/tmp/.htpassword
```

```/tmp/.htpassword
test:$apr1$eGwwMz30$..Nko1IUf72kLRzLgS1cA.
```

* volumes に `/tmp/.htpassword` を追加していますが、コンテナ内にファイルを直接作成しても問題はありません
* ファイルを指定する場合、`basicauth.users`ではなく`basicauth.usersfile`になります

## ■関連記事

https://qiita.com/error484/items/d5ff9da8385ea2ee720a

https://qiita.com/error484/items/356087c8e7b6826e0dee

https://qiita.com/error484/items/5c538d4f0d39fd0df5d0

https://qiita.com/error484/items/0faee543bb8c0d4b37b0
【Swift】SPM関係でエラーが出た時の対処法

SPMのエラーは何も変更してないのに突然発生します。
かなりの恐怖体験です。
![スクリーンショット 2022-05-19 21.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8eb51c5a-cd67-fe52-d6de-dd3cf498a986.png)

いまSPMのエラーで泣きそうになってる君に対処法を伝授します。

# 対処法
Xcodeのメニューから「File」を選択します。
![スクリーンショット 2022-05-19 21.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0e40b5e8-7434-d6ca-80ca-4bb4bf6e7e83.png)

①「Packages」を選択します。
②「Update to Latest Package Versions」を選択します。
![スクリーンショット 2022-05-19 21.40.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/490569f5-d7fd-76ce-d32e-4b3b905c586b.png)

解決！！

おそらく「Reset Package Caches」でも治ります。
重要なのは再読み込みを行うことです。



# 例外
稀に治らないことがあります。

自分は「Derived Data」を削除してから上記の手順を行うことで治りました。

しかし、「Derived Data」の削除には注意です。
他のプロジェクトにも影響が出る可能性があります。
自分は全プロジェクトで上記の手順を行うハメになりました笑

# Derived Dataの削除の仕方
![スクリーンショット 2022-05-19 21.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4db33908-40d5-cec1-af4d-c1ac290b68bf.png)

![スクリーンショット 2022-05-19 21.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/66a45702-5436-fc08-713e-face6f0cde88.png)

![スクリーンショット 2022-05-19 21.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d711c665-3fec-b55c-7870-8e8a39ed6f3b.png)

# おわり
コード以外のエラーって、怖いな～怖いな～…なんか嫌だなあ～
(稲川淳二風)
【忘備録】python 　f-strings

Python 3.6よりformatではなく、f-stringsが以下のように使えるようになった。
こちらのほうが処理速度が速いらしい。


```python
a = 'a'
print(f'a is {a}')
# 結果　a is a
 
x, y, z = 1, 2, 3
print(f'a is {x}, {y}, {z}')
print(f'a is {z}, {y}, {x}')

# 結果 a is 1, 2, 3
# 結果 a is 3, 2, 1
 
name = 'Jun'
family = 'Sakai'
print(f'My name is {name} {family}. Watashi ha {family} {name}')

#結果　My name is Jun Sakai. Watashi ha Sakai Jun

```
【備忘録】一般法人向けMicrosoft 365の無料登録方法

# はじめに
仕事でMicrosoft 365の導入に携わっており、テスト用環境としてMicrosoft 365の環境を構築し作業しましたが、１か月間無料で試すことができるため、とても重宝しました。
今後もMicrosoft 365の導入を行う際にお世話になる可能性があるため、備忘録として記録を残します。
※なお、画面は今後変わる可能性があるため、修正しやすいようテキストベースでの記録となっています。

# アカウント作成
下記URLへアクセスし、「1 か月間無料で試す」をクリック（任意のプランを選択）
* [Microsoft 365のプランと価格｜一般法人向け](https://www.microsoft.com/ja-jp/microsoft-365/business)

## 始めましょう
任意のメールアドレスを入力し、「次へ」をクリック
「アカウントのセットアップ」をクリック

## アンケートのお願い
姓、名、勤務先の電話番号、会社名、会社の規模、国または地域を入力し「次へ」をクリック
※勤務先の電話番号はSMSが来るので、携帯番号を入力する
　携帯番号を入力しない場合、音声通話認証が必要
　チェックボックスはチェック不要

SMSに認証コードが送られてくるので、認証コードを入力し「確認」をクリック

## サインインする方法
ユーザー名、ドメイン名、パスワードを入力し「次へ」をクリック
※ドメイン名は重複していないものを指定すること

## 数量と支払い
このページが表示された時点で登録が完了しているため、×ボタンでウィンドウ（またはタブ）を閉じる
※クレジットカード等の情報は入力しなくてよい

# アカウント登録完了
再度下記URLへアクセスし、「1 か月間無料で試す」をクリック（任意のプランを選択）
* [Microsoft 365のプランと価格｜一般法人向け](https://www.microsoft.com/ja-jp/microsoft-365/business)

## 始めましょう
先ほど作成したメールアドレスで既にサインインしている状態となっている
「続ける」をクリック

## ロボットではないことを証明してください。
「メッセージを自分に送信」を選択し、電話番号を入力する
また、電話番号の左のプルダウンは「（+81）日本」を選択すること
※SMSが来るので携帯番号を入力

「自分にテキスト送信」をクリック

しばらく待つとSMSが届くので、届いた認証コードを入力し「無料試用版の開始」をクリック

## 購入手続きへ進む
【注文の確定】が表示される
「無料トライアル」をクリック

## 注文の受領書
「続行」をクリック

## Microsoft 365 管理センター
* [Microsoft 365 管理センター](https://admin.microsoft.com/)
これでMicrosoft 365が使用可能となる
ハンバーガーメニューより「課金情報」→「サービスを購入」を選択し、無料の任意の製品を追加購入することも可能。

下記サイトにサインインすることでWeb版のOfficeが使用できるようになる
* [Microsoft Officeホーム](https://login.microsoftonline.com/)

# まとめ
Microsoft 365を導入しようと考えている法人様は比較的簡単に無料環境を構築することが可能となっています。
アクセスの際にMFAを求めたり、Intuneと組み合わせることで様々なことができるため、無料アカウントを活用してどのようなことが実施できるか確認してみてください。
当記事が参考になれば幸いです。

【参考】
* [Azure AD のセキュリティの既定値群](https://docs.microsoft.com/ja-jp/azure/active-directory/fundamentals/concept-fundamentals-security-defaults)
* [Intuneでofficeを配布してみる](https://note.com/nerone1024/n/na3938ba98274)
Requirements on MCU Driver, No.195, AUTOSAR R21-11(87) CP

Requirements on MCU Driver, No.195, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SRS_MCUDriver.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 84文書読んだ。2022年6月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Trem| Description|
|:--|:--|
|CS |Chip select
|DIO |Digital Input Output
|ECU |Electric Control Unit
|EOL |End Of Line Often used in the term ‘EOL Programming’ or ‘EOL Configuration’
|ICU |Interrupt Capture Unit
|MAL| Old name of Microcontroller Abstraction Layer (replaced by MCAL because ‘MAL’ is a french term meaning ‘bad’)
|MCAL|Microcontroller Abstraction Layer
|MCU |Microcontroller Unit
|MMU |Memory Management Unit
|Master |A device controlling other devices (slaves, see below)
|Slave| A device beeing completely controlled by a master device
|NMI| Non maskable interrupt
|OS |Operating System
|PLL |Phase Locked Loop
|PWM |Pulse Width Modulation
|RX |Reception (in the context of bus communication)
|SPAL| The name of this working group (Standard Peripheral Abstraction Layer)
|SFR |Special Function Register
|RTE| Runtime environment
|WP| Work Package
|STD |Standard
|REQ R|equirement
|UNINIT |Uninitialized (= not initialized)


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[DOC_LAYERED_ARCH] Layered Software Architecture,
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[AUTOSAR_GLOSSARY] Glossary,
AUTOSAR_TR_Glossary.pdf.pdf
[SRS_BSW_GENERAL] General Requirements on Basic Software Modules,
AUTOSAR_SRS_BSWGeneral.pdf
[SRS_BSW_SPAL] General Requirements on SPAL,
AUTOSAR_SRS_SPALGeneral.pdf
[TPS_STDT_0078] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
ABC004の解答[Java]

## はじめに
ABC003同様一筋縄では行かず、またD問題が解けませんでした。難しい･･･。

とりあえず、解けた問題のコードを説明していきます。

## A - 流行
問題文は[こちら](https://atcoder.jp/contests/abc004/tasks/abc004_1)

普通に二倍しましょう。
```A.java
import java.util.*;
class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    //値の取得
    int N = sc.nextInt();
    //二倍した物を出力
    System.out.println(N*2);
  }
}
```
いわゆる「やるだけ」。

## B - 回転
問題文は[こちら](https://atcoder.jp/contests/abc004/tasks/abc004_2)

4×4ということで二次元配列使っても良かったんですがなんとなく一次元配列にしました。
普通に取得して逆から出力しましょう。
```B.java
import java.util.*;
class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    //文字の取得
    String[] str = new String[16];
    for(int i=0;i<str.length;i++){
      str[i] = sc.next();
    }
    //逆から出力
    for(int i=str.length-1;i>=0;i--){
      System.out.print(str[i]+" ");
      //iが4の倍数のときに改行するとちょうど良い
      if(i%4==0) System.out.println("");
    }
  }
}
```
今思えば一行ずつまるごと取得しても面白そうでしたね(逆順がちょっと面倒ですが)。

## C - 入れ替え
問題文は[こちら](https://atcoder.jp/contests/abc004/tasks/abc004_3)

なんか部分点が～みたいなのが書いてあったので普通に解くとTLE出るんだろうなあ･･･。って思ったので以下の等式関係を見つけ出して実装しました(N=nの時の解答の文字列をS(n)、kを自然数とする)。
```math
S(n)=S(n+30k)
```
```C.java
import java.util.*;
class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    //値の取得(Nは30で割った余りに予め整形)
    int N = sc.nextInt()%30;
    //カードの準備
    int[] card = {1,2,3,4,5,6};
    //N(mod30)分は普通に行なう
    for(int i=0;i<N;i++){
      int temp = card[i%5];
      card[i%5] = card[(i%5)+1];
      card[(i%5)+1] = temp;
    }
    //一枚ずつカードの数字を出力(改行なし)
    for(int i=0;i<card.length;i++){
      System.out.print(card[i]);
    }
    //最後に改行
    System.out.println("");
  }
}
```
運良く法則に気付いて良かった･･･。

## D - マーブル
問題文は[こちら](https://atcoder.jp/contests/abc004/tasks/abc004_4)

ACが取れ次第更新予定

## 総評
A：優しい。
B：いろいろやり方がありそう。
C：ちょっと考察が必要。
D：

もう全部解答して解説、という訳にはいかなそうな難易度ですね。
ABC005以降もこんな感じになりそうですが許してください。
世界のユニコーン企業数のマップを作ってみた。しかし、世界に比べると日本のユニコーン企業数が少ないことがわかり、追いつけないのではと絶望する(経済学者ではないため、あくまでも素人意見)

## はじめに
### 経済の専門家ではなく、ましてや経済学者ではないため、あくまでも素人意見の記事。

## ユニコーン企業とは何ですか?　
### 設立10年以内のスタートアップ企業で10億ドル以上の評価額を持つ民間企業。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/ada43608-dce5-2ff1-a004-8566f034aebc.png)

## 日本のユニコーン企業数がすくない原因はいくつかある。（あくまでも素人の意見）
経済の専門家ではなく、ましてや経済学者ではない

集計分析ツールであるPower BIで簡単にユニコーン企業数がわかりますねと
示すために作ってみた。しかし、実際にデータを見ると、日本のユニコーン企業数や評価額規模が世界と比較すると
差がありすぎて、追いつけないのではと軽く絶望した。

作成したユニコーン企業数のマップ　リンク
* [2022年5月19日のユニコーン企業マップ](https://app.powerbi.com/view?r=eyJrIjoiYzhlYjczNGUtMDZkNC00NDdiLTllYTItOWJmMDExYWRlZTk0IiwidCI6ImEwZGFhMTU5LTJiYzYtNDBlNi1iMGQ0LWNiMTlhMjE5Njg1YSIsImMiOjEwfQ%3D%3D) 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/42638797-8a18-8d07-9eeb-47f1a07ac96d.png)

所感
* 当然アメリカや中国、インドのユニコーン企業数は多い（人口も多く、市場規模も大きいはず）
* アメリカのスペースXやStripeの勢いがすごい。

日本
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/025ec6d2-9088-70aa-4c63-43d5aac8a13a.png)

設立10年以内のユニコーン企業数は5社！世界に比べるとすくないとおもうけども、これでもすごいよ。（感覚麻痺している）

素人な個人的な推測意見。おっさんの意見です。
* 日本は、日本語が話せる人向けの市場であるため日本はせいぜい1.3億人の市場規模。
* アメリカは英語圏であり、英語が話せる人15億人の規模であるため、評価額や売り上げは当然市場が当然大きい。
* 企業文化がやはり高いことがユニコーン企業数を見てもわかる
* 出展; Global Unicorn Club(2021) 2022年5月19日時点　https://www.cbinsights.com/research-unicorn-companies

 [2022年5月19日のユニコーン企業マップ](https://app.powerbi.com/view?r=eyJrIjoiYzhlYjczNGUtMDZkNC00NDdiLTllYTItOWJmMDExYWRlZTk0IiwidCI6ImEwZGFhMTU5LTJiYzYtNDBlNi1iMGQ0LWNiMTlhMjE5Njg1YSIsImMiOjEwfQ%3D%3D)
EC-CUBE4 EventListenerの使い方

## EventListenerの使い方

EC-CUBEには下記の様ないくつかのフックポイントが用意されてある。


```php:src/Eccube/Controller/EntryController.php
    private function entryActivate(Request $request, $secret_key)
    {
        ...

        $event = new EventArgs(
            [
                'Customer' => $Customer,
            ],
            $request
        );
        $this->eventDispatcher->dispatch(EccubeEvents::FRONT_ENTRY_ACTIVATE_COMPLETE, $event);

        ...
    }
```

上記は会員登録完了時のフックポイントとなり、登録完了時に行いたい処理を差し込むことが可能である。

処理を差し込む場合`app/Customize`配下にEventListenerディレクトリを作成し、処理を記述したファイルを作成する。
```php:app/Customize/EventListener/SampleListener.php
<?php

namespace Customize\EventListener;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class SampleListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            イベント名 => 'sampleFunction',
        ];
    }

    public function sampleFunction(EventArgs $event)
    {
        // 処理の内容
    }
}


```

例えば、会員登録時にポイントを付与する処理を差し込みたい場合は下記の様な形となる。

```php:app/Customize/EventListener/AwardPointListener.php
<?php

namespace Customize\EventListener;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Customer;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class AwardPointListener implements EventSubscriberInterface
{
    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;

    /**
     * AwardPointListener constructor.
     *
     * @param EntityManagerInterface $entityManager
     * 
     */
    public function __construct(EntityManagerInterface $entityManager) 
    {
        $this->entityManager = $entityManager;
    }

    public static function getSubscribedEvents()
    {
        return [
            EccubeEvents::FRONT_ENTRY_ACTIVATE_COMPLETE => 'awardPointsToNewCustomer',
        ];
    }

    public function awardPointsToNewCustomer(EventArgs $event)
    {
        $Customer = $event->getArgument("Customer");

        $Customer->setPoint(500);

        $this->entityManager->persist($Customer);
        $this->entityManager->flush();
    }
}
```


## 参考文献
- [Symfonyの機能を使ったカスタマイズ](https://doc4.ec-cube.net/customize_symfony)
- [EC-CUBE4で会員登録時にポイントを付与するカスタマイズ方法](https://qiita.com/okazy/items/7edacdafef0b38a2b853)
- [EC-CUBE4で、プラグインを使わずに処理をフックさせる方法](https://kumahiyo.com/event-subscriber/)
Linux上に仮想NWを構築するスクリプトをトポロジから生成出来るWebサービス - Netpen.io

　
[Netpen.io](https://netpen.io/main) 
　
開発者によるデモ動画
[![](https://img.youtube.com/vi/EJh7-EO6eOA/0.jpg)](https://www.youtube.com/watch?v=EJh7-EO6eOA?t=500)

以下の機能に対応しているらしい。

- Network Namespaces
- VETH
- Bridge
- VLAN
- MACVLAN Team
- XFRM transport 
- Tunnels
  - XFRM (xfrmi and vti)
  - IPIP
  - VXLAN
  - GRE WireGuard
- Virtual Routing and Forwarding (VRF)


　
簡単な使い方
1. 適当なサンプルを選択する
2. GUIでネットワークトポロジを描く
3. シェルスクリプトをダウンロードする
4. Linux上で実行する

秘密の情報は書かないように。
Specification of GPT Driver, No.30, AUTOSAR R21-11(86) CP

Specification of GPT Driver, No.30, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/classic/21-11/AUTOSAR_SWS_GPTDriver.pdf



AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 84文書読んだ。2022年6月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|BSW |Basic Software
|DET| Default Error Tracer
|ECU |Electronic Control Unit
|GPT| General Purpose Timer
|ICU |Input Capture Unit
|MCU |Micro Controller Unit
|NOP, nop |Null Operation
|OS |Operating System
|Timer channel |Represents a logical timer entity assigned to a timer hardware
|Target time |Time, something shall occur, when the value is reached. The behavior depends on the configuration and the enabled functionality.
|Tick |Defines the timer resolution, the duration of a timer increment
|GPT Predef Timer| A GPT Predef Timer is a free running up counter provided by the GPT driver. Which GPT Predef Timer(s) are available depends on hardware (clock, hardware timers, prescaler, width of timer register, …) and configuration. A GPT Predef Timer has predefined physical time unit and range.


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules,
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture,
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules,
AUTOSAR_SRS_BSWGeneral.pdf
[4] Specification of Standard Types,
AUTOSAR_SWS_StandardTypes.pdf
[5] Specification of Default Error Tracer,
AUTOSAR_SWS_DefaultErrorTracer.pdf
[6] Specification of ECU Configuration,
AUTOSAR_TPS_ECUConfiguration.pdf
[7] Specification of Diagnostic Event Manager,
AUTOSAR_SWS_DiagnosticEventManager.pdf
[8] Specification of ECU State Manager,
AUTOSAR_SWS_ECUStateManager.pdf
[9] General Requirements on SPAL,
AUTOSAR_SRS_SPALGeneral.pdf
[10] Requirements on GPT Driver,
AUTOSAR_SRS_GPTDriver.pdf
[11] Specification of ICU Driver,
AUTOSAR_SWS_ICUDriver.pdf
[12] Specification of MCU Driver,
AUTOSAR_SWS_MCUDriver.pdf
[13] Glossary,
AUTOSAR_TR_Glossary.pdf
[14] Basic Software Module Description Template,
AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[15] General Specification of Basic Software Modules,
AUTOSAR_SWS_BSWGeneral.pdf
[16] IEC 7498-1 The Basic Model, IEC Norm, 1994

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20220519
Specification of MCU Driver, No.31, AUTOSAR R21-11(85) CP

Specification of MCU Driver, No.31, 2021-11 Classic Platform(OSEK, CAN)

https://www.autosar.org/fileadmin/user_upload/standards/classic/21-11/AUTOSAR_SWS_MCUDriver.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 84文書読んだ。2022年6月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Trem|Description|
|:--|:--|
|uC| Microcontroller
|MCU |Micro Controller Unit
|SFR| Special Function Register (MCU register)
|DEM |Diagnostic Event Manager
|DET |Default Error Tracer

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules,
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture,
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules,
AUTOSAR_SRS_BSWGeneral.pdf
[4] Specification of Default Error Tracer,
AUTOSAR_SWS_DefaultErrorTracer.pdf
[5] Specification of ECU Configuration,
AUTOSAR_TPS_ECUConfiguration.pdf
[6] Specification of Diagnostic Event Manager,
AUTOSAR_SWS_ DiagnosticEventManager.pdf
[7] Specification of ECU State Manager,
AUTOSAR_SWS_ECUStateManager.pdf
[8] General Requirements on SPAL,
AUTOSAR_SRS_SPALGeneral.pdf
[9] Requirements on MCU driver,
AUTOSAR_SRS_MCUDriver.pdf
[10] Specification of Standard Types,
AUTOSAR_SWS_StandardTypes.pdf
[11] Basic Software Module Description Template,
AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[12] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20220519
【Laravel】enumとconstsの使い分け

## 環境
Laravel v9.5.1 (PHP v8.1.3)


## enum(列挙型)
曜日や血液型、星座、都道府県名など似たような意味を持ち、値がまったく変化しない複数の定数を定義しておく。
(PHP8.1からenumが使える)

クラスのように使えるがインスタンス化はできない。

```app/Enums/UserRole.php
<?php

namespace App\Enums;

enum UserRole: int
{
  case Admin = 1;
  case Member = 2;
}
```

## 定数
enumとは反対に列挙しない定数を定義しておく。

```app/Consts/GatePolicy.php
<?php

namespace App\Consts;

class GatePolicy
{
  public const ADMINISTRACTOR_ACCESS = 'administrator-access';
}
```

Laravelの```Gate```(認可)を使って、管理者ユーザーのみアクセスできるようにした際のstringを定数化した。
文脈的にモデルにも切り出せない定数だったので、```Consts```ディレクトリを作成して独立させて管理することにした。
```php
public function store(Request $request)
{
   Gate::authorize(GatePolicy::ADMINISTRACTOR_ACCESS);
   ...
}
```

定数の管理の仕方は下記記事が参考になった。
(記事の例は列挙していってるのでenumで管理してもいいのかなと個人的には思った。)

https://zenn.dev/aoi_avant/articles/19ca83d8ae67d7
手話AIをTeachable Machineで作成してバリアフリーを目指します

初めて記事をご覧いただいた方は初めまして、すぎじゅんと申します。
↓↓↓↓↓↓前回書いた記事はこちらになります↓↓↓↓↓↓

https://qiita.com/kapibara6725/items/f561eebac4e43d7cc381

今回私が手話AIを作ろうと思った背景は、耳が聞こえづらい人とコミュニケーションを取ろうとした場合、現状筆談がメインになっているのですが、コロナ禍で他の人のペンを使うのは感染リスクがあったりします。そこで**手話AIがあれば手話を知らなくてもさながら外国語翻訳ツールのように会話できるのではないか**と思い作成しました。カウンター内に向けてカメラを設置し、横にあるモニターで写すイメージです。

![スクリーンショット 2022-05-22 0.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/7516a658-c946-a595-d63f-4b4aab1cf0fd.png)


# 目次

[1.アプリの出来栄え](#1-アプリの出来栄え)
[2.使用サイト](#2-使用サイト)
[3.作成方法](#3-作成方法)
[4.おわりに](#4-おわりに)

# 1. アプリの出来栄え

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

今回はつば九郎のお面を被っていたので“つばくろう”と手話してみました。動画を見て分かる通り、“ろ”の判別に非常に苦労しており、**細かい表現の判別は判別数が多くなると難しくなる**のがわかります。
# 2. 使用サイト

今回はTeachable Machineと私はMacを使用しているのでMacに入っているテキストエディットを使用しました。


https://teachablemachine.withgoogle.com/

![スクリーンショット 2022-05-19 19.46.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/458a9716-a78c-a977-ecda-abaa4acffaf1.png)


# 3. 作成方法
![スクリーンショット_2022-05-19_19_52_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/42d23a15-5f01-7879-2b69-a5e46b45af17.png)

![スクリーンショット_2022-05-19_19_52_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/b7c2c84b-1c89-567f-9411-d1616a38654e.png)
まずTeachable Machineを開き、使ってみる→画像プロジェクトを開きます。もし音を使った学習モデルを作るなら音声プロジェクトにしましょう。

![スクリーンショット_2022-05-19_19_52_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/f0c4d41e-e000-99ad-543d-a7ebc221d4f5.png)
その後このような画面になるので、Classに判別するものの名前を入れ、ウェブカメラで判断するものを映しましょう。この際、余計なものは映らないようにしたほうが学習の効果が上がります。判別したいものが多数ある場合はクラスを追加を押しましょう。

![スクリーンショット_2022-05-19_19_56_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/f812ee66-48a0-bbb2-a8a2-d93451d5f6b4.png)
全て終わったらトレーニングを押し、モデルをエクスポートしましょう。モデルをアップロードするとNode-redやhtml形式で他のサイトなどでも使用できるようになります。

![スクリーンショット_2022-05-19_19_57_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/f7d62ff4-3214-e982-38fa-47bc74c487ec.png)

そして、p5.jsからコピーを押して、テキストエディットに移行します。
![スクリーンショット_2022-05-19_20_17_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/740a88df-0bdb-0e74-5871-2dc682ac80c0.png)
まず、テキストエディットを開き、新規を押します。
![スクリーンショット_2022-05-19_20_17_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/6e24834b-4bc9-b28f-fca8-c9bfe6e9d9f5.png)
その次にフォーマットから標準テキストにするを押します。この操作をしないとHTML形式で保存ができません。
![スクリーンショット_2022-05-19_20_18_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/c96cb89a-3f50-602d-09cf-ec3362d9de8f.png)
そしてTeachable Machineでコピーしたものを貼り付けて保存します。そこで名前の最後に.htmlを加えることでHTML形式で保存することができ、Web上で開くことができます。これをホームページ上にアップロードするとなるとサーバーが必要だったりするので今回はここまでに留めておきます。

# 4. おわりに
今回は手話AIを作成してみましたがいかがだったでしょうか？**５０音全て網羅すると動きが入ってしまう、似たような手の形が増えてしまう、などの要因により難しかった**ですが、バリアフリーなどの観点からも実現させてみたいと思い作成しました。他にも男性と女性を識別することで利用者の男女比を出せるようにしたり、いろいろアイデアは出てくるのでできるものをもっと考えていきたいですね。皆さんもこんなアイデアどう？みたいなのがあったら教えてください。それではまた。
画像判定で定位置管理ツールを作ってみた～応用編「五月人形が正しく飾れているか判定」

# 画像判定で定位置管理
https://twitter.com/satsuki_nozomii/status/1527155654359945217

# 開発理由
職場の作業台が乱れがちなので、Teachable Machineによる画像判定で**楽しく定位置管理できるツール**を作りたいと思いました。


勤務先は小売業店舗です。売場のクリンリネスは常に心がけており、特にレジは**お客様をお送りするチェックアウトの大切な場所**として整頓に気をつけなくてはなりません。
しかしレジ周りは従業員の作業場にもなっており、**書類や備品で乱雑になりがち**です。
そんな業務の悩みを改善するツールが必要と考えました。
![3272402_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619726/8fbdf770-94e3-b8c0-f5ab-323b6a97dbff.jpeg)

## 使用想定
このツールを実際に業務に使用する手順として、**定められたクリーンタイムの時間**（営業時間中の4時間ごとなど）に、**定点Webカメラでレジを撮影**。
乱れが感知されたら**従業員にアラートで知らせる**という流れを想定しました。
# 作り方
## 使用したツール
[Teachable Machine](https://teachablemachine.withgoogle.com/)
[CodePen](https://codepen.io/)
### Teachable Machineに画像を機械学習させる
Teachable Machineに画像サンプルを学習させます。
![2022-05-19_19h28_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619726/0cfdf7a0-43c4-4acd-3840-187ddf52e73d.png)
その後トレーニングを押ししばらくするとプレビューが表示されます。
きちんと学習されているか、プレビュー画面に映像を映します。

物を乱雑に置くと「NO」が出力されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619726/50451491-a6c4-c33b-c6d1-6c98ceea7e11.png)
定位置に置くと「OK」が出力されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619726/e8e37956-24ae-9fe1-a453-6b0999c4df34.png)
### CodePenにエクスポート
Teachable Machineで作成したモデルをCodePenにエクスポートします。
HTMLで表示させるので、形式はp5.jsです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619726/90ddb030-94ff-1306-ffd7-60c7ef05186a.png)
SAVEボタンで保存し、URLをスマホに送信。
[完成映像](#画像判定で定位置管理)
# 応用編
## 五月人形置き方判定ツール
このツールは売場の商品陳列などにも応用できそうだと考え、手始めに**五月人形兜の飾りつけの間違いを判定するツール**を作成してみました。
飾りつけの間違いで多いのは、弓と太刀の位置が逆だったり、兜の鍬形が外向きになっていたりすることです。

https://twitter.com/satsuki_nozomii/status/1527155072186355712

# 他にも業務で応用できそうなこと
例えば、本部からの**陳列指示書通りに売場が展開されているか**の判定や、**VP（ビジュアルプレゼンテーション：マネキンなどのこと）が指示通りに着せ付けられている**か判定するなど、まだまだTeachable Machineによる画像判定で業務改善できそうです。

さつき
https://twitter.com/satsuki_nozomii
DBの基礎的な事柄3(正規化)

以下の記事の続きです

https://qiita.com/akitika/items/3e1dbfb8d14fcb468d2d

## テーブルの正規化

### 概要

- 1Fact in 1Placeの実現
- 「正規系」「非正規系」
- メリットは、複数のテーブル間のデータ矛盾を未然に防ぐことができる
- デメリットは、テーブル数が増え問い合わせ速度の低下につながる

### 第一正規化

- テーブルの中に同じ内容を表すカラムの繰り返しが存在しないようにすること
- 繰り返し部分を別のテーブルに分離する

### 第二正規化

- テーブルの主キー以外のカラムが、全て主キーに関数従属している状態にすること
  - 関数従属とは、ある値が決まるとそれに対して一意に値が決められる状態のこと
- 主キー全体ではなく、主キーの一部に関数従属している(部分関数従属)カラム群を別のテーブルに分離する

### 第三正規化

- テーブル内のカラムに推移的関数従属性がない状態にすること
  - 推移的関数従属性とは、ABCの3つのカラムにおいて、Aの値が決まるとBが一意に、Bの値が決まるとCが一意に決まるような状態のこと
- 主キー以外に対して推移的関数従属しているカラム群を別のテーブルに分離する
- 着眼点や手法は第二正規化とほぼ同様だが、第三正規化では主キー以外のカラム間の関数従属を抜きだす
デフォルトコンストラクタを=default指定した場合の挙動メモ

タイトル通り、`=default`でハマったのでメモとして残しておきます。C++20です。

下記のコードは問題なくコンパイルできます。(「フィールドが未初期化である」旨の警告は出ます。)
```c++
struct Hoge {
	int a;
	double b;

	Hoge(){}
	Hoge(const int a, const double b):a(a), b(b){}
};

int main() {
	Hoge hoge;
	int c = hoge.a;
	return 0;
}
```

しかし下記のコードはコンパイルできません。「初期化されていないローカル変数を使用している」旨のコンパイルエラーが発生します。
```c++
struct Hoge {
	int a;
	double b;

	Hoge() = default;
	Hoge(const int a, const double b):a(a), b(b){}
};

int main() {
	Hoge hoge; 
	int c = hoge.a;//ここでコンパイルエラー発生。
	return 0;
}
```
【Laravel】Eloquentにlast()がない件

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## Eloquentにlast()がない件
Railsでさんざん```User.last```を使っていたので当然Laravelもあると思っていたらなかった…
最新順にソートしてから最初のデータを取り出す。

```php
// created_atを基準にソートされる
User::latest()->first();

User::latest('id')->first();
```

## collectionにはlast()がある
```php
collect([1, 2, 3, 4])->last();

// 4
```

## 参考
https://zenn.dev/naoki_oshiumi/articles/4db2d6714cc6a3

https://readouble.com/laravel/9.x/ja/collections.html#method-last
【忘備録】python datetime 

参考動画　https://www.udemy.com/course/python-beginner/learn/lecture/8459154?start=15#overview

```python
import datetime

#現在時刻の出し方
now = datetime.datetime.now()
print(now)
#結果　2022-05-19 19:16:21.838450

#iso国際規格の時刻の出し方
print(now.isoformat())
#結果　2022-05-19T19:16:21

#オリジナルの時刻の出し方
print(now.strftime('%d/%m/%y'))
#結果　19/05/22

#年月日だけあつかう場合
today = datetime.date.today()
print(today)
#結果　2022-05-19

#自分で設定した時刻をマイクロセカンドまで表示する場合
t = datetime.time(hour=1,minute=10,second=5,microsecond=100 )
print(t)
#結果 01:10:05.000100

# ~週間前を求める場合
d = datetime.timedelta(weeks=-1)
print(now +d)
# 結果　2022-05-12 19:25:40.272399

# 1年前を求める場合
d = datetime.timedelta(days=-365)
print(now +d)
# 結果　2021-05-19 19:30:17.314440

# ～秒か後の表示させる場合
import time
print('###')
time.sleep(2)
print('####')

#時刻をバックアップファイルに組み込む場合

import os
import shutil

file_name = 'text.txt'
if os.path.exists(file_name):
    shutil.copy(file_name,"{}.{}".format(
        file_name, now.strftime('%Y_%m_%d_$H_$M_$S')
    ))

with open(file_name, 'w') as f:
    f.write('test')
```
Ubuntu でスクリーンショット保存ディレクトリを変更するメモ

`Shift` + `PrintScreen` でスクリーンショット保存を特定のフォルダ(e.g. NAS のフォルダとか)に変えたい...

たとえば Linux で撮ったのを共有フォルダに保存で, 別マシン(mac や Widows など)にお手軽ぺろっと開きたいなど.

https://askubuntu.com/questions/114429/how-can-i-specify-the-default-save-directory-for-gnome-screenshot

そのままでは Gnome のバグ?(Won't fix)でフォルダを変えることができません... :sad:

## 方法 1 `gnome-screenshot` を使う

バージョンによってことなります. 
たぶん多くの方は 18.04 or later 使っていると思いますので, ショートカットは変わりますが一応変えることができます.

- gsettings で保存先を変える
- しかしそれでもバグ(wont fix)でフォルダかわらないので, askubuntu にあるように `gnome-screenshot` を使うようにする.
  - `Shift` + `PrintScreen` でリージョン指定なら `gnome-screenshot -a` など
  - 同じショートカットだとかちあうので, `Super(Windows key)` + `PrintScreen` とかを割り当てる

### symbolic だとうまくいかない?

ただ, samba なフォルダ(gio 接続)指定だと, 画像が途中で書き込めずエラーになりました.
(コマンドラインで `gnome-screenshot` するとうまくいったり, しかしダメだったり)

ただ gnome アップデートしたり再起動したら治ったりするときもあるので, gnome の問題かなにかかもしれません.

## 方法 2 Gnome extension を使う

こちらのほうが楽でいいかも.

https://kledgeb.blogspot.com/2020/09/ubuntu-2004-180-gnome-shell.html

を参考にブラウザ拡張入れて,

https://extensions.gnome.org/extension/1179/screenshot-locations/

をインストールするだけです!
 

## その他

* [ ] ShareX clone sharenix https://github.com/Francesco149/sharenix なども使ってみる
Node.jsからMongoDBにアクセスできない（2022）

Node.jsからMongoDBにアクセスするまでに意外と手間取ってしまった。。
忘れないように記録しておく。

# インストール
ちなみにOSは、Windows 10

* Node.jsをインストーラの指示に従ってインストール（v18.0.0）
* MongoDBをインストーラの指示に従ってインストール（v5.08）
　⇒インストール時、「Install MongoD as a Service」にチェック
　　（MongoDB ServiceサービスがWindowsに登録される）
　⇒途中「MongoDB Compass」にチェックをつけておく
　　（インストール後MongoDB compassが立ち上がる）
　⇒インストール後、mongoのパスを通しておく

# MongoDBにデータ登録
* コマンドプロンプトを開いて、mongoシェルを起動
~~~:コマンドプロンプト
cmd > mongo
~~~
* データベース：myDBを作成
~~~:コマンドプロンプト
> use myDB
switched to db myDB
~~~
* コレクション：tableを作成
~~~:コマンドプロンプト
> db.createCollection('table')
{"ok" : 1 }
~~~
* 適当なデータを登録
~~~:コマンドプロンプト
> db.table.insertOne({name:"taro",age:10})
~~~
⇒MongoDB Compassでデータが登録されていることを確認する

# Node.jsの準備
1. どこかに適当なフォルダをつくる
2. コマンドプロンプトを開き、上記で作ったフォルダに移動して、npmでmongodbをインストール
~~~:コマンドプロンプト
cmd > cd （作成したフォルダのパス)
cmd > npm install mongodb
~~~

# Node.jsからMongoDBにアクセス
上記で作ったフォルダに、app.jsを作る
~~~javascript:app.js
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const url= 'mongodb://127.0.0.1:27017';
const client = new MongoClient(url);

async function run() {
  try {
    await client.connect();
    const database = client.db('myDB');
    const table = database.collection('table');
    const query = { name: 'taro' };
    const data = await table.findOne(query);
    console.log(data);
  } finally {
    await client.close();
  }
}
run().catch(console.dir);
~~~
あとはコマンドプロンプトから node app.jsを実行すればOK

# メモ
* URLの記述が多くのサイトではmongodb://localhost:27017と書いてあったのにそれではつながらない。localhostを0.0.0.0としたり、127.0.0.1としたら大丈夫だった。そこっ！？
⇒ファイアウォールとかほかの設定見直しでずいぶん時間がかかってしまった。。
* MongoDBのサービスは、Windowsの場合インストーラでチェックを付ければ手動でサービスを登録する必要はない。コマンドプロンプトでmongoと打つのは、mongoシェル（？）を呼び出すためのもので、MongoDBの起動とは関係ない。（当たり前？）
* MongoDB Compassは使いやすい！いいね！
WSH JScriptをVisual Studio 2022でデバッグする

# 概要

`wscript.exe` / `cscript.exe` に `//X` オプションを与えてスクリプトを実行すると、Active Scripting APIに対応したデバッガーでスクリプトのデバッグを行うことができます。この記事の公開時点で最新であるVisual Studio 2022でデバッグ可能です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/5f057c78-7e1d-7ea4-11bf-c9dcbe3fcd77.png)

しかし、Windowsを初期化した直後にwingetでVisual Studioをインストールした環境で、デバッガー選択ダイアログが出ないことがありました。これを踏まえて、デバッグができる条件について調べました。

# 環境

```
C:\>ver

Microsoft Windows [Version 10.0.22000.675]

```

- Visual Studio Community 2022

# 解説

wingetからインストールしたVisual Studio Communityは、空の状態でインストールされます。（「空のソリューション」しか作成できません。）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/e8c3096a-6233-9e6a-cd28-b930edcba072.png)

Visual Studio Installerからコンポーネントを追加します。試しに、最もスタンダードな「.NET デスクトップ開発」をインストールしたところ、JIT Debugが有効化されました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/9bc63a0a-5d52-3912-1bbd-98fda79f76a2.png)

なおJITデバッガーは単体でインストールするオプションもあるのですが、JITデバッガーのみを選択した場合には `//X` オプションでダイアログが表示されませんでした。どのコンポーネントが関わって有効になるのかは、わかっていません。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/b067b6f9-574d-cc43-55d1-355ff597bbf1.png)

# 補足

## `//D` オプションについて

「アクティブ デバッグを使用可能にする」オプションです。

よくわかっていません ...

## VS Codeでのデバッグについて

現状、WSHに対応したデバッガー拡張機能は公開されていません。Active Scripting APIに対応し、かつVS CodeとDebug Adapter Protocolで通信するデバッガーを開発すれば、技術的には可能だと思います。~~私はやりませんけど~~

代替案として、`tasks.json` にて `//X` オプションを与えて起動するタスクを構成するのはいかがでしょうか。

```jsonc
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "presentation": {
        "focus": true
    },
    "tasks": [
        {
            "label": "run",
            "type": "shell",
            "command": "cscript",
            "args": [
                "${workspaceFolder}/index.wsf"
            ],
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "debug",
            "type": "shell",
            "command": "cscript",
            "args": [
                "//X",
                "${workspaceFolder}/index.wsf"
            ],
            "problemMatcher": [],
            "group": {
                "kind": "build"
            }
        }
    ]
}
```

タスクを実行するとデバッガー選択ダイアログが出て、Visual Studioに遷移します。ブレークポイントは都度消えてしまいますが、ないよりは良いでしょう。

## デバッグの終了

Visual Studioを閉じると保存を促すダイアログが出ますが、デバッグ対象のコードとは無関係なので破棄して構いません。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/ca39f9e5-f688-0646-5ba8-fd9f7e05dc3c.png)

# 参考

- レジストリを変更することで有効になるという回答ですが、今回は効果がありませんでした。
- Visual Studioをデバッガーとして利用するのではなく、そもそもVisual Studioで編集すれば綺麗に統合できそう

https://stackoverflow.com/a/40151261

- Active Scripting API

https://docs.microsoft.com/en-us/archive/msdn-magazine/2000/december/active-scripting-apis-add-powerful-custom-debugging-to-your-script-hosting-app

- VS Code Debug Adapter Protocol

https://microsoft.github.io/debug-adapter-protocol/
AWSのEC2でMacをつかーう

# はじめに
AWSのEC2でMacインスタンスを立ち上げましょう！クラウドでビルドできるから便利！

# 開発環境
- Windows 10

# 導入
1．macOSを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/4df435e0-d924-5a93-63dd-9cf3430c37b4.png)

2．インスタンスタイプはmac1.metal

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/98772ee0-b7f5-9f05-5ca3-4c50837c5dcf.png)

3．キーペアを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/a049e956-8240-d30a-da03-af27b9f464fc.png)

4．ネットワークの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/3e2e069a-37ee-3ec0-3848-1e0d49f0443b.png)

5．ストレージの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/2d31ae4d-16e6-e809-05d0-e476943c6110.png)

6．インスタンスを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/5f17d7a7-7aaa-778e-051e-dec921c5e5d1.png)

7．専有ホストで起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/dda9e18c-d649-f331-4656-cb6937dee15b.png)

8．失敗
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b2c63af7-5102-391a-d320-e55668f7fb19.png)

9．ホストを作成してからインスタンスを起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/ea57a7a3-1961-8e7b-881a-bc5bd18d81ce.png)

10．キーペア(.ppk）を用いて、PuTTyからログインする
$ login as：ec2-user

11．インバウンドルールを追加しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/75b9e7ac-366a-0c05-cdcf-b56bc7971e31.png)

12．パスワードの変更
$ sudo dscl . -passwd /Users/ec2-user <Password文字列>

13．VNCの設定

$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -access -on -clientopts -setvnclegacy -vnclegacy yes -clientopts -setvncpw -vncpw <Password文字列> -restart -agent -privs -all

14．VNC Viewerから見る

ec2-user
Password

15．入れました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/2a223f1f-bd5f-777b-726d-44ea69be8860.png)

16．使い終わったらホストをリリースしないと、1週間で3万くらいとられる！使ってないのに！

~~~
$1.399 per On Demand MAC1 Dedicated Host Hour 171.000 Hrs $239.23
~~~

# 参考文献

https://writerman.hatenablog.jp/entry/2020/12/02/134905
google-cloud-sdk-cloud-build-localについて理解を深める会

# 概要と環境

全く触れたことのないGCPをやる。
GCP歴1週間のエンジニアです。

環境

```
🤔️ >  uname -a
Linux ubuntuv 5.13.0-41-generic #46~20.04.1-Ubuntu SMP Wed Apr 20 13:16:21 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
```

# gcloud CLI とエミュレーターのインストール

以下を参考にする。
https://cloud.google.com/sdk/docs/install-sdk#linux

>gcloud CLI の最新バージョン（383.0.1）のインストール

の箇所にコマンドの記載がある。

```shell
> curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-383.0.1-linux-x86_64.tar.gz
> tar -xf google-cloud-cli-383.0.1-linux-x86.tar.gz
> ./google-cloud-sdk/install.sh
```

:::note warn
3行目のコマンドで`.bashrc`を使用して`PATH`を追加しているため、**`SHELL`を再起動する**！
:::

```shell
> gcloud --help
```

これで何かが出てくればインストール完了！
次に、以下コマンドで`cloud-build-local`のインストールを行う。

```shell
> gcloud components install cloud-build-local
```

これにて、GCPエミュレーターみたいのがインストールできました！
シェルスクリプトのヒアドキュメント利用における注意点（別ユーザとしてコマンド実行するときなど）

※ 件名がくどいんですが、自分がこういう観点で調べてしまって原因にたどりつくのに回り道をしてしまったので、同じように困っている方が見つけやすいようにこうしています。

## まとめ

- シェルスクリプト内で別ユーザとしてコマンド実行したいときがある
- このとき、複数行をまとめて別ユーザとして実行しようとするときにヒアドキュメントを使うとクォートの仕方によって結果が変わるので注意が必要
- ヒアドキュメントは標準入力ではないことに注意


## 環境
Ubuntu 20.04.4 LTS

## 事例

aaa_userとしてログインしているときに下記コマンドでbbb_userとしてsuし、引数のコマンドを実行するcオプションでコマンドを渡すと、これはbbb_userとして実行されます。当然。

```shell
aaa_user$ su - bbb_user -c "whoami"
# → bbb_user
```

しかし、下記のように実行すると、実行したユーザのまま処理される。


```shell
aaa_user$ sudo su -l bbb_user  <<EOF
echo `whoami`
EOF

# → aaa_user
```

これは、ヒアドキュメントが<del>標準入力ではなく、suされるまでに読まれるためです。</del>標準入力されるためですが、挙動の理由をうまく説明できないので割愛させてください。
（誤解していて誤った内容を書いていました。ご指摘ありがとうございます。また調べて説明できるようになりましたら追記します）
詳しくはこちら [bashのヒアドキュメントを活用する -Qiita](https://qiita.com/take4s5i/items/e207cee4fb04385a9952)

下記のようにシングルクォーテーションで囲むと期待通りに動きます。
ほか、変数などもログインユーザのままわたるので注意が必要です。

```shell
aaa_user$ sudo su -l bbb_user <<'EOF'
echo `whoami`
EOF

# →  bbb_user 
```

### 雑感

これにはまったのは、linuxサーバでのデプロイスクリプトを考えていたときです。
安全にデプロイするためにアプリケーションファイルやデプロイスクリプトなどどういう所有者・権限でやるべきか悩んでいます。

いろんな会社がやっているはずですが、あまりプラクティスが共有されていないように思っています。よいドキュメントや記事がありましたらお知らせください。
テストなどで使う適当なオブジェクトを作成するワンライナー

# 概要

JavaScriptで任意の数のシンプルなオブジェクトを生成します。
テスト等で単純に要素数が必要な場合を想定していて、例えば下記のようなオブジェクトが欲しいケースです。

```js
{
  "key_1": "value_1",
  "key_2": "value_2",
...
  "key_100": "value_100",
}
```

# コード

```js
Array.from({length: 100}, (_, i) => 1 + i).reduce(
  (pv, cv) => Object.assign(pv, {[`key_${cv}`]: `value_${cv}`}), {});
```


# 参考にしたページリンク

- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from
- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
- https://qiita.com/kmagai/items/95481a3b9fd97e4616c9
React用のDebounceHook

連続する呼び出しを無視してくれるDebounce機能を実現したhook

```jsx
import React, {Fragment, useEffect, useState} from 'react';

const MySearch = () => {
    const [inputVal, setInputVal] = useState('')

    const handleInputChange = (event) => {
        setInputVal(event.target.value)
    }

    /**
     * useDebounceカスタムフック
     * @param val
     * @param delay　ミリ秒
     */
    const useDebounce = (val, delay) => {
        const [debouncedVal, setDebouncedVal] = useState(val)
        // Note：useEffect()第 2 引数を指定しないと、毎回のコンポーネントのレンダー後に、第１引数を
        // 実行する
        useEffect(() => {
            const timeout = setTimeout(() => setDebouncedVal(val), delay)
            // useEffectの第１引数を実行する前に、前回のuseEffectでreturnされたfunction
            // を実行する
            return () => clearTimeout(timeout)
        }, [val, delay])
        return debouncedVal
    }

    // キーワード入力して、2秒以上待てば、サーベーに送信する
    const debouncedVal = useDebounce(inputVal, 2000)

    useEffect(() => {
        // 省略：キーワード（debouncedVal）をサーベーに送信して、検索を行う
        // 以下はDebug用
        const time = new Date();
        const nowTime = time.getHours() + "時" + time.getMinutes() + "分" + time.getSeconds() + "秒";
        console.log(nowTime, ':debouncedVal:', debouncedVal)
    }, [debouncedVal])

    return (
        <Fragment>
            {/*検索語を入力すると、サーバーと通信して、検索を行う*/}
            入力欄：<input onChange={handleInputChange} value={inputVal}/>
        </Fragment>
    )
}

export default MySearch
```

ノーマルバージョンのDebounce機能を実現したfunction
```javascript
const debounce = (cb, delay) => {
　　// ポイントはClosureを利用すること
    let timeout
    return () => {
        if (timeout) {
            clearTimeout(timeout)
        }
        timeout = setTimeout(function () {
            cb()
        }, delay)
    }
}

const debouncedFunc = debounce(() => console.log('call'), 2000)
// 下記のコードは同期ですので、一瞬的に実行完了する。Debounce Functionで飾るので、コンソール
// で「'call'」を一つしか表示しない。
debouncedFunc() // #1
debouncedFunc() // #2
debouncedFunc() // #3
// 「timeout#1」は#1を実行する時のtimeout
// #1を実行する時、timeoutはundefined、「if (timeout)」はfalse,timeout#1に値を代入する
// #2を実行する時、「if (timeout)」はtrue、timeoutはclearTimeoutされた,timeout#2に値を代
// 入する
// #3を実行する時、「if (timeout)」はtrue、timeoutはclearTimeoutされた,timeout#3に値を代
// 入する
// 最後はtimeout#3をclearTimeoutされず、残った
```
終わる順番は気にしないから一気に処理を実行させてその結果を返して！

# はじめに

JavaScrip や TypeScript を触っていると避けて通れないのは「非同期処理」です。
よくネット上で見るものは、非同期処理を同期処理のように順番に実行する方法を記載してくれてるものが多いと思います。

こんな感じ。
``` _.js
async function sample(){
  await axios.get("/api/test1").then(function (response) {
    ...
  });
}
```

もしこの状態でAPIが複数に増えた場合、処理速度はどんどん伸びてしまいます。
``` _.js
async function sample(){
  await axios.get("/api/test1").then(function (response) {
    ...
  });

  await axios.get("/api/test2").then(function (response) {
    ...
  });

  ...
}
```

そうではなく、「/test1」と「/test2」の終わる順番はどうでもよいから、並列で一気に実行してほしい。
というのが今回の目的です。

# イメージ

このようなイメージでAPIの並列実行を行いたいということです。
![スクリーンショット 2022-05-19 13.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211927/0233eee9-7471-a0a1-d40f-987ee4cf495d.png)

# 実装
これを可能にするのが「Promise.all」を使うことで可能になります。

``` _.js
async function sample() {
    const api_array = ["/api/test1", "/api/test2"];
    const response_array = await Promise.all(api_array.map(api => axios.get(api)));

    response_array.map(response => {
        ...
    });
  })
}
```

自分自身、忘れないように...
Kali Linux2022.1 でハッキングラボをつくってみる9 無線LANへのハッキング４ ランダムMACアドレスの無効化とMACアドレスの変更

# はじめに　-ランダムMACアドレスとは
公衆Wifiなどにおいて、MACアドレスから個人が所有するクライアントが追跡されないようにするために、クライアントがランダムなMACアドレスを生成・運用する機能。
一部の無線LANへの攻撃では、不都合な機能なので、これを無効化する。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# 無効化
ファイル"/etc/NetworkManager/NetworkManager.conf"に以下の内容を追記する。
```conf:/etc/NetworkManager/NetworkManager.conf
[device]
wifi.scan-rand-mac-address=no
```
追記したあと、`sudo systemctl restart NetworkManager`を実行する。

# 任意のMACアドレスへの変更
ランダムMACアドレスを無効化したうえで、好きなMACアドレスに永続的に変更・設定する。

## 現状のMACアドレスの確認 
```
ifconfig wlan0
//または
iw dev wlan0 info
//または
macchanger -s wlan0
```

## インターフェースの無効化
```
sudo ifconfig wlan0 down
//または
sudo ip link set wlan0 down
```

## MACアドレスの変更

### MACアドレスをランダムなMACアドレスに変更
```
sudo macchanger -r wlan0
```
### ベンダーIDを変更せずにランダムなMACアドレスに変更
```
sudo macchanger -e wlan0
```
### 変更したいMACアドレスを指定する
```
sudo macchanger --mac=11:22:33:44:55:aa wlan0
```
### デフォルトのMACアドレスに変更
```
sudo macchanger -p wlan0
```
# おわりに
参考にしたもの
「ハッキング・ラボのつくりかた」

https://www.ntt-bp.net/column/blog/2021/12/post-64.html
YubinBangoが動作しない方へ送りたい言葉（使用方法）

初めまして。
都内でエンジニアをしているみっちーです🙋
今回は住所の自動入力に[Yubinbango](https://github.com/yubinbango/yubinbango)を使用して行き詰まったので、そのことについてまとめていきます。

# 内容
「郵便番号を入力したら住所が自動入力されるライブラリ[Yubinbango](https://github.com/yubinbango/yubinbango)を導入した。
ドキュメント通りに導入したが、なぜか自動入力が反応しない。困ったもんだ」
という内容です。

# 原因
フォームが動的な挙動をしていることが原因です。
[ライブラリ](https://yubinbango.github.io/yubinbango/yubinbango.js)を見るとわかりますが、自動入力の関数はDOMContentLoaded時に呼び出されます。
動的なページの場合はhtmlの読み込みが完了しないため、（もしくは対象の要素が表示されていないため）関数が発火されない可能性があります。

>DOMContentLoaded :
>最初の HTML 文書の読み込みと解析が完了したとき、スタイルシート、画像、サブフレームの読み込みが完了するのを待たずに発生します。

# 対策
別で関数を呼び出してあげましょう。
住所の自動入力をしたいページでライブラリを読み込んだ後に
```new YubinBango.MicroformatDom();```
を実行すると動的なフォームでも動作します。
ですが、ライブラリの直変更はやめましょう🈲

# さいごに
住所の自動入力はとても便利です。
住所の入力がめんどくさくて離脱するユーザーを減らすことができますので自動入力ライブラリの導入は必須かと思います🙆
しかし、後から変更する場合はDBの変更が必要になったり、バリデーションの修正が必要になったりと影響範囲が大きくなりますので最初の段階でしっかり考えて実装することが大事だと感じました。
以下、参考記事です。

https://pinzolo.github.io/2017/03/15/yubinbango-with-turbolinks.html
https://github.com/yubinbango/yubinbango/issues/15
CloudFlareというサービスを試す(4) DIFF表示ツール

# はじめに
前記事(1)～(3)で理解したことを踏まえて、CloudFlareを利用したツールを1つ作ってみた。
興味のある方は使ってみて欲しい。

# ツール説明

## DIFF表示ツール
サーバ上でdiffコマンドで差分を見るときに、量が多いと見るのは大変ですよね。
差分を他の人にも見てもらおうとすると、情報共有大変ですよね。
そんな時に使えるツールです。

### 使い方
1. サーバ上でdiffコマンドで差分(unified diff)を出してそれをツールに投げる
2. 結果としてURLが返るので、それをブラウザで開くと差分が見れる

```shell
## example
$ diff -u aaa.txt bbb.txt \
| curl --data-binary @- https://tools-app.donraku.workers.dev/diff/put
```
:::note info
情報は3時間で消えるようになってます。
:::

### 使用例
フォルダaとbを比較する例。diffすると以下の出力になるとする。

```
$ diff -u a b
diff -u a/hello.html b/hello.html
--- a/hello.html        2022-05-19 18:11:18.000000000 +0900
+++ b/hello.html        2022-05-19 18:12:30.000000000 +0900
@@ -1,8 +1,7 @@
 <html>
 <head>Hello</head>
 <body>
-Hello World!!<br>
-Hello World!!<br>
+Hello Japan!!<br>
 Hello World!!<br>
 </body>
 </html>
\ ファイル末尾に改行がありません
diff -u a/hello.js b/hello.js
--- a/hello.js  2022-05-19 18:08:25.000000000 +0900
+++ b/hello.js  2022-05-19 18:13:03.000000000 +0900
@@ -1,5 +1,5 @@
-document.writeln('Hello, World!');
-document.writeln('Hello, World!');
-document.writeln('Hello, World!');
-document.writeln('Hello, World!');
+document.writeln("Hello, World!");
+document.writeln('Hello, Japan!');
+document.writeln('Hello, World!')
+document.writeln('Hello, Japan!');
 document.writeln('Hello, World!');
diff -u a/hello.php b/hello.php
--- a/hello.php 2022-05-19 18:09:30.000000000 +0900
+++ b/hello.php 2022-05-19 18:13:33.000000000 +0900
@@ -1,6 +1,6 @@
 <?php
+echo     "Hello, World！";
+echo "Hello, USA！";
 echo "Hello, World！";
-echo "Hello, World！";
-echo "Hello, World！";
-echo "Hello, World！";
+echo "Hello, Japan！"
 echo "Hello, World！";
diff -u a/sample.csv b/sample.csv
--- a/sample.csv        2022-05-19 18:06:24.000000000 +0900
+++ b/sample.csv        2022-05-19 18:14:11.000000000 +0900
@@ -1,4 +1,4 @@
-りんご,4
-みかん,2
-バナナ,3
+りんご,1
+いちご,2
+バナナ,7
 キウイ,7
```

そこで、これをDIFF表示ツールに投げる。

```shell
$ diff -u a b \
> | curl --data-binary @- https://tools-app.donraku.workers.dev/diff/put
https://tools-app.donraku.workers.dev/diff/get/a4b0f8a09fda55029b00053b9c11dcea711ffddfb0a3d391c03399ae29ecb299
```

表示されたURLにブラウザでアクセスすると差分が見れる。
見やすい！

https://tools-app.donraku.workers.dev/diff/get/a4b0f8a09fda55029b00053b9c11dcea711ffddfb0a3d391c03399ae29ecb299

↑サンプルとしてデータは残しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273897/64a235ff-79c9-0587-ea5a-15f52e8848c3.png)

以上です。
Basic認証をRailsアプリに導入する方法

 ## authenticate_or_request_with_http_basicメソッド
ブロック内部でusernameとpasswordを設定し、任意の値を決めて実装します。
下記の例では、usernameに「test」、passwordに「1111」を指定しています。
```ruby
authenticate_or_request_with_http_basic do |username, password|
  username == 'test' && password == '1111'
end
```
## Basic認証をRailsアプリに導入する
メソッドをコントローラーのprivateに定義し、before_actionで呼び出します。
```ruby
before_action :basic_auth

private
def basic_auth
  authenticate_or_request_with_http_basic do |username, password|
    username == 'test' && password == '1111'
  end
end
```
上記の記述によって、アクセスした際にBasic認証が要求されるようになります。