<?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: Jesse Chong</title>
    <description>The latest articles on DEV Community by Jesse Chong (@jesse_chong_3bcc276c4f950).</description>
    <link>https://dev.to/jesse_chong_3bcc276c4f950</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%2F2127698%2Ff962bd42-73f3-4ed3-bbcf-219db62b1c13.jpg</url>
      <title>DEV Community: Jesse Chong</title>
      <link>https://dev.to/jesse_chong_3bcc276c4f950</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jesse_chong_3bcc276c4f950"/>
    <language>en</language>
    <item>
      <title>Playing with a Stock API: A JavaScript/React Developer Learns Python</title>
      <dc:creator>Jesse Chong</dc:creator>
      <pubDate>Wed, 18 Dec 2024 19:29:40 +0000</pubDate>
      <link>https://dev.to/jesse_chong_3bcc276c4f950/playing-with-a-stock-api-a-javascriptreact-developer-learns-python-209o</link>
      <guid>https://dev.to/jesse_chong_3bcc276c4f950/playing-with-a-stock-api-a-javascriptreact-developer-learns-python-209o</guid>
      <description>&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%2Fgbbksz8jv4flhyshftby.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%2Fgbbksz8jv4flhyshftby.png" width="800" height="595"&gt;&lt;/a&gt;&lt;br&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%2Ffhfiufw7k84dxzub680t.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%2Ffhfiufw7k84dxzub680t.png" width="800" height="598"&gt;&lt;/a&gt;&lt;br&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%2F3r0zopplh2mik7lulzs7.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%2F3r0zopplh2mik7lulzs7.png" width="800" height="953"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As someone new to Python, I recently embarked on a journey to explore its capabilities while working with a stock API. Along the way, I learned how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up a virtual environment&lt;/li&gt;
&lt;li&gt;Manage packages&lt;/li&gt;
&lt;li&gt;Use environment variables for sensitive data&lt;/li&gt;
&lt;li&gt;Make HTTP requests and handle JSON&lt;/li&gt;
&lt;li&gt;Implement error handling and string formatting&lt;/li&gt;
&lt;li&gt;Work with Python’s dictionaries&lt;/li&gt;
&lt;li&gt;Understand schemas provided by APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a breakdown of my learning experience and key takeaways!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Setting Up Python&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Python’s &lt;strong&gt;virtual environments&lt;/strong&gt; (venv) allow you to isolate your project’s dependencies, ensuring your packages don’t conflict with others. It’s great for professional development.&lt;/p&gt;

&lt;p&gt;Steps to Create and Activate a Virtual Environment:Create a virtual environment&lt;/p&gt;

&lt;p&gt;python -m venv venv&lt;/p&gt;

&lt;p&gt;Activate it (Mac/Linux)&lt;/p&gt;

&lt;p&gt;source venv/bin/activate&lt;/p&gt;

&lt;h1&gt;
  
  
  Activate it (Windows)
&lt;/h1&gt;

&lt;p&gt;venv\Scripts\activate&lt;/p&gt;

&lt;p&gt;This keeps your project’s packages separate from others.&lt;/p&gt;

&lt;p&gt;Package ManagementUsing pip, Python’s package installer, I learned to manage dependencies:&lt;/p&gt;

&lt;h1&gt;
  
  
  Install packages
&lt;/h1&gt;

&lt;p&gt;pip install requests python-dotenv&lt;/p&gt;

&lt;h1&gt;
  
  
  Save requirements
&lt;/h1&gt;

&lt;p&gt;pip freeze &amp;gt; requirements.txt&lt;/p&gt;

&lt;h1&gt;
  
  
  Install from requirements
&lt;/h1&gt;

&lt;p&gt;pip install -r requirements.txt&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Environment Variables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To keep sensitive data secure, I used .env files for API keys and credentials:&lt;/p&gt;

&lt;h1&gt;
  
  
   .env file
&lt;/h1&gt;

&lt;p&gt;SCHWAB_CLIENT_ID=my_secret_id&lt;/p&gt;

&lt;p&gt;SCHWAB_CLIENT_SECRET=my_secret_key&lt;/p&gt;

&lt;h1&gt;
  
  
  Python code
&lt;/h1&gt;

&lt;p&gt;from dotenv import load_dotenv&lt;/p&gt;

&lt;p&gt;import os&lt;/p&gt;

&lt;p&gt;load_dotenv() # Load variables from .env&lt;/p&gt;

&lt;p&gt;api_key = os.getenv(‘SCHWAB_CLIENT_ID’)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Never commit .env files to Git. Use a .gitignore file to exclude them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3. Making HTTP Requests&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used the requests library to interact with APIs:&lt;/p&gt;

&lt;p&gt;import requests&lt;/p&gt;

&lt;h1&gt;
  
  
  Make a GET request
&lt;/h1&gt;

&lt;p&gt;response = requests.get(url, headers=headers, params=params)&lt;/p&gt;

&lt;h1&gt;
  
  
  Check if the request was successful
&lt;/h1&gt;

&lt;p&gt;if response.status_code == 200:&lt;/p&gt;

&lt;p&gt;data = response.json() # Convert response to JSON&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Understanding Schemas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before interacting with an API endpoint, I explored its schema. An API schema is like a blueprint that tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request Schema&lt;/strong&gt;: What data you need to send, including required fields, data types, and constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response Schema&lt;/strong&gt;: What data you can expect to receive, including structure, data types, and examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if an API endpoint retrieves stock prices, the schema might look like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request Schema&lt;/strong&gt;:&lt;/p&gt;

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

&lt;p&gt;“symbol”: “string”,&lt;/p&gt;

&lt;p&gt;“date”: “string (YYYY-MM-DD)”,&lt;/p&gt;

&lt;p&gt;“interval”: “string (e.g., ‘1d’, ‘1m’)”&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Response Schema&lt;/strong&gt;:&lt;/p&gt;

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

&lt;p&gt;“symbol”: “string”,&lt;/p&gt;

&lt;p&gt;“prices”: [&lt;/p&gt;

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

&lt;p&gt;“date”: “string (YYYY-MM-DD)”,&lt;/p&gt;

&lt;p&gt;“open”: “float”,&lt;/p&gt;

&lt;p&gt;“close”: “float”,&lt;/p&gt;

&lt;p&gt;“high”: “float”,&lt;/p&gt;

&lt;p&gt;“low”: “float”,&lt;/p&gt;

&lt;p&gt;“volume”: “integer”&lt;/p&gt;

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

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

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

&lt;p&gt;Knowing the schema helps in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preparation&lt;/strong&gt;: It ensures you structure your request correctly and know how to handle the response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Prevention&lt;/strong&gt;: Adhering to schemas minimizes invalid requests or misinterpreted responses.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Schemas saved me time and made debugging much easier while working with the API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Working with JSON&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;APIs often return data in JSON format. Here’s how I handled it in Python:&lt;/p&gt;

&lt;p&gt;import json&lt;/p&gt;

&lt;h1&gt;
  
  
  Read JSON from a file
&lt;/h1&gt;

&lt;p&gt;with open(‘tokens.json’, ‘r’) as f:&lt;/p&gt;

&lt;p&gt;data = json.load(f)&lt;/p&gt;

&lt;h1&gt;
  
  
  Write JSON to a file
&lt;/h1&gt;

&lt;p&gt;with open(‘tokens.json’, ‘w’) as f:&lt;/p&gt;

&lt;p&gt;json.dump(data, f, indent=4)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Error Handling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Python’s try/except blocks helped me manage errors gracefully:&lt;/p&gt;

&lt;p&gt;try:&lt;/p&gt;

&lt;p&gt;response = requests.get(url)&lt;/p&gt;

&lt;p&gt;data = response.json()&lt;/p&gt;

&lt;p&gt;except Exception as e:&lt;/p&gt;

&lt;p&gt;print(f”Error: {str(e)}”)&lt;/p&gt;

&lt;p&gt;return None&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. String Formatting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Python’s &lt;strong&gt;f-strings&lt;/strong&gt; and the .format() method make string formatting straightforward:&lt;/p&gt;

&lt;h1&gt;
  
  
  Using f-strings
&lt;/h1&gt;

&lt;p&gt;print(f”Stock: {name}, Price: ${price:.2f}”)&lt;/p&gt;

&lt;h1&gt;
  
  
  Using .format()
&lt;/h1&gt;

&lt;p&gt;print(“Stock: {}, Price: ${:.2f}”.format(name, price))&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Dictionary Operations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dictionaries in Python are powerful for handling nested API data:&lt;/p&gt;

&lt;h1&gt;
  
  
  Get value with default
&lt;/h1&gt;

&lt;p&gt;price = data.get(‘price’, ‘N/A’)&lt;/p&gt;

&lt;h1&gt;
  
  
  Access nested dictionaries
&lt;/h1&gt;

&lt;p&gt;stock = data[symbol]&lt;/p&gt;

&lt;p&gt;quote = stock.get(‘quote’, {})&lt;/p&gt;

&lt;p&gt;price = quote.get(‘lastPrice’, ‘N/A’)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Debugging Tips&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Debugging in Python is simple and effective:&lt;/p&gt;

&lt;h1&gt;
  
  
  Print debugging
&lt;/h1&gt;

&lt;p&gt;print(f”Debug: {variable}”)&lt;/p&gt;

&lt;h1&gt;
  
  
  Check variable types
&lt;/h1&gt;

&lt;p&gt;print(f”Type: {type(data)}”)&lt;/p&gt;

&lt;h1&gt;
  
  
  Pretty print dictionaries
&lt;/h1&gt;

&lt;p&gt;import json&lt;/p&gt;

&lt;p&gt;print(json.dumps(data, indent=2))&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Overcoming Authentication Challenges&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the biggest hurdles I faced was getting authentication to work. I was stuck for a few days, trying different approaches without success. Eventually, I decided to reach out for support to understand why it wasn’t working.&lt;/p&gt;

&lt;p&gt;It turned out that the issue was related to the type of account I was using. To authenticate successfully, I needed both a &lt;strong&gt;brokerage account&lt;/strong&gt; and a &lt;strong&gt;developer account&lt;/strong&gt;. I initially assumed that only a developer account was required, but the API also required credentials from an active brokerage account.&lt;/p&gt;

&lt;p&gt;This experience taught me an important lesson: &lt;strong&gt;don’t hesitate to ask for help when needed&lt;/strong&gt;. By putting my ego aside and seeking guidance, I gained a deeper understanding of the problem and solved it much faster than if I had continued struggling on my own&lt;/p&gt;

&lt;p&gt;ConclusionPython is incredibly beginner-friendly! Here’s what I learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtual environments keep projects organized.&lt;/li&gt;
&lt;li&gt;Environment variables protect sensitive data.&lt;/li&gt;
&lt;li&gt;Libraries like requests simplify API calls.&lt;/li&gt;
&lt;li&gt;Good error handling is crucial.&lt;/li&gt;
&lt;li&gt;Clear function names and comments enhance readability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next Steps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dive deeper into API authentication.&lt;/li&gt;
&lt;li&gt;Explore data visualization.&lt;/li&gt;
&lt;li&gt;Add more robust error handling.&lt;/li&gt;
&lt;li&gt;Implement automated testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final Thoughts&lt;br&gt;
The best way to learn is by doing. Don’t be afraid to experiment and make mistakes — each challenge is an opportunity to grow!&lt;/p&gt;

&lt;p&gt;Data analysis repo: &lt;a href="https://github.com/Jesse-Chong/Schwab-Market-Analysis" rel="noopener noreferrer"&gt;https://github.com/Jesse-Chong/Schwab-Market-Analysis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://medium.com/@jessechong/playing-with-a-stock-api-a-javascript-react-developer-learns-python-97f5f2110d69" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>stockmarket</category>
      <category>dataanalysis</category>
      <category>python</category>
    </item>
    <item>
      <title>🚀 Cross-Posting Project Update: Automating Posts Across Medium, LinkedIn, and DEV.to</title>
      <dc:creator>Jesse Chong</dc:creator>
      <pubDate>Wed, 18 Dec 2024 17:50:56 +0000</pubDate>
      <link>https://dev.to/jesse_chong_3bcc276c4f950/cross-posting-project-update-automating-posts-across-medium-linkedin-and-devto-48kg</link>
      <guid>https://dev.to/jesse_chong_3bcc276c4f950/cross-posting-project-update-automating-posts-across-medium-linkedin-and-devto-48kg</guid>
      <description>&lt;p&gt;Repost because I accidentally deleted my first ever post!&lt;/p&gt;

&lt;p&gt;🌐 Excited to Share My Latest Work!&lt;br&gt;
I’m thrilled to give an update on a new tool I’ve been building, which automates cross-posting across Medium, LinkedIn, and DEV.to. This has been a fantastic learning journey, and although there’s still more to fine-tune, it’s already operational! 🎉&lt;/p&gt;

&lt;p&gt;🛠️ Technologies Used:&lt;br&gt;
Backend: Node.js, Express&lt;br&gt;
APIs:LinkedIn API, Medium API, DEV.to API, RSS Parser&lt;br&gt;
Libraries: RSS-Parser, Axios&lt;/p&gt;

&lt;p&gt;🔍 Project Overview:&lt;br&gt;
The goal of this project is to streamline the content sharing process across multiple platforms, allowing me to post once and have the content automatically shared on LinkedIn, Medium, and DEV.to. This system converts HTML content to markdown, extracts images, and ensures the correct formatting across all platforms.&lt;/p&gt;

&lt;p&gt;🗝️ Key Features:&lt;/p&gt;

&lt;p&gt;Automated Cross-Posting: Posts made on Medium automatically get shared on LinkedIn and DEV.to (and vice versa).&lt;br&gt;
HTML to Markdown Conversion: Ensures the content is formatted correctly for each platform, including image extraction.&lt;br&gt;
Integration with APIs: Secure authentication using access tokens for LinkedIn, Medium, and DEV.to.&lt;br&gt;
💡 Challenges &amp;amp; Solutions:&lt;/p&gt;

&lt;p&gt;Challenge 1: Working with multiple APIs and managing authentication tokens.&lt;br&gt;
Solution: I separated the API interactions into different files and used environment variables to handle access tokens securely.&lt;/p&gt;

&lt;p&gt;Challenge 2: Creating a Privacy Policy to comply with LinkedIn’s API requirements and obtain an access token.&lt;br&gt;
Solution: I had to research and write a comprehensive privacy policy, outlining how data would be used, to meet LinkedIn’s developer guidelines.&lt;/p&gt;

&lt;p&gt;Challenge 3: Converting HTML content to Markdown for posting on DEV.to and Medium.&lt;br&gt;
Solution: I researched and used HTML-to-Markdown conversion libraries, and learned how to write regex for content parsing.&lt;/p&gt;

&lt;p&gt;Challenge 4: Extracting images from HTML and embedding them correctly in the markdown.&lt;br&gt;
Solution: I created a function that parses the HTML, finds image tags, and converts them into markdown-compatible image links.&lt;/p&gt;

&lt;p&gt;🚀 What I Learned:&lt;/p&gt;

&lt;p&gt;Sharpen ability to integrate and work with multiple APIs efficiently.&lt;br&gt;
The importance of organizing code by separating concerns (e.g., API handling, token management).&lt;br&gt;
How to convert HTML to markdown and deal with content formatting across platforms.&lt;br&gt;
Improved my regex skills, which helped with parsing HTML content.&lt;br&gt;
🌟 Reflection&lt;/p&gt;

&lt;p&gt;The earlier you organize your project structure the easier it is to continue working on it when you have to stop for a while.&lt;/p&gt;

&lt;p&gt;There is a heck of a lot to learn in the tech field and I humbly welcome it.&lt;/p&gt;

&lt;p&gt;🔗 Check Out the repo: &lt;a href="https://github.com/Jesse-Chong/Cross-post-server" rel="noopener noreferrer"&gt;https://github.com/Jesse-Chong/Cross-post-server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading! I’d love to hear your thoughts.&lt;/p&gt;

&lt;h1&gt;
  
  
  APIs #Automation #WebDevelopment #NodeJS #CrossPosting #Regex #Markdown #ContentCreation #FullStackDevelopment #SoftwareEngineering #ProjectManagement
&lt;/h1&gt;

&lt;p&gt;Original article on medium &lt;a href="https://medium.com/@jessechong/cross-posting-project-update-automating-posts-across-medium-linkedin-and-dev-to-ef0cfca5d266" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>crosspost</category>
      <category>node</category>
      <category>devto</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Unexpected Adventure with Leonardo AI: A Developer’s Playful Experiment</title>
      <dc:creator>Jesse Chong</dc:creator>
      <pubDate>Tue, 26 Nov 2024 22:07:17 +0000</pubDate>
      <link>https://dev.to/jesse_chong_3bcc276c4f950/unexpected-adventure-with-leonardo-ai-a-developers-playful-experiment-5gfn</link>
      <guid>https://dev.to/jesse_chong_3bcc276c4f950/unexpected-adventure-with-leonardo-ai-a-developers-playful-experiment-5gfn</guid>
      <description>&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%2Ff30zb9pyine0t5f3yr1x.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%2Ff30zb9pyine0t5f3yr1x.png" width="800" height="612"&gt;&lt;/a&gt;&lt;br&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%2Ffxwpbknx72k0dn7mxigw.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%2Ffxwpbknx72k0dn7mxigw.png" width="800" height="592"&gt;&lt;/a&gt;&lt;br&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%2Fl4zxl79o8uw1f6iqg9q3.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%2Fl4zxl79o8uw1f6iqg9q3.png" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 As a full-stack web developer, I’m always curious about new tools and technologies. Recently, I found myself diving into Leonardo AI — and wow, what an interesting journey of trial and error!&lt;/p&gt;

&lt;p&gt;What started as a simple experiment quickly became a lesson in AI image generation. My first attempt to create an anime-style image of myself was hilariously off-target. Pro tip: AI needs very specific instructions!&lt;/p&gt;

&lt;p&gt;Initially, I used the prompt “transform my picture to look like anime” — and surprise! The AI generated images of a female character. Not exactly what I was going for.&lt;/p&gt;

&lt;p&gt;🐜 Refining the Prompt: A Developer’s Debugging ProcessJust like debugging code, creating the perfect AI-generated image is all about iteration. My next attempts got progressively more specific:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First try: Completely wrong gender&lt;/li&gt;
&lt;li&gt;Second try: “transform my picture to look animated, I am male”&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Final successful prompt: “Same image except the glasses wearing male gendered character is sitting on a computer chair in front of a table with a computer”&lt;br&gt;
💡 Tech Insights for Fellow DevelopersAs someone who works with React and loves exploring new tools, this experience reminded me of a few key things:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Precision matters (just like in coding)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t get discouraged by initial failures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Iterative improvement is key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI tools can be surprisingly powerful when you understand how to use them&lt;br&gt;
🔌 Why This Matters for DevelopersWhile this might seem like just a fun experiment, it’s actually a great example of how AI tools are becoming more accessible. Whether you’re looking to quickly generate mockups, explore UI concepts, or just have a bit of creative fun, tools like Leonardo AI can be surprisingly useful.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🥡 My TakeawayAm I a professional designer now? Definitely not. But I learned something new, had fun doing it, and expanded my understanding of AI image generation. As developers, staying curious and open to new technologies is how we keep growing.&lt;/p&gt;

&lt;p&gt;Want to give it a try? I’d recommend playing around with Leonardo AI — you might be surprised at what you can create!&lt;/p&gt;

&lt;p&gt;Leonardo ai: &lt;a href="https://app.leonardo.ai/" rel="noopener noreferrer"&gt;https://app.leonardo.ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Portfolio website: &lt;a href="https://jesse-chong.netlify.app/" rel="noopener noreferrer"&gt;https://jesse-chong.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://medium.com/@jessechong/unexpected-adventure-with-leonardo-ai-a-developers-playful-experiment-e0dd699969aa" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>netlify</category>
      <category>leonardoai</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>GitHub’s Security Scanner &amp; Conventional Commits — A Developer’s Journey</title>
      <dc:creator>Jesse Chong</dc:creator>
      <pubDate>Mon, 11 Nov 2024 16:35:45 +0000</pubDate>
      <link>https://dev.to/jesse_chong_3bcc276c4f950/githubs-security-scanner-conventional-commits-a-developers-journey-1p3e</link>
      <guid>https://dev.to/jesse_chong_3bcc276c4f950/githubs-security-scanner-conventional-commits-a-developers-journey-1p3e</guid>
      <description>&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%2Fcqirzle4o0dl92mj4d05.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%2Fcqirzle4o0dl92mj4d05.png" width="800" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪞 Reflecting on GitHub Security:&lt;/strong&gt; Received a high-severity security alert from GitHub about a vulnerability in http-proxy-middleware affecting one of my portfolio repositories. GitHub’s Dependabot automatically detected this issue (CVE-2024–21536) in my dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📈 Quick Overview:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security alert identified in yarn.lock file&lt;/li&gt;
&lt;li&gt;Vulnerability found in http-proxy-middleware package&lt;/li&gt;
&lt;li&gt;Automated detection by GitHub’s security scanning system&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementation of conventional commits for better version control&lt;br&gt;
&lt;strong&gt;🗝️ Key Takeaways:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub actively scans repositories for vulnerabilities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated security alerts help maintain project safety&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Importance of regular dependency maintenance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conventional commits improve code collaboration and readability&lt;br&gt;
&lt;strong&gt;💡Response &amp;amp; Resolution:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Reviewed the security advisory details&lt;/li&gt;
&lt;li&gt;Updated the affected dependency with commit message: fix: 🐛 Patch security vulnerability Denial of service in http-proxy-middleware High severity http-proxy-middleware&lt;/li&gt;
&lt;li&gt;Verified the fix was successfully implemented
&lt;strong&gt;🚀 Embracing Conventional Commits:&lt;/strong&gt; Since May, I’ve adopted conventional commits to standardize my commit messages. Here’s how I structure them:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;feat: for new features&lt;/li&gt;
&lt;li&gt;fix: for bug fixes&lt;/li&gt;
&lt;li&gt;docs: for documentation changes&lt;/li&gt;
&lt;li&gt;style: for formatting changes&lt;/li&gt;
&lt;li&gt;refactor: for code restructuring&lt;/li&gt;
&lt;li&gt;test: for adding missing tests&lt;/li&gt;
&lt;li&gt;chore: for maintenance tasks
I also use a vscode extension that makes it easy to write a conventional commit from my code editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🌟 Reflection:&lt;/strong&gt; These experiences highlighted two crucial aspects of modern development: security automation and clear communication through commits. GitHub’s security features keep our projects secure, while conventional commits make our development history more meaningful and easier to track. Using conventional commits has made my version control more professional and easier to maintain.&lt;/p&gt;

&lt;p&gt;Github Docs: &lt;a href="https://docs.github.com/en/code-security/dependabot/dependabot-alerts" rel="noopener noreferrer"&gt;https://docs.github.com/en/code-security/dependabot/dependabot-alerts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conventional Commits Docs: &lt;a href="https://platform.uno/docs/articles/uno-development/git-conventional-commits.html" rel="noopener noreferrer"&gt;https://platform.uno/docs/articles/uno-development/git-conventional-commits.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Security Fix Repo: &lt;a href="https://github.com/Jesse-Chong/react-tailwindcss-portfolio-website" rel="noopener noreferrer"&gt;https://github.com/Jesse-Chong/react-tailwindcss-portfolio-website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading! I’d love to hear your thoughts.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://medium.com/@jessechong/githubs-security-scanner-conventional-commits-a-developer-s-journey-3c02153119da" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>conventionalcommits</category>
      <category>webdev</category>
    </item>
    <item>
      <title>📝 Cross-Post Project Update: Regex, Bug Fixes, and More Regex!</title>
      <dc:creator>Jesse Chong</dc:creator>
      <pubDate>Mon, 04 Nov 2024 18:49:56 +0000</pubDate>
      <link>https://dev.to/jesse_chong_3bcc276c4f950/cross-post-project-update-regex-bug-fixes-and-more-regex-nj6</link>
      <guid>https://dev.to/jesse_chong_3bcc276c4f950/cross-post-project-update-regex-bug-fixes-and-more-regex-nj6</guid>
      <description>&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%2Fupgq6q75ze2nc9byxmvv.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%2Fupgq6q75ze2nc9byxmvv.png" alt="Image description" width="800" height="872"&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%2Fo252ak21pwd57qce24d6.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%2Fo252ak21pwd57qce24d6.png" alt="Image description" width="664" height="787"&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%2Famyuxogdg2vli68ounoz.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%2Famyuxogdg2vli68ounoz.png" alt="Image description" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🪞 &lt;strong&gt;Reflecting on Last Week’s Progress:&lt;/strong&gt;&lt;br&gt;
When cross-posting from Medium to LinkedIn and DEV.to, I noticed several formatting issues: bold and italic text, as well as ordered and unordered lists, were not displaying correctly. Tags were also not posting accurately, and the URL linking back to the original article didn’t work as expected. After some adjustments, formatting is now accurate, and tags are correctly formatted for each platform.&lt;/p&gt;

&lt;p&gt;📈 &lt;strong&gt;Project Update Overview:&lt;/strong&gt;&lt;br&gt;
DEV.to uses Markdown syntax, while LinkedIn does not. LinkedIn also has a 1300-character limit and lacks consistent support for bold and italic formatting. I developed a helper function that formats posts for LinkedIn and DEV.to, adjusting based on the platform input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🗝️ Key Updates:&lt;/strong&gt;&lt;br&gt;
Regex Improvements: Posts are now formatted correctly for LinkedIn and DEV.to.&lt;br&gt;
Tag Extraction from HTML: Tags are properly formatted for each platform.&lt;br&gt;
Canonical URL Cleanup: Query parameters are removed, so the original article URL now works correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🫨 Challenges &amp;amp; Solutions 💡&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 1:&lt;/strong&gt; Bold, italics, and lists weren’t properly formatted for DEV.to and LinkedIn.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;LinkedIn doesn’t support bold, italics, or bullet points, so these were replaced with plain text, with numbers used for bullet points.&lt;/li&gt;
&lt;li&gt;After converting HTML to Markdown, ensured proper formatting (e.g., italics, bold).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Challenge 2:&lt;/strong&gt; Tags from Medium weren’t cross-posting correctly.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DEV.to limits tags to four, requiring lowercase alphanumeric tags in an array format.&lt;/li&gt;
&lt;li&gt;LinkedIn allows hashtags to be embedded, but they must be camelCase (no spaces or dashes) and limited to 1300 characters.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
Adjust tags to meet each platform’s requirements.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For DEV.to: Remove non-alphanumeric characters, convert tags to lowercase, and limit to four tags.&lt;/li&gt;
&lt;li&gt;For LinkedIn: Remove any prefix hashtags, convert spaces or dashes to camelCase, and re-add the #.&lt;/li&gt;
&lt;li&gt;Kept content within 1200 characters to allow room for title, URL, and tags.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Challenge 3:&lt;/strong&gt; Medium’s RSS feed sometimes includes unnecessary query parameters in URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
Extract the clean URL for cross-posting.&lt;/p&gt;

&lt;p&gt;🌟 &lt;strong&gt;Reflection:&lt;/strong&gt;&lt;br&gt;
Working with regex has been fascinating; it’s powerful and versatile for various use cases. I’ve used it before in my Fresh Start project for translating directions, which showed me how effective it can be. That said, regex has limitations, so it’s essential to use it cautiously, depending on your needs.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Check Out the Repo:&lt;/strong&gt; &lt;a href="https://github.com/Jesse-Chong/Cross-post-server" rel="noopener noreferrer"&gt;https://github.com/Jesse-Chong/Cross-post-server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading! I’d love to hear your thoughts.&lt;/p&gt;

</description>
      <category>node</category>
      <category>regex</category>
      <category>softwareengineering</category>
      <category>api</category>
    </item>
    <item>
      <title>Cross-Posting and Portfolio Project Update: Optimizing API Calls and Implementing Best Practices</title>
      <dc:creator>Jesse Chong</dc:creator>
      <pubDate>Fri, 25 Oct 2024 21:55:49 +0000</pubDate>
      <link>https://dev.to/jesse_chong_3bcc276c4f950/cross-posting-and-portfolio-project-update-optimizing-api-calls-and-implementing-best-practices-23mb</link>
      <guid>https://dev.to/jesse_chong_3bcc276c4f950/cross-posting-and-portfolio-project-update-optimizing-api-calls-and-implementing-best-practices-23mb</guid>
      <description>&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%2Fflml2yuo7ycifsyqzs2k.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%2Fflml2yuo7ycifsyqzs2k.png" width="800" height="854"&gt;&lt;/a&gt;&lt;br&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%2Fj0pd120msrbo1x66506d.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%2Fj0pd120msrbo1x66506d.png" width="800" height="885"&gt;&lt;/a&gt;&lt;br&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%2Fhamcu9qqrs27484jqji1.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%2Fhamcu9qqrs27484jqji1.png" width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌟 &lt;strong&gt;Excited to Share My Recent Work!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Though I’ve been a bit inactive lately due to personal reasons, I want to take a moment to showcase some recent updates I made to my portfolio website a few weeks ago. In particular, I focused on tackling the lag times for API calls, which were exceeding 30 seconds, and enhancing my site by adding a demo video to better showcase my app.&lt;/p&gt;

&lt;p&gt;I’m excited to share the lessons I learned and the solutions I implemented to improve performance and security, all while using some fantastic tools like &lt;strong&gt;Netlify&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;🔍 &lt;strong&gt;Project Update Overview:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I discovered that &lt;strong&gt;Netlify Functions&lt;/strong&gt; is a serverless function feature offered by Netlify that hosts your API calls, significantly reducing my response time by 97.5%. The &lt;strong&gt;Netlify CLI&lt;/strong&gt; was also incredibly helpful in allowing me to test my code within Netlify’s configuration before committing and pushing changes to my repository.&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;New Technologies Added:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;**- Netlify Functions&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Netlify CLI**&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🗝️ Key Updates:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lag-free API calls:&lt;/strong&gt; By utilizing Netlify Functions, I was able to reduce API response times to nearly zero — &lt;strong&gt;and it’s free&lt;/strong&gt;, as long as the API calls aren’t made too frequently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio App Demo Video:&lt;/strong&gt; I also added a video demo to showcase my app in action, making the portfolio much more interactive and engaging.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 &lt;strong&gt;Challenges &amp;amp; Solutions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 1: Implementing Netlify Functions Correctly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since I wasn’t familiar with Yarn’s environment, integrating it with Netlify was a bit tricky.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;I deleted the _redirects file and moved its contents to netlify.toml.&lt;/li&gt;
&lt;li&gt;I also added command = “yarn build” and publish = “build” to the configuration, as I’m using Yarn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Challenge 2: Adding a Video to My Portfolio&lt;/p&gt;

&lt;p&gt;Adding a video to my portfolio website seemed straightforward but caused issues due to a common security risk: using target=”_blank” without the rel=”noreferrer” attribute.&lt;/p&gt;

&lt;p&gt;**Solution: **To mitigate the security risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I added the rel=”noopener noreferrer” attribute to my anchor tags (&amp;lt;a&amp;gt;). This ensures protection against &lt;strong&gt;reverse tabnabbing&lt;/strong&gt; attacks and enhances privacy by preventing browsers from sending the HTTP referrer header.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Security Best Practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;rel=”noopener”:&lt;/strong&gt; Protects against reverse tabnabbing and runs the new page in a separate process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rel=”noreferrer”:&lt;/strong&gt; Hides the referrer header for privacy and security purposes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 &lt;strong&gt;What I Learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always explore all the features and tools a product or service offers (whether it’s APIs or cloud hosting) to ensure they meet your project’s needs.&lt;/li&gt;
&lt;li&gt;If a product offers a testing environment and a CLI tool, it’s often worth learning — these can significantly speed up development.&lt;/li&gt;
&lt;li&gt;It’s critical to stay informed on best practices for security to protect against common vulnerabilities and attacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🌟 &lt;strong&gt;Reflection:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When working with new technology, take the time to experiment with features you think you might need now or in the future. It’ll make development smoother and help future-proof your projects.&lt;/p&gt;

&lt;p&gt;🔗 Check Out the Repo portfolio website: &lt;a href="https://github.com/Jesse-Chong/react-tailwindcss-portfolio-website" rel="noopener noreferrer"&gt;https://github.com/Jesse-Chong/react-tailwindcss-portfolio-website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 Check Out the Repo for cross post: &lt;a href="https://github.com/Jesse-Chong/Cross-post-server" rel="noopener noreferrer"&gt;https://github.com/Jesse-Chong/Cross-post-server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading! I’d love to hear your thoughts.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://medium.com/@jessechong/cross-posting-and-portfolio-project-update-optimizing-api-calls-and-implementing-best-practices-6354cf5a5ac6" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>api</category>
      <category>netlify</category>
    </item>
  </channel>
</rss>
