<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: easyoon</title>
    <description>The latest articles on Forem by easyoon (@easyoon_ec43e8d635f9a3fbb).</description>
    <link>https://forem.com/easyoon_ec43e8d635f9a3fbb</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%2F2556675%2Fdf2b9061-d88e-4ebe-b28e-4bf8d99a66f2.png</url>
      <title>Forem: easyoon</title>
      <link>https://forem.com/easyoon_ec43e8d635f9a3fbb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/easyoon_ec43e8d635f9a3fbb"/>
    <language>en</language>
    <item>
      <title>[Translations] Implementing Animations with Throttle in JavaScript</title>
      <dc:creator>easyoon</dc:creator>
      <pubDate>Wed, 08 Jan 2025 17:14:06 +0000</pubDate>
      <link>https://forem.com/easyoon_ec43e8d635f9a3fbb/translations-implementing-animations-with-throttle-in-javascript-415n</link>
      <guid>https://forem.com/easyoon_ec43e8d635f9a3fbb/translations-implementing-animations-with-throttle-in-javascript-415n</guid>
      <description>&lt;p&gt;&lt;a href="https://devblogeasyoon.xyz/blog/throttle-in-animation" rel="noopener noreferrer"&gt;Original Article Link&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Implementing Animations with Throttle in JavaScript
&lt;/h1&gt;

&lt;p&gt;This document explains how to improve animation performance using throttle in JavaScript and applies throttle to solve the issue of choppy scroll animations. It also compares the differences before and after applying throttle.&lt;/p&gt;

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

&lt;p&gt;Throttle is a technique that limits a function to be called 'at most once' within a 'certain time interval'. In other words, even if an event occurs multiple times within a short period, the function will only be executed once within the time interval set by the throttle. For example, if a function has a throttle of 100ms, even if the event occurs 10 times in 1 second, the function will be executed a maximum of 10 times (at 100ms intervals).&lt;/p&gt;

&lt;h2&gt;
  
  
  Where is Throttle Used?
&lt;/h2&gt;

&lt;p&gt;Throttle can be used in the following situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Preventing performance degradation due to excessive event triggering:&lt;/strong&gt; When events such as scrolling, mouse movement, and window resizing occur frequently in a short period, the event handler can be executed excessively, causing performance issues. Throttle is used to mitigate this.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Making animations smoother:&lt;/strong&gt; When it is necessary to express continuous changes, such as scroll animations, the animation may be choppy or stutter depending on the event frequency. Using throttle can make animations smoother.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Problem: Stuttering and Choppy Scroll Animations
&lt;/h2&gt;

&lt;p&gt;An attempt was made to implement a smooth scroll animation according to the scroll wheel event, but before applying throttle, the animation was choppy.&lt;/p&gt;

&lt;p&gt;Reason: This is because the wheel event occurs at a very high rate, causing the &lt;code&gt;window.scrollBy&lt;/code&gt; function to be called excessively, preventing the browser from processing all requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Code Before Applying Throttle
&lt;/h3&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scrollContainerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleWheel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrollBy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deltaY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;behavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;smooth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wheel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleWheel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wheel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleWheel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code, the handleWheel function is executed every time a wheel event occurs. This function calculates the scroll amount using the deltaY value of the event and scrolls by calling the &lt;code&gt;window.scrollBy&lt;/code&gt;function. The problem is that the wheel event can occur multiple times in a very short period, which causes window.scrollBy to be called excessively, resulting in a choppy animation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Code After Applying Throttle
&lt;/h3&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scrollContainerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;throttleTimer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleWheel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;throttleTimer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nx"&gt;throttleTimer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrollBy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deltaY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;behavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;smooth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="nx"&gt;throttleTimer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wheel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleWheel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wheel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleWheel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the throttled code, the &lt;code&gt;throttleTimer&lt;/code&gt; variable is used to manage function execution. The process works as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  When the &lt;code&gt;handleWheel&lt;/code&gt; function is called, it checks if &lt;code&gt;throttleTimer&lt;/code&gt; exists.&lt;/li&gt;
&lt;li&gt;  If &lt;code&gt;throttleTimer&lt;/code&gt; exists (meaning a previously set timer is still active), the function returns immediately. This prevents new scroll requests from being processed while a scroll animation is already in progress.&lt;/li&gt;
&lt;li&gt;  If &lt;code&gt;throttleTimer&lt;/code&gt; does &lt;em&gt;not&lt;/em&gt; exist, &lt;code&gt;event.preventDefault()&lt;/code&gt; is called to prevent the default scroll behavior, and &lt;code&gt;setTimeout&lt;/code&gt; is used to execute the &lt;code&gt;window.scrollBy&lt;/code&gt; function after 16ms.&lt;/li&gt;
&lt;li&gt;  Inside the &lt;code&gt;setTimeout&lt;/code&gt; callback function, &lt;code&gt;throttleTimer&lt;/code&gt; is set to &lt;code&gt;null&lt;/code&gt;, resetting the throttle and allowing the function to be called again after the delay.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Potential Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Initial Delay of &lt;code&gt;setTimeout&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setTimeout&lt;/code&gt; is used to implement the throttling mechanism. &lt;code&gt;setTimeout&lt;/code&gt; executes the callback function &lt;em&gt;after&lt;/em&gt; the specified delay (16ms in this case). Consequently, when the first wheel event occurs, &lt;code&gt;window.scrollBy&lt;/code&gt; is invoked after a 16ms delay. This initial delay can lead to a perceived lack of immediate responsiveness, potentially being interpreted as stuttering, particularly with rapid wheel movements. (Further improvements will be explored in the future...)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>animation</category>
      <category>css</category>
      <category>frontend</category>
    </item>
    <item>
      <title>[Translations]Comparing ethers.js and web3.js as Web3 Regains Popularity</title>
      <dc:creator>easyoon</dc:creator>
      <pubDate>Fri, 27 Dec 2024 11:00:39 +0000</pubDate>
      <link>https://forem.com/easyoon_ec43e8d635f9a3fbb/comparing-ethersjs-and-web3js-as-web3-regains-popularity-4o34</link>
      <guid>https://forem.com/easyoon_ec43e8d635f9a3fbb/comparing-ethersjs-and-web3js-as-web3-regains-popularity-4o34</guid>
      <description>&lt;p&gt;&lt;a href="https://devblogeasyoon.xyz/blog/summary-of-dapp-js-development-web3-ethers-js" rel="noopener noreferrer"&gt;Original Article Link&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Comparing ethers.js and web3.js as Web3 Regains Popularity
&lt;/h1&gt;

&lt;p&gt;As Web3 regains attention, interest in ethers.js and web3.js, the primary JavaScript libraries used for Ethereum-based DApp (Decentralized Application) development, is also increasing. While both libraries enable interaction with the Ethereum blockchain, they have some key differences, especially in their development approach. This document compares the two libraries, exploring their characteristics, advantages, disadvantages, and differences in development style.&lt;/p&gt;




&lt;h2&gt;
  
  
  web3.js
&lt;/h2&gt;

&lt;p&gt;web3.js is an older library that emerged in the early days of the Ethereum ecosystem. It provides a broad range of functionalities, offering all methods for interacting with the blockchain from a single &lt;code&gt;web3&lt;/code&gt; object. It primarily uses a callback function-based API style.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It has a long history and is used in many legacy projects.&lt;/li&gt;
&lt;li&gt;  Offers a wider range of features compared to ethers.js.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Relatively large and heavy, which can impact performance.&lt;/li&gt;
&lt;li&gt;  The API is somewhat complex, leading to a steeper learning curve.&lt;/li&gt;
&lt;li&gt;  Updates are slower compared to ethers.js.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Callback-based API can make asynchronous code writing somewhat complex.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ethers.js
&lt;/h2&gt;

&lt;p&gt;ethers.js is a relatively newer library that adheres to modern JavaScript standards and focuses on providing a better developer experience. It is &lt;strong&gt;concise and lightweight&lt;/strong&gt;, offering a modularized API. In particular, it improves development flexibility and security by clearly separating &lt;code&gt;Provider&lt;/code&gt; and &lt;code&gt;Signer&lt;/code&gt;. It uses a Promise-based API, allowing for concise asynchronous code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Concise and lightweight, providing faster performance.&lt;/li&gt;
&lt;li&gt;  Has a clear API structure separated into &lt;code&gt;Signer&lt;/code&gt; and &lt;code&gt;Provider&lt;/code&gt;.

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;Signer&lt;/code&gt;: Manages private keys and handles transaction signing (enhanced security).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Provider&lt;/code&gt;: Manages blockchain network connections (easy support for various networks).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Provides enhanced security features and pays more attention to private key management.&lt;/li&gt;

&lt;li&gt;  Actively developed and maintained, with rapid reflection of the latest features.&lt;/li&gt;

&lt;li&gt;  Provides excellent documentation.&lt;/li&gt;

&lt;li&gt;  Promise-based API makes asynchronous code concise and readable.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  As a relatively new library, it is not used in as many legacy projects as web3.js.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Provider and Signer: Core Concepts of ethers.js and web3.js
&lt;/h2&gt;

&lt;p&gt;In the blockchain, especially the Ethereum ecosystem, Provider and Signer are crucial concepts. They define how DApps interact with the blockchain. ethers.js and web3.js handle these two concepts differently, leading to significant differences in development approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Provider: Read-Only Connection to the Blockchain
&lt;/h2&gt;

&lt;p&gt;The Provider provides read-only access to the blockchain network. It is like a librarian. You can read books (blockchain data) and get information, but you cannot add or modify content in the books.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Functions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Retrieving block information (block height, timestamp, etc.)&lt;/li&gt;
&lt;li&gt;  Retrieving transaction information&lt;/li&gt;
&lt;li&gt;  Checking account balances&lt;/li&gt;
&lt;li&gt;  Calling read-only functions (view functions) of smart contracts&lt;/li&gt;
&lt;li&gt;  Checking network status&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Signer: Transaction Signing and Execution
&lt;/h2&gt;

&lt;p&gt;The Signer provides the ability to sign transactions using a private key and submit them to the blockchain. It is like someone with a seal. Just as a document (transaction) becomes effective only when stamped, the Signer signs transactions so that they can be recorded on the blockchain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Functions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Private key management (secure storage and access)&lt;/li&gt;
&lt;li&gt;  Transaction creation and signing&lt;/li&gt;
&lt;li&gt;  Calling state-changing functions of smart contracts&lt;/li&gt;
&lt;li&gt;  Sending Ether&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Provider and Signer in ethers.js
&lt;/h2&gt;

&lt;p&gt;ethers.js structures its API by clearly separating Provider and Signer. This greatly enhances development flexibility and security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider:&lt;/strong&gt; Provides various Providers through the &lt;code&gt;ethers.providers&lt;/code&gt; module. You can connect using services like Infura, Alchemy, Etherscan, or directly using an RPC URL.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Example: &lt;code&gt;const provider = new ethers.providers.InfuraProvider("mainnet", "YOUR_INFURA_PROJECT_ID");&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Signer:&lt;/strong&gt; You can manage private keys using the &lt;code&gt;ethers.Wallet&lt;/code&gt; class or connect with wallets like MetaMask.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Example (using private key): &lt;code&gt;const wallet = new ethers.Wallet("YOUR_PRIVATE_KEY", provider);&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Example (connecting MetaMask): &lt;code&gt;const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner();&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By separating Provider and Signer in ethers.js, you can gain the following advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Enhanced Security:&lt;/strong&gt; Private keys can be managed securely through wallets without direct management.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Increased Flexibility:&lt;/strong&gt; Various Providers can be easily switched and used.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Easy Testing:&lt;/strong&gt; You can perform tests using mock Signers in the test environment.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Provider and Signer in web3.js
&lt;/h2&gt;

&lt;p&gt;web3.js does not clearly separate Provider and Signer. Although it manages accounts and signs transactions through &lt;code&gt;web3.eth.accounts&lt;/code&gt;, it is not as clearly separated as ethers.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider:&lt;/strong&gt; Sets the Provider using &lt;code&gt;web3.setProvider()&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Example: &lt;code&gt;const web3 = new Web3(new Web3.providers.HttpProvider('YOUR_RPC_URL'));&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Signer:&lt;/strong&gt; Signs transactions using &lt;code&gt;web3.eth.accounts.signTransaction()&lt;/code&gt;. In this process, you often have to use the private key directly, which can create security vulnerabilities. You can also use wallets like MetaMask, but the integration is not as clean as in ethers.js.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;ethers.js&lt;/th&gt;
&lt;th&gt;web3.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Provider&lt;/td&gt;
&lt;td&gt;Clearly separated, supports various Providers (Infura, Alchemy, etc.)&lt;/td&gt;
&lt;td&gt;Set with &lt;code&gt;web3.setProvider()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signer&lt;/td&gt;
&lt;td&gt;Clearly separated, Wallet class, easy wallet integration&lt;/td&gt;
&lt;td&gt;Managed through &lt;code&gt;web3.eth.accounts&lt;/code&gt;, may require direct private key management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Secure private key management, enhanced security&lt;/td&gt;
&lt;td&gt;Risk of private key exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;High flexibility, supports various Providers and wallets&lt;/td&gt;
&lt;td&gt;Relatively low flexibility&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ethers.js greatly improves development flexibility, security, and convenience by clearly separating Provider and Signer. On the other hand, web3.js does not have this clear separation, which can make development somewhat complex and create security vulnerabilities. Therefore, when starting a new Web3 project, using ethers.js is generally recommended.&lt;/p&gt;




&lt;h2&gt;
  
  
  Differences in Development Style
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;web3.js&lt;/th&gt;
&lt;th&gt;ethers.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API Style&lt;/td&gt;
&lt;td&gt;Single &lt;code&gt;web3&lt;/code&gt; object, callback-based&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Signer&lt;/code&gt; and &lt;code&gt;Provider&lt;/code&gt; separated, Promise-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asynchronous Processing&lt;/td&gt;
&lt;td&gt;Handles asynchronous code using callback functions, which can reduce code readability&lt;/td&gt;
&lt;td&gt;Can write asynchronous code concisely and clearly using Promises (easy to use async/await)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private Key Management&lt;/td&gt;
&lt;td&gt;Requires direct private key management (potential security vulnerabilities)&lt;/td&gt;
&lt;td&gt;Abstracted private key management through &lt;code&gt;Signer&lt;/code&gt; (enhanced security)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network Connection&lt;/td&gt;
&lt;td&gt;Connection setup using &lt;code&gt;web3.setProvider()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Supports various networks and connection methods through &lt;code&gt;Provider&lt;/code&gt; (Infura, Alchemy, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;When starting a new Web3 project, &lt;strong&gt;using ethers.js is recommended.&lt;/strong&gt; It provides a better development experience, performance, security, and the latest features. In particular, the separation of &lt;code&gt;Provider&lt;/code&gt; and &lt;code&gt;Signer&lt;/code&gt; and the Promise-based API are in line with modern development practices and improve code readability and maintainability. However, web3.js may still be a good choice for maintaining existing web3.js projects or in specific situations.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.ethers.io/v5/" rel="noopener noreferrer"&gt;ethers.js Official Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://web3js.readthedocs.io/en/v1.10.0/" rel="noopener noreferrer"&gt;web3.js Official Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://gongdeanam-it.tistory.com/entry/web3js%EC%99%80-ethersjs-%EB%91%90-%ED%81%B0-%EC%9D%B4%EB%8D%94%EB%A6%AC%" rel="noopener noreferrer"&gt;How to use two large Ethereum libraries, web3.js and ethers.js&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>javascript</category>
      <category>etherjs</category>
    </item>
    <item>
      <title>[Translations] Analyzing Apple Website Animation (1_Scrolling Synchronization)</title>
      <dc:creator>easyoon</dc:creator>
      <pubDate>Mon, 23 Dec 2024 10:32:57 +0000</pubDate>
      <link>https://forem.com/easyoon_ec43e8d635f9a3fbb/translations-analyzing-apple-website-animation-1scrolling-synchronization-3m65</link>
      <guid>https://forem.com/easyoon_ec43e8d635f9a3fbb/translations-analyzing-apple-website-animation-1scrolling-synchronization-3m65</guid>
      <description>&lt;p&gt;&lt;a href="https://devblogeasyoon.xyz/blog/apple-website-animation-analyze" rel="noopener noreferrer"&gt;Original Article Link&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The official Apple website uses smooth scroll-based animations to highlight its content. In this post, we will analyze and replicate a similar animation to understand its implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎥 Original Apple Website (Video)
&lt;/h2&gt;

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




&lt;h2&gt;
  
  
  📜 Reproduced Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Scroll Synchronization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The animation state is calculated in real-time based on the scroll position (&lt;code&gt;scrollY&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Bidirectional Animation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When scrolling down&lt;/strong&gt;: Text moves upward and fades out, while the video scales down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When scrolling up&lt;/strong&gt;: Text moves downward and reappears, while the video scales up.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. CSS Property Utilization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;transform: translateY&lt;/code&gt; and &lt;code&gt;scale&lt;/code&gt; values proportional to the scroll position.&lt;/li&gt;
&lt;li&gt;Smooth animation is ensured using &lt;code&gt;requestAnimationFrame&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 HTML Structure
&lt;/h2&gt;

&lt;p&gt;The HTML structure consists of a simple layout with text and a background video.&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%2Fqo4v2ghl3gs77cuvixsw.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%2Fqo4v2ghl3gs77cuvixsw.png" alt="Image description" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📜 Reproduced Implementation
&lt;/h2&gt;

&lt;p&gt;Set up CSS to enable smooth animations based on the scroll position.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* Text Section */
.text-section {
  position: absolute;
  top: 20%;
  width: 100%;
  text-align: center;
  color: white;
  z-index: 2;
}

.video-section {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
}

.background-video {
  width: 100vw;
  height: auto;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎬 JavaScript (Scroll-based Animation)
&lt;/h2&gt;

&lt;p&gt;Calculate the state of the text and video based on the scroll position and update their styles in real-time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textSection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.text-section&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoSection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.video-section&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleScroll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scrollY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;windowHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHeight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textOpacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;scrollY&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;windowHeight&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textTranslateY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scrollY&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;textSection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`translateY(-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;textTranslateY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px)`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;textSection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textOpacity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoScale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;scrollY&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;windowHeight&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;videoSection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`scale(&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;videoScale&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;handleScroll&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🖥️ Key Operation Breakdown
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🖥️ Key Functionality Explanation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scroll-based Calculation&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;textOpacity&lt;/code&gt;&lt;/strong&gt;: Adjusts the opacity of the text to gradually fade out based on the scroll position.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;textTranslateY&lt;/code&gt;&lt;/strong&gt;: Calculates how far the text moves upward in proportion to the scroll progress.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;videoScale&lt;/code&gt;&lt;/strong&gt;: Adjusts the scaling of the video to shrink proportionally with the scroll position.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requestAnimationFrame&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;An asynchronous function that enhances animation performance by leveraging the browser's optimized rendering loop for smooth operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bidirectional Animation&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scrolling Down&lt;/strong&gt;: The text moves upward and fades out, while the video scales down.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scrolling Up&lt;/strong&gt;: The text moves downward and reappears, while the video scales up.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[AWS Beginner | Translations] Cloud Concepts | Models of Cloud Computing (IaaS, PaaS, SaaS)</title>
      <dc:creator>easyoon</dc:creator>
      <pubDate>Wed, 11 Dec 2024 09:43:59 +0000</pubDate>
      <link>https://forem.com/easyoon_ec43e8d635f9a3fbb/translation-aws-beginner-cloud-concepts-models-of-cloud-computing-iaas-paas-saas-2kjp</link>
      <guid>https://forem.com/easyoon_ec43e8d635f9a3fbb/translation-aws-beginner-cloud-concepts-models-of-cloud-computing-iaas-paas-saas-2kjp</guid>
      <description>&lt;h1&gt;
  
  
  Cloud Concepts | Models of Cloud Computing (IaaS, PaaS, SaaS)
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://devblogeasyoon.xyz/blog/aws-certification-basic-cloud-model" rel="noopener noreferrer"&gt;Original Article Link&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Types of Cloud Computing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Divided into &lt;strong&gt;Cloud Computing Models&lt;/strong&gt; and &lt;strong&gt;Cloud Computing Deployment Models&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Computing Models&lt;/strong&gt;: Classified based on the types of services provided by cloud computing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Computing Deployment Models&lt;/strong&gt;: Classified based on the way cloud computing is delivered.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cloud Computing Models
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Five Basic Application Components&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt;: LAN cards/cables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: SSD / HDD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computing&lt;/strong&gt;: CPU / RAM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS&lt;/strong&gt;: Windows / Linux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Categorized based on the components provided:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IaaS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Infrastructure as a Service: Only infrastructure is provided.&lt;/li&gt;
&lt;li&gt;Includes Network + Storage + Computing; users install the OS and applications themselves.&lt;/li&gt;
&lt;li&gt;Similar to renting a virtual computer.&lt;/li&gt;
&lt;li&gt;Example: AWS EC2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PaaS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Platform as a Service: Provides all components except for application code.&lt;/li&gt;
&lt;li&gt;Offers infrastructure, servers, and other necessary components for application development, allowing users to simply upload and run their code.&lt;/li&gt;
&lt;li&gt;Example: Firebase, Supabase&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SaaS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Software as a Service: Includes infrastructure, OS, and necessary software.&lt;/li&gt;
&lt;li&gt;Provides the service itself, allowing users to access and use it without additional setup.&lt;/li&gt;
&lt;li&gt;Examples: Gmail, Slack, Dropbox, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cloud Computing Deployment Models
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Public (Cloud) Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All application-related activities are executed within the cloud.&lt;/li&gt;
&lt;li&gt;Low resource costs.&lt;/li&gt;
&lt;li&gt;High scalability.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Private Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offers the highest level of customization.&lt;/li&gt;
&lt;li&gt;Expensive initial resource costs.&lt;/li&gt;
&lt;li&gt;High maintenance resource costs.&lt;/li&gt;
&lt;li&gt;Enhanced security.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A mix of private and public models.&lt;/li&gt;
&lt;li&gt;Often used during the transition from private to public.&lt;/li&gt;
&lt;li&gt;Commonly used as a backup for private models.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>aws</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
