<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Yongchang He</title>
    <description>The latest articles on Forem by Yongchang He (@yongchanghe).</description>
    <link>https://forem.com/yongchanghe</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F722119%2F7814e7cc-6467-4054-9f2c-6c64c9b40dd3.png</url>
      <title>Forem: Yongchang He</title>
      <link>https://forem.com/yongchanghe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/yongchanghe"/>
    <language>en</language>
    <item>
      <title>Multiple developers work simultaneously using their own branch on git</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Sun, 20 Nov 2022 00:00:07 +0000</pubDate>
      <link>https://forem.com/yongchanghe/multiple-developers-work-simultaneously-using-their-own-branch-on-git-4c8c</link>
      <guid>https://forem.com/yongchanghe/multiple-developers-work-simultaneously-using-their-own-branch-on-git-4c8c</guid>
      <description>&lt;h4&gt;
  
  
  1. Create a new branch:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;checkout&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="nx"&gt;yong&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;members&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switched to a new branch 'yong-active-members-dev'&lt;br&gt;
yongchanghe@MacBookPro 868_class_project_civitas_practice_repo % git push origin yong-active-members-dev &lt;br&gt;
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0&lt;br&gt;
remote: &lt;br&gt;
remote: Create a pull request for 'yong-active-members-dev' on GitHub by visiting:&lt;br&gt;
remote:      &lt;a href="https://github.com/hyc0812/868_class_project_civitas_practice_repo/pull/new/yong-active-members-dev"&gt;https://github.com/hyc0812/868_class_project_civitas_practice_repo/pull/new/yong-active-members-dev&lt;/a&gt;&lt;br&gt;
remote: &lt;br&gt;
To &lt;a href="https://github.com/hyc0812/868_class_project_civitas_practice_repo.git"&gt;https://github.com/hyc0812/868_class_project_civitas_practice_repo.git&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[new branch]      yong-active-members-dev -&amp;gt; yong-active-members-dev&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Check Which branch is currently used:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;branch&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;master&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;yong-active-members-dev
remotes/origin/HEAD -&amp;gt; origin/master
remotes/origin/master
remotes/origin/yong-active-members-dev&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Develop the new branch and commit the changes
&lt;/h4&gt;

&lt;h4&gt;
  
  
  4. When complete, go back to master branch
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;checkout&lt;/span&gt; &lt;span class="nx"&gt;master&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switched to branch 'master'&lt;br&gt;
Your branch is up to date with 'origin/master'.&lt;br&gt;
yongchanghe@MacBookPro 868_class_project_civitas_practice_repo % git pull origin master &lt;br&gt;
From &lt;a href="https://github.com/hyc0812/868_class_project_civitas_practice_repo"&gt;https://github.com/hyc0812/868_class_project_civitas_practice_repo&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;branch            master     -&amp;gt; FETCH_HEAD
Already up to date.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Merge your branch to master
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;merge&lt;/span&gt; &lt;span class="nx"&gt;yong&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;members&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Updating 98f2681..4fdc41c&lt;br&gt;
Fast-forward&lt;br&gt;
 src/app/demo/dashboard/active-members/active-members.component.html | 1 +&lt;br&gt;
 1 file changed, 1 insertion(+)&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Push to master branch
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;push&lt;/span&gt; &lt;span class="nx"&gt;origin&lt;/span&gt; &lt;span class="nx"&gt;master&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total 0 (delta 0), reused 0 (delta 0), pack-reused 0&lt;br&gt;
To &lt;a href="https://github.com/hyc0812/868_class_project_civitas_practice_repo.git"&gt;https://github.com/hyc0812/868_class_project_civitas_practice_repo.git&lt;/a&gt;&lt;br&gt;
98f2681..4fdc41c  master -&amp;gt; master&lt;br&gt;
yongchanghe@MacBookPro 868_class_project_civitas_practice_repo % &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Parse RTCM 3.x correction data from serial input</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Tue, 20 Sep 2022 21:20:25 +0000</pubDate>
      <link>https://forem.com/yongchanghe/parse-rtcm-3x-correction-data-from-serial-input-1810</link>
      <guid>https://forem.com/yongchanghe/parse-rtcm-3x-correction-data-from-serial-input-1810</guid>
      <description>&lt;p&gt;This article illustrates how to parse the RTCM 3.x correction data from serial port input of your GPS base station module.&lt;/p&gt;

&lt;h4&gt;
  
  
  Prerequisites
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Have RTCM 3.x correction data streamed correctly from some serial port of your GPS module&lt;/li&gt;
&lt;li&gt;Have python3 and pip3 installed&lt;/li&gt;
&lt;li&gt;CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Getting started
&lt;/h4&gt;

&lt;p&gt;First, you want to know which ports are used by your GPS base module. Run this code (The resource was found &lt;a href="https://stackoverflow.com/questions/12090503/listing-available-com-ports-with-python" rel="noopener noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run &lt;code&gt;python3 NAME_OF_CODE_1.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;serial&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;serial_ports&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt; Lists serial port names

        :raises EnvironmentError:
            On unsupported or unknown platforms
        :returns:
            A list of the serial ports available on the system
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;win&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;COM%s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;linux&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cygwin&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# this excludes your current terminal "/dev/tty"
&lt;/span&gt;        &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/dev/tty[A-Za-z]*&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;darwin&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/dev/tty.*&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;EnvironmentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Unsupported platform&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;OSError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SerialException&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;serial_ports&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, time to parse the streaming RTCM correction data:&lt;br&gt;
(resource code from &lt;a href="https://github.com/semuconsulting/pyrtcm" rel="noopener noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run &lt;code&gt;python3 NAME_OF_CODE_2.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Should update the serial port name and the baud rate of your application&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;serial&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyrtcm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RTCMReader&lt;/span&gt;

&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/dev/ttyS10&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;921600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RTCMReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parsed_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rtr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parsed_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  part of the results
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;You can print either raw data or parsed data&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyu8kikrxqjpyrrzv1r0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyu8kikrxqjpyrrzv1r0.PNG" alt="Image description" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/12090503/listing-available-com-ports-with-python" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/12090503/listing-available-com-ports-with-python&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/semuconsulting/pyrtcm" rel="noopener noreferrer"&gt;https://github.com/semuconsulting/pyrtcm&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rtcm</category>
      <category>serial</category>
      <category>python</category>
      <category>gpsrtk</category>
    </item>
    <item>
      <title>Wi-Fi communication using two u-blox C099-F9P application board</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Wed, 31 Aug 2022 17:19:48 +0000</pubDate>
      <link>https://forem.com/yongchanghe/wi-fi-communication-using-two-u-blox-c099-f9p-application-board-omp</link>
      <guid>https://forem.com/yongchanghe/wi-fi-communication-using-two-u-blox-c099-f9p-application-board-omp</guid>
      <description>&lt;p&gt;The C099-F9P &lt;a href="https://www.youtube.com/watch?v=257WX_agvtg" rel="noopener noreferrer"&gt;RTK&lt;/a&gt; Base can be set to operate as a Wi-Fi access point and UDP server to deliver RTCM correction data via a Wi-Fi link. For the Rover operation, C099-F9P can be configured to either Wi-Fi STA mode or AP mode. STA mode is suitable for one Base to one Rover communication. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphz045rf0l585vvr2xxf.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphz045rf0l585vvr2xxf.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article will introduce Base AP mode and Rover STA mode configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Two u-blox C099-F9P &lt;a href="https://www.u-blox.com/en/product/c099-f9p-application-board" rel="noopener noreferrer"&gt;application&lt;/a&gt; boards &lt;a href="https://www.digikey.ca/en/product-highlight/u/u-blox/c099-f9p-application-board" rel="noopener noreferrer"&gt;(evaluation kit)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.u-blox.com/en/product/u-center" rel="noopener noreferrer"&gt;u-center&lt;/a&gt; installed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://osdn.net/projects/ttssh2/releases/" rel="noopener noreferrer"&gt;Tera Term&lt;/a&gt; installed &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Base ODIN-W2 configuration in Wi-Fi AP mode
&lt;/h4&gt;

&lt;p&gt;1.Configure C099-F9P ODIN-W2 to work in Wi-Fi AP mode using CLI in Tera Term terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mem_store/run wifi_ap 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Set the C099-F9P Wi-Fi and I2C interface to support the base configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mem_store/run base
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.Restart the C099-F9P application board to apply Wi-Fi AP mode settings, and the Base ODIN-W2 will wait until a Wi-Fi STA Rover connects to it before streaming any data via the Wi-Fi link. The screenshot below shows the Base is streaming data to Rover via a Wi-Fi connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr67bw4ylnyx0jvofnvh.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr67bw4ylnyx0jvofnvh.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Rover ODIN-W2 configuration in Wi-Fi STA mode
&lt;/h4&gt;

&lt;p&gt;1.Configure C099-F9P ODIN-W2 to work in Wi-Fi STA mode using CLI in Tera Term terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mem_store/run wifi_sta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Set the C099-F9P to support rover configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mem_store/run rover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.Restart the Rover C099-F9P application board to apply Wi-Fi STA mode settings, and the Rover C099-F9P automatically connects to the C099-F9P Base.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquz4fozub92thiyeod1r.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquz4fozub92thiyeod1r.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  RTCM data streaming
&lt;/h4&gt;

&lt;p&gt;When the Rover receives RTCM correction data from Base, the Fix Mode should change from 3D to 3D/DGNSS (3D/DGNSS/FLOAT or 3D/DGNSS/FIXED), and the RTK LED blinks in green. The two screenshots show the Base was in 3D/DNGSS Fix Mode and the Rover was in 3D/DGNSS/FIXED Fix Mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgdlpio5q5n9l46wcq77.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgdlpio5q5n9l46wcq77.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyqgamyou4e2j4rbg5m7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyqgamyou4e2j4rbg5m7.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Trouble Shooting
&lt;/h3&gt;

&lt;p&gt;You may need to consult &lt;a href="https://portal.u-blox.com/s/question/0D52p0000A3VTLJCQ4/c099f9p-wifi-base-rover-configuration-no-rtcm3-data-passed" rel="noopener noreferrer"&gt;this link&lt;/a&gt; if there is no RTCM data streaming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reference
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://blog.adafruit.com/2020/06/08/eye-on-npi-u-blox-c099-f9p-application-board-for-zed-f9p-gnss-rtk-module-eyeonnpi-adafruit-digikey-digikey-ublox/?gclid=Cj0KCQjwjbyYBhCdARIsAArC6LJrPi4IL63FlciBqmsiVi17k99ISIA6yqlpx9lrUJMC3ofOh8-L4CkaAnGgEALw_wcB" rel="noopener noreferrer"&gt;https://blog.adafruit.com/2020/06/08/eye-on-npi-u-blox-c099-f9p-application-board-for-zed-f9p-gnss-rtk-module-eyeonnpi-adafruit-digikey-digikey-ublox/?gclid=Cj0KCQjwjbyYBhCdARIsAArC6LJrPi4IL63FlciBqmsiVi17k99ISIA6yqlpx9lrUJMC3ofOh8-L4CkaAnGgEALw_wcB&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wifi</category>
      <category>gps</category>
      <category>gnss</category>
      <category>iot</category>
    </item>
    <item>
      <title>Interact with ADT using Postman</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 01 Aug 2022 21:14:04 +0000</pubDate>
      <link>https://forem.com/yongchanghe/interact-with-adt-using-postman-2enl</link>
      <guid>https://forem.com/yongchanghe/interact-with-adt-using-postman-2enl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;ADT: Azure Digital Twins&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Postman is a REST testing tool that provides key HTTP request functionalities in a desktop and plugin-based GUI. You can craft HTTP requests and submit them to the Azure Digital Twins (ADT) REST APIs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This blog describes how to configure the Postman REST client to interact with the ADT APIs (creating a request collection).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/digital-twins/overview"&gt;knowledge&lt;/a&gt; about ADT&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; installed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/"&gt;.NET Core&lt;/a&gt; installed (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Azure DT &lt;a href="https://docs.microsoft.com/en-us/azure/digital-twins/quickstart-azure-digital-twins-explorer"&gt;instance&lt;/a&gt; created&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Azure DT &lt;a href="https://docs.microsoft.com/en-us/azure/digital-twins/how-to-manage-model"&gt;test models and graphs&lt;/a&gt; created and uploaded&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Table of content
&lt;/h3&gt;

&lt;p&gt;Using Azure CLI&lt;br&gt;
Using Postman&lt;br&gt;
  Create your own ADT collection&lt;br&gt;
  Add an individual request&lt;br&gt;
  Set request details&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Using Azure CLI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hI0ohn6P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mnbjt3dumfi0m0wocimy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hI0ohn6P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mnbjt3dumfi0m0wocimy.png" alt="Image description" width="880" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. Run the following command to access Azure credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. Run the following command to get a bearer token with access to the ADT service.&lt;/p&gt;

&lt;p&gt;using data plane APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az account get-access-token --resource 0b07f429-9f4b-4714-9392-cc5e8e80c8b0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;using control plane APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az account get-access-token --resource https://management.azure.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;result example:&lt;br&gt;
&lt;code&gt;"accessToken": "eyJ0eXAiOiJ..."&lt;br&gt;
"expiresOn": "2022-07-2...",&lt;br&gt;
"subscription": "907b0d06-a...",&lt;br&gt;
"tenant": "24ab6cd0-487e-...",&lt;br&gt;
"tokenType": "Bearer"&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Save the value of the accessToken and we will use it later on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Using Postman
&lt;/h3&gt;

&lt;p&gt;We can either create our own collection of ADT APIs or import &lt;a href="https://github.com/microsoft/azure-digital-twins-postman-samples"&gt;an existing one&lt;/a&gt;. This article will be talking about creating one from scratch.&lt;/p&gt;
&lt;h4&gt;
  
  
  Create your own ADT collection
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In &lt;code&gt;My Workspace&lt;/code&gt; click &lt;code&gt;new&lt;/code&gt; to create a new &lt;code&gt;Collection&lt;/code&gt; in Building Blocks. Change the collection name if you like.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;code&gt;Authorization&lt;/code&gt; tag, set the &lt;code&gt;Type&lt;/code&gt; to OAuth2.0 and paste your access token into the Token box. Click save.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  Add an individual request
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In &lt;code&gt;My Workspace&lt;/code&gt; click &lt;code&gt;new&lt;/code&gt; to create a new &lt;code&gt;Request&lt;/code&gt; in Building Blocks. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By clicking the &lt;code&gt;Save&lt;/code&gt; button, you can name the new request and select a collection to save it. Click save again.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The new request &lt;code&gt;Query twins&lt;/code&gt; was saved in &lt;code&gt;ADT Custom Collection&lt;/code&gt; directory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--91y4CofG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3stebm6z8eyyelgdj1m5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--91y4CofG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3stebm6z8eyyelgdj1m5.png" alt="Image description" width="880" height="558"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Set request details
&lt;/h4&gt;

&lt;p&gt;Change the type from GET to POST, and paste the URL below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;https://digitaltwins-host-name/query?api-version=2020-10-31.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Using your own digital-twins-host-name&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the Authorization tab, set the Type to &lt;code&gt;Inherit auth from parent&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Check that the body shown for the request in the Body tab matches the needs described below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gkGehVsQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cidg1mo8747fusytk37b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gkGehVsQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cidg1mo8747fusytk37b.png" alt="Image description" width="880" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;send&lt;/code&gt; button to send the request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7ZaWDfrZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rj0sqi74vzete8mmnx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7ZaWDfrZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rj0sqi74vzete8mmnx3.png" alt="Image description" width="880" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OK! All set.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/digital-twins/how-to-use-postman?tabs=data-plane"&gt;https://docs.microsoft.com/en-us/azure/digital-twins/how-to-use-postman?tabs=data-plane&lt;/a&gt;&lt;br&gt;
Cover image from this link&lt;br&gt;
&lt;a href="https://aithority.com/computing/5-exciting-applications-of-digital-twin-technology/"&gt;https://aithority.com/computing/5-exciting-applications-of-digital-twin-technology/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>digitaltwin</category>
      <category>postman</category>
      <category>beginners</category>
      <category>api</category>
    </item>
    <item>
      <title>Work With Azure Digital Twin - code a client app</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 25 Jul 2022 15:55:31 +0000</pubDate>
      <link>https://forem.com/yongchanghe/work-with-azure-digital-twin-code-a-client-app-210c</link>
      <guid>https://forem.com/yongchanghe/work-with-azure-digital-twin-code-a-client-app-210c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In this article, I will use &lt;strong&gt;DT&lt;/strong&gt; for &lt;strong&gt;Digital Twin&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/digital-twins/overview" rel="noopener noreferrer"&gt;knowledge&lt;/a&gt; about Azure DT&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any code editor (&lt;em&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; is preferable, and you don't need to install .NET Core&lt;/em&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;.NET Core&lt;/a&gt; installed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Azure DT &lt;a href="https://docs.microsoft.com/en-us/azure/digital-twins/quickstart-azure-digital-twins-explorer" rel="noopener noreferrer"&gt;instance&lt;/a&gt; created&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Project Setup
&lt;/h4&gt;

&lt;p&gt;The very first is to create a minimal C# project in the created directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir new-dt
cd new-dt
dotnet new console
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbve9kdevjh0uxnqp8hbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbve9kdevjh0uxnqp8hbg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you want to add two dependencies to your project: one is the package for the Azure DT SDK for .NET, and the other is tools to help with authentication management:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet add package Azure.DigitalTwins.Core
dotnet add package Azure.Identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we add the following two pieces of code to &lt;strong&gt;&lt;code&gt;Program.cs&lt;/code&gt;&lt;/strong&gt; to add necessary dependencies and authentication functionality:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add this on the top&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.DigitalTwins.Core&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;And add this below the 'hello world' line in &lt;code&gt;Main&lt;/code&gt; method, and &lt;strong&gt;do not&lt;/strong&gt; forget to set the value of &lt;code&gt;adtInstanceUrl&lt;/code&gt; to your instance host name:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;adtInstanceUrl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://&amp;lt;your-Azure-Digital-Twins-instance-hostName&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DigitalTwinsClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adtInstanceUrl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Service client created – ready to go"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can save the project (or preferablly commit to your git) and run the command below to test our previous work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The console will print the following if no error occurs:&lt;br&gt;
&lt;code&gt;Hello World!&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Service client created – ready to go&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Model Upload
&lt;/h4&gt;

&lt;p&gt;We can create models using Digital Twins Definition Language  (&lt;strong&gt;&lt;em&gt;DTDL&lt;/em&gt;&lt;/strong&gt;, a kind of language similar with OOP programming language). &lt;/p&gt;

&lt;p&gt;Let's create a new file named &lt;strong&gt;&lt;code&gt;SampleModel.json&lt;/code&gt;&lt;/strong&gt;, and paste the following code into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dtmi:example:SampleModel;1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Interface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"displayName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SampleModel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Relationship"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contains"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Property"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dtmi:dtdl:context;2"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, you want to add the rest of the code in &lt;strong&gt;&lt;code&gt;Program.cs&lt;/code&gt;&lt;/strong&gt; in order to interact with your DT instance (including code previously pasted):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;Azure_Digital_Twins_dependencies&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.DigitalTwins.Core&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;/Azure_Digital_Twins_dependencies&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;Model_dependencies&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Threading.Tasks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.IO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;/Model_dependencies&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;Query_dependencies&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Text.Json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;/Query_dependencies&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;DigitalTwins_Samples&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DigitalTwinsClientAppSample&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// &amp;lt;Async_signature&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// &amp;lt;/Async_signature&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;Authentication_code&amp;gt;&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;adtInstanceUrl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://&amp;lt;your-Azure-Digital-Twins-instance-hostName&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DigitalTwinsClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adtInstanceUrl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Service client created – ready to go"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Authentication_code&amp;gt;&lt;/span&gt;

            &lt;span class="c1"&gt;// &amp;lt;Model_code&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Upload a model"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;dtdl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAllText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SampleModel.json"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;dtdl&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="c1"&gt;// Upload the model to the service&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;Model_try_catch&amp;gt;&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateModelsAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Models uploaded to the instance:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestFailedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Upload model error: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Model_try_catch&amp;gt;&lt;/span&gt;

            &lt;span class="c1"&gt;// &amp;lt;Print_model&amp;gt;&lt;/span&gt;
            &lt;span class="c1"&gt;// Read a list of models back from the service&lt;/span&gt;
            &lt;span class="n"&gt;AsyncPageable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DigitalTwinsModelData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;modelDataList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetModelsAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DigitalTwinsModelData&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;modelDataList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Model: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Print_model&amp;gt;&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Model_code&amp;gt;&lt;/span&gt;

            &lt;span class="c1"&gt;// &amp;lt;Initialize_twins&amp;gt;&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;twinData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BasicDigitalTwin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;twinData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"dtmi:example:SampleModel;1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;twinData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;$"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"sampleTwin-"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;twinData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateOrReplaceDigitalTwinAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BasicDigitalTwin&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;twinData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;twinData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Created twin: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;twinData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestFailedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Create twin error: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Initialize_twins&amp;gt;&lt;/span&gt;

            &lt;span class="c1"&gt;// &amp;lt;Use_create_relationship&amp;gt;&lt;/span&gt;
            &lt;span class="c1"&gt;// Connect the twins with relationships&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;CreateRelationshipAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"sampleTwin-0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"sampleTwin-1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;CreateRelationshipAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"sampleTwin-0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"sampleTwin-2"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Use_create_relationship&amp;gt;&lt;/span&gt;

            &lt;span class="c1"&gt;// &amp;lt;Use_list_relationships&amp;gt;&lt;/span&gt;
            &lt;span class="c1"&gt;//List the relationships&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;ListRelationshipsAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"sampleTwin-0"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Use_list_relationships&amp;gt;&lt;/span&gt;

            &lt;span class="c1"&gt;// &amp;lt;Query_twins&amp;gt;&lt;/span&gt;
            &lt;span class="c1"&gt;// Run a query for all twins&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SELECT * FROM digitaltwins"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;AsyncPageable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BasicDigitalTwin&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;queryResult&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BasicDigitalTwin&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BasicDigitalTwin&lt;/span&gt; &lt;span class="n"&gt;twin&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queryResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;twin&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"---------------"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="c1"&gt;// &amp;lt;/Query_twins&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// &amp;lt;Create_relationship&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;CreateRelationshipAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DigitalTwinsClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;srcId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;targetId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;relationship&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BasicRelationship&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;TargetId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;targetId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"contains"&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;relId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;srcId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-contains-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;targetId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateOrReplaceRelationshipAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;srcId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relationship&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Created relationship successfully"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestFailedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Create relationship error: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// &amp;lt;/Create_relationship&amp;gt;&lt;/span&gt;

        &lt;span class="c1"&gt;// &amp;lt;List_relationships&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;ListRelationshipsAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DigitalTwinsClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;srcId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;AsyncPageable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BasicRelationship&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRelationshipsAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BasicRelationship&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;srcId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Twin &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;srcId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is connected to:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BasicRelationship&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$" -&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TargetId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestFailedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Relationship retrieval error: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// &amp;lt;/List_relationships&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now interact with your digital twins using &lt;code&gt;dotnet run&lt;/code&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  Part of the result
&lt;/h4&gt;

&lt;p&gt;Hello World!&lt;br&gt;
Service client created – ready to go&lt;/p&gt;

&lt;p&gt;Upload a model&lt;br&gt;
Models uploaded to the instance:&lt;br&gt;
Model: dtmi:example:Floor;1&lt;br&gt;
Model: dtmi:example:Room;1&lt;br&gt;
Model: dtmi:example:SampleModel;1&lt;br&gt;
Created twin: sampleTwin-0&lt;br&gt;
Created twin: sampleTwin-1&lt;br&gt;
Created twin: sampleTwin-2&lt;br&gt;
Created relationship successfully&lt;br&gt;
Created relationship successfully&lt;br&gt;
Twin sampleTwin-0 is connected to:&lt;br&gt;
 -contains-&amp;gt;sampleTwin-1&lt;br&gt;
 -contains-&amp;gt;sampleTwin-2&lt;br&gt;
....&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;Code a client app&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/digital-twins/tutorial-code" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/azure/digital-twins/tutorial-code&lt;/a&gt;&lt;br&gt;
Cover image&lt;br&gt;
&lt;a href="https://www.ciobulletin.com/cloud/azure-digital-twins-generally-available" rel="noopener noreferrer"&gt;https://www.ciobulletin.com/cloud/azure-digital-twins-generally-available&lt;/a&gt;&lt;/p&gt;

</description>
      <category>digitaltwin</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Deploy React app with JSON server on Heroku</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 18 Jul 2022 15:28:52 +0000</pubDate>
      <link>https://forem.com/yongchanghe/deploy-react-app-with-json-server-on-heroku-59ak</link>
      <guid>https://forem.com/yongchanghe/deploy-react-app-with-json-server-on-heroku-59ak</guid>
      <description>&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Assuming you have already done the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created a react application using create-react-app,&lt;/li&gt;
&lt;li&gt;Installed JSON server in the root directory and created db.json database,&lt;/li&gt;
&lt;li&gt;Your front-end application can run correctly and can access the JSON database properly,&lt;/li&gt;
&lt;li&gt;Your app has been committed on Github,&lt;/li&gt;
&lt;li&gt;You have a &lt;a href="https://id.heroku.com/login" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt; account.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 1:
&lt;/h4&gt;

&lt;p&gt;create a file named &lt;strong&gt;Procfile&lt;/strong&gt; in the root directory, and paste the following code into the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpmmndjjnjbrjbe4kao1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpmmndjjnjbrjbe4kao1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 2:
&lt;/h4&gt;

&lt;p&gt;create a file named &lt;strong&gt;server.js&lt;/strong&gt; in the root directory, and paste the following into the file:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonServer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./db.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;middlewares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;static&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./build&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;middlewares&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;jsonServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rewriter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/$1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server is running&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7nhi2ruw7u95mfq8hwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7nhi2ruw7u95mfq8hwm.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 3:
&lt;/h4&gt;

&lt;p&gt;(1) Commit the changes above to your Git repo. Then,&lt;br&gt;
(2) Log in to your Heroku account, and create a new app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2tghj5lobm1rphs4mn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2tghj5lobm1rphs4mn0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(3) In the &lt;code&gt;Deploy&lt;/code&gt; catalogue, select &lt;code&gt;GitHub&lt;/code&gt; as your &lt;code&gt;Deployment method&lt;/code&gt;, find your repo and &lt;code&gt;Connect&lt;/code&gt; it to Heroku:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2qadpt27rdu50lpq25q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2qadpt27rdu50lpq25q.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(4) Click &lt;code&gt;Deploy Branch&lt;/code&gt; to deploy your app. &lt;/p&gt;

&lt;p&gt;Suppose the whole procedure finishes without any problem, congrats! And now, you can click &lt;code&gt;Open app&lt;/code&gt; to see your deployed app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmd1oqst8kbrzyfcm5kj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmd1oqst8kbrzyfcm5kj.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3v988adjjmydl6povbzb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3v988adjjmydl6povbzb.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the end of this article. I want to share my &lt;a href="https://deploy-feedback-app-with-jsv.herokuapp.com/" rel="noopener noreferrer"&gt;deployed repo&lt;/a&gt; here, and please feel free to check interesting things, play it, fork and give stars, and leave a message below if you have questions.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hyc0812" rel="noopener noreferrer"&gt;
        hyc0812
      &lt;/a&gt; / &lt;a href="https://github.com/hyc0812/deploy-feedback-app" rel="noopener noreferrer"&gt;
        deploy-feedback-app
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      a simple feedback app demo @ https://deploy-feedback-app-with-jsv.herokuapp.com/
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Feedback app demo&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://deploy-feedback-app-with-jsv.herokuapp.com/" rel="nofollow noopener noreferrer"&gt;DemoLink&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/hyc0812/deploy-feedback-app/blob/master/Screenshot/screenshot-02.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhyc0812%2Fdeploy-feedback-app%2Fraw%2Fmaster%2FScreenshot%2Fscreenshot-02.png" width="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run it locally:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm install
npm run dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Deploy it to Heroku:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to/yongchanghe/deploy-react-app-with-json-server-on-heroku-42fo-temp-slug-7876158?preview=80611c9b93b72fd2ae5847ee90655a4f496f308e6112fb1ca343763902138eb6ca2e29b74728934a652ad16e722728bba421562e61eeeda2b9f3cd5b" rel="nofollow"&gt;BlogLink&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The blog haven't publish yet, I will update the blog URL soon...&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hyc0812/deploy-feedback-app" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;See you!&lt;/p&gt;

&lt;h3&gt;
  
  
  Reference
&lt;/h3&gt;

&lt;p&gt;Deployment:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=DAuHI7bHx1Q" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=DAuHI7bHx1Q&lt;/a&gt;&lt;br&gt;
Learn React.js:&lt;br&gt;
&lt;a href="https://www.skillshare.com/classes/React-Front-To-Back-2022/1541849001/projects?via=member-home-EnrolledClassesLessonsSection" rel="noopener noreferrer"&gt;https://www.skillshare.com/classes/React-Front-To-Back-2022/1541849001/projects?via=member-home-EnrolledClassesLessonsSection&lt;/a&gt;&lt;br&gt;
Cover image:&lt;br&gt;
&lt;a href="https://blog.devgenius.io/how-to-deploy-your-first-full-stack-web-application-react-rails-heroku-17a799e78bb4" rel="noopener noreferrer"&gt;https://blog.devgenius.io/how-to-deploy-your-first-full-stack-web-application-react-rails-heroku-17a799e78bb4&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>jsonserver</category>
      <category>heroku</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Hyperledger Fabric architecture</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 11 Jul 2022 20:15:48 +0000</pubDate>
      <link>https://forem.com/yongchanghe/hyperledger-fabric-architecture-456g</link>
      <guid>https://forem.com/yongchanghe/hyperledger-fabric-architecture-456g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The purpose of building this blog is to write down the detailed operation history and my memo for learning the dApps and Web3 programming.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The figure below illustrates the architecture of the Hyperledger Fabric blockchain. The application interface is the front end which will interact with the Hyperledger Fabric blockchain. This application is running on SDK which is a software development kit provided by the Hyperledger team. Currently, the most mature SDK are Node JS and Go SDK. These two are equipped with the Hyperledger Fabric system itself. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iP7aTAwA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2um486rj2xryb6bow11x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iP7aTAwA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2um486rj2xryb6bow11x.png" alt="Image description" width="880" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time a user uploads any document through this application interface, the application does not go to this blockchain directly. Instead, the application creates a future update proposal and submits a request for confirmation over the blockchain. With this request, users seek to modify the data stored in the blockchain or the current state of the blockchain. At present, the blockchain is at a stage where all the data has been sent and the users want to add one more transaction on top of that. &lt;/p&gt;

&lt;p&gt;The proposal is sent to an endorsing peer. Endorsing peers is to verify and validate the transaction which is coming in. They execute the transaction by simulating it over the copy of the ledger. Simulating means they do not directly change the state of the blockchain but hold a copy of the state and implement the transaction proposal on that copy of the blockchain without updating it. &lt;/p&gt;

&lt;p&gt;In Hyperledger blockchain data storage happens in a way that every transaction that is coming in or every block that is coming in are in key-value pairs, and the Hyperledger Fabric database is a key-value pair database. Endorsing peers execute the transaction on top of the copy and once the transactions are implemented, the read set and write set of the keys are changed automatically. Once the endorsing peers check that the transactions are in the correct order then they validate the transaction after verifying it. The endorsing peers sign the proposal with their certificate issued by a membership service provider MSP. After that, they send it back to the application. &lt;/p&gt;

&lt;p&gt;Once the application receives this transaction, it checks for the satisfaction of the endorsement policies and if the endorsement policies are met, then it sends the transaction further to the ordering service. The ordering service is the central entity which updates the state of the blockchain. The ordering service receives this transaction and orders them into a block. It checks what kind of reads and writes are going to be updated within the transaction and checks whether are a part of the block or not. Once everything is examined, the ordering service puts this completed transaction change as a new block over the blockchain. It means that once the blockchain state is renewed, the transaction block is refreshed. &lt;/p&gt;

&lt;p&gt;After that, the committing peers validate the endorsement policy and commit the new block to the chain and valid transactions to the database. Finally, all the peers who are connected to the blockchain will update their state and get the new read set and write set for the blockchain state through gossip protocol working behind the scenes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reference:
&lt;/h4&gt;

&lt;p&gt;Cover image:&lt;br&gt;
&lt;a href="https://www.ibm.com/blogs/blockchain/2020/01/hyperledger-achieves-huge-milestone-introducing-hyperledger-fabric-2-0/"&gt;https://www.ibm.com/blogs/blockchain/2020/01/hyperledger-achieves-huge-milestone-introducing-hyperledger-fabric-2-0/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>blockchain</category>
      <category>hyperledger</category>
      <category>web3</category>
    </item>
    <item>
      <title>Hyperledger Fabric and MSP</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 04 Jul 2022 20:56:59 +0000</pubDate>
      <link>https://forem.com/yongchanghe/hyperledger-fabric-and-msp-5g30</link>
      <guid>https://forem.com/yongchanghe/hyperledger-fabric-and-msp-5g30</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The purpose of building this blog is to write down the detailed operation history and my memo for learning the dApps and Web3 programming.&lt;/p&gt;

&lt;p&gt;MSP - Membership Service Provider&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What is Hyperledger Fabric?
&lt;/h3&gt;

&lt;p&gt;Hyperledger Fabric, hosted by Linux Foundation, is a modular and extensible open-source system for deploying and operating permissioned and private blockchain. &lt;/p&gt;

&lt;p&gt;It is the first truly extensible blockchain network for distributed applications written in standard, general-purpose programming languages, without systemic dependency on a native cryptocurrency. This is a sharp contrast to existing platforms requiring domain-specific programming languages or relying on a cryptocurrency.&lt;/p&gt;

&lt;p&gt;Hyperledger Fabric also allows component pluggability, such as membership, database, and consensus. Typically, the membership layer can authenticate users and grant them access based on their access level and the system policy.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Hyperledger Fabric Identity Management?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Identity Management&lt;/strong&gt; refers to the &lt;strong&gt;Membership Service Provider&lt;/strong&gt; (MSP), which manages and authenticates all the participants/users on the network. &lt;/p&gt;

&lt;p&gt;If any participants connect to the network, the owner can register them on MSP, where specific information about them will be stored. After that, a certificate will be generated and issued by the MSP, which will act as their identity over the blockchain. They will need this certificate identity for all transactions on the Fabric network. So, MSP provides you access control over the permissions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hZNhXQWQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6g9hypc126iykg3679ur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hZNhXQWQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6g9hypc126iykg3679ur.png" alt="Image description" width="880" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, in the case of academic credentials, only universities and educational institutes have permission to create new transactions over the network, which means only they can upload the academic credentials over the network. &lt;/p&gt;

&lt;p&gt;On the other hand, students can only have the read permissions allowing them to view their educational credentials or report cards without giving them the authority to perform any functionalities over the network. &lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Hyperledger Fabric
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Permissioned network&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Establish decentralized trust in a network of known participants rather than an open network of anonymous participants.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Confidential transactions&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expose only the data you want to share to the parties you want to share it with.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Pluggable architecture&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tailor the blockchain to industry needs with a pluggable architecture rather than a one-size-fits-all approach.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Easy to get started&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Program smart contracts in the languages your team works in today, instead of learning custom languages and architectures.&lt;/p&gt;




&lt;h4&gt;
  
  
  References
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/3190508.3190538"&gt;https://dl.acm.org/doi/pdf/10.1145/3190508.3190538&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ibm.com/topics/hyperledger"&gt;https://www.ibm.com/topics/hyperledger&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.hyperledger.org/use/fabric"&gt;https://www.hyperledger.org/use/fabric&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>blockchain</category>
      <category>hyperledger</category>
    </item>
    <item>
      <title>Deploy your React App on Github in 5 minutes</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 27 Jun 2022 15:24:55 +0000</pubDate>
      <link>https://forem.com/yongchanghe/deploy-your-react-app-on-github-in-5-minutes-1pl2</link>
      <guid>https://forem.com/yongchanghe/deploy-your-react-app-on-github-in-5-minutes-1pl2</guid>
      <description>&lt;ul&gt;
&lt;li&gt;1. 
At your app root directory, run the command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install gh-pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;2. Publish your app to GitHub:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Ether button is OK. &lt;br&gt;
Ignore this step if you have already published your app&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AqtMM3pY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3541utk585zbov35tvsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AqtMM3pY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3541utk585zbov35tvsw.png" alt="Image description" width="880" height="839"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3. Add the following to the first line of &lt;strong&gt;package.json&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;"homepage": "https://GIT_USERNAME.github.io/REPOSITORY_NAME",&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For the URL string, you will need to replace it with your git user name and your current repository name.&lt;br&gt;
TIPS: click the gear icon on the GitHub page, and the URL will show up:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hiqPiCKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1tme37b9x9u3lk76pkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hiqPiCKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1tme37b9x9u3lk76pkz.png" alt="Image description" width="880" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bvNYk7Gd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c64mlh3xeaeym9ue3zpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bvNYk7Gd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c64mlh3xeaeym9ue3zpf.png" alt="Image description" width="880" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4. Add the following in "scripts" in &lt;strong&gt;package.json&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;"predeploy":"npm run build",&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"deploy":"gh-pages -d build",&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3DZS-QVX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hiek2q7jm0117lyuizi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3DZS-QVX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hiek2q7jm0117lyuizi1.png" alt="Image description" width="861" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5. Save the app and commit the change to update your remote repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Alternatively, you can directly update your JSON file on the GitHub webpage and commit changes. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;6. Deploy the app by running:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dIpY4_2r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2fag4ezr0pfzcheyg1xv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dIpY4_2r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2fag4ezr0pfzcheyg1xv.png" alt="Image description" width="880" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After the deployment, some changes exist. Just commit these changes again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;7. Find your app URL at &lt;code&gt;General&lt;/code&gt; &amp;gt; &lt;code&gt;Pages&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--er7dkO-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oo37owm8w2yduwve41d9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--er7dkO-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oo37owm8w2yduwve41d9.png" alt="Image description" width="809" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wcBJg-_H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2p2znjl6g5zmnza6vot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wcBJg-_H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2p2znjl6g5zmnza6vot.png" alt="Image description" width="809" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8. Have fun!~ &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is my React app Demo I used for this tutorial and &lt;a href="https://hyc0812.github.io/deploy-reactapp-typing-game/"&gt;welcome to play&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/hyc0812/deploy-reactapp-typing-game"&gt;Git Repo&lt;/a&gt; for this game&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MWbPv7A_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d7fhgjgdopxli95zsxfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MWbPv7A_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d7fhgjgdopxli95zsxfn.png" alt="Image description" width="847" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reference
&lt;/h3&gt;

&lt;p&gt;Cover Page from:&lt;br&gt;
&lt;a href="https://akhtarvahid.medium.com/setup-git-and-deploy-react-app-to-github-pages-7b5c4180fdaf"&gt;https://akhtarvahid.medium.com/setup-git-and-deploy-react-app-to-github-pages-7b5c4180fdaf&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Q&amp;A with Self-built Blockchain and Dapps (2)</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 20 Jun 2022 16:13:34 +0000</pubDate>
      <link>https://forem.com/yongchanghe/qa-with-self-built-blockchain-and-dapps-2-4e71</link>
      <guid>https://forem.com/yongchanghe/qa-with-self-built-blockchain-and-dapps-2-4e71</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The purpose of building this blog is to write down my memo for learning the dApps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Q1: brew no such file or directory?
&lt;/h3&gt;

&lt;p&gt;When I want to remote access to my PC, it always tells me that brew is not properly installed.&lt;br&gt;
How do i fix this problem?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-bash: /bin/brew: No such file or directory&lt;/code&gt;&lt;br&gt;
&lt;code&gt;-bash: /bin/brew: No such file or directory&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  A1:
&lt;/h3&gt;

&lt;p&gt;Try uninstalling Homebrew and then re-installing solved issue for me.&lt;/p&gt;

&lt;p&gt;Uninstall Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Re-install Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And better to update afterwards:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Q2: What is the connection between IPFS and Filecoin?
&lt;/h3&gt;

&lt;h3&gt;
  
  
  A2:
&lt;/h3&gt;

&lt;p&gt;Filecoin and IPFS are two separate, complementary protocols, both created by Protocol Labs. IPFS allows peers to store, request, and transfer verifiable data with each other, while Filecoin is designed to provide a system of persistent data storage. Under Filecoin's incentive structure, clients pay to store data at specific levels of redundancy and availability, and storage providers earn payments and rewards by continuously storing data and cryptographically proving it.&lt;/p&gt;

&lt;p&gt;In short: IPFS addresses and moves content, while Filecoin is an incentive layer to persist data.&lt;/p&gt;

&lt;p&gt;These components are separable - you can use one without the other, and IPFS already supports more self-organized or altruistic forms of data persistence via tools like IPFS Cluster (opens new window). Compatibility between IPFS and Filecoin is intended to be as seamless as possible, but we expect it to evolve. You can view the draft spec for IPFS-Filecoin Interoperability (opens new window)and ideas for future improvements (opens new window)to learn more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q3: Mining process
&lt;/h3&gt;

&lt;h3&gt;
  
  
  A3:
&lt;/h3&gt;

&lt;p&gt;Mining is the process of recording the pending transaction by adding a new Block into the BlockChain through a mathematical puzzle. Miners get rewarded for by receiving the new crypto coins of that Blockchain.&lt;/p&gt;

&lt;p&gt;Mining rewards are given to the miner who first finds the solution to a complicated hashing problem, and the chance of a miner finding the solution is proportional to the portion of the network's overall mining capacity.&lt;/p&gt;

&lt;p&gt;Miners need to solve a mathematical problem when trying to add a block to the blockchain.&lt;/p&gt;

&lt;p&gt;Block can only be added to the blockchain if its signature that is the hash output starts with a certain amount of zeros.&lt;/p&gt;

&lt;p&gt;If the data string of the block does not generate to a signature that start with so many consecutive zeros, miners will keep changing the nonce endlessly until they randomly hit an output string that matches the signature requirements.&lt;/p&gt;

&lt;p&gt;In mining a block is added to the blockchain after miner validates this block and confirms it.&lt;/p&gt;

&lt;p&gt;The process of mining is not mandatory for a blockchain to exist. The mining concept is a way of validation for the transactions; that is why most public blockchains use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.ipfs.io/concepts/faq/#ipfs-and-filecoin"&gt;https://docs.ipfs.io/concepts/faq/#ipfs-and-filecoin&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.investopedia.com/tech/how-does-bitcoin-mining-work/"&gt;https://www.investopedia.com/tech/how-does-bitcoin-mining-work/&lt;/a&gt;&lt;br&gt;
cover image:&lt;br&gt;
&lt;a href="https://stock.adobe.com/ca/search?k=q%26a&amp;amp;asset_id=431829099"&gt;https://stock.adobe.com/ca/search?k=q%26a&amp;amp;asset_id=431829099&lt;/a&gt;&lt;/p&gt;

</description>
      <category>homebrew</category>
      <category>webdev</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Tutorial - Using create2 to predict the contract address before deploying</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 13 Jun 2022 14:52:12 +0000</pubDate>
      <link>https://forem.com/yongchanghe/tutorial-using-create2-to-predict-the-contract-address-before-deploying-12cb</link>
      <guid>https://forem.com/yongchanghe/tutorial-using-create2-to-predict-the-contract-address-before-deploying-12cb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This tutorial is meant for those with a basic knowledge of Ethereum and smart contracts, who have some knowledge of Solidity.&lt;/em&gt;&lt;br&gt;
The purpose of building this blog is to write down the detailed operation history and my memo for learning the dApps and solidity programming.&lt;br&gt;
If you are also interested and want to get hands dirty, just follow these steps below and have fun!~&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://remix.ethereum.org/" rel="noopener noreferrer"&gt;Remix&lt;/a&gt; for contract testing&lt;/li&gt;
&lt;li&gt;Basic knowledge of &lt;a href="https://ethereum.org/en/" rel="noopener noreferrer"&gt;Ethereum&lt;/a&gt; and &lt;a href="https://docs.soliditylang.org/en/v0.8.14/" rel="noopener noreferrer"&gt;Solidity&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The create2 opcode gives us the ability to predict the contract address where a contract will be deployed. This opens up lots of possibilities to improve user onboarding and scalability.&lt;/p&gt;

&lt;h3&gt;
  
  
  contract overview
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;
//Use Create2 to know contract address before it is deployed.
contract DeployWithCreate2 {
    address public owner;
    constructor(address _owner) {
        owner = _owner;
    }
}
contract Create2Factory {
    event Deploy(address addr);
    // to deploy another contract using owner address and salt specified
    function deploy(uint _salt) external {
        DeployWithCreate2 _contract = new DeployWithCreate2{
            salt: bytes32(_salt)    // the number of salt determines the address of the contract that will be deployed
        }(msg.sender);
        emit Deploy(address(_contract));
    }

    // get the computed address before the contract DeployWithCreate2 deployed using Bytecode of contract DeployWithCreate2 and salt specified by the sender
    function getAddress(bytes memory bytecode, uint _salt) public view returns (address) {
        bytes32 hash = keccak256(
            abi.encodePacked(
                bytes1(0xff), address(this), _salt, keccak256(bytecode)
            )
        );
        return address (uint160(uint(hash)));
    }
    // get the ByteCode of the contract DeployWithCreate2
    function getBytecode(address _owner) public pure returns (bytes memory) {
        bytes memory bytecode = type(DeployWithCreate2).creationCode;
        return abi.encodePacked(bytecode, abi.encode(_owner));
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;We use Create2Factory to deploy the contract DeployWithCreate2. First we get the byteCode of the contract DeployWithCreate2 using the function &lt;code&gt;getBytecode&lt;/code&gt;, and then we use &lt;code&gt;byteCode&lt;/code&gt; and owner-specified &lt;code&gt;salt&lt;/code&gt; to compute the address of contract DeployWithCreate2. Finally we use function &lt;code&gt;deploy&lt;/code&gt; to deploy the contract DeployWithCreate2 to see the actuall contract address.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Contract testing steps
&lt;/h3&gt;
&lt;h4&gt;
  
  
  getBytecode
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2ikhc5nutc7eqqsy6x4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2ikhc5nutc7eqqsy6x4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  getAddress
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o2cbwdl5fggq9l9iu8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o2cbwdl5fggq9l9iu8d.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  deploy with the same salt value
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qkgzlsun97ont3gjgij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qkgzlsun97ont3gjgij.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  check logs
&lt;/h4&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

logs    [
    {
        "from": "0xDA0bab807633f07f013f94DD0E6A4F96F8742B53",
        "topic": "0x55ea6c6b31543d8e2ec6a72f71a79c0f4b72ed0d4757172b043d8f4f4cd84848",
        "event": "Deploy",
        "args": {
            "0": "0x0B4f6a49C6a97B5dBB62F8A594cDefe5EabB4658",
            "addr": "0x0B4f6a49C6a97B5dBB62F8A594cDefe5EabB4658"
        }
    }


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Git repository
&lt;/h3&gt;

&lt;p&gt;Welcome to visit the Git repo for source code (Create2.sol or Example-44), and feel free to reach me by leaving a message below or via email found in my profile. &lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hyc0812" rel="noopener noreferrer"&gt;
        hyc0812
      &lt;/a&gt; / &lt;a href="https://github.com/hyc0812/solidity-essentials" rel="noopener noreferrer"&gt;
        solidity-essentials
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Solidity programming baby examples...
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Solidity-Baby Steps...&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;The best path for earning Solidity is to approach examples.&lt;/p&gt;

&lt;p&gt;Here are baby examples. Typing one-by-one is recommended.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/yongchanghe/tutorial-play-with-an-auction-demo-based-on-erc721-3kpb" rel="nofollow"&gt;MyBlog&lt;/a&gt; explanation for using EnglishAuction and testing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://solidity-by-example.org/" rel="nofollow noopener noreferrer"&gt;examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=6aQErpWPLbk&amp;amp;t=2s" rel="nofollow noopener noreferrer"&gt;videoResource&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Example-1&lt;/h4&gt;
&lt;/div&gt;

&lt;p&gt;updateBalance &amp;amp; getBalance&lt;/p&gt;

&lt;div class="highlight highlight-source-solidity notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// SPDX-License-Identifier: GPL-3.0&lt;/span&gt;

&lt;span class="pl-k"&gt;pragma solidity&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="pl-c1"&gt;0.7.0&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-c1"&gt;0.9.0&lt;/span&gt;;

&lt;span class="pl-k"&gt;contract&lt;/span&gt; &lt;span class="pl-en"&gt;MyLedger&lt;/span&gt; {
    &lt;span class="pl-k"&gt;mapping&lt;/span&gt;(&lt;span class="pl-c1"&gt;address&lt;/span&gt; &lt;span class="pl-k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-c1"&gt;uint&lt;/span&gt;) &lt;span class="pl-k"&gt;public&lt;/span&gt; balances;
    &lt;span class="pl-k"&gt;function&lt;span class="pl-en"&gt; updateBalance&lt;/span&gt;&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;newBal&lt;/span&gt;) &lt;span class="pl-k"&gt;public&lt;/span&gt; {
        balances[&lt;span class="pl-c1"&gt;msg&lt;/span&gt;.&lt;span class="pl-c1"&gt;sender&lt;/span&gt;] &lt;span class="pl-k"&gt;=&lt;/span&gt; newBal;
    }
    &lt;span class="pl-k"&gt;function&lt;span class="pl-en"&gt; getBalance&lt;/span&gt;&lt;/span&gt;() &lt;span class="pl-k"&gt;public&lt;/span&gt; &lt;span class="pl-k"&gt;view&lt;/span&gt; &lt;span class="pl-k"&gt;returns&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt;) {
        &lt;span class="pl-k"&gt;return&lt;/span&gt; balances[&lt;span class="pl-c1"&gt;msg&lt;/span&gt;.&lt;span class="pl-c1"&gt;sender&lt;/span&gt;];
    }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Example-2&lt;/h4&gt;

&lt;/div&gt;

&lt;p&gt;Inherited from Square&lt;/p&gt;

&lt;div class="highlight highlight-source-solidity notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// SPDX-License-Identifier: GPL-3.0&lt;/span&gt;
&lt;span class="pl-k"&gt;pragma solidity&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="pl-c1"&gt;0.7.0&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-c1"&gt;0.9.0&lt;/span&gt;;

&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s"&gt;"&lt;span class="pl-s"&gt;@openzeppelin/contracts/utils/Strings.sol&lt;/span&gt;"&lt;/span&gt;;

&lt;span class="pl-k"&gt;contract&lt;/span&gt; &lt;span class="pl-en"&gt;Shape&lt;/span&gt; {
    &lt;span class="pl-c1"&gt;uint&lt;/span&gt; height;
    &lt;span class="pl-c1"&gt;uint&lt;/span&gt; width;

    &lt;span class="pl-k"&gt;constructor&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;_height&lt;/span&gt;, &lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;_width&lt;/span&gt;) {
        height &lt;span class="pl-k"&gt;=&lt;/span&gt; _height;
        width &lt;span class="pl-k"&gt;=&lt;/span&gt; _width;
    }
}

&lt;span class="pl-k"&gt;contract&lt;/span&gt; &lt;span class="pl-en"&gt;Square&lt;/span&gt; &lt;span class="pl-k"&gt;is&lt;/span&gt; &lt;span class="pl-en"&gt;Shape&lt;/span&gt; {
    &lt;span class="pl-k"&gt;constructor&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;h&lt;/span&gt;, &lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;w&lt;/span&gt;) &lt;span class="pl-en"&gt;Shape&lt;/span&gt;(h, w) {}

    &lt;span class="pl-k"&gt;function&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hyc0812/solidity-essentials" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.openzeppelin.com/cli/2.8/deploying-with-create2" rel="noopener noreferrer"&gt;https://docs.openzeppelin.com/cli/2.8/deploying-with-create2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=883-koWrsO4&amp;amp;list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p&amp;amp;index=58" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=883-koWrsO4&amp;amp;list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p&amp;amp;index=58&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.openzeppelin.com/getting-the-most-out-of-create2/" rel="noopener noreferrer"&gt;https://blog.openzeppelin.com/getting-the-most-out-of-create2/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>solidity</category>
      <category>blockchain</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tutorial - play with an auction demo based on ERC721</title>
      <dc:creator>Yongchang He</dc:creator>
      <pubDate>Mon, 06 Jun 2022 14:45:57 +0000</pubDate>
      <link>https://forem.com/yongchanghe/tutorial-play-with-an-auction-demo-based-on-erc721-3kpb</link>
      <guid>https://forem.com/yongchanghe/tutorial-play-with-an-auction-demo-based-on-erc721-3kpb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This tutorial is meant for those with a basic knowledge of Ethereum and smart contracts, who have some knowledge of Solidity.&lt;/em&gt;&lt;br&gt;
The purpose of building this blog is to write down the detailed operation history and my memo for learning the dApps and solidity programming.&lt;br&gt;
If you are also interested and want to get hands dirty, just follow these steps below and have fun!~&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://remix.ethereum.org/" rel="noopener noreferrer"&gt;Remix&lt;/a&gt; for contract testing&lt;/li&gt;
&lt;li&gt;Basic knowledge of &lt;a href="https://ethereum.org/en/" rel="noopener noreferrer"&gt;Ethereum&lt;/a&gt; and &lt;a href="https://docs.soliditylang.org/en/v0.8.14/" rel="noopener noreferrer"&gt;Solidity&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Smart contract overview
&lt;/h4&gt;

&lt;p&gt;This contract is for selling NFT. The general idea is that users (accounts) can send their bids to the contract for winning the NFT during a bidding period. The initial ownership for this NFT is the contract owner &lt;code&gt;account[0]&lt;/code&gt; / &lt;code&gt;address(0)&lt;/code&gt;(assume that we deploy the contract using &lt;code&gt;account[0]&lt;/code&gt;). The highest bidder will win the ownership of the NFT. Participants can withdraw their bids when the selling ends.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remark: This is test version not for production use. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Overview of the contract code (EnglishAuction.sol):
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

interface IERC721 {
    function transferFrom (
        address from,
        address to,
        uint nftId
    ) external;
}

contract EnglishAuction {
    event Start();
    event Bid(address indexed sender, uint amount);
    event Withdraw(address indexed bidder, uint amount);
    event End(address highestBidder, uint amount);

    IERC721 public immutable nft;
    uint public immutable nftId;
    address payable public immutable seller;
    uint32 public endAt;
    bool public started;
    bool public ended;
    address public highestBidder;
    uint public highestBid;
    mapping(address =&amp;gt; uint) public bids;

    constructor(address _nft, uint _nftId, uint _startingBid) {
        nft = IERC721(_nft);
        nftId = _nftId;
        seller = payable(msg.sender);
        highestBid = _startingBid;
    }
    function start() external {
        require(msg.sender == seller, "not seller");
        require(!started, "started");
        started = true;
        endAt = uint32(block.timestamp + 60); // 60 seconds should be long enough for the Demo and test.
        nft.transferFrom(seller, address(this), nftId);
        emit Start();
    }
    function bid() external payable {
        require(started, "not started");
        require(block.timestamp &amp;lt; endAt, "ended");
        require(msg.value &amp;gt; highestBid, " value &amp;lt; highest bid");
        if (highestBidder != address(0)) {
            bids[highestBidder] += highestBid;
        }
        highestBid = msg.value;
        highestBidder = msg.sender;
        emit Bid(msg.sender, msg.value);
    }
    function withdraw() external {
        uint bal = bids[msg.sender];
        bids[msg.sender] = 0;
        payable(msg.sender).transfer(bal);
        emit Withdraw(msg.sender, bal);
    }
    function end() external {
        require(started, "not started");
        require(!ended, "ended!");
        require(block.timestamp &amp;gt;= endAt, "not ended");
        ended = true;
        if (highestBidder != address(0)) {
            nft.transferFrom(address(this), highestBidder, nftId);
            seller.transfer(highestBid);
        } else {
            nft.transferFrom(address(this), seller, nftId);
        }
        emit End(highestBidder, highestBid);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;License identifier&lt;/strong&gt; and &lt;strong&gt;compiler version&lt;/strong&gt; are defined at first. &lt;br&gt;
&lt;strong&gt;Interfaces&lt;/strong&gt; are identified using the “interface” keyword. It contains function signatures without the function definition implementation. It can be used in a contract to call functions in another contract.&lt;br&gt;
&lt;strong&gt;Event&lt;/strong&gt; can be emitted in a specific function and the log can be seen in decoded output of each function call.&lt;br&gt;
&lt;strong&gt;State variables&lt;/strong&gt; are those whose values are permanently stored in a contract storage. &lt;a href="https://docs.soliditylang.org/en/v0.6.5/contracts.html#constant-and-immutable-state-variables" rel="noopener noreferrer"&gt;Immutable&lt;/a&gt; state variables cannot be modified after the contract has been constructed.&lt;br&gt;
A &lt;strong&gt;constructor&lt;/strong&gt; is executed upon contract creation, and where we initialize the newly created NFT address, NFT ID, seller (that is contract owner &lt;code&gt;account[0]&lt;/code&gt;) and the initial bid.&lt;br&gt;
NFT ownership will be transferred from the contract owner to this contract when seller clicking "start" to execute &lt;code&gt;start()&lt;/code&gt; function. 60 seconds is specified as the bidding period. You can always modify it as a longer time. When the bidding process started, users can send their bids with specific value by executing &lt;code&gt;bid()&lt;/code&gt;.&lt;br&gt;
Function end() is used to terminate the bidding process and withdraw is to withdraw bids from this contract.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Testing process
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://remix.ethereum.org/" rel="noopener noreferrer"&gt;Remix&lt;/a&gt; is used for contract testing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 - Deploy the ERC721.sol contract. &lt;a href="https://github.com/hyc0812/solidity-essentials/blob/main/ERC721.sol" rel="noopener noreferrer"&gt;findSouceCodeHere&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mint the NFT ownership to &lt;code&gt;account[0]&lt;/code&gt; by pasting the address(0), and specifying the &lt;code&gt;nftId&lt;/code&gt; as your lucky number:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5ehlt914iynm8bo6iz4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5ehlt914iynm8bo6iz4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 - Deploy the EnglishAuction.sol contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ERC721 contract address, &lt;code&gt;nftId&lt;/code&gt; and starting bids are needed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbhslepvcbgvah5vcntg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbhslepvcbgvah5vcntg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 - Approval for NFT ownership transmission
Contract ERC721 needs &lt;code&gt;account[0]&lt;/code&gt; to approve that the contract EnglishAuction will be able to transfer the NFT ownership from the seller to the contract itself. contract address of EnglishAuction and nftId are needed:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0d4z96u9pq4ujs80i6hq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0d4z96u9pq4ujs80i6hq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 - Start the bidding process
The seller can start the process by clicking &lt;code&gt;start&lt;/code&gt;; other accounts can send bids with a specified amount of ETH:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97481gg0fot0cpydp944.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97481gg0fot0cpydp944.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 - Check the Bidder information and ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1i93sumhw1lv5czpgrz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1i93sumhw1lv5czpgrz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry0d87sa9v29l9kj97h8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry0d87sa9v29l9kj97h8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Git repository
&lt;/h3&gt;

&lt;p&gt;Welcome to visit the Git repo for source code, and feel free to reach me by leaving a message below or via email found in my profile. &lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hyc0812" rel="noopener noreferrer"&gt;
        hyc0812
      &lt;/a&gt; / &lt;a href="https://github.com/hyc0812/solidity-essentials" rel="noopener noreferrer"&gt;
        solidity-essentials
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Solidity programming baby examples...
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Solidity-Baby Steps...&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;The best path for earning Solidity is to approach examples.&lt;/p&gt;

&lt;p&gt;Here are baby examples. Typing one-by-one is recommended.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/yongchanghe/tutorial-play-with-an-auction-demo-based-on-erc721-3kpb" rel="nofollow"&gt;MyBlog&lt;/a&gt; explanation for using EnglishAuction and testing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://solidity-by-example.org/" rel="nofollow noopener noreferrer"&gt;examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=6aQErpWPLbk&amp;amp;t=2s" rel="nofollow noopener noreferrer"&gt;videoResource&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Example-1&lt;/h4&gt;
&lt;/div&gt;

&lt;p&gt;updateBalance &amp;amp; getBalance&lt;/p&gt;

&lt;div class="highlight highlight-source-solidity notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// SPDX-License-Identifier: GPL-3.0&lt;/span&gt;

&lt;span class="pl-k"&gt;pragma solidity&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="pl-c1"&gt;0.7.0&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-c1"&gt;0.9.0&lt;/span&gt;;

&lt;span class="pl-k"&gt;contract&lt;/span&gt; &lt;span class="pl-en"&gt;MyLedger&lt;/span&gt; {
    &lt;span class="pl-k"&gt;mapping&lt;/span&gt;(&lt;span class="pl-c1"&gt;address&lt;/span&gt; &lt;span class="pl-k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-c1"&gt;uint&lt;/span&gt;) &lt;span class="pl-k"&gt;public&lt;/span&gt; balances;
    &lt;span class="pl-k"&gt;function&lt;span class="pl-en"&gt; updateBalance&lt;/span&gt;&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;newBal&lt;/span&gt;) &lt;span class="pl-k"&gt;public&lt;/span&gt; {
        balances[&lt;span class="pl-c1"&gt;msg&lt;/span&gt;.&lt;span class="pl-c1"&gt;sender&lt;/span&gt;] &lt;span class="pl-k"&gt;=&lt;/span&gt; newBal;
    }
    &lt;span class="pl-k"&gt;function&lt;span class="pl-en"&gt; getBalance&lt;/span&gt;&lt;/span&gt;() &lt;span class="pl-k"&gt;public&lt;/span&gt; &lt;span class="pl-k"&gt;view&lt;/span&gt; &lt;span class="pl-k"&gt;returns&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt;) {
        &lt;span class="pl-k"&gt;return&lt;/span&gt; balances[&lt;span class="pl-c1"&gt;msg&lt;/span&gt;.&lt;span class="pl-c1"&gt;sender&lt;/span&gt;];
    }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Example-2&lt;/h4&gt;

&lt;/div&gt;

&lt;p&gt;Inherited from Square&lt;/p&gt;

&lt;div class="highlight highlight-source-solidity notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// SPDX-License-Identifier: GPL-3.0&lt;/span&gt;
&lt;span class="pl-k"&gt;pragma solidity&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="pl-c1"&gt;0.7.0&lt;/span&gt; &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-c1"&gt;0.9.0&lt;/span&gt;;

&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s"&gt;"&lt;span class="pl-s"&gt;@openzeppelin/contracts/utils/Strings.sol&lt;/span&gt;"&lt;/span&gt;;

&lt;span class="pl-k"&gt;contract&lt;/span&gt; &lt;span class="pl-en"&gt;Shape&lt;/span&gt; {
    &lt;span class="pl-c1"&gt;uint&lt;/span&gt; height;
    &lt;span class="pl-c1"&gt;uint&lt;/span&gt; width;

    &lt;span class="pl-k"&gt;constructor&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;_height&lt;/span&gt;, &lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;_width&lt;/span&gt;) {
        height &lt;span class="pl-k"&gt;=&lt;/span&gt; _height;
        width &lt;span class="pl-k"&gt;=&lt;/span&gt; _width;
    }
}

&lt;span class="pl-k"&gt;contract&lt;/span&gt; &lt;span class="pl-en"&gt;Square&lt;/span&gt; &lt;span class="pl-k"&gt;is&lt;/span&gt; &lt;span class="pl-en"&gt;Shape&lt;/span&gt; {
    &lt;span class="pl-k"&gt;constructor&lt;/span&gt;(&lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;h&lt;/span&gt;, &lt;span class="pl-c1"&gt;uint&lt;/span&gt; &lt;span class="pl-v"&gt;w&lt;/span&gt;) &lt;span class="pl-en"&gt;Shape&lt;/span&gt;(h, w) {}

    &lt;span class="pl-k"&gt;function&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hyc0812/solidity-essentials" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cryptomarketpool.com/interface-in-solidity-smart-contracts/#:%7E:text=An%20interface%20in%20Solidity%20behaves,order%20for%20it%20to%20operate" rel="noopener noreferrer"&gt;https://cryptomarketpool.com/interface-in-solidity-smart-contracts/#:~:text=An%20interface%20in%20Solidity%20behaves,order%20for%20it%20to%20operate&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://beincrypto.com/physical-nft-displays-becoming-the-new-rage-for-collectors/" rel="noopener noreferrer"&gt;CoverPage&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=ZeFjGJpzI7E" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ZeFjGJpzI7E&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>programming</category>
      <category>solidity</category>
      <category>nft</category>
    </item>
  </channel>
</rss>
