OmniAICreator/Qiita-1.07M huggingface dataset:
なぜETLではなくELTが流行ってきたのか

# 概要
troccoの生みの親で、現プロダクト責任者をしている [@hiro_koba_jp](https://twitter.com/hiro_koba_jp) です。
[troccoアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/trocco)の1記事目書いていきます！（みんなも参加してね）

データ分析やデータエンジニアリングにおいてETL(Extract Transform Load)という言葉を耳にしたことがある方は多いのではないでしょうか？
一方、「ETLではなくELT（音楽グループではない）が主流になりつつある」といったような論調も増えてきました。
この記事では、ETLとELTの違いや、なぜELTにシフトしつつあるのか、この先どうなるのか（予想）について、私なりの見解を書いてみようと思います。

# 一昔前まではETLパターンが多かった
Redshiftが登場した2013年頃、人々はデータレイク層はS3上で構築し、データウェアハウス層〜データマート層はRedshift上に組む人が多かったように思います。
なぜなら当時のRedshiftはノード数 x 稼働時間課金で、ノード内のストレージにデータをロードして使う形だったため、大量のデータをストレージにロードしてしまうとコストが高くなってしまうのです。
したがって最も容量の多いデータレイク層はRedshift上にロードせずS3上にコールドデータとして持たせ、そこからRedshiftに必要なデータのみロードする事が多かったです。

例えば以下の図のように、ETLパターンで事前に加工・変換してからDWHにロードする事が主流でした。
（このETLはSparkなどの分散処理フレームワーク上で、PythonやJavaなどのプログラミング言語を用いて実装されます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61228/905032c4-318a-5257-be1e-d508688d0cf9.png)

# DWHにおける「コンピュートとストレージの分離」
時代は流れ、BigQueryやAthenaのようなクエリ処理に特化したサービスが台頭し始めます。

先述のRedshiftのように、コンピュートリソースとストレージが同一サーバ内に同居するようなアーキテクチャだと、
* CPUはあまり使っていないけど、ストレージが一杯だからノードを増やす必要がある
* ストレージは全然使っていないけど、CPUの処理能力が足りないからノードを増やす必要がある

といったように、CPUかストレージのどちらかがボトルネックになった際にスケールアウト（＝課金）する必要がありました。

一方でBigQueryやAthenaは根本的なアーキテクチャが大きく異なります。
ストレージはブラックボックス化されており、クエリ処理に特化しているのが特徴です。（厳密にはストレージ容量に対する課金はありますが、大幅にコスパが良くなりました）
しかもサーバ台数のような概念はなく、クエリが処理対象としたデータ容量での課金となります。
（CPUリソースなどは内部的に自動で割り当ててくれるため、CPU処理能力の最適化もあまり考えなくてよくなりました）

これらはデータ界隈での大きなブレークスルーポイントでした。

# データレイク層が「DWH」システム上に構築されるように

コンピュートとストレージの分離による恩恵が以下です。
* データ容量による課金が最小化された
* 処理速度も大幅に向上した

これにより、
`Sparkなどの分散処理フレームワーク上でPythonやJavaなどのプログラミング言語を用いて実装するETL`
↓
`DWH上にとりあえずロードして、SQLで変換しちゃおうぜ`
という変化が起こりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61228/344455d2-8c91-146c-9af2-490fff345331.png)

これがETL→ELTの転換ポイントではないかと考えます。
また、一般的な事業会社においての「データ変換・加工」のニーズはそれほど複雑ではなく、SQLのようなシンプルな処理言語でも十分処理可能である、という事実も影響しているように思えます。

# ETLとELTの違い
![ETL vs ELT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61228/ddbb5e35-5f46-cfb7-b024-7b7ef7df35b4.png)
改めてETL/ELT2つの処理パターンを比べてみましょう。
ETLパターンで処理する場合、データソース→ストレージと、ストレージ→DWHの2種類のETLが必要になります。
また、ETLでデータ変換を行う場合、多くの場合はSparkなどの分散処理フレームワーク上でJavaやPythonなどのプログラミング言語で処理を実装する必要があります。
そのためETLを実装できるのはごく一部のデータエンジニアのみでした。

一方のELTパターンでは、E(T)Lはそこまで複雑な処理を要求されない＆OSSやSaaSも多くあるため、誰でもデータレイク層を構築することが出来ます。
さらに、データ変換はSQLで実装可能なため、アナリストやSQLが分かるマーケターやマネージャーの方でも対応できるようになります。
ELTのほうが民主化されている状態と言えるでしょう。

# ELTは銀の弾丸なのか
最後に、ELTの弱点と未来について語ります。
ELTの最大の弱点は、SQLで処理を記述「しなければならない」ことだと思います。
SQLは何十年も前から存在する言語で、複雑な処理を記述することが苦手です。
複雑な処理を書かなければいけない時は、プログラミング言語の自由度やテスト機構などが羨ましくなることが多々あります。

しかし、この弱点も近年対策がされつつあります。
最近多くのDWHでは、プログラミング言語が使えるようなアップデートが盛んに行われています。
Snowpark(Snowflake)やBigQueryのストアドプロシージャでSparkを使えるアップデートなどがソレです。

また、dbtなどの台頭により、SQL自体の弱点も補われつつあります。

これらはELTパターンの普及に拍車をかけ、それによってデータ変換やデータ処理自体をどんどん民主化してくれることでしょう。

# まとめ

いかがでしたでしょうか。今回はETLとELTの違いや、歴史的変遷などを語ってみるポエム記事を書いてみました。
データ界隈は日々の進化が激しく、とても刺激的ですね。
それでは皆様、Happy Data Enginnering!
Paint だけで画像にぼかしを入れたいときに知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。

[ペイントのヘルプ - Microsoft サポート](https://support.microsoft.com/ja-jp/windows/%E3%83%9A%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E3%83%98%E3%83%AB%E3%83%97-d62e155a-1775-6da4-0862-62a3e9e5a511) からしたら書かれちゃいないがこんなことができることは知っていた。

[Windowsの「ペイント」で写真にモザイク加工やぼかしを入れる方法 | エンジョイ！マガジン](https://enjoy.sso.biglobe.ne.jp/archives/paint_mosaic/)
[ペイントのモザイク（ぼかし）を数値で設定するには | Windows 10 | 初心者のためのOffice講座](https://hamachan.info/win10/win/mosaic_p.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/9851db78-c3aa-8522-1d92-276014b1befc.png)

縮小して拡大。
しかし Word や PowerPoint にはこんな機能があるのだ。[Word または PowerPoint で画像をぼかします - Microsoft サポート](https://support.microsoft.com/ja-jp/office/word-%E3%81%BE%E3%81%9F%E3%81%AF-powerpoint-%E3%81%A7%E7%94%BB%E5%83%8F%E3%82%92%E3%81%BC%E3%81%8B%E3%81%97%E3%81%BE%E3%81%99-837e04d6-b1ed-4969-a79f-ee778c435f7c) 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/a1363f29-44c4-fb4e-812f-121a6df38811.png)

一方で ペイント3D ではできないようだ。[ペイント３Dでモザイク編集したい - Microsoft コミュニティ](https://answers.microsoft.com/ja-jp/windows/forum/all/%e3%83%9a%e3%82%a4%e3%83%b3%e3%83%88%ef%bc%93d/0dae72fc-6b27-4945-99e0-acab6ae92860)
コミュニティやフォーラムを真面目にみると実は色々小ネタが見つかる。今年私が知らなかったことである。:christmas_tree:
CourseraのNLPコース "Natural Language Processing Specialization" 学習してみた

CourseraのNLPのコースで一番有名な"Natural Language Processing Specialization"をやってみたので、メモ程度に学習したことを残していきます。メモ程度に残しているので、マジで見にくいですまじで。
このコースは4week × 4course = 16weekのコースです。
基本的には英語のコース(Courseraは全部そうか)で、オンデマンドの動画の字幕だけ日本語ありますが変な訳が割とあります。
途中からQiitaに書こうと一念発起したので、最初の方はまだないです。
今後書いていきます。多分。
## 筆者について
* 修士1年
* プログラミング歴4年程、一番得意なのはPython
* 機械学習歴は2年弱
* 自然言語処理は未経験、学校で自然言語処理の授業取りながら、Courseraを並行してやってる



# Course1 - Natural Language Processing with Classification and Vector Spaces





# Course2 - Natural Language Processing with Probabilistic Models




# Course3 - Natural Language Processing with Sequence Models
## Week3: LSTMs and Named Entity Recognition
この週は文章中から固有表現を引っこ抜いてみようという内容
### RNNのデメリット
* 古典的なRNNのメリットは短い範囲の関係性の考慮、少ないRAMで済む。デメリットは長期の依存性は追えない、勾配消失・爆発。
* 勾配を計算するにあたって、偏微分係数が1より小さければ消失、1より大きければ爆発してしまう。
### LSTM
* 勾配消失問題を解決する方法
* cell states and hidden states
* ゲートがそれぞれのセルの情報の取捨選択を行う
* ゲートの種類
    * Forget Gate: どの情報を捨てるか
    * Input Gate: どの情報を残すか
    * Output Gate: どの情報を出力するか
* tanh gateによって-1~1の範囲に値が圧縮される

### NER: Named Entity Recognition(固有表現認識)
テキストから固有表現を抽出することによって、素早く重要な情報を抽出できる。
#### Processing NER
1. 各固有表現のクラスに数字を当てる
1. 文章の各単語に数字を当てる
1. 長さが最大の文章に合わせてパディングを行う<PAD>
#### Training the NER
1. 文章の書く単語に数字を割り当て、テンソルにする
1. ジェネレータを作成して、バッチにする(バッチ数は大体2の累乗)
1. LSTMに入力する
1. 全結合層に入れる
1. LogSoftmaxに入れる
#### Evaluation
1. モデルで計算
1. 予測結果の配列のどのポイントで値が最大になるかを計算
1. パディングの考慮
1. ラベルと出力を比較

## Week4: Siamese Networks
### Siamese Network
* 二つのNNからなる
* 分の類似性を算出する
    * コサイン類似性(じゃなくてもいい)
* Applications
    * Handwritten checks
    * Question dupulicates
    * Queries
* 2つのサブネットワークのパラメータは共通

### Loss Function
* 基準の質問をAnchorと呼び、それに近ければPositive、遠ければNegativeと判定する。
* Triplets
    * Anchor, Positive, Negative
* $diff = s(A, N) - s(A, P)$として、diffを小さくする方向に学習する
* diffが無限大の発散しないように、下限を設定する → α
* 難しいtripletsの組を作成して、損失関数を大きくすることでモデルは学習していく

### Computing the Cost
* AnchorとPositiveのペアを複数用意して、バッチとする
* AnchorのバッチとPositiveのバッチをモデルに通して、それぞれの類似度を計算する
* ぞれぞれのペアは重複しない(互いにnegative)となることによって、ペア同士の類似度が低くなればnegativeのデータを使ったも同然であり、negativeのデータを用意しなくて済む
* それぞれのバッチの類似度を計算した行列を作成する
    * 対角成分は1に近づく
    * 非対角成分は低くなる(0を超えるものも出てくる)
* 非対角成分も計算に使おう！: Hard Negative Mining
    1. mean negative
    1. closest negative
* 上の二つを代入した損失関数を足し合わせることで最終的な損失関数となる

### One Shot Learning
* モデルの再学習を必要としない学習
* Siamese Networkを使う

# Course4 - Natural Language Processing with Attention Models
やっとAttentionまで来ました。実践的ですね。
## Week1: Neural Machine Translation
### Seq2Seq
* 系列から系列への変換
* 可変長の入力から固定長のメモリへのマッピング
* EncoderとDecoderがある
* 固定長の分しか情報が得られない
    * EncoderからDecoderへの繋がりの部分
* 入力が長くなるにつれて性能が落ちる

### Attention
* 入力文章中の大事な部分の情報のみを保管する機構
* Encoderの隠れ層に重みづけをして、Attention層に放り込む
* Decoderの隠れ層とEncoderの隠れ層を入力として、どの文脈かを出力する

### Queries, Keys, Values, and Attention
*
Ledger CLIで家計簿をつけたい！入門4  複式簿記とは

[←前編](https://qiita.com/kikeg/items/d46f6b8c5faa54575f5d)

前回はLedger CLIでクレカの買い物の際の家計簿の付け方を見ました。でも、クレカ代の支払いの記録の方法が決定打ではないねという話でした。Ledger CLIをまだインストールしていない人はこちらから↓

https://qiita.com/kikeg/items/07c2794e226b9ae18205

意味わかんねえよという人は入門1の銀行編も見てください

https://qiita.com/kikeg/items/36c2905bb30148fed9b9

今回から数回企業会計の定石を生かして家計簿の解析をすることを考えます。そのため、まずは複式簿記について説明します。めんどくさいことはいいんじゃという方は飛ばして大丈夫です。

# 複式簿記とは?

Ledger CLIは複式簿記という理論に基づいて帳簿をつけていきます。複式簿記というのは所謂簿記*級みたい資格で扱うもので、現在の会社の会計ではほぼ間違いなく使われている仕組みです。全部説明していくと簿記の教科書になってしまうのでざっくり説明します。

## 勘定科目

まず、自分の資産、負債、収入、支出などお金にまつわる「金額」のつくものすべてを勘定科目というカテゴリーに分けます。勘定科目というのは英語でいうとaccountだそうで、銀行の口座とかから派生してそうな言葉です。このカテゴリーは大きく分けると5つあります。通常の企業会計でよく聞く言い方[^accountlist]と英語名称をカッコ書きで添えています。

* 収入(収益, Income)
  文字通りの給与収入や利息収入、株の売却益などはここに入ります。
* 支出(費用, Expenses)
  食費、交際費、光熱水費…費用がつくものはすべてここです。株の売却損もここです。
* 資本金(純資産, Equity)
  これは聞き慣れないと思いますが、[銀行編][ledger-cli-bank]や[クレカ編][ledger-cli-card]で出てきた「Ledgerを使い始めたときの初期残高」と思っておきましょう[^netasset]
* 資産 (Assets)
  銀行の口座、持ってる株券などがここです。実は「経費精算したら帰ってくるけどまだしてないお金」とかもここです[^pointasset]。
* 負債 (Liabilities)
  最後にクレカの残高、ローンや奨学金の残高です。[クレカ編][ledger-cli-card]で見た引き落とし前のクレカ代もこの負債でした。

この内Ledger CLIでは

* 支出、資産が正の値
* 収入、純資産、負債が負の値

になります。普通の複式簿記会計ではすべて正の値をとるとするので表現上違って見えますが[銀行編](https://qiita.com/kikeg/items/36c2905bb30148fed9b9)で触れたとおりこの負の値で考えると**お金が入っていく先はプラス、お金が出てくる源はマイナス**という挙動に一貫してなっていることに気づきますし、後々のBS/PLの説明も簡略化できます。

## 取引

こうしてすべてのカテゴリーが出揃ったところで、現実のお金の動きをこのカテゴリーに合わせて考えていきます。すでに以前の入門編で全部出ているのでなんとなくおわかりだと思います。

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2278753/e640c828-b50e-6f94-c71c-55cf633e74b7.png">

* 収入からは常にお金が出てきます。給与であっても売却益であっても必ずお金が出てきます。
  * 収入から資産に入るものを手取りと呼びます。
  * 収入から支出へダイレクトに流れるものを税金と呼びます。
* 同様に支出も常にお金が流れ込んでいきます。言ってみればブラックホールです。
  * 資産から出るのが現金払い、負債から出るのがクレカ払いです。
* 資産と負債は相互に行き来します。これを借金と返済といいます。

当たり前ですがここ100年以上使われる概念なので、人間のお金の使い方は全部このどれかからどれかに流れるようにできています。Ledger CLIもこれを記録するためのソフトウェアであり、そのためのテキストフォーマットなわけです。

今日はこのへんでお茶を濁して明日以降は複式簿記を使う上で避けて通れないBS（貸借対照表）とPL（損益計算書）が家計簿レベルでどういう意味があるのかを説明します。

https://qiita.com/kikeg/items/1b72edf179c1fef66751

[^tanshiki]: [Wikipedia - 単式簿記](https://ja.wikipedia.org/wiki/%E5%8D%98%E5%BC%8F%E7%B0%BF%E8%A8%98)によると歴史的には複式簿記のほうが先に発明されたように書かれていますが、本当かはよくわかりません。[money plusの江戸時代の帳簿についての記事](https://media.moneyforward.com/articles/444?page=2)を見ても、やはり単式が先に発明されたと考えるほうが自然な気はします。
[^accountlist]: https://jimuyasanblog.com/account-type 参考
[^netasset]: 実際企業会計でも資本金と利益余剰金が入る項目ですが、前者は家計簿においての初期残高で、後者は毎年会計を締める必要がない家計簿では発生しません。
[^pointasset]: お店のポイントも広義で考えれば資産です。ただ、よほど還元率が良くて考えないと解析が狂わないとかで無い限り無視しておくのが楽でいい気もします。

[ledger-cli-bank]: https://qiita.com/kikeg/items/36c2905bb30148fed9b9
[ledger-cli-card]: https://qiita.com/kikeg/items/6e72c75755ed498cf695
【超簡単】VSコード 相対パスの取得方法

## はじめに

## 絶対パスと相対パスについて

##### 絶対パス
絶対パスとはルートディレクトリからの経路を表しており、誰からみても同じパスとなります。

##### 相対パス
相対パスとは、現在作業しているフォルダから目的のフォルダまでの経路を表します。

## ディレクトリ構造
筆者はflaskでアプリを作成中なため、このようなディレクトリ構造になっております！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/6d7e8916-df27-bc22-e62a-072d98641eb1.png)

## VSコードで相対パスの取得方法

筆者はslide.htmlファイル内に画像を表示したいので、slide.html内にいる状態で、表示したい画像(chiro1.jpg)を右クリックしています。
写真にあるように相対パスのコピーをクリックすると、相対パスを取得することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/53ab309e-2d3b-4909-3c9c-dee8e7a228cf.png)

```
static/image/chiro1.jpeg
```
このようなパスが取得できました！

## 最後に
相対パスは何もみずに書けるようになった方が絶対良いですが、わからなくなることが多々あると思います！
そういった時にぜひ今回紹介したやり方を試してみてはいかがでしょうか？
2022/12/5主にITとかセキュリティの記事

平均被害額は約160万円！ SNSでの｢なりすまし詐欺｣を防ぐ5つのヒント(12/3)
https://www.businessinsider.jp/post-262819

3万5千人分、紛失漏えい　マイナンバー、過去5年間(12/3)
https://www.47news.jp/economics/8647855.html
https://news.yahoo.co.jp/articles/8f827fa8f2198db4e357fdf64aaf36748bf1f5cd
https://news.goo.ne.jp/article/kyodo_nor/nation/kyodo_nor-2022120301000554.html

AirTagの不正改造で全国初の摘発　オークションなどで販売(12/3)
https://www.zaikei.co.jp/article/20221203/699969.html

GPS衛星を使って北朝鮮のICBMを検知するシステムを有志が作成(12/3)
https://gigazine.net/news/20221203-north-korean-missile-gps/

無料VPNは使える？気になるセキュリティやおすすめのVPNを紹介(12/2)
https://makuring.com/internet/free-vpn/

2025年以降の社会、企業、ICT――変わること変わらないこと
どうなる？ どうする？ 日本企業のDXと日本の行方
～Modernize or Die　経営層が持つべき危機感、採るべきアクション～(12/8開催)
https://v2.nex-pro.com/campaign/47120/apply?group=nec01

「人事評価を気にするあまり」、３０代検察事務官が不正アクセスし内部情報を閲覧(12/2)
https://www.yomiuri.co.jp/national/20221202-OYT1T50203/

検察事務官が不正アクセス　「評価気になり」人事情報閲覧―岐阜地検(12/2)
https://www.jiji.com/jc/article?k=2022120201096&g=soc

韓米日が同時に独自の北朝鮮制裁、挑発対応で協力強化(12/3)
https://www.donga.com/jp/east/article/all/20221203/3800602/1
CDNでReactを使うためのスケルトン

# 概要

CDNでReactライブラリを読み込んでHTMLファイル1つだけでReactを利用するためのスケルトンコード

# コード

```TinyReact.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Tiny React</title>

  <script type="text/babel">
    function App() {
      return (
        <div>
        </div>
      );
    };
  </script>

  <style>

  </style>

</head>

<body>
  <div id="root"></div>
  <script crossorigin src="https://unpkg.com/react/umd/react.production.min.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom/umd/react-dom.production.min.js"></script>
  <script crossorigin src="https://unpkg.com/@mui/material/umd/material-ui.production.min.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  <script type="text/babel">
    const root = ReactDOM.createRoot(document.getElementById('root'));
    root.render(
      <React.StrictMode>
        <App />
      </React.StrictMode>
    );
  </script>
</body>

</html>
```

# Reactとp5.jsを一緒に使う

```TinyReactP5.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Tiny React P5</title>

  <script type="text/babel">
    const Sketch = props => {
      const containerRef = React.useRef();

      const _Sketch = (p) => {
        p.setup = () => {
          p.getAudioContext().suspend();
          p.createCanvas(p.windowWidth, containerRef.current.clientHeight);
        }

        p.draw = () => {

        }

        p.windowResized = function () {
          p.resizeCanvas(p.windowWidth, containerRef.current.clientHeight);
        }
      }

      React.useLayoutEffect(
        () => {
          let s = new p5(_Sketch, containerRef.current);
          return () => s.remove();
        },
        []
      );

      return (
        <div className="sketch-container" ref={containerRef}></div>
      );
    }

    const App = () => {
      const [count, setCount] = React.useState(0);
      const handleClick = React.useCallback(
        () => setCount((n) => n + 1),
        [setCount]
      );

      return (
        <div className="App">
          <Sketch />
        </div>
      );
    };
  </script>

  <style>

  </style>

</head>

<body>
  <div id="root"></div>
  <script src="https://unpkg.com/p5/lib/p5.min.js"></script>
  <script src="https://unpkg.com/p5/lib/addons/p5.sound.min.js"></script>
  <script crossorigin src="https://unpkg.com/react/umd/react.production.min.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom/umd/react-dom.production.min.js"></script>
  <script crossorigin src="https://unpkg.com/@mui/material/umd/material-ui.production.min.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  <script type="text/babel">
    const root = ReactDOM.createRoot(document.getElementById('root'));
    root.render(
      <React.StrictMode>
        <App />
      </React.StrictMode>
    );
  </script>
</body>

</html>
```
Slackで同じワークフローのショートカットを複数チャンネルに設置する

こちらは[クラスター Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cluster)（2ページ目）の5日目の記事です！
前日は @kurain さんの「[和服で出社するようになって半年](https://r-kurain.hatenablog.com/entry/2022/12/04/125252)」でした。最近は社員数が多くなって誰がどこにいるか探すのも大変なんですが @kurain さんは和服のおかげで一瞬で見つかります（笑）

こんにちは、スワンマンです。クラスター株式会社でディレクターとかCSをしています。
ところで皆さん、今日も元気に草の絵文字を連打していますか？Slackで業務の合間に草な投稿を見つけては押しまくるの、息抜きにいいですよね。
![草に草を生やす事例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58380/cd0661ee-95ab-7cf1-7d55-a8d6cd028cd6.png)
そんなSlackですが、草を生やす機能以外に[ワークフロー](https://slack.com/intl/ja-jp/help/articles/360053571454)というちょっとした自動化ツールがあるのをご存じでしょうか。
フォームを作ったり、絵文字のリアクションに反応して動いたり、Webhookによって外から起動する…といったことがポチポチ押していくだけでできてしまう便利な機能です。

その中で、最初の「フォーム」についてはチャンネルに「ショートカット」という形で起動メニューが表示されるため、他のチームからSlack上で依頼を受ける際にちょうど良い機能です。
この「ショートカット」を置くチャンネルは通常1つしか設定できないのですが、ある方法を使うと複数チャンネルに設定できるため、今回はこれを紹介したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58380/5bc7d931-d894-af05-d4fd-beea4e2059b9.png)
ワークフローはSlackのメニューから「ツール -> ワークフロービルダー」と辿り、右上の作成ボタンを押すことで作成を開始できます。そこから「ショートカット」を選択してステップを追加してなんやかんやしたものがこちらです。
本題はここからで、まず下記のようにワークフローをファイルとしてダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58380/4763f580-851c-5e53-f203-0e1475c4e5b6.png)
ここでダウンロードした `.slackworkflow` というファイルは中身はJSONで、下記のような構成になっています。

```json
{
  "source_id": "xxxxxxxxxxxxxxxxxx",
  "version": "1",
  "workflow": {
    "name": "スワンマンワンマンライブ依頼窓口",
    "blueprint": {
      "version": "1",
      "trigger": {
        "type": "channel_action",
        "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "config": {
          "name": "スワンライブ依頼",
          "channels": [
            "XXXXXXXXX"
          ],
          "callback_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "description": "スワンライブ依頼"
        }
      },
      "steps": [
        {
          "type": "dialog",
          "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "config": {
            "dialog_title": "スワンマンワンマンライブ依頼フォーム",
            "results_user": {
              "value": "XXXXXXXXX"
            },
            "dialog_elements": [
              {
                "name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                "type": "text",
                "label": "開催日は？",
                "subtype": "",
                "optional": false,
                "placeholder": ""
              }
            ],
            "dialog_submit_label": "",
            "delivery_button_label": "フォームを開く",
            "delivery_message_text": "こんにちは！まずこちらのフォームに入力してください。"
          }
        }
      ]
    }
  }
}
```

このJSONをよく見ると、ショートカットの配置チャンネルを指定する `workflow.blueprint.trigger.config.channels` が配列になっています。つまり複数指定できるようになっているので、ここに対象となるチャンネルを複数入れてやることで目的を達成できるわけです。
なお、ここに記入するのは #general のようなチャンネル名ではなく `CXXXXXXXX` のようなチャンネルIDになります。IDはチャンネル詳細ダイアログの一番下からコピーできたり、チャンネルのリンクをコピーして末尾から取るとか、いくつか方法があるのでググってみてください。

編集ができたらワークフロービルダーからインポートすることで複数のチャンネルにショートカットが表示されるようになると思います。
一度インポートすれば（ショートカットの設置場所以外は）ワークフロービルダーから自由に編集・適用ができるので、後から内容を変えたい時も複数チャンネルに対して一度に反映できて便利です。
（ショートカットを置くチャンネルを追加したい場合は再度同じように保存 -> インポートすればOK）

ということでSlackの小ネタでした。
明日は @yoan さんの「NixOSでhttpsプロトコルのgit認証情報を保存したい」です。楽しみですね。
それでは！
AWSクラウドプラクティショナー合格体験記

# 目次
[1.この記事を書いた経緯](#1-この記事を書いた経緯)
[2.使用した教材と勉強方法](#2-使用した教材と勉強方法)
[3.かかった時間](#3-かかった時間)
[4.かかった金額](#4-かかった金額)
[5.苦労したところ](#5-苦労したところ)
[6.まとめ](#6-まとめ)
[7.参考サイト](#7-参考サイト)

# 1-この記事を書いた経緯
AWS実務未経験者がクラウドプラクティショナー(**AWS Certified Cloud Practitioner**)を取得するまでの備忘録として書きました。主に以下の観点まとめました。
* 使用した教材と勉強方法
* かかった時間
* かかった金額

:::note warn
注意点
本記事ではクラウドプラクティショナーの概要については特に説明しません。概要については[こちら](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)を参照して下さい。
:::

# 2-使用した教材と勉強方法

教材は模擬問題集とAWS入門書の2つだけ使いました。
　**①** [【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（8回分520問）](https://www.udemy.com/course/aws-4260/)
　**②** [AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)](https://www.amazon.co.jp/%E5%B7%9D%E7%95%91%E5%85%89%E5%B9%B3/dp/4815607850/ref=sr_1_1_sspa?crid=9W4F6AHS13C3&keywords=AWS&qid=1670172218&s=books&sprefix=aws%2Cstripbooks%2C592&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFaREI3MjBJTlpCWUcmZW5jcnlwdGVkSWQ9QTAxNTE0OTIxTk5WNUZZWDBOVEVQJmVuY3J5cHRlZEFkSWQ9QTJWMURFNUhCVFUwWFcmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

以下のように勉強しました。
* 模擬問題集(①)を解く
* わからない問題・単語を参考書(②)で調べ、メモしておく
* メモしたところを次の日に読んで復習する

# 3-かかった時間
　試験本番までのタイムテーブルは以下です(目安)。
| 期日(週目) | 実績 | 時間(h) |
|:-----------|:------------|:------------|
| 1週目(10月30日～)| 模試1回目(基本レベル①)|7.0|
| 2週目(11月06日～)| 模試2回目(基本レベル②)|6.0|
| 3週目(11月13日～)| 模試3回目(本番レベル③)|5.0|
| 4週目(11月20日～)| 模試4回目(本番レベル④)|6.0|
| 5週目(11月27日～)| 総復習|4.0|
| 6週目(12月04日)| 試験本番|ー|

時間としては合計で28時間程かかりました。このスケジュールで勉強して、730/1000(合格点は700)でギリギリ合格しました。
![AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677151/85ef8f0f-b772-9af3-fc89-7516b67cb2e9.png)


# 4-かかった金額
* [教材](#2-使用した教材と勉強方法)代5000円
* 受験費用12100円
合計で約17100円かかりました。

# 5-苦労したところ
* AWSのサービスの多く覚えることが大変
＞AWSのサービスはとても多く、類似サービスがたくさんあるので、整理して覚えることに苦労しました。AWSのサービスを大きなカテゴリ(例えば、コンピューティング、コンテナ、ストレージ、マイクロサービス)で覚えるのが効果的でした。

* AWSのサービスを把握すること
＞AWSのサービスはとても多いので、限られた時間で全てのサービスを把握することはとても難しいと思いました。模試で出たところを絶対に落とさないようにして、とれる点は確実にとるのが大事だと思いました。

* 受験までの手順がわかりにくい
＞本試験はテストセンターで受験しましたが、手続きを済ませることにも苦労しました。なので受験の際は、受験日の1か月程度前から受験の準備をするのが良いと思います。

# 6-まとめ
先日AWSのセミナーに偶然参加することになって、そこからなんとなくAWSに興味がわき、本試験を受験しました。試験勉強を通じて、AWSのサービスの概要がなんとなくわかった気がします。まだ具体的には決めていませんが、他のAWSの資格にも挑戦してみたいと思います。この資格がおすすめ等あったら教えてほしいです。

2023年3月21日追記
-
続編としてSAAについての記事も[こちら](https://qiita.com/wiskerpaddy/private/b543212dca665ea09010)に書きました。

# 7-参考サイト
* [AWS Certified Cloud Practitioner
この認定の詳細と、準備に役立つ AWS のリソースをご紹介します。](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)
* [【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（8回分520問）](https://www.udemy.com/course/aws-4260/)
* [AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)](https://www.amazon.co.jp/%E5%B7%9D%E7%95%91%E5%85%89%E5%B9%B3/dp/4815607850/ref=sr_1_1_sspa?crid=9W4F6AHS13C3&keywords=AWS&qid=1670172218&s=books&sprefix=aws%2Cstripbooks%2C592&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFaREI3MjBJTlpCWUcmZW5jcnlwdGVkSWQ9QTAxNTE0OTIxTk5WNUZZWDBOVEVQJmVuY3J5cHRlZEFkSWQ9QTJWMURFNUhCVFUwWFcmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)
Jitsi MeetオープンソースWeb会議システムubuntuにインストール

Jitsi MeetオープンソースWeb会議システムubuntuにインストールしてみました。

```
# apt update
# apt install apt-transport-https
# apt-add-repository universe
# apt update
# apt install openjdk-8-jdk
# curl https://download.jitsi.org/jitsi-key.gpg.key | sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'
# echo 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null
# apt update
# sudo apt install jitsi-meet

```
Jitsi Meetをインストール
TLS証明書は、とりあえず自己署名証明書を作る
TLS証明書をLet's Encrypt利用で下記shell実行
更に、# crontab -u root -eコマンドにて毎月1日の午前4時に更新するよう、crontabを設定
```
# sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh

# crontab -u root -e
0 4 1 * * certbot renew && systemctl systemctl restart apache2
```
AWS Protonで使い捨てのブランチプレビュー環境を実現する

この記事は 「[AWS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws) その１」の５日目の記事です。

https://qiita.com/advent-calendar/2022/aws

# AWS Proton

今年はProtonさんのおかげでインフラ周りをスッキリ快適にさせることが出来て、本当にProtonさんさまさまでした。
本番とステージング環境は実際にProtonで稼働しており、問題なく運用できております。
こちらの記事の頃よりも改良が進んでいて、ステージング環境用のDBを課金少な目構成にしたり、ECS ExecでFargateに入れたりなどできるようになってきて、結構楽しいです。

https://qiita.com/goosys/items/ef66274663b3552be36f

https://qiita.com/goosys/items/28606473d3622900b3c2

今回は、最初にProtonを知ったときにこういうことできたらいいなと思っていたものを作っていこうと思います。

# 目標

- Railsのアプリケーションをデプロイできる
- ブランチ毎やPR毎にデプロイ環境を立ち上げ、非エンジニアにささっと確認してもらえる環境として利用できる
- 永続的なデータは残さず、環境破棄と同時に全て消える前提（DB・アップロードファイル等）
- 高価なサービスは使わないか、使っても最小限になるようにする

# 出来たもの

Protonテンプレート用リポジトリ

https://github.com/goosys/proton-branch-preview

サンプルアプリケーション用リポジトリ

https://github.com/goosys/rails-7-scaffold

デプロイ :clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/ab29d200-db69-96e4-db54-6d42df440399.png)

# 環境テンプレート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/ca03ece2-bcba-b3ec-3903-17a21708b8ef.png)

- VPC一式とALB一式とECS Clusterだけ作っておく
- Hosted ZoneとSSL証明書は別途作成し、起動時のパラメータでIDやArnをセットできるようにしておく

# サービステンプレート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/537368fb-5757-5156-8baa-11db908f0d5d.png)

- ブランチ毎にサービスを起動する想定
- サービスを起動するとFargateのServiceからアプリケーションが起動し、環境側のALBにTargetGroupをぶら下げてくる
- ALBにリスナールールも追加し、環境側の１つのALBで複数サービスをルーティングしてくれるようにする
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/55ac964f-1ac6-9b51-50b1-8bd43297d49a.png)
- 環境側のパラメーターで指定したHostedZoneにDNS設定を追加し、サブドメインで即アクセス可能にする

## パラメーター

リポジトリとブランチを選んで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/bbf5c8bb-38d8-1a98-6776-f25843df072f.png)
ドメインを入力するだけ :clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/a76f5e95-8e73-383b-dc75-262f8008e825.png)

# アプリケーション

- RDSなどは使わずコンテナで起動していく
  - Redisやworker系、メーラー系なども必要になったらコンテナで起動する（今回は省略）
- AutoScallingなどは使用しない前提（当然）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/f3017065-3cd8-0f5e-f5bb-49b188e87bbc.png)

- アプリケーション側の設定はこのくらい

https://github.com/goosys/rails-7-scaffold/commit/badd72072f8f44d261de9a729d5556294b46e408

# たくさん起動してみる

こんな感じでいつでもいくつでもブランチプレビュー環境を起動できるようになりました。 :clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/b6bf7a98-d2e4-c7f5-1479-d98c2c056655.png)

アクセスも即できます。当然のようにSSLで。 :clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/ba485f2b-fc20-73d9-6cf1-70a7f1ac2a35.png)

そして、使い終わったらいつでも消せて何も残りません。 :clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/f4b459d7-b906-9ab6-28f5-3b948d7d47b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/c23fa296-7287-f262-204f-5b3582ed4ba6.png)

# おわり

いい感じに出来ました。
料金的にはおそらく、＄18(ALB x1)+ ＄5(HostedZone x1)が固定費であとはFargateを使った分だけという感じで、RDSもRedisも使わないのでかなりお得に作れたのではないかなと思います。
Python の __name__ == '__main__' とは何か知りたい

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.315 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Sun Dec 04 2022 10:11:56 GMT-0800 (PST)
* Source doc: 2022-11-17 Python の __name__ == '__main__'
* Tables are currently converted to HTML tables.
----->

## 前書き

Python をコマンドラインから実行するとき、おまじないのように、

```py
if __name__ == '__main__':
    run()
```

という内容を記載していた。

コマンドラインから直接ファイルを実行した際、 `if __name__ == '__main__':` のブロック内のコードが実行される。

今回の例でいえば、 `run()` である。

## 何をしている？

ファイルがモジュールとして読み込まれた際は実行されず、インタプリタに引数として直接取られたり、標準入力で受け渡されたりした際に実行される処理をここに記載している。

## どうやって実現している？

コマンドラインから Python を実行すると、 `__name__` というグローバル変数に `'__main__'` という文字列が格納される。

そのため、 `if __name__ == '__main__':` の条件に合致し、そのブロック以下のコマンドが実行される。

対して、ファイルがモジュールとして import された際はこの行は実行されない。

## なぜ `__name__` に `'__main__'` が格納されるのか？

ファイルがモジュールとして読み込まれたとき、「`__name__`」変数には、そのモジュールの名称が格納される。

以下でいうと、b.py の `print(__name__)` で出力されている「b」である。


```console
$ cat <<'EOF' > a.py
import b
print(__name__)
EOF
$ cat <<'EOF' > b.py
print(__name__)
EOF
$ python a.py
```

結果

```
b
__main__
```


一方、ファイルがモジュールとして読み込まれたのではなく、トップレベルのスクリプトとして読み込まれた場合、「`__name__`」というグローバル変数に `'__main__'` という文字列が格納される。

さきほどの結果でいうと、 a.py の `print(__name__)` で出力されている「`__main__`」という文字列である。

## `'__main__'` とは？

> `'__main__'` はトップレベルのコードが実行されるスコープの名前です。
> https://docs.python.org/ja/3.8/library/__main__.html

## Ref

* [6. モジュール — Python 3.9.12 ドキュメント](https://docs.python.org/ja/3.9/tutorial/modules.html)
* [Pythonのトップレベルのスクリプト - Python入門](https://kaworu.jpn.org/python/Python%E3%81%AE%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88)
C++CSVクラス

個人メモ用
切り貼りしたコードでまだ未デバッグ。
一応継承すること想定

```c++:csv_class.cpp

#include <fstream>
#include <string>
#include <vector>

class CSVFile
{
public:
    CSVFile(const std::string& filename, char delimiter = ',');

    // ファイルを開く
    bool open();

    // ファイルを閉じる
    void close();

    // ファイルから1行読み込む
    bool readRow(std::vector<std::string>& row);

    // ファイルに1行書き込む
    bool writeRow(const std::vector<std::string>& row);

private:
    std::string m_filename;  // ファイル名
    char m_delimiter;        // 区切り文字
    std::fstream m_file;     // ファイルストリーム
};

CSVFile::CSVFile(const std::string& filename, char delimiter)
    : m_filename(filename), m_delimiter(delimiter), m_file()
{
}

bool CSVFile::open()
{
    // ファイルを開く
    m_file.open(m_filename, std::ios::in | std::ios::out | std::ios::trunc);
    if (!m_file.is_open())
    {
        return false;
    }

    return true;
}

void CSVFile::close()
{
    if (m_file.is_open())
    {
        // ファイルを閉じる
        m_file.close();
    }
}

bool CSVFile::readRow(std::vector<std::string>& row)
{
    if (!m_file.is_open())
    {
        // ファイルが開かれていない
        return false;
    }

    std::string line;
    if (!std::getline(m_file, line))
    {
        // 行が読み込めない
        return false;
    }

    // 1行をカンマで分割して、行の要素として格納する
    std::string token;
    std::istringstream tokenStream(line);
    while (std::getline(tokenStream, token, m_delimiter))
    {
        row
.push_back(token);
    }

    return true;
}

bool CSVFile::writeRow(const std::vector<std::string>& row)
{
    if (!m_file.is_open())
    {
        // ファイルが開かれていない
        return false;
    }

    for (std::vector<std::string>::const_iterator it = row.begin(); it != row.end(); ++it)
    {
        if (it != row.begin())
        {
            // 2番目以降の列の前に区切り文字を挿入する
            m_file << m_delimiter;
        }

        // 列の値を書き込む
        m_file << *it;
    }

    // 行末に改行を挿入する
    m_file << std::endl;

    return true;
}
```
```cpp:main.cpp
#include <iostream>
#include <vector>

int main()
{
    CSVFile file("myfile.csv");

    // ファイルを開く
    if (!file.open())
    {
        std::cerr << "Failed to open file." << std::endl;
        return 1;
    }

    // ファイルから1行読み込む
    std::vector<std::string> row;
    while (file.readRow(row))
    {
        // 読み込んだ行を出力する
        std::cout << "Read row:";
        for (std::vector<std::string>::const_iterator it = row.begin(); it != row.end(); ++it)
        {
            std::cout << " " << *it;
        }
        std::cout << std::endl;

        // 行をクリアする
        row.clear();
    }

    // ファイルに1行書き込む
    std::vector<std::string> writeRow;
    writeRow.push_back("abc");
    writeRow.push_back("123");
    file.writeRow(writeRow);

    // ファイルを閉じる
    file.close();

    return 0;
}
```
元法学部生と読むLegal NLP

# はじめに

- 本記事は[ARISE analytics Advent Calendar 2022](https://qiita.com/advent-calendar/2022/arise-analytics)の5日目です。
- 昨日は[@moririnz](https://qiita.com/moririnz)さんの[レガシーエンジニアのためのモダンエンジニアことはじめ](https://qiita.com/moririnz/items/c1068ffdfb0666110a5a)
- 明日は[@Sho_Takamine](https://qiita.com/Sho_Takamine)さんのApache EChartsを使って簡単グラフ描画

# Legal NLPとは

法律をテキストとして捉え、自然言語処理(Natural Language Processing, NLP)の対象とする分野です。

具体的な例として日本では契約文書を対象とした検索等を行うスタートアップ企業が複数存在し、そちらも大変興味深いですが、本記事では特にスイスの裁判例を対象として複数言語の判例分析を行った論文を紹介します。

# 内容

本記事では [Swiss-Judgment-Prediction: A Multilingual Legal Judgment Prediction Benchmark](https://aclanthology.org/2021.nllp-1.3/) を紹介します。

- タスク
    - スイス最高裁(Federal Supreme Court of Switzerland,FSCS)の事件
    - 判例の結果を請求の成否で分類
    - 約85000件の裁判例を対象(うちドイツ語50000件、フランス語31000件、イタリア語4000件)
    - 裁判例の関係する法律は多岐にわたる
![Screen Shot 2022-12-05 at 2.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961092/5617c8cb-0e37-c391-0814-df0058c58e85.png)
（※画像はリンク元より抜粋）

- 概要
    - 多言語裁判例のアノテーション付きデータセット作成、テキスト分類タスク、トークン長の長い文章に対応したベースラインモデル作成を実施
    - ケースがより複雑になるにつれ（事実が長くなるにつれ）、パフォーマンスが低下する
    - 法律分野はモデル性能と関係がない
    - どの州の事件かはモデル性能と関係がない

# おわりに

以下の点が興味深かったです。
- スイスの法制度は州ごとに異なるようだが（参考：[スイスの法制度の概要](https://www.bizlawjapan.com/wp-content/uploads/switzerland_houseido_01.pdf)）、モデル性能に州ごとの差がない
- 言語が異なる場合でもモデルの性能に差がない
- 法律の分野が異なる場合でもモデルの性能に差がない

以上はモデルが表面的な情報のみで判断しているのではないかという、法律に限らず考えられてきた(cf. [Probing Neural Network Comprehension of Natural Language Arguments](https://aclanthology.org/P19-1459/))ことと同じことが考えられそうです。言語、法律用語、州の制度差に影響を受けないのは面白いと思いました。
Gametestを学ぶ上で必要な知識

# 導入
　あなたは、Minecraftというゲームをご存じでしょうか。まぁ、あんな神ゲーをご存じない方、そうそういらっしゃらないかと思います。
　そんなMinecraftの統合版のアドオンの一種には"Gametest Framework"というものがあります。Javascriptで記述し、プレイヤーのアイテム使用検知や攻撃検知、鯖参加検知、Form表示などが可能です。ただ、そもそもGametestについての記事もあまり多くはないですし、「なんかよくわからないけどおもしろそうだからやってみたい！」的な方向けの記事ってあまりないなぁと思い、この記事をしています。
　ということでこの記事では、Gametestをするうえで必要な知識と、それらを得るためにいいサイトや本などを記していこうかと思います。

# 必要な知識
## 1. Javascript
必要な知識１つ目は、プログラミング言語"Javascript"です。これを知らずにGametestを書こうとすることは、日本語を知らずに作文を書くようなものです。無理ですね。似たような名前のプログラミング言語に"Java"がありますが、全くの別物なので注意してください。
0からプログラミングを学ぼうと思うと、演算子など多少数学からズレる部分があるので、少し苦戦するかもしれませんが、先入観をなくして一歩ずつ学んでいけば、基本構文で難しいところはありません。

オススメのサイト=> [Javascriptの基本をサルでもわかるようにまとめた](https://www.ituore.com/entry/javascript-basic)
あると心強い本=>[JavaScript逆引きレシピ 第2版](https://www.amazon.co.jp/JavaScript%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94-%E7%AC%AC2%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4798157570/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1670171368&sr=8-14)

## 2. オブジェクト指向
必要な知識２つ目は、プログラミングを書く上での __考え方__ の一種「オブジェクト指向」です。これを知らないと、自分で作りたいものを作ることがかなり厳しくなります。あくまでもオブジェクト指向は考え方であり、プログラミングに直接的な影響を与えるものではありませんが、その考え方に基づいて適切にプログラムを書いていくことで、プログラム全体の見通しがよくなります。
また、Gametestという機能自体がオブジェクト指向に基づいて作られているため、リファレンス(後述)を読むうえでもオブジェクト指向という考え方を知らないと厳しいかと思います。
オブジェクト指向は難しいと言われていますが、__考え方である__ ということを忘れずに全体像を把握するつもりで学習すればそこまで躓くことはありません。多少あいまいでぼんやりとした理解の状態で繰り返し学習すればオブジェクト指向とはどのようなものなのかが分かるでしょう。

オススメのサイト=>[オブジェクト指向とは？誰でもわかるようにやさしく解説](https://www.sejuku.net/blog/5973)
「オブジェクト指向を学ぶ」という目的だけなら[スッキリわかるJava入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295007803/ref=asc_df_4295007803/?tag=jpgo-22&linkCode=df0&hvadid=342518373760&hvpos=&hvnetw=g&hvrand=15705372573552005926&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009487&hvtargid=pla-838775058853&psc=1&th=1&psc=1)という本もオススメです。

## 3. リファレンス
リファレンス、日本語に訳すと"参照"。リファレンスを知らずとも、読めずとも、Gametestを書くこと自体は可能です。しかし、リファレンスがなければ自分の作りたいものを作ることはできず、解説動画などのプログラムを少し書き換えたりすることしかできず、もしGametestをマスターしたとしても、その領域に達するまでに通常の数倍もの学習コストがかかるでしょう。
リファレンスとは、あるプログラミング言語や、モジュールの仕様がまとめられているものです。Gametestにもリファレンスが存在し、クラスやメゾットなどの情報はすべてリファレンスに載っています。リファレンスを読めるようになるためには、Javascriptなどプログラミングに関する用語や、オブジェクト指向に対する理解がある程度なければなりません。また、リファレンスは英語の場合が多いため、英語力もしくはコツコツ翻訳して読んでいく根気が必要になります。
分からない単語があれば面倒くさがらず調べましょう。

Gametestのリファレンス=>[ゲームテスト フレームワークの概要](https://learn.microsoft.com/ja-jp/minecraft/creator/documents/gametestgettingstarted)

# 最期に
如何でしたでしょうか。私自身がGametestについて学ぶ際、どこから手を付ければいいのかを教えてくれる記事に出会えなかったため、今回記事にしてみました。全く理解できない部分と出会っても、時間をおいてもう一度そこを読んでみると理解できたなんてこともざらにあります。
一人でも多くの「Gametestやってみたい」という方の助けに、この記事がなりますように。
vPro対応PCを検証用仮想プラットフォームにする話(2)〜AMT設定編〜

# vPro対応PCを検証用仮想プラットフォームにする話(2)〜AMT設定編〜

## [前回](https://qiita.com/JUNKER_TOMATO/items/4fa61d9d3a94b760f3e2)まで
vPro/AMTの概要とvPro対応PCの選び方を書きました。<br>

## 準備したvPro対応PC

ヤフオクで [HP EliteDesk 800 G5 SFF](https://jp.ext.hp.com/desktops/business/elitedesk_800_g5_sf/) を入手しました。<br>
3年ほど前に発売されたデスクトップPCです。いわゆるスリムデスクトップサイズですが、メモリslot４、M.2 SSD Slot２基、PCIe slotも4つあるなど拡張性は高いモデルです。<br>
これに手持ちの中古パーツを搭載しています。
|種別|品名|備考|
|:-:|:-:|:-:|
|PC本体|[HP EliteDesk 800 G5 SFF](https://jp.ext.hp.com/content/dam/jp-ext-hp-com/jp/ja/ec/lib/products/desktops/spec_pdf/800g5sf_cto.pdf) |Chipset [Q370](https://www.intel.co.jp/content/www/jp/ja/products/sku/133282/intel-q370-chipset/specifications.html)|
|CPU|[intel Core i7 9700](https://www.intel.co.jp/content/www/jp/ja/products/sku/191792/intel-core-i79700-processor-12m-cache-up-to-4-70-ghz/specifications.html)|8C/8T 3.0-4.7GHz|
|Memory|DDR4 32GB x 2 |64GB|
|Boot SSD|Crucial CT128M4SSD|SATA3 128GB|
|DataStore SSD|intel SSD 600p |NVME 512GB|

*chipsetから分かりますが、実は 一世代前の[EliteDesk 800 G4 SFF](https://jp.ext.hp.com/content/dam/jp-ext-hp-com/jp/ja/ec/lib/products/desktops/spec_pdf/800g4sf_cto.pdf) と同じマザーボードのようです。

## intel AMTの設定方法
BIOS/UEFI セットアップと同様にpc起動時に特定のキーを押下することでAMTのセットアップ画面に入ります。
入り方はPCによって様々ですが HP EliteDesk 800 G5 SFF の場合は電源ON後 [ESC] キー押下でスタートメニューが現れます。ここで[F6]のMEセットアップを選びます。
![2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/3090734a-c120-5e5b-d2ef-51b52500da75.jpeg)

Management Engine BIOS Extension(MEBx)が開きます。
![2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/c9fe8f20-7d01-9344-1846-aafc595ba9cf.jpeg)
MBEx以降はどのメーカーのPCでも設定方法は同じです。<br>

* MEBx Login<br>
vProにアクセスする際のパスワードを入力します。初期パスワードは admin です。
入力すると新しいパスワードの入力になります。
英語キーボード配列状態での入力になります。日本語キーボードで記号を入力する場合は注意してください。
* Intel AMT<br>
[Enabled] にしてください。

* Intel AMT Configuration 以下の設定<br>
  * User Consent<br>
    リモート制御される場合のユーザ同意の設定です。<br>
    検証マシンのヘッドレス運用のためには無効にします。
    * User Opt-in　⇨ NONE
    * Opt-in Configuration from Remote IT ⇨ Disable
  * Network Setup
    * Intel ME Network Name Settings
      * Host Name ⇨ vPro用Hostnameを指定
      * Domain Name ⇨ vPro用domain名を指定
      * Shared/Dedicated FQDN ⇨ Shared
      * Dyanmic DNS Update ⇨ Enabled
    * TCP/IP SETTINGS
      * Wired LAN IPV4 Configuration
        * DHCP Mode ⇨ Disabled
         IPV4 Address 以下を設定します。
![2-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/b49221de-f0ad-541e-025b-e1deeb506c65.jpeg)

    * Activate Network Access ⇨ ここで Enter 押下で ネットワーク設定が有効になり、以降は表示が
    Unconfigure Network Access に変化します。(ネットワーク設定を初期化したい時に押下)
  * Power Control 
    * Intel AMT ON in Host Sleep State <br>
      ホストの電源がOFFでもvPro機能にアクセスできるようにするために以下を指定します。<br> 
       Desktop: ON in S0,ME Wake in S3, S4-S5
  
以上の設定ができたら、[ESC]でMEBxを抜けます。
## まとめと次回予告
ここまででvPro/AMTの最低限の設定ができました。<br>
次回は リモートマシンからvPro対応PCを操作する方法を紹介する予定です。
開発組織と心理的安全性について

# 開発組織と心理的安全性について

エンジニアマネージャー界隈では（私はEMではありませんが）、自律的であったり、アジリティの高い組織を作るにはどうしたらいいのか？
という課題に対して、心理的安全性の確保というのが多くあげられています。多くはGoogleでは心理的安全性を重視していることが挙げられます。

## 心理的安全性を作ると、どんないいことがあるのか？

* 離職率が低い
* メンバーの自律性やモチベーションが高く、評価が高い
* 目標達成率が高い
* 課題へ対しての対応力が高い

などなど、様々なメリットがあります。

## どうやったら心理的安全性を作るのか？

* **1on1を行う。最低限月１回は必要だと思います。**
* **ミスや意見を批判しない。次からは同じミスをしないようにすることが大事。**
* **レトロスペクティブを行い、良かったこと悪かったことを考え、良かったことは褒め、悪かったことは素直に受け止める。**
* **決めつけをせず、多様性を認める。**

などなど、チームの個々人の性格に合わせて、やり方が多少異なることもありますがいずれにしても、他者に対するリスペクトが必要になります。
チームとしての文化として、同じビジョンを共有することも大事なポイントだと思います。


 あるあるですが、エンジニア組織で優秀な人がいて、その人が他の人のコードや設計をボロクソに言って批判したりしますが、そういったチームは雰囲気が悪くなるため、一時的には質があがるかもしれませんが、トータルでは離職率があがったり、一部の人しか発言しなかったりと、必ずしも良いチームになるとは限らないのです。


### 参考になる書籍
* [心理的安全性のつくりかた](https://www.amazon.co.jp/%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%8B%E3%81%9F-%E7%9F%B3%E4%BA%95-%E9%81%BC%E4%BB%8B/dp/4820728245)
人気もあり、わかりやすい本なのでおすすめです。

#### エンジニアマネージャー向け書籍
EMには以下の書籍が参考になるかと思います。

* [エンジニアリングマネージャーのしごと](https://www.oreilly.co.jp/books/9784873119946/)
* [エンジニアのためのマネジメントキャリアパス](https://www.oreilly.co.jp/books/9784873118482/)


### 終わりに
簡単ではありますが、組織づくりというのは非常に難しい仕事だと思いますが、誰かのために働きやすい環境を作るというのは非常に重要な仕事であり、やりがいがある仕事だと自分は思います。
testWithよりdataProviderを使った方が良い場合（アノテーションを使ってPHPUnitのテストをすっきりさせるの補足）

[この記事](https://qiita.com/wantonbe/items/b0e3a1d314118f82e82c)の補足です

テストデータのproviderで`@dateProvider`を使うか`@testWith`のどちらを使うかということですが、データのパターンが複雑な時は`@dataProvider`を使った方が良いと思っています。

こういうテストがあった場合、

```php:DollarTest.php
<?php

use PHPUnit\Framework\TestCase;

class DollarTest extends TestCase
{
    /**
     * @test
     * @testdox equals: 等価であるか判断できる（annotation）
     * @testWith [5, true]
     *           [6, false]
     */
    public function equals_with_annotation($compare, $expect)
    {
        $this->assertSame($expect, (new Dollar(5))->equals(new Dollar($compare)));
    }

    /**
     * @test
     * @testdox equals: 等価であるか判断できる（dataProvider）
     * @dataProvider provider
     */
    public function equals_with_dataprovider($compare, $expect)
    {
        $this->assertSame($expect, (new Dollar(5))->equals(new Dollar($compare)));
    }

    public function provider(): array
    {
        return [
            "$5と$5は等価である"    => [5, true],
            "$6と$5は等価ではない"  => [6, false],
        ];
    }
```
```bash:実行結果
$ ./vendor/bin/phpunit --testdox
PHPUnit 9.5.26 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.1.12
Configuration: /Users/watabe/Documents/training/php-tdd/phpunit.xml

Dollar
 ✔ equals: 等価であるか判断できる（annotation） with data set 0  1 ms
 ✔ equals: 等価であるか判断できる（annotation） with data set 1  4 ms
 ✔ equals: 等価であるか判断できる（dataProvider） with $5と$5は等価である  1 ms
 ✔ equals: 等価であるか判断できる（dataProvider） with $6と$5は等価ではない  1 ms
```

`dataProvider`の場合、ケースを連想配列にしてキーに意図を書くことで、このように実行結果のときにケースの意図まで表示することができます。`testWith` の場合はテストデータにメッセージを含めれば実現はできますが、入力データが多い場合は可読性が下がるので`dataProvider`を使った方が良いと考えています。
【勉強法】理解できないことは箇条書きにして1つずつ押さえていく

今回は、プログラミングを教えていて、ふと気付いたことを書いていきます。

最近はプログラミングを学習するサービスやスクールが増えているので、以前よりは勉強しやすい時代になっています。
しかし、プログラミングをマスターするには、個人の努力が大きく影響してきます。

「プログラミグを勉強することは、良いこと・自分にメリットのあること」と理解しているはずです。
* 「自分には向いてないのでは？」
* 「理解できないことが多い」
実際勉強を始めると、上記のようなことを思い、諦めてしまう人もいます。

つまり、**サービスやスクールが増え、勉強しやすい時代になっても、個々の努力（勉強する力、独学力）も鍛える必要があるわけですね。**
ただ、私が思うに、そもそも勉強方法を知らない人が多いと思いました。

大学受験で志望校に合格できた人と、合格できなかった人の差は、「能力」よりも「試験までの勉強方法」の違いだと思います。（資格試験でも同じです）
なので、私がオススメする**理解が捗る勉強方法**を紹介したいと思います。

## 自分が理解できていないことを把握する

コードが書けない時、プログラミングの文法が理解できない時、**そもそも自分がどの部分を理解できていないか？を把握することが大事です。**

:::note
1. 理解できないポイント
1. なぜ理解できていないか
1. 理解できていない原因の解決
:::

プログラミングを勉強始めた頃は、わからないことばかりです。
だから、**1つずつ確認していきます。**

例えば、HTMLの部分で間違っているか？
それとも、PHPの部分で間違っているか？
はたまた、フレームワーク（LaravelやMVC）についての理解が浅いからなのか？

1つずつ確認していけば、どこが原因か見つけることができるはずです。
プログラミングは、間違ってたらエラーになり、正しければ動くものなので（笑）

最初の最初は、わからない部分ばかりなので、こういう時にメンターがいるといいですね。
**ただ、わからないから質問するだけでなく、どこの部分でエラーになっているか当たりを付けてから質問したほうが自分の習得にも繋がります。**

### わからない部分は箇条書きにする

HTML、PHP、MVCなどなど、わからないことは全て箇条書きにします。
ゲームで言えば、自分がまだクリアしていないステージをマップに書くようなイメージです。

**1度に全ての課題を見ても、モチベーションが下がってしまうのが人間です。**
モチベーションを下げずに、勉強を続ける・できるようになると習得するのが早いと思います。

複数のプログラミング言語を最初から同時に勉強すると挫折しやすいので、1〜2週間はHTMLだけの勉強をする。
次の1~2週間はCSSの勉強だけをする。
など、**集中して勉強する時期を作るのも大事ですね。**

### さいごに

明日から急にプログラミングが上手になる。
なんてことはないです（笑）

毎日、地道にコツコツと勉強していきましょう。
ある程度の期間、勉強をすると、パッと見ただけで分かるようになる時期が来ますよ。
Spring boot　select文

Repositoryでselect文を書きし実行すると、以下のエラーが出ました。

``defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List com.example.demo``

```
@Query(value="select * from userInfo LEFT JOIN bookInfo on userInfo.userId = bookInfo.userId")
````
なんやねん！といろいろ調べると、、、


前提知識として、@Queryとアノテーションをつけてあげるとメソッド命名規則からクエリを定義せず、SQL文を直で書くことができます。
ですが、普通にSQL文を書くだけではうまく読み込んでくれないみたいです。

解決策として、コードに末尾に**nativeQuery = true**を追加してあげるとちゃんと動いてくれました。

```
@Query(value="select * from userInfo LEFT JOIN bookInfo on userInfo.userId = bookInfo.userId", nativeQuery = true)
````

無事解決！
.NET MAUIのYoutube資料について

# はじめに
この記事では.NET MAUIについてYouTubeを通して有用な発信をしているYouTuberについてまとめていきます。

# YouTubeの情報収集の仕方
わざわざ記事に書くことではありませんが、YouTubeには字幕機能と自動字幕翻訳機能があり、両方を組み合わせることで英語のチャンネルでも日本語で簡単に理解することができます。
昔は全然でしたが今はかなりの精度で翻訳がされているように感じます。
私は英語が全くできませんがこの機能のおかげでかなり助かっています。

1.YouTubeの右下のメニューの字幕ボタンをオンにして、設定ボタンをクリック、メニューが出てきたら字幕の項目をクリックします
![字幕.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007605/3a283011-e739-89ff-6095-08ab7a4dfbfa.png)

2.新しいメニューにナビゲーションされるので「自動翻訳」をクリックします
![自動翻訳.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007605/b882f239-5783-b7c4-3d63-0c01eaaef4ad.png)

3.リストから日本語を選択します。漢字で書かれるため一番下の方にあります。便利ですね。
![日本語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007605/fee9dced-eb5c-93c4-0077-419aa2f81e79.png)

4.日本語字幕が表示されます。
![字幕日本語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007605/2aeadd70-a53c-8456-43e5-ae7692d2c1a3.png)


# James Montemagno
Microsoftの社員で.NET MAUIについての情報発信を行っている。
.NET MAUIだけではなくMVVMアーキテクチャや.NETについてのTips動画など広くアップロードしている。
.NET MAUI初心者にはこのリストで勉強していただきたい。(これはJames Montemagnoさんが.NETチャンネルで出している動画になります。)
https://youtube.com/playlist?list=PLdo4fOcmZ0oUBAdL2NwBpDs32zwGqb9DY

チャンネルリンク
https://www.youtube.com/@JamesMontemagno

# Gerald Versluis
Jamesさんが.NET MAUI全体のことについての動画で概念的だったものに対してGeraldさんはよりアプリ開発に対して実践的なアプローチで動画を出しています。
例えば.NET MAUIの優秀なライブラリについての動画をかなりの頻度で出しているため、実際のアプリ開発で役に立つ情報が多いです。

チャンネルリンク
https://www.youtube.com/@jfversluis

# Javier Suárez
UI Challengeだったり.NET MAUIのUI、デザイン関係での動画を数多く出しています。
Figmaに書かれたコントロールから.NET MAUI用のC#のマークアップへ変換するツール(https://github.com/jsuarezruiz/figma-to-maui-graphics) を作っていたりすごい人です。
.NET MAUIのアプリをより洗練されたデザインにしたいならUI Challengeシリーズはためになるでしょう。
https://youtube.com/playlist?list=PLQPLL9Pbjp33gIEmc-JH5rsBiaalJj0wx

チャンネルリンク
https://www.youtube.com/@JavierSuarezRuiz

# その他
詳しくは説明をしませんが、.NET MAUIの情報をYouTubeで発信しているYouTuberはたくさんいます。
Naweed Akram (https://www.youtube.com/@naweedakram)
Daniel Hindrikes (https://www.youtube.com/@DanielHindrikes)
Programming With Chris (https://www.youtube.com/@ProgrammingWithChris)
などなど

# .NET MAUI HighSchool(私)
自己紹介ですが私も.NET MAUI HighSchoolというチャンネルで.NET MAUIについてのことを発信しています。

チャンネルリンク
https://www.youtube.com/@highschool.netmaui1459

# さいごに
.NET MAUIは全世界で愛されており、多数のYouTuberが情報発信を行っています。
YouTubeの字幕機能や翻訳機能を使うことで昔なんかより圧倒的に情報を得ることができるようになりました。
日本だけでなく世界に目を向けて情報をいち早く仕入れ活用していってください。
また、日本で.NET MAUIで活動しているYouTuberは私だけなので、暇な時で良いので自分の作ったプログラムの説明や実装方法など世界に向けて発信していくと、コミュニティが活性化し、よりよいフレームワークへ成熟していきます。
for文、while文を使って演習（ユークリッド互除法）

# 問題
 入力値１と入力値２の最大公約数を表すための文字列を返却して出力してください。

```java
public static void main(String[] args) {
	System.out.println(euclideanAlgorithm(252,105));
}
		
public static String euclideanAlgorithm(int num1, int num2) {
		System.out.println("入力値1 : " + num1);
		System.out.println("入力値２ : " + num2);

		int a = 0;//二値交換のための退避領域
		if ((num1 < num2) || (num2 == 0)) {
			a = num1;
			num1 = num2;
			num2 = a;
		}
        //※
		for (int i = 1; i != 0; ) {
			i = num1 % num2;
			num1 = num2;
			num2 = i;
		}
		return "最大公約数 : " + num1;
}

//演算結果
//入力値1 : 252
//入力値２ : 105
//最大公約数 : 21

```
# 補足
- 入力値の大小関係やゼロ除算のケアをif文で行った。
- ２つの値を同時に入れ替えることができないので、一旦退避するための変数aを用意。（二値交換）
- 継続する条件を先に書く。（前判定）
→今回はカウンタのインクリメント処理を書かないものだった。（それでも動くのね！）


### 上記ソースコードの※以降while文にしたもの↓
```java
        int i = 1;
		while (i != 0) {
			i = num1 % num2;
			num1 = num2;
			num2 = i;
		}	
		return "最大公約数 : " + num1;
//演算結果
//入力値1 : 252
//入力値２ : 105
//最大公約数 : 21

```
# 補足２
- for文同様、継続する条件を先に書く。（前判定）
- ループカウンタのインクリメント処理は最後に書くので特に注意！
→講師の方曰く、無限のループは冗談抜きでマズいとのこと。（あえて無限ループをさせる処理もあるらしいが）
- while文の場合、カウンタの変数をブロックの外で定義する必要がある。
→つまり既に定義されている変数を継続条件に使用する際にwhile文を使うことが多らしい。
IDMCで実現するハイパーオートメーション

この記事は インフォマティカ [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/informatica) Day 5 の記事として書かれています。
# はじめに
DX推進の一環として業務全体を一気通貫で自動化するハイパーオートメーションをお聞きしたことはあると思います。本記事では、Informatica Intelligent Data Management Cloud (IDMC) で実現するハイパーオートメーションについてお届けします。
# ハイパーオートメーションとは
ガートナー社は、ハイパーオートメーションを以下のように定義しています。
>ハイパーオートメーションとは、組織ができる限り多くのビジネス・プロセスとITプロセスを迅速に特定して検証し、自動化するために用いられるビジネス主導の規律あるアプローチである。ハイパーオートメーションを実現するには、機械学習やAI、RPAなど複数のテクノロジ、ツール、またはプラットフォームを協調させる。

IT主導ではなく、ビジネス主導なのがポイントです。
ビジネスプロセスを描けるのはビジネスユーザだけですよね。IT部門では、部門を横断したビジネスプロセスを描くことはできません。業務を熟知しているビジネスユーザがMicrosoftのExcelやVisioを使って描くことができますが、描いただけでは動きません。そのビジネスプロセスをどのようにIT化して自動化するのかが肝になります。
RPAは1つの解決策になりますが、UIがメインなので限られたビジネスプロセスのみの自動化となります。
できる限り多くのビジネスプロセスを自動化するために、下記スライドにあるイベント主導型アーキテクチャ、iPaaS、AI/機械学習、BPM/iBPMSとローコード・ノーコードのツールやパッケージ・ソフトウェア、その他の自動化ツールといった複数のテクノロジーをビジネスニーズ・目標に合わせて適用しハイパーオートメーションを実現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/aecc957b-ec13-6043-57a8-8c6ad1a22477.png)
# ハイパーオートメーションの考慮事項
* データ品質
綺麗なデータでないと完全に自動化できなかったり、自動化できても不良な結果が出力されることになります。
* APIを使用したアプリケーション統合
先述したように、RPAでは画面の自動化はできても、高度な業務プロセスの構築は難しいところがあります。そこで、APIを活用しアプリケーションから別のアプリケーションへ内部的に連携して高度な業務プロセスの自動化を実現します。
また、ビジネスプロセスを熟知しているビジネスユーザ自身がAPIを開発可能なローコード・ノーコードのツールであることも重要です。
# アプリケーション統合に関するAPIのユースケース
アプリケーション統合に関しては、下記3種類のAPIのユースケースが挙げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/44845fd1-6023-58f2-ab74-3e0911668423.png)
1. データAPI
オンプレミスのERPやデータベースに存在するデータをAPIを介してクラウド・モバイルなどの各アプリケーションに共有できるようにします。
2. プロセスAPI
複数のアプリケーションにまたがるビジネスプロセスを統合し、手動で行っていた作業を自動化します。上記スライドでは、新しく社員が入社した際の受け入れプロセスが例として挙げられています。
3. イベントAPI
アプリケーションから送信されるデータイベントとKafkaやJMSなどのメッセージングを使いリアルタイムのアプリケーション間でのデータ交換を可能にします。
# ハイパーオートメーション実現に向けたポイント
* 上記のデータAPIを使いデータを取得する場合、ソースとなる各システムへ接続する必要があります。IDMCは、クラウドプラットフォーム、SaaSアプリケーション、従来のオンプレミスのシステムを含む豊富なコネクタを用意しています。そのため、ユーザはシステム間連携のコーディングに手間をかけることなく対象システムへ接続することができます。
* プロセスAPIで述べたビジネスプロセスの統合とユーザプロセスの自動化をする場合、IT部門でないビジネスユーザがIDMCのノーコード・ローコードのツールを使用し、簡単にセルフサービスでプロセスを構築・統合できます。
* IDMCは、構築したプロセス、特にイベントAPIで連携したプロセスについても効率的に監視・管理することができます。そして、ワークロードの変動に対応するために容易にスケールアップ、スケールダウンできる柔軟性があり、セキュアなAPIで脆弱性リスクに対応します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/e53f57fb-4b4a-86aa-ebbc-e9a016ee8c6b.png)
# DX推進を支えるプラットフォーム
IDMCは、必要なデータを発見し、あらゆるシステムのデータを繋げ、データを綺麗にすることにより信頼性を確保し、システムや業務を超えて関連付けた横串分析や、誰もが簡単かつ安全にデータが扱われるよう統制を可能にするデータマネージメントプラットフォームです。
各クラウドサービスは、「あらゆるユーザー」が「あらゆるデータ」をプログラミング不要の「ローコード・ノーコード」で簡単にご利用になれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/a3ad0e05-6236-07b9-505c-4b384e126564.png)
IDMCは本記事でお伝えした自動化に関するAPIとアプリケーション統合やデータ品質の他、データ統合と連携することで、データ品質を担保したビジネス・プロセスの自動化、つまり、ハイパーオートメーションの実現に活用することができます。
# おわりに
アプリケーション統合の機能で分岐や並列処理といった複雑なプロセスの自動化からデータ統合との連携まで包括的に行うことができるIDMCを皆様のDX推進にご活用いただければ幸いです。