<?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: Jennifer Tieu</title>
    <description>The latest articles on DEV Community by Jennifer Tieu (@jennifertieu).</description>
    <link>https://dev.to/jennifertieu</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%2F579901%2F2caeef18-2c91-49d0-bd8a-bba15cd86fc1.JPG</url>
      <title>DEV Community: Jennifer Tieu</title>
      <link>https://dev.to/jennifertieu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jennifertieu"/>
    <language>en</language>
    <item>
      <title>Self-Taught Developer Journal, Day 63: I Quit My First Developer Job</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Wed, 15 Mar 2023 01:30:06 +0000</pubDate>
      <link>https://dev.to/jennifertieu/self-taught-developer-journal-day-63-i-quit-my-first-developer-job-l8o</link>
      <guid>https://dev.to/jennifertieu/self-taught-developer-journal-day-63-i-quit-my-first-developer-job-l8o</guid>
      <description>&lt;p&gt;I quit my first junior software developer job. &lt;/p&gt;

&lt;p&gt;About a year ago, I started &lt;a href="https://dev.to/jteacodes/starting-my-self-taught-developer-journey-2dga"&gt;documenting my journey&lt;/a&gt; learning web development.  &lt;/p&gt;

&lt;p&gt;Although it was difficult at the time to write almost every day, I found it incredibly rewarding. The experience made me want to continue writing and has compelled me to want to write about how I quit my first developer job, even though I find it nerve-wracking to share. &lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;To start, I want to clarify that I love the people I worked with and hold no ill will towards anyone. I joined the company knowing and working with some people from my previous jobs. So I felt comfortable joining the company and was excited and thankful for the opportunity. It honestly felt like a dream come true. I got to work in my dream career with people I liked. I learned so much about development. I remember in the beginning how lost and overwhelmed I was. It probably didn't help I wasn't that far into my studies before starting the job. But sometimes, you need to be thrown into the deep end to learn. &lt;/p&gt;

&lt;p&gt;In my short time there, I learned about Node, Express, Bootstrap, SASS, JavaScript template engines, SQL stored procedures, etc. I developed and deployed a web application on a Linux server. I recreated a WordPress website. I created a login page against a client's API for their internal training site. &lt;strong&gt;I would have never had these experiences if I didn't take the opportunity.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;So, if my co-workers or boss ever end up reading this, I hope you know how thankful I am. Thank you for helping me and guiding me. Also, thank you for the fun memories and laughs. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why did I choose to leave?
&lt;/h2&gt;

&lt;p&gt;Ultimately, it wasn't the right fit for me anymore. In a small company with many clients, it was hard to receive time with the other developers for mentorship and collaboration. The initial excitement wore off, and I was unsure if this was where I wanted to be. I also eventually felt stagnation in my own growth. While I mentally wrestled with the decision to leave, I contacted close friends for advice. I also began to look for other jobs. &lt;/p&gt;

&lt;p&gt;As time passed, it became harder mentally to stay. After much thought and discussion, I decided to leave, take a career break, and dedicate my time to pursuing new opportunities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I didn't take the decision lightly to leave&lt;/strong&gt;, especially without another opportunity. But I'm hopeful to figure out what's next and explore what I want to do. To improve my developer skills and build. To take the risk, so I can be better and find something that fits me. &lt;strong&gt;I love being a developer, and I want to excel at it.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I hope any other junior developers who find themselves in the same situation doesn't feel like they're alone. It's hard. You think the journey ends after the first job, but sometimes it doesn't, and that's okay. &lt;strong&gt;To be clear, I don't recommend quitting without weighing the risks and deciding if its the right decision for you if you find yourself in a similar situation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do I hope for in my next role?
&lt;/h2&gt;

&lt;p&gt;I'm not quite sure yet. I have an idea of things I enjoy and things I dislike. I hope to find somewhere to excel and grow professionally. I'll continue documenting my journey and building in public more. I'll be exploring what's out there and researching. I'll also be prepping and getting myself ready for the job hunt. Lastly, I'm hopeful for the future and what new adventure awaits.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introduction to Proof of Work and Mining</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Tue, 20 Dec 2022 05:04:11 +0000</pubDate>
      <link>https://dev.to/jennifertieu/proof-of-work-and-mining-13em</link>
      <guid>https://dev.to/jennifertieu/proof-of-work-and-mining-13em</guid>
      <description>&lt;p&gt;In this article, we will be learning about Proof of Work and Mining in the Alchemy University Ethereum Developer Bootcamp Week One course.&lt;/p&gt;

&lt;p&gt;Disclaimer: Most of the content below is a general summary and retelling of the information from the course.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consensus Mechanisms
&lt;/h2&gt;

&lt;p&gt;Before we talk about mining and proof of work, we need to understand what purpose they serve.&lt;/p&gt;

&lt;p&gt;Blockchain networks, like Ethereum, are made up of distributed and decentralized databases consisting of many nodes (computers). In a decentralized environment, it's difficult to validate and coordinate blockchain transactions.&lt;/p&gt;

&lt;p&gt;How do all nodes agree on the current and future state of user account balances and contract interactions?&lt;/p&gt;

&lt;p&gt;Who gets to add new blocks/transactions to a chain? How do we know any blocks added are "valid"?&lt;/p&gt;

&lt;p&gt;How the heck are all of these things coordinated without any central actor in place?&lt;/p&gt;

&lt;p&gt;The solution is &lt;strong&gt;consensus mechanisms&lt;/strong&gt; (consensus means a general agreement) which act as rules that the decentralized blockchain follows to stay in agreement over what is valid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A blockchain consensus is when at least 51% of nodes are in agreement over the current global state of the network.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Proof-of-work is the consensus mechanism used by Bitcoin and previously Ethereum before they switched to using proof-of-stake.&lt;/p&gt;

&lt;p&gt;An example of the main consensus rules for proof-of-work is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The "longest" chain will be the one the rest of the nodes accept as the one "true" chain, determined by a chain's cumulative work. Also known as &lt;strong&gt;Nakamoto Consensus&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You cannot double-spend.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Mining?
&lt;/h2&gt;

&lt;p&gt;Mining is the process of creating a block of transactions to be added to the blockchain.&lt;/p&gt;

&lt;p&gt;The nodes in the network with the mining software, or miners, are continuously trying to extend the chain with new blocks that contain valid transactions. The network will ask the miners for their "proof-of-work" before they can add a block.&lt;/p&gt;

&lt;p&gt;This "proof-of-work" is an output that &lt;strong&gt;must be lower&lt;/strong&gt; than the network target difficulty.&lt;/p&gt;

&lt;p&gt;A valid proof-of-work output currently looks like this in the Bitcoin network: 000000000000000000043f43161dc56a08ffd0727df1516c987f7b187f5194c6. It is a hash of the previous block header and new transactions to add to the chain.&lt;/p&gt;

&lt;p&gt;Here's what the proof-of-work mining algorithm looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take current block’s block header, add mempool transactions&lt;/li&gt;
&lt;li&gt;Append a nonce, starting at nonce = 0&lt;/li&gt;
&lt;li&gt;Hash data from #1 and #2&lt;/li&gt;
&lt;li&gt;Check hash versus target difficulty (provided by protocol)&lt;/li&gt;
&lt;li&gt;If hash &amp;lt; target, puzzle is solved! Get rewarded.&lt;/li&gt;
&lt;li&gt;Else, restart process from step #2, but increment nonce&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Performing these difficult calculations requires large amounts of energy and hardware upkeep required to run mining software. The incentive for miners to perform these algorithms regularly is currency as a reward. If the consensus rules are followed, making a secure network, miners get paid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In proof-of-work, miners must present a proof (in the form of a hash output on valid input data) that they expended energy in order to successfully "mine" a block and have it extend a blockchain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://university.alchemy.com/home" rel="noopener noreferrer"&gt;Alchemy University&lt;/a&gt;: Ethereum Developer Bootcamp&lt;/p&gt;

</description>
      <category>community</category>
      <category>beginners</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Public Key Cryptography: Hash Message, Sign Message, Recover Public Key, and Public Key Address</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Sun, 04 Dec 2022 20:38:44 +0000</pubDate>
      <link>https://dev.to/jennifertieu/public-key-cryptography-exercises-hash-message-sign-message-recover-public-key-and-public-key-address-2e1b</link>
      <guid>https://dev.to/jennifertieu/public-key-cryptography-exercises-hash-message-sign-message-recover-public-key-and-public-key-address-2e1b</guid>
      <description>&lt;p&gt;This article will be a walkthrough of Alchemy University Ethereum Developer Bootcamp Week One course Public Key Cryptography exercises. The exercises are practice for the concepts reviewed in the Public Key Cryptography lecture.&lt;/p&gt;

&lt;p&gt;Disclaimer: Most of the content below is a general summary and retelling of the information from the course. The exercise instructions are provided in the Alchemy course and the coding challenges are completed in the Alchemy IDE.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hashing Messages
&lt;/h1&gt;

&lt;p&gt;To use &lt;strong&gt;Elliptic Curve Digital Signature Algorithm (ECDSA)&lt;/strong&gt;, the first step is to hash the message before applying the signature algorithm. &lt;/p&gt;

&lt;p&gt;The signature algorithm would be using either your &lt;strong&gt;private key&lt;/strong&gt; or &lt;strong&gt;public key&lt;/strong&gt; to sign a hashed message.&lt;/p&gt;

&lt;p&gt;For example, if you wanted to vote on a proposal, you would hash the message then sign it with your private key. This would prove that the individual or group of a specific address voted on the proposal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// turn this into an array of bytes, the expected format for the hash algorithm
const bytes = utf8ToBytes("Vote Yes on Proposal 123");
// hash the message using keccak256
const hash = keccak256(bytes); 

console.log(toHex(hash)); // 928c3f25193b338b89d5646bebbfa2436c5daa1d189f9c565079dcae379a43be
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In web3, when you send a transaction to a blockchain you also sign a hashed representation of that transaction before sending it to a blockchain node.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exercise #1. Hash The Message
&lt;/h1&gt;

&lt;p&gt;The goal of the exercise is to return a hashed message using the &lt;strong&gt;keccak256&lt;/strong&gt; hash and &lt;strong&gt;utf8ToBytes&lt;/strong&gt; function provided by the &lt;strong&gt;ethereum-cryptography&lt;/strong&gt; library.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your first step is to take the string message passed in and turn it into an array of UTF-8 bytes. You can do so with the &lt;strong&gt;utf8ToBytes&lt;/strong&gt; function.&lt;/li&gt;
&lt;li&gt;Then take the &lt;strong&gt;keccak256&lt;/strong&gt; hash of those bytes and return this value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { keccak256 } = require("ethereum-cryptography/keccak");
const { utf8ToBytes } = require("ethereum-cryptography/utils");

function hashMessage(message) {
    // convert message to bytes for hash algorithm
    const bytes = utf8ToBytes(message);

    // return hashed message
    return keccak256(bytes);
}

module.exports = hashMessage;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Signing the Hash
&lt;/h1&gt;

&lt;p&gt;Now that we've converted the message to a hash message, we can sign it with our key.&lt;/p&gt;

&lt;p&gt;We will be using &lt;strong&gt;secp256k1&lt;/strong&gt; from the &lt;strong&gt;ethereum-cryptography&lt;/strong&gt; library to sign the message.   The signature will be returned with the recovery bit that will allow us to recover the public key from the signature. The recovery bit will enable the blockchain node to take a signature of a transaction and determine which address authenticated this particular transaction.&lt;/p&gt;

&lt;p&gt;A blockchain transaction indicates the intent of the person who signed it and &lt;strong&gt;also authenticates them through public key cryptography&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exercise #2. Sign The Message
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;To sign the message, we will first get the hash message using the &lt;strong&gt;hashMessage&lt;/strong&gt; function from the previous exercise.&lt;/li&gt;
&lt;li&gt;Then we will use the &lt;strong&gt;sign&lt;/strong&gt; method for &lt;strong&gt;secp256k1&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const secp = require("ethereum-cryptography/secp256k1");
const hashMessage = require('./hashMessage');

const PRIVATE_KEY = "6b911fd37cdf5c81d4c0adb1ab7fa822ed253ab0ad9aa18d77257c88b29b718e";

async function signMessage(msg) {
    // hash the message
    const hashMsg = hashMessage(msg);
    // sign the hash message with the private key and set recovered to true to get the recovered bit
    return secp.sign(hashMsg, PRIVATE_KEY, {recovered: true});
}

module.exports = signMessage;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The sign method will take the hash message along with the constant &lt;strong&gt;PRIVATE_KEY&lt;/strong&gt; declared at the top of the file. &lt;strong&gt;However, this is not good practice.&lt;/strong&gt; This private key is a valid key that could be used to authorize blockchain transactions. If it is published on the internet then anyone could use the key to authenticate with the private key. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;ethereum-cryptography&lt;/strong&gt; library uses &lt;strong&gt;&lt;a href="https://github.com/paulmillr/noble-secp256k1#signmsghash-privatekey" rel="noopener noreferrer"&gt;noble-secp256k1&lt;/a&gt;&lt;/strong&gt;. The detailed documentation is in the readme of &lt;strong&gt;&lt;a href="https://github.com/paulmillr/noble-secp256k1#signmsghash-privatekey" rel="noopener noreferrer"&gt;noble-secp256k1&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The sign method takes an optional third parameter called &lt;strong&gt;options&lt;/strong&gt;. Use this parameter to return the &lt;strong&gt;recovered bit&lt;/strong&gt; so that the public key can be recovered from this signature.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Recover the Public Key
&lt;/h1&gt;

&lt;p&gt;After the signature is provided with all of its components (recovery bit included), the public key can be recovered. Using the public key, the blockchain nodes will be able to determine who signed the transaction that was sent to them. &lt;/p&gt;

&lt;p&gt;For example, a transaction could indicate the user would like to send 1 ether to another address and provide a certain transaction fee. Since the signature signs the hash containing this request, it is enough to authenticate this action.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exercise #3. Recover The Key
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Given a message, signature, and recoveryBit find the public key and return it! Be sure to hash the message when passing it to the recovery method.
Note: Use the &lt;strong&gt;&lt;a href="https://github.com/paulmillr/noble-secp256k1#signmsghash-privatekey" rel="noopener noreferrer"&gt;noble-secp256k1&lt;/a&gt;&lt;/strong&gt; documentation to find the correct method and parameters for this one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const secp = require("ethereum-cryptography/secp256k1");
const hashMessage = require("./hashMessage");

async function recoverKey(message, signature, recoveryBit) {
    // hash message
    const hashMsg = hashMessage(message);
    // recover the public key by passing in the hash message, signature, and recovery bit
    return secp.recoverPublicKey(hashMsg, signature, recoveryBit);
}

module.exports = recoverKey;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Public Key to Address
&lt;/h1&gt;

&lt;p&gt;Both Bitcoin and Ethereum have a process to transform a public key and turn it into an address. For Bitcoin, it uses a checksum and Base58 encoding. For Ethereum, its address is the last 20 bytes of the public key hash.&lt;/p&gt;

&lt;p&gt;The address is different from the public key, but you can always derive the address if you have the public key.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exercise #4: Get Ethereum Address
&lt;/h1&gt;

&lt;p&gt;Let's get the Ethereum address from the public key.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First step, you'll need to take the &lt;strong&gt;first byte&lt;/strong&gt; off the public key. The &lt;strong&gt;first byte indicates the format of the key&lt;/strong&gt;, whether it is in the compressed format or not. The publicKey will be a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array" rel="noopener noreferrer"&gt;&lt;strong&gt;Uint8Array&lt;/strong&gt;&lt;/a&gt; so you can use the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice" rel="noopener noreferrer"&gt;slice method&lt;/a&gt; to slice off the first byte.&lt;/li&gt;
&lt;li&gt;Next, take the &lt;strong&gt;keccak&lt;/strong&gt; hash of the rest of the public key.&lt;/li&gt;
&lt;li&gt;Finally, take the last 20 bytes of the keccak hash and return this. Once again, you can make use of the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice" rel="noopener noreferrer"&gt;slice method&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const secp = require("ethereum-cryptography/secp256k1");
const { keccak256 } = require("ethereum-cryptography/keccak");

function getAddress(publicKey) {
    // slice of the first byte of the Uint8Array publicKey
    const sliceKey = publicKey.slice(1);

    // hash the rest of the public key =&amp;gt; returns a Uint8Array keccak256 hash
    const hashKey = keccak256(sliceKey);

    // return last 20 bytes of the Uint8Array keccak256 hash
    return hashKey.slice(-20);

}

module.exports = getAddress;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Resource:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://university.alchemy.com/" rel="noopener noreferrer"&gt;Alchemy University&lt;/a&gt;: Ethereum Developer Bootcamp&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/paulmillr/noble-secp256k1#signmsghash-privatekey" rel="noopener noreferrer"&gt;ethereum-cryptography noble-secp256&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>coding</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Public Key Cryptography</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Thu, 01 Dec 2022 05:05:42 +0000</pubDate>
      <link>https://dev.to/jennifertieu/public-key-cryptography-1b7n</link>
      <guid>https://dev.to/jennifertieu/public-key-cryptography-1b7n</guid>
      <description>&lt;p&gt;Continuing Alchemy University Ethereum Developer Bootcamp Week One course with public key cryptography.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: Most of the content below is a general summary and retelling of the information from the course.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Cryptography Historically
&lt;/h1&gt;

&lt;p&gt;Until the 1970s, cryptography was used to encrypt important messages, especially within the military. These messages could not be decrypted even if they were intercepted. An example would be moving each character in a string down one position in the alphabet: "abc" outputs "bcd".&lt;/p&gt;

&lt;p&gt;The sender would take the message and pass it through a function to create an encrypted output. But once you know secret to the function, the message was easy to crack.&lt;/p&gt;

&lt;p&gt;As cryptography advanced over the years, more complex functions were introduced. An important improvement was the idea of a &lt;strong&gt;secret key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If two parties meet prior to exchanging messages they can both agree upon a particular key. This key plus a function (like the alphabet shift example) could be used together to create a more secure encryption. &lt;/p&gt;

&lt;p&gt;Possessing the same keys on both side of the message is considered &lt;strong&gt;symmetric-key cryptography&lt;/strong&gt;. There are downsides to this method, both sides must have the same key beforehand and it was difficult to do this exchange over an unsecured channel unless they met in person.&lt;/p&gt;

&lt;h1&gt;
  
  
  Asymmetric Key (Public Key Cryptography)
&lt;/h1&gt;

&lt;p&gt;With the rise of personal computing, people wanted to be able to communicate securely and meeting in person to exchange seemed outdated. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"How could two parties communicate securely without having met beforehand to exchange keys?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 1976, Whitefield Diffe proposed the idea of a public key. Initially, many cryptographers dismissed the idea since the whole purpose of an encrypted key was that it was private.&lt;/p&gt;

&lt;p&gt;Whitefield had the idea to split the key into two, a private and public key pair, that could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Authenticate: One key signs, the other verifies&lt;/li&gt;
&lt;li&gt;Encrypt: One key encrypts, the other decrypts&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Asymmetric Key Example
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Public Key Authentication&lt;br&gt;
Bob shares his public key to the world. He keeps his private key safe and secure. When he uses his private key to encrypt a message, he can share it publicly to be decrypted using his public key. This verifies that only Bob could have written this message because the only key that could have encrypted the message is the corresponding private key that Bob has. An unforgeable digital signature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Public Key Encryption&lt;br&gt;
A message is encrypted using Bob's public key that only Bob can decrypt. This means anyone with Bob's public key that is available to anyone, can securely send him a message.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Public key cryptography is considered asymmetric encryption in that only one party has access to the private key."&lt;/p&gt;

&lt;h1&gt;
  
  
  RSA and ECDSA
&lt;/h1&gt;

&lt;p&gt;Today, RSA and EDSCA are the two popularly used algorithms for public key cryptography.&lt;/p&gt;

&lt;p&gt;-&lt;em&gt;The RSA algorithm is based on the idea that it's very easy to find the product of two prime numbers, yet extremely difficult to factor out those two prime numbers if you have the product.&lt;/em&gt;&lt;br&gt;
-&lt;em&gt;The ECDSA algorithm uses elliptic curves. It can provide the same level security as other public key algorithms with smaller key sizes, which is the reason it's become quite popular. It is the Digital Signing Algorithm used by Bitcoin, specifically the secp256k1 curve.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Resource:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://university.alchemy.com/" rel="noopener noreferrer"&gt;Alchemy University&lt;/a&gt;: Ethereum Developer Bootcamp&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cryptographic Hashes: Find A Favorite Color</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Mon, 28 Nov 2022 03:50:32 +0000</pubDate>
      <link>https://dev.to/jennifertieu/cryptographic-hashes-find-a-favorite-color-5h1h</link>
      <guid>https://dev.to/jennifertieu/cryptographic-hashes-find-a-favorite-color-5h1h</guid>
      <description>&lt;p&gt;Alchemy University Ethereum Developer Bootcamp Week one course continued with a cryptographic hashes exercise to find a favorite color.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: Most of the content below is a general summary and retelling of the information from the course.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Brute Force Hashing
&lt;/h1&gt;

&lt;p&gt;"Cryptographic Hash Functions like SHA256 are one-way functions." This means it's easy to generate (or "find") the output from the input, but almost impossible to find the input from the output.&lt;/p&gt;

&lt;p&gt;However, you can brute-force guess the output if you know the hashes of common inputs or create a "Rainbow Table" to determine what that input is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: For security purposes, it's important to remember to use a random salt which you can add to your input to make it unguessable via the methods mentioned above!&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Exercise Goal: Find the Color
&lt;/h1&gt;

&lt;p&gt;Given a SHA256 hash, find the color input that would generate that hash. You can assume that all the hashes be generated only from colors provided in the COLORS array.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;To take the hash of a color, first use utf8ToBytes to translate the string to bytes. Then, use sha256 to hash it.&lt;/li&gt;
&lt;li&gt;When you want to compare two hashes, first use toHex to turn each hash from a Uint8Array to a string of hexadecimal characters.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  My Solution:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { sha256 } = require("ethereum-cryptography/sha256");
const { toHex, utf8ToBytes } = require("ethereum-cryptography/utils");

// the possible colors that the hash could represent
const COLORS = ['red', 'green', 'blue', 'yellow', 'pink', 'orange'];

// given a hash, return the color that created the hash
function findColor(hash) {
    for (let i=0; i &amp;lt; COLORS.length;i++){
        let color = COLORS[i];
        // translate string to bytes
        let colorBytes = utf8ToBytes(color);
        // hash string
        let colorHash = sha256(colorBytes);
        // compare hashes
        if (toHex(hash) === toHex(colorHash)){
            return color;
        }
    }
}

module.exports = findColor;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Resource:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://university.alchemy.com/" rel="noopener noreferrer"&gt;Alchemy University&lt;/a&gt;: Ethereum Developer Bootcamp&lt;/p&gt;

</description>
      <category>mastodon</category>
      <category>discuss</category>
      <category>performance</category>
      <category>software</category>
    </item>
    <item>
      <title>Blockchain and Crypto</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Mon, 28 Nov 2022 03:47:12 +0000</pubDate>
      <link>https://dev.to/jennifertieu/blockchain-and-crypto-3aec</link>
      <guid>https://dev.to/jennifertieu/blockchain-and-crypto-3aec</guid>
      <description>&lt;p&gt;Alchemy University Ethereum Developer Bootcamp Week one course begins with an overview of blockchain and crypto.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: Most of the content below is a general summary and retelling of the information from the course.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Blockchain Network
&lt;/h1&gt;

&lt;p&gt;The blockchain is the protocol connecting a network of machines. Each network machine or "node" will run the written code.&lt;/p&gt;

&lt;p&gt;The blockchain enforces these rules or codes, a "smart contract".&lt;/p&gt;

&lt;h1&gt;
  
  
  Purpose of the Blockchain
&lt;/h1&gt;

&lt;p&gt;"The purpose of the blockchain is to have &lt;strong&gt;a network of computers agree upon a common state of data&lt;/strong&gt;". A person or organization may participate in this process, but they can't control it.&lt;/p&gt;

&lt;p&gt;A generally used term, &lt;strong&gt;consensus&lt;/strong&gt;, describes a network agreeing on the state of the data.&lt;/p&gt;

&lt;p&gt;The most common use case for blockchains is &lt;strong&gt;cryptocurrency&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bitcoin: The First
&lt;/h1&gt;

&lt;p&gt;Bitcoin was the first successful blockchain and cryptocurrency.&lt;/p&gt;

&lt;p&gt;Bitcoin works by using all these components together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proof of Work (Security)&lt;/li&gt;
&lt;li&gt;Mining Rewards (Financial Incentives)&lt;/li&gt;
&lt;li&gt;Public Key Cryptography (Authentication)&lt;/li&gt;
&lt;li&gt;Linked Data Structure (Chronology)&lt;/li&gt;
&lt;li&gt;Peer-to-Peer Network (Permissionless)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why is blockchain needed for cryptocurrency?
&lt;/h2&gt;

&lt;p&gt;When exchanging money between individuals, trust is usually needed to ensure the money is given/received. The blockchain was invented as a solution for trust between individuals or groups. &lt;/p&gt;

&lt;p&gt;In 2008, an unknown person or persons under the pseudonym Satoshi Nakamoto released a whitepaper on Bitcoin. It described "a system that would create a peer-to-peer network for exchanging value". &lt;/p&gt;

&lt;p&gt;The paper describes a chain of blocks tied together cryptographically, or blockchain.&lt;/p&gt;

&lt;h1&gt;
  
  
  Smart Contract Blockchains
&lt;/h1&gt;

&lt;p&gt;Smart contract blockchains allows developers to decentralize where the code runs.&lt;/p&gt;

&lt;p&gt;Decentralization isn't about the code, but how the code is executed. When the code is compiled and deployed to a decentralized blockchain, it is a smart contract. The code becomes publicly available on the blockchain, and the network nodes will enforce the code logic through the financial incentives of the blockchain protocol.&lt;/p&gt;

&lt;h1&gt;
  
  
  Crypto
&lt;/h1&gt;

&lt;p&gt;Before cryptocurrency, there was crypto.&lt;/p&gt;

&lt;p&gt;Two key primitives to keep in mind for blockchain development are Cryptographic Hashes and Public Key Cryptography.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cryptographic Hash Functions
&lt;/h1&gt;

&lt;p&gt;"A hash function is a function which takes an input of any size and turns it into a fixed size output."&lt;/p&gt;

&lt;p&gt;The input can be any data type: number, image, video, string, etc.&lt;/p&gt;

&lt;p&gt;Cryptographic hash functions need five specific properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deterministic - One specific input always maps to the same specific output&lt;/li&gt;
&lt;li&gt;Pseudorandom - It is not possible to guess the output based on the output of similar inputs&lt;/li&gt;
&lt;li&gt;One-way - If someone gives you a new output, you could not determine an input without guessing&lt;/li&gt;
&lt;li&gt;Fast to Compute - It must be a quick calculation for a computer&lt;/li&gt;
&lt;li&gt;Collision-resistant - The chance of a collision should be infinitesimally small&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two important use cases for Hash functions for blockchain developers are Commitments (Protocol &amp;amp; Smart Contracts) and Proof of Work.&lt;/p&gt;

&lt;p&gt;For blockchains, having a unique, fixed-sized representation of output regardless of input size is critical for saving space.&lt;/p&gt;

&lt;h1&gt;
  
  
  Resource:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://university.alchemy.com/" rel="noopener noreferrer"&gt;Alchemy University&lt;/a&gt;: Ethereum Developer Bootcamp&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>My Implementation of The Odin Project Etch-A-Sketch</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Sun, 27 Feb 2022 04:27:59 +0000</pubDate>
      <link>https://dev.to/jennifertieu/the-odin-project-etch-a-sketch-1oj5</link>
      <guid>https://dev.to/jennifertieu/the-odin-project-etch-a-sketch-1oj5</guid>
      <description>&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;The assignment states to create a webpage with a 16x16 grid of square divs. Instead of manually adding the &lt;strong&gt;divs&lt;/strong&gt;, the requirements ask to add the divs using JavaScript so it is more dynamic and we can adjust the number of divs later. &lt;/p&gt;

&lt;p&gt;A hover effect will need to be added to mimic the behavior for an Etch-A-Sketch where the squares that the mouse hovers over will change appearance. The Odin Project also provides some tips for completing this assignment.&lt;/p&gt;

&lt;p&gt;Lastly, a button will need to be added to the top of the screen to clear the screen and prompt the user for the number of squares for the new grid. For example, entering 64 will generate a 64x64 grid. The requirement states to limit the input to 100 since the greater number of squares generated will affect the web page performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning
&lt;/h2&gt;

&lt;p&gt;So the first thing that came to mind after setting my HTML, CSS, and JS files was figuring out how to add the divs with JavaScript.&lt;/p&gt;

&lt;p&gt;The few times I've had to do DOM manipulation, I've added the elements using the appendChild method. Using the appendChild method, I would create a loop that would append divs to a parent element to create the grid based on the input number. I want to see if there's another way to do it, but I'll start with this idea first. &lt;/p&gt;

&lt;h2&gt;
  
  
  Layout
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7m9s7sgiunxdojgbebab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7m9s7sgiunxdojgbebab.png" alt="Mockup" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  HTML and CSS Styling
&lt;/h2&gt;

&lt;p&gt;For my layout, I decided to use Flexbox to arrange the elements and then use a CSS grid for my Etch-A-Sketch body. My main elements were composed of a header which contains the clear button and then a grid container.&lt;/p&gt;

&lt;p&gt;To center my elements, I needed to have the &lt;code&gt;body&lt;/code&gt; and &lt;code&gt;html&lt;/code&gt; element height to take up the full page. I found &lt;a href="https://www.freecodecamp.org/news/html-page-width-height/" rel="noopener noreferrer"&gt;this article&lt;/a&gt; that helped explain how to set the &lt;code&gt;html&lt;/code&gt; and &lt;code&gt;body&lt;/code&gt; elements. I set the &lt;code&gt;body&lt;/code&gt; &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/min-height" rel="noopener noreferrer"&gt;min-height&lt;/a&gt; to &lt;code&gt;100vh&lt;/code&gt; which means it will be at least &lt;code&gt;100vh&lt;/code&gt; and it can also grow beyond that. &lt;/p&gt;

&lt;p&gt;After centering my elements with flex, I had trouble setting the grid container size. The grid container should have a defined size and then generates a new grid when the user enters a number in the container. The grid container is static and the grid dimensions are dynamic. So the user may put whatever number below 100 and the grid should still take up the same amount of space in the grid container.&lt;/p&gt;

&lt;p&gt;I put the grid container height and width both at 50% and it wasn't behaving like intended. The width was set to 50%, but the height wasn't changing at all.&lt;/p&gt;

&lt;p&gt;After some searching, this &lt;a href="https://stackoverflow.com/questions/67675651/div-height-100-not-working-with-body-min-height-100vh" rel="noopener noreferrer"&gt;StackOverflow post&lt;/a&gt; helped clear up why setting the percentage for &lt;code&gt;height&lt;/code&gt; wasn't working for the grid container. The &lt;code&gt;min-height: 100vh&lt;/code&gt; does not set the &lt;code&gt;height&lt;/code&gt; for the body. So, as a percentage, there's no parent height for the grid container to calculate off of. To fix this issue, I also set the &lt;code&gt;height&lt;/code&gt; of the body to &lt;code&gt;100vh&lt;/code&gt; and then the grid container &lt;code&gt;height&lt;/code&gt; and &lt;code&gt;width&lt;/code&gt; percentage worked. Although, I'm a bit unsure of why width didn't need to be explicitly set. It seems to already take the full width of the screen or viewport.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F65z173rzo7n1enkbunae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F65z173rzo7n1enkbunae.png" alt="body height" width="672" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript
&lt;/h2&gt;

&lt;p&gt;The JavaScript portion was fairly straightforward once I figured out the grid.&lt;/p&gt;

&lt;p&gt;For the grid, I made a function that would take a number as an input and create the grid based on the input number. This function created the div elements to be appended to the grid container and set a class for each. It also set the grid container &lt;code&gt;grid-template-columns&lt;/code&gt; and &lt;code&gt;grid-template-rows&lt;/code&gt; values based on the input number.&lt;/p&gt;

&lt;p&gt;Next, I added created functions and event listeners to update the grid when a mouse hovers over the grid box. The event would cause the grid box color to change to black.&lt;/p&gt;

&lt;p&gt;Finally, I made functions for the clear button and resets button. I added the event listener on the button instead of in the JavaScript file. The clear button function iterates through each grid box and reset the background color value to &lt;code&gt;null&lt;/code&gt;. The reset button function prompts the user to enter a number. If the number is valid and below 100, it will remove the old grid boxes and add new ones based on the new number using the createGrid function. Otherwise, it will re-prompt the user to enter a number if it's over 100 or do nothing. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Once I completed the JavaScript, I went back and added some additional styling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fi7jhzv9d8qk95bgu3vd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fi7jhzv9d8qk95bgu3vd7.png" alt="Completed Etch-A-Sketch" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall, the project was a bit challenging for me in regard to CSS. I'm still trying to learn and understand how CSS properties affect each other, but it was a fun challenge. Now to the next assignment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/etch-a-sketch-project" rel="noopener noreferrer"&gt;The Odin Project Etch-A-Sketch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jennifertieuu/top-etch-a-sketch" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.websiteplanet.com/blog/html-guide-beginners/" rel="noopener noreferrer"&gt;HTML Guider for Beginners&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Self-Taught Developer Journal, Day 62: New Beginnings</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Wed, 16 Feb 2022 05:36:31 +0000</pubDate>
      <link>https://dev.to/jennifertieu/self-taught-developer-journal-day-62-new-beginnings-2324</link>
      <guid>https://dev.to/jennifertieu/self-taught-developer-journal-day-62-new-beginnings-2324</guid>
      <description>&lt;p&gt;I finally reached 100 days of #100DaysOfCode. It is crazy how much can change in about 100 days.&lt;/p&gt;

&lt;p&gt;I initially started this series as a motivator for myself as I documented my self-developer journey. For a long time, I always wanted to make this career pivot into tech and it wasn't until recently that I was at a place in my life where I felt like I could take the leap. A big factor that helped me realize this was joining Tech Twitter and doing #100DaysOfCode. I got to witness a community of individuals trying to start a career in tech, who loved learning, and supported one another. It didn't take long into #100DaysOfCode for me to realize this was something I wanted to pursue. That creeping what-if that always lurked in the back of my mind finally sprung to life. I'm going to do it, I'm going to become a developer.&lt;/p&gt;

&lt;p&gt;Once I made the decision, I discussed it with my close friends and family who were all very supportive. I won't lie, there was an element of fear of worst-case scenarios, but I didn't want fear to stop me from pursuing my dream so I tried my best to be prepared. It was a really stressful time, I reached out to as many people as I could for advice with almost a sort of desperation like I was hoping someone could tell me the right path to success. I poured over podcasts, articles, readings, boot camp reviews, etc. with everyone giving different advice. It didn't take long for me to see that there is no perfect answer. Everyone experiences and walks their own path in life. There's no perfect answer on how to accomplish your dreams or become a developer. &lt;/p&gt;

&lt;p&gt;I came up with the best plan on what made sense for me at the time. That plan is the first article I posted in this series. Looking back at it now, a few things changed and a few things didn't and that's okay. I learned a lot and I'm proud of how much I've grown in a short span of time.&lt;/p&gt;

&lt;p&gt;So that leads me to my next bit of news, I wasn't sure if I wanted to share this, but I felt like it wouldn't be right to not mention it. &lt;strong&gt;I accepted a job as a Junior Software Developer and will be starting in March.&lt;/strong&gt; I won't go into exact details, but basically, I was offered an opportunity to work for the software development company that my current company currently employs after I brought up my desire to change careers. I feel extremely blessed and very lucky for the opportunity. I know how hard it can be to break into tech from the many stories I've read.&lt;/p&gt;

&lt;p&gt;However, I don't want anyone to take away from this story that this is what it takes to break into tech or anything. As I said, everyone's life and story are different. But, what I do want people to take out of this is what I've learned from this experience. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't be afraid to talk to your boss or manager, opportunities might be there and you might not realize it. I am thankful to have a boss that understood where I was coming from and was willing to support and help me with my career change.&lt;/li&gt;
&lt;li&gt;Don't be afraid to reach out and ask questions, you never know who's willing to lend you a hand. I initially approached the Copresident of my new company asking for advice for becoming a developer. I didn't ask for a job or anything and was not expecting to be offered one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I accepted the offer in January. While I was elated to land a job being able to do something I liked, I didn't feel the need to stop coding every day. I didn't want to stop blogging. I didn't feel the need to stop at all. So what does this mean? It mean that getting a job wasn't the end goal for me. I actually really enjoy learning about web development. I found out I like blogging a lot. I like sharing and helping others learn. So for people following, this isn't really a path on how to land a developer job. It's about someone who enjoys learning web development and building stuff. &lt;/p&gt;

&lt;p&gt;With that, I am ending this series, but I will continue blogging. To be honest, I wasn't sure what would be a good time to end this because the learning never stops, but I wanted to start writing with more time dedicated and not for consistency. It's been an amazing journey for this Self-Taught Developer Journal, but now it's time for New Beginnings.&lt;/p&gt;

&lt;p&gt;Thank you for reading.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Self-Taught Developer Journal, Day 61: TOP Building Rock Paper Scissors UI cont.</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Tue, 15 Feb 2022 04:50:43 +0000</pubDate>
      <link>https://dev.to/jennifertieu/self-taught-developer-journal-day-60-top-building-rock-paper-scissors-ui-cont-1geh</link>
      <guid>https://dev.to/jennifertieu/self-taught-developer-journal-day-60-top-building-rock-paper-scissors-ui-cont-1geh</guid>
      <description>&lt;p&gt;Today I finished my Rock Paper Scissors UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fo2qptibze9rg662xzlu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fo2qptibze9rg662xzlu1.png" alt="Completed UI" width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added a rounded border to imitate buttons for the game choices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fyvaupyjhn0ewrs13cl1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fyvaupyjhn0ewrs13cl1v.png" alt="button styling" width="484" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I worked on add the image selection for the player and computer. I played around with creating an element, setting attributes, add the source image, appending and removing the child elements or node.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F4tvsp3ylt26dm8z9li68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F4tvsp3ylt26dm8z9li68.png" alt="image selection" width="788" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/" rel="noopener noreferrer"&gt;The Odin Project&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/revisiting-rock-paper-scissors" rel="noopener noreferrer"&gt;Revisiting Rock Paper Scissors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Self-Taught Developer Journal, Day 60: TOP Building Rock Paper Scissors UI cont.</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Mon, 14 Feb 2022 03:19:46 +0000</pubDate>
      <link>https://dev.to/jennifertieu/self-taught-developer-journal-day-60-top-building-rock-paper-scissors-ui-cont-3ln1</link>
      <guid>https://dev.to/jennifertieu/self-taught-developer-journal-day-60-top-building-rock-paper-scissors-ui-cont-3ln1</guid>
      <description>&lt;p&gt;Today...&lt;/p&gt;

&lt;p&gt;I finished redoing my layout. First, I commented out my original HTML code up to the grid-container class so I could experiment with using CSS grid. I created some temporary divs to make a 3x3 again to test the grid layout&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsx4g29hl2zqrjkeij6re.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsx4g29hl2zqrjkeij6re.png" alt="3x3" width="800" height="693"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjjrznievz4gmxw7a5g1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjjrznievz4gmxw7a5g1t.png" alt="grid-container code" width="574" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once I got the grid set up how I wanted it, I uncommented and removed the parent elements I used to group my original classes. Now I have 9 block level classes which equated to my 3x3 grid container instead of redundant groupings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqeickdeo941b3bxozrm8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqeickdeo941b3bxozrm8.png" alt="Updated Code" width="674" height="992"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I was messing with the mobile view, I got frustrated because grid container not responding to its parent flex container sizing. I wasn't able to figure it out and plan to revisit it at a later time.&lt;/p&gt;

&lt;p&gt;Next, I used images for my rock, paper, and scissors buttons I got for free from Pixabay. I added the Orbitron font from Google Fonts to my file and used it to style my text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9mlg8halosiujl5fafxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9mlg8halosiujl5fafxa.png" alt="Rock Paper Scissors UI" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am almost done with the UI. I just need to do a few more style edits and also have the game use the images when a selection is made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/" rel="noopener noreferrer"&gt;The Odin Project&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/revisiting-rock-paper-scissors" rel="noopener noreferrer"&gt;Revisiting Rock Paper Scissors&lt;/a&gt;&lt;br&gt;
&lt;a href="https://pixabay.com/images/search/rock-paper-scissors/" rel="noopener noreferrer"&gt;https://pixabay.com/images/search/rock-paper-scissors/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Self-Taught Developer Journal, Day 58-59: TOP Building Rock Paper Scissors UI cont.</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Sun, 13 Feb 2022 04:19:24 +0000</pubDate>
      <link>https://dev.to/jennifertieu/self-taught-developer-journal-day-58-59-top-building-rock-paper-scissors-ui-cont-25e1</link>
      <guid>https://dev.to/jennifertieu/self-taught-developer-journal-day-58-59-top-building-rock-paper-scissors-ui-cont-25e1</guid>
      <description>&lt;p&gt;Today I continued working on the styling of my Rock Paper Scissors UI.&lt;/p&gt;

&lt;p&gt;While I trying to add some finishing touched to my CSS layout, I realized I didn't really like how to set it up the first time. I think I might've been too focused on grouping the elements and not really understanding grid well. Now, I want to rearrange my layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSS Games: Flexbox Froggy and Grid Garden.
&lt;/h2&gt;

&lt;p&gt;I decided to do practice some CSS through games I found &lt;a href="https://twitter.com/SajalShlan/status/1490294139149484037" rel="noopener noreferrer"&gt;posted by Sajal Sharma&lt;/a&gt; on Twtter. Specifically, &lt;a href="http://flexboxfroggy.com/" rel="noopener noreferrer"&gt;Flexbox Froggy&lt;/a&gt; and &lt;a href="http://cssgridgarden.com/" rel="noopener noreferrer"&gt;Grid Garden&lt;/a&gt;. It was fun practicing in a game format and I feel a lot more comfortably using flex and grid now. I'm hoping to apply flex and grid better when I rearrange my HTML and CSS layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mike Chen and Allyse Arucan Twitch Stream
&lt;/h2&gt;

&lt;p&gt;I really enjoy watching developer streams. It's so helpful to me to watch an experience developer talk through their thought process, tips, and visually seeing what their doing. I'm still looking for more streamers to follow, specifically frontend developers.&lt;/p&gt;

&lt;p&gt;I've been watching streams by &lt;a href="https://twitter.com/genericmikechen" rel="noopener noreferrer"&gt;Mike Chen&lt;/a&gt; and recently he did a live code review with &lt;a href="https://twitter.com/allysedotdev" rel="noopener noreferrer"&gt;Allyse Arucan&lt;/a&gt; which I thought was very helpful. I'm still going through it, but I took a few notes on things that jumped out to me.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When creating CSS classes, think about where else you can use it in your code base (reusability)

&lt;ul&gt;
&lt;li&gt;For example, reusing text styling and creating a class for it so it can be used for other elements&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;In the Developer Tools, you drag HTML elements to move them in a block of code

&lt;ul&gt;
&lt;li&gt;use the "H" key to hide elements and determine hierarchy&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There are a few more tips I forgot to note, but planning to watch it through again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/" rel="noopener noreferrer"&gt;The Odin Project&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/revisiting-rock-paper-scissors" rel="noopener noreferrer"&gt;Revisiting Rock Paper Scissors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Self-Taught Developer Journal, Day 57: TOP Building Rock Paper Scissors UI cont.</title>
      <dc:creator>Jennifer Tieu</dc:creator>
      <pubDate>Thu, 10 Feb 2022 04:59:35 +0000</pubDate>
      <link>https://dev.to/jennifertieu/self-taught-developer-journal-day-57-top-building-rock-paper-scissors-ui-cont-1bgp</link>
      <guid>https://dev.to/jennifertieu/self-taught-developer-journal-day-57-top-building-rock-paper-scissors-ui-cont-1bgp</guid>
      <description>&lt;p&gt;A short post today. I started updating the arrangement of my HTML elements. I mainly added more classes, nesting them, and then using flexbox to place the elements in the desired spots.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flj7pt2nj76sh0qu1jggq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flj7pt2nj76sh0qu1jggq.png" alt="Output Example" width="800" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm still working on centering the player and computer choices. After, I will try and find some images for the buttons to use. &lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/" rel="noopener noreferrer"&gt;The Odin Project&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/revisiting-rock-paper-scissors" rel="noopener noreferrer"&gt;Revisiting Rock Paper Scissors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
