OmniAICreator/Qiita-1.07M huggingface dataset:
[CircleCI CLI]インストールエラー"mv: cannot move 'circleci' to '/usr/local/bin/circleci': Permission denied"の対処法。

# はじめに

https://circleci.com/docs/ja/2.0/local-cli/

`.circleci/config.yml`のバリデーションを行うため、公式ドキュメントに記載されているコマンドでCircleCI CLIをインストール。

```
curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh | sudo bash
```

するとこんなエラーが発生。

```
Starting installation.
Installing CircleCI CLI バージョン
Installing to /usr/local/bin
mv: cannot move 'circleci' to '/usr/local/bin/circleci': Permission denied
An error occured installing the tool.
The contents of the directory /tmp/7RkvButnut have been left in place to help to debug the issue.
```

移動できないとかなんとからしいです。
手動で移動しろということでしょうか。

# 対処方法

こちらのissueを参考にしました。

https://github.com/CircleCI-Public/circleci-cli/issues/293

エラーメッセージで「`/tmp/7RkvButnut`にあるよ～」と言われているので、
`/tmp/7RkvButnut`に移動。
`/tmp/7RkvButnut`内の`circleci`ファイルを`/usr/local/bin`に移動させる。

```
sudo mv circleci /usr/local/bin
```

これで一時ファイルからの移動は完了。

というわけで上手くいったかどうか確かめてみる。

`.circleci/config.yml`の親ディレクトリに移動して、
```
$ circleci config validate

# 構文に間違いがなければ、このメッセージ。
Config file at .circleci/config.yml is valid.
```

問題なくバリデーションが実行できました。

# おわりに

作業効率のためにも、無事にバリデーションが使えるようになって良かったです。
YAPC::Japan::Online 2022 発表資料に飛べるツイートまとめ #yapcjapan

## はじめに

2022/03/04(金), 05(土)に、オンラインでPerlのカンファレンス YAPC::Japan::Online 2022 が開催されました。

カンファレンスや勉強会参加時は、Twitterで見つけた資料をリツイートしておき、直後に**自分のタイムラインをたどる**ことで復習できるようにしています。
タイムラインのバックアップとして、また、結構手短にできそうだった[^1]ので、この記事を書きました。
**直リンクではないですが、発表資料には飛べるページ**になっています。
追加できるリンクがあれば編集リクエストをお願いします！

[^1]: https://qiita.com/mziyut/items/bc00ed7396bd60a717b8#qiita-%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%AB%E3%83%BC%E3%83%89 を見て、「URIの前後に改行入れるだけ！とっても簡単」と感じ、書いてみました

資料の直リンクやアーカイブ動画へのリンクは公式サイトに載るんじゃないかなーと思ってます。
公式サイトに掲載された時点で、このページは保守しなくなります。ご了承ください

※Qiita リンクカードで埋め込んだツイートが多いために、URLがツイートの埋め込みとして表示されるまでに待ち時間があるようです（待っているとすべて埋め込まれました）

## 同様のエントリ

`#yapcjapan` ハッシュタグで感想ブログを見かけたところ、資料まとめを見つけたので、リンク集にします

https://sironekotoro.hateblo.jp/entry/2022/03/06/161605

（見つけたら更新します）

## タイムテーブル

https://yapcjapan.org/2022online/timetable.html

- 2トラック並列
- 2日間で14本
  - 20分5コマ
  - 40分2コマ

## キーノート（by songmuさん）

https://twitter.com/songmu/status/1500033061940973570

## トーク

まず1日目の4本です（20分トーク）。

### TypeScript へ型安全性を高めながらリプレースする

https://twitter.com/_kimuson/status/1499756610394398724

### PHP で NFC リーダーを実装する

https://twitter.com/m3m0r7/status/1499713023547932674

### my$talk=qr{((?:ir)?reg(?:ular )?exp(?:ressions?)?)}i;

https://twitter.com/dankogai/status/1500079246781599746

### ReDoS 検出の最先端 recheck の紹介

https://twitter.com/make_now_just/status/1499725880264126467

ここから下は2日目です。

### 5年にわたる "Perl の" REST API を "Perl で" GraphQL API 化し作り直す

https://twitter.com/mangano_ito/status/1499996331309342721

### じわじわとPerlからGoに移行しようとしている俺達のマイクロサービシーズの紹介

https://twitter.com/mackee_w/status/1499961433194262529

### スクラムでつくる頼もしく生き生きとしたチーム

https://twitter.com/yigarashi_9/status/1499993943953805317

### Hono[炎] Ultrafast web framework for Cloudflare Workers.

https://twitter.com/yusukebe/status/1499989656124858373

### あなたの知らない(かもしれない)コアモジュール

https://twitter.com/argrath/status/1500004705958875144

### フロー効率の向上から始める開発生産性の高め方 ~ モブワークを沿えて ~

https://twitter.com/omokawa_yasu/status/1500000915566510080

### perlimportsから探るPPIの世界

https://twitter.com/AnaTofuZ/status/1500012123086540801

### エンジニアの個人ブランディングと技術組織

https://twitter.com/onk/status/1500008744432058368

### Acme、其はPerlのユグドラシル（ベストトーク！！🏆）

https://twitter.com/maka2_donzoko/status/1500046334690471937

### 7年間運用したソーシャルゲームをAmazon EC2構成からAmazon ECS構成へと乗り換えた話

https://twitter.com/commojun/status/1500026489345310721

## LT

ラインナップはこちら！

https://blog.yapcjapan.org/entry/2022/03/03/185259

### MyDNSとUnboundが同居していることにハマった

（2022/03/06時点 未発見）

### aaa.pl （ベストLT！🏆）

https://github.com/gugod/aaa-pl

### Perlの力も使って聴かせるAIの声

https://twitter.com/ftnext/status/1500042299035701252

### CTOになりたいと思っていたけど今はそのときではないと気づいた件 

https://twitter.com/ariaki4dev/status/1500040977930543105

### prototypeとjust epic. と私

https://twitter.com/utgwkk/status/1500043797215907840

補足

https://twitter.com/utgwkk/status/1500052826747445256

### Perl詩を味わう

https://twitter.com/take_3/status/1500358483228512259

### Tシャツに書かれたコードを読む

https://tech.mobilefactory.jp/entry/2022/03/05/120000

以上です。
Vue, Reactの配列で使うkeyについて

React、Vueだと配列データを描画する際に各々のデータに`key`をセットしないとWarningが出ると思うのですが、このkeyに入れる値で、先日プルリクのレビューで新たな学びがあったので備忘録として記事にします。

レビューで指摘されたのは、

>map()で、indexを使うのは、iteration対象（ループするもの）の値にkeyとして利用できるものがない場合のみにしましょう。

#### つまり、`index`は極力使わないという事でした。

### keyにindexが良くない理由
静的なデータで毎回中身が変わらないデータであればkeyにindexを使っても支障はないのですが、追加、削除などを伴う動的な配列データのkeyにindexを使うと期待通りに表示されないことが起こる。

indexはユニーク値ですが、データの追加・削除をした場合にindexの値も変化するからです。

### keyに使える値はユニーク値であれば何でもいい
てっきりkeyにはid（ユニーク値だから）を使うものと思い込んでいましたが、別にそんなことはなく、ユニークな値であれば何でもよいらしいです。例えば、

・Eメールアドレス
・作成日などのUNIXタイムスタンプ（全く同じ時間に作られることはほぼない）
・単体でユニーク値がなければ、複数のデータを組み合わせて、ユニーク値を作る
などなど
CloudWatchAlarmの発砲テスト方法

# これは何？
CloudWatchAlarmからSNSへ連携されてLambdaがトリガーされる仕組みを作っていたのですが、
アラート発生のテストで毎回CPU使用率を上げるなど面倒だったが簡単な方法を見つけたのでメモです。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/US_AlarmAtThresholdEC2.html#cpu-usage-alarm-cli

https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/set-alarm-state.html

## CloudWatchAlarmテストコマンド
`<Alarm Name>`をテストしたいCloudWatchAlarm名に変更して実行します。

```
aws cloudwatch set-alarm-state --alarm-name <Alarm Name> --state-value ALARM --state-reason "test"
```

## CloudWatchAlarmのアラーム状態解除コマンド

```
aws cloudwatch set-alarm-state --alarm-name <Alarm Name> --state-value OK --state-reason "test"
```
[Salesforce]レコード履歴機能の比較

# レコード履歴を取る機能は複数ある
Salesforceには、レコードの項目値の履歴を取るための機能が複数存在しています。
- [フィード追跡](https://help.salesforce.com/s/articleView?id=sf.collab_feed_tracking_overview.htm&type=5)
- [項目履歴管理](https://help.salesforce.com/s/articleView?id=sf.tracking_field_history.htm&type=5)
- [項目監査履歴](https://help.salesforce.com/s/articleView?id=sf.field_audit_trail.htm&type=5)
- [履歴トレンドレポート](https://help.salesforce.com/s/articleView?id=sf.reports_historical_setup.htm&type=5)
- [レポート作成スナップショット](https://help.salesforce.com/s/articleView?id=sf.data_about_analytic_snap.htm&type=5)

それぞれ、どんな用途に向いているかを説明します。

# 各機能の比較

| 機能 | 説明 | 主な用途 | 保持期間(As Of 2022/02) |
| --- | ---| --- | --- |
| フィード追跡| Chatterフィードに項目が変更されたことを記録する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/05cd6d24-c200-8f73-d5f5-e121243bb114.png) | コラボレーション| 45日を経過したフィード更新追跡に、いいね! やコメントがない場合は、自動的に削除される。 |
| 項目履歴管理| 関連リストに項目が変更されたことを記録する。レポートでも表示可能。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/4c11e593-fc18-8e98-d84e-c1f0d4d1c8c0.png)| 監査、記録保持 | 画面経由で最大 18 か月間、API 経由で最大 24 か月間取得可能。<br />ただし、項目監査履歴アドオンを買えば最大10年間となる。その場合、24か月を過ぎたデータは別オブジェクトに格納される。 |
| 履歴トレンド| レコードの経時的な項目値の変化を記録し、レポートで各断面を比較できる機能。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/495c3c51-345a-3182-a111-14bec3d9be6c.png)| レポートのトレンド把握(3か月未満) | 過去3か月間 |
| レポート作成スナップショット| レポートのスナップショットを別オブジェクトに保存する機能。| レポートのトレンド把握(3か月以上) | 最大2000件 |
Wordで論文を書くときの図の拡張子

### はじめに
普段 LaTex で図をゼミ原稿や論文を書いているものの、Word で書かないといけなくなった！そんなケースを想定します。私は主に、学会の論文フォーマットが Word であったときや、就職活動の研究概要所にて、そんなケースにぶち当たりました。
LaTex で図を挿入するとき、\includegraphics にて pdf や eps を利用すると思います。しかしWordでは pdf や eps は挿入できません。真っ先に思うのは、「せや、png 変換したろ」でしょう。しかし困った。

**画質が悪ぃ…！**

### どうする？
結論。emf ファイルに変換しよう。変換の方法は、ブラウザアプリを使うと便利です。例えば、Convertio とか。

https://convertio.co/ja/eps-emf/

### なぜ？
そもそも画像とは、ベクター形式とラスター形式に分類されます。png はラスターで、eps はベクターです。一般にベクターの方が軽く、画像を拡大しても画質が落ちることはありません。eps, emf ともにベクターであり、相性がいいのかなぁと思っています。
ただし、eps → emf とすると、埋め込みサブセットを満たさない恐れがあります。
また、グラフは emf でよいっぽいですが、ポンチ絵ではむしろマイナスかも？試行錯誤が今後も必要そう。

### 参考
・[vectorイメージについて（論文における画像ファイルの種類 その２）](http://blog.livedoor.jp/minetan345/archives/51663834.html)
・[エクスポート形式の違い](https://www.mdf-soft.com/Prism6_UserGuide/index.htm?chosing_an_export_format.htm)
「心理的安全性の作り方」読書メモ

心理的安全性のつくりかた
https://www.amazon.co.jp/dp/4820728245/ref=cm_sw_r_apan_glt_i_PAJXHWGYFAZJKBAWA8Y9
を読んだので読書メモ。

## 第1章 チームの心理的安全性
心理的安全性についての基本的な話。ぬるま湯チームな訳では無い。心理的安全性が高く、かつ仕事の基準が高い（目標ではなく、仕事の妥協点が高い）職場は「学習して成長する職場」となる。
「日本版『チームの心理的安全性』の4つの因子」が面白い。元々提唱された「心理的安全性を計測する７つの質問」は、日本では上手く機能しなかったらしい。
日本では①話しやすさ、②助け合い、③挑戦、④新奇歓迎の４つの因子があるとき、心理的安全性が感じられるようになる。
またそれぞれについて「構造・環境」「関係性・カルチャー」「行動・スキル」の3つの視点がある。本書は関係性・カルチャーを変えることが主なスコープとなっている。

## 第2章 リーダーシップとしての心理的柔軟性
リーダーシップには取引形（成果主義）、変革型（ビジョンを示す）、サーヴァント型（メンバーを支える）、オーセンティック型（己の強み弱みを活かす）の4つの型があるが、心理的安全性のためにはこれらを使い分ける必要があり、それが出来るのを心理的柔軟なリーダーシップと呼んでいる。
メンバーに影響を与える時は性格や心の中ではなく、行動にフォーカスした方が効果的。自信を引き出す、やる気を出させるといった意識ではなく、具体的な行動を取れるかどうかを論点にする。4つの因子も行動の集積として表現出来る。
心理的柔軟性のための3要素「必要な困難に直面し、変えられないものを受け入れる」「大切なことへ向かい、変えられるものに取り組む」「それら変えられないものと、変えられるものをマインドフルに見分ける」見分けるとはバイアスを取り除き、精神的なものと具体的な行動を区別し、因果を分解する訓練を行うこと。

## 第3章 行動分析で作る心理的安全性
行動分析の最も基本的なフレームワークは「きっかけ→行動→みかえり」。見返りには好子と嫌子があり、好子が増えるか嫌子が減ると行動が活性化する。逆だと行動が抑制される。基本的には好子を用いた方が効果的。みかえりは、中長期的なものより短期的なものの方が強く作用する。また受け身、否定、結果などは行動には含まず、能動的かつ自分から作りだすことが出来るもののみを行動として扱う。きっかけとみかえりを変えることで、行動を変えることが出来る。これにより心理的安全性の4要素を活性化させていく。

## 第4章 言葉で高める心理的安全性
言葉によって、従来気がつけなかったみかえりを行動と関係付け、行動をコントロールすることが出来る。これにより目の前の好子嫌子を超えて中長期的な視野での努力を促すことが出来る（ルール支配的行動）。
「言われた通り行動」は行動そのものからみかえりを得ていない状態、「確かにそうだな行動」は行動そのものからみかえりを実感できる状態であり、前者を減らして後者を増やすようなルール作りが必要。また「そんな気してきた行動」はみかえりの好子嫌子を増加減少させること。言葉によってこれらをコントロール出来る。

## 第5章 心理的安全性導入アイデア集
行動・スキルレベルで心理的安全性を作り出すテクニックと、関係性・カルチャーレベルで心理的安全性を作り出すテクニックがまとめられている。
ケーススタディもあり、チームをレベルアップさせたいなら実際に取り組んでみてもいいと思う。

## ポエム
心理的安全性が重要なことは重々承知していたが、それを高める具体的な方法が理論建てて解説されているのが良い。メンバーでもリーダーでも管理職でも役に立つと思う。心理的安全性だけでなく、例えばチームの振り返りのアクションを考える時にも役に立ちそう。
この本を読んでおきながらなんだが、別に心理的安全性の低いチーム出働いている訳では無いと思う。ただ、さらに高い基準を目指すために、まずはチーム内で挑戦をもっと引き出せるようにした方がいいかもしれない。今は挑戦に対する嫌子が多いから、それを取り除くところからだろうか。
そういえば、部署レベルだと最近は自分の取り組んだことや改善的を発表して共有する場が盛んに設けられているけど、あれって別にみかえりが発生してない気もする（むしろ発表がコスト）。あれもひと工夫できないだろうか。
react-admin の ImageField でサイズを指定する

## TL;DR
 - react-admin の ImageField でサイズを指定する

## カスタムコンポーネント

```tsx
import { ImageField } from "react-admin";
import PropTypes from "prop-types";
import { makeStyles } from "@material-ui/core/styles";

const useStyles = (width: number) => makeStyles({ image: { width } })();

export const MyImageField = ({ width = 480, ...props }) => {
  const classes = useStyles(width);
  return <ImageField {...props} classes={classes} />;
};

MyImageField.defaultProps = {
  addLabel: true,
  textAlign: "center",
};

MyImageField.propTypes = {
  width: PropTypes.number,
};
```

## 使い方

```tsx
import { MyImageField } from "../MyImageField";

const list = (props) => (
  <List>
    <Datagrid>
      <MyImageField source="photo.src" width={80} />
    </Datagrid>
  </List>
);
```

## 参考
 - https://github.com/marmelab/react-admin/issues/3106#issuecomment-658752706
TerraformでAmazon Route 53をインポートする

Route 53のレコードのインポート方法が若干特殊で手間取ったので、メモしておきます。

# ホストゾーン(Hosted zones)のインポート
tfファイルに空のリソースを定義し、
```terraform
resource "aws_route53_zone" "hogehoge" {
}
```

ホストゾーンID(Hosted zone ID)を指定してインポートします。
```
terraform import aws_route53_zone.hogehoge XXXXXXXXXXXX
```

ホストゾーンIDは「ホストゾーンの詳細」の欄にあります。
![Screen Shot 2022-03-06 at 12.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368271/ad54f0da-3b2c-4773-a8e4-720988e58ba3.png)

# レコードのインポート
同様にtfファイルに空のリソースを定義します。
```terraform
resource "aws_route53_record" "fugafuga" {
}
```

リソースの指定方法はちょっと特殊です。[Terraformのヘルプページ](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record#import)にはこうあります。
> Route53 Records can be imported using ID of the record, which is the zone identifier, record name, and record type, separated by underscores (_)E.g.,

> (意訳) Route53のレコードをインポートするためには、ホストゾーンID・レコード名・レコードタイプをアンダースコアで区切ったIDを指定する必要があります。

ホストゾーンIDは、インポートしたいレコードが所属するホストゾーンのIDです。(ホストゾーンをインポートするときに指定したID)

レコードタイプはDNSレコードの種別で、ルーティング先のリソースによって変わります。
例えばALBにルーティングしたい場合は`A`に、他のドメインにルーティングする場合は`CNAME`になります。

Hosted zone IDが`XXXXXXXXXXXX`、ドメイン名が`www.sample.com`、レコードタイプが`A`のレコードをインポートする場合は次のように指定します。

```
terraform import aws_route53_record.fugafuga XXXXXXXXXXXX_www.sample.com_A
```
Lambda/SAM ログ出力方法 メモ


* Lambdaでのログ出力をsam cliを使って試したのでメモとして残しておく。

## 事前準備

* sam プロジェクト作成

  ```shell
  sam init
  ```

  ※ランタイムはPython3.8を選択。



## コード

* `template.yml`

  **ログレベル**を環境変数として設定する

```yaml
...
	Environment:
        Variables:
          LOG_LEVEL: !Ref LogLevel
...
Parameters:
  LogLevel:
    Type: String
    Default: INFO
```



* `app.py`

  ```python
  import json
  import logging
  import os
  import requests
  
  def lambda_handler(event, context):
      logger = logging.getLogger()
  
      # ログレベル設定※環境変数から取得
      LOG_LEVEL = os.environ.get('LOG_LEVEL')
      level = logging.getLevelName(LOG_LEVEL)
      logger.setLevel(level)
      # ログフォーマッター
      formatter = logging.Formatter(
          '[%(levelname)s]\t%(asctime)s.%(msecs)dZ\t%(aws_request_id)s\t%(clientip)s\t%(message)s\n',
      '%Y-%m-%dT%H:%M:%S'
      )
      handler = logging.StreamHandler()
      handler.setFormatter(formatter)
      logger.addHandler(handler)
      try:
          ip = requests.get("http://checkip.amazonaws.com/")
          logger.debug('debug test')
          logger.info('info test',extra={'clientip': ip.text.replace("\n", "")})
      except requests.RequestException as e:
          print(e)
          raise e
  
      return {
          "statusCode": 200,
          "body": json.dumps({
              "message": "hello world",
              "location": ip.text.replace("\n", "")
          }),
      }
  
  ```

  

## 動作確認

* ビルド

  ```
  sam build --use-container
  ```

  

* 起動

  ```shell
  sam local start-api
  ```

  

* 呼び出し

  ```
  GET /hello HTTP/1.1
  Host: localhost:3000
  Content-Type: application/json
  ```

* レスポンス

  ```
  {
      "message": "hello world",
      "location": "xxx.xxx.xxx.xxx"
  }
  ```

* ログ出力

  ```
  [INFO]  2022-03-04T11:41:50.627Z       {AWS_REQUEST_ID}    xxx.xxx.xxx.xxx   info test
  ```

  ※環境変数が読み込まれデバッグログは出力されない。



## 参考情報

* [Python の AWS Lambda 関数ログ作成](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-logging.html)
dirsub.bat カレントフォルダー以下のファイル、フォルダーを相対パスで表示するバッチファイル

dirsub.batの使い方
```
drisub.bat
```
引数無しで実行すると、カレントフォルダー以下の全ファイルが相対パスで表示される
```
dirsub.bat *.txt
```
のように実行すると、カレントフォルダー以下の該当ファイルが相対パスで表示される
```
dirsub.bat \
```
で実行すると、カレントフォルダー以下の全フォルダーが相対パスで表示される
```
forfiles /s /m * /c "cmd /c if @isdir==FALSE echo @relpath"
```
というコマンドは有るが、出力結果にダブルクォーテーションと
行頭にドットバックスラッシュが付加されてしまう。
打ち込む文字数多い。
```
dir/s/b
```
というコマンドオプションはあるが、フルパスで表示されてしまう。

concat.batの使い方

dirsub.bat *.txt *.cfg *.py > file_list.txt
concat.bat file_list.txt

のようにすると、該当ファイルが1つのテキストファイルにまとめれる。
##################################################
```
::This software includes the work that is distributed in the Apache License 2.0.
::https://www.apache.org/licenses/LICENSE-2.0

::dirsub.bat

@echo off

setlocal enableDelayedExpansion

if "%~1" == "" (
	for /r %CD% %%A in (*.*) do (
		set par_dir=%%~dpA
		set file_path=!par_dir:%CD%\=!%%~nxA
		if exist !file_path! (echo !file_path!)
	)
) else (
	for /r %CD% %%A in (%*) do (
		set par_dir=%%~dpA
		set file_path=!par_dir:%CD%\=!%%~nxA
		if exist !file_path! (echo !file_path!)
	)
)

endlocal
```
##################################################
```
::This software includes the work that is distributed in the Apache License 2.0.
::https://www.apache.org/licenses/LICENSE-2.0

::concat.bat

@echo off
chcp 65001 > nul

set file_name=result.txt
set sep=##################################################

type nul > %file_name%

for /f "delims=" %%A in (%*) do (
	(echo #%%A) >> %file_name%
	(echo;) >> %file_name%
	type %%A >> %file_name%
	(echo %sep%) >> %file_name%
)
```

元記事
https://egg-sandwich.com/blog/2022/03/06/dirsub-bat-%e3%82%ab%e3%83%ac%e3%83%b3%e3%83%88%e3%83%95%e3%82%a9%e3%83%ab%e3%83%80%e3%83%bc%e4%bb%a5%e4%b8%8b%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%80%81%e3%83%95%e3%82%a9%e3%83%ab%e3%83%80/
EV3 classroomでデイジーチェーン（daisy chain）

## EV3 classroomでデイジーチェーン（daisy chain）

#### デイジーチェンとは…
EV3本体を2個つなぐことで、ポート数を増やすこと。

#### 方法
1.USBでEV3本体どうしを接続する。(4台まで、Bluetooth,Wifiでできる可能性あり)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/bac12bd7-e2b2-9bfd-0423-1b92016a8e65.png)
2.レイヤー番号"1"のEV3をPCに接続(レイヤー番号は上の写真の左から1,2,3,4)
3.ポートの指定には変数を使います。公式は"**レイヤー番号×100＋ポート番号**"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/0cab7e49-dcaf-8b17-64fe-55af50be8f91.png)
#### 注意
- モーターのポートの番号はA→1, B→2, C→3, D→4
- 移動ブロックで使用できるモーターは、1層につき1組のみ
- 移動ブロックの場合、右側のモーターポートに変数を追加するだけ  

#### 使ってみた感想
教育版EV3ソフトウェアだと、どのレイヤーにどんなセンサーないしモーターが繋がっていて、どんな値なのかを随時確認できる。だが、Classroomだとそれができないのだ。  
プログラムをする側からするとこれはかなり痛い。  
つまるところ、デイジーチェーンを使いたければClassroomではなく、教育版EV3ソフトウェアを使うのが無難だろう。また、[Multiplexer](http://www.mindsensors.com/ev3-and-nxt/23-ev3-sensor-multiplexer-for-ev3-or-nxt)を使うのも１つの手だろう。

参考文献:  
https://ev3lessons.com/en/ProgrammingLessons/advanced/scratch-DaisyChain.pdf
https://afrel.co.jp/archives/22929
AWS DOP(DevOps Engineer - Professional) 受験記

# この記事について
AWS認定のDOP（DevOps Engineer - Professional）に合格したので、そこに至るまでの対策等を紹介していきます。

# 前提
AWS認定で、既に所持している資格

- CLF
- SAA
- SOA
- DAV
- SAP([受験記](https://qiita.com/hirorinjp5/items/8e3723b7e8f60428de94))

# 受験までの流れ
2022/02半ば: 勉強開始
2022/03: 受験

# 試験対策

## 1. デジタルトレーニング
英語ですが、動画で解説しているので何となく分かると思います。
どういったサービスについて出題されるのかというところがなんとなくわかるようになります。

[試験準備: AWS Certified DevOps Engineer - Professional](https://explore.skillbuilder.aws/learn/course/external/view/elearning/74/exam-readiness-aws-certified-devops-engineer-professional?devops=sec&sec=prep)

## ２． AWS問題集
試験対策本もないので。
ちょっとお値段は張りますが、回答の説明についても丁寧に記述されており、かなり有用でした。

[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com)

金銭的に厳しいといったことがあれば、以下のUdemyの教材も良いです。

## 3． Udemy
ちょうどお安くなってた時期だったので、買ってみました。英語なので翻訳して解きました。

[Practice Exam | AWS Certified DevOps Engineer Professional](https://www.udemy.com/course/aws-certified-devops-engineer-professional-practice-exam-dop/)

## 4. 認定公式ページのサンプル問題
下のほうにある「試験の復習」にサンプル問題があります。試験ガイド等もあるのでぜひ読んでおきましょう。

[AWS Certified DevOps Engineer - Professional](https://aws.amazon.com/jp/certification/certified-devops-engineer-professional)

## 5. 模擬試験
無料で受けられるのと解説も丁寧なので、是非。

[スキルビルダー](https://explore.skillbuilder.aws/learn/catalog?ctldoc-catalog-0=se-%22AWS%20Certification%20Official%20Practice%20Question%20Sets%22?devops=sec&sec=prep)

## 6. Blackbelt
問題集等を解いていて、わからないなというサービスを中心に読んでいくことで理解が深められます。

[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

Beanstalk、Star系は読み直しました。

# 試験当日
SAPに比べると問題文も短い気はするので、2時間ちょっとで終わるかなという気持ちで行きました。
### 試験を迎える直前
SAPと変わらないです。
- しっかりと睡眠・食事を取っておく
- 飲み物は試験数時間前から控える
- 栄養ドリンクを直前に飲んでおく
    
### 試験中
- 用意されている耳栓を使う
    - できるだけ集中したい
- 見直しフラグはどんどんつける
    - わからない所・ちょっと不安なところは後で見直せるように
- 30分に1回程度は、足を動かしたり伸びをしたりする
    - 長丁場なので集中力が落ちてくる
 

土曜日で試験を受けに来る人が多かったので、SAPのときよりちょっと集中しづらかったです。
予想通り1時間45分で解答し終えて、見直しに30分くらい使って終わりました。
わからない問題が０問、ふんわりとした問題が１０問程度という感覚だったので問題なく受かりました。

# さいごに

### 勉強期間について
SAPで長文にだいぶ慣れたので、問題集を解くのに苦労はしなかった印象です。
DAPの知識がある & SAPの後であれば、半月程度あればいけるかなという感覚です。

### 試験について
解答についてもサービスの幅が狭い分、結構絞り込みやすかったかなと思います。
SAPに比べると、直訳な問題が多かったのでそのあたりは慣れが必要です。
特にコロナ渦ということもあり、受けに行くなら平日のほうが空いていて良いなと思いました。
SAPのように長文が多いほうではありますが、Star系をしっかり予習できていれば良いと思います。
Flutter 2.10.0 + M1環境構築メモ

# Android studio
公式のユーザガイドに従ってインストールします
https://developer.android.com/studio/install?hl=ja

# Xcode

AppStoreからインストールします。
環境によって時間がかかるのでインストールを眺めながら待ちます。

```bash
$ tail -f /var/log/install.log
```

# cocoapods

`gem install`コマンドでインストールする方法がケースが多いですが、2022/2現在M1 macだと`ffi`がM1に対応していなく`cocoapods`が動作しないため`Homebrew`経由でインストールします。

```bash
$ brew install cocoapods
```

# vscode

`AndroidStudio`と`vscode`両方試してみたのですが個人的にはvscodeが使いやすかったです。
エミュレータのみ`Simmulator`, `AndroidStudio`を使用して コーディングは`vscode`を使用しています。

# Flutter
公式サイトからバイナリをインストールして任意の場所に配置してパスを通す

https://docs.flutter.dev/get-started/install

# `flutter doctor`

あとは`flutter doctor` コマンドを実行すると環境構築に不足しているところと解決方法もが出力されるのでそれに従う
ESP32 Arduino で  error: 'boolean' does not name a type

# 環境

- Arduino 1.8.10 Linux 版
  - portable  化済
- esp32 by Espressif Systems Version 1.0.3
- Ubuntu Linux 20.04 AMD64
- NFC library for Arduino
https://github.com/elechouse/PN532


# エラー内容

コンパイル時に以下のようにエラーが出た

```

.../libraries/PN532_SPI/PN532_SPI.h:23:5: error: 'boolean' does not name a type
     boolean isReady();
     ^
.../libraries/PN532_SPI/PN532_SPI.cpp:66:21: error: 'isReady' was not declared in this scope
     while (!isReady()) {
                     ^
.../libraries/PN532_SPI/PN532_SPI.cpp:142:28: error: no 'boolean PN532_SPI::isReady()' member function declared in class 'PN532_SPI'
 boolean PN532_SPI::isReady()
                            ^
```

# 解決

この原因は esp32 で boolean が定義されていないこと。


PN532_SPI.cpp を開き、以下のように変更したらOK。


```diff
-    boolean isReady();
+    bool isReady();
```

# cf.,

別のライブラリでも issue が出ていました
「Error compiling for ESP32 · Issue #79 · Seeed-Studio/PN532」
https://github.com/Seeed-Studio/PN532/issues/79
React コンポーネントのexport方法

# コンポーネントのexport方法は２種類ある

## default export
DefaultExport.jsx

```react
import React from "react";

export default DefaultExport = () => {
  return <h1>default export</h1>;
};
```

App.jsx

```react
import React from "react";
import DefaultExport from "./DefaultExport";

export default function App() {
  return (
    <div>
      <DefaultExport />
    </div>
  );
}
```

DefaultExport.jsxをimportするときにコンポーネント名を自由に定義できる。
下記はコンポーネント名をTestとしてimportしてみたもの。

```react
import React from "react";
import Test from "./DefaultExport";

export default function App() {
  return (
    <div>
      <Test />
    </div>
  );
}

```

## named export

NamedExport.jsx

```react
import React from "react";

export const NamedExport = () => {
  return <h1>named export</h1>;
};
```
これをApp.jsxでimportするためには、
App.jsx

```react
import React from "react";
import { NamedExport } from "./NamedExport";

export default function App() {
  return (
    <div>
      <NamedExport />
    </div>
  );
}
```
import時にコンポーネント名を自由につけることはできず、
importするときは、exportした名前を{}でかこう必要がある。

# 結局どっちがいいの？
自由にコンポート名をつけることができない分、間違いなどに気づきやすいのはnamed export。
しかし、React.lazyを使う場合にはdefault exportしか対応していない。
Vue.js v-forの使い方

# 概要
Vue.jsでv-forによる処理の方法を記載します。

# 記述方法
v-forは以下のように`変数 in 配列`という形式で記載します。
タグは処理の内容によって変更してください。
```html
<template v-for="変数 in 配列">
    // 処理内容
</template>
```

# 実例 
データ配列をテーブルに出力する、bodyタグ内の実装例を挙げます。

```html
<body>
    <div id="app">
        <table>
            <tr>
                <th>item1</th>
                <th>item2</th>
                <th>item3</th>
            </tr>
            <tr v-for="list in lists">
                <td> {{ list.item1 }} </td>
                <td> {{ list.item2 }} </td>
                <td> {{ list.item3 }} </td>
            </tr>
        </table>
    </div>
    <script>
        var data = {
            lists:[
                {item1:'aaa', item2:'bbb', item3:'ccc'},
                {item1:'ddd', item2:'eee', item3:'fff'},
                {item1:'ggg', item2:'hhh', item3:'iii'},
            ]
        }

        var app = new Vue({
            el: '#app',
            data: data
        });
    </script>
</body>
```

# 実行結果
以下のようになれば成功です。
```
item1	item2	item3
aaa	    bbb	    ccc
ddd	    eee	    fff
ggg	    hhh	    iii
```
styleで枠などを実装してあげるとよりテーブルっぽくなると思います。
【PostgreSQL】基本構文早見表～INSERT,UPDATE,DELETE文編～

# 本記事の内容
PostgreSQLのINSERT,UPDATE,DELETE文で使用する基本的な構文を紹介します。
SELECT文については[こちら](https://qiita.com/milestone/items/ca6b4b6c7955dd05fba3)。
その他の構文については別記事にて紹介予定です。
※本記事はPostgreSQL 13を参考に記載しています。
※本記事はSQLを学んだことある人向けに、SQLの基本構文の早見表としてまとめています。構文の詳細は記載しておりませんのでご了承ください。

# INSERT文
### データを1行挿入する (カラム名指定なし)
[テーブル名]および[カラム〇の値]は適宜修正してご使用ください。

```SQL
INSERT INTO [テーブル名] VALUES
    ('[カラム1の値]', '[カラム2の値]', '[カラム3の値]');
```

### データを1行挿入する (カラム名指定あり)

```SQL
INSERT INTO [テーブル名] ([カラム1], [カラム2], [カラム3]) VALUES
    ('[カラム1の値]', '[カラム2の値]', '[カラム3の値]');
```
カラム名およびカラムの値を指定していない列はDEFAULT値が設定されます。
※DEFAULT値はテーブル作成時にあらかじめ設定しておく必要があります。

### データを複数行挿入する（値指定）

```SQL
INSERT INTO [テーブル名] ([カラム1], [カラム2], [カラム3]) VALUES
    ('[カラム1の値1]', '[カラム2の値1]', '[カラム3の値1]'),
    ('[カラム1の値2]', '[カラム2の値2]', '[カラム3の値2]');
```
### データを複数行挿入する（SELECT文使用）
SELECT句を使用して取得したデータをテーブルに挿入できます。
```SQL
INSERT INTO [テーブル名1] 
SELECT * FROM [テーブル名2] WHERE [条件];
```

# UPDATE文
### あるカラムの全行のデータを更新する
```SQL
UPDATE [テーブル名] SET [カラム名] = '[値]'; 
```
条件を指定しない場合テーブル内の指定したカラムの全データが書き換わってしまうので注意が必要です。
特定の行のみ更新する方法は次の通りです。

### あるカラムの特定行のデータを更新する
指定した条件に一致する行のデータを更新します。
```SQL
UPDATE [テーブル名] SET [カラム名1] = '[値1]'
WHERE [カラム名2] = '[値2]';
```

### 複数カラムの特定行のデータを更新する
```SQL:パターン1
UPDATE [テーブル名] SET [カラム名1] = '[値1]', [カラム名2] = '[値2]'
WHERE [カラム名3] = '[値3]';
```
```SQL:パターン2
UPDATE [テーブル名] SET ([カラム名1], [カラム名2] ) = ('[値1]', '[値2]')
WHERE [カラム名3] = '[値3]';
```
### 複数カラムの特定行を他テーブルのデータにて更新する
```SQL:パターン1
UPDATE [テーブル名1] SET ([テーブル名1カラム名1], [テーブル名1カラム名2]) =
    (SELECT [テーブル名2カラム名1], [テーブル名2カラム名2] FROM [テーブル名2]
     WHERE [テーブル名2].[テーブル名2カラム名3] = [テーブル名1].[テーブル名1カラム名3]);
```
```SQL:パターン2
UPDATE [テーブル名1] SET [テーブル名1カラム名1] = [テーブル名2カラム名1],
                    [テーブル名1カラム名2] = [テーブル名2カラム名2]
  FROM [テーブル名2] 
 WHERE [テーブル名2].[テーブル名2カラム名3] = [テーブル名1].[テーブル名1カラム名3];
```

# DELETE文
### テーブル内を空にする
テーブル内のすべてのデータを削除します。
```SQL
DELETE FROM [テーブル名];
```
### テーブル内の特定の行を削除する
```SQL
DELETE FROM [テーブル名] WHERE [条件];
```

# 参考
PostgreSQL Ver.13.1 公式リファレンス
[INSERT](https://www.postgresql.jp/document/13/html/sql-insert.html)
[UPDATE](https://www.postgresql.jp/document/13/html/sql-update.html)
[DELETE](https://www.postgresql.jp/document/13/html/sql-delete.html)
superってなんだ？

superとは親クラスの同名のメソッドを使えるようになるということです。
以下のコードではHogeクラスを親クラスにしてみる
```
class Hoge
  def hogehoge
    p 'ほげ！'
  end
end

class Huga < Hoge
  def hogehoge
    p 'ふがふがふが！'
  end
end

class Fuga < Hoge
  def hogehoge
    super
  end
end
```

## Hugaにhogehogeメソッドを呼び出してみる
```
huga = Huga.new
huga.hogehoge
=> "ふがふがふが！"
```
親クラスのhogehogeメソッドはオーバーライド(上書き)されます

## Fugaにhogehogeメソッドを呼び出してみる
```
fuga = Fuga.new
fuga.hogehoge
=> "ほげ！"
```
このように親クラスの同名のインスタンスメソッドを子クラスで使えるようになるもの。
それがsuperというものです。

短いですが以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

【参考資料】

https://qiita.com/mao-0901/items/906587ad9c4108d70b62
初投稿。Vue.js+TypeScriptでポートフォリオを作成してみた。[未経験]

#  概要
VueCLIを使って開発してこなかったのでVueCLIとTypeScriptの学習がてらポートフォリオを作成しようと思いました。
# 開発経緯
ポートフォリオのテーマを決める際に最初は学習記録アプリやtrelloのようなタスク管理アプリなどよく転職活動に使われているアプリを作成しようかなと思いましたが、僕の中ではありきたりだし独創性に欠けていると思ったのでせっかくだからオリジナルのポートフォリオを作成しようと思いました。
何しようかなと考えた時にコロナ禍で中々海外旅行にいけない人たち向けと僕自身、旅行が好きというのもあってその中でも**世界遺産をめぐるようなアプリ**開発に至りました。
# ポートフォリオ
こちらが以下作成したものになります。
![ezgif.com-gif-maker (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627430/eeff8abf-3bc0-37a7-9a2c-3b5e3386a543.gif)
こちらが「<a href='https://world-heritage-travel-app.vercel.app/'>**世界遺産探検アプリ**</a>」です。
ちなみに、<a href='https://github.com/hashiz008/World-Heritage-Travel-App'>コード</a>はこちらになります。
# 使用技術
- Vue3
- TypeScript
- TailWind CSS
- Map JavaScriptAPI
今回は初めてのVueCLIで開発と初めてAPIを導入しました。
それなりに苦戦しまだ不十分なところもありますが大枠は完成したと思います。
EC2インスタンス内にspring-bootアプリケーションのデプロイ

# 概要
AWSのEC2インスタンスにspring-bootアプリケーションを実行するためのセットアップを行います。
特にtomcatの導入に苦労し、githubからプロジェクトをcloneしてjar/warファイルを作成し実行するデプロイについて書いていこうと思います。
何か間違いがありましたらご指摘お願いいたします。

# アップデート 確認
sshでec2-userにログインした後、linuxのアップデートを行います

```
sudo yum update
```

# Javaのインストール
今回はjava8をインストール。
```
//java11のインストール
sudo yum -y install java-11-amazon-corretto

//java8のインストール
yum install -y java-1.8.0-openjdk
```
使用したいjavaのバージョンによってインストール方法が変わる。

__リンク__
[amazon-corretto](https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-11-ug/amazon-linux-install.html)
[openjdk](https://openjdk.java.net/)
# gitからプロジェクトをcloneしてjarファイルを生成し実行

## Gitのインストール
gitのリモートリポジトリにpushしたプロジェクトのコードをEC2インスタンスに取り込むために必要。
cloneするためにgithubやコンソールからgitにログインしておく。
```
//Gitのインストール
sudo yum -y install git
```
## Mavenのインストール
[Apache Maven](https://maven.apache.org/download.cgi)のインストール
__MavenにはTomcat,Apacheが内包されており、簡単にデプロイができる。__
```
//Apache Mavenのインストール
sudo wget https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
//インストールしたMavenファイルの解凍
sudo tar -xzvf apache-maven-3.8.4-bin.tar.gz
//解凍ファイルのディレクトリを移動
sudo mv apache-maven-3.8.4 /opt/
```
```
//テキストエディタでpathを追加。vimを使用
vim .bash_profile

//Mavenのインストールされたパスを指定、パスを通す
MVN_HOME=/opt/apache-maven-3.8.4
PATH=$MVN_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin

//変更を保存
source .bash_profile
```
## Githubからプロジェクトをクローン
```
//クローン
git clone -b ブランチ名 リモートリポジトリurl
```
## Mavenでプロジェクトのビルド
```
//プロジェクトの配下に移動(pom.xmlが配下にあることを確認)
cd プロジェクト名
//jarのビルド
mvn package
```
jarファイルのビルドに成功すると配下にtargetディレクトリが作成される。
```
$ ls target
aws-deploy-springboot-0.0.1-SNAPSHOT               classes                 maven-archiver    test-classes
aws-deploy-springboot-0.0.1-SNAPSHOT.war           generated-sources       maven-status
aws-deploy-springboot-0.0.1-SNAPSHOT.war.original  generated-test-sources  surefire-reports
```
作成したjarファイルを実行。
```
java -jar jarファイルのパス
```
http\://EC2のパブリックIPまたはDNS名:8080/(コンテキストパス)/ルーティングされたパス
で動作確認できる。

# 参考
- [Amazon Corretto 11 Amazon Linux2 のインストール手順](https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-11-ug/amazon-linux-install.html)
- [AmazonLinux2でWebサーバ構築（Apache/Tomcat）](https://qiita.com/hiren/items/2a4f1b55c99ebfb3fd08#apache)
- [【Java】【AWS】Amazon EC2でJavaのWebアプリケーション動作環境を構築してデプロイするまで](https://case10.hateblo.jp/entry/2020/10/06/165543)
科学者とエンジニアの違い

# 科学者とエンジニアの違い
どちらも同じ「仕組みを追求する人」で、違いは、誰が作った仕組みかというところ。
科学者は神様が作った仕組みを追求する人で、エンジニアは人が作った仕組みを追求する人である。
私は理学部出身で、IT企業で活動している。私が科学者もエンジニアも両方体感してみて感じたことを記事にした。

# 科学者とは
科学者は自然現象がどういう法則で成り立っているのかを調べる。
調べ、解明した法則にのっとって社会を良くしていく。
神様は仕様書を作成せずに、人を世に生み出した。仕様書がなくても、人は仕組みをひもとき、
農耕や火力、電磁気を駆使して繁栄してきた。

# エンジニアとは
エンジニアは人が作ったシステムがどういう仕組みで動いているかを理解する。
理解したシステムの修正点を考え、社会を良くしていく。
神様と同じく人もシステムを生み出している。ただ人は仕様変更ができるという神様とは違う能力があるので、
日々、自身の目の前のパソコンであったり、皆が利用するサーバの仕組みをより良くし、
サービスを造り人の生活を豊かにした。

# 違いがあってもやっていることは同じ
別に科学者は神が作成した仕組みを解明しているから偉いという話ではないし、新サービスを人がゼロから作っているから偉いという話でもない。
どちらも仕組みをひもとき、社会を良くする方法が無いかを考える点では同じである。
（もちろん利己的に活動する方もいる）
ファイルを含むフォルダのパスを取得する裏技


# 方法

ファイルのフルパスに `\..` を付ける。

# 例
 D:\Foo\bar.txt を含むフォルダへ移動する。

```
PS C:\> cd D:\Foo\Bar.txt\..
PS D:\Foo>
```

エクスプローラやコード中でも、利用が出来ます。


# 解説

`..` は、1つ上のフォルダを指します。

フォルダを辿るに際し、フォルダが実在するかは問わないようです。  
よって、ファイルに対しても、1つ上のフォルダ(i.e.ファイルを含むフォルダ)を指す事になります。

なお、仕様などの確認は行っていません。  
上手く行かないケースもあるかもしれません。
100日でSQLの達人になる@LeetCode! Day34 <素直に考える。>

## 1440. Evaluate Boolean Expression （問題レベル: Medium）要課金
今日の問題はこれ。
不等号を比較する問題が表で与えられて、数値は別のテーブルから持ってきてその結果を判定するという問題。

回答をみると基本的な問題であったが、読み取った値を変数にできないのか…などと変に考え込んでしまった。

今日のポイントは`変に考えず素直に考えよう`とした。
これぐらいの問題はスラスラできるようになりたいなぁ。

```:SQL
SELECT e.left_operand, e.operator, e.right_operand, 
(CASE WHEN e.operator='>' AND v1.value > v2.value THEN 'true'
WHEN e.operator='<' AND v1.value < v2.value THEN 'true'
WHEN e.operator='=' AND v1.value = v2.value THEN 'true'
ELSE 'false' END)
AS value
FROM expressions e
JOIN variables v1
ON v1.name=e.left_operand
JOIN variables v2
ON v2.name=e.right_operand
```

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
Kotlin KoansでKotlin入門　第２回：Named arguments

# はじめに
公式の問題集[「Kotlin Koans」](https://play.kotlinlang.org/koans/overview)を解きながらKotlinを学習します。

過去記事はこちら
- [第０回：Kotlin Koansについて](https://qiita.com/kosuke1/items/41d192af63485bfc8cb8)
- [第１回：Simple Functions](https://qiita.com/kosuke1/items/5862a3ece96082a62e67)

# 問題
[Named arguments](https://play.kotlinlang.org/koans/Introduction/Named%20arguments/Task.kt)

joinOptions関数が、2つの引数のみを指定して、JSON形式（例えば、[a, b, c]）でリストを返すように`TODO()`を修正します。
```kotlin
fun joinOptions(options: Collection<String>) =
        options.joinToString(TODO())
```


joinToString関数は、パラメータにデフォルト値を指定して宣言されています。
```kotlin
fun joinToString(
    separator: String = ", ",
    prefix: String = "",
    postfix: String = "",
    /* ... */
): String
```

# 問題のポイント
デフォルト引数と名前付き引数は、オーバーロードの数を最小限に抑え、関数呼び出しの可読性を向上させるのに役立ちます。
ライブラリ関数joinToStringは、パラメータにデフォルト値を指定して宣言されています。

# 解答例
separatorのデフォルト値はカンマ区切りなので値の指定は不要になります。
```kotlin
fun joinOptions(options: Collection<String>) =
        options.joinToString(prefix = "[", postfix = "]")
```
ラズパイでアセンブラ書いてみた

JAVAやPython、JavaScriptやGAS(最近個人的に好きな言語)など、さまざまなプログラミング言語は**高級言語**と呼ばれ、広く普及しています。
僕みたいな貧乏は「**高級**」と聞くだけで、恐れ多くなってしまい自然と「**低級**」なものを求めてしまいます。

ということで今日は、低級言語であるアセンブラにザックリと触れていこうと思います。
いつものごとく、RaspberryPiを用います。（半導体不足の影響なのか、新しいラスパイ全然手に入らないんだが）

# 言語プロセッサ
まず最初にアセンブラという言葉にあまり聞き馴染みのない方向けに簡単に解説をします。
コンピュータは原理的にバイナリーしか理解できないでの、人間とコンピュータの間には**言語を翻訳してくれる存在**が必要です。
その翻訳家のことを**言語プロセッサ**と呼びます。
言語プロセッサには、大きく分けて「**コンパイラ**」「**インタプリタ**」「**アセンブラ**」があり、それぞれ特徴はありますが今回はアセンブラに限って説明をします。

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/97ee4d61-8543-7b9d-af22-c48ef5a730d0.png)

## アセンブラ
アセンブラ（assembler）とは、**アセンブリ言語**で書かれたソースコードを機械語に変換する言語プロセッサのことです。アセンブラを使いアセンブリ言語を機械語へ変換することを**アセンブル**といいます。
機械語はバイナリーで記載されており、**バイナリーのコードとほぼ一対一の関係で記載するのがアセンブリ言語**です。
アセンブリ言語は、コンパイラやインタプリタを用いる他のプログラミング言語よりも低水準な位置付けとなっていますので、初見で読み切るのは困難です。

さらに言うと、**アセンブリ言語の命令文は使用するCPUのアーキテクチャなどで異なる**ため、使用するコンピュータによって完成するコードは異なります。
これはレジスタの配置や使用できるメモリ領域が異なるために発生します。

# ちょっと触ってみる
今回は色々な記事なども参考にさせていただきながら、ラズパイのアセンブラを勉強してみました。
アセンブラはPIC/AVRマイコンで触れていた程度なので、ARMコアのアセンブラは初めてです。

ARMの命令セットについては以下を参照↓

https://developer.arm.com/documentation/qrc0001/m/

今回は、「**Hello World!**」を出力するだけのコードを書いてみました。
C言語であればほんの数行で終わる内容ですが、泥臭いアセンブラはそうはいきません。

```:test.s
.data
hello:
	.asciz "Hello World!\n" @.ascizは番兵(null)つきの文字列と勝手に解釈している

.text 
	.align 4
	.global main 

main:
	mov r4, lr 
	ldr r0, =hello
	bl printf 

	mov r0, #0 
	mov lr, r4 

	bx lr @return
```
それぞれの命令の細かい説明をしようと思っていましたが、それはまた次回以降・・・（書くとは言っていない）
movやらldrなど、ARM以外のアーキテクチャでも使用されているような命令セットが使えるので、PICやらでアセンブラを書いていた人からすれば比較的シンプルに見えるかもしれません。
ちなみに@から後ろはコメントアウトです。

上記のコードを書いたら、実行していきます。
gccでオブジェクトファイルにしてから実行します。

```shell:実行
# gcc -g test.s -o test
# ./test
```
上記のコマンドを打ってみるとしっかりとHello Worldが実行されていることがわかりますね。

![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/501d62fe-1386-8673-009e-35a99bf67ea8.png)

※Kaliでroot取るとドクロが表示される仕様なだけで、イキっているわけではないです

# 正直よくわかっていないこと
色々調べた結果、printする方法として「**bl printf**」としていますが、これはGNUコンパイラが持っているprintf関数をcallしているという認識でいいのでしょうかね？？

objdumpして中身を見て結果「bl	0 ＜printf＞」となっているので、そんな気がしていたのですが・・・まだまだ勉強が足りていないです。
ただ、今後はもう少し知識の汎用性がありそうなx86のアセンブラを勉強していこうと思っています。

```shell:実行
┌──(root💀kali-rpi)
└─# objdump test.o -S

test.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <main>:
   0:	e1a0400e 	mov	r4, lr
   4:	e59f000c 	ldr	r0, [pc, #12]	; 18 <main+0x18>
   8:	ebfffffe 	bl	0 <printf>
   c:	e3a00000 	mov	r0, #0
  10:	e1a0e004 	mov	lr, r4
  14:	e12fff1e 	bx	lr
  18:	00000000 	.word	0x00000000
```

# 参考にしたサイト
### 公式ドキュメント
https://developer.arm.com/documentation/qrc0001/m/

### アセンブラに触れてみよう
※下記記事で触れているのはARMではなくX86系です

https://qiita.com/kaito_tateyama/items/89272098f4b286b64115
【Postgresエラー】missing FROM-clause entry for table

# 目的
業務中に下記のエラーが出てきてだいぶ困ったので他の人の助けになればと思い、久しぶりに投稿する。
```bash
ERROR:  missing FROM-clause entry for table "  <table_name>"
```
# 概要
PostgrSQLのパフォーマンスチューニングを行っており、ログからスロークエリを見つけ出し、EXPLAINで実行計画を確認しようとしていると上記のエラーに遭遇した。

# 解決策
目的に記載されているエラー文はハイライトされていて、解決策が一瞬でわかったかもしれないが、自分はだいぶ解決に時間を要した。
そう、この場合は**スペースを抜く必要がある。**

「しかしスペースなどSQL文をもう一度確認してもない、、」という人がいるのではないか。
もう一度ターミナルで一文字ずつずらしてみてみよう。大文字のスペースになっているところなどあるのではないか。

自分は業務内容の問題で、スプレッドシートからSQL文をコピペしたため、**大文字スペースが入ってしまっていた。**

スペース以外にも存在していないテーブル名やカラム名を指定していると同じエラーに遭遇するようだ。

# 参考文献
[ERROR: missing FROM-clause entry for table (Postgresql)](https://you-1.tokyo/error-missing-from-clause-entry-for-table-postgresql/)
git add とgit commitの取り消し

先日、作業するブランチを間違えてしまいました。

作業が完了し、addとcommitをして、pushする直前に気づきました。

その時の対処方法です。

## git commit の取り消し

まずはcommit の取り消しをします。

```
git reset --soft HEAD^
```

こちらのコマンドで直前に行ったcommitを取り消すことができます。

## git add の取り消し

続いてgit add の取り消しをします。

```
git reset HEAD
```

こちらで直前に行ったaddを取り消すことができます。

これら２つのコマンドを実行することで、表題のaddとcommitの取り消しができます。

以下で補足します。

## HEAD

今自分が作業している場所を示すポインタのことです。

`HEAD^`は「一つ前のコミット」を表します。

## reset

特定の時点までファイルを巻き戻します。
3つのオプションがあります。

### --soft
HEADの位置のみ巻き戻す
例：`git reset --soft HEAD^`→直前のコミットを消す

### --mixed
HEADの位置、インデックスを巻き戻す
オプションなしでも同じ結果になる
例：`git reset HEAD`→インデックスの変更（addしたもの）を消す

### --hard
HEADの位置、インデックス、作業ディレクトリを巻き戻す
例：`git reset --hard HEAD^`→直前のコミットまですべて消す
Envaderでプロセス管理をしてみる

どうも、Linuxを学習しています。ミノルと申します！突然ですが皆さんは、

### psコマンドというのをご存じですか？

ちなみに僕は知りませんでした。そしてまだ完全に知れたとは思っていないです。この記事ではプロセスコマンドを使ったプロセス管理についてザックリと紹介していきたいと思います。

また、この記事は[Envade](https://envader.plus/)rというサイトを参考にして作っています。

今回のシナリオはこちら

[Envader](https://envader.plus/course/1/scenario/1008)

### 結論

---

プロセスは「ps aux」コマンドで見れます！この記事ではこのauxを「おまじない」で済まさないように分解してそれぞれがどんな役割を果たしているのか見ていきたいと思います。

### どういった時に使用される？

---

psコマンドはプロセスを管理するために使うコマンドです

プロセスとは「コンピュータで実行されているコマンド」もしくは「実行される予定のあるコマンド」の事です。

process（プロセス）自体が過程や工程を意味する英単語なのでpsコマンドとそんなに意味合いは変わってない気がしますが、psコマンドの場合は、

**「過程や工程を見る」**という所までいきますね。もとになった言葉との微妙なニュアンスの違いを知れば、より理解が進むと思います！

具体的には、仕事が終わったのに実行し続けているプログラム（ゾンビプロセス）を見つけてkillコマンドで消すといった時に「ps aux」を使ってプロセスを表示する等の使い方をされています。

### 「ps aux」というおまじないの仕組み

---

**ps aux**とは？

早速、分解して見ていきましょう！

- ps　 →　プロセスを見るよ〜
- a　  →　端末が操作しているプロセス（自分＋他のユーザ）も表示するよ〜
- u　  →　各プロセスの実行ユーザやCPU、メモリの使用率を表示する
- x　  →　現在実行しているプロセスを表示する（端末操作の無いデーモンなども）

※Linuxコマンドのオプションには、-(ハイフン)がつきますが、
ps auxにはハイフンが付きませんのでご注意ください

### 最後に問題を出題したいと思います！
是非、アウトプットして知識をお持ち帰りください！

---

```bash
ps aux
```

このコマンドの役割を1つ答えてください

```bash
#解答欄
```

<aside>
💡 一つ思い出せれば、芋づる式に他の役割も思い出せるかも知れません！

</aside>

### 雑感

---

今回は、プロセス管理の際に使うコマンド「ps aux」について見ていきました。このコマンドがどんな役割をしているのかまでは知らなかったので、今回知ることができてよかったです。

他にも色々なコースがあるらしいので、引き続き学習を進めていこうと思います！

[Envader](https://envader.plus/courses)

### 参考にさせて頂いた記事

---

[Linuxでよく使う便利コマンド ps aux を改めて理解するためのメモ | Masyus Work](https://masyus.work/articles/knowledge-linux-ps-aux/)

[psコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-ps)

[【初心者向け】Linuxのプロセスについて一通りわかる！](https://eng-entrance.com/linux-process)
100日でSQLの達人になる@LeetCode! Day33 <NOT IN句での注意点！>

## 608. Tree Node （問題レベル: Medium）要課金
今日の問題はこれ。
木構造のノードの親子関係の表が与えられた時、そのノードが`Root`か`Inner`か`Leaf`かをリストアップするという問題。

`CASE WHEN`を使って、すぐにほぼ正解の回答案にたどり着いたが`NOT IN`句の性質をしっかり理解していなかったために一回で正解にたどり着けなかった。

ポイントは`NOT IN`句では比較できないものがあると全体の結果で`False (0)`が返されるだった。
具体的には、`NOT IN`句内に`Null`がある場合比較できなくなるために全体が`False (0)`になる。

`Discuss`でも同じ間違いをしている回答者が多く議論されていた。

こちらが失敗する回答
```:SQL
SELECT id,
CASE WHEN p_id IS NULL THEN 'Root'
WHEN id NOT IN (SELECT p_id FROM tree) THEN 'Leaf'
ELSE 'Inner' END AS type
FROM tree
ORDER BY id ASC
```

こちらなら大丈夫
```:SQL
SELECT id,
CASE WHEN p_id IS NULL THEN 'Root'
WHEN id IN (SELECT p_id FROM tree) THEN 'Inner'
ELSE 'Leaf' END AS type
FROM tree
ORDER BY id ASC
```

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
Splunk: App・アドオンの追加方法

たびたび必要となるのでメモ。

###### 実施環境： Splunk Free 8.2.2

###### 前置き

 Splunk は App やアドオンという形で、デフォルトの Splunk には存在しない機能を追加することが可能です。
その機能は Splunk 外のハードウェア・ソフトウェアから情報を取得するためのものから暗号化などセキュリティを強化するためのもの、使用できるグラフの形式を追加するような純粋に Splunk の機能を拡張するものもあれば、 MLB のニュース情報を表示する変わり種まであります。

今回は、ルックアップを GUI 上で作成するための App である Lookup File Editor を例にして追加手順を見ていきましょう。

なお、本作業では Splunk のアカウントが必要となります。
 Splunk の環境構築時に作成しているはずですので、思い出しておきましょう。
また、 Splunk の再起動も必要となるので、個人環境でない場合タイミングに注意してください。

###### 手順

まずは、ホーム画面左、「 App 」の右にある歯車マークをクリックしてください。

![スクリーンショット 2022-02-06 16.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0d898edc-bd5e-af40-0706-2c0d4109a453.png "app")

すると、今 Splunk 上にインストールされている App の一覧が表示されます。
この画面の右上に「他の App を参照」とあるので、これをクリックします。

![スクリーンショット 2022-02-06 16.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3d0aeb2f-1e2c-9ac1-1c59-9edb62ddc002.png "app_list")

クリックすると配布されている App の一覧が表示されるので、左のパネルで検索条件を指定して欲しい App を探します。
今回は検索フォームに「 Lookup File Editor 」と入力し、出てきた App のインストールボタンを押します。

![スクリーンショット 2022-02-06 16.59.36 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/cc53dbac-be11-c4d1-0b54-eaff9d6ccaa3.png "install")

インストールボタンを押すと、 Splunk のアカウントを確認されますので、ユーザー名とパスワードを入力し、利用規約に同意してインストールします。

![スクリーンショット 2022-02-06 17.00.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/31e8da7b-768e-38b1-0312-4e431c213933.png "login")

その後、 Splunk の再起動を行います。

![スクリーンショット 2022-02-06 17.01.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/be2623f9-90cb-6fc8-ff44-4065db294bd3.png "restart")

 再起動後に再度 App の一覧を確認すると、先ほどインストールした
 App が追加されていることがわかります。

![スクリーンショット 2022-02-06 17.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/527be4c7-dea4-ad17-770d-2c04bb86b141.png "app_list2")
通信設定方法


PLCとラズパイを連動させてPLCのレジスタデータを
ラズパイでロギングさせようと思います。
やり方のノウハウがないのでわかる方入れば
教えて欲しいです。

ちなみにラズパイも初心者です。

PLCは三菱 オムロン ジェイテクト
AtCoder Beginner Contest 242　A~C　3完記事

アルゴリズムの学習改善のための自身の備忘録及び学習の一環として記事を書くことにしました.
読んでくれた方で何かありましたら気兼ねなくコメントしてください.お待ちしております.
# [A - T-shirt](https://atcoder.jp/contests/abc242/tasks/abc242_a)

## 問題文
>あるプログラミングコンテストでは、以下のルールに従って参加者に T シャツをプレゼントします。
>* 上位 A 位までの参加者は、必ず T シャツが貰える。
>* 加えて、上位 A+1 位から B 位までの参加者のうち C 人が一様ランダムに選ばれ、選ばれた参加者は T シャツを貰える。
>
>コンテストには 1000 人が参加し、全ての参加者が相異なる順位を取りました。
このコンテストの参加者であるいろはちゃんは、X 位を取りました。
このとき、いろはちゃんが T シャツを貰える確率を求めてください。

## 制約
>入力はすべて整数
1≤A<B≤1000
1≤C≤B−A
1≤X≤1000

## 入力
>入力は以下の形式で標準入力から与えられる。
>A B C D X

## 考察
* X≧Aの際、確立は1
* A＜X≦Bの際、確立は$\frac{C}{B-A}$
* X<Bの際は0

これをそのまま出力すればよい.

## サンプルコード
```python:a.py
a,b,c,x=map(int,input().split())
if x<=a:
    print(1)
elif x<=b:
    print(c/(b-a))
else:
    print(0)
```

# [B - Minimize Ordering](https://atcoder.jp/contests/abc242/tasks/abc242_b)

## 問題文
>文字列 S が与えられます。S の各文字を並び替えて得られる文字列 $S'$ のうち、辞書>順で最小のものを出力してください。
>なお、相異なる 2 つの文字列 $s=s_1s_2\dots s_n$とt=$t_1t_2\dots t_m$について、>それらが以下の条件のいずれかを満たすとき、辞書順で s<t であるとします。
>* ある整数 i (1≤i≤min(n,m)) が存在し、$s_i<t_i$かつすべての整数 j (1≤j<i) につ>いて $s_j=t_j$
>* すべての整数 i (1≤i≤min(n,m)) について $s_i=t_i$かつ、n<m

## 制約
>S は英小文字のみからなる長さ 1 以上 $2×10^5$以下の文字列

## 入力
>入力は以下の形式で標準入力から与えられる。
>S

## 考察
入力文字列を一文字ずつ格納された配列であると考える。
これを昇順に並べ替え配列を結合しながら文字列として出力することにより答えが求まる。

## サンプルコード
```python:b.py
s=list(input())
s.sort()
print("".join(s))
```
これは1行のコードにまとめられる
```b-re.py
print("".join(sorted(list(input()))))
```
どちらも同じ答えが得られる.

# [C - 1111gal password](https://atcoder.jp/contests/abc242/tasks/abc242_c)

## 問題文
>整数 N が与えられるので、以下の条件を全て満たす整数 X の個数を 998244353 で割った余りを求めてください。
>* N 桁の正整数である。
>* X の各桁を上の位から順に $X_1,X_2,\dots ,X_N$とする。このとき以下の条件を全て満たす
>    * 全ての整数 1≤i≤N に対して$1≤X_i≤9$ 
>     * 全ての整数 1≤i≤N−1 に対して$∣X_i−X_{i+1}∣≤1$

## 制約
>N は整数
>$2≤N≤10^6$

## 入力
>入力は以下の形式で標準入力から与えられる。
>N

## 考察
動的計画法を用いて考える
i番目はdp[i][j]=(dp[i-1][j-1]+dp[i-1][j]+dp[i-1][j+1])としてn回遷移を行えば良い。
この時、j=0,j=10の場合、何も遷移しない。
最後まで遷移をさると、dp[i]の合計を計算する。
計算途中も含め適度に998244353で剰余を取り答えたい。
$10^7$程度の計算をひつようとしているので、pypyなどの高速な言語を使いたい

## サンプルコード
```python:c.py
MOD=998244353
n=int(input())
dp=[[0 for _ in range(11)] for _ in range(n)]
for i in range(1,10):
    dp[0][i]=1
for i in range(1,n):
    for j in range(1,10):
        dp[i][j]=(dp[i-1][j-1]+dp[i-1][j]+dp[i-1][j+1])%MOD
print(sum(dp[i])%MOD)
```
Laravel8とjetstreamで認証機能を実装する

## はじめに
こんにちは、[Ebata](https://twitter.com/ebaryo_) です。

認証機能とかっこよく書きましたが、要するにログイン機能の事です。この記事では、`Laravel8`でログイン機能を簡単に実装できる`jetstream`というライブラリを紹介します。

詳しい説明は省きますが、`jetstream`を使用する事で以下の機能が自動で実装できます。

+ ログイン機能
+ 会員登録機能
+ パスワードメール確認
+ ログイン失敗時のロック
+ プロフィール情報編集機能
+ 2段階認証

とりあえず、ここまで実装するのが本記事の目標です。

（もっと詳しく知りたいという方は、こちらの記事を読んでみるといいと思います。僕もこれで学びました）
[【Laravel】初めての認証（Laravel8でJetstreamを使う）](https://qiita.com/manbolila/items/498aae00f3574c72f031)

## 環境

MacOS（Windowsでも LinuxでもOK）
Laravel8.x
Composer2.0

## `jetstream`とは

PHPのフルスタックフレームワーク、Laravelで利用可能なAuthenticateライブラリ。いわゆるログイン認証機能を実装してくれるライブラリです。

[Jetstream](https://jetstream.laravel.com/2.x/introduction.html)

会員登録などの機能も備えているので、とりあえずログイン機能を実装するのであれば事足ります。

`jetstream`はCSSフレームワークとして、`tailwind`を利用しています。もしカスタマイズなどする際は参照すると良いでしょう。

[tailwindcss](https://tailwindcss.com/)

また、似たようなライブラリに`breeze`というものもありますが、そちらは別記事として書きたいと思います。

[breeze](https://github.com/laravel/breeze)

## インストール方法

では、早速インストールしていきます。

まだLaravelプロジェクトを作成していない方は、作成するディレクトリに移動して、以下のコマンドを実行してください。

```ターミナル
$ composer create-project laravel/laravel sample_login
```

これでLaravelプロジェクトが作成できました。

ちなみに、`sample_login`の部分はプロジェクト名なので、適当に直してください。

続いて、プロジェクトディレクトリに移動して、以下のコマンドで`jetstream`をインストールします。

```ターミナル
$ composer require laravel/jetstream
```

`jetstream`では、UIの表示に使用するJavaScriptのパッケージが2種類あります。

一般的に使われている`livewire`と、React.jsやVue.jsと互換性のある`inertia`。

今回は特にReact.jsなどを使う予定はないので、`livewire`をインストールします。

```ターミナル
$ php artisan jetstream:install livewire
```

ちなみに、`inertia`をインストールしたい場合は以下のコマンドを実行してください。

```ターミナル
$ php artisan jetstream:install inertia 
```

JSパッケージのインストールが完了したら、続いてマイグレーションを行います。

マイグレーションとは、SQL文を直接書かずにマイグレーションファイルからデータベースを操作する作業のことです。今はとりあえず、会員登録に必要なデータを入れる箱を作る作業だと覚えればOK。

以下のコマンドを実行してください。

```ターミナル
$ php artisan migrate
```

これでマイグレーションが完了しました。

続いて、JSとCSSをビルドしていきます。ビルドは組み立てるという意味です。

以下のコマンドを実行してください。

```ターミナル
npm install && npm run dev
```

たまにlaravel mixの途中でエラーを吐くことがありますが、再度`npm run dev`を実行するとすんなり行くことがあります。（なんだったんだろう）

また、`Docker`などで`npm command not found`が吐かれる場合は、先に以下の2つを実行してください。

```ターミナル
$ apt update
$ apt install nodejs npm
```

ローカルで`npm command not found`を吐かれた場合は、パッケージマネージャである`Homebrew`などから`node`をインストールしてください。

[こちら](https://nodejs.org/ja/)からもインストールできます。

[Node.js](https://nodejs.org/ja/)

## 動作確認

ここまで出来たら、動作確認をします。

ローカルの場合は、以下のコマンドを実行してサーバーを起動してください。

```ターミナル
$ php artisan serve
```

[http://localhost:8000]を開いて、Laravel8の初期画面を表示させてください。

右上に`Login`と`Register`が表示されていれば、今回のミッションはクリアです。お疲れ様でした。

ちなみに、`Login`がログインページへのリンク、`Register`が新規会員登録ページへのリンクです。
AZ-900合格体験記

会社でAzure認定資格を推奨しており、手始めにAZ-900を受験したのでその体験談を共有しておきます。

---

## 筆者の知識レベル
AWS認定資格（[SAA][SAA]、[DVA][DVA]）を持っており会社でもクラウドを扱い始めていますが、立ち位置的に業務でガンガン触っているわけではありません。また、Azureはあまり興味が無かったですし利用しているお客様も少なかったので、[Azure Portal][AzurePortal]にログインして中身を見たことはありますが、それ以上は何もしていませんでした。

---

## 試験概要
概要は以下となっており、試験の詳細は[こちら][AZ-900]に記載があります。
* 受験料: 12,500円
* 合格点: 1,000点中700点で合格
* 時間: 45分
* 問題数: 35問前後
* 形式: 選択式・穴埋め

---

クラウドの一般知識が問われる問題が多く、セクションごとの配分は以下のようになっています。
* クラウドのコンセプトに関する説明（20～25％）
* コアAzureサービスに関する説明（15～20％）
* Azureのコア ソリューションと管理ツールに関する説明（10～15％）
* 一般的なセキュリティおよびネットワークセキュリティ機能に関する説明（10～15％）
* ID、ガバナンス、プライバシー、およびコンプライアンス機能に関する説明（20～25％）
* Azureの料金とサポートに関する説明（10～15％）

---

## 学習時間と学習方法
会社で推奨していたこともあり、[試験 AZ-900: Microsoft Azure の基礎][AZ-900]の下にあるラーニングパスを一通り読んで受験に臨みました。総合学習時間は4～5時間で、毎朝30分～1時間ほど勉強しました。なので、1週間の学習期間となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/42e492fd-1da4-151f-9c48-2b9d4912d42a.png)

---

会社でUdemyの[作りながら覚えるMicrosoft Azure入門講座（IaaS編）][AZ-900@Udemy]を推奨していました。
こちらは有償（4,800円）ですが、Udemyは不定期に90%オフセールをやっていますので、そのときに購入することをオススメします（会社はEnterprise契約を結んでおり無償で受講可能でした）。

---

## 試験の受け方
カメラ付PCがあれば自宅でオンライン受験可能です。
WindowsOS上で試験アプリを起動して、後は試験監督の指示に従って進めるだけです。

---

## 試験の感想
試験時間は45分ですが、30分ぐらいで終了しました（分からん問題は、どうやっても分からないのでドンドン進めていきました）。合否は終了ボタンを押したら表示され、結果の詳細は1時間後にメールで送付されてきて805点で合格していました。

あまりAzureの知識が無くても、基礎的なクラウド（クラウドって何？）の知識があれば合格することができます。
「ベンダー試験って難しいのでは・・・」と思っている方もいるかもしれませんが、クラウドの学習をしている、もしくは多少触ったことがある人なら[試験 AZ-900: Microsoft Azure の基礎][AZ-900]を一通り読んで受験してみることを推奨します。

---

あと、Azureの理解を深めるために[作りながら覚えるMicrosoft Azure入門講座（IaaS編）][AZ-900@Udemy]も学習しておこうと思います。

ぜんぜん関係ないですが、AZ-900ってMCPなんですね・・・。

---

## Tips 言語の選択
試験時の①試験問題と②試験監督とのコミュニケーションは、それぞれ英語・日本語の選択が可能となっています。
日本語ので②試験監督とのコミュニケーションは受験時間が日中帯や一部の土曜日に限られますが、英語だと24時間＆30分単位でいつでも受験可能となります。試験監督とのやり取りは試験開始前の部屋の確認程度で定型文なので、時間の調整が難しい方は英語でのコミュニケーションを選択することを推奨します。

[AZ-900]: https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900
[AzurePortal]: https://azure.microsoft.com/ja-jp/features/azure-portal/
[SAA]: https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
[DVA]: https://aws.amazon.com/jp/certification/certified-developer-associate/
[AZ-900@Udemy]: https://www.udemy.com/course/microsoft-azure-iaas-part/
[Udemy]: https://www.udemy.com/