<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Angel's Blog</title>
		<link>https://angelcool.net/sphpblog/blog_index.php</link>
		<description><![CDATA[No Footer]]></description>
		<copyright>Copyright 2026, Angel</copyright>
		<managingEditor>Angel</managingEditor>
		<language>en-US</language>
		<generator>SPHPBLOG 0.7.0</generator>
		<item>
			<title>Elixir: Making Concurrent API Calls</title>
			<link>https://angelcool.net/sphpblog/blog_index.php?entry=entry240413-024712</link>
			<description><![CDATA[<pre>angelcool@fedora-laptop$<br />angelcool@fedora-laptop$date<br />Fri Apr 12 07:51:16 PM PDT 2024<br />angelcool@fedora-laptop$ls lib/<br />coolprogram.ex  coordinator.ex  worker.ex<br />angelcool@fedora-laptop$cat lib/coolprogram.ex <br />defmodule CoolProgram do<br />  def temperature_of(cities) do<br />    coordinator_pid = spawn(CoolProgram.Coordinator, :loop, [[], Enum.count(cities)])<br />    cities |&gt; Enum.each(fn city -&gt;<br />        worker_pid = spawn(CoolProgram.Worker, :loop, [])<br />        send(worker_pid, {coordinator_pid, city})<br />    end)<br />  end<br />end<br />angelcool@fedora-laptop$cat lib/coordinator.ex <br />defmodule CoolProgram.Coordinator do<br /><br />  def loop(results \\ [], results_expected) do<br />    receive do<br />      {:ok, result} -&gt;<br />        new_results = [result|results]<br />        if results_expected == Enum.count(new_results) do<br />          send(self(), :exit)<br />        end<br />        loop(new_results, results_expected)<br />      :exit -&gt;<br />          IO.puts(results |&gt; Enum.sort |&gt; Enum.join(&quot;, &quot;))<br />        _-&gt;<br />          loop(results, results_expected)<br />    end<br />  end<br /><br />end<br />angelcool@fedora-laptop$cat lib/worker.ex <br />defmodule CoolProgram.Worker do<br /><br />  def temperature_of(location) do<br />    result = url_for(location)<br />      |&gt; HTTPoison.get<br />      |&gt; parse_response<br />    case result do<br />      {:ok, temp} -&gt;<br />        &quot;#{location}: #{temp}° C&quot;<br />      :error -&gt;<br />        &quot;#{location} not found&quot;<br />    end<br />  end<br /><br />  defp url_for(location) do<br />    location = URI.encode(location)<br />    &quot;http://api.openweathermap.org/data/2.5/weather?q=#{location}&amp;appid=#{apikey()}&quot;<br />  end<br /><br />  defp parse_response({:ok, %HTTPoison.Response{body: body, status_code: 200}}) do<br />    body<br />      |&gt; JSON.decode!<br />      |&gt; compute_temperature()<br />  end<br /><br />  defp parse_response(_) do<br />    :error<br />  end<br /><br />  defp compute_temperature(json) do<br />    try do<br />      temp = (json[&quot;main&quot;][&quot;temp&quot;]-273.15)<br />        |&gt; Float.round(1)<br />      {:ok, temp}<br />    rescue<br />      _-&gt; :error<br />    end<br />  end<br /><br />  defp apikey do<br />    &quot;XXXXXXXXXXXXXXXXXXXXXXXXXXXX&quot;<br />  end<br /><br />  def loop do<br />    receive do<br />      {sender_pid, location}-&gt;<br />        send(sender_pid, {:ok, temperature_of(location)})<br />      _-&gt;<br />        IO.puts &quot;don&#039;t know how to process this message&quot;<br />    end<br />    loop()<br />  end<br />end<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$iex --version<br />IEx 1.15.7 (compiled with Erlang/OTP 26)<br />angelcool@fedora-laptop$iex -S mix<br />Compiling 1 file (.ex)<br />Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]<br /><br />Interactive Elixir (1.15.7) - press Ctrl+C to exit (type h() ENTER for help)<br />iex(1)&gt; cities=[&quot;San Diego&quot;, &quot;Merida&quot;, &quot;Singapore&quot;, &quot;Los Angeles&quot;, &quot;Mexico City&quot;, &quot;Miami&quot;, &quot;Temecula&quot;, &quot;Buenos Aires&quot;, &quot;Ojai&quot; ]<br />[&quot;San Diego&quot;, &quot;Merida&quot;, &quot;Singapore&quot;, &quot;Los Angeles&quot;, &quot;Mexico City&quot;, &quot;Miami&quot;,<br /> &quot;Temecula&quot;, &quot;Buenos Aires&quot;, &quot;Ojai&quot;]<br />iex(2)&gt; CoolProgram.temperature_of(cities)<br />:ok<br />Buenos Aires: 17.0° C, Los Angeles: 14.7° C, Merida: 25.0° C, Mexico City: 22.8° C, Miami: 22.0° C, Ojai: 14.2° C, San Diego: 15.2° C, Singapore: 30.8° C, Temecula: 13.1° C<br />iex(3)&gt;<br /></pre>]]></description>
			<category>- Elixir Notes</category>
			<guid isPermaLink="true">https://angelcool.net/sphpblog/blog_index.php?entry=entry240413-024712</guid>
			<author>Angel</author>
			<pubDate>Sat, 13 Apr 2024 02:47:12 GMT</pubDate>
		</item>
		<item>
			<title>Elixir: Miscellaneous Notes</title>
			<link>https://angelcool.net/sphpblog/blog_index.php?entry=entry240412-190002</link>
			<description><![CDATA[<pre># Filtering files in a directory by filename<br />angelcool@fedora-laptop$date<br />Fri Apr 12 12:02:42 PM PDT 2024<br />angelcool@fedora-laptop$iex<br />...<br />iex(90)&gt; &quot;/home/angelcool/Downloads&quot; \<br />...(90)&gt; |&gt; Path.join(&quot;**/*.rpm&quot;) \<br />...(90)&gt; |&gt; Path.wildcard \<br />...(90)&gt; |&gt; Enum.filter(fn fname -&gt; String.contains?(Path.basename(fname),&quot;dbeaver&quot;) end)<br />[&quot;/home/angelcool/Downloads/dbeaver-ce-24.0.2-stable.x86_64.rpm&quot;]</pre><br /><br /><pre># Making an HTTP GET request<br />iex(18)&gt; :inets.start()<br />:ok<br />iex(19)&gt; :ssl.start()<br />:ok<br />iex(20)&gt; :httpc.request(:get, {&#039;https://www.angelcool.net&#039;, []}, [ssl: :httpc.ssl_verify_host_options(true)], [])<br />...<br /></pre>]]></description>
			<category>- Elixir Notes</category>
			<guid isPermaLink="true">https://angelcool.net/sphpblog/blog_index.php?entry=entry240412-190002</guid>
			<author>Angel</author>
			<pubDate>Fri, 12 Apr 2024 19:00:02 GMT</pubDate>
		</item>
		<item>
			<title>Elixir: Clustering Elixir Nodes - Updating Shared State.</title>
			<link>https://angelcool.net/sphpblog/blog_index.php?entry=entry240406-184727</link>
			<description><![CDATA[<pre><br />angelcool@fedora-laptop$ # Let&#039;s get the date and versions used<br />angelcool@fedora-laptop$date<br />Sat Apr  6 11:51:08 AM PDT 2024<br />angelcool@fedora-laptop$iex --version<br />IEx 1.15.7 (compiled with Erlang/OTP 26)<br />angelcool@fedora-laptop$mix --version<br />Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]<br /><br />Mix 1.15.7 (compiled with Erlang/OTP 26)<br />angelcool@fedora-laptop$mix phx.new --version<br />Phoenix installer v1.7.11<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$ # The gist of this post...<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$ # Terminal 1<br />angelcool@fedora-laptop$ iex --name a@127.0.0.1<br />iex(a@127.0.0.1)1&gt;<br /><br />angelcool@fedora-laptop$ #Terminal 2<br />angelcool@fedora-laptop$ iex --name b@127.0.0.1<br />Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]<br /><br />Interactive Elixir (1.15.7) - press Ctrl+C to exit (type h() ENTER for help)<br />iex(b@127.0.0.1)1&gt; Node.connect :&quot;a@127.0.0.1&quot;<br />true<br />iex(b@127.0.0.1)2&gt; Node.list<br />[:&quot;a@127.0.0.1&quot;]<br />iex(b@127.0.0.1)3&gt;<br /><br /># Terminal 1<br />iex(a@127.0.0.1)&gt; Agent.start(<br />  fn -&gt; %{hello: &quot;world&quot;} end, <br />  name: {:global, GlobalAgent}<br />)<br />{:ok, #PID&lt;0.116.0&gt;} <br /><br /># Terminal 2<br />iex(b@127.0.0.1)4&gt; Agent.get {:global,GlobalAgent}, &amp;(&amp;1)<br />%{hello: &quot;world&quot;}<br /><br /># Terminal 2 - Update state<br />iex(b@127.0.0.1)5&gt; Agent.update {:global, GlobalAgent}, fn _ -&gt; %{hello: &quot;everyone!&quot;}  end<br />:ok<br />iex(b@127.0.0.1)6&gt;<br /><br /># Terminal 2 - Get new state<br />iex(b@127.0.0.1)6&gt; Agent.get {:global,GlobalAgent}, &amp;(&amp;1)<br />%{hello: &quot;everyone!&quot;}<br /><br /># Terminal 1 - Get new state<br />iex(a@127.0.0.1)2&gt; Agent.get {:global,GlobalAgent}, &amp;(&amp;1)<br />%{hello: &quot;everyone!&quot;}</pre>]]></description>
			<category>- Elixir Notes</category>
			<guid isPermaLink="true">https://angelcool.net/sphpblog/blog_index.php?entry=entry240406-184727</guid>
			<author>Angel</author>
			<pubDate>Sat, 06 Apr 2024 18:47:27 GMT</pubDate>
		</item>
		<item>
			<title>Elixir: Processes Talking Amongst Themselves</title>
			<link>https://angelcool.net/sphpblog/blog_index.php?entry=entry240402-184103</link>
			<description><![CDATA[<pre>angelcool@fedora-laptop$date<br />Tue Apr  2 11:31:57 AM PDT 2024<br />angelcool@fedora-laptop$mix new process-demo --app process_a<br />* creating README.md<br />* creating .formatter.exs<br />* creating .gitignore<br />* creating mix.exs<br />* creating lib<br />* creating lib/process_a.ex<br />* creating test<br />* creating test/test_helper.exs<br />* creating test/process_a_test.exs<br /><br />Your Mix project was created successfully.<br />You can use &quot;mix&quot; to compile it, test it, and more:<br /><br />    cd process-demo<br />    mix test<br /><br />Run &quot;mix help&quot; for more commands.<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$cd process-demo/<br />angelcool@fedora-laptop$ls -l<br />total 8<br />drwxr-xr-x. 1 angelcool angelcool  24 Apr  2 11:31 lib<br />-rw-r--r--. 1 angelcool angelcool 575 Apr  2 11:31 mix.exs<br />-rw-r--r--. 1 angelcool angelcool 476 Apr  2 11:31 README.md<br />drwxr-xr-x. 1 angelcool angelcool  66 Apr  2 11:31 test<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$cat lib/process_a.ex <br />defmodule ProcessA do<br />  def receiverA(count) do<br />    receive do<br />      {from, message} -&gt; send(from, {&quot;Greetings from ProcessA!.&quot;, message})<br />      receiverA(count+1)<br />    end<br />  end<br />end<br />angelcool@fedora-laptop$cat lib/process_b.ex <br />defmodule ProcessB do<br />  def initialize do<br />    pid_A = spawn(ProcessA, :receiverA, [1])<br />    recieverB(pid_A)<br />  end<br /><br />  def recieverB(pid_A) do<br />    receive do<br />      {message} -&gt;<br />        send(pid_A, {self(), message})<br />        recieverB(pid_A)<br />      {response, originalmessage} -&gt;<br />        IO.puts(&quot;Response: #{response}&quot;)<br />        IO.puts(&quot;Original Message: #{originalmessage}&quot;)<br />        recieverB(pid_A)<br />    end<br />  end<br />end<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$iex --version<br />IEx 1.15.7 (compiled with Erlang/OTP 26)<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$mix phx.new --version<br />Phoenix installer v1.7.11<br />angelcool@fedora-laptop$<br />angelcool@fedora-laptop$iex -S mix<br />Compiling 2 files (.ex)<br />Generated process_a app<br />Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]<br /><br />Interactive Elixir (1.15.7) - press Ctrl+C to exit (type h() ENTER for help)<br />iex(1)&gt; pid_B = spawn(ProcessB, :initialize, [])<br />#PID&lt;0.166.0&gt;<br />iex(2)&gt; send(pid_B, {&quot;Hi! This is a message from process B!&quot;})<br />Response: Greetings from ProcessA!.<br />{&quot;Hi! This is a message from process B!&quot;}<br />Original Message: Hi! This is a message from process B!<br />iex(3)&gt; </pre>]]></description>
			<category>- Elixir Notes</category>
			<guid isPermaLink="true">https://angelcool.net/sphpblog/blog_index.php?entry=entry240402-184103</guid>
			<author>Angel</author>
			<pubDate>Tue, 02 Apr 2024 18:41:03 GMT</pubDate>
		</item>
	</channel>
</rss>
