OmniAICreator/Qiita-1.07M huggingface dataset:
簡単Elixirシリーズ ~ プロセスを知ろう② ~

# 簡単Elixirシリーズ
## ~ プロセスを知ろう② ~

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」21日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、プロセスについて公式ドキュメントを見ながらサクッと解説の第２段です。

さて、前回の記事の続きものです、ちなみに前回の記事はこちらです。

https://qiita.com/Yoosuke/items/0b50f9537fa1e30eb41d

今回は、Elixirのプロセスをさらに知る為に、例と共にさらに理解を深めていきたいと思います。

まずは、```call```に文字列を出力する無銘関数を作成。 そこに ```self()```関数で自分のプロセスIDを出力するようにします。
　```spawn(call)```でcallを呼び出しプロセスを生み出します。生み出されたプロセスは、呼ばれた関数を実行します。
実行が終わったら、このプロセスは終了します。
ここでは、```pid```に生み出されたプロセスIDを束縛しておき、その後 ```Process.alive?(pid)```でこのプロセスが生きてるか確認しています。
当然、実行後すぐにプロセスが終了しているので、```false```が返ってきます。

```elixir
iex()> call = fn -> IO.puts "process id is #{inspect(self())}." end
#Function<45.65746770/0 in :erl_eval.expr/5>
iex()> pid = spawn(call)
process id is #PID<0.112.0>.
#PID<0.112.0>
Process.alive?(pid)
false
```

プロセスのライフサイクルが何となく理解できたでしょうか？
次は、メッセージ機能について例えを利用して見ていきます。

```elixir
defmodule MyProcess do
  def await_receive_msg(x, y) do
    IO.puts "プロセス #{inspect(self())}, メッセージ待ち中"
    receive do
      "Go" -> IO.puts "x + y = #{x + y}"
      "Quit" -> IO.puts "計算をやめます。"
      _ -> IO.puts "なんか別のメッセージが送られてきました"
    end
    IO.puts "プロセス #{inspect(self())} は実行し終えたので終了します。"
  end
end
```
例えば、こんな関数を書いておきます。

実行時には```spwan()```を利用して、PIDを取得し、 PID毎に ```send(pid, "Quit"}```などとして
メッセージを送って関数の実行をしているのが見えます。 

```elixir
iex(1)> pid = spawn(MyProcess, :await_receive_msg, [2, 1]) 
#PID<0.111.0>
プロセス #PID<0.111.0>, メッセージ待ち中
iex(2)> pid2 = spawn(MyProcess, :await_receive_msg, [3, 4])
プロセス #PID<0.113.0>, メッセージ待ち中
#PID<0.113.0>
iex(3)> Process.alive? pid                                 
true
iex(4)> Process.alive? pid2
true
iex(5)> send(pid, "Quit")                                  
計算をやめます。
プロセス #PID<0.111.0> は実行し終えたので終了します。
"Quit"
iex(6)> Process.alive? pid 
false
iex(7)> Process.alive? pid2
true
iex(8)> send(pid2, "Go")   
"Go"
7       
プロセス #PID<0.113.0> は実行し終えたので終了します。
iex(9)> Process.alive? pid2
false
```

このコードをさらに改良して、実行後にまた自分自身を呼び出すように書き換えて見ます。

```elixir
defmodule MyProcess do
  def await_receive_msg() do
    IO.puts "プロセス #{inspect(self())}, メッセージ待ち中"
    receive do
      {x, y} -> IO.puts "x + y = #{x + y}"
                await_receive_msg()
      "Quit" -> IO.puts "計算をやめます。"
                await_receive_msg()
      _ -> IO.puts "なんか別のメッセージが送られてきました"
                await_receive_msg()
    end
  end
end
```

実行してみます。 計算の引数を msg として受けつけるように変更した事に注意してください。

```elixir
iex()> pid = spawn(MyProcess, :await_receive_msg, [])      
プロセス #PID<0.140.0>, メッセージ待ち中
#PID<0.140.0>
iex(16)> send(pid, "Quit")                             
計算をやめます。
プロセス #PID<0.140.0>, メッセージ待ち中
"Quit"
iex()> send(pid, {1, 3})
x + y = 4
{1, 3}
プロセス #PID<0.140.0>, メッセージ待ち中
iex()> send(pid, [1,2]) 
なんか別のメッセージが送られてきました
[1, 2]
プロセス #PID<0.140.0>, メッセージ待ち中
```

プロセスが終了せずに状態まちをするようになりました。

さて、ここまで来ると、状態を保持する例も見て見たくなりますね。が、長くなるので、それは 第３段にまとめていきたいと思います。


https://qiita.com/Yoosuke/items/0f02f8e71dcdd5e8a7b8
Power Automate for Desktop で frame, iframe 越しのページの要素がセレクトできない場合の対処法

Power Automate for Desktop の標準のセレクタ（Webページ上の要素にフォーカスする系など）だと、frame や iframe 越しのページ(frame) 内の要素（ボタンやフォームなど）がうまくセレクトできないことがあります。

その場合は、Javascript で強引にセレクトすればうまくいきます。
以下は、3つ目の frame 内にあるエレメント（要素）の name が TextInput という名前にマッチするの要素にセレクトして、フォーカスする例です。
frame 越しの場合は、contentWindow.document.getElementsXXXXX でエレメントを取得するところがポイントです。iframe の場合は frame -> iframe に書き換えれば同様に対応することができます。

```javascript
function ExecuteScript() {​​​​​
// エレメントにフォーカス
  elements = document.getElementsByTagName('frame')[2].contentWindow.document.getElementsByName("TextInput");
  elements[0].focus();
  return elements[0].outerHTML
}​​​​​
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/7ed1941a-7e15-c3b4-a69f-1e8ac3d50a6d.png)


そもそも FRAMEタグ は廃止された仕様なので、Webサイトで使うのをやめてほしいのですが。。。
Amazon Aurora MySQLのWell-Architected基本構成を確認してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/a0871603-2d5f-7a54-45d7-a77921454884.png)

前提として、SQLコマンドの基本を理解しておく必要がありますので、
最初に、その説明をさせて頂こうと思います。

今回は、次の流れでご説明致します。
◇◇◇◇◇◇◇◇◇◇◇
1.SQLの文とその種類について、ご説明致します。

2.Aurora MySQLのプライマリ、セカンダリの基本構成を組んだ時、
アプリケーションからどのようにアクセスして、どんなSQL文を実行してるかを説明致します。
◇◇◇◇◇◇◇◇◇◇◇

1.SQLの文とその種類

◆DML
Data Manipulation Languageの略称です。データを操作するSQL操作言語(文)です。

◆INSERT文
データベースのテーブルにレコードを登録する

◆UPDATE文
データベースのテーブルにレコードを更新する

◆DELETE文
データベースのテーブルにレコードを削除する

◆SELECT文
データベースのテーブルからレコードを抽出します

このうち、SELECT文は、作成や更新処理ではなく、読み込みのみで済みます。
そのため、プライマリの書き込みが出来るデータベースを利用する必要は、ありません。
セカンダリのリードレプリカへの読み込みが出来れば、十分です。

次のような構成の場合、リードレプリカを「Well-Architected」するためには、工夫が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/90ce9536-f128-a4c7-304c-d7bab0c36f22.png)

AWS Aurora MySQLでは、工夫すると、このような事が出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/510057fc-9413-fcd8-cd9e-4a8cd15ac20b.png)

必要なサーバが必要な役割を果たし、負荷分散が可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/47227744-4453-305b-65a3-5b8a0745230b.png)
ですね。

どのような設定を行うかというと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/45630581-e273-e4f8-062d-679752c06f39.png)


リードレプリカの設定で、オートスケーリングを追加します。

機会があれば、やってみて下さい。