<?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>DEV Community: Edward Ezekiel</title>
    <description>The latest articles on DEV Community by Edward Ezekiel (@edezekiel).</description>
    <link>https://dev.to/edezekiel</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%2F109614%2F844b3d13-0f5f-42f7-9932-95116a392076.jpg</url>
      <title>DEV Community: Edward Ezekiel</title>
      <link>https://dev.to/edezekiel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edezekiel"/>
    <language>en</language>
    <item>
      <title>Live Stellar Wallet for Testing Smart Contracts</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Tue, 23 Jul 2019 21:04:51 +0000</pubDate>
      <link>https://dev.to/edezekiel/live-stellar-wallet-for-testing-smart-contracts-1ei2</link>
      <guid>https://dev.to/edezekiel/live-stellar-wallet-for-testing-smart-contracts-1ei2</guid>
      <description>&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AuNcG8cuQQI9zraR7tf5mdg.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AuNcG8cuQQI9zraR7tf5mdg.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am very happy to announce the &lt;a href="https://stellar-wallet.netlify.com/account" rel="noopener noreferrer"&gt;Live&lt;/a&gt; version of my open-source Stellar testnet wallet. Here is the code on &lt;a href="https://github.com/edezekiel/stellar-wallet" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is for Stellar enthusiasts and anyone working on stellar smart contracts. Below, I’ll (1) explain why this tool is useful, (2) discuss some background information about Stellar smart contracts, (3) provide short answers to some of the most challenging questions I faced during development, (4) give brief instructions on how to use this tool, and (5) list some resources that I found helpful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt; : &lt;em&gt;I built this as an educational experiment and the program has not been thoroughly tested.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Why Build this Stellar Tool?
&lt;/h3&gt;

&lt;p&gt;I work at a blockchain development company called &lt;a href="https://web3devs.com/" rel="noopener noreferrer"&gt;web3devs&lt;/a&gt;. We’re probably most well known for our work on Ethereum smart contracts, but we also work with Stellar smart contracts!&lt;/p&gt;

&lt;p&gt;Although Stellar.org explains the concepts behind &lt;a href="https://www.stellar.org/developers/guides/walkthroughs/stellar-smart-contracts.html" rel="noopener noreferrer"&gt;Mutisignature Escrow Account with Time Lock &amp;amp; Recovery&lt;/a&gt;, and provides &lt;a href="https://www.stellar.org/developers/js-stellar-base/reference/base-examples.html" rel="noopener noreferrer"&gt;example code&lt;/a&gt;for creating a multi-sig account, they do not show how to implement the time lock or recovery methods. &lt;strong&gt;With this post, I am releasing that code and a live demonstration of how it works.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Background Information
&lt;/h3&gt;

&lt;p&gt;Most applications interact with the Stellar network through Horizon, a RESTful HTTP API server. See &lt;a href="https://www.stellar.org/developers/guides/get-started/" rel="noopener noreferrer"&gt;Stellar.org&lt;/a&gt;. You use a SDK to interact with Horizon. I used the Javascript SDK.&lt;/p&gt;

&lt;p&gt;There are significant differences between Ethereum and Stellar smart contracts. For one thing, Ethereum smart contracts are written in Solidity, which is a Turing-complete language.&lt;/p&gt;

&lt;p&gt;In contrast, stellar smart contracts can only accomplish a limited set of tasks. You use a common programming language like JavaScript or Go to You interact with Horizon, which is an interface between Stellar Core and applications that want to access the Stellar network.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pernicious Bugs and Tricky Questions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Why Does My Transaction Keep Failing (Getting 400 Response from Horizon)?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You didn’t set the base fee:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const baseFee = await server.fetchBaseFee();

const transaction = new StellarSdk.TransactionBuilder(account, {
 fee: baseFee })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You didn’t load the account before building the transaction:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const account = await server.loadAccount(sourceKeys.publicKey());

const transaction = new StellarSdk.TransactionBuilder(account, { fee: baseFee })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Why can’t I submit the Unlock XDR to Horizon?
&lt;/h4&gt;

&lt;p&gt;You may be trying to submit the XDR too early. The unlock XDR can only be submitted &lt;em&gt;after&lt;/em&gt; the lock-up period is over. This is a little confusing, because you have to create the unlock transaction &lt;em&gt;before&lt;/em&gt; the lock-up period is over.&lt;/p&gt;

&lt;p&gt;The solution is signing the unlock transaction, and saving that transaction somewhere publicly. Only submit the unlock xdr to Horizon once the lock up period is over.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try {
 // Save as an XDR string
 const transactionXDR = transaction
 .toEnvelope()
 .toXDR()
 .toString("base64");
 console.log("FN: unlock", "Success! Results:", transactionXDR);
 return transactionXDR;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  How do I set Timebounds?
&lt;/h4&gt;

&lt;p&gt;It was not easy to figure out the syntax for setting timebounds. Here is what finally worked for me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// The unlock date (D+T) is the first date that the unlock transaction can be
 // submitted. If Transaction 3 (this transaction) is submitted before the
 // unlock date, the transaction will not be valid.

const transaction = new StellarSdk.TransactionBuilder(escrowAccount, {
 fee: baseFee,
 timebounds: {
 minTime: (
 Math.floor(Date.now() / 1000) + parseInt(unlockTx.unlockDate)
 ).toString(),
 // The maximum time is set to 0, to denote that the transaction does not have
 // an expiration date.
 maxTime: (0).toString()
 },
 sequence: (parseInt(escrowAccount.sequence) + 1).toString()
 })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Instructions
&lt;/h3&gt;

&lt;p&gt;In order to use this tool you’ll need to create at least two testnet accounts. You can make new accounts within the tool by clicking the “Create Stellar Account” button. Just take note of the public and private keys that pop up in the header. You can also use these pre-made test accounts:&lt;/p&gt;

&lt;h4&gt;
  
  
  Seller/Destination
&lt;/h4&gt;

&lt;p&gt;Public Key: GCHVXWBLCPWRMAF7QNKPB22JJX6VYTMX2JQ5XAVMEM6PD5HRHF42EZIC SecretKey: SAI2UOI47OBALUI4YAUVPZ3QN3LTYM5CXP3MEKGQR64OWVSLT6M7Q2VK&lt;/p&gt;

&lt;h4&gt;
  
  
  Buyer
&lt;/h4&gt;

&lt;p&gt;Public Key: GDEJU3BKAPMDP3SAXEE5C5T2IE6363ZSZMR7SS3YZTOQJZ3L24YJSZ4G Secret Key: SDCS7UCINHWVEWFUNHRXZRUU5WQ7ZAIPHXQNED4IBQ2U6Y45W72U22ST&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; these are test accounts so no real money is involved. You should never post a secret key to an account on the public stellar server.&lt;/p&gt;

&lt;p&gt;You can image one account as a “seller” (the Destination), and another as a “buyer”. The buyer creates the escrow account and adds the seller (Destination) as a signer. When the lockout period expires the seller can use the XDR to “unlock” funds in the escrow account.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Resources:
&lt;/h3&gt;

&lt;p&gt;Here are some of the resources I found helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.stellar.org/laboratory/" rel="noopener noreferrer"&gt;Stellar Laboratory:&lt;/a&gt;I constantly had this tab open to test various operations, transactions, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/wearetheledger/stellar-escrow-smart-contract-development-4c43ef32ac4b" rel="noopener noreferrer"&gt;Michiel Mulders Article:&lt;/a&gt; Helps you get a little more familiar with the concept of account signers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/coinmonks/simple-escrow-contract-using-stellar-67aa799f7db" rel="noopener noreferrer"&gt;Sylvain Faucherand Article:&lt;/a&gt; Covers a basic escrow account, but doesn’t address how to make it time-locked.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hackernoon.com/i-just-wrote-a-stellar-smart-contract-pt-2-lets-dive-a-little-deeper-a8dae19b9d0a" rel="noopener noreferrer"&gt;Robert Durst Article:&lt;/a&gt; If you’re still scratching your head about account signatures.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>stellar</category>
    </item>
    <item>
      <title>Coding Tips For New Web Developers</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Wed, 26 Jun 2019 16:01:42 +0000</pubDate>
      <link>https://dev.to/edezekiel/coding-tips-for-new-web-developers-3hh</link>
      <guid>https://dev.to/edezekiel/coding-tips-for-new-web-developers-3hh</guid>
      <description>&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A8SQPvwOQJi9jDG73yhP5-g.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A8SQPvwOQJi9jDG73yhP5-g.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you follow my blog you know that I recently graduated from a coding bootcamp and started work as a web developer.&lt;/p&gt;

&lt;p&gt;I can’t believe I’ve been on the job about a month already! Here are some of the tips and pitfalls I’ve come across during my first month.&lt;/p&gt;

&lt;h3&gt;
  
  
  React Hooks are Amazing
&lt;/h3&gt;

&lt;p&gt;The first project I worked at at web3devs used React Hooks extensively. Before working at web3devs I had been putting off learning hooks. I didn’t see the point of adding Hooks when React already seemed to work fine.&lt;/p&gt;

&lt;p&gt;After using hooks for a few weeks, I intend on using them in every React project moving forward. I love being able to forget about class components. My favorite part about JavaScript is the emphasis on functional programming. React hooks do a great job of building on top of this programming style.&lt;/p&gt;

&lt;p&gt;I find that my components are more composable, flexible, and fun to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML5 has a Built-in API for Form Validation, But Use Cases Are Limited.
&lt;/h3&gt;

&lt;p&gt;If you’ve ever added required to an input field, then you've used HTML5's built-in api for form validation. required is a simple way to prevent a user from submitting a form if they, e.g., forgot to enter their email in the form. If the use clicks submit, a standard message will pop up telling the user that the field is required.&lt;/p&gt;

&lt;p&gt;However, using the native HTML5 form validation causes some issues when you’re working in a react project. Specifically, it gives the browser’s DOM control over input fields (making it an uncontrolled component), whereas most react forms should use the virtual DOM (making it a controlled component).&lt;/p&gt;

&lt;p&gt;One of my favorite bloggers, &lt;a href="https://dev.to/flaviocopes/handling-forms-in-react-4dnd-temp-slug-2218922"&gt;Flavio Copes&lt;/a&gt;, eloquently explains the importance of controlled components:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;There are two main ways of handling forms in React, which differ on a fundamental level: how data is managed.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;if the data is handled by the DOM, we call them uncontrolled components&lt;/li&gt;
&lt;li&gt;if the data is handled by the components we call them controlled components&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;As you can imagine, controlled components is what you will use most of the time.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sonny Recio &lt;a href="https://codeburst.io/how-to-use-html5-form-validations-with-react-4052eda9a1d4" rel="noopener noreferrer"&gt;explains&lt;/a&gt; that “[w]e’re potentially violating React’s design patterns while doing so as we’re accessing the DOM properties using native javascript.”&lt;/p&gt;

&lt;p&gt;My personal approach is to add required to a form input, then use the .checkValidity() api in the handleSubmit function.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use git mv To Rename and Move Files
&lt;/h3&gt;

&lt;p&gt;The toughest bug I’ve ran into so far was a git merge issue caused because I didn't use git mv. Using git mv to rename and move files lets you be explicit about your intention and helps to avoid some errors.&lt;/p&gt;

&lt;p&gt;Here is a fantastic &lt;a href="https://koukia.ca/rename-or-move-files-in-git-e7259bf5a0b7" rel="noopener noreferrer"&gt;article on git mv&lt;/a&gt; explaining this issue. And no I didn’t find this article until after I resolved the bug. 😞.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git projects are case-insensitive by Default.
&lt;/h3&gt;

&lt;p&gt;When you initialize git in a project directory it automatically creates a config file. In that config file, you will see a line that says ignorecase = true. This means that if you rename a folder from "Components" to "components", on GitHub the folder will still be called "Components."&lt;/p&gt;

&lt;p&gt;This issue came up simultaneously with my git mv bug, which lead to some very interesting behavior.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>github</category>
      <category>git</category>
      <category>html</category>
    </item>
    <item>
      <title>̶T̶O̶D̶O̶:̶  Become a Web Developer</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Sat, 01 Jun 2019 16:50:06 +0000</pubDate>
      <link>https://dev.to/edezekiel/t-o-d-o-become-a-web-developer-1gi6</link>
      <guid>https://dev.to/edezekiel/t-o-d-o-become-a-web-developer-1gi6</guid>
      <description>&lt;h3&gt;
  
  
  ̶T̶O̶D̶O̶:̶ Become a Web Developer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zMX7fHUv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Av3uRGuPxxV1F8A0DpnDo5Q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zMX7fHUv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Av3uRGuPxxV1F8A0DpnDo5Q.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One year ago I was employed as an attorney in Atlanta, GA. Since then I’ve quit my job, completed an immersive software engineering bootcamp, moved to Memphis, TN, &lt;em&gt;become a father&lt;/em&gt;, and signed a contract to work as a software engineer at an amazing Blockchain Development firm in Memphis, TN.&lt;/p&gt;

&lt;p&gt;I’ve already &lt;a href="https://www.edezekiel.com/about"&gt;written&lt;/a&gt; about why I transitioned from law to software engineering. This post is my chance to thank everyone who supported me, share a few lessons I learned along the way, and dream about what comes next.&lt;/p&gt;

&lt;h3&gt;
  
  
  I Couldn’t Have Done It Alone
&lt;/h3&gt;

&lt;p&gt;I am incredibly grateful to my family, friends, and colleagues who supported me throughout this transition. I could not have done it without them.&lt;/p&gt;

&lt;p&gt;First, I want to thank my wife Farley Ezekiel. She was supportive every step of the way. Changing careers is a scary move, especially with a newborn on the way, but Farley believed in me and encouraged me to follow my dreams.&lt;/p&gt;

&lt;p&gt;On top of that Farley gave me the most incredible gift I could ask for, the gift of fatherhood (just in time for Father’s Day):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BYiiViwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/240/0%2AUEBSIEYD8qrjnZhc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BYiiViwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/240/0%2AUEBSIEYD8qrjnZhc.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, thank you to my mom and to parents-in-law. Farley and I could not have made the move to Memphis when we did without their support.&lt;/p&gt;

&lt;p&gt;Third, thank you to all the amazing instructors and staff at Flatiron ( Tammy, Brit, Rob, Emily, Ronny, Tez, Garry, …), my cohort (Kwam, Andy, Kaeland, Will, Cory, Blair, Paris), and my career advisory Mitzi. Each of you inspired me to do better and gave me the skills to accomplish my goals.&lt;/p&gt;

&lt;p&gt;Finally, thank you web3devs, for taking the chance on a bootcamp grad without a CS degree.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Try Before You Buy:&lt;/strong&gt; before I enrolled in a software development bootcamp, I tried out Udemy courses, learning material from other bootcamps, Free Code Camp, and other (mostly) free sources. Ultimately I felt like I learned best using Flatiron’s platform so I went with them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invest in Relationships:&lt;/strong&gt; The job I start on Monday was never posted. I got it because I developed meaningful relationships with software developers in my job market.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don’t Be Afraid:&lt;/strong&gt; there are lots of scary parts about starting a bootcamp or a career in software development. Will I be good at it? Will I fit in with the community? Will I like it? If you are really curious about programming and want to learn more, don’t let these doubts stop you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post Up:&lt;/strong&gt; I think this is true no matter what field you are in — if you want to be successful you have to put in the work. This also applies to your personal relationships. Make time for your friends and family, especially when things get tough.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Looking Ahead
&lt;/h3&gt;

&lt;p&gt;There are so many things I want to learn going forward. I am particularly interested in developing static sites, using serverless features like AWS lamda, and learning the Express framework.&lt;/p&gt;

&lt;p&gt;I also hope to give back to the programming community and to Memphis. If you are just starting your journey in software development I would be happy to talk. Just reach out using one of the social media icons on this site.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>webdev</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Building a Blazing Fast JAMstack App</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Fri, 24 May 2019 16:58:24 +0000</pubDate>
      <link>https://dev.to/edezekiel/building-a-blazing-fast-jamstack-app-18c0</link>
      <guid>https://dev.to/edezekiel/building-a-blazing-fast-jamstack-app-18c0</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9vVQZcQ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A8XmZG7BvPBLbfrSBBDvHDQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9vVQZcQ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A8XmZG7BvPBLbfrSBBDvHDQ.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I recently attended a meetup in Memphis hosted by Bryan Robinson. He is an accomplished web developer with a focus on &lt;a href="https://bryanlrobinson.com/blog/2019/04/26/client-work-and-the-jamstack/"&gt;creating static sites&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This got me excited to finally build my own static site using JAMstack architecture! So, I built this &lt;a href="https://zealous-thompson-59a9ca.netlify.com/"&gt;blog template (live)&lt;/a&gt; using GatsbyJS and Netlify. Here is the &lt;a href="https://github.com/edezekiel/gatsby-netlify-blog"&gt;Github Repo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lighthouse Audit
&lt;/h3&gt;

&lt;p&gt;I am very pleased with how the site turned out. I used the Lighthouse tool to audit the gatsby site and my blog. Lighthouse is built into the chrome browser. It is a great automated tool for performing webpage audits.&lt;/p&gt;

&lt;p&gt;Here are the results:&lt;/p&gt;

&lt;h3&gt;
  
  
  Lighthouse scores for my React/Rails blog:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BpxOjkcF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/640/1%2AjaM-rwhBSKDpfTu-FqxVHg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BpxOjkcF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/640/1%2AjaM-rwhBSKDpfTu-FqxVHg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The scores are not terrible, but there is definitely room for improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lighthouse scores for the JAMstack site:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uYMNFODx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/640/1%2AsPTYh9gXL2i5jvA3uR0wrw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uYMNFODx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/640/1%2AsPTYh9gXL2i5jvA3uR0wrw.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The JAMstack site almost scores perfectly across the Lighthouse metrics. Navigating through the site reflects these scores: pages loading blazingly fast and it generally feels crisp.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;If you are interesting in exploring JAMstack further, here are some of resources I used while learning about this topic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://jamstack.wtf/#getting-started"&gt;WTF is JAMstack?&lt;/a&gt; a straightforward primer on the JAMstack architecture.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gatsbyjs.org/tutorial/"&gt;Gatsby Tutorial&lt;/a&gt;: This will walk you through your first Gatsby app. There are plenty of “starters” on the site to help you get your first site up and running. I personally used the &lt;a href="https://github.com/gatsbyjs/gatsby-starter-default"&gt;gatsby default starter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.taniarascia.com/migrating-from-wordpress-to-gatsby/"&gt;Tania Rascia&lt;/a&gt;: aka my web dev hero.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontenddev</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Looping Using ES6 Syntax (JavaScript)</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Fri, 17 May 2019 21:49:35 +0000</pubDate>
      <link>https://dev.to/edezekiel/looping-using-es6-syntax-javascript-4b1</link>
      <guid>https://dev.to/edezekiel/looping-using-es6-syntax-javascript-4b1</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DdMcrsMP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AXCvcHF70YhwT6wReeG1_MA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DdMcrsMP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AXCvcHF70YhwT6wReeG1_MA.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript Loops Using for...of and for...in.
&lt;/h3&gt;

&lt;p&gt;Earlier this week I was working on a coding problem that involved looping through characters in strings. I wanted to loop over all the characters in two strings to determine whether they were anagrams. This kind of task is common in technical interview situations.&lt;/p&gt;

&lt;p&gt;This made me take a closer look at Javascript for loops. I was especially interested in the for...of and for...in loops, so I wrote this post to share what I found out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Looping Through Elements in a String using for...of
&lt;/h3&gt;

&lt;p&gt;So, what’s a good way to loop through characters in a string? One approach is to use a traditional for loop:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;for (let i = 0; i &amp;lt; string.length; i++) {console.log(string.charAt(i))}&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This kind of for loop has been around in Javascript since its inception twenty years ago. However, ES6 introduced some spiffy new syntax.&lt;/p&gt;

&lt;p&gt;Since the introduction of ES6, you can use a for...of loop:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;for (character of string) {console.log(character)}&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isn’t the for...of statement much easier to read than the traditional for loop! It also requires less typing, which means less room for error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are for...of and for...in Interchangeable?
&lt;/h3&gt;

&lt;p&gt;TLDR: No, they iterate over different things.&lt;/p&gt;

&lt;p&gt;Per MDN:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The&lt;/em&gt; &lt;em&gt;for...of statement iterates over values that the&lt;/em&gt; &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Iterables"&gt;&lt;em&gt;iterable object&lt;/em&gt;&lt;/a&gt; &lt;em&gt;defines to be iterated over.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The&lt;/em&gt; &lt;em&gt;for...in statement iterates over the&lt;/em&gt; &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties"&gt;&lt;em&gt;enumerable properties&lt;/em&gt;&lt;/a&gt; &lt;em&gt;of an object, in an arbitrary order.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What is an iterable object?
&lt;/h3&gt;

&lt;p&gt;An object is &lt;strong&gt;iterable&lt;/strong&gt; if it defines its iteration behavior, such as what values are looped over in a for...of construct.&lt;/p&gt;

&lt;p&gt;An object defines its iteration behavior when the object (or one of its prototypes up its prototype chain) has a property with a Symbol.iterator key.&lt;/p&gt;

&lt;p&gt;Here are Javascript’s built-in Iterables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;Array&lt;/li&gt;
&lt;li&gt;TypedArray&lt;/li&gt;
&lt;li&gt;Map&lt;/li&gt;
&lt;li&gt;Set&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What are enumerable properties of an object?
&lt;/h3&gt;

&lt;p&gt;According to MDN, enumerable properties are those &lt;em&gt;properties&lt;/em&gt; whose internal enumerable flag is set to true.&lt;/p&gt;

&lt;p&gt;This was a little cryptic to me at first glance. How can you tell whether an internal enumerable flag is set to true for a property?&lt;/p&gt;

&lt;p&gt;Well, it turns out that there is a method baked right into the Object.prototype that answers this question. The method is called propertyIsEnumerable().&lt;/p&gt;

&lt;p&gt;Once again MDN has a great example demonstrating how to use this method to check whether a specified property is enumerable. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable"&gt;Here&lt;/a&gt; is a link to MDN’s example.&lt;/p&gt;

&lt;h3&gt;
  
  
  Back to My Example
&lt;/h3&gt;

&lt;p&gt;Let’s take a look back at our example to confirm whether for...of and/or for...in works:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;let myString = "valar morghulis"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"hello world"&lt;a href=""&gt;Symbol.iterator&lt;/a&gt;&lt;br&gt;&lt;br&gt;
// StringIterator {}&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;console.log(myString.propertyIsEnumerable([1]))&lt;br&gt;&lt;br&gt;
// true&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As demonstrated above, strings have the Symbol.iterator method. In addition, strings are also indexed by character. Thus, you can usefor...of orfor...in to iterate over characters in string.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>frontenddev</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Javascript Testing With Mocha</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Sat, 04 May 2019 20:47:10 +0000</pubDate>
      <link>https://dev.to/edezekiel/javascript-testing-with-mocha-25e8</link>
      <guid>https://dev.to/edezekiel/javascript-testing-with-mocha-25e8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iDU8X6PX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AEgEulBNpsN6Nw_bwy33NKA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iDU8X6PX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AEgEulBNpsN6Nw_bwy33NKA.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Javascript Testing
&lt;/h3&gt;

&lt;p&gt;One of my favorite parts about going to a coding bootcamp was all the automated tests. It was incredibly helpful to see whether my code contained errors, and to get hints about what might be causing those errors.&lt;/p&gt;

&lt;p&gt;Now that I’ve graduated it’s up to me to write those tests for my own projects!&lt;/p&gt;

&lt;p&gt;I had written some Ruby tests using Capybara, so now I wanted to try my hand at writing Javascript tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mocha
&lt;/h3&gt;

&lt;p&gt;In honor of “May the 4th Be With You” my alternative title for this post is “May the Mocha Be With You.” I found that Mocha was easy to get up and running and a pleasure to use.&lt;/p&gt;

&lt;p&gt;Mocha is a Javascript testing framework. It works for testing JS in the browser, as well as JS that is executed in a node JS environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  My First Mocha Test
&lt;/h3&gt;

&lt;p&gt;I decided to write a Mocha test that would be executed in the node JS environment.&lt;/p&gt;

&lt;p&gt;Here is the code:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Require the built in 'assertion' library
 var assert = require('assert');

describe('Compare', function() {
 describe('Star Wars Quotes', function() {
 it('should test whether two data types are equivalent ', function() {
 assert.equal(true, typeof "May the Fourth Be With You" === typeof "Help me Obi Wan Kenobi, you're my only hope")
 })
 })
 })
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This test passes, because both operands are strings, so function will return the expected output of true.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;p&gt;The Getting Started guide on &lt;a href="https://mochajs.org/#getting-started"&gt;mochajs.org&lt;/a&gt; has very basic instructions on how to get your first Mocha test running.&lt;/p&gt;

&lt;p&gt;However, I kept getting an error message about my package.json file whenever I tried to run “npm test.” The error message claimed “no such file or directory” existed. Eventually I ran the command “npm init” from within the project directory. That created a package.json file within my project directory and that fixed the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;There are a lot of great resources out there to learn Mocha if you are interested. Of course, there is the official documentation at &lt;a href="https://mochajs.org/#getting-started"&gt;mochajs.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is also a more in-depth tutorial on medium by &lt;a href="https://codeburst.io/how-to-test-javascript-with-mocha-the-basics-80132324752e"&gt;codeburst&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>mocha</category>
    </item>
    <item>
      <title>Agile Software Development</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Sat, 27 Apr 2019 22:16:47 +0000</pubDate>
      <link>https://dev.to/edezekiel/agile-software-development-5ckf</link>
      <guid>https://dev.to/edezekiel/agile-software-development-5ckf</guid>
      <description>&lt;p&gt;I had a great time attending the Agile Memphis meetup this past week. It was presented by Robert Newman, Lean Agile Coach and IT Leader at FedEx. Robert focused his presentation on tips for becoming a better agile SAFe coach. SAFe stands for the Scaled Agile Framework. More on that later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M1RDiHCf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AixIQ3RbkbRkljSypoiKmWQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M1RDiHCf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AixIQ3RbkbRkljSypoiKmWQ.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My Experience With Agile
&lt;/h3&gt;

&lt;p&gt;Agile development was &lt;em&gt;the&lt;/em&gt; way we built software at Flatiron. We implemented Test Driven Development, Kanban Boards, Standup Meetings, and wireframing throughout the program. I used these methods to build each of my major projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Agile Development?
&lt;/h3&gt;

&lt;p&gt;I recently listened to a podcast by Javascript Jabber on this topic. &lt;a href="https://devchat.tv/js-jabber/jsj-349-agile-development-the-technical-side-with-james-shore/"&gt;Here&lt;/a&gt; is a link to the episode. The episode guest stars James Shore, agile developer extraordinaire.&lt;/p&gt;

&lt;p&gt;James Shore spent a fair amount of time discussing the evolution of Agile development. It was created in 2001 with the publication of the &lt;a href="https://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;. I definitely recommend this podcast if you are interested in the topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  SAFe Coaching
&lt;/h3&gt;

&lt;p&gt;Back to the meetup and SAFe, Robert described coaching frameworks and shared stories from his work as a SAFe coach. I especially enjoyed hearing about the distinction between a manager and a coach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Agile software development is a practice that I will continue to practice throughout my dev journey. I am especially interested in getting practice writing more tests for React programs.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>coaching</category>
      <category>agile</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>CSS-Only Responsive Navigation Menu</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Sat, 30 Mar 2019 23:24:04 +0000</pubDate>
      <link>https://dev.to/edezekiel/css-only-responsive-navigation-menu-4nef</link>
      <guid>https://dev.to/edezekiel/css-only-responsive-navigation-menu-4nef</guid>
      <description>&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AQPc-flKSRuY7awoB4bbSXQ.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AQPc-flKSRuY7awoB4bbSXQ.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This week I focused on my CSS skills by building a responsive navigation bar without using Javascript.&lt;/p&gt;

&lt;p&gt;I’m really happy with how this project turned out! Here is a link to the &lt;a href="https://codepen.io/edezekiel/pen/drrQzP?editors=1100" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;. It’s obviously not a full-fledged website, but I’ve wanted to build this kind of navbar ever since I started this blog.&lt;/p&gt;

&lt;p&gt;The full desktop view displays a standard navbar links to various pages. If you view the site on a mobile device or if you shrink your browser window, you’ll see that the navbar shrinks to the “hamburger” button style.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Project? Why No Javascript?
&lt;/h3&gt;

&lt;p&gt;At Flatiron, we mostly used CSS frameworks like semantic UI or Bulma for navigation menu bars. I wanted to see what it would be like to implement a responsive navbar from scratch.&lt;/p&gt;

&lt;p&gt;I decided not to use Javascript as a bit of a challenge. I just thought it would be fun to see what kind of advanced features I could build with CSS and HTML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexbox
&lt;/h3&gt;

&lt;p&gt;Flexbox does a lot of the heavy lifting for this project. If you haven’t used Flexbox before, or just need a refresher, I definitely recommend this &lt;a href="https://flexboxfroggy.com/" rel="noopener noreferrer"&gt;game&lt;/a&gt; and this &lt;a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/" rel="noopener noreferrer"&gt;site&lt;/a&gt; to get started.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does the “Hamburger” Menu Work Without JS?
&lt;/h3&gt;

&lt;p&gt;The trick here has a few parts. First, add checkbox and label tags to the HTML. For the label I used the HTML unicode #9776. This is technically called the “Trigram for Heaven” glyph, but people generally recognize it as the “hamburger icon.”&lt;/p&gt;

&lt;p&gt;Next, set the display for these elements to “none” in the stylesheet. After that, create a CSS media query for smaller screens, e.g., when the client is a mobile phone. On smaller screens the media query hides the navlinks and reveals the hamburger icon.&lt;/p&gt;

&lt;p&gt;Clicking the hamburger icon toggles the navlinks back to flexbox display. However, the nav’s position is fixed, and the navlinks flex-direction is set to “column.” Taken together, this results in a hamburger menu that pops out navigation links.&lt;/p&gt;

</description>
      <category>css</category>
      <category>ux</category>
      <category>webdev</category>
      <category>ui</category>
    </item>
    <item>
      <title>Memphis Smart City Hackathon</title>
      <dc:creator>Edward Ezekiel</dc:creator>
      <pubDate>Fri, 22 Mar 2019 17:34:41 +0000</pubDate>
      <link>https://dev.to/edezekiel/memphis-smart-city-hackathon-28j</link>
      <guid>https://dev.to/edezekiel/memphis-smart-city-hackathon-28j</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_zIN166V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AJKAmbX_zcMCuA7Fbt5_DuQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_zIN166V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AJKAmbX_zcMCuA7Fbt5_DuQ.jpeg" alt="" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Attending a Hackathon
&lt;/h3&gt;

&lt;p&gt;I participated in my first Hackathon last weekend! It was Memphis’ “Smart City” Hackathon. I coded with a group of blockchain developers from web3devs on project we called “BlockSaver.” Here is the &lt;a href="https://github.com/edezekiel/blocksaver"&gt;Github&lt;/a&gt; link.&lt;/p&gt;

&lt;p&gt;The Hackathon theme was transportation and mobility, with a special focus on pedestrian safety. There are dozens of pedestrian deaths each year in Memphis.&lt;/p&gt;

&lt;p&gt;I was blown away by what the groups came up with. One team designed a video surveillance system so that buses can “see” and record potholes in the road. Another group developed a system to to light up crosswalks automatically whenever a person walks by.&lt;/p&gt;

&lt;h3&gt;
  
  
  BlockSaver
&lt;/h3&gt;

&lt;p&gt;My team created a web app called BlockSaver, which lets users geotag and report pedestrian safety issues like broken sidewalks. I built a substantial part of the frontend using React and basic CSS. That’s right, we did not use a CSS framework for the app. I thought this would be a great opportunity to improve some of my basic CSS skills. I wound up using Flexbox a lot and I really enjoyed the experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  BlockChain
&lt;/h3&gt;

&lt;p&gt;As I mentioned above, I worked on the project with a group of blockchain developers. So, of course our app had some awesome blockchain integration. They created an ERC20 smart contract on the Ethereum network that is tied to our app. Whenever someone submits a pedestrian safety report, the smart contract creates a transaction on the blockchain system, and gives the user a token.&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>javascript</category>
      <category>ethereum</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
