Elixir: Redis のデータを更新 (Update)

こちらと同様のことを行いました。
[Elixir: Redis のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/3f5c2634c30e84508fa1)
[Elixir: Redis のデータを読む (Read)](https://qiita.com/ekzemplaro/items/88165dae94ecae891845)

## Python のプログラム

```py:redis_update.py
#! /usr/bin/python
#
#	redis_update.py
#
#					Mar/10/2024
#
import	sys
import	string
import	json
#
import	datetime
import	redis
#
# ------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
key_in = sys.argv[1]
population_in = int(sys.argv[2])
print("%s\t%d" % (key_in, population_in))
#
rr = redis.Redis(host='localhost', port=6379, db=0)
#
str_json = rr.get(key_in).decode ()
unit_aa = json.loads(str_json)
now = datetime.datetime.now()
unit_aa['population'] = population_in
unit_aa['date_mod'] =  '%s' % now
json_str = json.dumps(unit_aa)
rr.set(key_in, json_str)
#
sys.stderr.write("*** 終了 ***\n")
#
# ------------------------------------------------------------
```

実行例

```bash
./redis_update.py t1854 781253400
```

## ChatGPT が作成したプログラム

```exs:redis_update.ex
defmodule RedisUpdate do
  def main([key_in, population_in]) do
    IO.puts("*** 開始 ***")

    rr = Redix.start_link()

    str_json = Redix.command!(rr, [:cmd, ["get", key_in]])
               |> elem(1)
               |> Base.decode16!()
               |> IO.iodata_to_binary()

    unit_aa = Jason.decode!(str_json)
    now = :os.system_time(:millisecond)
           |> :calendar.now_to_universal_time()
           |> elem(0)
           |> :calendar.universal_time_to_local_time()
           |> elem(0)
           |> DateTime.from_unix!(:second)

    unit_aa = Map.put(unit_aa, "population", String.to_integer(population_in))
    unit_aa = Map.put(unit_aa, "date_mod", to_string(now))

    json_str = Jason.encode!(unit_aa)
    Redix.command!(rr, [:cmd, ["set", key_in, json_str]])

    IO.puts("*** 終了 ***")
  end
end

args = System.argv()
RedisUpdate.main(args)
```

## Gemini が作成したプログラム

```exs:redis_update.ex
defmodule RedisUpdate do
  def main(args) do
    # 引数の取得
    key_in = args |> Enum.at(1)
    population_in = String.to_integer(args |> Enum.at(2))

    # 標準出力への書き込み
    IO.puts "#{key_in}\t#{population_in}"

    # Redis への接続
    rr = Redis.new(host: "localhost", port: 6379, db: 0)

    # キーから値の取得
    str_json = rr.get(key_in) |> to_string()

    # JSON のデコード
    unit_aa = Jason.decode(str_json)

    # 現在時刻の取得
    now = DateTime.utc_now()

    # データの更新
    unit_aa["population"] = population_in
    unit_aa["date_mod"] = "#{now}"

    # JSON のエンコード
    json_str = Jason.encode(unit_aa)

    # Redis への設定
    rr.set(key_in, json_str)

    # 標準エラー出力への書き込み
    IO.stderr.write("*** 終了 ***\n")
  end
end

# 実行
RedisUpdate.main(System.argv())
```

## 私が作成したプログラム

プロジェクトの作成

```bash
mix new redis_update
```

```exs:lib/redis_update.ex
defmodule RedisUpdate do
  @moduledoc """
  Documentation for `RedisUpdate`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> RedisUpdate.hello()
      :world

  """
  def hello do
    :world
  end

  def main do
    IO.puts "*** 開始 ***"
    [id,population] = System.argv()
    IO.puts id
    IO.puts population
    IO.puts "*** aaa ***"
    {:ok, conn} = Redix.start_link(host: "localhost", port: 6379)
    {:ok, str_json} = Redix.command(conn, ["GET", id])
    IO.puts str_json
    unit_aa = Jason.decode!(str_json)
    IO.inspect unit_aa
    updated_date_mod = to_string(Date.utc_today())
    IO.puts to_string(updated_date_mod)
    unit_new = %{"date_mod" => updated_date_mod, "name" => "敦賀", "population" => String.to_integer(population)}
    IO.inspect unit_new
    str_json_new = Jason.encode!(unit_new)
    IO.puts str_json_new
    Redix.command(conn, ["SET", id, str_json_new])
    IO.puts "*** 終了 ***"
  end
end
```

```exs:mix.exs
（省略）
	{:redix, "~> 1.4"},
	{:jason, "~> 1.4"},
（省略）
```

実行結果

```text
$ mix run -e RedisUpdate.main t1852 325600
*** 開始 ***
t1852
325600
*** aaa ***
{"date_mod":"2003-5-10","name":"敦賀","population":41295}
%{"date_mod" => "2003-5-10", "name" => "敦賀", "population" => 41295}
2024-03-10
%{"date_mod" => "2024-03-10", "name" => "敦賀", "population" => 325600}
{"date_mod":"2024-03-10","name":"敦賀","population":325600}
*** 終了 ***
```