<?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: OdyAsh</title>
    <description>The latest articles on DEV Community by OdyAsh (@odyash).</description>
    <link>https://dev.to/odyash</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%2F549180%2Fe5fdbade-b9dd-4b18-acb6-805a79fca0be.jpeg</url>
      <title>DEV Community: OdyAsh</title>
      <link>https://dev.to/odyash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/odyash"/>
    <language>en</language>
    <item>
      <title>Why RSS Feeds Are Useful</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Sat, 31 May 2025 08:05:21 +0000</pubDate>
      <link>https://dev.to/odyash/example-on-rss-feeds-are-useful-odyash-quickies-4743</link>
      <guid>https://dev.to/odyash/example-on-rss-feeds-are-useful-odyash-quickies-4743</guid>
      <description>&lt;p&gt;🎯 The aim of this post is to provide an example on why you should incorporate RSS feeds in your daily routines :].&lt;/p&gt;

&lt;p&gt;🔎 When trying to get up-to-date with Python's current landscape, I often find "articles going over trivial (but still useful) things" [1], so I try to tailor my RSS feed to give me news from on-the-ground devs.&lt;/p&gt;

&lt;p&gt;💡 One great example I found is &lt;a href="https://www.linkedin.com/in/edwardjxli/?lipi=urn%3Ali%3Apage%3Ad_flagship3_feed%3BhOWaGYgkTBqvKTi6qFwGWA%3D%3D" rel="noopener noreferrer"&gt;Edward Li&lt;/a&gt;. He just started posting recently [2] [image-1], but he tackles deep-tech topics/ideas with an easy-to-understand writing style, which is a goldmine in the AI-generated slop ecosystem we live in nowadays [3].&lt;/p&gt;

&lt;p&gt;🔖 Therefore, I suggest adding his blogs to your RSS feed! 🙌 [footnote-1] [image-2]&lt;/p&gt;

&lt;p&gt;[footnote-1]: Check this 1-min. video if you don't know what an RSS is: &lt;a href="https://lnkd.in/dpqG_3AU" rel="noopener noreferrer"&gt;https://lnkd.in/dpqG_3AU&lt;/a&gt; , then get one of the RSS apps that sync between your PC/mobile for easy access. My suggestion: feedly app. [image-2] is taken from feedly.com.&lt;/p&gt;

&lt;p&gt;[1]: this was actually a quote I took :] from one of his articles: &lt;a href="https://lnkd.in/dpN3-HqP" rel="noopener noreferrer"&gt;https://lnkd.in/dpN3-HqP&lt;/a&gt;&lt;br&gt;
[2]: Edward Li's blog page: &lt;a href="https://lnkd.in/dgsYnxxu" rel="noopener noreferrer"&gt;https://lnkd.in/dgsYnxxu&lt;/a&gt;&lt;br&gt;
[3]: Article on AI-Slop Destroying the Internet: &lt;a href="https://lnkd.in/dDCEpQ8g" rel="noopener noreferrer"&gt;https://lnkd.in/dDCEpQ8g&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[image-1]:&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%2F4c7tuieponnktfprz6w0.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%2F4c7tuieponnktfprz6w0.png" alt="Image description" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[image-2]:&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%2Fccuta9n9m9d3nka3hecy.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%2Fccuta9n9m9d3nka3hecy.png" alt="Image description" width="709" height="937"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>news</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>resources</category>
    </item>
    <item>
      <title>Surviving The Vibe Coding Trend</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Sun, 11 May 2025 16:32:55 +0000</pubDate>
      <link>https://dev.to/odyash/surviving-the-vibe-coding-trend-as-a-cs-student-10ee</link>
      <guid>https://dev.to/odyash/surviving-the-vibe-coding-trend-as-a-cs-student-10ee</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;TOC:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
"Why Should I join CS When Code Can Be Easily Vibed 🏄‍♂️ ?"

&lt;ul&gt;
&lt;li&gt;"Problem Complexity? Huh?"&lt;/li&gt;
&lt;li&gt;"Ok, So Does The AI &lt;em&gt;Vibe&lt;/em&gt; ✨ With All of These Levels?"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

"What You're Saying is a Little Bit Abstract. Examples, Plz?"

&lt;ul&gt;
&lt;li&gt;First - Strategic Thinking (&lt;code&gt;lvl1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Next - Technical Decision Making (&lt;code&gt;lvl2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Then - Tactical Problem Solving (&lt;code&gt;lvl3&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Finally - Function Implementation (&lt;code&gt;lvl4&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Final Product&lt;/li&gt;
&lt;li&gt;Lessons Learned From This Journey&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Footnotes and References&lt;/li&gt;

&lt;li&gt;If you Have Any Questions/Suggestions...&lt;/li&gt;

&lt;li&gt;And If I made a mistake&lt;/li&gt;

&lt;/ul&gt;




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

&lt;p&gt;This post acts a survival guide for devs. (with a focus on CS students) who are currently in the middle of the "Vibe Coding" wave 🌊. [1]&lt;/p&gt;

&lt;p&gt;Actually, I'll phrase this post in a question-answer format while assuming that you are a pessimistic dev. who is not &lt;em&gt;vibing&lt;/em&gt; with the current AI trends.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  "Why Should I join CS When Code Can Be Easily Vibed 🏄‍♂️ ?"
&lt;/h2&gt;

&lt;p&gt;First of all, what "code" are you talking about?&lt;/p&gt;

&lt;p&gt;You "code" to accomplish a "task". I.e., a "problem" that you want to solve.&lt;/p&gt;

&lt;p&gt;These &lt;code&gt;problems&lt;/code&gt; &lt;em&gt;can&lt;/em&gt; be categorized into multiple levels of &lt;code&gt;complexity&lt;/code&gt; ...&lt;/p&gt;

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

&lt;h3&gt;
  
  
  "Problem Complexity? Huh?"
&lt;/h3&gt;

&lt;p&gt;Yes, here's a simple categorization of the problems that any developer faces in terms of complexity/scope [fn.1]:&lt;/p&gt;

&lt;p&gt;(Shown in this order: &lt;code&gt;lvl1&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl2&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl3&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl4&lt;/code&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%2F33a9yziap8kzhfwjyvj4.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%2F33a9yziap8kzhfwjyvj4.png" alt="problem-complexity-levels-diagram" width="184" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Details of each level [fn.1]: &lt;/p&gt;

&lt;p&gt;(Explained in this order: &lt;code&gt;lvl4&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl3&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl1&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl2&lt;/code&gt;)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simple isolated problems&lt;/strong&gt; (&lt;code&gt;lvl4&lt;/code&gt;): These are the problems that can be &lt;em&gt;usually&lt;/em&gt; solved using a single &lt;strong&gt;function&lt;/strong&gt;. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For example, reading an audio file from a local file path into RAM. &lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Complex isolated problems&lt;/strong&gt; (&lt;code&gt;lvl3&lt;/code&gt;): These are the problems that can be solved using a workflow of multiple logically-connected steps. &lt;em&gt;Usually&lt;/em&gt;, in a series of function calls. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For example, downloading audio files from a website, concatenating them, and then converting them to a single audio file. &lt;/li&gt;
&lt;li&gt;Concretely, a &lt;code&gt;lvl3&lt;/code&gt; problem can be broken down to &lt;code&gt;lvl4&lt;/code&gt; problems that are connected together.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Abstract connected problems&lt;/strong&gt; (&lt;code&gt;lvl1&lt;/code&gt;): These are &lt;em&gt;big picture&lt;/em&gt; problems by understanding the &lt;em&gt;big picture&lt;/em&gt; of a system. These are the problems that made you want to develop the system in the first place. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Also known as: "high level design (hld)" / "system design" / "system architecture".&lt;/li&gt;
&lt;li&gt;For example, a system that allows users to get audio files from a website, then download them as a single audio file.&lt;/li&gt;
&lt;li&gt;These are "solved" by having a mental model of:

&lt;ol&gt;
&lt;li&gt;The exact requirements of the system (i.e., the problem).&lt;/li&gt;
&lt;li&gt;The system architecture (i.e., the solution). E.g., "a web app, where the frontend requests the audio files, and backend processes them, and then returns the final audio file to the frontend".&lt;/li&gt;
&lt;li&gt;Optionally: We create a prototype with placeholders for the functions that we will implement later (just to mentally visualize the flow of the system). &lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Concrete connected problems&lt;/strong&gt; (&lt;code&gt;lvl2&lt;/code&gt;): These are the problems that are solved by specifying the details of the system architecture then implementing them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Also known as: "low level design (lld)"." &lt;/li&gt;
&lt;li&gt;E.g., react/fastapi for frontend/backend, streamlit for both, etc. python as main language, uv for managing dependencies, etc.&lt;/li&gt;
&lt;li&gt;Concretely, a &lt;code&gt;lvl1&lt;/code&gt; problem is basically a series of &lt;code&gt;lvl3&lt;/code&gt; problems that are connected together.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

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

&lt;h3&gt;
  
  
  "Ok, So Does The AI &lt;em&gt;Vibe&lt;/em&gt; ✨ With All of These Levels?"
&lt;/h3&gt;

&lt;p&gt;Let's visualize how our brains process these different problem levels and when AI assistance is most effective:&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%2Fmlzcwu1278vtg7ip9hcn.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%2Fmlzcwu1278vtg7ip9hcn.png" alt="ai-vibe-brain-diagram" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Side note: Open the above image &lt;a href="https://raw.githubusercontent.com/OdyAsh/odyash-dev.to/master/the-blog-posts/vibe-coding/assets/ai-vibe-brain-diagram.png"&gt;here&lt;/a&gt; if it's appearing blurry on &lt;code&gt;dev.to&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now let's break it down:&lt;/p&gt;

&lt;p&gt;(In this order: &lt;code&gt;lvl4&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl3&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl1&lt;/code&gt; -&amp;gt; &lt;code&gt;lvl2&lt;/code&gt;)&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;For &lt;code&gt;lvl4&lt;/code&gt; problems: Yes, AI can &lt;a href="https://www.youtube.com/shorts/6s8qa9Kl5-s" rel="noopener noreferrer"&gt;easily vibe&lt;/a&gt; with them. &lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;For &lt;code&gt;lvl3&lt;/code&gt; problems: Usually, yes. But...

&lt;ol&gt;
&lt;li&gt;If the problem is related to a &lt;a href="https://distantjob.com/blog/best-tech-stack/" rel="noopener noreferrer"&gt;tech stack&lt;/a&gt; that the AI is not familiar with, then its &lt;em&gt;vibeage&lt;/em&gt; will be limited.

&lt;ol&gt;
&lt;li&gt;E.g., if you ask the AI to write a function that uses a library that it doesn't know about.&lt;/li&gt;
&lt;li&gt;This can be mitigated by providing the library's docs yes... but this will not always be a possible option. Examples:

&lt;ol&gt;
&lt;li&gt;Library has outdated docs.&lt;/li&gt;
&lt;li&gt;Library has no docs at all.&lt;/li&gt;
&lt;li&gt;Library is not open-source, so you can't even clone it and tell AI to read it.&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;If you phrase your request in a very strict way, then the AI could overcomplicate the solution. 

&lt;ol&gt;
&lt;li&gt;E.g., you ask AI to do A/B/C to get D, but if you've just asked it to do D, then it would have done it in a simpler away.

&lt;ol&gt;
&lt;li&gt;I.e., under-trusting your AI buddy &lt;code&gt;:[&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;If you phrase your request in a very vague way, then the AI could over-simplify the solution while neglecting important corner cases. 

&lt;ol&gt;
&lt;li&gt;E.g., you ask AI to return D, but you forgot to mention that D should be in a specific format, or that it should be sorted in a specific way, etc.

&lt;ol&gt;
&lt;li&gt;I.e., Over-trusting your AI buddy &lt;code&gt;:[&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;For &lt;code&gt;lvl1&lt;/code&gt; problems: depending on the complexity of the problem you're trying to solve:

&lt;ol&gt;
&lt;li&gt;For commonly known problems (e.g., "write a full web-based todo app"), it can provide a &lt;em&gt;big picture&lt;/em&gt; solution (e.g., it will whip up a possible system architecture for you).&lt;/li&gt;
&lt;li&gt;For less commonly known problems, the provided &lt;em&gt;big picture&lt;/em&gt; solution will be less accurate than the previous example.

&lt;ol&gt;
&lt;li&gt;E.g., if you want to create a app for Islamic prayer times, then it might propose using an outdated GitHub library that &lt;strong&gt;calculates&lt;/strong&gt; prayer times &lt;strong&gt;offline&lt;/strong&gt;, even though your solution might be better off using an &lt;strong&gt;online API&lt;/strong&gt; service instead.&lt;/li&gt;
&lt;li&gt;Well then how do you know which system architecture is more well suited?

&lt;ol&gt;
&lt;li&gt;You look at your requirements and constraints. For example, if you know that this prayer times app will be mostly working offline, then prefer a calculation library over an online API service, etc.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Therefore, you need to have a good understanding of the problem you're trying to solve, and the requirements/constraints of the system you're trying to build.

&lt;ol&gt;
&lt;li&gt;This is where your CS knowledge comes in handy! &lt;code&gt;:]&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Then &lt;strong&gt;&lt;em&gt;and only then&lt;/em&gt;&lt;/strong&gt; can you ask the AI to help you with the &lt;em&gt;big picture&lt;/em&gt; solution.&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;For &lt;code&gt;lvl2&lt;/code&gt; problems: Similar situation to &lt;code&gt;lvl1&lt;/code&gt; problems;

&lt;ol&gt;
&lt;li&gt;If you just give it a high level design (i.e., a &lt;code&gt;lvl1&lt;/code&gt; solution) and tell it to suggest the suitable tech stack and provide detailed implementation &lt;strong&gt;without&lt;/strong&gt; giving it proper requirements/constraints/context, then it may choose &lt;strong&gt;libraries that are not suitable&lt;/strong&gt; for your use case down the road.

&lt;ol&gt;
&lt;li&gt;For example, in the prayer times app, it may suggest an API library that has a monthly limit of 1000 requests, while your app may need to make 2000 requests per month, etc.&lt;/li&gt;
&lt;li&gt;Well then how should you have tackled this problem?: By having a &lt;em&gt;prior experience&lt;/em&gt; on using APIs, so that you can ask questions like "API's rate limit?", "API's server availability?", "API's response time?", etc., and accordingly have an explicit requirement/constraint for the AI to work with.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  "What You're Saying is a Little Bit Abstract. Examples, Plz?"
&lt;/h2&gt;

&lt;p&gt;Let me map these levels using a real project I recently built: &lt;a href="https://github.com/odyash/ayahs-audio-downloader" rel="noopener noreferrer"&gt;ayahs-audio-downloader&lt;/a&gt; - a tool that downloads and concatenates Quranic audio verses.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  First - Strategic Thinking (&lt;code&gt;lvl1&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;My journey started with a high-level problem: "I want to create a tool that lets users select a range of Quranic verses, download their audio files, and combine them into a single file."&lt;/p&gt;

&lt;p&gt;In my &lt;a href="https://github.com/OdyAsh/ayahs-audio-downloader/blob/b67d032ef74364ff44e67ebe7ccc9a3d7244025c/.specstory/history/2025-05-05_16-16-i-want-api-suggestions-for-the-following.md" rel="noopener noreferrer"&gt;initial prompt&lt;/a&gt;, I wrote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I input an ayah range (e.g., 2:2 - 2:8), then that API gives me these ayahs with audios, and I then concatenate them together to a single audio file."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was thinking at the highest abstraction level - what the system should accomplish, not how it would work.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Next - Technical Decision Making (&lt;code&gt;lvl2&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;After exploring available APIs, I made architectural decisions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the &lt;a href="https://quranapi.pages.dev" rel="noopener noreferrer"&gt;Quran API&lt;/a&gt; for audio files&lt;/li&gt;
&lt;li&gt;Build a Streamlit web application for the interface&lt;/li&gt;
&lt;li&gt;Structure the project with separate modules for downloading and processing&lt;/li&gt;
&lt;li&gt;Use Python with &lt;code&gt;uv&lt;/code&gt; for dependency management&lt;/li&gt;
&lt;li&gt;Include FFmpeg via &lt;code&gt;packages.txt&lt;/code&gt; for Streamlit Cloud deployment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I outlined these requirements in detail:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"3.1 The user chooses the starting ayah (e.g., 2:1) and the ending ayah (e.g., 2:8)&lt;br&gt;
3.2 the user then chooses the reciter of choice...&lt;br&gt;
3.3 the user clicks on get audio file..."&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h3&gt;
  
  
  Then - Tactical Problem Solving (&lt;code&gt;lvl3&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Next, I broke down the main functionality into discrete problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Downloading audio files for a range of verses&lt;/li&gt;
&lt;li&gt;Concatenating audio files into a single MP3&lt;/li&gt;
&lt;li&gt;Handling the UI flow with Streamlit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each of these needed a specific implementation strategy. For example, the audio concatenation process required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loading each audio file with PyDub&lt;/li&gt;
&lt;li&gt;Joining them sequentially&lt;/li&gt;
&lt;li&gt;Handling errors if any file failed to process&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Finally - Function Implementation (&lt;code&gt;lvl4&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;At the lowest level, I had individual functions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;parse_ayah_reference()&lt;/code&gt; - Parse an input like "2:5" into surah and ayah numbers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_reciter_id_by_name()&lt;/code&gt; - Map reciter names to their IDs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;download_ayah_audio()&lt;/code&gt; - Download a single audio file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generate_output_filename()&lt;/code&gt; - Create a standardized filename&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are simple, isolated functions that each do one thing well.&lt;/p&gt;

&lt;p&gt;This workflow - starting with the big picture (lvl1), making architectural choices (lvl2), breaking it into major components (lvl3), and finally writing individual functions (lvl4) - represents a much more efficient approach than jumping straight to coding without proper planning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Product
&lt;/h3&gt;

&lt;p&gt;The Streamlit 👑 app can be accessed here: &lt;a href="https://ayahs-audio-downloader.streamlit.app/" rel="noopener noreferrer"&gt;https://ayahs-audio-downloader.streamlit.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;App demo:&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%2F4jd02mvb9nzbhh8yngaq.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%2F4jd02mvb9nzbhh8yngaq.png" alt="ayahs-audio-downloader-streamlit-app-demo" width="500" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;App's architecture:&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%2Fbo6pa3r4byx8mm5acwho.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%2Fbo6pa3r4byx8mm5acwho.png" alt="ayahs-audio-downloader-streamlit-architecture" width="501" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://deepwiki.com/OdyAsh/ayahs-audio-downloader#component-diagram" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Lessons Learned From This Journey
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Importance of Planning&lt;/strong&gt;: If I had taken more time to plan the project, I could have avoided some of the pitfalls I encountered. Examples:

&lt;ol&gt;
&lt;li&gt;I didn't &lt;em&gt;think&lt;/em&gt; which audio-processing library I should choose. Instead, I relied on the AI model (i.e., copilot) to suggest one for me.

&lt;ol&gt;
&lt;li&gt;It chose &lt;code&gt;pydub&lt;/code&gt; which is a great library, but it internally uses &lt;code&gt;ffmpeg&lt;/code&gt;, which isn't a python library. So I had to install it separately.&lt;/li&gt;
&lt;li&gt;If I had just &lt;em&gt;thought&lt;/em&gt; about it, I would have realized that most audio-processing libraries use &lt;code&gt;ffmpeg&lt;/code&gt; under the hood anyways, so I would've indicated to copilot a new constraint:

&lt;ol&gt;
&lt;li&gt;"I want to use a library that doesn't require any external dependencies".&lt;/li&gt;
&lt;li&gt;Or: "I'm later uploading this to streamlit cloud, so read &lt;a href="https://docs.streamlit.io/deploy/streamlit-community-cloud/deploy-your-app/app-dependencies" rel="noopener noreferrer"&gt;the streamlit docs&lt;/a&gt; to see how it handles external dependencies and act accordingly"&lt;/li&gt;
&lt;li&gt;Etc.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Think of Dependencies That The AI Might Want to Know About&lt;/strong&gt;: Examples:

&lt;ol&gt;
&lt;li&gt;Stating that the solution will be eventually deployed to streamlit cloud would have helped copilot act accordingly on how to install &lt;code&gt;ffmpeg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stating that the solution will use Python 3.13 could have helped copilot choose libraries that are compatible with it.

&lt;ol&gt;
&lt;li&gt;For example, it chose &lt;code&gt;pydub&lt;/code&gt;, which turned out to have issues with Python 3.13, so I had to downgrade to 3.11.&lt;/li&gt;
&lt;li&gt;However, I'm skeptical about this tip. I.e., I'm skeptical that copilot is trained enough to know that certain python libraries have issues with certain python versions. So I wouldn't rely on this tip too much.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Ride The Vibe Tech Wave&lt;/strong&gt;: There is so many tools/websites out there that can help you with your workflow/docs. Examples:

&lt;ol&gt;
&lt;li&gt;GitHub Copilot: &lt;a href="https://www.youtube.com/watch?v=dutyOc_cAEU" rel="noopener noreferrer"&gt;Enough said&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://deepwiki.com/" rel="noopener noreferrer"&gt;Deep Wiki&lt;/a&gt;: A website that indexes your public GitHub repos and provide nice docs for it.

&lt;ol&gt;
&lt;li&gt;E.g.: &lt;a href="https://deepwiki.com/OdyAsh/ayahs-audio-downloader" rel="noopener noreferrer"&gt;https://deepwiki.com/OdyAsh/ayahs-audio-downloader&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Generate &lt;a href="https://mermaid.js.org/intro/" rel="noopener noreferrer"&gt;mermaid diagrams&lt;/a&gt; with AI. 

&lt;ol&gt;
&lt;li&gt;Details: &lt;a href="https://mike-vincent.medium.com/llm-mermaid-how-modern-teams-create-uml-diagrams-without-lucidchart-e54c56350804" rel="noopener noreferrer"&gt;Medium article&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Even the diagrams in this article are generated using mermaid &lt;code&gt;:]&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://marketplace.visualstudio.com/items?itemName=SpecStory.specstory-vscode" rel="noopener noreferrer"&gt;SpecStory&lt;/a&gt; Extension: An IDE extension that tracks/saves your conversation's with the IDE's AI model (e.g., copilot).

&lt;ol&gt;
&lt;li&gt;For example, check out the markdown files &lt;a href="https://github.com/OdyAsh/odyash-dev.to/tree/master/.specstory/history"&gt;here&lt;/a&gt; to see how I made this article &lt;code&gt;;]&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Use AI as your "friendly neighbourhood plumber" [2].

&lt;ol&gt;
&lt;li&gt;Updated your codebase and now you're dreading the README.md and docs/*.md documentation? Just ask the AI to do it for you.&lt;/li&gt;
&lt;li&gt;Need to manually change file references? Let the AI create a VSCode task that will &lt;a href="//../../docs/update-dev-to-git-json-upon-save.md"&gt;automatically do this for you&lt;/a&gt; &amp;lt;3. &lt;/li&gt;
&lt;li&gt;and so on...&lt;/li&gt;
&lt;li&gt;See the pattern here? The 2 problems above are &lt;code&gt;lvl2&lt;/code&gt;, so &lt;a href="//../../.specstory/history/2025-05-11-auto-update-json-logic.md"&gt;prompt the AI succinctly&lt;/a&gt;, and the AI will return a mostly working solution &lt;code&gt;:]&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Just Because You Can Vibe, Doesn't Mean You Should&lt;/strong&gt;: 

&lt;ol&gt;
&lt;li&gt;I did some problem-solving by myself (e.g., &lt;code&gt;lvl3&lt;/code&gt;, parts of &lt;code&gt;lvl4&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Yet, I still relied on the AI for most of the implementation (e.g., majority of &lt;code&gt;lvl4&lt;/code&gt;, which is a series of &lt;code&gt;lvl2&lt;/code&gt;/&lt;code&gt;lvl1&lt;/code&gt; problems that the AI defined and solved).&lt;/li&gt;
&lt;li&gt;However, what helped me is that I already had a mental &lt;em&gt;big picture&lt;/em&gt; on how a problem like this can be solved and what tech stack is suitable for it.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;What I'm trying to say is this: Only when you're comfortable with problem solving, system designing, and experiencing different tech stacks hands-on, then you can start relying on the AI to do the &lt;em&gt;vibing&lt;/em&gt; for you 🏄‍♂️✅:&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%2Fmedia1.giphy.com%2Fmedia%2FdJUtqIcqeyMvK%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img alt="surf riding gif" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2FdJUtqIcqeyMvK%2Fgiphy.gif" width="149" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Otherwise, you will be lost in the middle of the vibe waves, and you won't know how to swim back to shore 🏊‍♂️❌:&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%2Fo48ffobnj6oukuckuutd.gif" 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%2Fo48ffobnj6oukuckuutd.gif" alt="drowning gif" width="220" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Footnotes and References
&lt;/h2&gt;

&lt;p&gt;[fn.1]: These levels of complexity are completely subjective, and they are not based on any scientific research. They are just a way for me to mentally categorize a problem when I see it.&lt;/p&gt;

&lt;p&gt;[1]: Cover art by &lt;a href="https://petesena.medium.com/?source=post_page---byline--124b9288e551---------------------------------------" rel="noopener noreferrer"&gt;Pete Sena&lt;/a&gt;: "&lt;a href="https://uxdesign.cc/cracking-the-code-of-vibe-coding-124b9288e551" rel="noopener noreferrer"&gt;Cracking the code of vibe coding&lt;/a&gt;" medium article. Side logos by flaticon.com (&lt;a href="https://www.flaticon.com/free-icon/computer-science_5044590" rel="noopener noreferrer"&gt;computer science&lt;/a&gt;, &lt;a href="https://www.flaticon.com/free-icon/problem-solving_6487594" rel="noopener noreferrer"&gt;problem solving&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;[2]: &lt;a href="https://www.karllhughes.com/posts/plumbing" rel="noopener noreferrer"&gt;The Bulk of Software Engineering is Just Plumbing, by Karl Hughes&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  If you Have Any Questions/Suggestions...
&lt;/h2&gt;

&lt;p&gt;Your participation is most welcome! 🔥🙌&lt;/p&gt;

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

&lt;h2&gt;
  
  
  And If I made a mistake
&lt;/h2&gt;

&lt;p&gt;Then kindly correct me by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing a comment ✍️&lt;/li&gt;
&lt;li&gt;Or opening a PR on &lt;a href="https://github.com/OdyAsh/odyash-dev.to/tree/master/the-blog-posts"&gt;GitHub&lt;/a&gt; 

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/maxime1992/manage-your-dev-to-the-blog-posts-from-a-git-repo-and-use-continuous-deployment-to-auto-publish-update-them-143j#:~:text=%0A%20%20%0A%20%20Found%20a%20typo%3F%0A"&gt;Details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;See ya! &lt;code&gt;:]&lt;/code&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%2F1s7lhq0err7k5simhhu1.gif" 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%2F1s7lhq0err7k5simhhu1.gif" alt="goodbye gif" width="360" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>From LocalHost to Public Endpoint - Quickly Share Your Work With zrok</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Sat, 30 Nov 2024 13:26:50 +0000</pubDate>
      <link>https://dev.to/odyash/quickly-share-your-app-with-zrok-4ihp</link>
      <guid>https://dev.to/odyash/quickly-share-your-app-with-zrok-4ihp</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;TOC:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Use Case&lt;/li&gt;
&lt;li&gt;Install zrok to Your OS&lt;/li&gt;
&lt;li&gt;Create an Account&lt;/li&gt;
&lt;li&gt;See The Initial UI of zrok&lt;/li&gt;
&lt;li&gt;Connect Your Device with Your Account&lt;/li&gt;
&lt;li&gt;
The Magical Part - zrok Reserve and Share

&lt;ul&gt;
&lt;li&gt;Later Runs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Important Advice&lt;/li&gt;

&lt;li&gt;If you Have Any Questions/Suggestions...&lt;/li&gt;

&lt;li&gt;And If I made a mistake&lt;/li&gt;

&lt;/ul&gt;






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

&lt;h2&gt;
  
  
  Use Case
&lt;/h2&gt;

&lt;p&gt;Suppose you're using a web server framework like &lt;a href="https://dev.to/kfir-g/understanding-fastapi-fundamentals-a-guide-to-fastapi-uvicorn-starlette-swagger-ui-and-pydantic-2fp7#:~:text=%0A%20%20%0A%20%202.%20Uvicorn%3A%20The%20ASGI%20Server%0A"&gt;uvicorn&lt;/a&gt; to run your backend service locally (e.g., on &lt;code&gt;http://localhost:8000&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Ok, but that &lt;code&gt;http://...&lt;/code&gt; is a local URL... So how do we share it publically instead of locally?&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://docs.zrok.io/docs/getting-started/#whats-a-zrok" rel="noopener noreferrer"&gt;zrok&lt;/a&gt;! 🌌&lt;/p&gt;

&lt;p&gt;(Side note: Check the first 2 paragraphs &lt;a href="https://github.com/orgs/ansari-project/projects/3/views/1" rel="noopener noreferrer"&gt;here&lt;/a&gt; for a more eloquent explanation of when to use zrok :])&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%2F61yvs67vuvysshwqzx6l.gif" 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%2F61yvs67vuvysshwqzx6l.gif" alt="spaceship gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Install zrok to Your OS
&lt;/h2&gt;

&lt;p&gt;Based on your Operating System (OS), follow the steps in the &lt;code&gt;guide&lt;/code&gt; page reached from &lt;a href="https://docs.zrok.io/docs/guides/install/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When you're done, executing &lt;code&gt;zrok -h&lt;/code&gt; in a &lt;a href="https://medium.com/@ayogun/shell-vs-bash-vs-powershell-vs-cmd-fa916895aab" rel="noopener noreferrer"&gt;terminal&lt;/a&gt; should give you the list of commands that you can run using zrok!&lt;/p&gt;

&lt;p&gt;Side note 1: Regarding Windows users, the commands written in their &lt;a href="https://docs.zrok.io/docs/guides/install/windows/" rel="noopener noreferrer"&gt;guide page&lt;/a&gt; are executed via &lt;a href="https://www.addictivetips.com/windows-tips/open-powershell-in-a-specific-location/#:~:text=This%20is%20the%20simplest%20way%20to%20open%20PowerShell" rel="noopener noreferrer"&gt;powershell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Side note 2: Personally, I just get the &lt;code&gt;zrok.exe&lt;/code&gt; file, add it to the repository's root folder, add &lt;code&gt;zrok.exe&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;, then run &lt;code&gt;zrok&lt;/code&gt; commands in the terminal instead of adding zrok to windows' &lt;a href="https://janelbrandon.medium.com/understanding-the-path-variable-6eae0936e976" rel="noopener noreferrer"&gt;PATH&lt;/a&gt; &lt;a href="https://towardsdatascience.com/the-path-variable-for-the-confused-data-scientist-how-to-manage-it-b469bfb45785" rel="noopener noreferrer"&gt;variable&lt;/a&gt;... however, that solution is a workaround, and should not be standardized :]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xo8Ujjb22hsQsZodzs/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xo8Ujjb22hsQsZodzs/giphy.gif" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Create an Account
&lt;/h2&gt;

&lt;p&gt;Create an account by doing the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit zrok's getting started page &lt;a href="https://docs.zrok.io/docs/getting-started/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click on "Get an Account" under "Hosted zroknet".&lt;/li&gt;
&lt;li&gt;Click on "sign up" at the bottom of the form.&lt;/li&gt;
&lt;li&gt;Fill in your credentials then click sign up.&lt;/li&gt;
&lt;li&gt;You'll then be redirected to &lt;code&gt;https://myzrok.io/settings&lt;/code&gt;, where you'll fill in the same credentials 

&lt;ol&gt;
&lt;li&gt;(again ಠ_ಠ)&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Click &lt;code&gt;SAVE&lt;/code&gt;, then you'll be presented with this command: &lt;code&gt;zrok enable yOUrPriVaTeToken&lt;/code&gt;, store this command carefully in a notepad or something, we'll need it soon.&lt;/li&gt;

&lt;li&gt;Then login to &lt;a href="https://api.zrok.io/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://api.zrok.io/" rel="noopener noreferrer"&gt;https://api.zrok.io/&lt;/a&gt; by using your credentials...

&lt;ol&gt;
&lt;li&gt;(again! (╯°□°）╯︵ ┻━┻ )&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Done!&lt;/li&gt;

&lt;/ol&gt;

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

&lt;p&gt;Side note: You could've also partially done this via terminal, as shown &lt;a href="https://tech-couch.com/post/sharing-local-websites-and-files-with-zrok#setting-up-the-zrok-client" rel="noopener noreferrer"&gt;here&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%2Fv5oo6ptbb6yxnrqh9uqr.gif" 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%2Fv5oo6ptbb6yxnrqh9uqr.gif" alt="are you serious gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  See The Initial UI of zrok
&lt;/h2&gt;

&lt;p&gt;Upon successfully logging in, you'll see the &lt;a href="https://api.zrok.io/" rel="noopener noreferrer"&gt;https://api.zrok.io/&lt;/a&gt; page looking like this:&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%2F1xiz7wkadsqar2cnc9lu.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%2F1xiz7wkadsqar2cnc9lu.png" alt="UI of api.zrok.io" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can use &lt;a href="https://netfoundry.io/why-netfoundry/" rel="noopener noreferrer"&gt;NetFoundry's&lt;/a&gt; public zrok instances to share your web server! Let's see how...&lt;/p&gt;

&lt;p&gt;Side note: If you click on the 🔽 icon next to your email, then click on &lt;code&gt;Enable your environment&lt;/code&gt;, you'll see the command that I told you to store in a notepad :].&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Connect Your Device with Your Account
&lt;/h2&gt;

&lt;p&gt;Run the &lt;code&gt;zrok enable yOUrPriVaTeToken&lt;/code&gt; command in your terminal to connect your account with your device.&lt;/p&gt;

&lt;p&gt;Then, read the entire &lt;code&gt;Enabling Your zrok Environment&lt;/code&gt; section from the official docs &lt;a href="https://docs.zrok.io/docs/getting-started/#enabling-your-zrok-environment" rel="noopener noreferrer"&gt;here&lt;/a&gt;, as it explains the above command, and then shows you what the UI of &lt;code&gt;api.zrok.io&lt;/code&gt; should now look like.&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%2Fdwgzqnoynch5l15d2t0t.gif" 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%2Fdwgzqnoynch5l15d2t0t.gif" alt="I ain't reading all of that gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The Magical Part - zrok Reserve and Share
&lt;/h2&gt;

&lt;p&gt;Now for the good part, assuming you are currently running your backend server, e.g., something like this (IDE is &lt;a href="https://shiftmag.dev/vs-code-171/" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt; btw):&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%2Fp9s7jao8cmsuva46d6hq.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%2Fp9s7jao8cmsuva46d6hq.png" alt="Uvicorn code and terminal output" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, you'll open another terminal, like so:&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%2Fbwpz55wgzecdbkbk2ljy.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%2Fbwpz55wgzecdbkbk2ljy.png" alt="How to open another terminal" width="688" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, execute this command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;zrok reserve public localhost:8000 -n youruniqueinstancename&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you don't change the last argument above (which is called a &lt;a href="https://docs.zrok.io/docs/getting-started/#:~:text=my%20share%20was%20given%20the" rel="noopener noreferrer"&gt;share token&lt;/a&gt;), the final frontend URL will appear like this: &lt;code&gt;https://youruniqueinstancename.share.zrok.io&lt;/code&gt;, as can be seen here:&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%2F14uqrlzfezxnvda7h7jv.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%2F14uqrlzfezxnvda7h7jv.png" alt="api.zrok.io after running command" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you noticed from the screenshot above, a connection has been reserved with the token name that you used in the last argument of the aforementioned command,and is now configured to &lt;a href="https://docs.zrok.io/docs/getting-started/#proxy-backend-mode" rel="noopener noreferrer"&gt;&lt;em&gt;eventually bind&lt;/em&gt;&lt;/a&gt; with your localhost URL.&lt;/p&gt;

&lt;p&gt;To make it &lt;em&gt;actually bind&lt;/em&gt; with your localhost, run this final command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;zrok share reserved youruniqueinstancename&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, if we try to send requests using any online REST client tool, e.g., &lt;a href="https://restninja.io/" rel="noopener noreferrer"&gt;restninja&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%2F6w9yoyhsi7xvg6acfm5i.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%2F6w9yoyhsi7xvg6acfm5i.png" alt="Using restninja REST client to test the shared zrok instance" width="690" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll see the terminal returning this output:&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%2Fx1i5qutushw7m7o5pupq.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%2Fx1i5qutushw7m7o5pupq.png" alt="Terminal showing requests coming to shared zrok instance" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which means we can now share this public URL for quickly testing and/or displaying our work with others!&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%2Fva6g328tntw1927g22nf.gif" 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%2Fva6g328tntw1927g22nf.gif" alt="Mind explosion gif" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Side note: To terminate the session, hit &lt;code&gt;ctrl+c&lt;/code&gt; (windows) or close the terminal from here (still in VSCode):&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%2F77tavq2jawy63u522yqs.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%2F77tavq2jawy63u522yqs.png" alt="How to close the terminal in VSCode" width="129" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tricky note: the &lt;code&gt;youruniqueinstancename&lt;/code&gt; token is globally unique. In other words, if a developer "Bob" currently hosts a zrok public URL with this token, and a developer "Steve" &lt;strong&gt;simultaneously&lt;/strong&gt; tries to create a public URL with that exact token, it won't work (will give you a &lt;code&gt;shareConflict&lt;/code&gt; error).&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Later Runs
&lt;/h3&gt;

&lt;p&gt;In future terminal sessions, it's sufficient to run &lt;code&gt;zrok share reserved youruniqueinstancename&lt;/code&gt; to start a new session of binding public zrok URL with localhost :].&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Important Advice
&lt;/h2&gt;

&lt;p&gt;I highly suggest fully reading zrok's &lt;a href="https://docs.zrok.io/docs/getting-started/" rel="noopener noreferrer"&gt;getting started page&lt;/a&gt;, then all the sub-pages under &lt;a href="https://docs.zrok.io/docs/concepts/" rel="noopener noreferrer"&gt;concepts&lt;/a&gt;, as they greatly explain the when/where/how's of zrok.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  If you Have Any Questions/Suggestions...
&lt;/h2&gt;

&lt;p&gt;Your participation is most welcome! 🔥🙌&lt;/p&gt;

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

&lt;h2&gt;
  
  
  And If I made a mistake
&lt;/h2&gt;

&lt;p&gt;Then kindly correct me :] &amp;lt;3&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%2F1s7lhq0err7k5simhhu1.gif" 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%2F1s7lhq0err7k5simhhu1.gif" alt="goodbye gif" width="360" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>testing</category>
      <category>tutorial</category>
      <category>zrok</category>
    </item>
    <item>
      <title>Tokens vs Chunks</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Sat, 14 Sep 2024 13:09:01 +0000</pubDate>
      <link>https://dev.to/odyash/tokens-vs-chunks-3p5d</link>
      <guid>https://dev.to/odyash/tokens-vs-chunks-3p5d</guid>
      <description>&lt;h2&gt;
  
  
  Tokens vs Chunks
&lt;/h2&gt;

&lt;p&gt;When reading articles or documentations, you'll see that sometimes, "tokens" and "chunks" are treated as synonyms, but usually they represent different granularity levels. Demonstration by definitions:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Tokens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A token is the smallest unit of data that the NLP model processes, such as a sentence, a word, or a character (s1).&lt;/li&gt;
&lt;li&gt;It's a way to break down and analyze text into manageable components (s2).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Chunks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A chunk is a group of tokens (&lt;a href="https://medium.com/@jeevanchavan143/nlp-tokenization-stemming-lemmatization-bag-of-words-tf-idf-pos-7650f83c60be#6f4c" rel="noopener noreferrer"&gt;s3&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;For example, if we have this text: "Hello there! My name is OdyAsh     (new paragraph)    I like astronomy!", then depending on how you want to process this text, you might have one of these configurations:

&lt;ul&gt;
&lt;li&gt;tokens ⟺ sentences, chunks ⟺ paragraphs&lt;/li&gt;
&lt;li&gt;tokens ⟺ words, chunks ⟺ sentences&lt;/li&gt;
&lt;li&gt;tokens ⟺ words, chunks ⟺ group of nouns only (i.e., process the tokens so that they are grouped into chunks of noun phrases. Example: &lt;a href="https://medium.com/greyatom/learning-pos-tagging-chunking-in-nlp-85f7f811a8cb#3049" rel="noopener noreferrer"&gt;s4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;tokens ⟺ characters, chunks ⟺ words&lt;/li&gt;
&lt;li&gt;tokens ⟺ characters, chunks ⟺ chunk size (i.e., 200 characters)&lt;/li&gt;
&lt;li&gt;Examples: here: &lt;a href="https://medium.com/@abdallahashraf90x/tokenization-in-nlp-all-you-need-to-know-45c00cfa2df7" rel="noopener noreferrer"&gt;s5&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;So, one might treat a chunk as a unit of data which the NLP model gains useful info from (&lt;a href="https://medium.com/greyatom/learning-pos-tagging-chunking-in-nlp-85f7f811a8cb#3049" rel="noopener noreferrer"&gt;s4&lt;/a&gt;), and by chunking down, we get to the details of each chunk, i.e., the tokens which form this chunk (s6).&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;Usually:

&lt;ul&gt;
&lt;li&gt;A chunk: a unit of data with a low granularity level.&lt;/li&gt;
&lt;li&gt;A token: a unit of data with a high granularity level.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Occasionally:

&lt;ul&gt;
&lt;li&gt;They are treated as the same thing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  If you have any questions/suggestions...
&lt;/h2&gt;

&lt;p&gt;Your participation is most welcome! 🔥🙌&lt;/p&gt;

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

&lt;h3&gt;
  
  
  And If I made a mistake
&lt;/h3&gt;

&lt;p&gt;Then kindly correct me :] &amp;lt;3&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;s1: &lt;a href="https://www.functionize.com/blog/understanding-tokens-and-parameters-in-model-training" rel="noopener noreferrer"&gt;https://www.functionize.com/blog/understanding-tokens-and-parameters-in-model-training&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;s2: &lt;a href="https://www.quora.com/What-is-a-token-in-NLP" rel="noopener noreferrer"&gt;https://www.quora.com/What-is-a-token-in-NLP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;s3: &lt;a href="https://medium.com/@jeevanchavan143/nlp-tokenization-stemming-lemmatization-bag-of-words-tf-idf-pos-7650f83c60be" rel="noopener noreferrer"&gt;https://medium.com/@jeevanchavan143/nlp-tokenization-stemming-lemmatization-bag-of-words-tf-idf-pos-7650f83c60be&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;s4: &lt;a href="https://medium.com/greyatom/learning-pos-tagging-chunking-in-nlp-85f7f811a8cb" rel="noopener noreferrer"&gt;https://medium.com/greyatom/learning-pos-tagging-chunking-in-nlp-85f7f811a8cb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;s5: &lt;a href="https://medium.com/@abdallahashraf90x/tokenization-in-nlp-all-you-need-to-know-45c00cfa2df7" rel="noopener noreferrer"&gt;https://medium.com/@abdallahashraf90x/tokenization-in-nlp-all-you-need-to-know-45c00cfa2df7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;s6: &lt;a href="https://excellenceassured.com/nlp-training/nlp-training-courses-online/how-can-nlp-help-me/chunking-chunking-chunking-across" rel="noopener noreferrer"&gt;https://excellenceassured.com/nlp-training/nlp-training-courses-online/how-can-nlp-help-me/chunking-chunking-chunking-across&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>explainlikeimfive</category>
    </item>
    <item>
      <title>Learning Spark 2.0 Knowledge Dump</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Mon, 29 Apr 2024 08:00:19 +0000</pubDate>
      <link>https://dev.to/odyash/learning-spark-20-knowledge-dump-2h7g</link>
      <guid>https://dev.to/odyash/learning-spark-20-knowledge-dump-2h7g</guid>
      <description>&lt;p&gt;This post will serve as a continuous knowledge dump regarding the "Learning Spark 2.0" book, where I'll dump certain quotes that I find relevant (and hopefully you will too :]!)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Spark’s supported languages, columns are objects with public methods (represented by the Column type).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code example that uses &lt;code&gt;expr()&lt;/code&gt;, &lt;code&gt;withColumn&lt;/code&gt;, and &lt;code&gt;col()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;blogsDF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Big Hitters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hits &amp;gt; 10000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above adds a new column, Big Hitters, based on the conditional expression, noting that &lt;code&gt;expr(...)&lt;/code&gt; part can be changed with: &lt;code&gt;col("Hits") &amp;gt; 1000&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Scala, using the dollar sign &lt;code&gt;$&lt;/code&gt; before a string will be rendered as a function which converts this string into type &lt;code&gt;Column&lt;/code&gt;. Details can be found &lt;a href="https://bigdataenthusiast.medium.com/apache-spark-column-object-d02549f067f8" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;In Spark, a Row is a Spark object which consists of an ordered collection of fields. Therefore, you can access its fields by an index starting from 0.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Parquet does not support some symbols and whitespace characters in column names (&lt;a href="https://northconcepts.com/docs/examples/write-a-parquet-file-containing-spaces-and-symbols-in-column-names#:~:text=Parquet%20does%20not%20support%20some,names%20while%20writing%20Parquet%20files." rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Check the PySpark date and time functions &lt;a href="https://medium.com/@uzzaman.ahmed/pyspark-date-time-functions-a-comprehensive-guide-b250e92df264" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Check &lt;a href="https://spark.apache.org/docs/3.1.1/api/python/reference/pyspark.sql.html" rel="noopener noreferrer"&gt;this&lt;/a&gt; docs for all pyspark's SQL-related functions. Finally, check Spark SQL's built-in functions that are equivalent in definition &lt;a href="https://spark.apache.org/docs/latest/api/sql/index.html#_1" rel="noopener noreferrer"&gt;here&lt;/a&gt;. For example, "=" and "==", "!=" and "&amp;lt;&amp;gt;".&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;From the book: The DataFrame API also offers the collect() method, but for extremely large DataFrames this is resource-heavy (expensive) and dangerous, as it can cause out-of-memory (OOM) exceptions. Unlike count(), which returns a single number to the driver, collect() returns a collection of all the Row objects in the entire DataFrame or Dataset. If you want to take a peek at some Row records you’re better off with take(n), which will return only the first n Row objects of the DataFrame.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;DSL operators means &lt;a href="https://www.linkedin.com/pulse/domain-specific-language-dsl-arun-aditya/" rel="noopener noreferrer"&gt;Domain-specific language&lt;/a&gt; operators&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;"Datasets" -&amp;gt; Java/Scala (as they're compile-time/type-safe languages)&lt;/li&gt;
&lt;li&gt;"Dataframe" -&amp;gt; Python (as types are dynamically inferred/assigned during execution)&lt;/li&gt;
&lt;li&gt;Tricky note: "Dataframe" -&amp;gt; Scala (because in Scala, a DataFrame is just an alias for untyped Dataset[Row])

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;Row&lt;/code&gt; is a generic object type in Spark, holding a collection of mixed types that can be
accessed using an index.&lt;/li&gt;
&lt;li&gt;Example of defining a &lt;a href="https://docs.scala-lang.org/tour/case-classes.html" rel="noopener noreferrer"&gt;Scala Case Class&lt;/a&gt; to use &lt;code&gt;DeviceIoTData&lt;/code&gt; instead of &lt;code&gt;Row&lt;/code&gt; can be found &lt;a href="https://sparkbyexamples.com/spark/spark-convert-a-row-into-case-class/#:~:text=Convert%20Row%20to%20Case%20Class%20techniques" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Summary of the above bullet points:&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%2Fufipr2480yw5f0nq2mn3.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%2Fufipr2480yw5f0nq2mn3.png" alt="Image description" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When we use Datasets, the underlying &lt;strong&gt;Spark SQL engine&lt;/strong&gt; handles the creation/conversion/serialization/deserialization of JVM objects as well as Java heap memory management with the help of &lt;a href="https://towardsdatascience.com/apache-spark-dataset-encoders-demystified-4a3026900d63#:~:text=An%20encoder%20of%20a%20particular,part%20of%20Spark's%20tungusten%20framework." rel="noopener noreferrer"&gt;Dataset encoders&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DataFrames Versus Datasets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Datasets if you want:

&lt;ul&gt;
&lt;li&gt;strict compile-time type safety and don’t mind creating multiple case classes for a specific Dataset[T].&lt;/li&gt;
&lt;li&gt;Tungsten’s efficient serialization with Encoders.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Use Dataframes if you want:

&lt;ul&gt;
&lt;li&gt;SQL-like queries to perform relational transformations to your data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;unification, code optimization, and simplification of APIs across Spark components, use DataFrames.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;an easy transition from R language.&lt;/li&gt;
&lt;li&gt;to precisely instruct Spark how to do a query using RDDs.&lt;/li&gt;
&lt;li&gt;space and speed efficiency.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

</description>
      <category>spark</category>
      <category>dataengineering</category>
      <category>learning</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Create Documentation of Multiple .py Files using Pdoc</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Mon, 19 Feb 2024 12:35:27 +0000</pubDate>
      <link>https://dev.to/odyash/how-to-create-documentation-of-multiple-py-files-using-pdoc-1d7j</link>
      <guid>https://dev.to/odyash/how-to-create-documentation-of-multiple-py-files-using-pdoc-1d7j</guid>
      <description>&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Suppose your project's directory structure is like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- proj_root_dir
  - module_py_files_dir
    - general_functions.py
    - util_class.py
  - runnable_py_files_dir
    - main.py
  - documentation (optional, as pdoc creates it anyway)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And suppose you want to create documentation for the functions/modules found in &lt;code&gt;module_py_files_dir&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, the solution is mentioned in the following sections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assuming You Created &lt;code&gt;virtualenv&lt;/code&gt; Environment
&lt;/h2&gt;

&lt;p&gt;If you've created a virtual environment for &lt;code&gt;proj_root_dir&lt;/code&gt;, then first make sure that the &lt;code&gt;pip&lt;/code&gt; currently selected is related to that environment by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-V&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If not, make sure to select the Python interpreter related to the desired virtual environment (steps to do so on VSCode are &lt;a href="https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment" rel="noopener noreferrer"&gt;here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Side note: if you don't make sure you're using the right virtual environment, you may receive a &lt;code&gt;ModuleNotFound&lt;/code&gt; error when trying to run the &lt;code&gt;pdoc&lt;/code&gt; command later on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assuming You Created &lt;code&gt;conda&lt;/code&gt; Environment
&lt;/h3&gt;

&lt;p&gt;If you're dealing with Conda, then you will have one of two scenarios:&lt;/p&gt;

&lt;p&gt;Either you use &lt;code&gt;pip install&lt;/code&gt; or &lt;code&gt;conda install&lt;/code&gt;. If you're using the former, then run the &lt;code&gt;pip -V&lt;/code&gt; command as in the previous section.&lt;/p&gt;

&lt;p&gt;In either case, you should then run &lt;code&gt;conda info --envs&lt;/code&gt; and see which path is prefixed with &lt;code&gt;*&lt;/code&gt;. If it the path of the conda environment you created, then you're good. If not, then you need to run &lt;code&gt;conda activate PATH_TO_YOUR_ENV_FOLDER&lt;/code&gt; first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing &lt;code&gt;pdoc&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Apparently, &lt;code&gt;pdoc&lt;/code&gt; is &lt;a href="https://github.com/pdoc3/pdoc/issues/21#issuecomment-759836017" rel="noopener noreferrer"&gt;not officially maintained by conda&lt;/a&gt;, so we'll just mention the pip installation command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pdoc3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means that even if you have conda, it will use the &lt;code&gt;pip&lt;/code&gt; package manager (inside of conda) to install &lt;code&gt;pdoc&lt;/code&gt;, this is &lt;a href="https://github.com/pdoc3/pdoc/issues/21#issuecomment-546335424" rel="noopener noreferrer"&gt;not considered best practice&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running &lt;code&gt;pdoc&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Assuming the project directory structure mentioned in the first section of this post, the run command looks like this (adapted from &lt;a href="https://lucacorbucci.medium.com/how-to-generate-a-documentation-for-python-code-using-pdoc-60f681d14d6e" rel="noopener noreferrer"&gt;this&lt;/a&gt; article):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;pdoc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module_py_files_dir"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--output-dir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"documentation"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the &lt;code&gt;--html&lt;/code&gt; command recursively searches for all &lt;code&gt;.py&lt;/code&gt; files present in &lt;code&gt;module_py_files_dir&lt;/code&gt; and converts them to &lt;code&gt;.html&lt;/code&gt; pages found in &lt;code&gt;documentation&lt;/code&gt; directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;What if for some reason, we have functions present in the &lt;code&gt;main.py&lt;/code&gt; that we want &lt;code&gt;pdoc&lt;/code&gt; to document as well? In that case, one of two scenarios will have happened:&lt;/p&gt;

&lt;p&gt;Either you implemented the &lt;code&gt;if __name__ == "__main__"&lt;/code&gt; guard, or you didn't. &lt;/p&gt;

&lt;p&gt;Either way, &lt;code&gt;pdoc&lt;/code&gt; should be run successfully, but be aware that &lt;a href="https://github.com/pdoc3/pdoc/issues/138#issuecomment-567842767" rel="noopener noreferrer"&gt;pdoc runs&lt;/a&gt; the &lt;code&gt;.py&lt;/code&gt; files, so if you didn't place that guard, then the code that should've been inside that guard will run, so ask yourself if this is something you want or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outro
&lt;/h2&gt;

&lt;p&gt;Hit me up if you have any questions ^^ 🙌:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/ashrafharess/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/OdyAsh" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
Gmail: &lt;a href="mailto:ashicsresources@gmail.com"&gt;ashicsresources@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But for now...&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%2F9c2fysv60a89d8r1yyt4.gif" 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%2F9c2fysv60a89d8r1yyt4.gif" alt="Image description" width="480" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>python</category>
      <category>tutorial</category>
      <category>html</category>
    </item>
    <item>
      <title>"Unable to Open IPYNB... Bad Control..." Fix</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Wed, 14 Feb 2024 07:00:09 +0000</pubDate>
      <link>https://dev.to/odyash/unable-to-open-ipynb-bad-control-fix-5ga1</link>
      <guid>https://dev.to/odyash/unable-to-open-ipynb-bad-control-fix-5ga1</guid>
      <description>&lt;h2&gt;
  
  
  TOC
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Problem Statement&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;A Tip on How to Search for Errors&lt;/li&gt;
&lt;li&gt;Bonus - &lt;code&gt;autoreload&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outro&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;When you finish working on a Jupyter Notebook (&lt;code&gt;.ipynb&lt;/code&gt;) file, sometimes, it might not be saved in a correct state, so when you later open the file, you see an error which states "Unable to open &lt;code&gt;x.ipynb&lt;/code&gt;. Bad control character in string literal in JSON at position y (line w column z)":&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%2F5b1jjraj0xkikv26m5ut.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%2F5b1jjraj0xkikv26m5ut.png" alt="Image description" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Solution (taken from &lt;a href="https://stackoverflow.com/questions/17487058/how-to-solve-json-parse-bad-control-character-in-string-literal-in-this-code" rel="noopener noreferrer"&gt;this&lt;/a&gt; SO answer):&lt;/p&gt;

&lt;p&gt;Open the file by clicking on the &lt;code&gt;Open in Text Editor&lt;/code&gt; option shown in the screenshot above.&lt;/p&gt;

&lt;p&gt;Then see which lines are causing syntax errors:&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%2Ftbrxwyvlupeklzyuoq4o.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%2Ftbrxwyvlupeklzyuoq4o.png" alt="Image description" width="782" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, make sure these lines end with &lt;code&gt;\n&lt;/code&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%2Fzbzqys6m0hzp5u5rlcjp.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%2Fzbzqys6m0hzp5u5rlcjp.png" alt="Image description" width="782" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can notice by the highlighted lines in yellow, I had duplicated the line &lt;code&gt;ipython = get_ipython()\n&lt;/code&gt; in the wrong place, which was the cause of the error.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Tip on How to Search for Errors
&lt;/h2&gt;

&lt;p&gt;Initially, I searched for the error like this:&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%2Fbhnhmtps7lntwgj5dlke.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%2Fbhnhmtps7lntwgj5dlke.png" alt="Image description" width="723" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the initial results weren't helpful. Moreover, when I asked ChatGPT 3.5 on this error (with minimal prompt engineering), it gave me this result, which wasn't very useful for my case:&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%2F0nzrpowh8zt9q1d3fqd6.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%2F0nzrpowh8zt9q1d3fqd6.png" alt="Image description" width="766" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, when I modified my search term to be like this:&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%2F8vrymph7x1c8fp3qdfnx.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%2F8vrymph7x1c8fp3qdfnx.png" alt="Image description" width="726" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It gave me the &lt;a href="https://stackoverflow.com/questions/17487058/how-to-solve-json-parse-bad-control-character-in-string-literal-in-this-code" rel="noopener noreferrer"&gt;SO post&lt;/a&gt; that solved my issue! &lt;/p&gt;

&lt;p&gt;TLDR; knowing &lt;a href="https://dev.to/larymak/how-to-master-google-search-trick-to-use-on-google-2did"&gt;small search tricks&lt;/a&gt; can save you some time :].&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus - &lt;code&gt;autoreload&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If you're curious about the context of the code in the screenshots above, check &lt;a href="https://github.com/OdyAsh/OdyAsh-Notes/blob/main/Sciences/Applied%20Sciences/Programming/Python/Python%20Environments/Interaction%20between%20Different%20Modules%20and%20Packages.md" rel="noopener noreferrer"&gt;this&lt;/a&gt; file :].&lt;/p&gt;

&lt;h2&gt;
  
  
  Outro
&lt;/h2&gt;

&lt;p&gt;Hit me up if you have any questions ^^ 🙌:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/ashrafharess/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/OdyAsh" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
Gmail: &lt;a href="mailto:ashicsresources@gmail.com"&gt;ashicsresources@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But for now...&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%2Ft5xqubkvlbkj83kmu5pr.gif" 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%2Ft5xqubkvlbkj83kmu5pr.gif" alt="Image description" width="480" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>debug</category>
      <category>jupyter</category>
      <category>python</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Why I Don't Write Posts</title>
      <dc:creator>OdyAsh</dc:creator>
      <pubDate>Mon, 12 Feb 2024 11:32:58 +0000</pubDate>
      <link>https://dev.to/odyash/why-i-dont-write-posts-1a7i</link>
      <guid>https://dev.to/odyash/why-i-dont-write-posts-1a7i</guid>
      <description>&lt;h1&gt;
  
  
  Table of Contents
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;The Vicious Loop&lt;/li&gt;
&lt;li&gt;Personal Example&lt;/li&gt;
&lt;li&gt;How to Break Out of This Loop?&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Vicious Loop
&lt;/h2&gt;

&lt;p&gt;You won't believe how many times I've had ideas for articles/blogs to write about but don't follow through with writing them due to the &lt;a href="https://www.witten.kim/blog/perfectionism-imposter-loop" rel="noopener noreferrer"&gt;perfectionism-imposter loop&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%2Fz7giafir04yvc4ow53fi.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%2Fz7giafir04yvc4ow53fi.png" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.1 - The perfectionism-imposter loop (from now on, source will be hyprlinked above).



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

&lt;h2&gt;
  
  
  Personal Example
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;I want to write a blog about how I've &lt;a href="https://github.com/OdyAsh/OdyAsh-Notes/blob/main/Sciences/Applied%20Sciences/Programming/Python/Python%20Environments/Interaction%20between%20Different%20Modules%20and%20Packages.md" rel="noopener noreferrer"&gt;found a way&lt;/a&gt; to easily share/pass global variables across multiple python files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I realize that the notes I've done for this are not polished enough for a blog post.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I tell myself that I won't publish anything unless I completely prepare the notes and the structure of the blog (perfectionism).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I don't return to these notes, as the burden of polishing what I wrote is too big, so I end up not publishing anything (procrastination)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When and if I decide to return to the notes/blogs, I overwork myself with very small details, such as spending 10 minutes to find that I can write &lt;code&gt;&amp;amp;nbsp;&lt;/code&gt; to leave some space between paragraphs (over-functioning):&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%2Fo9ipxc53ll789dkhu46b.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%2Fo9ipxc53ll789dkhu46b.png" width="500" height="458"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.2 - Example of perfectionism/overfunctioning).



&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After I finish writing the blog, I contemplate how I took so long to write something that's not polished enough like other blogs I see (imposter syndrome).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;So, I decide that future posts will be more polished (perfectionism).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thus, the loop, continues.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  How to Break Out of This Loop?
&lt;/h2&gt;

&lt;p&gt;Just, &lt;a href="https://dev.to/hagailuger/write-a-post-just-write-it-already-1a5d"&gt;write the post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Just, finish your work, even if it's not polished enough.&lt;/p&gt;

&lt;p&gt;Just, share your work, even if others have done "better" work than you; You do this for yourself, and because you believe someone might benefit from what you write, not because you want to show off and compare yourself with others who've written "better" blogs.&lt;/p&gt;

&lt;p&gt;TLDR:&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%2Fzl0mbrkz91skrnugyufd.gif" 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%2Fzl0mbrkz91skrnugyufd.gif" alt="Image description" width="498" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This post serves as a way for me to break this vicious cycle and as an encouragement to write about my findings throughout my &lt;a href="https://github.com/OdyAsh/OdyAsh-Notes" rel="noopener noreferrer"&gt;learning journey&lt;/a&gt; one day :].&lt;/p&gt;

&lt;p&gt;Let me know what you think, and what prevents &lt;strong&gt;you&lt;/strong&gt; from writing posts &amp;lt;3.&lt;/p&gt;

</description>
      <category>blogging</category>
      <category>productivity</category>
      <category>learning</category>
      <category>writing</category>
    </item>
  </channel>
</rss>
