OmniAICreator/Qiita-1.07M huggingface dataset:
Mac版とWindows版のTableau Desktopで自在に編集する

Tableauワークブックを使い回そうとすると、ファイルの参照が絶対パスになっているために困ることがあります。（データベースを使っていれば、そういう困りごとはないのですが、ファイルを扱わざるを得ないことが多く…）
私はファイルの共有にはGoogleドライブとDropboxを使っていて、同じOSであれば絶対パスでも困りませんが、私の場合MacとWindowsを同程度に使っていてTableau　DesktopもMacとWindowsを同程度の頻度で利用していますので、絶対パスの問題はなかなか厄介です。

本稿では、この厄介な絶対パスへの私の対処方法を説明したいと思います。

## 1. データソースを編集する
Tableauワークブック（.twb）はXMLファイルですので、テキストエディタで開けば内容が分かります。Macで作成したTableauワークブックであれば、以下のようになっています。
```
  <datasources>
    <datasource caption='注文 (サンプル - スーパーストア)' inline='true' name='federated.02vscbq117cuqm13jg2oe0hlb921' version='18.1'>
      <connection class='federated'>
        <named-connections>
          <named-connection caption='サンプル - スーパーストア' name='excel-direct.04i5mcf1h7tdsj16aoohi0pyzih1'>
            <connection class='excel-direct' cleaning='no' compat='no' dataRefreshTime='' filename='/Volumes/Google Drive/マイドライブ/ソフトウェア/Tableau/DATA Saber/Datasources/サンプル - スーパーストア.xls' interpretationMode='0' password='' server='' validate='no' />
          </named-connection>
        </named-connections>
```
Googleドライブに置いてあるファイルを「/Volumes/Google Drive/マイドライブ/ソフトウェア/Tableau/DATA Saber/Datasources/サンプル - スーパーストア.xls」のように参照していますので、このままではWindows版で開けません。
![Datasource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620713/65d83260-dcd8-e42c-fa23-ddefa92d6979.png)
上記のダイアログで「はい」を選択してファイルを選ぶか、あとからデータソースを編集すればワークブックを使えるようになります。

ただ、毎回データソースを差し替えるのは面倒なので、頻繁にMacとPCを切り替えて使う場合にはTableau Cloud (旧Tableau Online)を使っています。

## 2. Tableau Cloudを介して編集する
データ抽出した上でTableau CloudまたはServerにワークブックをパブリッシュします。
このとき、データソースを個別にパブリッシュするのがポイントです。

Web画面からTableau Desktopを起動します。以下は、Windows版の場合です。
![Datasource-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620713/3e6e54ec-216a-f0e8-31a5-730efec12337.png)

メニューから「Tableau Desktopで編集」を選択すると、Tableau Desktopが起動します。ただし、「データソース」タブを選択すると、ファイルの在処を尋ねられます。

Web編集でワークブックを編集することも可能ですが、Tableau DesktopアプリとWebではできることが案外異なるため、やはりTableau Desktopアプリを使う方が便利です。

## 3. Tableau Cloudからワークブックをダウンロードして編集する
上記スクリーンショットのメニューから「ダウンロード」を選択すると、Tableauワークブック（.twb）をダウンロードできます。データソースとしては、Tableau Cloudの抽出ファイルが用いられます。

## Tableau Cloudを積極的に活用しよう
日常的にTableauを使っていると、ワークブックやデータソースが散らばって収拾が付かなくなってきます。一区切りついたときにTableau Cloudにパブリッシュするようにすると、きちんと整理できます。さらに、[Tableau Mobileアプリ](https://www.tableau.com/ja-jp/products/mobile)が使えるのもいいところです。
Laravel 404 デフォルトデザインを簡易的に変更する

# laravel 404 のデフォルトのデザインを変更する


## 404って何？？？　→HTTP例外のこと
サーバーからのHTTPエラーコードを表す例外もあるってことで。。
たとえば、「ページが見つかりません」エラー(404)、「不正なエラー」(401)などがあります。
Laravelでアプリケーションのどこからでもこのようなレスポンスを生成したい場合は、
abortヘルパを使用できます。

abort(404);

## Laravelではデフォルトの404のページを変更する方法
```php
php artisan vendor:publish --tag=laravel-errors
```
を記述してコマンドを叩く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601680/3fbff4b1-e417-7606-ceaa-82c5ac460ac4.png)
になればOK。
→一応意味はそのまま。
venderフォルダのExceptionをresources/errorsに移すという意味。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601680/0b4d6fa8-dd65-3b7c-2c92-6c8fabbfcea6.png)
が作成される。

404.blade.phpを確認しすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601680/13de39f2-2acd-2d6c-2f8e-c4181bf95e31.png)
となっているのでここのminimalの部分をillustrated-layoutなどにするとレイアウトを簡単に変更できる。
（＊ここではレイアウトのカスタマイズは省略します）
VSCマニュアル

# インストールしたパッケージ
マーケットプレイスの検索ボックスで以下検索してインストール

・japanease
・docker
・sftp

# FTP設定
## 1 「SFTP」をインストール
マーケットプレイスの検索ボックスで「SFTP」で検索してインストール

![2022-05-03_00h25_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651309/ee0682ca-39e7-1438-5408-df63288048fb.png)

## 2 コマンドパレットからsftp起動
表示 > コマンドパレット > sftp
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651309/70809de5-855b-c392-53ff-806c8342a6d0.png)

## 3 sftp.jsonを適切に入力

```php:sftp.json
{
    "name": "My Server",
    "host": "localhost",
    "password": "password",
    "protocol": "sftp",
    "port": 22,
    "username": "username",
    "remotePath": "/",
    "uploadOnSave": true
}
```

# メモ

自IP制御

```php:自宅wifi
$_SERVER['REMOTE_ADDR']=='119.243.239.100'
```
「Command CompileSwift failed with a nonzero exit code」を乗り越える

![スクリーンショット 2022-05-03 0.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7b36a943-fecc-924d-5032-26bdf164c45c.png)
# いろいろな原因があるっぽい
https://qiita.com/Hyperbolic_____/items/e6f2f82acd559f6e1c79

https://qiita.com/Kyome/items/67da66563fc15d48699e

https://qiita.com/wagatsuma1999pra/items/cdc08e2913d89e62b747

解決策で多かったのは
- Clean Build Folder
- XCodeの再起動
- /Library/Developer/Xcode/DerivedDataの削除
- Simulator再起動
- アプリをアンインストール

こんなところでしょうか

# 他のエラーとの違い
エラー文に明確な原因が書かれていない

# 原因と解決策を探す
赤い色のエラー文に目がいきがちですが原因は白い文字で書かれてました。
いやぁ、わかりにく〜

![スクリーンショット 2022-05-03 0.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ef3ff8cc-95ca-9e74-0752-d1ec644e4acf.png)
「同じ名前のファイルが存在してるぞ！」
めっちゃ苦戦したエラーでしたがこんなに単純な原因でした
Flutterでバーコードをスキャンする (2022/05/02)

# はじめに
Flutterでバーコードスキャンをする方法はbarcode_scanパッケージを使用しますが、2022年現在ではbarcode_scan2を使用するようになっています。最新の方法が検索しても載っていなかったので備忘録。


# 1. プラットフォームの設定
iosとAndroidでカメラを使用する設定をします。
以下の二つのファイルに追加します。

* Android

```android/app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="~~~~~~~~~~~~~~~~~~~~~~~~">
    <uses-permission android:name="android.permission.CAMERA" />
...
```
manifestタグの直下。おそらく3行目くらい

* ios

```ios/Runner/Info.plist
<dict>
...
    <key>NSCameraUsageDescription</key>
    <string>Camera permission is required for barcode scanning.</string>
...
</dict>
```
<dict>タグ内。タグのすぐ下がわかりやすい

# 2. パッケージの設定
プロジェクトに読み込ませるパッケージを指定します。
ここが主に以前の方法と違います。２になってます。

```pubspec.yaml
dependencies:
...
    # https://pub.dev/packages/barcode_scan2
    barcode_scan2: any
...
```

ここを書いたらパッケージを更新しましょう。
ターミナルで以下のコマンドを入力します。

```terminal
flutter packages get
```

バージョン関係のエラーが出たら多分これなんで以下を書き換える。詳しくは参考のサイトを見てください

```android/app/build.gradle
defaultConfig {
...
    minSdkVersion 18
...
}

```

# 3. import
以下の二つをインポートします。

```dart
import 'package:barcode_scan2/platform_wrapper.dart';
import 'package:flutter/services.dart';
```

# 4. スキャン

以下の関数をボタンを押したときにせってするとスキャンされます
readDataにはスキャンの内容、typeDataにはバーコードの種類が格納されます。

```dart
String readData = "";
String typeData = "";

Future scan() async {
  try {
    var scan = await BarcodeScanner.scan();
    setState(() => {
      readData = scan.rawContent,
      typeData = scan.format.name,
    });
  }
  on PlatformException catch (e) {
    if (e.code == BarcodeScanner.cameraAccessDenied) {
      setState(() {
        readData = 'Camera permissions are not valid.';
      });
    }
    else {
      setState(() => readData = 'Unexplained error : $e');
    }
  }
  on FormatException{
    setState(() => readData = 'Failed to read (I used the back button before starting the scan).');
  } catch (e) {
    setState(() => readData = 'Unknown error : $e');
  }
}
```

ちなみにボタンへの設定方法はScaffold内のfloatingActionButtonの方法を例とします。

```dart
floatingActionButton: FloatingActionButton(
  onPressed: scan,
  tooltip: 'QR SCAN',
  child: Icon(Icons.add),
), 
```


# 参考

https://qiita.com/fukuit/items/29651dcdd20f1aacd4fb

https://swamptk.hatenablog.com/entry/2020/01/18/121850

https://www.reddit.com/r/FlutterDev/comments/mtyeam/barcode_scan2_was_reborned_with_sound_null_safety/
セッションフィクセーション とは

## 勉強前イメージ

セッションIDを固定化するやつって [ここ](https://qiita.com/miyuki_samitani/items/51f7f5753b78ec4c5461) でやったけどそれ以外わからん

## 調査

### セッションフィクセーション とは

英語で session fixation と書き、セッションハイジャックの手法の一つです。
webサイトの正規ユーザのセッションIDを乗っ取って、なりすます攻撃手法になります。
正規ユーザはwebサイトのログインする際にセッションIDを発行しますが、
悪意ある攻撃者がwebサイトからセッションIDを取得、正規ユーザに対して強制的にセッションIDを取得させるトラップを仕掛けて
正規ユーザがログインを行うと、乗っ取りが可能になりなりすましが成立します。

### セッションフィクセーションの対策

- [サーバ側] ログイン後にセッションを新規に作成

セッションフィクセーションはログイン時のセッションを固定化する攻撃なので、
ログイン後にセッションIDを再度発行することで対策が可能になります。
攻撃者が用意したIDと別のIDに変わればなりすましができなくなります。

- [サーバ側] セッションID以外に認可した証明の情報を付与

セッションID以外に別の鍵のようなものを用意することでなりすましを防止することができます。
例えばセッションIDを使われたとしても、もう一つ鍵を用意できなければなりすますすることができません。

- [ユーザ側] 不審なURLをクリックしない

セッションフィクせーションは攻撃者が用意したセッションIDが含まれたURLをクリックされることから始まるので
そもそも不審なURLはクリックせずに公式サイトから直接ログインするようにすることが対策になります。

## 勉強後イメージ

セッションを取られたとしても、再度サーバ側で付与することで乗っ取りできないようにするのか。。。

## 参考

- [セッション・フィクセーション](https://appswingby.com/security-glossary/session-fixation/)
- [セッションID固定化攻撃とは？仕組みから対策方法まで徹底解説](https://cybersecurity-jp.com/column/34700)
echoコマンドのエスケープシーケンスのメモ

gitのpre-commitスクリプトを書いている時に出てきた
`echo -e $'〇〇'`
のような記述が、参考記事によく出てきました。

`$'`ってなんだ？ってなったので、ちょっと調べてみました。

### コンソール上での実行結果
```bash:実行結果
$ echo -e 1行目\\n2行目\\n3行目
1行目
2行目
3行目

$ echo -e '1行目\\n2行目\\n3行目'
1行目\n2行目\n3行目

// これがよく見るパターンですかね
$ echo -e $'1行目\\n2行目\\n3行目'
1行目
2行目
3行目

$ echo -e "1行目\\n2行目\\n3行目"
1行目
2行目
3行目

$ echo -e $"1行目\\n2行目\\n3行目"
1行目
2行目
3行目
```

### まとめ
シングルクォーテーション：　エスケープせず、そのまま表示する。
それ以外は、エスケープする。

`$'~'`はエスケープさせるために、$を前につけているんだね！！

ちなみに`-e`はエスケープを有効にするオプション。
だけどシングルクォーテーションで囲った文字列はそのまま出力される。

よって$をつけるとことでエスケープするようにしているのですね。
文字色とかを設定するために必要になるので。

文字色についてはまた別途実行結果をまとめたいと思います。
まとめないと何が何やらわからんので。。。
はじめてのQiita ＜投稿編＞

プログラムを仕事や趣味で使うようになり数年経ちましたが、Qiitaの記事は読みこそすれ、投稿したことはありませんでした。
記事投稿の練習がてら、Qiitaの記事作成に関して調べたことをまとめます。
マークダウン記法のコツみたいなテクニカルな話ではなく、お作法の基本の「き」の内容です。


# そもそもQiitaって何
>Qiitaは、エンジニアに関する知識を記録・共有するためのサービスです。

どうやら天気の話や晩御飯の献立を綴るブログではなく、エンジニアに関する記事を書く場のようです。

さらにはガイドラインによると、
>エンジニアが興味を持つものではなく、エンジニアに有益な情報をもたらす記事を投稿しましょう。

とありますので、技術的であっても無益な記事ではいけないようです。
他ユーザの記事との内容重複は特に咎められていないので、自分の言葉で書く分には良さそう？

書いた記事にはコメントが寄せられ、記事を読んでくれた人々と意見の交流ができそうです。
また、「編集リクエスト」が送られることもあり、記事の作者とは別の視点から情報の精度を高めることもできるようですね。


# どんな記事を書けばいいの
有益な情報をもたらす記事となると、初学者の自分には何も書けないのではと思ってしまいますが、
投稿されている他の方の記事を眺めているともう少し柔軟に考えてもよさそうです。

下記のような記事をよく見かけます。
- 環境構築の備忘録
- 読んだ本の要約
- 参考になったサイトの紹介
- 自分用のチートシート etc...

Qiita公式から記事執筆に関してのガイドラインも公開されていますので、投稿を初める前に一読したほうが良さそうです。

https://help.qiita.com/ja/articles/qiita-article-guideline

また、いくら有益な情報とは言え引用の用法を誤るとマナー違反や著作権侵害にあたる場合があるので、下記には注意したいですね。
- 引用元、参考元の明記
- ネット記事や技術書の内容を丸々コピペしない
- 記事の大部分を引用が占めるとそれはもう引用じゃない

[「tag:Qiita」で検索をかける](https://qiita.com/search?sort=&q=tag%3Aqiita)とQiitaの利用法についてのあれやこれが見つかったりもするので、
ここからも執筆・投稿に役立つ情報を探せそうですね。


# 結び
ひとまず肩肘張らずに、技術的なあれやこれを自分で試した際はここに記事として書いてもいいのかなと感じました。
このような質と量の記事でもうんうん唸りながら二時間はかかったので、だんだん慣れていけばいいですね。

次回があることを祈りつつ、今回はここまでとします。
最後まで見ていただきありがとうございました。

# 参考
[Qiitaとは - Qiita](https://qiita.com/about)
[良い記事を書くためのガイドライン | Qiita Support](https://help.qiita.com/ja/articles/qiita-article-guideline)
100日後くらいに個人開発するぞ！day014

## 今日はフッターを作ってヘッダーを固定した！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/d611f6f2-8b8d-7dc4-cc1e-c3eacea8c52c.png)


## HTML＆CSS学習レッスン中級編を修了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/ade3fb3d-004a-f102-e943-c98cccab4abb.png)


## 今日の学び
### 要素を固定する方法
- `position: fixed;`を用いると常に要素を画面上の指定した位置に固定できる
    - 固定する位置はtop・left・right・bottomを使って指定する
    - 例：imgを左上から10px下で20px右の位置に固定したい場合
        - `img{`
            - `position:fixed;`
            - `top:10px;`
            - `left:20px;`

### 要素の重なり順を指定する方法
- z-indexプロパティで要素の重なりの順序を指定できる
- 整数値で指定して値が大きいほど上に表示される
    - 例：`<header>`の重なり順を10に指定する場合
        - `header{z-index:10}`
- z-indexプロパティは必ずpositionプロパティと併用する必要がある
[Python実践]argparseに挑戦してみよう！《add_subparsers編》

# はじめに

今回はPythonの「**argparse**」の基礎と「**parse_args**」と「**add_subparsers**」の使い方について解説していこうと思います！

第１弾と第２弾はこちら！

https://chaldene.net/argparse-argumentparser

https://chaldene.net/argparse-addargument

「**argparse**」はコマンドライン引数を渡してくれるもので、Pythonエンジニアを目指している方は知っておいた方が良いものになります。

ぜひこの記事でマスターしていってください！

この記事はPythonの公式ドキュメントを参考にしています。

Pythonに限らず、プログラミング言語の公式ドキュメントは非常に読みにくいので、この記事でわかりやすく解説していきます。

「**argparse使ってみたい**」

「**コマンドライン引数を渡してみたい**」

「**argparseって何？**」

「**自作モジュール作ってみたい**」

「**他の人が書いたコードでargparseの部分がわからない**」

このような人のお役に立てれば幸いです。

それでは早速本題に入っていきましょう！

::: note warn
「argparse」はPythonの基礎を理解していないと難しいので、Pythonの基礎を理解していない人は以下を参考に学習してください！
:::

https://chaldene.net/python-book

# 概要

まずはargparseについて説明していきましょう。

argparseは一言で言えば以下のようになります。

::: note
コマンドライン引数を渡せる。
:::

これではよくわからないですよね。

「**コマンドライン引数**」とは、以下のようにPythonファイルを呼び出す際に渡せる値のことです。

```python
python main.py --n cardene --age 30
```

少し詳しく説明すると、`--nはname`で今回は**cardene**を渡しています。

`--age`は**30**という値を渡しています。

```python
def user_profile(name, age):
    print(name)
    print(age)
```

こんな感じの関数があったとして、**cardene**が`name`引数に、**30**が`age`に渡されるということです。

どうでしょうか理解できたでしょうか？

このように引数が指定されることで、ユーザーごとにカスタムして使えるようにになります。

僕自身Pypiに自作モジュールをあげたことがあります。

https://pypi.org/project/comnamepy/

このモジュールもterminalでも使用することができ、その際には「コマンドライン引数」を渡す必要があります。

この記事ではその方法を学んでいきます。

「コマンドライン引数」を設定する際、結構細かく設定できるのでぜひ全てマスターしていってください！

# parse_args

## 概要

::: note
渡された引数と値の解析。
:::

**コマンドライン引数**とそれに紐づく値を解析して、適切にリストに格納してくれます。

`parse_args`にも指定できるいくつかの引数があるので確認しましょう。

::: note
- args
    - 解析する文字列のリスト。
- namespace
    - 属性を代入するオブジェクト。
:::

「**百聞は一見に如かず**」ということで早速１つ１つみていきましょう。

## args

::: note
「コマンドライン引数」とそれに紐づく値のリスト。
:::

**パーサー**に渡したい**コマンドライン引数**とその値の組みをリストにしたものです。

```python
args = parser.parse_args(["cardene", "--age=10"])
```

このように指定できます。

**位置引数**は特に**コマンドライン引数名**を指定せず、**オプション引数**のみ指定します。

```python
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('name', help='username')
parser.add_argument('--age', type=int, help='user age')

args = parser.parse_args(["cardene", "--age=10"])

print(args)
```

８行目で先ほどと同じように指定していますね。

terminalで`python main.py cardene --age 10`と実行してください。

```python
Namespace(name='cardene', age=10)
```

ちゃんと自分が指定した通りに出力されていますね。

# 続き

これより先は以下の記事にまとめています。

https://chaldene.net/argparse-parseargs

より詳しく**add_subparsers**について学ぶことができるので、興味がある方はぜひ！
（もちろん無料です！）
素数判定をしてくれるDiscordBotをつくる。

https://gafuburo.net/how-to-discordbot/

https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f

https://qiita.com/zaq9/items/c5031649f4cd5fa247cb

```Python
import discord
from sympy import sieve

TOKEN = '' # TOKENを貼り付け
CHANNELID = 00000000000000 # チャンネルIDを貼り付け

client = discord.Client()

@client.event
async def on_ready():
    print('ログインしました')

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        print(message.content)
        if str(message.content).isdigit():
            await channel.send(int(message.content) in sieve)

client.run(TOKEN)
```
Javascript_クラスを作る

# はじめに
Javascriptでクラスの作り方を学んだのでメモ。<br>継承の考え方がしっくりこなかったので殴り書き
## 内容
```javascript:Messageクラスを作る
class Message {
    //↓コンストラクタに情報を設定する。
    constructor(title, text) {
      this.title = title;
      this.text = text;
    }
    //↓メソッドでアクションを設定する
    success() {
      console.log("正常に投稿されました。");
    }
    
    info() {
      this.success();
      console.log(`タイトルは${this.title}です。`);
      console.log(`内容は「${this.text}」です。`);
    }
  }
  
  const testmessage = new Message("test", "配信テスト。本文はここに表示されます。");
  testmessage.info();
```
実行結果：
`タイトルはtestです。`
`内容は「本文はここに表示されます。」です。`

```javascript:Messageクラスを継承してAlertMessageクラスを作る
class Message {
    constructor(title, text) {
      this.title = title;
      this.text = text;
    }
    
    success() {
      console.log("正常に投稿されました。");
    }
    
    info() {
      this.success();
      console.log(`タイトルは${this.title}です。`);
      console.log(`内容は「${this.text}」です。`);
    }
}

class AlertMessage extends Message {
    alert(){
      console.log("注意：これは開発者向けのメッセージです。");
    }
    
    info(){
      this.alert();
      console.log(`タイトルは${this.title}です。`);
      console.log(`内容は「${this.text}」です。`);     
    }
}

const message = new AlertMessage("test", "本文はここに表示されます。");
message.info();
```
実行結果：
`注意：これは開発者向けのメッセージです。`
`タイトルはtestです。`
`内容は「本文はここに表示されます。」です。`
Specification of Identity and Access Management, No.900, AUTOSAR 21-11 (20) AP

Specification of Identity and Access Management, No.900, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/adaptive/21-11/AUTOSAR_SWS_IdentityAndAccessManagement.pdf


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

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

# 用語(terms)

|Abbreviation / Acronym| Description|
|:--|:--|
|PDP| Policy Decision Point|
|PEP| Policy Enforcement Point|
|IPC| Inter-Process Communication|

## 英日
日本語は仮訳

|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|101|the|その|
|2|58|and|と|
|3|54|of|の|
|4|45|to|に|
|5|38|a|一つの|
|6|30|access|接続|
|7|29|management|管理|
|8|28|autosar|AUTomotive Open System Architecture(短縮名)|
|9|26|functional|機能的|
|10|25|be|です|
|11|24|for|にとって|
|12|22|an|と|
|13|21|specification|仕様|
|14|20|identity|識別|
|15|19|shall|しなければならない|
|16|18|application|応用|
|17|18|in|の|
|18|17|s|s|
|19|16|document|資料|
|20|15|by|に|
|21|15|cluster|集まる|
|22|13|adaptive|適用|
|23|13|iam|わたし|
|24|13|is|です|
|25|13|model|模型|
|26|13|r|r|
|27|13|runtime|実行時|
|28|12|e|e|
|29|12|policy|政策|
|30|11|api|application programming interface(短縮名)|
|31|11|grant|許す|
|32|11|release|開放|
|33|10|ap|adaptive platform(短縮名)|
|34|10|id|identifier, 識別子(短縮名）|
|35|10|or|また|
|36|9|are|です|
|37|9|autosar_sws_identityandaccessmanagement|autosar_sws_identityandaccessmanagement|
|38|9|implementation|実装|
|39|9|point|点|
|40|9|this|これ|
|41|8|dependencies|依存関係|
|42|8|deployment|展開|
|43|8|enforcement|執行|
|44|8|g|g|
|45|8|interfaces|界面|
|46|8|no|いいえ|
|47|8|not|でない|
|48|8|pdp|Policy Decision Point（短縮名）|
|49|8|process|処理する|
|50|7|any|どれか|
|51|7|applications|応用|
|52|7|concept|概念|
|53|7|design|設計|
|54|7|integrator|積分器|
|55|7|interface|界面|
|56|7|other|他の|
|57|7|pep|Policy Enforcement Point(短縮名)|
|58|7|platform|土台|
|59|7|that|それ|
|60|7|work|仕事|
|62|6|ara|AUTOSAR Runtime for Adaptive Applications(短縮名)|
|63|6|elements|要素|
|64|6|modeling|模型化|
|65|6|service|奉仕|
|66|6|specific|明確|
|67|5|as|なので|
|68|5|available|利用可能|
|69|5|clusters|房|
|70|5|designer|設計者|
|71|5|entities|実体|
|72|5|from|から|
|73|5|have|持ってる|
|74|5|instance|実例|
|75|5|may|かもしれない|
|76|5|only|それだけ|
|77|5|port|港|
|78|5|related|関連している|
|79|5|requirements|要件|
|80|5|specified|指定|
|81|4|assumptions|仮定|
|82|4|can|できる|
|83|4|content|内容|
|84|4|cycle|周期|
|85|4|decision|決断|
|86|4|each|各|
|87|4|i|私|
|88|4|if|もしも|
|89|4|into|の中へ|
|90|4|its|これは|
|91|4|itself|自体|
|92|4|life|生活|
|93|4|manifest|管理票|
|94|4|means|意味|
|95|4|operating|操作|
|96|4|perspective|視点|
|97|4|points|点|
|98|4|unix|UNIX|
|99|4|using|を使用して|
|100|4|will|意思|


# 参考資料(reference)
[1] Glossary, AUTOSAR_TR_Glossary, 
https://www.autosar.org/fileadmin/user_upload/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
[2] Requirements on Identity and Access Management, AUTOSAR_RS_IdentityAndAccessManagement
Kali Linux2022.1 でハッキングラボをつくってみる 6　Windows10をハッキングする7 マクロを悪用したマルウェア

# はじめに
「ハッキング・ラボのつくりかた」(IPUSIRON著)P.352-354を参考にした記事です。
~~マクロの実行は、ホストOSであるFerenOSのEdgeブラウザで、OneNoteのExcelにアクセスして行った。~~
訂正
OneNoteのExcelでは、マクロの実行はできませんでした。誤った記述を長い間放置していたことをお詫びします。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# MacroShopのインストール・・・
MacroShopは、MS Officeのマクロ機能でペイロードの実行を支援するスクリプトを集めたもの。
次のコマンドでインストール
```shell-session:/home/kali/
git clone https://github.com/khr0x40sh/MacroShop.git
cd MacroShop/
./macro_safe.py
```

## 実行してエラーが出たら
MacroShopはpython2で記述されているらしく、コマンド`./macro_safe.py`を実行してもprint関数についてのエラーが出る。
(このコマンドによって、macro_safe.pyの実行で呼び出されるのはpython3である。コマンド ``file `which python` `` で確認すると、最新のKaliLinux2022.01では`python`は`python3`のシンボリックリンクとなっている。)
エラー回避のためには、

1. python2を利用する
1. 手作業でファイルを書き換える
1. `2to3`コマンドを使って書き換える

以上の３つのどれかを行う必要がある。

### 1.python2を利用する
1が今の時点では無難。ただし、KaliLinuxでpython2をサポートしなくなったら困ることになる。
python2を利用してMacroShopを実行するには、

```
python2 macro_safe.py
```
を実行する。
あるいは、macro_safe.pyの１行目の
```python:macro_safe.py
#!/usr/bin/python
```
を
```python:macro_safe.py
#!/usr/bin/python2
```
と書き換えたあと、
```
./macro_safe.py
```
とスクリプトを実行する

### 2.手作業でファイルを書き換える
2は面倒だが、今回のmacro_safe.pyファイルは行数が111行と少ないので、非現実的ではない。ただし、python2とpython3の文法の相違点を頭に入れている必要がある。スクリプトキディにとっては難易度が高いものとなる。

書き換え内容は次通り。
- ファイル内の`print 変数`を`print (変数)`に置き換える。print関数で出力する変数をかっこで囲む。
- 19行目の
```python:mascro_safe.py
for i in xrange(54, len(instr), 48):
```
を
```python:mascro_safe.py
for i in range(54, len(instr), 48):
```
に書き換える。

完了したら、`./macro_safe.py`を実行して確かめる。

### 3.`2to3`コマンドを使って書き換える
3は、2で行うプロセスを自動化するプログラムを利用するもの。
簡単に利用できるが、出力結果が必ずしも信用できるかどうかわからないため、慎重に利用する。

`2to3`コマンドをインストールするコマンド
```
sudo apt install 2to3
sudo apt install python3-lib2to3
//自分の環境だと、すでにpython3-lib2to3はインストール済みでした
```
次のコマンドで、"macro_safe.py"をpython3に適合するpythonファイルに変換した場合に、pythonファイルの変換前と変換後の差分が、標準出力に表示される。
```
2to3 macro_safe.py
```

変換は次のコマンドで行う。バックアップは、"変換するファイル名.bak"として同じディレクトリに保存される。（ここでは、"macro_safe.py"が"macro_safe.py.bakとしてバックアップされる。)
ファイルは、python3に適合する内容に上書きされる形で変換される。変換されたファイルが新規のファイルとして出力されるわけではないので注意。

```
2to3 -w macro_safe.py
```
完了したら、`./macro_safe.py`を実行して確かめる。

# マクロファイルの作成
```shell:/home/kali/MacroShop/
./macro_safe.py /home/kali/payloads/evilWinv2.bat /home/kali/payloads/script.txt
//あるいは
python2 macro_safe.py /home/kali/payloads/evilWinv2.bat /home/kali/payloads/script.txt
```
同書では、evil3.batとしているが、わかりにくいので名前を変えた。

# 実行
エクセルのVBEを立ち上げた後、script.txtの内容をThisWorkbookにコピペ。
内容を「.xlsm」拡張子のファイルとして保存する。
Metaspoloitでリバースシェルを待ち受けたあと、保存したファイルを実行する。

# おわりに
参考にしたもの
「ハッキング・ラボのつくりかた」

https://docs.python.org/3/library/2to3.html
ローカルIPアドレスとMACアドレスの確認

## デバイスに割り当てられたIPアドレスの確認

先日、使おうとしたIPアドレスがエアコンにとられていて困りましたので、
IPアドレス確認に関する備忘録。


## 結論：arp -a

arpテーブルを見る前にpingをおくるのを忘れずに。
確認したいセグメント宛てに、一気にpingをおくります。


```
for /l %i in (0,1,255) do (ping -w 1 -n 1 192.168.XXX.%i)
```

からの

```
arp -a
```

これで、確認完了～！


以上
Spring Security備忘録

# 20220502メモ

※現時点では写経Onlyなので基本記事見て作成しましょう。

### 要素
UserDetails、UserDetailsServiceの実装クラス
GrantedAuthority
JdbcTemplate
queryForMap
SimpleGrantedAuthority
UsernameNotFoundExceptionからBadCredentialsException への変換
認証例外情報の隠蔽
DaoAuthenticationProvider
ritrieveUser
LoadByUsername
DataAccessException
@NotBlank…任意の文字と全角空白のみ入力可能で、Null空文字半角空白は不可。
securityContext
Authentication
AnonymousAuthenticationToken


### 流れ

1.spring securityの導入
プロジェクト作成時にspring securityのチェックボックスにチェックを入れるか、
pom.xmlにspring securityの記述。

2.以降やること↓
・dbへのdatabase登録とユーザ情報登録とgrantで認証設定（記事見て）
application.propertiesと情報合わせる＆spring securityの記述。
パスワードはハッシュ化の必要あり。Eclipse上でシスアウトしてハッシュ値表示。
・各クラスの実装。Config、UserDetails、UserDetailsService。
・messages.propertiesはMavenフォルダ内のspring-security-conf?内のものコピると楽。
・application.propertiesで指定した以下のsqlファイルには、
schema-locationでTable定義を、
data-locationでデータ定義を行う。

### 発生した問題（解決済）
１.認証可能ユーザーでログインした際に、エラーメッセージ画面に遷移
	原因は静的リソースへのリクエストが失敗したため
		→cssフォルダが存在しないのに参照しようとしていた
		→cssフォルダ作成で解決

２.実行の際に接続エラーが発生
	原因はコマンドプロンプトで設定したユーザ情報とapplication.propertiesに記述したユーザ情報の不一致。
		→新たなユーザ情報をコマンドプロンプトにて作成し、application.propertiesに記述のユーザ情報と一致させる。
		→代替案：コマンドプロンプトにてユーザ情報を変更する。application.propertiesを修正が発生しないため、効率アップ。

３.Beanがサイクルしてしまう
	原因はどのBeanを使えばよいかEclipseが判断できないため(?)
	Bean同士の循環参照が禁止となったらしい。
	起動時にBeanCurrentlyInCreationException発生。
		→spring.main.allow-circular-referencesをtrueで記述
Kali Linux2022.1 でハッキングラボをつくってみる 6　Windows10をハッキングする8 RLOによる拡張子の偽装

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

# 拡張子を偽装する
拡張子の偽装は、マルウェアをターゲットに実行させることに有効な手段である。
今回は、拡張子の偽装にRLO(Right-to-Left Override)を利用する。
「ハッキングラボのつくりかた」P.355には次のように解説されている。

>RLO(Right-to-Left Override)とは、Unicodeの制御文字「U +202E」のことです。文字の流れを右から左の向きに帰るために用いられます。アラビア語やヘブライ語は、右から左に向けて記述します。こうした言語のために用意されている制御文字ですが、ファイルの拡張子の偽装に用いられることがあります。
例えば、本来は"tecfdp.exe"というプログラムが会ったとします。'c'と'f'の間にRLOを挿入することで、見かけ上"tecexe.pdf"と表示されます。

以下は、同書のP.355-359をもとにしている。

# Windows10で偽装
Windows10の"evilPic.exe"（[前回]()、Windows10に取り込んだペイロード）を"evilPicgpj.exe"に変更する。
"もとのファイル名.exe" → "もとのファイル名gpj.exe"
![evilPicgpj.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/96807f7d-f030-4e6f-a512-39c6595ee280.jpeg)

'c'と'g'の間にカーソルを移動して、右クリックして「Unicode制御文字の挿入」>「RLO」を選ぶ。もとのファイル名(半角英数字のファイル名)の最後の文字と'g'の間にRLOを挿入する。
![ummPwZhO.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/1cf1fd81-7e66-4228-f3fc-f0932ac37418.jpeg)
アイコンがコンテキストメニューに隠れてしまっている・・・

ピクチャフォルダを開き直すと、ファイル名の表示が"evilPicexe.jpg"となる。

# KaliLinuxで偽装
次のパッケージをインストール。
`charmap`か`gucharmap`コマンドを実行して、RLOをコピーする。
RLOは、「検索」から"RLO"またはRLOの文字コード"202E"と入力することで検索可能。
```
//インストール
sudo apt install gucharmap
//コマンドを実行
charmap
//あるいは
gucharmap
```
![VirtualBox_kali-linux-2022.1文字マップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/e6541b44-4f46-2c91-b537-57d9dbffd2c8.png)
![VirtualBox_kali-linux-2022.1-202E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/e3f9cb87-735a-f8d7-1933-7b95dcb4679d.png)

"evilPic.exe"を"evilPicgpj.exe"に変更する。
"もとのファイル名.exe" → "もとのファイル名gpj.exe"

'c'と'g'の間にカーソルを移動して、コピーしたRLOをペーストする。もとのファイル名(半角英数字のファイル名)の最後の文字と'g'の間にコピーしたRLOをペーストする。

# 本来の拡張子の確認の仕方
ファイルのプロパティを開く。
コマンドプロンプトの`dir`、端末の`ls`コマンドで確認できる。
証明書認証方式のevil-winrm

## 証明書認証方式のevil-winrmでハマった話
- pfxなどの証明書を利用してevil-winrmを動かそうとした時にハマった部分を備忘のために残します。
結論としては、コマンドの構文に足りない部分があったことが原因でした。
  - 秘密鍵(-k)と公開鍵(-c)の両方のオプションを指定していなかった
  - SSL利用のオプションを指定していなかった

- コマンドの構文
evil-winrm -i [IP Address] -k [/path/to/secretkey.pem] -c [/path/to/publickey.pem] -S

- 学んだこと
  - evil-winrmのソースを読んだら一発だった。皆、ソース読もうね。
  - -uや-pは証明書認証方式においては不要。
なぜなら証明書にユーザ名を記載しているし、パスワードの代わりに証明書を利用しているから。

- 利用バージョン
evil-winrm v3.3
System check identified no issues (0 silenced).が出たた時の解決策


### djangoのUnitTESTを実装している際にハマって、解決するのに苦労したので、その時の調査方法と、解決策を記載しておきます。


## 環境
### バージョン
python：3.10.4
django：4.0.4
django rest framework：3.13.1




## 現象
本来、python manage.py testのコマンドを実行すると、配下のフォルダにあるteset_XXXX.pyのファイルを探し出し、実行してくれるはず。
駄菓子菓子、以下のように、test_XXXX.pyファイルを全て無視され、1件も実行されないまま、OKで終了となってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/9d751401-ada4-0e83-acfa-752d5bccbdf1.png)



## 調べたこと
### 以下のサイトを参考に、調査していきました。
https://qiita.com/ragnar1904/items/ddd79ec516aa6af669bf
### 1. テストモジュール名は、testXXXX.pyとなっているか？
　　⇒「test_models.py」なので問題なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/f43c952d-89fc-1aaa-69a3-358d8a8c4b91.png)

### 2．「django.case.TestCase」は継承されているか？
　　⇒これも問題なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/9327caa1-1466-3ee4-9d6f-240dfdd67f00.png)

### 3．テストメソッド名は、testで始まっているか？（例：test_1_1_getusermst()的な感じで！）
　　⇒問題なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/701d6c45-fdbf-a27d-5ac0-69adc0bedfc4.png)

### 4．そもそもテストしようとしているClassは、settings.pyの「INSTALLED_APPS」に登録されているか？
　　⇒問題なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/2bf34975-1c72-f5e3-75fd-9f39e84c5e93.png)

#### ここまで調べて、問題なかったので、お手上げでした。
#### そこで、適当に、全フォルダ内に、「__init__.py」を1つずつ入れて、試してみましたｗｗｗｗ
#### その結果が以下ｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗ

## 解決策
単純なことですが、mstフォルダの直下に「__init__.py」がなかったことが原因でした。
mstフォルダの直下は、各appのフォルダしかないので、「＿init__.py」は不要だと思ってました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/0d487466-30b4-f995-e2e7-bbf0306bb82e.png)

mstフォルダの直下に「__init.py」を入れると、問題なく動作しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/71c302bf-bbc0-d5ad-98bf-c8eb71fd0e03.png)
ICLR2022の枝刈り論文 (2)

# 概要

この記事では、[ICLR2022](https://iclr.cc/)の枝刈り論文をまとめます。[^1]
[その1](https://qiita.com/kyad/items/b210cc279e4217fe84b8)
[^1]: 画像や数式は論文から引用しています。


# An Operator Theoretic View on Pruning Deep Neural Networks

https://arxiv.org/abs/2110.14856

(ICLR2022 Poster)
概要：枝刈りの理論解析。
新規性：枝刈りをクープマン作用素による離散時間システムとみなして考察した。
キモ：
Koopeman Magnitude Pruning (KMP) の序盤はGlobal Magnitude Pruning (GMP)と似ているので序盤は似ていることを示した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/bfa4f470-73b5-469d-c7a1-cec3832852bc.png)
クープマンモード分解した最大固有値が勾配ベースの枝刈り(KGT)になることから、Magnitudeベースも勾配ベースもクープマン作用素で理解できると主張した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/f6b3e198-b2dd-9d25-a61d-ebaf51839dff.png)

# Revisit Kernel Pruning with Lottery Regulated Grouped Convolutions 

https://openreview.net/forum?id=LdEhiMG9WLO

(ICLR2022 Poster)
概要：Kernel pruningの方法。
新規性：シンプルな手法で、Filter pruningよりも精度が高い。
キモ：
似ているフィルタでクラスタリングしグループで刈る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/6c1eaeb4-e0ba-7da8-de79-fd6150d5cc9c.png)
TMI score(重みの増分)が均等になるように刈る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/88e66e96-87a6-a845-f818-b5ff66f41edf.png)
評価：ResNet, CIFAR-10, ImageNetでFilter pruningと比較した。


# Effective Model Sparsification by Scheduled Grow-and-Prune Methods

https://arxiv.org/abs/2106.09857

(ICLR2022 Poster)
概要：GOP. 刈りながら学習することで省メモリに学習する方法。
新規性：4つに分けて、Denseでの学習と、Sparseな学習と、枝刈りをスケジュールしながら学習する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/6a737da4-4f9f-d3b1-600a-33bc4f04405e.png)
キモ：このように刈りながら学習する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/ea0f9a7d-50f2-d999-8337-481691ff0ac2.png)
評価：[RigL](https://arxiv.org/abs/1911.11134)などと比較した。


# The Unreasonable Effectiveness of Random Pruning: Return of the Most Naive Baseline for Sparse Training

https://openreview.net/forum?id=VBZJ_3tz-t

(ICLR2022 Poster)
概要：Sparse trainingにおけるrandom pruningの調査。
新規性：様々にパラメータを振ってrandom pruningした時のsparse trainingの精度を網羅的に調べた。
キモ：ResNet, CIFAR, ImageNetで実験した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/48feb5e8-7901-d4d0-bd28-52955eb59976.png)
(1)層の数や幅が大きいほどRandom pruningでも精度が落ちにくいことを実証した。
(2)Random pruningのERKがSNIPやGraSPより精度が高いことを実証した。


# Learning Efficient Image Super-Resolution Networks via Structure-Regularized Pruning

https://openreview.net/forum?id=AjGC97Aofee

(ICLR2022 Poster)
概要：SRPN-Lite. 超解像へのstructured pruningの適用。
新規性：従来の超解像はresidualの構造(スキップコネクション)のため枝刈り適用が難しかったのに対して枝刈りを適用した。
キモ：刈るレイヤと同じ番号のレイヤにはペナルティを与えるように正則化項を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/1a124fa7-7d6a-7ca1-21a5-9252792b218c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/3bf959bf-c060-6fff-9632-db501c181c78.png)
評価：EDSRや他の手法と比較した。
Requirements on Persistency, No.857, AUTOSAR 21-11 (19) AP

Requirements on Persistency, No.857, 2021-11

https://www.autosar.org/fileadmin/standards/adaptive/21-11/AUTOSAR_RS_Persistency.pdf

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

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

# 用語(terms)
glossary定義に寄っている。

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

## 英日
日本語は仮訳
|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|140|of|の|
|2|106|a|一つの|
|3|84|data|与件|
|4|84|the|その|
|5|82|in|の|
|6|75|to|に|
|7|74|rs_per_|rs_per_|
|8|68|autosar|AUTomotive Open System Architecture(短縮名)|
|9|68|persistency|永続性|
|10|52|document|文書|
|11|52|requirements|要件|
|12|50|shall|しなければならない|
|13|49|and|と|
|14|49|r|r|
|15|48|tables|表|
|16|48|trace|痕跡|
|17|35|persistent|持続的|
|18|32|be|です|
|19|31|storage|記録|
|20|30|support|支援|
|21|29|for|にとって|
|22|29|on|の上|
|23|26|this|これ|
|24|24|rs_main_|rs_main_|
|25|22|added|追加した|
|26|21|ap|adaptive platform(短縮名)|
|27|21|autosar_rs_persistency|autosar_rs_persistency|
|28|21|id|identifier, 識別子(短縮名）|
|29|20|history|歴史|
|30|20|requirement|要件|
|31|19|functional|機能的|
|32|19|release|開放|
|33|18|case|場合|
|34|18|changed|かわった|
|35|18|material|材料|
|36|17|by|に|
|37|17|description|説明|
|38|17|or|また|
|39|17|use|使用する|
|40|16|according|によると|
|41|16|application|応用|
|42|16|deleted|削除|
|43|16|file|紙ばさみ|
|44|15|adaptive|適用|
|45|15|an|と|
|46|15|c|c|
|47|15|d|d|
|48|15|dependencies|依存関係|
|49|15|draft|下書き|
|50|15|is|は|
|51|15|rationale|根拠|
|52|15|supporting|支援|
|53|14|it|それ|
|54|14|stored|保存|
|55|13|that|それ|
|56|12|persistently|しつこく|
|57|12|storages|記録|
|58|11|applications|応用|
|59|11|key|鍵|
|60|11|update|更新|
|61|11|value|価値|
|62|10|none|無し|
|63|9|access|接続|
|64|9|any|どれか|
|65|9|platform|土台|
|66|9|re|再|
|67|8|cluster|房|
|68|8|from|から|
|69|8|lease|貸す|
|70|8|management|管理|
|71|8|not|いいえ|
|72|8|work|仕事|
|73|7|configuration|構成|
|74|6|able|できる|
|75|6|are|それは|
|76|6|corrupted|破損している|
|77|6|corruption|腐敗|
|78|6|has|もっている|
|79|6|other|他の|
|80|6|persisted|持続した|
|81|6|possible|可能|
|82|6|system|系|
|83|6|which|どれの|
|84|5|amount|額|
|85|5|back|戻る|
|86|5|been|その間|
|87|5|can|できる|
|88|5|files|紙ばさみ|
|89|5|if|もしも|
|90|5|information|情報|
|91|5|mechanisms|仕組み|
|92|5|memory|記憶装置|
|93|5|non|非|
|94|5|roll|役割|
|95|5|rs_saf_|rs_saf_|
|96|5|structures|構造|
|97|5|used|使用済み|
|98|5|using|を使用して|
|99|4|allow|許可する|
|100|4|as|なので|
|101|4|chapter|章|
|102|4|detection|検出|
|103|4|finalization|最終化|
|104|4|handling|取り扱い|
|105|4|have|持ってる|
|106|4|installation|導入|
|107|4|like|お気に入り|
|108|4|needs|必要|
|109|4|no|いいえ|
|110|4|provide|提供|
|111|4|recovery|回復|
|112|4|removed|削除した|
|113|4|safety|安全性|
|114|4|specification|仕様|
|115|4|template|雛形|
|116|4|values|値|
|117|4|was|だった|
|118|4|way|仕方|
|119|4|with|と|



# 参考文献(References)
[1] Standardization Template, AUTOSAR_TPS_StandardizationTemplate
[2] Glossary, AUTOSAR_TR_Glossary
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
[3] Main Requirements, AUTOSAR_RS_Main
[4] Safety Requirements for AUTOSAR Adaptive Platform and AUTOSAR Classic
Platform, AUTOSAR_RS_Safety
パスの定義について: .to_csv()

よし！データフレームを作成したぞ！`df.to_csv()`を使ってデータを保存するんだよな

・・・ん？ディレクトリの設定が良く分からないぞ。
Python初心者の自分にはこの壁にぶつかりました。なんと初歩的な壁なのだろうか。。。

今回はそのデータの保存方法について学んでいきます。
実行環境は
jupyter NoteBook　for windowsになります。

```Python
import pandas as pd
import numpy as np

df01 = pd.DataFrame( {'name':['A', 'B', 'C', 'D' ,'E',"F"],
'math':[60, 70, 80 ,90,100,60]})
df01
```
```
name	math
0	A	60
1	B	70
2	C	80
3	D	90
4	E	100
5	F	60
```
```Python
df01.to_csv(r"C:\Users\<ユーザー名>\Desktop\sample.csv")
```
今回については、自分の持ち前のデスクトップ上に「sample.csv」というものを保存しました。
windows上で絶対パスを入力する場合は\を￥（半角）にする必要があります。
また、「r」というものがありますが、\を一つの文字として認識させる為に使います。絶対パスを入力する際は必ず入力しておきましょう。
細かいことは下記のサイトに書いてあります。

https://www.javadrive.jp/python/string/index4.html

また、`!dir`を入力することによって、現在のディレクトリの場所を把握することができます。
```Python
!dir
 C:\Users\<ユーザー名>\Desktop\ のディレクトリ
```
これを用いて相対パスで入力することもできます。
```Python
df01.to_csv("./sample.csv")
```
./とは、現在のディレクトリ(`C:\Users\<ユーザー名>\Desktop\`)までを省略していることになります。
./を入力することにより、絶対パスで入力するのではなく、少し省略して書くことができます。
参考になるサイトを書いておきます。

https://webliker.info/78726/

パスの理解ができると、画像の読み込みも簡単にできるようになります。
パスの理解を深めて、自由にデータを読み込んだり、保存したりいきましょう。
それではまた
Dahua VTH / VTO + Asterisk + Homebridge でセキュアなインターホン環境を構築 Vol. 2

# [前回](https://qiita.com/13310/items/75bd5b4e89fd1ad9b4d3)のおさらい
VTOとVTHの設定項目について触れました。今回はVTOとVTHでピンポンできるようになるところまでを記載します。

# 前回からのアップデート
注文していたSIPサーバ機能を持つVTO(VTO2202F-P)が到着しました。
外観が既存のもの(VTO1201G-P)より少し現代風です。
VTH-VTOのみで動作するのは魅力的ですが、SIPサーバ機能のカスタマイズ性が低いので、SIPサーバ機能はAsteriskで代替してあげるので良さそうです。

|VTO2202F|VTO1201G|
|---|---|
|![VTO2202F](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445439/64fbd4b7-88e2-a0d0-4f9e-da7ffcf6d3e0.png)|![VTO1201G](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445439/02dac552-a5af-8f78-95ae-2e1ed874e1f1.png)|

# 設定の前提
* Room No.
    * VTO : 8001
    * VTH : 8002

# VTH の設定
* VTH Config
    * Room No. : 8002
* SIP Server
    * Server IP : Asterisk のIP
    * Network Port : Astersik のポート
    * Username : 8002
    * User情報 : Asteriskで設定した通りのUsername/Pass
    * Enable Status : ON
* VTO COnfig
こちらはSIPは関係なく,RTSPで動画を見るための設定です。通話のためには必要ないですが設定しておきます。
    * Main VTO
    * VTO IP : VTOのIP
    * Username : admin
    * Password : Pass(VTOの管理画面に入るときのパス)
    * Enable Status : ON

# VTO の設定
* Local Setting
    * Villa Call No. : 8002(ボタンを押下したときの通話先。通常はVTOにする)
* Network
    * IP Address : Asterisk のIP
    * Port : Astersik のポート
    * Username : 8001
    * 他User情報 : Asteriskで設定した通りのUsername/Pass

# テスト
* VTOのボタンを押下してVTHで呼び出し音が鳴ること & 通話、ビデオが見れることを確認。

# 今後の方向性
実はまだタイトルの構成で通話ができるところまで至ってないです。Homebridge でボタン押下時に通知＆映像が見れて音声が聞こえるところまではできているのですが、Homebridge ffmpegプラグインがtwo way audioをサポートしていないようで、実装方法を悩み中です。
Homebridgeで通知を受けて、iPhoneのSIP appから折り返し掛ければイケそうですが、若干ダサい。。
夏くらいまでには家のインターホンを置き換えられないかと奮闘しています。
類似バグに追われるのはもう終わりにしたい

いきなりですが、
みなさんのところではバグチケットの流れって、このようになっていませんか？？
　1. バグを発見したらチケットを起票して開発に報告
　2. 開発担当者に修正してもらう
　3. チケットが帰ってきたら修正確認をしてクローズ
　4. 再びテストケースを消化していく作業に戻る。
これ自体はぜんぜん悪いとは思いません。
QAはあれこれ頭を悩ませてテストケースを作り、それを消化していくことで
リリース時に重大なバグが残っていない（と思われる）ということを保証する役割があるからです。

上記のバグのライフサイクルの中で、 **「これと同じようなバグ、前にも起票しなかったっけ？？」** と思うことありませんか？

この記事では、そんな「既視感のあるバグ」に注目してみることで
バグ起票に終われるQA、バグ修正に追われて計画通りにに進まない新機能の開発、という
**極悪非道の循環**を断ち切れるかもしれない、、、
そんな可能性を製造業の品質保証の観点からご紹介したいと思います。

## 遅ればせながら自己紹介
* 社会人としての入り口はソフトウェアQAです。
 * 機器の中の限られたメモリで動いているファームウェアや、PCと機器をつなぐことで機器の性能を引き出すミドルウェアの品質保証がスタート地点。
  * プリンタ・デジタル腕時計・LINUX向けドライバ・OSの内蔵ドライバ
* その後、足掛け10年をいろんな製造業で品質を守ることに費やしてきました。
　（リーマンショックのおかげで、地方での転職は困難を極めました）
 * 自販機のお釣りを返す部分や、商品を取り出すあのパカパカ部分を動かす金属製のシャフト
 * 麻婆豆腐の素に入っている調味料・サバ缶の味噌
 * AEDを動かしているプリント基板...etc,
* WEBシステムやアプリのQAはここ5年くらいです。
特技はフォークリフトの運転です。
　（出入荷が忙しい時はよくトラックの積み下ろしを手伝っていました）


## 既視感のあるバグに注目しよう
　　閑話休題（自己紹介が長すぎた）
テスト項目を進めていくと、度々バグを発見することになるでしょう。（あんまり度々じゃ困るんだけど）
それをチケットに起票して、、という流れは前述の通りです。
今回注目したいのは「既視感のあるバグ」です。

```
 1.「またデザインと違う表示になってる…」
 2. 「ん？またこの画面でバグが発生してる！」
 3. 「むむむ？なんでこの条件の時だけ他の機能と連動しないの！？」
 ```
チケットを起票していくとこんな既視感を覚えることがあるかと思います。（あんまり度々じゃ困るんだけど…2回目）
その既視感こそが品質を向上させる「最初の気づき」です。
ここでいう*品質の向上*とは、下流工程でバグを見つけられない状態を指します
「システムテストでテスターが頑張ったけどバグは出ませんでした…orz」という状態です。


## 根本的な共通原因を探る

さて、同じようなバグが散見されるということは、担当者の疲労度合いなどとは別の「根本的な要因」があるはずです。
根本的な要因を突き止めて、そこに手を打ってしまえば同じようなバグは2度と現れないはずです。

というのも製造業には昔から「ハインリッヒの法則」という労災防止のための考え方があります。
>1件の重大事故の背後には、重大事故に至らなかった29件の軽微な事故が隠れている。
>さらにその背後には事故寸前だった300件の危険認識（ヒヤリとしたりハッとしたりする危険な状態）が隠れている。

大抵の製造業の現場では「危ない！」と思ったこと(これをヒヤリハットと言う)を随時上長に報告する文化があります。
報告を受けた上長は、このヒヤリハットが発生しないように手を打ちます。
そうすることで、そこから発生しうる重大な労働災害を予測して先手を打つことができます。
300件のヒヤリハットに対応することが、従業員の生命と身体の安全を守ることにつながるのです。
![ハインリッヒの法則.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1778163/dfe838f9-f9b1-ce35-6678-5bc89bcbfe2c.png)
＜ハインリッヒの法則＞

QAのお仕事に置き換えるときは、逆から読んだ方がわかりやすいかもしれませんね。
**1件のバグに根本的な対処をすることで、29件ある軽微な類似バグの発生を防ぐことができる** と言えそうです


ということでヒヤリハット的に先ほどのバグの根本原因を探ってみると、こんな感じでしょうか、、
```
 1.「またデザイン仕様と違う表示になってる…」
 2. 「ん？またこの画面でバグが発生してる！」
 3. 「むむむ？なんでこの条件の時だけ他の機能と連動しないの！？」
 ```
|No,|現象|原因|根本原因|
| --- | --- | --- | --- |
| 1. | デザインとの相違 | 部分的にデザインが古かった | 構成管理がうまくいってない |
| 2. | 特定の箇所に頻発 | バックエンドとの繋ぎ込み | DB構造が可視化されていない |
| 3. | 特定の条件で頻発 | 特定の条件時の動作が決まってない | 仕様の検討もれ | 

おそらくもう少し深掘りすると、プロジェクトの体勢とか進め方とか仕組みの構造的な問題が見つかるかもしれませんが、、本稿ではあえてこのあたりにしておきましょう。
仮説として抜き出した根本原因ですが、既視感のある他のバグに対しても同じことが言えるのであれば、説としては合っていそうですね！

## 解決策の提示（ハッピーエンド）
根本原因がわかれば、あとは解決策を提案するだけです。
```
1. ワイヤーフレームの構成管理を見直す（デザインと開発の同期をとる）
2. DBのCRUD図とかをザックリ書いて共有してみる
3. 漏れている仕様を洗い出す（私たちテストエンジニアお得意のテスト技法の出番です！）
```
プロジェクトとして、この三点の**解決策が実行できれば、これ以上の類似バグが作り込まれることは防止できますね！**
つまり、リリース後に「まだ類似バグが潜んでいるかも...」と怯える日々から解放されるわけです。
似たようなバグチケットを起票する日々からも解放されます。
開発担当の方も、バグ修正に使っていた時間を新機能開発に全振りできるようになります。


## まとめ
気軽に読むには長すぎる記事になってしまったかもしれません。
申し訳ありません。（反省はしている。後悔はしていない）
普段から、「QAは下流工程でテストだけをする人」という認識を少しでも変えていけたら良いなぁと思っていて、その取っ掛かりとしてこの記事を書きました。
「QAは品質向上のための活動だったら、なんでもやる人」でありたいと思っています。

ちなみに製造業的な品質保証やカイゼンのやり方は、まだまだ沢山あるのですが、
話し始めると止まらなくなってしまいますので、今日のところはこの辺りで自主規制します...
ではまた！！
[Docker][Java] Java プロセスのコンテナで jmap/jstack が採れない


前の記事で Java プロセスの docker コンテナの jstat が採れない問題を修正したら、今まで動いていた jmap/jstack が採れなくなった。。

[Docker][Java] Java プロセスのコンテナで jstat が採れない
https://qiita.com/batatch/items/a5d76b420702cc6322b5


以下のようなエラーになり、jmap/jstack の結果がアタッチ対象の Java プロセスの標準出力に出てしまう。

```
Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file /proc/1/root/tmp/.java_pid1: target process 1 doesn't respond within 10500ms or HotSpot VM not loaded
        at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:100)
        at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)
        at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
        at jdk.jcmd/sun.tools.jmap.JMap.executeCommandForPid(JMap.java:128)
        at jdk.jcmd/sun.tools.jmap.JMap.histo(JMap.java:174)
        at jdk.jcmd/sun.tools.jmap.JMap.main(JMap.java:112)
```


対象の Java プロセスも、jmap/jstack もユーザID を変更して実行しているのに、エラーメッセージにあるソケットファイル名は `/proc/1/root/tmp/.java_pid1` と root ユーザとなっているので、root として jcmd を実行してみてもダメでした。

```
$ docker exec -t --user 1000 {container-id} jstack 1  #=> NG
$ docker exec -t             {container-id} jstack 1  #=> NG
```

コンテナにシェルで入り、直接上記のファイルを見ようとしてもファイルへのアクセスができない。
root でもアクセスできないとは。。

そもそも、ユーザID を変更して実行しているのにソケットファイル名が root になってるのがおかしいようです。

結局、原因は対象の Java プロセスが entrypoint 内でユーザID を変えて java プロセスを実行していたからのようです。
コンテナ(PID=1) 自体が root で起動しているからソケットファイル名が root なのだと思われます。

```
chroot --userspec=1000:0 / java -ea ...
```

なので、jmap/jstack も同じように chroot して実行する必要がありました。

```
$ docker exec -t {container-id} bash -c "chroot --userspec=1000:0 / jstack 1"
```

これで jmap/jstack も採れるようになりました。


// EOF
SpringBatchのItemReaderでDBデータを取得する方法（MyBatis)

SpringBatchのChunkモデルを使う場合、データベースからデータを取得し、chunkサイズごとにデータを処理する方法を紹介しようと思います。

# サンプルソース
```Configuration.java
  @Autowired
  SqlSessionFactory sqlSessionFactory;

  @Bean
  public Step chunk() {
    return stepBuilderFactory.get("chunk").<DemoDto, DemoDto> chunk(100)
        .reader(this.myBatisReader())
        .processor(this.Processor)
        .writer(this.Writer)
        .build();
  }
  
  // MyBatisPagingItemReaderを使ってデータをページ分けて取得
  @Bean
  public MyBatisPagingItemReader<DemoDto> myBatisReader() throws IOException {
    // 検索条件の項目名と値をマップに格納
    Map<String, Object> params = new HashMap<>(); 
    params.put("id", 1);
    return new MyBatisPagingItemReaderBuilder<DemoDto>()
        .sqlSessionFactory(this.sqlSessionFactory) // sqlSessionFactoryは一般的にそのままでいい
        // queryIdは下記Mapperのnamespace＋select id
        .queryId("com.example.demo.dao.demoDao.select")
        .parameterValues(params) 
        .pageSize(100) // chunkサイズと合わせる
        .build();
  }
```
```DemoMapper.xml
<mapper namespace="com.example.demo.dao.DemoDao">
  <select id="select" resultMap="BaseResultMap">
	select id, name
	from demo 
    where id = #{id,jdbcType=INTEGER}
    <? limitは必ず記載すること、_pagesizeは上記MyBatisPagingItemReaderBuilderで設置する ?> 
 	limit #{_skiprows}, #{_pagesize}
  </select>
</mapper>
```
Ubuntu で CH340 USB Serial がLinuxで /dev/ttyUSB0 ができなくて動作しない

Ubuntu 21.10 の時には動作した気がしていたのに、Ubuntu 22.04 でなぜか /dev/ttyUSB0 ができず動作しなかった。

以下のように udev に設定を追加したのに動作しなかった。

```
# /etc/udev/rules.d/99-my.rules"
KERNEL=="ttyUSB*", ATTR{idVendor}=="1a86", ATTR{idProduct}=="7523", MODE="0666", GROUP="dialout" # CH320 Serial
KERNEL=="ttyACM*", ATTR{idVendor}=="1a86", ATTR{idProduct}=="7523", MODE="0666", GROUP="dialout" # CH320 Serial
```

```
sudo chmod a+r /etc/udev/rules.d/99-my.rules
sudo udevadm control --reload
```

dmesg を確認すると、接続したあとに BRLTTY というものが奪っていた。

```
45149.710077] usb 3-4.1: new full-speed USB device number 75 using xhci_hcd
[45149.814936] usb 3-4.1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[45149.814946] usb 3-4.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[45149.814950] usb 3-4.1: Product: USB2.0-Serial
[45149.862973] ch341 3-4.1:1.0: ch341-uart converter detected
[45149.863460] usb 3-4.1: ch341-uart converter now attached to ttyUSB0
[45150.467771] input: BRLTTY 6.4 Linux Screen Driver Keyboard as /devices/virtual/input/input56
[45150.469009] usb 3-4.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1
[45150.469448] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
[45150.469466] ch341 3-4.1:1.0: device disconnected
```

apt パッケージでインストールされており、使った覚えもないため、アンインストールした。

```
sudo apt remove brltty
sudo udevadm control --reload
```
v-data-tableでcheckboxをdisabledにしたときの全選択カスタマイズ

## はじめに
Vuetifyのv-data-tableにおいて、下記条件を満たすサンプルです。

- チェックボックスを表示する
- チェックボックスの一部をdisabledにする
- チェックボックスの全選択時、disabledの列を除外する

## 環境
- vue.js : 2.6.11
- vue/cli：5.0.4
- vuetify：2.6.0

## サンプル

表示が崩れるので、拡大率0.5倍での確認 or CodePenで実物確認のほうがわかりやすいです。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="oNENKxa" data-user="k2491p" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/k2491p/pen/oNENKxa">
  Vuetify Datatable disable row in selectAll</a> by けぱ (<a href="https://codepen.io/k2491p">@k2491p</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## サンプル解説
大切な点は下記2点です。

1. disabledとしている行をカウントしておく
1. 全選択ボタン押下時、disabledを除いたものを全選択対象とする

### 1. disabledとしている行をカウントしておく
```js
watch: {
    desserts: {
      handler: function () {
        this.disabledCount = 0;
        this.desserts.map((item) => {
          if (item.disabled) this.disabledCount += 1;
        });
      },
      deep: true
    }
  }
```

### 2. 全選択ボタン押下時、disabledを除いたものを全選択対象とする
```js
selectAllToggle(props) {
    if (this.selected.length != this.desserts.length - this.disabledCount) {
    this.selected = [];
    props.items.forEach((item) => {
        if (!item.disabled) this.selected.push(item);
    });
    } else {
    this.selected = [];
    }
},
```

尚、サンプルではdisabledとなる行が変更することを想定して、`disabledCount`をwatchで監視するようにしています。
また、disabledを変更できるよう行クリックイベントを仕込んであります。

## ソースなど

https://github.com/k2491p/vue-sample/tree/master/v-data-table_check-all_disabled

https://codepen.io/k2491p/pen/MWQWMNJ

## 参考
https://codepen.io/chansv/pen/mdJMvJr?editors=1010
クラウドインフラ系学習サービスの比較

## tl;dr
- A CLOUD GURUはKodeKloudに比べてお高いが、メリットはそれなりにある。
- バニラのk8s、Terraformなどの学習にはKodeKloudで十分。
- 基本の学習をKodeKloudで→資格などクラウドごとの勉強にA CLOUD GURUを。という流れがおすすめ。
- パブリッククラウド資格の対策にはA CLOUD GURUしかない。三大クラウドの動画盛り沢山＆クラウドサンドボックスが利用し放題。
- KodeKloudは非英語圏の人々でも理解できるよう、ゆっくりわかりやすい単語で話してくれるので学習しやすいが、A CLOUD GURUだとそういう配慮はあんまりない。簡単な英語の読みができる人なら、どちらも字幕があるのでそれ見ながらでok。
- どちらも無料お試しある。


## クラウドインフラ系学習サービスについて
- この領域はほぼ日本の学習サービスがない。
- 一部のUdemy教材やくろかわこうへい氏のAWS Cloud Tech、Linux Fundationの一部の日本語対応動画なども出てきているが、字幕読みながらの英語学習に抵抗がないなら、圧倒的な教材のボリューム、クオリティの観点で海外教材を使うことを強くオススメする。
- 筆者はKodeKloudとA CLOUD GURUの両方を利用したので、感想を記す。


## KodeKloud

- 利用したのは、CKAD対策コース(これで実際に取得した)、Helmコース、Terraformコース。
- 他にもCKA, CKS対策コースなどがあり、模擬テストも受験可能。
- ハンズオンテストと動画学習の形式。
- Mumshad mannambeth氏を始め、講師陣は皆ゆっくりと、簡単な英語で話してくれる。完全に非ネイティブを意識していると感じた。
- 豊富な図や、例え話による解説も多く、完全なk8s素人にもベストな教材と言える。
- お値段もリーズナブル。
- AWS, GCPなど、各クラウドに対応した教材は今のところない(クラウドでよく使われる技術の学習がメイン)。
- 基礎としてバニラのk8sなどを学ぶにはうってつけという印象。

## A CLOUD GURU

- Google Certified Associate Engineerコースと、Google Cloud Dataflowのハンズオンを受講。
- バニラだけでなく、三大クラウドに特化した教材が豊富に取り揃えられている。
- クラウドサンドボックスを用いたハンズオンと動画学習の形式。
- KodeKloudに比べると値段は高いが、コースによってはなんと三大クラウドのサンドボックスが使えるのが嬉しい。
- KodeKloudに比べてやや英語が難しい。字幕を見ればついていけるが、非ネイティブへの配慮はあまり感じられない。
- 良くも悪くも、動画が長いので、一つの講座を完走するだけでも結構時間かかる。
- ちょっとお高いのが玉に瑕だが、十分にその価値はある。

## まとめ
- クラウドインフラ系学習サービスはまだまだ日本語教材が不十分。
- KodeKloud→KLOUD GURUの順に勉強するのがおすすめ。