OmniAICreator/Qiita-1.07M huggingface dataset:
GPUが要因でAndroid Virtual Deviceが起動しない

# はじめに
Android Virtual Device(AVD)が"The emulator process for AVD ~~ has terminated"と表示され起動しない問題に直面した．このワードで検索を掛けると，Cドライブの容量が足りないことが原因と書いてるがCドライブは200GB以上の余裕がある．そこで，Logを見たとろGPUが要因で起動できていないようなのでEmulated PerformanceのGraphicsをSoftwareに変更して解決？した．

## PCスペック
* Windows10
* RAM: 16GB
* GPU: Radeon RX570
* CPU: Intel Core i5-8400

# 検証の手順
原因として，GPUが原因であるかどうかを確認する手順を記す．
## エラーを出す
AVDにて端末を起動し，エラーを発生させる．
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2142992/ba9dd37f-8e41-f5f3-422f-e4e8d7dbde45.png)
## logを見る
logの場所は，「C:\Users\ユーザー名\AppData\Local\Google\AndroidStudio2021.3\log」にあるidea.logに入っている．このlogを適当なエディタで開き「terminated」で検索する．
検索すると，最後のterminatedの直前のINFOにその原因が記述されている．私の場合，`「crashhandler_die: fatal: OpenGLES emulation failed to initialize. Please consider the following troubleshooting steps: 」`と記述されていた．
（ここで，容量不足と言われている場合は単なる容量不足）

一応，logに記述されていたトラブルシューティングは
1. GPUドライバのアップデート
1. エミュレータの再インストール
1. Softwareレンダリングへの変更
1. コマンドラインからエミュレータを起動する
だそうです．

# 対処の記録
行った対処を記述する．
1. GPUドライバのアップデート
GPUドライバをアップデートした．AMD Software: Adrenalin Editionからバージョンをアップデートしたが起動できるようにならなかった．
1. エミュレータの再インストール
Android Studioを完全に削除し，再インストールした．しかし，起動できるようにならなかった．
1. Softwareレンダリングへの変更
AVDの描写をHardware(GPU)からSoftware(CPU)に変更した．結果的には，これのみ有効であった．手順は，AVDマネージャからEdit this AVDを選択→Emulated PerformanceのGraphicsをAutomaticからSoftwareに変更する．
:::note info
注意：Emulated PerformanceのGraphicsはAVDを作成するときにGoogle Playのマークがついていると変更できない．
:::
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2142992/f025ac55-dc92-1974-ef13-3a7991dbb206.png)
1. コマンドラインからエミュレータを起動する
起動できなかった．

# 結論
GPUの何が悪さをして起動できないのか明らかにならなかったが，CPUでレンダリングをすることで解決できる．しかし，自分のPCだとちょくちょくスペック不足気味になる．
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2142992/b7a5b504-aebe-d51c-e644-9a154d46bd36.png)
JEDAI勉強会 第2回: エンドツーエンド・レコメンデーションを学ぼうの準備

[JEDAI勉強会 第2回: エンドツーエンド・レコメンデーションを学ぼう \- connpass](https://jedai.connpass.com/event/265818/)の準備の手順をまとめました。こちらでは[Google Colab](https://colab.research.google.com/)の利用を前提としています。

勉強会で使用するノートブック、サンプルデータはこちらに格納されています。

https://github.com/yulan-yan/Product_recommendation_stadium

# ノートブックの取得

1. [Google Colab](https://colab.research.google.com/)にアクセスします。
1. GitHubを選択します。
![Screen Shot 2022-11-28 at 11.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bb6d186c-9903-2da3-bc86-43d6e7857a9a.png)

1. `https://github.com/yulan-yan/Product_recommendation_stadium/blob/main/Colab_Product_recommendation_stadium.ipynb`を貼り付け、Enterを押します。
![Screen Shot 2022-11-28 at 11.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4b76a9e7-a1ca-d92e-0310-4ed0882e6ac8.png)
1. **Colab_Product_recommendation_stadium.ipynb**の右にある![Screen Shot 2022-11-28 at 11.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce6e4124-d760-2841-d5ec-fd119be04fdc.png)をクリックします。
1. メニューから**ファイル > ドライブにコピーを保存**を選択します。
![Screen Shot 2022-11-28 at 11.06.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eefc1f70-606f-8a53-84f6-7685f4de007e.png)

# サンプルデータのダウンロード

1. https://github.com/yulan-yan/Product_recommendation_stadium/blob/main/stadium_recommender.zip にアクセスします。
1. ZIPファイルをローカルにダウンロードします。
![Screen Shot 2022-11-28 at 11.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2eb22f81-165b-75a8-87f3-cc2a90cf9287.png)


# Colabへのサンプルデータのアップロード

1. Colabの画面の右側のフォルダーマークをクリックします。
![Screen Shot 2022-11-28 at 11.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/211ddcd5-feea-eb7c-4ab3-2300638a9114.png)
1. アップロードアイコンをクリックします。
![Screen Shot 2022-11-28 at 11.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d9fd8be7-f50b-27ef-5f47-a3a17547ce64.png)
1. 上のステップでダウンロードした`stadium_recommender.zip`を選択します。

これで準備は完了です。
システム開発において覚えておきたいIT用語 5つ

# 覚えておきたいIT用語

## 要件定義
システム開発において一番初めに行われ、お客様が欲しいものを明確化する作業です。また、この工程で開発目的、開発期間や費用、機能要件、非機能要件等をお客様と擦り合わせます。機能要件ではシステムに実装する機能が含まれます。非機能要件には、稼働時間、セキュリティ、レスポンスが含まれます。

## 基本設計
次に作られるのが基本設計です。お客様に向けて、システムを外から見た時の動きと内から見た時の動きを明確化する作業です。画面の順序や関係性、機能の配置をまとめた「画面設計」、伝票等のレイアウトをまとめた「帳票設計」、データの流れや中身をまとめた「データ設計」があります。データ設計には、テーブルとテーブルを線でつなぎ、中身の種類と関係性見やすくした「ER図」や作成（Create）、読み込み（Read）、更新（Update）、削除（Delete）をどこで動くのかマトリクス式でまとめた「CRUD図」があります。

## 詳細設計
3番目に作られるのが「詳細設計」です。これは、開発者に対して、システムをどう実現させるかをまとめたものです。一連の｢手続き｣を表現するための図「アクティビティ図」、クラス、属性、クラス間の関係からシステムの構造を記述する「クラス図」等を作成します。また、「画面設計書」や一定期間データを集め、複数の処理をある程度まとめて一括処理を行う方式「バッチ処理設計書」、「データフロー」等を作成します。

## 実装
詳細設計をもとにプログラミングを行う工程です。

## テスト
ソフトウェアが正しく稼働するかチェックするための工程です。ここでバグを見つけ、デバッグをきちん行われなければ、お客様からの信頼を一瞬でなくしてしまいます。そのため、重要な工程です。テストには種類があり、単体テスト、結合テスト、システムテスト（機能テスト、負荷テスト、ボリュームテスト、セキュリティテスト、リグレッションテストetc)、受け入れテスト（シナリオテスト）、運用テストがあります。
テスト仕様書を作成するために、初めにテスト計画書を作ります。テストの目的やアプローチ、実行環境等を明確にします。その後、テスト仕様書を作成します。テストに取り組む際は、実施結果をまとめます。またバグがあれば、不具合管理表にバグの詳細をまとめます。

参考記事
https://www.bold.ne.jp/engineer-club/basic-design
https://qiita.com/Saku731/items/741fcf0f40dd989ee4f8
https://qiita.com/_lemoo_/items/ff21e7dd3cb66f47488c
https://qiita.com/lymansouka2017/items/63567c6e43460b9151c7
https://www.idcf.jp/words/batch-processing.html#:~:text=%E7%94%A8%E8%AA%9E%E9%9B%86%EF%BD%9C%E3%83%90%E3%83%83
https://qiita.com/jun2014/items/cad7328978e709fe79f4
HerokuからRenderに移行しようと思ったけど、学生身分をフル活用してHerokuを使う

# 1. 概要
Herokuの無料プランがなくなってしまうので、PythonでつくったWebアプリを[Render.com](https://render.com/)に移管しようとしたら`OSError: cannot open resource`に苦しめられました。
解決はできたっぽいですが、無料プランではリソースが足りず`[CRITICAL] WORKER TIMEOUT`となっていしまいました。
困っていたところ、学生割あるじゃん！ってことに気付いたので、学生身分をフル活用してそちらに移行します。

https://www.heroku.com/github-students

# 2. 詳細
### `OSError: cannot open resource`の原因
日本語でWordCloudを使っているのでフォントを指定していたのですが、フォントのパスがうまく指定できていなかった模様。

## Render.comへの移管の手順
下記手順に従います。

https://render.com/docs/migrate-from-heroku

GitHub上に新たにRender.com用のレポジトリを作成しました。
Herokuアプリのコードがあるルートディレクトリで
```
$ heroku plugins:install @renderinc/heroku-import
$ heroku render:import --app {アプリ名}
```
を実行し、`.render-buildpacks.json`、`Dockerfile.render`および`render.yaml`を生成します。
これらをRender用のレポジトリに`Add`, `commit`および`push`します。

### Herokuの場合
```python:create_wordcloud.py
font_path='/app/.fonts/ipaexg.ttf'
```
でいけていました。

### Renderの場合
```python:create_wordcloud.py
font_path='/opt/render/project/src/.fonts/ipaexg.ttf'
```

としたら`OSError: cannot open resource`は消えました。
しかし、新たに`[CRITICAL] WORKER TIMEOUT`となってしまいました。

### ディレクトリ構造

```
├── Procfile
├── app.py
├── create_wordcloud.py
├── .fonts
│   └── ipaexg.ttf
├── model.py
├── requirements.txt
├── runtime.txt
├── static
└── templates
```

# 3. しかし、私は学生だった！！

エラーの原因はリソース不足の模様、、、
諦めてHerokuに課金しようと思いましたが、学生向けに1年間有料プランをタダで使わせてくれる制度があることを発見しました。
Herokuは学生向けに$156奢ってくれるみたいです。

>If you are registered with the GitHub Student Developer Pack, you are eligible to receive platform credits worth **$13** USD per month for 12 months (for a total value of $156 USD). 
出典：https://www.heroku.com/github-students

[GitHub Student Developer Pack](https://education.github.com/pack)から学生認証することで、毎月$13使えるクレジットを1年間使わせてくれるそうです。
余った分の繰り越しできないようです。

[Heroku for GitHub Students](https://www.heroku.com/github-students)から申請します。

![スクリーンショット 2022-11-04 13.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/aac5b393-9a06-9009-023f-fa3d79102865.png)

（まだやっていなかれば）[GitHub Student Developer Pack](https://education.github.com/pack)で学生認証をします。
それが済んだらGitHub経由でHeroku側にも学生であることを確認してもらいます。

![スクリーンショット 2022-11-04 13.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/bb6dc19b-ca8a-5bad-3071-59ae9fbcbec9.png)

![スクリーンショット 2022-11-04 13.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/aa2f21bb-6521-59ad-4215-ed67f82656a1.png)

名前と学校名を入力し、規約に同意すれば完了です。

![スクリーンショット 2022-11-04 13.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/b06341e9-f66a-6956-06b0-47a64c80fbab.png)

入金が完了すると[Billing](https://dashboard.heroku.com/account/billing)タブから確認できます。

![スクリーンショット 2022-11-28 11.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/72f87dc2-2a84-010d-59b3-e10bc2db2280.png)


# 4. まとめ

かなり回り道してしまいましたが、1年間は安心です。
学生向けの`GitHub Student Developer Pack`には今回のHerokuだけでなく、使いこなせないほどたくさんのサービスが載っています。

https://education.github.com/pack


アプリはこちら↓

https://lifac.herokuapp.com/

制作過程↓

https://qiita.com/Tokoroteen/items/2bc88767a01124816a1a
AWS Certified Cloud Practitionerに合格するまでにやったこと

<h1>はじめに</h1>
2022年１１月２６日に合格しました

![スクリーンショット 2022-11-28 10.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749681/692cde7e-5d2f-727b-c821-4b799cb18e89.png)

<h1>勉強期間と資格受ける前のスキル</h1>
勉強期間は、10月17日ぐらいからスタート
大体１日２時間ぐらいでした。
AWSは実務では、なかなか触ってないですが、インフラの勉強したかったのでAWSから始めてみた感じです。


<h1>勉強方法</h1>
①Udemyで模擬試験を3周ほどやりました。<br>
そこで模擬試験結果時に不正解だった問題の解説を見て理解するを繰り返しました。
<p><a href="https://www.udemy.com/share/101I2O/">【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（8回分520問）</a></p>

②下記のサイトで公式のサンプル問題を一回
<p><a href="https://d1.awsstatic.com/ja_JP/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Sample-Questions.pdf">AWS Certified Cloud Practitioner
(CLF-C01) 試験問題サンプル</a></p>

③Youtubeで動画を流し聴き
「AWS クラウドプラクティショナー」で検索して動画を流し聴き


上記の３点をやりました
書籍でもテキスト解説の本がありましたが、自分は本読むの苦手なので買っても読まなかったです。。。


<h1>当日は</h1>
youtubeで動画を流し聴きしながらテストセンターへ行きました。

<h1>まとめ</h1>
無事に合格できたので次はSAAにチャレンジしようかと思います
【RUBY】.floorメソッドを用いて小数点の切り捨てを行う

# はじめに
プログラミング初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 前提
ECサイトのポイント付与サービスを考えならがら、.floorメソッドの使い方を学びます。

購入金額が999円以下の場合、3%のポイント
購入金額が1000円以上の場合、5%のポイント
このように付与されるポイントを出力するメソッドを作成。
ただし誕生日の場合はポイントが5倍になります。
誕生日の場合はtrue, 誕生日でない場合はfalseで表します。
また、小数点以下をすべてのポイント計算が終わったあとに切り捨てる。
```ruby
呼び出し方：
calculate_points(amount, is_birthday)

出力例：
calculate_points(500, false) → ポイントは15点です
calculate_points(2000, false) → ポイントは100点です
calculate_points(3000, true) → ポイントは750点です
```

# .floorメソッドとは
```ruby
irb(main):001:0> 3.1.floor
=> 3
irb(main):002:0> 3.9.floor
=> 3
```
「3.1」「3.9」のようにメソッドの前に指定すると、小数点を切り捨ててくれます。

但し、負の数を扱う場合、予想外の結果になる場合がある。
```ruby
puts -3.5.floor # => -3 になってほしかったのに、-4 になる。
```

# 前提を元にメソッドを作成
```ruby
def calculate_points(amount, is_birthday)
  if amount <= 999
    point = amount * 0.03
  else
    point = amount * 0.05
  end
end
```
まず、購入金額が999円以下なのかまたは1000円以上なのかを判断し、2~6行目で処理しています。
そして、購入金額に対して0.03または0.05をかけて、ポイント数を計算して変数pointに代入しています。

```ruby
def calculate_points(amount, is_birthday)
  if amount <= 999
    point = amount * 0.03
  else
    point = amount * 0.05
  end
  if is_birthday
    point = point * 5
  end
end
```
その後に、is_birthdayがtrueの場合すなわち誕生日の場合は、直前で定義した変数pointに5をかける処理を行います。

最後に、point.floorとしてポイントの小数点以下を切り捨て、獲得したポイント数を出力しています。

```ruby
def calculate_points(amount, is_birthday)
  if amount < 1000
    point = amount * 0.03
  else
    point = amount * 0.05
  end
  if is_birthday
    point = point * 5
  end
  puts "ポイントは#{point.floor}点です"
end
```
別解としては、条件式をamount <= 999からamount < 1000に変える方法などがあります。
teradatamlデータフレームから基本統計量を出力する

[Teradata® Package for Python Function Reference](https://docs.teradata.com/r/Teradata-Package-for-Python-Function-Reference/April-2022) [リリース番号：17.10　リリース日付：2022/4]の翻訳です。

# はじめに
PythonでVantageテーブルの基本統計量を出力します。
ライブラリとして[teradataml](https://pypi.org/project/teradataml/)を利用します。

:::note info
**teradataml**はTeradata Vantage用のPythonライブラリです。
:::

# 基本操作
## Vantageに接続する
```python:python code
# 接続用ライブラリの宣言
import teradataml as tdml
# データベース接続
tdml.create_context(host = "IPアドレス",username='ユーザ名',password='パスワード')
```

## テーブルを指定してデータを取得する
```
# Customerテーブルのデータをteradatamlデータフレームに読み込む
teradataml_iris = tdml.DataFrame.from_table("iris_table")
```

## 基本統計量の出力
```python:python code
teradataml_iris.describe()
```

<details><summary>結果を表示</summary>

```
      sepallength sepalwidth petallength petalwidth     idx
func                                                       
min           4.3          2           1         .1       0
std          .828       .436       1.765       .762  43.445
25%           5.1        2.8         1.6         .3   37.25
50%           5.8          3        4.35        1.3    74.5
75%           6.4        3.3         5.1        1.8  111.75
max           7.9        4.4         6.9        2.5     149
mean        5.843      3.057       3.758      1.199    74.5
count         150        150         150        150     150
```
</details>

## Vantageから切断する
```python:python code
# データベース切断
tdml.remove_context()
```

# おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

## Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
Active Record の transaction を雰囲気で書いて rollback されてなかったということがないようにしたいメモ記事

# ApplicationRecord.transaction do を理解する

大きく分けて2種類書き方がある

```rb:rollbackされる
def do_rollback
    ApplicationRecord.transaction do
        Member.create!(email: 'duplicate@gmail.com', password: 'a')
    end # ← end で block を閉じた場合 rollback 処理が行われます。
    rescue ActiveRecord::RecordInvalid
        p "エラー"
    end
end
```

```rb:rollbackされない
def do_rollback
    ApplicationRecord.transaction do
        Member.create!(email: 'duplicate@gmail.com', password: 'a')
    # end を入れない場合、rollback が行われません。
    rescue ActiveRecord::RecordInvalid
        p "エラー"
    end
end
```

詳細な理解はこちらを参考に
https://qiita.com/ytnk531/items/a0db31ee4311425a3933

## 手元でテストできるコード
パスワードの長さが原因で rollback されます
手元で実行して理解しておきましょう

```rb: rollbackテスト
# ロールバックされない処理
def dont_rollback
  ApplicationRecord.transaction do
    Member.create!(email: 'duplicate@gmail.com', password: 'asadjfi9_$asdf')
    Member.create!(email: 'duplicate@gmail.com', password: 'a')
  rescue ActiveRecord::RecordInvalid
    p "エラー"
  end
end

def test_dont_rollback
  before = Member.last.id
  dont_rollback
  after = Member.last.id
  p "#{before} : #{Member.last.id} （#{before == after}）"
end

# ロールバックされる処理
def do_rollback
    ApplicationRecord.transaction do
        Member.create!(email: 'duplicate@gmail.com', password: 'asadjfi9_$asdf')
        Member.create!(email: 'duplicate@gmail.com', password: 'a')
    end
    rescue ActiveRecord::RecordInvalid
        p "エラー"
    end
end
  
def test_do_rollback
  before = Member.last.id
  do_rollback
  after = Member.last.id
  p "#{before} : #{Member.last.id} （#{before == after}）"
end


test_do_rollback
test_dont_rollback
```
Typescriptの型定義ファイルとは

# はじめに
現在、Vue.jsのおさらいをしているのですが、ここでは型定義ファイルについて記述していこうと思います

# 何のためのものか
型定義ファイルとは、型のないJavascriptのライブラリーをTypeScriptで使えるようにするためのファイルです。
Typescriptの特徴は「静的型付け」ができることですが、型の無いJavasciriptライブラリで型を利用するには「どの変数が何の型なのか」を定義したファイルが必要になります。
拡張子は「.d.ts」です。

# 型定義ファイルの中身
※以下サイトからソースを参照しています。
[サバイバルTypeScript](https://typescriptbook.jp/reference/declaration-file)

例えば以下のようなjsファイルがあったとします。
sample.js
```js
function greeter(person) {
  return "Hello, " + person.firstName + " " + person.lastName;
}
```

これを型定義ファイルに記載すると。
sample.d.ts
```typescript
interface Person {
  firstName: string;
  lastName: string;
}
declare function greeter(person: Person): string;
```
こんな感じになります。

# 型定義ファイルのinstall

よく使われるライブラリには、あらかじめ型定義ファイルが用意されているので、先ほどのように自作する必要はありません。
例えば「lodash」ですが、以下コマンドでinstallしたとします。
```
npm install –save lodash
```

ですがこのままではエラーが出てしまいます。
そこで以下コマンドで型定義ファイルのinstallができます。
```
npm install –save @types/lodash
```
型定義ファイルは、通常のinstall時に含まれる場合もあるので、その場合は不要になります。
ESP32: Ticker の使い方

こちらのプログラムと同じことを Ticker を使って記述しました。
[ESP32: Timer 割り込み処理](https://qiita.com/ekzemplaro/items/02ad917bf63a7790fc7d)

Ubuntu 24.04 上の Arduino IDE 2.3.2 を使いました。

## プログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b9ff1ce3-8293-8037-4719-187b002f1c89.png)



```text:test_ticker.ino
// ---------------------------------------------------------------
/*
	test_ticker.ino

					Nov/28/2022
*/
// ---------------------------------------------------------------
#include <Ticker.h>

volatile int interruptCounter;
int totalInterruptCounter;

Ticker tickerSet;

// ---------------------------------------------------------------
void timer_proc(int stat)
{
	interruptCounter++;
}

// ---------------------------------------------------------------
void setup()
{
	Serial.begin(115200);
	delay(3000);
	Serial.println("*** setup start ***");
	tickerSet.attach_ms(3000, timer_proc, 0);
	
	Serial.println("*** setup end ***");
}

// ---------------------------------------------------------------
void loop()
{
	if (0 < interruptCounter)
		{
		interruptCounter--;
		totalInterruptCounter++;
		 
		Serial.print("An interrupt as occurred. Total number: ");
		Serial.println(totalInterruptCounter);
		}
}

// ---------------------------------------------------------------
```

実行結果

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
*** setup start ***
*** setup end ***
An interrupt as occurred. Total number: 1
An interrupt as occurred. Total number: 2
An interrupt as occurred. Total number: 3
An interrupt as occurred. Total number: 4
An interrupt as occurred. Total number: 5
```

## 参考ページ
[ESP-WROOM-32  サンプルグログラム解説 > Ticker > Arguments](https://garretlab.web.fc2.com/arduino/esp32/examples/Ticker/Ticker_Arguments.html)

## M5Stack Core2
このプログラムはそのまま M5Stack Core2 で使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b8d8c43e-db27-d17d-36c4-1973c957abdf.png)
スクリーンセーバーを妨害するBATファイル

下記を参考に改造したものをメモとして記載
https://www.inasoft.org/talk/h202005a.html

```batch:ふるふる.bat
<# : バッチファイル化の参考文献：https://qiita.com/earthdiver1/items/cab769aad623a03a0f2d
@echo off & setlocal EnableDelayedExpansion
set BATCH_ARGS=%*
for %%A in (!BATCH_ARGS!) do set "ARG=%%~A" & set "ARG=!ARG:'=''!" & set "PWSH_ARGS=!PWSH_ARGS! "'!ARG!'""
if defined PWSH_ARGS set "PWSH_ARGS=!PWSH_ARGS:^^=^!"
endlocal &  Powershell -NoProfile -Command "$input|&([ScriptBlock]::Create((gc '%~f0'|Out-String)))" %PWSH_ARGS%
pause & exit/b
: #>
# マウスふるふる(PowerShell版) ver.2.0  (C)2020-2021 INASOFT/T.Yabuki
# 50秒おきに、マウスを微妙に左右に揺らし、スクリーン セーバー等への移行の阻止を試みます。
# Ctrl+C を押すか、[×]ボタンを押すと終了。

# .NETのCursorクラスを利用するためにSystem.Windows.Formsをロード
add-type -AssemblyName System.Windows.Forms

$signature=@' 
      [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
      public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@ 

$SendMouseEvent = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru

echo "マウスをフリフリ中，Ctrl+Cで終了します。"

# マウス移動
$MOUSEEVENTF_MOVE = 0x00000001

# スリープ秒数
$SleepSec = 50

# マウスの振れ幅
# ・マウスの移動イベント生成用の振れ幅
$MoveMouseDistance = 1
# ・マウスの座標を左右にずらす用の振れ幅
$MoveMouseDistanceX = 1

# 偶数回数目は左へ、奇数回数目で右へずらすためのフラグ
$Flag = $true

# 永久ループ
while ($true) {
    # スリープ
    Start-Sleep $SleepSec

    # 現在のマウスのX,Y座標を取得
    $x = [System.Windows.Forms.Cursor]::Position.X
    $y = [System.Windows.Forms.Cursor]::Position.Y

    # マウス座標を少しずらす（マウスイベントを監視するOS(スクリーンセーバー、スリープ)対策）
    $SendMouseEvent::mouse_event($MOUSEEVENTF_MOVE, -$MoveMouseDistance, 0, 0, 0)

    # マウス座標を少し右にずらす（マウスイベントを監視するOS(スクリーンセーバー、スリープ)対策）
    $SendMouseEvent::mouse_event($MOUSEEVENTF_MOVE, $MoveMouseDistance, 0, 0, 0)

    # 座標を監視するアプリ対策(座標を左か右に1ピクセル分ずらすだけにする)
    if ($Flag) {
        $x += $MoveMouseDistanceX
        $Flag = $false;
    }
    else {
        $x -= $MoveMouseDistanceX
        $Flag = $true
    }
    [System.Windows.Forms.Cursor]::Position = new-object System.Drawing.Point($x, $y)
    $x = [System.Windows.Forms.Cursor]::Position.X
    $y = [System.Windows.Forms.Cursor]::Position.Y
}

```
Modx 覚書

# スニペット
## 新着情報自動取得
### Dittoスニペット

```diff_php
 [[Ditto?startID='新着情報ファルダのID' &orderBy='pub_date DESC' &display='20' &tpl=`index_news_item` ]] 

//Dittoスニペット　複数のファルダから取得（カテゴリ別けと同じ）
 [[Ditto?startID='28,29,30,31,32' &orderBy='pub_date DESC' &display='20' &tpl=`index_news_item` ]]
```

### 表示テンプレート用のチャンク例

```diff_html
<div class="news_item">
      <div class="news_cate">
            <span class="news_cate_icon [[the_page_alias &id=[+parent+]]]_bg">[[the_page_title &id=[+parent+]]]</span>
      </div>
      <div class="news_date">
            <time>[+pub_date:ifempty=`[+publishedon+]`:date=`%Y年%-m月%-d日`+]</time>
      </div>
      <div class="news_title">
            <a href="[+url+]">[+title+]</a> 
            [[the_post_new? &date=[+pub_date:ifempty=`[+publishedon+]`:date=`%Y-%m-%d`+]]]
      </div>
 </div>

```

# よく使う[*リソース変数*]

## head内タイトル
[*pagetitle*]
[(site_name)]

## エディター内コンテンツ
[*content*]
Git で特定のコミットまで戻す（→作業完了したら、最新に戻す）（git reset）【Git Tips!】

# はじめに

不具合の調査って、時々、入れ込んだ箇所がわかるまで、コミットを一つずつ戻していく作業になったりしますよね。そんな時のお供が `git reset` コマンドです。

# 手順

### まずはコミットを確認

`git log` コマンドでコミットのハッシュ値を確認します。
一度に多くのログを表示させたい場合、`--oneline` オプションが便利です。

ここでは「お気に入り機能」に取り掛かる前の `f2940ec` （下から２行目）に戻したいとします。

```
$ git log --oneline -n 20
2a2584e (HEAD -> v1.7.4_dev, origin/v1.7.4_dev, origin/master, origin/HEAD, master) v1.7.3 リリース
278f6b2 Merge pull request #165 from yokoba569/v1.7.3_dev
7a23fb5 (origin/v1.7.3_dev, v1.7.3_dev) Merge pull request #164 from yokoba569/#418_お気に入り対応
2394231 (origin/#418_お気に入り対応, #418_お気に入り対応) refs #418 DD対応 修正漏れ
8daa0f3 refs #418 お気に入り機能
f2940ec Merge pull request #163 from yokoba569/#445_起動変更オプション変更
a41ef31 ....
```

### 特定のコミットに戻す

`git reset` コマンドで戻します。`--hard` で変更内容をすべてクリアできます。
`--soft` なら、変更内容がコミットされていない状態で保持されます。

```
$ git reset --hard f2940ec
HEAD is now at f2940ec Merge pull request #163 from yokoba569/#445_起動変更オプション変更
```

### 最新の状態に戻す

調査が終わったり、reset するコミットを間違っちゃったというときはこれを使いましょう。
`git reflog` コマンドで戻したい状態を確認し、再び `git reset` コマンドです。

- `git reflog` コマンドにより作業前の状態が `HEAD@{2}` であることがわかります。
  ```
  $ git reflog -n 3
  f2940ec (HEAD -> v1.7.4_dev) HEAD@{0}: reset: moving to f2940ec
  2a2584e (origin/v1.7.4_dev, origin/master, origin/HEAD, master) HEAD@{1}: checkout: moving from 
  master to v1.7.4_dev
  2a2584e (origin/v1.7.4_dev, origin/master, origin/HEAD, master) HEAD@{2}: commit: v1.7.3 リリース
  ```
- `git reset` コマンドで作業前の `HEAD@{2}` に戻します。
変更差分をクリアしていい場合は `--hard` をつけましょう。
（保持したい場合は `--soft` ですが、あまり使わないかも？）
  ```
  $ git reset --hard HEAD@{2}
  HEAD is now at 2a2584e v1.7.3 リリース
  ```

:::note info
追記：コミット番号指定でも出来ました
```
$ git reset --hard 2a2584e
HEAD is now at 2a2584e v1.7.3 リリース
```
:::

# 最後に

特定のコミットまで戻す方法は以上となります。

不具合の調査って、イライラしちゃうこともありますよね。
そんな時に git のコマンドでまで手間取りたくはないものです。

この記事が一助になれば幸いです。
Azure Administrator(AZ-104)：Azure管理者向けの前提条件「リソースの管理方法」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「リソースの管理方法」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇まとめとリソース
[ツールを使用して Azure リソースを構成する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-resources-tools/7-summary-resources)
◇対応するモジュール
[Azure Resource Manager での Azure リソースの管理と整理](https://learn.microsoft.com/ja-jp/training/modules/control-and-organize-with-azure-resource-manager/)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Microsoft Defender for Cloud」](https://qiita.com/fsd-jume/items/c5d2d1e60912b0c698d8)

## リソースの管理方法
### リソースグループによる整理
**・承認による整理**
グループはRABCの範囲であるため、管理対象となるリソースをグループ化して整理
例)データベース管理者が管理を担当しているデータベースインスタンスを同じリソースグループにまとめて整理
**・ライフサイクルによる整理**
グループを削除すると含まれるリソースもすべて削除されるため、リソースを使用する期間に基づいてグループ化して整理
例)数か月のみ使用するプロジェクトにおけるリソースはプロジェクト終了後にまとめて削除できるように、同じリソースグループにデプロイして整理
**・課金による整理**
グループごとにコストの絞り込みができるため、コストの分類に基づいてグループ化して整理
例)開発用と検証用でコストの使用状況を分けて確認できるように、それぞれのリソースグループに分けてデプロイして整理

### タグによる整理
・課金データやコストの分類が可能
・複数のリソースグループにおける特定リソースの整理が可能
・監視対象のリソースを指定可能
・シャットダウンや起動などの自動化ジョブを適用可能

### Azureポリシーによる管理
・リソースへのタグ付けや命名規則を強制可能
・リソースのリージョンやサイズなど、デプロイ方法を制限可能

### RBACによる管理
・ロールを用いてリソースに対する細かいアクセス管理が可能

### リソースロックによる管理
・不注意なアクションによる意図しない操作からリソースを保護可能
・RBACに関係なくロックが適用される
※一時的なリソースではなく長期に使用するリソースへの適用を推奨

## 次の学習内容
**◆リソースプロバイダーとリソースの移動**

https://qiita.com/fsd-jume/items/a23b7a3cdfb21fbf229d

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
WinActorで作ったことない処理を作るとき

※この記事はExcel2019とWinActor7.4.1.1を使って書いています。


# はじめに
WinActorの販売店でシナリオ作成を担当しているEMIです！
作ったことがない処理を作るとき、私はこんな手順で作っていますよ～という記事です。
初記事になります:relaxed:

RPA（ロボティック・プロセス・オートメーション） Advent Calendar 2022
に参加しています！
https://qiita.com/advent-calendar/2022/robotic_process_automation


# これを作ることになった
お客様から、下記のように罫線を変える編集をしたい。どのようにシナリオを作成した方が良いか相談されました。
（実際に相談された内容からは変えています。）
1行ずつ横の罫線が引いてあるけど、A列に値がある場合にだけ上に罫線を引くように変えたいということですね。
WinActorで罫線の制御は初めてです！

どう作っていきましょうか！わくわくしますね～:smile:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/90a09cf8-d6bd-a400-45de-421cf5b3b175.png)

# 罫線を引くライブラリを探してみる
まず罫線を引くライブラリってどこかにあったよねー、探してみよう。
ライブラリパレットで検索してみました。

しかし結果は。。。:frowning2:　　ない！ないよー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/552a9d16-50c0-6912-5721-faca223791bb.png)

どこかでみたことあるんだけどな。。。
ではクラウドライブラリかな～
検索パレットで探してみると。。。お！罫線関連のライブラリたくさんありますね:wink:
この2つが使えそう！

Excel操作(罫線クリア(範囲指定))
Excel操作(罫線を引く)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/bfb1682a-8ad8-ccec-ea3d-7e5f4b57fbb1.png)

# 使えそうなライブラリの中身をチェック！！
では2個のライブラリの中身を確認してみます。
## Excel操作(罫線クリア(範囲指定))
このライブラリは範囲指定する仕様ですねー
上の罫線だけ消すよ、などの位置の指定は出来なそうですね。。:thinking:フムフム
今回は横の罫線は消したくないから、位置指定出来るとありがたいですが、、まあしょうがないですね。
スクリプトをいじれば出来そうな気がしますが、なるべくならスクリプト編集は避ける主義です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/fefae6f4-1640-284f-cd88-4568f28abfb0.png)

## Excel操作(罫線を引く)
このライブラリはフローチャートエリアに配置すると２つのライブラリがセットになっていました。
まずExcel操作(罫線の設定)で位置などの設定をしてから、Excel操作(罫線を引く(範囲指定))で実際に罫線を引くのですね。
Excel操作(罫線の設定)で、罫線を引く位置の指定が出来そうです:v::laughing::v:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/d114475f-cf37-cdbc-3d0b-bb2ce7bf6656.png)

ちなみにExcel操作(罫線を引く(範囲指定))はこんな感じ。範囲指定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/c68f3b88-082e-dd9c-b2a4-7f7ef54c60ca.png)
# 各ライブラリの仕様を踏まえて流れを決定
罫線クリアライブラリと罫線を引くライブラリの仕様を踏まえて、流れを考えました。
罫線クリアは位置の指定が出来ないので、1度全ての罫線をクリアしてから、横の罫線を引き直して、最後列ごとに外枠罫線を引くという手順が良いかな～:wink:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/97b36d8e-4e64-9d4f-0e63-4cedb12b0b39.png)

# シナリオ完成！
流れを決めたらサクサク作っちゃいます。
詳細は省きますが、、こんな感じ作りました！
![ブログ用フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636184/0cc678af-ca8d-082a-4b6d-6ea14ba9463d.png)

# まとめ
WinActorで作ったことない処理を作るときはこんな感じです。
・ライブラリを検索する。クラウドライブラリも忘れずに。
・使えそうなライブラリの中身を見てみる。
・流れを決定する。

検索しても使えそうなライブラリが無い！という場合は色々試行錯誤ですねー。
今回であれば、もし罫線引くライブラリが無かったら、
Excel操作(範囲選択)で選択してUIオートメーションでExcelのメニューを押す。。みたいな感じで作ると思います！

読んでいただきありがとうございました！
GIHOZのここが好き

# 概要
皆さん[GIHOZ](https://www.veriserve.co.jp/gihoz/)使っていますか？
無料でPairwiseや状態遷移図、CFD法などのテスト技法が使えて、テストケースも生成してくれるオンラインのツールです。いくつか気に入って使っていることがあります。

# お気に入り、その1：コメント機能
図にコメント残して、レビューに使ったり、気がついた仕掛かり作業を記録したりできます。
![koko001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/bd5176a2-8ce9-7fa6-58b6-eaeb81a5c176.png)

# お気に入り、その2：自動保存機能
デフォルトが自動記録なので、作業中に離席した場合など、「保存したかな？」とか「PCリブートしてたら困るな」とか、気にしないで済みます。
![koko002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/c0c448ee-575f-1bca-1139-44ff0b59360c.png)

# お気に入り、その3：リポジトリ非公開機能
個人的な学習用途以外は、基本的に非公開にして、メンバー招待で利用すればデリケートなものもGIHOZで利用できます。
![koko003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/44b0d86f-e364-ffd6-7182-16afefb40f4c.png)

# お気に入り、その4：モデルのコピー作成機能
モデルのリスト画面で、どれか1つでもモデルを選択した状態で、選択中のモデルを丸っとコピーできます。
修正を重ねるのでは無く、作り直す場合に有効です。
![koko004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/d7f14fe9-bd67-786f-e9ce-f44564a37c15.png)
特にテスト対象に対して理解が進むと、モデルがゴチャゴチャする傾向があるので、スパっと作り直すのがお薦めです。そんな時に、書き直し元をコピーして作成すれば、とりあえず消さずに済みます。

# お気に入り、その5：リポジトリやモデルの検索機能
作図をしている内に、リポジトリ内に多くの図が記録されてしまい、ゴチャゴチャすると検索で適当なものをリストに並べるような用途で便利です。
![koko005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/5d5fab68-f711-30e3-aad8-12690332b708.png)
設定画面で記述する説明書きやモデル名が検索対象のように見えます。
一旦、ゴミ箱に移動できるような機能あると、もっとすっきりするかもしれない。。。

# お気に入り、その6：テストケースcsvダウンロード機能
ダウンロードしたテストケースから自動テストで使うテストデータに加工したり、マニュアルテストのテストケースとしてテスト管理ツールに取り込んだりする場合に便利です。
![koko006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/5791a6c1-4ff5-3e76-c76d-302b8a2a261e.png)
モデルが間違っていたり、制約式が間違っていたりと、テストケースもエラー混入することは十分ありますので、そんな時は、テスト実行を中断して、テストケースを生成し直す方が、特にテスト開始初期は有効です。

# お気に入り、その7：図をsvg形式でダウンロード機能
テスト仕様レビュー受ける場合に、テストケースではなくて、そもそも仕様からどんなモデルを想定してテストケースを生成したのかを図で提供できる点、有効です。
![koko007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/ff7096c6-bd4b-0d34-a8c3-107b9b6108b6.png)
ブラウザの画面から切れてしまっていても、ダウンロードされた図は、全体が描画された図なので、大丈夫です。
![state-transition-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/89199beb-5f99-f6f4-bc00-8ec67033deef.png)

# 総括
テスト設計を開始する時、特に未経験な分野とか不慣れな対象に対して、商品やサービスに対する理解を深めなくては、そもそもテストになりません。
たとえ、テスト作業手順が、1つ1つの操作と期待値について詳細に記述されていたとしても、テスト対象への理解が不足している状況では、まともにテストできない場合がほとんどですし、本当にそこまで詳細に記述しているので、不慣れで未経験でもテスト可能ならば、自動テストにて実行する手もあろうかと思います。
仕様書を読み込んで理解する際、実際に作図をしてみると、理解が進む経験は多いですし、しばらくしてから作図したものを見てみると、間違いだらけ・勘違いだらけということもよくあります。
テストケースに記述されたものから、こういったエラーを発見するのは難しい場合が多い点でも、テストケースの根拠となっている図を利用するメリットは大きいと考えます。
ESP32: Timer 割り込み処理

参考ページ
[Timer](https://docs.espressif.com/projects/arduino-esp32/en/latest/api/timer.html)

Ubuntu 24.04 上の Arduino IDE 2.3.2 を使いました。

## プログラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/54d98d85-2500-9dcd-bf67-f1d8f25c7bf5.png)

```text:test_interrupt.ino
// ---------------------------------------------------------------
/*
	test_interrupt.ino

					Jul/27/2024
*/
// ---------------------------------------------------------------
hw_timer_t *timer = NULL;
volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

volatile uint32_t isrCounter = 0;
volatile uint32_t lastIsrAt = 0;
 
// ---------------------------------------------------------------
void IRAM_ATTR onTimer() {
	portENTER_CRITICAL_ISR(&timerMux);
	isrCounter++;
	lastIsrAt = millis();
	portEXIT_CRITICAL_ISR(&timerMux);
	xSemaphoreGiveFromISR(timerSemaphore, NULL);
}
 
// ---------------------------------------------------------------
void setup()
{
	Serial.begin(115200);
	delay(1000);
	Serial.println("*** setup start ***");

	timerSemaphore = xSemaphoreCreateBinary(); 
	timer = timerBegin(1000000); 
	timerAttachInterrupt(timer, &onTimer); 
	timerAlarm(timer, 1000000, true, 0);

	Serial.println("*** setup end ***"); 
}
 
// ---------------------------------------------------------------
void loop()
{
	if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE)
	{
	// Read the interrupt count and time
		portENTER_CRITICAL(&timerMux);
		uint32_t isrCount = isrCounter;
		uint32_t isrTime = lastIsrAt;
		portEXIT_CRITICAL(&timerMux);

	// Print it
		Serial.print("onTimer no. ");
		Serial.print(isrCount);
		Serial.print(" at ");
		Serial.print(isrTime);
		Serial.println(" ms");
	}
}

// ---------------------------------------------------------------
```

実行結果

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
*** setup start ***
*** setup end ***
onTimer no. 1 at 2030 ms
onTimer no. 2 at 3030 ms
onTimer no. 3 at 4030 ms
onTimer no. 4 at 5030 ms
onTimer no. 5 at 6030 ms
onTimer no. 6 at 7030 ms
```

## M5Stack Core2

このプログラムはそのまま M5Stack Core2 で使えます。
ボードの設定は、ESP32 Dev Module のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3edf1f52-0bd7-8f1d-286c-22249134c127.png)
TestCafeを触ってみた

これは[Wanoグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/wano-group)、9日目の記事です。

EDOCODEサーバーサイドエンジニアの井内です。

以前からE2Eテストフレームワークの調査をしてみたいと思っていまして、Advent Calendarを書くネタとして[TestCafe](https://testcafe.io/)を触ってみました。

### インストール

下記のコマンドでインストールできます。

```bash
$ npm install -g testcafe
```

### サンプルテスト作成

ここのサンプルコードを参考にして、簡単なテストを作成してみました。
今把握している要件では別タブを開いてそちらを操作する必要がありまして、別タブのタイトル取得をするようにしました。

```javascript:test.js
import { Selector } from 'testcafe';

fixture `edocode site`
    .page `https://www.edocode.co.jp/`;

test('new tag', async t => {
    await t.click('div.hiring-banner　> a')
        .wait(20000)
        .expect().eql('Jobs at EDOCODE');
});
```

このテストでは別タブのタイトルが動的に書き換えられていて、`wait`で待って取得しています。（これについてはもしかすると他にもっと良いやり方があるかもです）

### PCテスト実行

上記で作成してテストコードを実行してみます。
コマンドは下記のように`testcafe`を使って、ブラウザとテストコードを引数で指定します。

```bash
$ testcafe chrome test.js
$ testcafe firefox test.js
$ testcafe safari test.js
$ testcafe edge test.js
```

ヘッドレスブラウザを使うこともできます。

```bash
$ testcafe chrome:headless test.js
```

### モバイルテスト実行

モバイルテストはテスト用のURLを生成して、そこにアクセスすることで実行できます。

```bash
$ testcafe remote test.js
```

オプションでQRコードを表示することもできます。

```bash
$ testcafe remote test.js --qr-code
```

### 使ってみた感想

WebDriver不要で、npm packageのインストールだけでテスト実行環境を作れるのはとても楽でした。（`npm install`から5分くらいでサンプルコード実行までできました）

別タブへのアクセスもできますし、主要ブラウザは一通りサポートしているようなので、大きな問題なく使うことができそうです。

[EDOCODE Advent Calendar](https://adventar.org/calendars/7645)の担当枠がまだあるので、次の記事ではCI実行設定を試してみようと思います。

### 最後に

現在EDOCODEでは、エンジニア・デザイナー・プロダクトマネジャーを募集しています。ご興味のある方は、こちらの採用ページも是非ご覧ください！

https://go.edocode.co.jp/jobs
TestCafeをCIで実行してみた

これは[EDOCODE Advent Calendar 2022](https://adventar.org/calendars/7645)、8日目の記事です。

サーバーサイドエンジニアの井内です。

先日の[Wanoグループ Advent Calendar 2022 の記事](https://qiita.com/iuchim/items/20cc4fb58c987ddb609f)の続きで、TestCafeのCI設定をしてみました。

### GitLabでのCI設定

CIは、EDOCODEで使っているGitLabで設定をしました。
下記にドキュメントがありまして、これを参考にして`.gitlab-ci.yml`に設定を追加しています。
https://testcafe.io/documentation/402816/guides/continuous-integration/gitlab

```yaml:.gitlab-ci.yml
e2e_tests:
  image:
    name: testcafe/testcafe
    entrypoint: ["/bin/sh", "-c"]
  script:
    - /opt/testcafe/docker/testcafe-docker.sh firefox:headless test.js
```

TestCafeのDocker Imageを使っています。
ChromiumとFirefoxが使えるはずなのですが、Chromiumはエラーが出ていたので削除してあります。
（`--no-sandbox`をつければ大丈夫そうな情報を見つけたのですが、ダメでした）

### TestCafe+LambdaTestのローカル実行

TestCafeのDocker Imageでは確認できるブラウザが少ないので、こちらもEDOCODEで既に導入しているLambdaTestを使えるかどうか試してみました。

調べたところ、こちらもドキュメントがありましてすぐ導入できそうです。
まずはGitLab CIではなく、ローカルで試してみます。
https://www.lambdatest.com/support/docs/npm-plugin-for-testcafe-integration-with-lambdatest/

最初に`testcafe-browser-provider-lambdatest`というnpm packageをインストールします。

```bash
$ npm install -g testcafe-browser-provider-lambdatest
```

次にユーザー名とアクセスキーを環境変数で設定します。（以下はMac, Linuxの場合）
どちらもLambdaTestの管理画面から確認できます。

```bash
$ export LT_USERNAME= {YOUR_LAMBDATEST_USERNAME}
$ export LT_ACCESS_KEY= {YOUR_LAMBDATEST_ACCESS_KEY}
```

これで実行準備ができました。
下記コマンドでTestCafeをLambdaTest上で実行できます。

```bash
$ testcafe "lambdatest:Chrome@74.0:Windows 8" test.js
```

LambdaTest上で使えるブラウザ一覧は、下記コマンドで確認できます。
Freeプランだと使えないブラウザがあるようです。

```bash
$ testcafe -b lambdatest
```

### TestCafe+LambdaTestのCI実行

こちらは上記の設定を`.gitlab-ci.yml`に追記するだけです。

```yaml:.gitlab-ci.yml
lambdatest:
  stage: test
  image:
    name: node
  before_script:
    - npm install -g testcafe testcafe-browser-provider-lambdatest
  script:
    - testcafe "lambdatest:Chrome@74.0:Windows 8" test.js
```

TestCafeのDocker Imageだとnpm packageがインストールできなかったので（多分権限の問題）、Node.jsのDocker Imageを使っています。

動作確認は下記のリポジトリで行ないました。
https://gitlab.com/masahiro.iuchi/testcafe-sample

### 使ってみた感想

TestCafeのCI設定・LambdaTest連携ともに、特につまづくことなく簡単に設定できました。
今後は小さいなところから具体的なテストを試していければと思っています。

### 最後に

（前回の記事に引き続きになりますが）現在EDOCODEでは、エンジニア・デザイナー・プロダクトマネジャーを募集しています。ご興味のある方は、こちらの採用ページも是非ご覧ください！

https://go.edocode.co.jp/jobs
【Newt + Next.js + Vercel】ブログサイトを30分で作成から公開まで無料でする方法

本編は↓に投稿しております。
[【Newt + Next.js + Vercel】ブログサイトを30分しかも無料で作成から公開までする方法](https://blog.mario031.com/article/create_blog_method)
「Type 'string | undefined' is not assignable to type 'string'.   Type 'undefined' is not assignable to type 'string'」の解決方法

## 問題
```
Type 'string | undefined' is not assignable to type 'string'.
  Type 'undefined' is not assignable to type 'string'.Vetur(2322)
```
以前このようなエラーで「undefinedを許可しているのになぜstringじゃないと怒られているんだ？？」と困惑したことがあった。

下記のsuffixのように型定義していて、stringをsuffixに入れても上記のようなエラーがある。
```typescript
interface Item {
  value: string
  num?: string
}
```

## 原因
suffixはstringかundefinedしか受け付けないとしているが、それがundefinedかどうかによって処理を書き分けられていないことが問題である。

```typescript
multiplyNumber(item: Item) {
         return item.num *= 2
    },
```
例えば上記のコードでは例えばAPIでItemをうまく取得できて、numをmultiplyNumber関数の引数に入れることができるのであれば、問題はない。
ただAPIの通信が失敗してしまって、Itemを取得できずにnumがundefinedとなってしまった場合は```item.undefined *= 2```となってしまうため本記事最初のエラーが出てしまうという仕組みだと思われる。

## 解決方法

下記のコードのようにitem.numがundefinedである場合はif文に進まないという処理をすることでこの問題を回避することができた。
```typescript
multiplyNumber(item: Item) {
        if (item.num) {
            return item.num *= 2
        }
    },
```
Railsにおける配列への代入とリファクタリング

# 問題のルール

1. lengthとwidthが引数で渡され、最大サイズの正方形を可能な限り求めて、その正方形の一辺の長さを配列にまとめて戻り値にする。
2. lengthとwidthが同じ長さの場合はnilを返す
イメージ図は下記で、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264678/2d63c005-7786-5382-ac9f-a37d958444a2.png)
テストとしては下記のようなものになる

```ruby
  sqInRect(5, 3) should return [3, 2, 1, 1]
  sqInRect(3, 5) should return [3, 2, 1, 1]
```

# 最初に書いたコード
ざっと以下のように書いたが、毎度ながら`空の配列list`の定義が少し見にくい時がある。

```ruby
  def check_smallest_square(line_a, line_b, list)
    ## sortの代わりにminmaxでもよかった
    short_line, long_line = [line_a ,line_b].sort

    if short_line == long_line
      nil
    else
      list << short_line
    ## long_line - short_lineを引数にすると長くなって気持ち悪いと思ったが、変数名の長さがそもそも良くなかった。変に1行使って処理書く方が醜い
      long_line -= short_line
      check_smallest_square(long_line, short_line, list) || list << short_line
    end
  end

  def sqInRect(line_a, line_b)
    return nil if line_a == line_b

    ## スクリプトの癖でいつも空の配列を定義してそこに値を入れようとしてる。
    list = Array.new
    check_smallest_square(line_a, line_b, list)
  end
```

# 空の配列をリファクタリングしてみた
`[] + []`は一つの配列になることを利用して、書いてみたが直感的にわかりやすいのか?? 変数名とif文をもう少し綺麗に

```ruby
def check_smallest_square(line_a, line_b)
  short_line, long_line = [line_a ,line_b].sort

  if short_line == long_line
    nil
  else
    [short_line] + (check_smallest_square(long_line - short_line, short_line) || [short_line])
  end
end

def sqInRect(line_a, line_b)
  return nil if line_a == line_b
  check_smallest_square(line_a, line_b)
end
```

# 変数名とif文を綺麗にする
`min,max`は予約語みたいなイメージがあるから少し気持ち悪いが文字が少なくてみやすい。
メソッドを分ける意味すらなさそう。

```ruby
def find_square(lng, wdth)
  min, max = [lng ,wdth].sort
  min == max ? nil : [min] + (find_square(max - min, min) || [min])
end

def sqInRect(lng, wdth)
  find_square(lng, wdth)
end
```
Azure Firewallの実装手順

●Azure Firewallの実装手順
１、ネットワークインフラストラクチャの作成
２、Azure Firewallのデプロイ
３、ルートテーブルの作成とサブネットへの関連付け
４、ファイアウォールポリシーおよび規則の作成

※Azure Firewallの配置先となる仮想ネトワークのサブネット名は「AzureFirewallSubnet」、アドレスプレフィックスは/26以下である必要がある

●DNAT(宛先ネットワークアドレス変換)規則
ファイアウォールのパブリックIPアドレスとパブりｋっクポーとを、特定のプライベートIPアドレスとプライベートポートに変換する。そのため、仮想マシンが使用するIPアドレスを隠蔽しつつ、RDPやSSHを許可したい場合や、HTTP・HTTPS以外を使用するアプリケーションアドをインターネットに公開する場合に役立つ
関係グラフを表示する(SPSS Modeler データ加工逆引き10-9)

# 関係グラフを表示する（新グラフ）

![スクリーンショット 2022-11-15 14.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9998425e-6261-4359-685c-26fe57c96690.png)

## 1.想定される利用目的

・関係性の確認


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/relation.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-15 14.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/59f93735-ced4-66a4-698a-ebec207eb098.png)

入力するデータを確認するため[テーブル]を実行します。

![スクリーンショット 2022-11-15 14.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dcc22903-7cc0-fb7d-b76c-854403c8aee3.png)

[Webグラフ]ノードで従来の関係図を表示します。
![スクリーンショット 2022-11-15 14.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/68ef8cae-d534-0b9a-47cf-c0a4636fce12.png)

[シミュレーション生成]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ef9f2d0-77cb-20ba-4894-df147b7e4b05.png)

関係グラフを選択します。

![スクリーンショット 2022-11-15 14.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ac1b54f2-1d84-ebae-6c80-3b7304594286.png)

以下の画面左の設定に従いセットします。

![スクリーンショット 2022-11-15 14.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5f5f2c52-1671-d09c-e24f-1d9b8336c83b.png)

![スクリーンショット 2022-11-15 14.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/feea5beb-741c-db49-8620-e1859ebfad21.png)

#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
[Flutter]MapBoxからGoogle Mapに切り替えた理由

私が関わっているプロジェクトでは、Mapを使用したアプリを作成しています。

その際に、どのMapを使うかで色々と議論がありました。

・UI・UXはどっちの方が望ましいのか
・必要な機能の実装は満たしているのか
・参考文献の多彩さ

これらを踏まえて、MapBoxを採用し、開発することに決めました。


先に、それぞれの利点を自分なりにまとめてみました。 **注意：開発前時点での利点です。**

||Google Map|MapBox|
|:--|:--:|:--:|
|UI/UX|△|◯|
|機能面|◯|◯|
|参考文献|◯|△|


最終決定としては、**UI/UXを考慮してMapBox**を採用することになりました。


## やってみてわかったこと

やってみて様々な点がわかりました。

### いいところ
・使いたい機能の記事がドンピシャで見つけることができた。
・UIが好き

### 詰まったところ
・Androidだと、うまくMapが表示されない
・MapBoxのSymbolが表示されたり、表示されなかったりとする
・本当に必要な記事がとても少ない。


そこでまた再び議論を行いました。その結果、Google Mapに切り替えて開発をすることになりました。
しっかりと検証して、試みて、わかったことを踏まえて会議を行うことはとても大切ですね。切り替えまでに時間が結構かかってしまいました。




# 最後に
![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA
[Flutter] MapBoxでピンをタップしたら処理を行えるようにする方法

いせきです。
たくさん役に立てるような記事を書いていこうと思っています。よろしくお願いします。

今回は、MapBoxでピンをタップしたら処理を行えるようにする方法を紹介していこうと思います。

# 初めに ~MapBoxとは~

こちらを参考にしてください。

https://www.mapbox.jp/


MapBoxの基礎については以下のサイトがとても参考になります。（僕もとても参考になりました。死ぬほど助かりました。）

https://qiita.com/hmatsu47/items/b98ef4c1a87cc0ec415d


# 解説のコード

今回は、`initState`の中にピンを表示させる処理を書いていこうと思います。



```dart
final Completer<MapboxMapController> controller = Completer();

  @override
  void initState() async {
    super.initState();
    await controller.future.then(
      (mapBoxMap) {
        mapBoxMap.addSymbol(
          const SymbolOptions(
            geometry: LatLng(
              35.7100069,
              139.8108103,
            ),
            textField: '東京スカイツリー',
            textAnchor: 'top',
            textHaloWidth: 3,
            textSize: 12,
            iconImage: 'pin',
            iconSize: 0.8,
            iconAnchor: 'top',
            iconHaloBlur: 100,
            iconHaloColor: '#FFF',
            iconOffset: Offset(0, -55),
          ),
        );
      },
    );
   }
```

ちなみに

`mapBoxMap.onSymbolTapped.add((argument) {});`の`argument`からは、
MapBoxのピンの情報が取得することができます。

例えば

```dart
 mapBoxMap.onSymbolTapped.add((argument) {
 print(argument.textField); //'restaurant'になります。
});
```


# 最後に


![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA 


# 参考文献


https://stackoverflow.com/questions/62103429/add-custom-marker-to-map-in-flutter-with-mapbox-plugin
まさかCollectionにwhereしてcontainsしてないか？

## 概要
Collectionの中に同じ値があるかどうかにcontainsを使うと思いますが、こんな使い方してませんか？

```php
$schedules
->where('start_time',$statTime)
->where('end_time',$endTime)
->contains('date',$date)
```

## クロージャ書けるよ

ドキュメントに書いてはある

```php
$schedules->contains(fn($schedule, $key) => 
    $schedule->date === $date && $schedule->start_time === $statTime && $schedule->end_time === $endTime);
```

![](https://storage.googleapis.com/zenn-user-upload/2f172df8da68-20221125.png)

書いてあるのに目がスルーしてました。クロージ書ける事を最近知りました。。。。
処理速度計測してみるとまぁ当然のようにこっちの方が早かったです。
AZ-900 Microsoft Azure Fundamentalsを無料で受験できてよかった話

# はじめに

最近Azureに触れる機会があって、Virtual Trainning Dayというものを紹介頂きました。こちらは無料のバーチャルトレーニングが受けられる仕組みで「Microsoft Azure Virtual Training Day: Azureの基礎」というコースでは無料でAzureの基礎を広く浅く学ぶことができます。

https://www.microsoft.com/ja-jp/events/top/training-days

しかもこのコースを受講すると、通常12,500円かかる **AZ-900の受験料が無料になる** というのです。これは有難い。そのような経緯でこの機会にAZ-900を受験しようと決めました。

https://learn.microsoft.com/ja-jp/certifications/exams/az-900

# 準備について

一応前年にAWSのSAAを取得していたので、クラウドの概念とか基本的な考え方は同じであろうと高をくくっておりました。

https://qiita.com/talomina/items/9605db1b3e3e1987ae24

実際のところは大体その通りだったのですが、心配性な私はUdemyで下記のコースを購入しました。セールであったこともあり、かなりお安く購入できたのでお勧めです。

https://www.udemy.com/course/az-104-microsoft-azure-administrator-jp/

受験に向けた準備は冒頭のVirtual Trainning Dayの内容を流し聞きした後に、Udemyで内容を定着させるという方式で行いました。トータルで20時間ほどになるでしょうか。

最後の最後に試験当日こちらのコンテンツを視聴してから家を出発しましたが、全く同じ問題が何問か出ました。少し長いですが見ておいてよかったです。録画なので早送りやスキップも可能です。

https://info.microsoft.com/JA-HCSAzureHybridInfra-WBNR-FY21-02Feb-11-AZ900PrepSession-SRDEM61308_LP02OnDemandRegistration-ForminBody.html?aaid=AFUNPELN

# 試験について


![DSC_0473.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/bded7085-72a7-3d5e-891d-4885aeed159f.jpeg)

## 試験の申込
何日か前にPearson Vueで予約して受験しました。Training Dayによる無料の恩恵を受けるには、受講から5営業日後以降に試験の申込を行い、受講時のメールアドレスで認証を行う必要があります。

## 試験の流れ
試験の流れはこんな感じでした。
1. 会場に入ると受付の方に声をかけられて、紙を渡されて署名する。
1. 本人確認で免許証と顔を見比べられる。
1. 写真撮影（この写真は後で成績表に使われます）
1. ロッカーに荷物を預ける。ポケットの中は空にして、腕時計などもしまいます。
1. メモ用の紙をペンをもらい、メガネの内側をチェックされます。カンニング対策だと思います。
1. 試験端末の部屋に案内されてにログインしてもらって試験スタート
1. 完了したら受付に戻ります。
1. 成績表をもらってサインします。
1. ロッカーから荷物を出して帰ります。

試験の回答が終わって次へボタンを何回か押していたら突然、「合格です！」と出てきたので少しビックリしましたがうれしかったです。

## 試験内容について
あまり詳しくは書けませんが、何点か想定外だったことを何点か抽象的に
* Defenderも試験範囲だった!
* Azure Portalの操作問題は意外と多かった!
* 日本語が分かりにくい!(AWSよりさらに)

# おわりに
合格できて良かった！当日は雨でしたが帰り道の心は晴れ渡っていました。

# おまけ AzureとAWSの違い
AzureとAWSは似た部分が多くて、先にAWSのことを勉強していると、Azureの話でも「AWSでいうアレ」が思い浮かんでそれなりに飲み込み易いと思いました。しかし逆にAzureのクセには少し引っかかったのでいくつか挙げておきます。

* アカウントとサブスクリプションの関係：AWSではアカウントが一つの契約単位なのですが、Azureではアカウントに対して複数の契約（サブスクリプション）を紐づけることができます。一つのアカウントでもサブスクリプションごとに支払がきっちり分かれるので、便利。
* リソースグループ：リソースをグループ化して名前を付けて管理できる箱。関連するリソース全体を、一括で削除したりすることができる。例えば複数VMを一時的に作って、あとできれいに消したい場合などに便利。
* ストレージアカウント：オブジェクトストレージやファイルサーバなどストレージ系のサービスをまとめるための箱。AWSで言うなら同一リージョンのS3とFSxを同じ箱に入れて管理するような感じ。BLOBがS3だと理解していますが、EBSも含まれるようなので、今一つ釈然としていません。
* 無料枠のオーバー時の動作：AWSは無料枠を超えると課金されるが、Azureは無料枠を使い切った時点で止まる。
マネジメント保存版:若手エンジニアの成長促進の３つのメソッド

![25146714_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4893a9f8-890d-f464-8f27-09dfab3efc8e.jpeg)
CTO/VPoEのマネジメント職にとって若手のエンジニアの育成は重要課題です。
今回は、成長促進の３つのメソッドをお教えします。

# 1.競わせる
単純ですが、競わせる事で自主的に勉強し努力し成長していきます。この**自主的**が重要で、他人からの指示では工夫、努力をしないし、達成感が薄いです。
そして、重要なのが個人でなく集団で競わせるのがポイントです。日本人は、ワールドカップの盛り上がりが示す様に集団vs集団に対して異様に盛り上がる部分があります。単体ではサボる事もグループだと最後まで頑張るし勝つ意欲が継続します。グループを作って、グループ同士で競わせましょう。
具体的には、
- コスト削減タスクフォース
    クラウドサービスのコストダウンのためのタスクフォースを作って、コストの削幅を競わせる
- ラボ
    研究テーマを自分達で決めてもらって発表してもらう
- 業務改善コンテスト
    業務改善に繋がるアイデアを具体的に実装してもらう

他にもグループで競わせる案を考えてみてください

# ２．キャスティング
ポジションが人を育てます。環境が人を育てます。
- サポーターにする
    リーダーになってもらう手前に、特定メンバーのフォロー役として担当してもらいます。教えたり、相談に乗ったりする事で目線が変わってきます。
- リーダーにする
    リーダーというポジションを与える事で、リーダーとしての勉強をしたり振る舞いが変わってきます。
- メンバーを変える
    担当メンバーを増やしたり減らしたりすると仕事のバランスが変わるので、どの様に役割分担するのか考えたり試行錯誤するきっかけになります。
- ポジションを変更する
    担当部署や担当PJを変える事で新規一点、やる気を与えたり、メンバーが新たになることでマネジメントの経験が広がります。マンネリ化脱却としても有効です。
- 同じランクに優秀な人財をアサインする。
    現状からの脱却に悩んでいるフェーズに同じリーダー格で自分とやり方の違う優秀なリーダーが入ってくると参考にして動きが変わってきます

# 3.アウトプットしてもらう
アウトプットするためには、勉強が必要です。アウトプットで恥をかきたくないので、必死で勉強します。勉強した内容をアウトプットするので質問に対処できる様に自分なりに整理して理解します。勉強して整理して理解して初めてアウトプットができる状態になります。
加えて、当然ですが、アウトプットの仕方の練習にもなるし、1:Nのコミュニケーションの練習になる。ポジションが上がっていくと、1:1のコミュニケーションだけでなく、1:Nのコミュニケーションが徐々に増えてくる。これはこれで特別なノウハウが必要で工夫も必要です。

いかがでしたか、若手エンジニアの成長促進の３つのメソッドをご紹介しましたが、エンジニアとしてのスキルアップ等にはふれてません。スキル外の成長要件についての３つのメソッドです。是非、チャレンジしてみてください。

# お願い
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)