OmniAICreator/Qiita-1.07M huggingface dataset:
megaTinyCore の組み込みマクロ

###概要
新しいAVRマイコンシリーズで、tinyAVR0シリーズ(tinyAVR® 0-Series)とtinyAVR1シリーズ(tinyAVR® 1-Series)、tinyAVR2シリーズ(tinyAVR® 2-Series)があります。
よくヘッダファイルで使用される、CPU毎に定義を変える場合に使用する　#ifdefined(____AVR_ATmega168____)という式をmegaTinyCore時に使用する組み込みマクロ名をまとめてみました。
###tinyAVR0シリーズ

|型名       |マクロ名  |
|:-:|:-:|
|ATtiny202 |____AVR_ATtiny202____|
|ATtiny402 |____AVR_ATtiny402____|
|ATtiny204 |____AVR_ATtiny204____|
|ATtiny404 |____AVR_ATtiny404____|
|ATtiny804 |____AVR_ATtiny804____|
|ATtiny1604|___AVR_ATtiny1604____|
|ATtiny406 |____AVR_ATtiny406____|
|ATtiny806 |____AVR_ATtiny806____|
|ATtiny1606|____AVR_ATtiny1606____|
|ATtiny807 |____AVR_ATtiny807____|
|ATtiny1607|____AVR_ATtiny1607____|

###tinyAVR1シリーズ
|型名       |マクロ名  |
|:-:|:-:|
|ATtiny212|____AVR_ATtiny212____|
|ATtiny412|____AVR_ATtiny412____|
|ATtiny214|____AVR_ATtiny214____|
|ATtiny414|____AVR_ATtiny414____|
|ATtiny814|____AVR_ATtiny814____|
|ATtiny1614|____AVR_ATtiny1614____|
|ATtiny416|____AVR_ATtiny416____|
|ATtiny816|____AVR_ATtiny816____|
|ATtiny1616|____AVR_ATtiny1616____|
|ATtiny3216|____AVR_ATtiny3216____|
|ATtiny417|____AVR_ATtiny417____|
|ATtiny817|____AVR_ATtiny817____|
|ATtiny1617|____AVR_ATtiny1617____|
|ATtiny3217|____AVR_ATtiny3217____|

###tinyAVR2シリーズ
|型名       |マクロ名  |
|:-:|:-:|
|ATtiny424|____AVR_ATtiny424____|
|ATtiny824|____AVR_ATtiny824____|
|ATtiny1624|____AVR_ATtiny1624____|
|ATtiny3224|____AVR_ATtiny3224____|
|ATtiny426|____AVR_ATtiny426____|
|ATtiny826|____AVR_ATtiny826____|
|ATtiny1626|____AVR_ATtiny1626____|
|ATtiny3226|____AVR_ATtiny3226____|
|ATtiny427|____AVR_ATtiny427____|
|ATtiny827|____AVR_ATtiny827____|
|ATtiny1627|____AVR_ATtiny1627____|
|ATtiny3227|____AVR_ATtiny3227____|

###プログラム例
```c++:foo.h
#if defined(__AVR_ATtiny202__)
#error This chip is ATtiny202

#elif defined(__AVR_ATtiny412__)
#error This chip is ATtiny412

#elif defined(__AVR_ATtiny424__)
#error This chip is ATtiny424

#endif
```

### ■例）ChipにATtiny202 に指定してコンパイル
![スクリーンショット 2021-11-27 20.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/ecd06438-1a9a-4c57-3167-fd03d1209400.png)

```cpp
foo.h:2:2: error: #error This chip s Attiny202
 #error This chip is ATtiny202
  ^~~~~
exit status 1
#error This chip is ATtiny202
```
組み込みマクロ(build-in macros)として____AVR_ATtiny202____ が定義されますので、
　＃if defind(_____ATtiny202_____)で真となり、#error This chip is ATtiny202 を表示します。

###振り返り
Arduinoの組み込みマクロがフォルダ内のどのファイルに定義されているのかが調査が未調査です。
判明次第、このページを改版したい。

###参考リンク
3.19.6 AVRオプション
https://runebook.dev/ja/docs/gcc/avr-options

https://github.com/llvm/llvm-project/blob/main/clang/lib/Basic/Targets/AVR.cpp
Github ActionsからVeracodeの静的スキャンを実行する

# はじめに
シフトレフトというキーワードがあるように、プロセス全体を通して品質を向上させるのが現代のソフトウェア開発のあるべき姿だと思うのですが、とりわけセキュリティについてはリリース直前になって扱われるトピックになっていることが多いのではないかなと思います。今回はそこの是非は深堀りしませんが、手元にあるモノを使って継続的なセキュリティ活動の取っ掛かりになる仕組みを**まずは手軽に**試してみようと思います。

# 使うもの
- Github Actions
- Reactアプリ
- Veracode

# Veracodeとは
Veracode（ベラコード）って聞き慣れないかと思いますが、これはコードを静的または動的な解析をすることでセキュリティ診断をしてくれるSaaSです。ざっくり言うと、.zipや.warを喰わせると診断して結果をレポートしてくれるというものです。[サイト](https://www.veracode.com/)を見ると、2006年からサービス提供していて、現在はグローバルで2600以上の企業が顧客となっており、解析したコードは累計45兆行を超えているそうです。それらの実績を用いて、解析の精度を日々向上させることができているのが強みなんだそうです。ただ、日本国内での導入事例をあまり聞きません。僕もつい最近知りました。国内では類似サービスの[yamory.io](https://yamory.io/)のほうが知られているのかなと思います。

# 作ります
前置きはそこまでにして作ります。作るもののイメージはこんなんです。
![githubactions_veracode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118448/a7e0d59d-c7c8-94c9-ecb2-b873eb7c9b81.png)
ReactアプリをビルドしてS3にアップロードする手前でVeracodeに.zipをアップロードして診断させます。診断は時間がかかるので、S3アップロードからは独立させています。単純に診断を実行する手間を自動化させるだけです。そして、大まかな手順は次の通りです。

1. リポジトリを用意する
1. 適当なReactアプリを作る
1. S3バケットを用意する
1. Github ActionsのWorkflowを書く

1〜3は本質ではないからすっ飛ばして、4から

## Github ActionsのWorkflowを書く
Workflowを書きます。はい、ドン。

```YAML:main.yaml
name: Build React
on:
  push:
      branches:
        - main
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@master

      - name: Install Dependencies
        run: npm install

      - name: Build
        run: npm run build

      - name: Zip build
        uses: thedoctor0/zip-release@master
        with:
          filename: release.zip
          path: build
          
      - name: Veracode Upload And Scan
        uses: veracode/veracode-uploadandscan-action@0.2.1
        with:
          # appname
          appname: ${{ github.repository }}
          # createprofile
          createprofile: true
          # filepath
          filepath: release.zip
          # version
          version: ${{ github.run_id }}
          # vid
          vid: ${{ secrets.VERACODE_ID }}
          # vkey
          vkey: ${{ secrets.VERACODE_KEY }}

      - name: Deploy
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: aws s3 cp --recursive --region ap-northeast-1 build s3://XXXXXXX
```
`Veracode Upload And Scan`というステップが今回のキモ。そして、これはMarketplaceから入手できます。なんて簡単なんでしょう。

このWorkflowを流すと、Veracode上に `appname` で指定したアプリケーションが生成され、静的解析が実行され、最終的に診断結果を見ることができるようになります👏

# 最後に
たったこれだけで、リリース直前に「いつやる？」とか「やったっけ？」もしくは「やばいなんか出ちゃった、直さなきゃ」みたいなバタバタはなくなると思います。そもそも3回以上手動でやることは自動化しましょうという話もありますし、ビッグバンな行為は何であっても避けたいですよね。そのためにもシフトレフト。
実装については、当然ながらもっと多彩なパタンはあるかと思いますが（診断結果次第でパイプラインを進めたり止めたり、不具合チケットを自動起票したりなどなど）、今回はまずはここまで。では👋
GigalixirでSendgridのAPI keyを設定

まずruntime.exsでAPI keyを環境変数として呼び出せるように設定

```elixir:runtime.exs
...
  config :lv10, Lv10.Mailer,
    adapter: Swoosh.Adapters.Sendgrid,
    api_key: System.get_env("SENDGRID_API_KEY")
...
```

CLIで環境変数を使えるようにする

```
% gigalixir config:set SENDGRID_API_KEY=SG.******
```

実行後、自動的にアプリがリスタートされ、以降Sendgridでメールを送信可能になります。
WidgetKit、複数のWidgetを持つ

# ドキュメント「Creating a Widget Extension」

[https://developer.apple.com/documentation/widgetkit/creating-a-widget-extension](https://developer.apple.com/documentation/widgetkit/creating-a-widget-extension)

ドキュメントの最後に「Declare Multiple Widgets in Your App Extension」

DeepLで翻訳
> App Extensionで複数のウィジェットを宣言する
> 上記のGameStatusWidgetの例では、@main属性を使用して、ウィジェットエクステンションの単一のエントリーポイントを指定しています。複数のウィジェットをサポートするには、複数のウィジェットを body プロパティでまとめた > WidgetBundle に準拠した構造体を宣言します。このwidget-bundle構造体に@main属性を追加して、拡張機能が複数のウィジェットをサポートしていることをWidgetKitに伝えます。
> 例えば、ゲームアプリがキャラクターのヘルスを表示する2つ目のウィジェットと、リーダーボードを表示する3つ目のウィジェットを持っていた場合、図のようにそれらをグループ化します。


# 変更してみる
![](https://kumonosu.cloudsquare.jp/wordpress/wp-content/uploads/2021/11/widgetadd.jpg)

### 元のソース

```swift
import WidgetKit
import SwiftUI

struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date())
    }

    func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date())
        completion(entry)
    }

    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []

        // Generate a timeline consisting of five entries an hour apart, starting from the current date.
        let currentDate = Date()
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
            let entry = SimpleEntry(date: entryDate)
            entries.append(entry)
        }

        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    }
}

struct SimpleEntry: TimelineEntry {
    let date: Date
}

struct ExampleWidgetEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        Text(entry.date, style: .time)
    }
}

@main
struct ExampleWidget: Widget {
    let kind: String = "ExampleWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            ExampleWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}

struct ExampleWidget_Previews: PreviewProvider {
    static var previews: some View {
        ExampleWidgetEntryView(entry: SimpleEntry(date: Date()))
            .previewContext(WidgetPreviewContext(family: .systemSmall))
    }
}
```

### 変更後のソース、変更箇所のみ

```swift
struct ExampleWidget: Widget {
    let kind: String = "ExampleWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            ExampleWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}

@main
struct ExampleWidgets: WidgetBundle {
    @WidgetBundleBuilder
    var body: some Widget {
        ExampleWidget()
        ExampleWidget()
    }
}
```
truffle migrateを実行したら、デプロイが「Network up to date.」しか出力しない。

https://www.oreilly.co.jp/books/9784873119342/

P84

truffle migrate --network goerliを実行して、contractをgoerliテストネットワークにデプロイする。

```
$ truffle migrate --network goerli

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.

Network up to date.
Network up to date.
koutounoAir:client lowkeyrojo$ 
```

client/src/contractsフォルダを削除
```
rm -r client/src/contracts
```

truffle compileを実行して、contractを再コンパイルする。

```
$ truffle compile
Compiling your contracts...
===========================
> Compiling ./contracts/Greeter.sol
> Compiling ./contracts/Migrations.sol
> Compiling openzeppelin-solidity/contracts/access/Ownable.sol
> Compiling openzeppelin-solidity/contracts/utils/Context.sol
> Compilation warnings encountered:

    Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/Greeter.sol


> Artifacts written to /greeter/client/src/contracts
> Compiled successfully using:
   - solc: 0.8.10+commit.fc410830.Emscripten.clang
```

truffle migrate --network goerliを再実行、デプロイは上手くいった。
アイコンの使い方

# expoのアイコンを使ってみる
## ライブラリをインストール

```
npm install @expo/vector-icons
```

どんなアイコンがあるかは、下記のページを参照する。

https://icons.expo.fyi/


## プラスアイコンを使ってみる

https://icons.expo.fyi/
ページの検索バーにplusと入れる。

![スクリーンショット 2021-11-27 20.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/9b1507b4-12cf-b989-61ac-3ecc3b631a5e.png)

好きなアイコンをクリックしてみると、下記のような画面になる。
![スクリーンショット 2021-11-27 20.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/120a1d1c-3207-6d88-69c2-8c67b31383ac.png)

この２行をコピーしてCircleButtonに適用してみる。
propsでiconを変更できるようにnameを親から受け取れるようにした。

CircleButton.jsx

```jsx
import React from 'react';
import { View, StyleSheet } from 'react-native';
import { string, shape } from 'prop-types';
import { Feather } from '@expo/vector-icons'; 

// eslint-disable-next-line react/function-component-definition
export default function CircleButton(props) {
  const { style, name } = props;
  return (
    <View style={[styles.circleButton, style]}>
      <Feather name={name} size={30} color="white" />
    </View>
  );
}

CircleButton.propTypes = {
  style: shape(),
  name: string.isRequired,
};

CircleButton.defaultProps = {
  style: null,
};

const styles = StyleSheet.create({
  circleButton: {
    backgroundColor: '#D81B60',
    width: 65,
    height: 65,
    borderRadius: 32,
    justifyContent: 'center',
    alignItems: 'center',
    position: 'absolute',
    right: 40,
    bottom: 40,
    /* shadowはiphoneにしか効かないCSS */
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 8 },
    shadowOpacity: 0.35,
    shadowRadius: 5,
    /* elevationはAndroid用のCSS */
    elevation: 8,
  },
  circleButtonLabel: {
    color: '#fff',
    fontSize: 32,
    lineHeight: 32,
    fontWeight: 'bold',
  },
});
```

親コンポーネントで下記のように使える。

```jsx
<CircleButton style={{ top: 170, bottm: 'auto' }} name="plus" />
```

# 注意点
今回はCircleButton.jsxのコンポーネント内にFeatherのアイコンを使用している。
なので、どんなアイコンが使えるかは、
https://icons.expo.fyi/
で、FiltersでFeatherを選択して検索する。
![スクリーンショット 2021-11-27 20.43.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/619e904e-7e77-8a93-c818-24e355bf5e11.png)
同人プロジェクトマネジメント入門：概要編

[同人プロジェクトマネジメント入門の目次はこちら](https://qiita.com/wolfmagnate/items/97bf9a9f8c58ede3fb21)

- - -

# はじめに
マネジメントの各工程についての注意点、解決策を書いていきますが、その章立てに対して正当性を確認するため、概要編ではマネジメントとはどのような仕事なのかについて書いていきます。

# 定義
* マネージャー：「同人プロジェクトの進行を担当する人」ぐらいの意味。実際の同人プロジェクトでは、基本的にしっかり役割を決めることが少ないです。

# ビジネスに比べた同人プロジェクトの特徴
## 強制力がない
給料をもらっている人間がならば、ある程度プロジェクトにコミットする義務がありますが、あくまでもサークルですから、強制力が存在しません。何らかの方法で強制力を生み出さないと、だれも仕事をしないという状況が生まれてしまいます。
同様に、プロジェクトをかき乱すようなメンバーがいたとしてもそのメンバーに対して強制力をもって追い出すなどの対処もできません。
とにかく権力構造がフラットで、トップダウン型のプロジェクトが非常に難しいことが特徴です。

教訓：**強制力を生む努力が必要！**
## 仕様・完成を自分で決められる
「クライアント」「取引先」などの概念が存在せず、何を作りたいかは各メンバーの要望によって決まります。
これは基本的にはいいことです。理不尽な仕様を押し付けられることはないですし、マネージャーからするとコントロールできるものが多いのはいいことです。
非常に自由ですが、決まったフォーマットがないがゆえに最初は仕様決定に失敗することも多いです。
この特徴によって、世の中に出回っている「プロジェクトマネジメント入門」などの情報がうまく活用出来ない場合が多いです。

教訓：**仕様の決め方に工夫を凝らすべし！**

## コミュニティ・友情を重視する必要がある
基本的にモチベーション駆動開発なので、いくつか気にかけるべきポイントも発生します。
例えば、**責任を決めないと開発が回らないくせに「責任」は禁句である**ことや、**失踪者を出したら大抵完成までいかない**などです。
また、重要なポイントとして、**ほとんどの場合モチベーションは急速に下がり、滅多に回復しないものである**という事実もあります。

教訓：**同人プロジェクトは人間が最大の経営資源！気持ちよく働かせよう！**
## 特徴まとめ
良くも悪くも柔軟性があるのが特徴です。
マネージャーは、この柔軟性を殺さないようにプロジェクトを回さないといけません。しかし**まったく柔軟性のない締め切り**と戦わなければなりません

# マネージャーの働く場面
## 1. 「何を」やるのか仕様を決める
同人マネージャーの仕様の最大の特徴は、常に一番上流の工程にいるということです。すべてを決めるだけの権限を持っています。この工程はプロジェクトの最初期であり、この場面での人間関係の構成が残りの全体に影響します。
同好の士が集まってプロジェクトを作る場合「企画者=マネージャー=リーダー」になることも多い印象です。

##2. 「どうやって」やるのか計画を立てる
###「いつ」「いつまでに」やるのか
時間を決定するのは非常に重要な問題です。しかしながら、時間を決定したら期待通りに進行するわけでもありません。
逆に、「予定を決定しておいて予定通りに負えられない」とい状況は、うまくいかない罪悪感などを生んでモチベーションを削りかねません。同人プロジェクトマネージャーは時間に関してシビアな意思決定をする必要があります。
###「誰が」やるのか
仕事の割り当ても重要なマネジメント対象です。
しかしながら、これも難しい決定です。例えば、本人の力量を知らずに仕事を割り当ててしまったとき、もしビジネスならば、マネジメントの判断で本人の仕事を変えることで対応できます。しかし、ビジネスに比べて同人プロジェクトだと「仕事を奪う」という判断が極端に難しいです。人間関係やモチベーションが重要なので、仕事を奪う判断は比較的に重くなります。
###その他の計画
#### 金で調達してくる
同人プロジェクトでは、各種素材をお金で調達することができます。コストマネジメントも仕事です。
#### 助っ人を呼ぶ
サークルなどでは外部から助っ人を呼ぶことが出来るでしょう。「最終助っ人を呼べば何とかなる」といった状況を作っておくのもマネージャーの仕事です。
#### 勉強させる
プロジェクトメンバのスキルが足りない場合には、一定期間勉強に費やさせることが必要です。
#### ツールの導入
世の中には開発を円滑にするためのツールが多くあります。実際、Githubのpull requestを使って開発を進めるプロジェクトもあるでしょう。しかしながら、これらは基本的に業務で使うことが想定されていることがメインで、かなりきっちりしているベストプラクティスの情報が多いです。同人プロジェクトでは、もう少し「雑な」運用の方が効果的なことが多いです。

## 3. 仕様と計画を修正し続ける
プロジェクトの変更要因を並べました。これらのイベントが発生するたびに、マネージャーは仕様と計画を修正して、プロジェクトを円滑に進めていきます。
### リスク管理
* メンバー同士がぎくしゃくしている
* メンバーが失踪、病気、(「トラックに轢かれる」)
* 納品したコードの品質が悪いことが発覚

主に人間関係要因と技術的要因の2パターンがあり、単発で一気にプロジェクトの雲行きが怪しくなってくる状況。備えておくしかない。

### 進捗管理
* 「終わりませんでした！」というやつ
* 「この時期は試験があってやれませんね」というやつ
* 「あいつが仕事しないので俺が働けねぇな」というやつ

じわじわとプロジェクトを闇に包んでいくタイプ。離散的なリスクに対して、連続的に発生するため、予想・対応を早めることが大事。

### 変更管理
* 「作ってみたら、こっちの方が面白いと分かった」(ポジティブ)
* 「作ってみたら、ゲームにならないことが分かった」(ネガティブ)

要件定義をきっちりしておけば避けられるかもしれないが、同人プロジェクトでガチガチの要件定義書なんてあるはずがなく、また、ゲームの面白さという定量化しにくい値が重要な変数であることも相まって、避けられない変更である。

# おわりに
今回は、何を変えるべきかについて解説しました。次回からは、今回挙げた工程のそれぞれについて、どのような対応策が考えられるかについて書いていきます。
同人プロジェクトマネジメント入門：目次

#はじめに
過去の連載の[Unity設計入門]()や、[Unity・MVP設計実践](https://qiita.com/wolfmagnate/items/4b1a1d0cf8db7ff7d66f)では、ソフトウェア工学のアプローチでプロジェクトの混沌を避ける方法を書きました。今回はより文系的なアプローチでプロジェクトを成功に導く方法について書いていこうと思います。

#対象読者
最大のターゲットは、ゲーム制作サークルのリーダーやマネージャーです。
より広いターゲットは、同人サークルで何らかの製作をしているすべてのマネージャーです。
プロジェクト管理をノリでしようと思っている人は、**結構な確率でやけどします**から、初心者マネージャーさんには読んでほしい記事です。

# 前提条件
今回のメイン対象は「Unityを使ったゲーム開発プロジェクト、**ただし仕事ではない**」になります。
しかし、「同人プロジェクト全般」において役立つ情報を多く載せています。

# リンク
* [概要編](https://qiita.com/wolfmagnate/items/403aeb5b5426e420f495)
* [仕様書作成編1](https://qiita.com/wolfmagnate/items/95e3ff2e680ac14da0c9)
* [仕様書作成編2](https://qiita.com/wolfmagnate/items/508108c5d9be862e246f)
* [仕様書作成編3](https://qiita.com/wolfmagnate/items/372e91a6e56c9ebe75f5)
* [計画作成編1](https://qiita.com/wolfmagnate/items/42946233ef548f6d34d8)
* [計画作成編2](https://qiita.com/wolfmagnate/items/9161226f187c2df68a42)
* [計画作成編3](https://qiita.com/wolfmagnate/items/2a2e4820bdefe07c5d57)
* [人間関係編1](https://qiita.com/wolfmagnate/items/ee9ca6bd40b5fc3880a0)
find -exec や xargs で引数の展開個数を制御する


ファイルが3つある状態。

```sh
ls
a.txt b.txt c.txt
```


## 1-1. `find ... -exec ... \;`

引数は１つずつコマンドに渡される。次の例だと echo が3回実行される。

```sh
find . -name '*.txt' -exec echo {} \;
./c.txt
./b.txt
./a.txt
```


## 1-2. `find ... -exec ... +`

引数はまとめてコマンドに渡される。次の例だと echo は1回だけ実行される。

```sh
find . -name '*.txt' -exec echo {} +
./c.txt ./b.txt ./a.txt
```


## 2-1. `xargs`

引数はまとめてコマンドに渡される。次の例だと echo は1回だけ実行される。

```sh
find . -name '*.txt' | xargs echo
./c.txt ./b.txt ./a.txt
```


## 2-2. `xargs -n 1`

引数は１つずつコマンドに渡される。次の例だと echo が3回実行される。

```sh
find . -name '*.txt' | xargs -n 1 echo
./c.txt
./b.txt
./a.txt
```

`-n` に指定する数によっていくつずつ渡すかコントロールできる。次の例は２つずつ。

```sh
find . -name '*.txt' | xargs -n 2 echo
./c.txt ./b.txt
./a.txt
```

ローカル（MacOS）の man を読んだら `-n` の**デフォルト値は 5000** 。

`xargs -n` は便利だね。
コンポーネントのスタイルを上書きするprops

# コンポーネントにstyleをpropsで渡して上書きする

例えば、丸ボタンのコンポーネントCircleButton.jsxは下記のように設定されている。

```jsx
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
// eslint-disable-next-line import/no-extraneous-dependencies
import { string } from 'prop-types';

// eslint-disable-next-line react/function-component-definition
export default function CircleButton(props) {
  const { children } = props;
  return (
    <View style={styles.circleButton}>
      <Text style={styles.circleButtonLabel}>{children}</Text>
    </View>
  );
}

CircleButton.propTypes = {
  children: string.isRequired,
};

const styles = StyleSheet.create({
  circleButton: {
    backgroundColor: '#C51162',
    width: 65,
    height: 65,
    borderRadius: 32,
    justifyContent: 'center',
    alignItems: 'center',
    position: 'absolute',
    right: 40,
    bottom: 40,
    /* shadowはiphoneにしか効かないCSS */
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 8 },
    shadowOpacity: 0.35,
    shadowRadius: 5,
    /* elevationはAndroid用のCSS */
    elevation: 8,
  },
  circleButtonLabel: {
    color: '#fff',
    fontSize: 32,
    lineHeight: 32,
    fontWeight: 'bold',
  },
});
```
画面の右下の位置にボタンがくるstyleをつけている。
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/d9092779-c9d9-b543-d6a1-a601c9692fc6.jpeg)


このボタンの位置をpropsで調整できるように変更する。

# コンポーネントのstyleを変更するpropsを追加する

丸ボタンのコンポーネントのボタンの位置を調整するために、styleをpropsで受け取れるようにする。
CircleButton.jsx

```jsx
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { string, shape } from 'prop-types';

// eslint-disable-next-line react/function-component-definition
export default function CircleButton(props) {
  const { children, style } = props;
  return (
    <View style={[styles.circleButton, style]}>
      <Text style={styles.circleButtonLabel}>{children}</Text>
    </View>
  );
}

CircleButton.propTypes = {
  children: string.isRequired,
  style: shape(),
};

CircleButton.defaultProps = {
  style: null,
};

const styles = StyleSheet.create({
  circleButton: {
    backgroundColor: '#D81B60',
    width: 65,
    height: 65,
    borderRadius: 32,
    justifyContent: 'center',
    alignItems: 'center',
    position: 'absolute',
    right: 40,
    bottom: 40,
    /* shadowはiphoneにしか効かないCSS */
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 8 },
    shadowOpacity: 0.35,
    shadowRadius: 5,
    /* elevationはAndroid用のCSS */
    elevation: 8,
  },
  circleButtonLabel: {
    color: '#fff',
    fontSize: 32,
    lineHeight: 32,
    fontWeight: 'bold',
  },
});
```

親コンポーネントから受け取ったstyleを上書きするためには、


```jsx
<View style={styles.circleButton}>
・
・
・
```

だったのものを、リストにして並べるだけ。
リストの順が遅いものほど新しく上書きされていく。

```jsx
<View style={[styles.circleButton, style]}>
・
・
・
```

親コンポーネントで、CircleButton.jsxを読み込んで

```jsx
<CircleButton style={{ top: 170, bottm: 'auto' }}>+</CircleButton>
```

とすると、ボタンの位置が上書きされて下記のようになる。

![図2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/b62fd006-998b-c927-ad15-2e48a7d823b5.jpeg)
VirtualBoxのメニューバーやステータスバーが消えて困ったときは

VirutalBoxのウィンドウにメニューバーやステータスバーが表示されない。。USBデバイスを切り替えたいのに`デバイス`メニューが出てこない...

`表示`メニューの`フルスクリーンモード`や`スケールモード`を選択しているとこうなります。

![スクリーンショット 2021-11-27 19.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/ba873d5e-04f9-abda-e78c-dcd9788ac61b.png)

#### 表示モードの切り替え方法

* `フルスクリーンモード`の解除は、`Hostキー + F`、
* `スケールモード`の解除は、`Hostキー + C`

`Hostキー` は、デフォルトでは`右Controlキー`に割り当てられています。
つまり、右Controlキーを押しながらCキーを押すとメニューが復活します。これらはトグル動作なので少なくとも2回押せばノーマルな画面に戻ります。

#### Hostキーの割り当て変更

macOSには右Controlキーなんてものは存在しないので、`Hostキー`の割り当てを変更するときは、

`ファイル`->`環境設定`を開く
![スクリーンショット 2021-11-27 12.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/ced92550-9ba3-1c44-08c1-df51eb8df604.png)

`入力`->`仮想マシン`->ホストキーの組み合わせのショートカットから`Right Control`となっているものを、例えば`右Shiftキー`などへ変更可能です。
![スクリーンショット 2021-11-27 12.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/dcb1912e-bc60-f69d-22e4-edccd0dab785.png)
VisualStudioCodeからお手軽EC2接続・編集

#　はじめに
VSCodeを利用してEC2での開発ができれば楽だなぁと思っていた矢先、Remote SSHを利用することでEC2インスタンスの編集ができることを知ったので記述します

# 実装
## 1:VScodeにRemoteSSHをインストールする
![スクリーンショット 2021-11-27 19.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/e99df4bd-b243-476d-7652-ac1ba8fba677.png)

## 2:ターミナルで開発するEC2のパブリックIPアドレス・鍵の登録場所・ユーザ名を登録する

```
tetutetu214@mbp ~ % cd .ssh
tetutetu214@mbp .ssh % ls
config				kozin_test_2.pem
tetutetu214@mbp .ssh % vim config
Host Test-EC2
  HostName 52.199.91.242
  IdentityFile ~/.ssh/kozin_test_2.pem
  User ec2-user
```
## 3:VSCodeがEC2に接続される

### 3-1:『Connect Current Window to Host...』を押下
![スクリーンショット 2021-11-27 19.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/77041971-b9b6-eed2-f4bc-0cec68f401a3.png)

### 3-2:2で作成したHost名を選択する
![スクリーンショット 2021-11-27 19.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/418cf647-75b8-8d0f-7449-58ff5516e7a0.png)

### 3-3:新しいウィンドウが開き、EC2との連携を信頼する
![スクリーンショット 2021-11-27 19.12.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/ed2d4be4-53b9-f8f1-d6e7-bd451991db30.png)

### 3-4:移動したい階層を押下して移動できる
![スクリーンショット 2021-11-27 19.11.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/17a2eeb2-113b-1cd6-6b42-bd6ae2ed4001.png)

### 3-5 欄外の『ファイル』の『開く』を押下することでも、階層を移動することが出来る
![スクリーンショット 2021-11-27 19.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/0f484fad-43fb-7aa9-9dda-b3c94ffb73ec.png)

![スクリーンショット 2021-11-27 19.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/a6819927-1493-9e41-1a90-88929a4086c8.png)

#　おわりに
今までVSCodeを利用しながらEC2でも個人開発をしていましたが、全くこの機能を利用していなかったので次回の開発からは、有意義な構築していきたいものです
InDesign JavaScript 変数の値を変数名に

変数の値を変数名にするスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
このスクリプトを利用して起こった不具合の責任は取れません。
ご了承下さい。

更新 2021/11/27
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "変数の値を変数名に";

// 変更した数
var changeNumber = 0;

// 失敗した数
var failNumber = 0;

//スクリプトの動作指定（一つのアンドゥ履歴にする、及び、アンドゥ名）
app.doScript(function(){

    // ダイアログ
    var dialogueFlg = confirm("activeDocumentに存在するカスタムテキスト変数の値を変数名にします。","", scriptName);

    // Noの場合
    if (dialogueFlg == false) {

        // 終了
        exit();
    }

    // テキスト変数の数だけ繰り返す
    for(var i = 0; i < app.activeDocument.textVariables.count(); i++){

        // カスタムテキスト変数の場合
        if(app.activeDocument.textVariables.item(i).variableType == VariableTypes.CUSTOM_TEXT_TYPE){
            
            // 名前と内容が違う場合
            if(app.activeDocument.textVariables.item(i).name != app.activeDocument.textVariables.item(i).variableOptions.contents){
                
                // エラー対策
                try{
                    
                    // 内容を名前にする
                    app.activeDocument.textVariables.item(i).name = app.activeDocument.textVariables.item(i).variableOptions.contents;
                    
                    // 変更数を増やす
                    changeNumber++;
                 
                // エラーの場合
                }catch(e){
                    
                    // 失敗数を増やす
                    failNumber++;
                }
            }
        }
    }

    // 結果
    alert("変更数 " + changeNumber + "\r\r" + "変更出来なかった数 "  + failNumber, scriptName);

//スクリプトの動作指定の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);
~~~
T-DASHのサンプルアプリで自動テストを実行して結果を見てみた

前回のポストでT-DASHのOPENβ版をインストールしました（[T-DASHのOPENβ申込からテストツールの起動まで実施したら、とてもハードルが低かった](https://qiita.com/84zume/items/5051531c1d82139b4267)）。今回のポストでは、最初から搭載されているサンプルアプリケーションを利用しテストを実行してみたいと思います。

## 記事の補足
### 本記事で利用したシステムのバージョン情報
- T-DASH：0.1.004b
- PC：Windows 10 Home 20H2
- ブラウザ：Chrome 96

### アドベントカレンダー2021
この記事はQiita Advent Calendar 2021の[T-DASHを使ってみた！【PR】T-DASH](https://qiita.com/advent-calendar/2021/tdash)の2日目の記事です。

## 何はともあれまずは動かしてみる
### 1. サンプルプロジェクトを開く
T-DASHを起動するとサンプルプロジェクトがすでに配置されています。プロジェクト名称（サンプル_0.1.001b）をクリックして、プロジェクトを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/81657b0e-95d8-e065-6d9c-bb8f775ce261.png)

### 2. すでに実装済みの自動テストを走らせる
メニューの「テストシナリオ」を選択すると、テストシナリオが記述された画面が開きます。どうやらサンプルアプリケーションはホテルの宿泊予約サイトのようですね。シナリオとして「未ログインユーザー」、「一般会員」、「プレミアム会員」の3つのシナリオと、合計9件のテストケースが用意されています。中身の確認は後にして、「選択したテストを実行する」をクリックし、自動テストを起動＆実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/b43cd7f8-ac35-5b48-0d1b-64291b73ea0a.png)

テストがChrome上で自動的に実行されていきます。進捗はステータスバーで確認できます。（途中のスクショを取り漏らしてしまったため、下記のスクショはテスト完了次点のものです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/6034e914-0d48-e874-5a67-1f7ea88574a9.png)

### 3. 実行後の結果を色々見てみる
#### 3-1. テストレポート
テスト実行画面からテストレポートを閲覧することができます。Robot Frameworkのレポートが表示されます。テストの正否や、所要時間などの詳細なテスト結果を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/0c45227a-b08c-add8-3f8b-ab95f5d9af6d.png)

### 3-2. ダッシュボード
メインの画面に戻りメニューより「ダッシュボード」を選択すると、過去の実行履歴などを含めた情報を閲覧できます。下記のスクショは2回テストを実行した結果です。1回目のテストで意図的に1件失敗させたため、テスト成功率は89%と表示されています。また「実行結果推移」を見るとテストセッションごとの成功・失敗をグラフで確認することができます。シンプルで分かりやすいですね。さきほどのテストレポートについてもこの画面から履歴を含め追うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/35fddabf-d2ef-d3f9-ba98-ebfe357a55b8.png)

### 4. その他テスト実行に関する細かいこと
#### 4-1. 対応ブラウザ
テストを実行できる対応ブラウザは、ブラウザ選択リストを見る限り、現在のところ「Chrome」と「Firefox」の2つのようです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/59399f35-db5f-c375-e5e2-67a72b533cfe.png" width=60%>

#### 4-2. 実行するテストは選択可能
さきほど実行した際には全シナリオ・全ケースを実行しましたが、選択したうえで一部のみ実行可能です。チェックを外すのみです。チェックを外して実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/f7e6f787-2128-476d-038c-e62ae10b8cb3.png)

ん…チェックを外して実行した場合は「スキップ」となるのではなく、テストケース全件から間引かれるようですね。（スキップにしても良いような…どうなんだろう。定義次第ですかね。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/fb4a6748-d301-1117-a2cd-6b7f2b871eee.png" width=90%>

## 感想
今回のポストでは、サンプルアプリケーションを使ったサンプルプロジェクトで自動テストを実行してみました。ダッシュボードで過去の推移を含めた結果をシンプルに閲覧できるのが良いですねぇ。詳細を確認したい場合は「プロジェクトレポート」をすぐに確認できるようになっているため、操作感が良いです。アプリも軽快に動くためストレスを感じづらい印象です。次のポストでは、実際にテストを書いてみようと思います。
STM32L010で「hello...」とシリアルに出力(Mbed)HAL



x Mbed2のリビジョンは、143
x シリアルは、PA_2,PA_3


目的
シリアル通信のテスト


参考


HALライブラリによるSTM32マイコンのUART機能使用方法



https://qiita.com/Kosuke_Matsui/items/5e95c8e77f39f78e834e



```c++




#include "mbed.h"

DigitalOut myled(PA_4);


int main()
{

    //シリアルの構造体の定義
    UART_HandleTypeDef huart2;

    //シリアルへのクロックの選択
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
    PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

    //シリアルへクロックの供給
    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    //シリアル用のGPIOの設定
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    //シリアルの設定
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    HAL_UART_Init(&huart2);

    while(1) {


        HAL_UART_Transmit(&huart2, (uint8_t *)"hello world\r\n", 13, 10);

        HAL_Delay(500);


        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);

    }

}



```
Angular Video自動再生されない問題について

# 背景

時間が経つのは早いもので、そろそろ年末ですね。年末年始といえば、忘年会や新年会などのイベントが多いです。新型コロナはまだ続くと思いますが、感染者数は少なくなり、ようやく居酒屋で一緒に楽しめるようになりました。懇親会を盛り上げるよう、面白い余興を行いますね。その中でもビンゴゲームは定番です。ビンゴカード配り、番号抽選、当選チェック、景品渡し等、幹事さんは大変ですね。特にオンラインの場合、もっと大変です。最近Angularを勉強し始めて、何か作れるかと思って、幹事さん向けの[オンラインビンゴゲーム（bingome.net）](https://bingome.net)を作成しました。一般のビンゴ機能以外、受付終了/再開、参加一覧、ビンゴチェック、参加者削除、景品渡しチェック等の機能もあります。ビンゴをやる場合、オンライン、オフラインに関わらず、ぜひご活用ください。



# 環境

```
$ng --version
v16.13.0
noriharuishi@rgsis bingo % ng --version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 12.2.13
Node: 16.13.0 (Unsupported)
Package Manager: npm 8.1.0
OS: darwin x64

Angular: 12.2.13
... animations, cdk, cli, common, compiler, compiler-cli, core
... forms, material, platform-browser, platform-browser-dynamic
... router

Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1202.13
@angular-devkit/build-angular   12.2.13
@angular-devkit/core            12.2.13
@angular-devkit/schematics      12.2.13
@schematics/angular             12.2.13
rxjs                            6.6.7
typescript                      4.3.5
```



# 課題

ホームページには説明動画（mp4）があります、ごく普通のvideoタグを使っていますが、chromeでビデオが自動再生されないです。Angularのソースコードは下記の通りです。

app.component.ts

```typescript
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'sample';
}
```

app.component.html

```html
<video muted autoplay playsinline loop>
  <source src="/assets/bingome.net.mp4" type="video/mp4">
</video>
```



# 対策

色々調べてみましたが、原因がわからず、最終的に下記のように修正しましたら、自動的に再生できました。

app.component.html

```html
<video [muted]="true" autoplay playsinline loop>
  <source src="/assets/bingome.net.mp4" type="video/mp4">
</video>
```
ServiceNow レポート「インシデント解決までの時間」関数と注意点

##解決したい問題
ServiceNow OOBのインシデントテーブルの解決時間は秒で表示されるため、加工しないと解決期間かわかりづらい。期間表示できる関数を使ってレポートに利用します。

##概要

ServiceNowインシデントレポートでチケットがオープンしてから解決するまでの時間を時間表示するレポートの作成方法です。レポート関数を利用します。インシデントのオープンから解決までの時間を計算し、インシデントテーブルに新規カラムが自動追加されることで、インシデント解決時間を期間表示します。「誰が解決までに時間がかかってる？」「どのサービスに時間がかかっている？」など、インシデントベースで新規企画を検討することができます。
![インシデント___ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317768/22a27e74-48fb-0bf0-8bac-31af71a15493.png)


:::note warn
レポート設定で関数を利用しますが、注意が必要です。設定した関数は自動でインシデントテーブルのカラムとして作成されます。レポートは本番環境だけで作成して、開発環境から移送していません。という運用をしている場合、このレポートを本番環境で作成してしまうと、開発環境のインシデントテーブルと本番環境のインシデントテーブルのカラムが異なるとこになります。開発からの移送ミス？とならないように、このレポートは開発環境で作成してから、関数とカラムを本番環境に移送することをおすすめします。
:::

##サンプル設定値
#####データ
| 設定箇所| 設定値 |
|:-:|:-:|
|レポート名|任意|
|ソースタイプ|テーブル|
|テーブル|インシデント[incident]|

#####タイプ
棒グラフでよいですが、必要に応じて変更してください

#####構成
|設定箇所| 設定値 |
|:-:|:-:|
|グループ|[今回作成する関数を選択する]|
|集計|カウント|
|グループの最大数|すべて表示|

#####スタイル （見た目の調整なのでやらなくてもOK）
|設定タブ| 設定箇所 | 設定値 |
|:-:|:-:|:-:|
|全般タブ|チャートの色|カラーパレットを使用|
||パレットの設定|NY 明色カラースキーム (11)|
|軸タブ|X軸のタイトル（役職）|解決までの時間|
||Y軸のタイトル（役職）|チケット数|
||Y軸のグリットドット付き|オフ|

##利用関数
```php
glidefunction:datediff(resolved_at, opened_at)
```

Example result: 10 days, 8 hours 23 minutes 11 seconds

##関数の詳細はServiceNowナレッジを参照してください

https://docs.servicenow.com/bundle/rome-platform-administration/page/build/platform-functions/concept/platform-support-functions.html#d1424399e194

##期間を取得する関数をレポート上に設定

`関数フィールドを構成`を選択して、上記の利用関数を記載します。ラベルは自由ですが、インシデントテーブルのカラム名になります。戻り値を`期間`にするのを忘れずに。レポートの構成タブ内の`グループ`フィールドで作成した関数が選択できるようになります。
![チケット解決までの経過時間___ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317768/7014914b-8952-f26d-6f14-42205ddc2749.png)

`グループフィールド`で`Diff of resolved and opened`を選択したときのレポートの例です。そのままですと、解決してないチケットまで表示されますので、レポートのフィルターで、`Diff of resolved and openedが空`のデータは表示しないように設定を。
![チケット解決までの経過時間___ServiceNow_と_時・分・秒の単位を時分秒に変換_-_高精度計算サイト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317768/6c1fbb71-0748-8e4d-e0a2-6ea5069aade9.png)

##いろいろな使い方
グループにカテゴリやサービス、アサイン先、積み重ね基準にアサイン先等を設定した上で、集計で平均を選び、Diff of resolved and openedを選択します。眺める方向を変えることでいろいろ問題点や解決策が見えてきますのでぜひいろいろ試してみてください。

:::note
サンプルデータの関係で解決までの時間が何ヶ月もかかっていて不自然な感じごめんなさい:sweat_smile:
:::
![チケット解決までの経過時間_v2___ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317768/84dc7cdc-1c97-84af-2682-dddb9d333e42.png)
EC2のメモリ空き容量が減る場合の対処法

## 困っている事
* 本番に公開しているAWSが、3日おきぐらいに再起動する
* なぜ本番が3日おきに再起動するのか分からない


## 環境
* auto scaling使用
* ロードバランサ使用
* rails(6.1)
* 起動はpuma
* EC2プラン: t2.micro



## 前提情報
* ログに、`OOMキラー`が作動したという記述あり。その後EC2インスタンスが落ちている
* `/etc/sysctl.conf`で、OOMキラーが作動した時に、EC2インスタンスが再起動するように設定している
* EC2インスタンスが再起動したタイミングでnginxとpumaが起動するcrontabを設定している
* EC2インスタンスは再起動するとメモリがリセットされる
* 約3日後にOOMキラーが作動する、の繰り返し
* サイトは1日に5000人ほどのuserが登録するというアプリ


## 予想
* メモリリーク
* メモリブロート（メモリ断片化）
* のどちらかではないか


## 検証
* メモリリークの特徴: メモリ消費量が徐々に線形に増加
* メモリ断片化の特徴: メモリ消費量が一定まで増加すると横ばいになっていく

* まずメモリの消費量推移を監視する必要あり
* cloud watchでメモリ消費量を監視する設定を行う


## gem
* [puma worker killer](https://github.com/schneems/puma_worker_killer)というgemが有名だが
* READMEを読む限り使わない方がいいように見えるので使わない


## 対策
* 検証の結果、リークか断片化かはっきりとは分からなかった(微妙なグラフ)
* プランが`t2.micro`なのでメモリが少なすぎるのでは
* `t3.small`にした所、それ以後は一度も再起動しなくなったので、断片化が原因だったのではないか


## その他
* よく使ったコマンド `$ free -m`(メモリ使用量が分かる)
![](https://storage.googleapis.com/zenn-user-upload/a3a88b3931f4-20211127.png)
webpackerによるStimulusのインストールでハマったこと

# はじめに
皆さん`Stimulus`を使っていますか？
`React`や`Vue`を使う程学べていないけど、`jQuery`は使いたくないって人におすすめのフレームワークです！
`JaveScript`の簡単なDOM操作ができる人なら学習コストはほぼゼロで使えます！

更に、`Webpacker`を導入している`Rails`ならコマンド一発でインストールできるのも魅力的です。

```bash:ターミナル
rails webpacker:install:stimulus
```
上記コマンドでインストールして[公式サイト](https://stimulus.hotwired.dev/)でサクッと勉強しながら皆さん良いStimulusライフを！
<br>

、、、としたかったのですが、インストールの際にエラーが発生して上手く動かなかったので修正点を備忘録として残しておきます。



# 前提
| 技術など | バージョン等 |
| ---- | ---- |
| ruby | 2.7.4 |
| Rails | 6.1.4 |

> 執筆時点の日時は2021/11/27です。



# 調査結果
修正点とか言ってますが、ただのバージョンの問題でした。
詳しくは分かってないのですが、`Rails7`に`Stimulus`は標準で組み込まれるっぽいです（現在の筆者の`Rails`のバージョンは6）。
それに先駆けて`Stimulus`が色々バージョンアップしたっぽいので、`Rails6`ではそのままだと使えませんでした。（間違いがありましたら諸先輩方ご指摘お願いします🙇‍♂️）



# 修正内容
まずは、`Stimulus`のバージョンを直しましょう（すでに`Stimulus`のバージョン3.0.0をインストールしてしまった前提です。）

```diff_json:package.json
{
  "name": "myapp",
  "private": true,
  "dependencies": {
    "@popperjs/core": "^2.10.1",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "5.4.3",
    // 中略
-   "stimulus": "^3.0.0",
+   "stimulus": "^2.0.0",
    "turbolinks": "^5.2.0",
    "webpack": "^4.46.0",
    "webpack-cli": "^3.3.12"
  },
  "version": "0.1.0",
  "devDependencies": {
    "webpack-dev-server": "^3"
  }
}
```

上記のように`3.0.0`を`2.0.0`に修正します。
その上で、

```bash:ターミナル
yarn install
```
で、再インストールして下さい。
不安な人は、`yarn.lock`内を検索して、`"@stimulus/core@^2.0.0":`となっているか確認してみてください。

次に、`app/javascript/packs/application.js`に追記をします。

```diff_javascript:application.js
import Rails from "@rails/ujs";
import Turbolinks from "turbolinks";
import * as ActiveStorage from "@rails/activestorage";

// 中略

+ import "controllers";

```
上記のように1行だけ追加して下さい（もしかしたら自動で記述されているかもしれません）

最後に、`app/javascript/controllers/`ディレクトリに`hello_controller.js`を作成、[公式サイト](https://stimulus.hotwired.dev/)のTOPにある部分とかを打ち込んで動くか確認してみて下さい。
公式サイトTOPと同じ動きをしてくれたら成功です！




# 終わりに

今回がQiita初投稿ですので、温かい目で見守ってくださるとありがたいです。
また、ミスやこうすると読みやすい等ご指摘がありましたらぜひコメントの方宜しくお願いします🙇‍♂️

繰り返しになりますが、`React`や`Vue`を使うほどではない簡単な動きだけなら`Stiumulus`の方が導入・開発スピードは早いと思いますので、ぜひ使ってみて下さい！！
EC2に700万件insertする

## したい事
* EC2のmysql（RDS）にレコードを700万件入れたい
* できるだけ短時間で入れたい
* 1回で入れたい

## 環境
* docker-compose
* rails（6.1)
* localマシン: mbp 16GB
* EC2プラン: t3.small（メモリ2GB）、DBはRDS

## local 下準備

docker-compose.yml内容変更↓

```
version: '3'
services:
  db:
    image: mysql:5.7.34
    command: --max_allowed_packet=536870912
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    ports:
      - "4306:3306"
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      TZ: Asia/Tokyo
    volumes:
      - .:/test
    ports:
      - "3000:3000"
    depends_on:
      - db
```
* ポイント: 上から5行目でmysqlのpacketを512MBに増やしている

dockerのsettingを変更↓

![](https://storage.googleapis.com/zenn-user-upload/38e1dbcdc25b-20211127.png)

* ポイント: resourceのmemoryを8GBに増やしている


## localで実行

* まずlocalで数百万のinsertをできるかを確認

* seeds.rb内容変更↓
* (例はcsvのデータをinsertする場合)

```
# frozen_string_literal: true

require "csv"

def insert_all_test
  array = []
  CSV.foreach("db/test1.csv", headers: true) do |row|
    array << {
        name: row["name"],
        created_at: Time.current,
        updated_at: Time.current
    }
  end
  User.insert_all array

  array = []
  CSV.foreach("db/test2.csv", headers: true) do |row|
    array << {
        name: row["name"],
        created_at: Time.current,
        updated_at: Time.current
    }
  end
  User.insert_all array
end

insert_all_test
```

* ポイント: エラーにならない程度の量のデータを１つのループで配列に入れ、一度`insert_all`でDBに入れる
* それを繰り返し
* そのdefを、最終行の`insert_all_test`で実行(`$ rails db:seed`)する 
* これで1回でinsertできる。localでは700万件insertが約１５分で完了
* （insert_allメソッドはcreated_atとupdate_atを自動で入れないので上記のように明記する必要)


## EC2 下準備

* mysqlの環境を変更する

#### DBがRDSの場合

* パラメータグループで`max_allowed_packet`を変更する(今回は512MBとした)
* デフォルトのパラメータグループの内容は変更できないので、新規で作成する必要がある
![](https://storage.googleapis.com/zenn-user-upload/7518f3cf2ae9-20211127.png)

* ポイント: 新規でパラメータグループを作成した後は、そのグループをEC2インスタンスに適用する

## EC2で実行

* `$ rails db:seed RAILS_ENV=production`

#### プラン: t3.smallの場合
* 1つのcsvは約50万件
* 700万件のinsertに約50分掛かった

#### プラン: t2.microの場合
* 1つのcsvは約30万件（50万件ではエラー。broken pipeする）


------------

プランがmicroでも、時間を掛ければ1回でできる
WindowsでTensorflowがGPUを認識しないとき

## 前提
Windowsにて、pipで入れたtensorflowがGPUを認識してくれない。
CUDA、CUDNNはダウンロードしてpathを通してある状態。

## 原因
Windows Storeから入手したPythonでは、TensorflowがGPUを上手く認識してくれない模様。
[重要] しかもWindowsが勝手に設定したエイリアスで、pythonと打つとStore版を使うようにしてくるので、それをoffにする必要あり。

## 解決法
1. 「アプリと機能」から「アプリ実行エイリアス」を開く。
画像の真ん中です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212534/115164e6-29f4-f5fe-5804-39a70213d875.png)

2. PythonとPython3がMicrosoft Store版のPythonに紐づけられているので、オフにする。
画像の状態にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212534/4c0e748e-8720-3064-62fe-d44457067419.png)

3. Python公式 (python.org) からTensorflowが対応しているPythonを入れる。
Note: 記事執筆時ではTensorflow2.7はPython3.10をサポートしていないので、3.9を入れました。
PythonはWindows embeddable package と Windows installerがありますが、理由がないならWindows installerにした方が良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212534/49a43e3e-443c-575c-a7f1-fd63bfad2b67.png)

## 最後に
感想や指摘などありましたら、是非コメントください。
コアサーバーのDB環境をローカルに再現

#はじめに
　サーバーにサイトをあげる際には、まずローカルのテスト環境で同じものを作って、動作を確認してからサーバーにあげますよね。
　私はレンタルサーバーのコアサーバーでデータベースを使っていますが、テスト環境でも同じ仕様のデータベースを作ろうとしました。ただ、コアサーバーでは独自のコントロールパネルを使って、データベースを作るので、ローカルで同じ状況を再現するのには少々苦労しました。
　ここに、コアサーバーと同一のmysql環境を構築するまでの道のりを記録として残します。コアサーバー使っている少数の初心者の参考にできればと思います。

##環境
サーバー側
コアサーバー　：プラン CORE-MINI
DB：mySQL

ローカル側
ubuntu 20.04
DB:mySQL

##①Mysqlへログイン
###ローカル側
```shell
　mysql -u root
#若しくは
  sudo mysql
```

###コアサーバー側
写真１「データベースの設定画面」
※個人設定のある枠はぼかしています
![Screenshot from 2021-11-27 17-05-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/afc0806e-1c92-5a4f-58bd-97b6986c827e.png)

　コアサーバーのコントロールパネルにログインして「データベース」をクリックするだけなので、何ら難しくない。
　ちなみにsshを使ってCUI(黒い画面)からログインもできるが、自身の権限ではデータベースを作成することが出来ない。DBを作るにはコントロールパネルを使うしかないらしい。（もしできるようなら教えて下さいm(_ _)m）

##②DBを作りたい
###ローカル側
```sql
CREATE DATABASE データベース名;
```

###コアサーバー側
「写真２」DBの作成画面
![coreDBmake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/b966bead-9893-287c-c0b6-3fd65ce40a98.png)


　「DB名」は　ローカルsql側で入力した　「CREATE DATABASE ~~」の構文と一致する。パスワードは　次のステップで作るユーザーのパスワードを作ることになる。
※ちなみにsqlでは、データベースにパスワードはつけないらしい。代わりにユーザーにパスワードを付けている。各ユーザーにアクセスできるデータベースの制限を加えることで、間接的にデータベースを保護しているようだ。
　なおコアサーバーでの手続きはこれで完了♫。次の作業であるユーザー作成と権限付与は自動でやってくれる。

##③sqlのユーザーを作る
###ローカル側

```sql
CREATE USER user IDENTIFIED BY 'password'
-- user=ユーザー名　'password'=ユーザーのログインパス
```
　これがコアサーバーで言うところ、「写真２」のDB名と、パスワードに一致する。
　ちょっとまて、これはユーザー名だろ。データベースはさっき作っただろう？。確かにデータベースはさっき作った。しかし、コアサーバーではデータベース名と、それを使うユーザー名が<B>同一</B>のもので自動生成されるのだ。
　逆に言うと、ローカル環境でコアサーバーのデータベースを再現するなら、ユーザー名とデータベース名は同一のものにする必要がある

###余談　パスワードの水準チェック
　mysqlのデフォルトでは、パスワードの水準は「medium」＝「特殊文字使用かつ8文字以上の文字列にする」　になっているはずだ。
　別にそれに従えば良い話だが、コアサーバーではパスワードが15文字以下かつ特殊文字は使えない設定になっている（写真２参照）。
　つまり、デフォルトの水準に従ったパスワードは、コアサーバーでは受け付けないのだ。私はローカル環境で組んだコードを一切イジらず、そのままコアサーバーに転送できるようにしたい。転送するたびにパスワードを書き換えるのは面倒くさい。。ならば、ローカル環境のsqlさんに簡単なパスワードを許可してもらわねばならない

```sql
--ローカルのsqlにこの一文
set global validate_password.policy=LOW;
```
　これだけでパスワードの要件が最低に設定されるので、無事ローカル環境でも、コアサーバーと同じパスワードを設定することができる。

##④権限の付与
###ローカル側
　今作ったユーザーが、今作ったDBにアクセスできるように設定します。多分以下の設定がコアサーバーで与えられる権限と同じのハズ

```sql
GRANT ALL PRIVILEGES on DBname.* to "usename"@"localhost"
-- 'DBname'=データベース名　username=ユーザー名　を代入
```


##php　PDOの場合こんな感じでアクセスできます
```php
    $dsn = 'mysql:dbname=データベース名;host=localhost';
	$user = 'ユーザー名';
	//user とdbnameは同じでok;
	$password = 'パスワードを入れる';
	$pdo = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
```
　上手く行けばローカル環境でも本番のサーバー環境でも同じ内容でログインできるようになる。開発者のポリシー的に良いのかはわからないが、本番サーバーに転送する際に、ログイン情報を修正をしなくてよいのは楽だ。

###所感
　コアサーバーのコントロールパネルは、最小の入力でデータベースが作れるように工夫されている。それ故に、CUIを使って自力でデータベースを作ろうと思った際には少し誤解してしまうところがあった。元よりsqlを触れて、データベースをガリガリ組んでいた人には関係ないだろうが、先にコントロールパネルでデータベースを作っていた人の参考になれば良いと思う。
Pythonデータ分析試験に合格したので勉強方法を残しておく

# はじめに

[Pythonエンジニア認定基礎試験に合格した](https://qiita.com/h-ueno2/items/a461765bac4f04080f10)のでデータ分析試験も受けてみました。


# Python 3 データ分析試験

初めに簡単な試験概要を公式サイトより引用します。

https://www.pythonic-exam.com/exam/analyist

>試験名称：Python 3 エンジニア認定データ分析試験
（英名：Python 3 Certified Data Analyst Examination）
資格名：Python3 エンジニア認定データ分析試験合格者
（英名：Python 3 Data Analyst Certification）
概要：Pythonを使ったデータ分析の基礎や方法を問う試験
問題数：40問（すべて選択問題）
合格ライン：正答率70％

試験はCBT方式です。
試験時間は60分ありますが、20分程度で終わりました。
といっても早く解いたから何かボーナスがあるわけじゃないので、見直し等じっくり時間をかけても良いと思います。

合格ラインは正答率70%です。
問題数は40問なので、28問正解すれば合格です。
言い換えれば12問は間違っていても大丈夫なのです。


# 勉強について

## 参考にした書籍

試験の公式サイトによると、主教材として以下の書籍が紹介されています。


- 翔泳社「Pythonによるあたらしいデータ分析の教科書」

https://www.shoeisha.co.jp/book/detail/9784798158341

模擬や実際の問題の中には上記の書籍に記載されている文章ベースの問が幾つか出題されます。
例）「〇〇について以下の選択肢の中から正しいもの/誤っているものを選べ」など。

書籍としてはPython文法といった基礎的な内容から記載されており、私含めた初心者に優しい本となっています。


また、現在Pythonエンジニア育成推進協会にて、データ分析試験の主教材である「Pythonによるあたらしいデータ分析の教科書」がもらえるキャンペーンをやっています。

1. TwitterなどのSNSで受験宣言を投稿する。
    1. Pythonエンジニア認定基礎試験/データ分析試験 のどちらでも可。
1. 投稿のURLや住所などをフォームに入力して応募する。
1. 本が届く！

実際に私も応募して頂いた書籍で勉強し受験しました。
2021年11月末日まで、つまりあと数日なので、受験する予定のある方はご利用してみてはいかがでしょうか。

https://www.pythonic-exam.com/archives/news/555camp


## 試験対策

では実際に試験対策した内容について紹介します。
とはいっても、前回のエンジニア分析試験とほぼほぼ同様にひたすら模擬試験を解く事を繰り返すという方法になります。

1. 1~2週間ほどで教科書を読む。
  1. 私の場合は実務であまり用いていなかった記述やライブラリの使い方について実際にコードを書いたりしました。



1. 2週間くらい以下を繰り返す。
    1. **模擬試験を解く**
    1. **間違った問題を見直す**

という事でした。
間違った問題を重点的に見直すことで、効率的に得点を取ることができます。


何回か模擬試験を解いてみて、これはイケるなと思ってからテストセンターの予約を行いました。

## 模擬試験

Pythonエンジニア認定基礎試験の模擬試験としては2021/11現在、私の知る限り以下3サイトで公開されています。

- PRIME STUDY
 - 模擬試験が3試験分用意されています。
 - 最初にメールアドレスを入力します。この入力したメールアドレスに結果が送信されます。
 - `DIVE INTO EXAM`の問題よりも問題内容のコードが複雑だった印象があります。

https://study.prime-strategy.co.jp/


- DIVE INTO EXAM
 - 会員登録が必要です。
 - 模擬試験を受けるだけであれば無料会員で十分です。有料会員だと講座？が受けられるらしい？
 - 回答結果の履歴が保存される機能があります。
 - 試験を受ける度にランダムで出題される点がおすすめ。
 - 問題内容は`PRIME STUDY`よりも簡単め。
 - ごく一部ですが教科書で触れていないような内容も出題されたような気がする。

https://diver.diveintocode.jp/dive_into_exam


- トレノケート
 - 会員登録が必要です。
 - 今回、私は使用しませんでした。
    - エンジニア認定試験は上記2サイトだけで事済んだのと、たに会員登録する事が億劫だったので。。。
https://camp.trainocate.co.jp/map/python/


## 勉強しておくと良いポイント

模擬試験および本試験の内容からここら辺を勉強しておくと良いポイントを紹介します。

といっても、試験の公式ページを確認すると教科書の章節をベースに以下の通り出題範囲と割合が公開されています。
上記の模擬試験についても同様の範囲と割合で出題されています。なので模擬試験を繰り返し行うだけでも重点的に勉強したほうがよいポイントなどは身につくのかなと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/ffbf3d3b-4826-33cf-9921-474660f829a4.png)

出題の割合に注目しますと4章の`ライブラリによる分析実践`の内容が非常に配分が大きいです。
なので、勉強時間が不足している場合などに重点的に勉強するとしたらココなのかなと思います。



# 終わりに

上でも書いた通り10問くらいは間違ってても合格できます。なので、
普段から業務でPythonを使用してデータ分析系の業務をされている方でしたら、あまり力を入れずとも合格できるのではないかなぁと思いました。
expo bare workflowの環境で、wasmを使用したライブラリを読み込んで、expo build:webを通す

expo bare workflowの環境で、wasmを使用したライブラリを読み込んで、expo build:webを通す方法です。(=== React Native for Webでwasmを使ったパッケージを読み込みたい)
ちなみに、私が使用したいライブラリは、https://github.com/VirgilSecurity/virgil-e3kit-js です。

何も考えずに expo build:webすると以下のエラーがでます。

```
Module parse failed: magic header not detected
File was processed with these loaders:
 * ./node_modules/@expo/webpack-config/node_modules/file-loader/dist/cjs.js
You may need an additional loader to handle the result of these loaders.
Error: magic header not detected
```
webpack.config.jsを設定して、エラーが出ないようにします。以下のコマンドで、webpack.config.jsを選択するとwebpack.config.jsが作らます。同時に@expo/webpack-configをインストールするか聞かれるのでインストールします。


```
expo customize:web
```

file-loaderもインストールしておきます。

```
yarn add -D file-loader
```
webpack.config.jsを以下のように編集します。
ポイントは、@expo/webpack-configでは wasmが読み込まれないように一旦excludeに入れておいて、あらためて自分が設定したfile-loaderでwasmを読み込むことです。

```
const createExpoWebpackConfigAsync = require('@expo/webpack-config');

module.exports = async function (env, argv) {
  let config = await createExpoWebpackConfigAsync(env, argv);

  const wasmExtensionRegExp = /\.wasm$/;

  config.resolve.extensions.push('.wasm');

  //node_modules/@expo/webpack-config/webpack/loaders/createAllLoaders.jsのfile-loaderで
  // export default **** のwasmがstatic/media/の中に作られて、それを読み込もうとしてエラーになるので
  //wasmをそこでは処理しないようにexcludeに追加する。

  config.module.rules.forEach((rule) => {
    (rule.oneOf || []).forEach((oneOf) => {
      if (oneOf.loader && oneOf.loader.indexOf('file-loader') >= 0) {
        // make file-loader ignore WASM files
        oneOf.exclude.push(wasmExtensionRegExp);
      }
    });
  });

  //あらためて自分でfile-loaderを設定すると、wasmのバイナリデータのままstatic/jsに出力されるので、
  //問題なく読み込めるようになる。
  config.module.rules.push({
    test: wasmExtensionRegExp,
    type: 'javascript/auto',
    use: [{ loader: require.resolve('file-loader'), options: { outputPath: 'static/js' } }],
  });

  return config;
};
```

expo web:buidが通って、web-build/static/jsの中にバイナリのwasmファイルが出来ていればOKです。yarn webでアプリを起動して動作確認できれば大成功！


出来てしまえば簡単ですが、ググっても、react-app-rewiredとwasm-loaderを使うとできるとか、webpack5の方法とかは出てくるものの、どれも環境が微妙に違って上手くいかず、苦労したので共有しておきます。
AWSなんもわからん人におすすめ！！！

Volare Advent Calendar 22日目担当のみっきーです。
実は,今日(12月22日)はわたしの誕生日です！🎂
お祝いのLGTMお待ちしています笑
### この記事の対象者
* 本当の本当にAWS触ったことない人
* AWSにこれから入門したい人
* AWSクラウドプラクティショナー認定試験の受験を考えている人

## おすすめの教材
本題です！
おすすめの教材とは、Udemyの講座？書籍？ではないです。

AWSが公式で無料で提供しているトレーニングがめちゃくちゃわかりやすくておすすめです！！！！！！！

今回お勧めしたいトレーニングは、[AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)](https://aws.training/Details/eLearning?id=66479)です。
日本語字幕付きのコーヒーショップのかわいいアニメーション動画と共に学んでいきます。
特に、EBSとS3のバトルシーンは必見です。
最後にチェックテストもあり、理解度をはかることができます。


>コースの説明
このコースは、特定の技術領域ではなく、アマゾン ウェブ サービス (AWS) クラウドを全体的に理解したい方を対象としています。受講者は、AWS クラウドの概念、AWS のサービス、セキュリティ、アーキテクチャ、料金、サポートについて学習し、AWS クラウドについての知識を深めます。このコースは、AWS 認定クラウドプラクティショナー試験の準備にも役立ちます。- コースレベル: 基礎- 所要時間: 6 時間

所要時間6時間とありますが、チェックテストを読み込んだり、動画を見返したりしていたので、わたしは6時間以上かかりました。

## 学んだこと
* AWSのサービスの特徴について。
    * EC2、データベースやストレージなど使い方や利点などを説明してくれています！コースの概要をみていただくとわかるのですが、よく使うようなAWSのサービスを広く浅く紹介してくれています。
    * 嬉しいポイントとしては、似たサービスの使い分けのシーンを具体的に教えてくれるところです。

AWSクラウドプラクティショナーの出題範囲の雰囲気。
また、コースの概要は以下の通りになっていて、かなりボリュームがあります。

>コースの概要
モジュール 1: アマゾン ウェブ サービスの紹介
モジュール 2: クラウドでのコンピューティング
モジュール 3: グローバルインフラストラクチャと信頼性
モジュール 4: ネットワーク
モジュール 5: ストレージとデータベース
モジュール 6: セキュリティ
モジュール 7: モニタリングと分析
モジュール 8: 料金とサポート
モジュール 9: 移行とイノベーション
モジュール 10: クラウドジャーニー
モジュール 11: AWS 認定クラウドプラクティショナーの基本
コース修了時の認定テスト

## 嬉しい特典
無事にトレーニングを完走すると名前入りの認定証がもらえます。(ここでは名前は消してます)
嬉しいですね:relaxed:

![修了証.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520177/8d97f37f-d389-d0aa-d0ca-85b639b07fc5.jpeg)

https://twitter.com/mikiko_bridge/status/1416604826566156290?s=20

## おわりに
この動画の後は、他のトレーニングを受けたり、ブラックベルトを読んだりして知識を増やしたりしていくと良いと思います。他のトレーニングでは、ハンズオンもあったと思います。
おすすめのトレーニングが他にありましたら是非教えてください！
最後までご覧いただきありがとうございました！