<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nima Akbarzadeh</title>
    <description>The latest articles on Forem by Nima Akbarzadeh (@iw4p).</description>
    <link>https://forem.com/iw4p</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%2F895644%2F7ae03584-9faf-4fd5-9374-ee5dd758a034.jpeg</url>
      <title>Forem: Nima Akbarzadeh</title>
      <link>https://forem.com/iw4p</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/iw4p"/>
    <language>en</language>
    <item>
      <title>You’re Not Validating Your Traces (And That’s a Problem)</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Sat, 04 Apr 2026 23:19:07 +0000</pubDate>
      <link>https://forem.com/iw4p/youre-not-validating-your-traces-and-thats-a-problem-5e9o</link>
      <guid>https://forem.com/iw4p/youre-not-validating-your-traces-and-thats-a-problem-5e9o</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%2F4waegxhsttnpqsl6icoy.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%2F4waegxhsttnpqsl6icoy.png" alt="gopher and otel" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API inputs&lt;/li&gt;
&lt;li&gt;database schemas&lt;/li&gt;
&lt;li&gt;configs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But your traces?&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Nothing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So in production you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;spans missing attributes&lt;/li&gt;
&lt;li&gt;inconsistent naming across services&lt;/li&gt;
&lt;li&gt;“valid-looking” traces that are actually wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And nobody notices.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Problem with OpenTelemetry
&lt;/h2&gt;

&lt;p&gt;OpenTelemetry gives you flexibility.&lt;/p&gt;

&lt;p&gt;Too much flexibility.&lt;/p&gt;

&lt;p&gt;You can write this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"payment"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this somewhere else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"payment_authorize"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or forget attributes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetAttributes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// missing critical fields&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing breaks.&lt;/p&gt;

&lt;p&gt;But your observability?&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Silently degrades over time.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet &lt;a href="https://github.com/iw4p/spancheck" rel="noopener noreferrer"&gt;spancheck&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of relying on discipline, you define a &lt;strong&gt;tracing contract&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And enforce it at runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Idea: Tracing Contracts
&lt;/h2&gt;

&lt;p&gt;Define what “correct tracing” looks like — in YAML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;payment.processor&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;payment.id&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;payment.job_name&lt;/span&gt;

&lt;span class="na"&gt;spans&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;payment.authorize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;internal&lt;/span&gt;
    &lt;span class="na"&gt;required_attributes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;payment.processor&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;payment.id&lt;/span&gt;

  &lt;span class="na"&gt;payment.reconcile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;consumer&lt;/span&gt;
    &lt;span class="na"&gt;required_attributes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;payment.job_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes your &lt;strong&gt;source of truth&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  No Code Changes Required
&lt;/h2&gt;

&lt;p&gt;This is the key part.&lt;/p&gt;

&lt;p&gt;You don’t touch your existing tracing calls.&lt;/p&gt;

&lt;p&gt;Just plug into OpenTelemetry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;tracing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadRegistry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contractYAML&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;processor&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;tracing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewValidationProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sdktrace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewTracerProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;sdktrace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithSpanProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;otel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetTracerProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your existing code stays exactly the same:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"payment.authorize"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What Happens at Runtime
&lt;/h2&gt;

&lt;p&gt;When spans finish, SpanCheck validates them.&lt;/p&gt;

&lt;p&gt;You get warnings like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ unknown span → &lt;code&gt;unknown_span&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ missing attribute → &lt;code&gt;missing_required_attribute&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No crashes. No breaking changes.&lt;/p&gt;

&lt;p&gt;But now:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;you see when your tracing is wrong&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Runtime Validation &amp;gt; Linting
&lt;/h2&gt;

&lt;p&gt;Static tools can guess.&lt;/p&gt;

&lt;p&gt;Runtime sees reality.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Static linting&lt;/th&gt;
&lt;th&gt;Runtime validation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;checks code&lt;/td&gt;
&lt;td&gt;checks actual spans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;misses dynamic paths&lt;/td&gt;
&lt;td&gt;sees everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;requires patterns&lt;/td&gt;
&lt;td&gt;zero assumptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;partial safety&lt;/td&gt;
&lt;td&gt;full coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Bad traces don’t fail loudly.&lt;/p&gt;

&lt;p&gt;They fail silently.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dashboards look fine&lt;/li&gt;
&lt;li&gt;incidents take longer&lt;/li&gt;
&lt;li&gt;debugging becomes guesswork&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You think you have observability.&lt;/p&gt;

&lt;p&gt;You don’t.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Unlocks
&lt;/h2&gt;

&lt;p&gt;Once you have contracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistent span naming across services&lt;/li&gt;
&lt;li&gt;guaranteed required attributes&lt;/li&gt;
&lt;li&gt;shared conventions across teams&lt;/li&gt;
&lt;li&gt;confidence in your traces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the missing layer in most observability setups.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get github.com/iw4p/spancheck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then plug it into your tracer and add a YAML contract.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;We enforce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;types&lt;/li&gt;
&lt;li&gt;schemas&lt;/li&gt;
&lt;li&gt;configs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not traces?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observability should be correct by default — not optional.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;👉 Check the code here &lt;a href="https://github.com/iw4p/spancheck" rel="noopener noreferrer"&gt;spancheck&lt;/a&gt;&lt;/p&gt;




</description>
      <category>go</category>
      <category>backend</category>
      <category>devops</category>
    </item>
    <item>
      <title>Free Convert Web Content to Markdown</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Sat, 08 Mar 2025 21:06:52 +0000</pubDate>
      <link>https://forem.com/iw4p/free-convert-web-content-to-markdown-538</link>
      <guid>https://forem.com/iw4p/free-convert-web-content-to-markdown-538</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%2F403pj9u5dnipv8ynd2rq.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%2F403pj9u5dnipv8ynd2rq.png" alt="Image description" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introducing URL to Markdown API&lt;br&gt;
Are you tired of dealing with cluttered web content when all you need is clean, structured Markdown? Meet URL to Markdown API, an open-source FastAPI service that transforms various types of content — including web pages, YouTube videos, PDFs, and documents — into Markdown, making it perfect for AI/ML pipelines, content aggregation, and data processing workflows.&lt;/p&gt;

&lt;p&gt;🔗 Try the live demo: markdown.nimk.ir&lt;/p&gt;

&lt;p&gt;Example for a youtube video: &lt;a href="https://markdown.nimk.ir/https://www.youtube.com/watch?v=fkZFCyp-iHs" rel="noopener noreferrer"&gt;https://markdown.nimk.ir/https://www.youtube.com/watch?v=fkZFCyp-iHs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why Use URL to Markdown API?&lt;br&gt;
Universal Content Support: Convert web articles, YouTube videos, PDFs, Office documents, and more&lt;br&gt;
LLM-Optimized Output: Clean, structured Markdown perfect for AI/ML processing&lt;br&gt;
Rich Media Handling: Extract metadata from images, audio files, and videos&lt;br&gt;
Smart Processing: OCR for images, transcription for audio, and intelligent content extraction&lt;br&gt;
Simple Integration: RESTful API with clear error handling and response codes&lt;br&gt;
🔥 Live Demo&lt;br&gt;
Want to see it in action? Just enter any URL and get instant Markdown 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%2F5w3131ehny6yb73zgg89.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%2F5w3131ehny6yb73zgg89.png" alt="Image description" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example 1: Convert a Web Article&lt;br&gt;
&lt;a href="https://markdown.nimk.ir/https://ask.library.arizona.edu/faq/407985" rel="noopener noreferrer"&gt;https://markdown.nimk.ir/https://ask.library.arizona.edu/faq/407985&lt;/a&gt;&lt;br&gt;
This API call converts the article into structured Markdown.&lt;/p&gt;

&lt;p&gt;Example 2: Convert a YouTube Video&lt;br&gt;
&lt;a href="https://markdown.nimk.ir/https://www.youtube.com/watch?v=dQw4w9WgXcQ" rel="noopener noreferrer"&gt;https://markdown.nimk.ir/https://www.youtube.com/watch?v=dQw4w9WgXcQ&lt;/a&gt;&lt;br&gt;
This extracts the video title, description, and metadata in Markdown format.&lt;/p&gt;

&lt;p&gt;Key Features&lt;br&gt;
Convert various content types:&lt;/p&gt;

&lt;p&gt;Web articles &amp;amp; HTML content&lt;br&gt;
YouTube videos&lt;br&gt;
PDF documents&lt;br&gt;
PowerPoint, Word, and Excel files&lt;br&gt;
Images (with OCR and metadata extraction)&lt;br&gt;
Audio files (with transcription &amp;amp; metadata)&lt;br&gt;
CSV, JSON, XML&lt;br&gt;
ZIP files (processes contents)&lt;br&gt;
Automatic URL handling Clean error messages &amp;amp; proper HTTP status codes&lt;/p&gt;

&lt;p&gt;Why Markdown for LLMs?&lt;br&gt;
Markdown is ideal for Large Language Models (LLMs) because:&lt;/p&gt;

&lt;p&gt;Structured Format: Clean hierarchical text structure&lt;br&gt;
Consistent Representation: Normalizes different content types&lt;br&gt;
Preserves Semantics: Headers, lists, and formatting are maintained&lt;br&gt;
Reduced Noise: Removes unnecessary styling, keeping content-focused&lt;br&gt;
Enhanced Accessibility: Easier for NLP models to process&lt;br&gt;
Installation for Self hosted version&lt;br&gt;
Standard Installation&lt;br&gt;
git clone &lt;a href="https://github.com/iw4p/url-to-markdown.git" rel="noopener noreferrer"&gt;https://github.com/iw4p/url-to-markdown.git&lt;/a&gt;&lt;br&gt;
cd url-to-markdown&lt;br&gt;
pip install -r requirements.txt&lt;br&gt;
Docker Deployment&lt;br&gt;
Using Docker Compose (Recommended):&lt;/p&gt;

&lt;p&gt;docker-compose up -d&lt;br&gt;
This starts the service in detached mode on &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Docker Directly:&lt;/p&gt;

&lt;p&gt;docker build -t url-to-markdown .&lt;br&gt;
docker run -d -p 8000:8000 url-to-markdown&lt;br&gt;
API Usage&lt;br&gt;
Start the API server:&lt;/p&gt;

&lt;p&gt;uvicorn main:app --reload&lt;br&gt;
Access it at &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API Endpoints&lt;br&gt;
Convert a URL to Markdown&lt;br&gt;
GET /{url}&lt;br&gt;
Example:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:8000/www.youtube.com/watch?v=dQw4w9WgXcQ" rel="noopener noreferrer"&gt;http://localhost:8000/www.youtube.com/watch?v=dQw4w9WgXcQ&lt;/a&gt;&lt;br&gt;
Returns the video title, description, and metadata in Markdown format.&lt;/p&gt;

&lt;p&gt;Response Format&lt;/p&gt;

&lt;h1&gt;
  
  
  Article Title
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Content
&lt;/h2&gt;

&lt;p&gt;[Article content in Markdown format]&lt;br&gt;
Development&lt;br&gt;
Built with:&lt;/p&gt;

&lt;p&gt;FastAPI for the web framework&lt;br&gt;
MarkItDown for content conversion&lt;br&gt;
Python 3.12+&lt;br&gt;
Join the Community&lt;br&gt;
Check out the repo, contribute, and star it on GitHub! ⭐&lt;/p&gt;

&lt;p&gt;🔗 GitHub Repo: &lt;a href="https://Github.com/iw4p/url-to-markdown" rel="noopener noreferrer"&gt;https://Github.com/iw4p/url-to-markdown&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How time.After() Can Cause Memory Leaks in Go and How to Fix Them</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Sat, 08 Mar 2025 21:05:22 +0000</pubDate>
      <link>https://forem.com/iw4p/how-timeafter-can-cause-memory-leaks-in-go-and-how-to-fix-them-1kg3</link>
      <guid>https://forem.com/iw4p/how-timeafter-can-cause-memory-leaks-in-go-and-how-to-fix-them-1kg3</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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2ARw5bl9kmsLxcRHGp3RiFnA.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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2ARw5bl9kmsLxcRHGp3RiFnA.png" alt="image4" width="800" height="495"&gt;&lt;/a&gt;&lt;br&gt;
As a developer working with the tonutils-go library to interact with the TON blockchain, I’ve spent a considerable amount of time building various side projects. Over time, I noticed a troubling pattern: the service I had built using the Echo framework was consuming resources more and more, even as I made minor tweaks and optimizations.&lt;/p&gt;

&lt;p&gt;Time to Investigate: Detective Mode ON 🕵🏻‍♂️&lt;/p&gt;

&lt;p&gt;I started my investigation by trying different strategies, making small adjustments to pinpoint the root cause. Was there a goroutine leak? I rarely used goroutines in my code, except in one small section. Could the issue lie in my queries? Perhaps GORM was messing something up?&lt;/p&gt;

&lt;p&gt;I was stumped. So, I decided to dive deeper into debugging using pprof, the profiling tool from Google, to get to the bottom of it.&lt;/p&gt;

&lt;p&gt;It didn’t take long before I uncovered something unexpected: a goroutine leak. But how could that be? I wasn’t even using goroutines directly!&lt;/p&gt;

&lt;p&gt;I dug deeper and deeper, and eventually, I stumbled upon the culprit: time.NewTimer().&lt;/p&gt;

&lt;p&gt;Wait… what? I wasn’t using any timers in my code! After spending more time researching, I realized that the problem wasn’t with my own code — it was stemming from the third-party libraries I was using. While it was a relief to know I wasn’t at fault, I couldn’t help but feel a little frustrated. How could I fix an issue with something I had no control over?&lt;/p&gt;

&lt;p&gt;The Root Cause: Leaks from time.After()&lt;/p&gt;

&lt;p&gt;Upon further investigation, I discovered that this was a well-known issue in Go: resources created by time.After() are never garbage collected. This can result in memory leaks, particularly when the timers are not stopped or handled properly.&lt;/p&gt;

&lt;p&gt;select {&lt;br&gt;
  case &amp;lt;-time.After(time.Second):&lt;br&gt;
     // do something after 1 second.&lt;br&gt;
  case &amp;lt;-ctx.Done():&lt;br&gt;
     // do something when context is finished.&lt;br&gt;
     // resources created by the time.After() will not be garbage collected&lt;br&gt;
  }&lt;br&gt;
Thankfully, I found a recommended solution from other developers. They suggested using a time.NewTimer() with a context to ensure that the timer is properly managed and cleaned up:&lt;/p&gt;

&lt;p&gt;delay := time.NewTimer(time.Second)&lt;br&gt;
select {&lt;br&gt;
case &amp;lt;-delay.C:&lt;br&gt;
    // Do something after one second.&lt;br&gt;
case &amp;lt;-ctx.Done():&lt;br&gt;
    // Do something when the context is finished and stop the timer.&lt;br&gt;
    if !delay.Stop() {&lt;br&gt;
        // If the timer has been stopped, read from the channel.&lt;br&gt;
        &amp;lt;-delay.C&lt;br&gt;
    }&lt;br&gt;
}&lt;br&gt;
A Step Toward a Solution: Contributing to tonutils-go&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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2AkHGss39H1FwNTtc9574P1w.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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2AkHGss39H1FwNTtc9574P1w.png" alt="image3" width="800" height="1325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Determined to resolve the issue, I submitted a pull request to the tonutils-go repository. To my relief, the project author reviewed and accepted the fix! You can find the pull request here: PR #297 on tonutils-go.&lt;/p&gt;

&lt;p&gt;Does the New Golang Version Fix It?&lt;/p&gt;

&lt;p&gt;Interestingly, I tested the fix with a newer version of Go, hoping it would address the issue, but I found that the behavior remained unchanged. It seems that, despite some updates, this problem persists in certain cases. You can check it here.&lt;/p&gt;

&lt;p&gt;Exposing pprof for Production Monitoring and Visualizing Memory Leaks&lt;/p&gt;

&lt;p&gt;Since identifying and resolving the issue required monitoring the application over time, I decided to expose it on NGINX to allow access to pprof. This would enable me to keep track of memory usage and any potential leaks that might arise during actual production traffic. It should not be exposed always, just for debugging.&lt;/p&gt;

&lt;p&gt;I set up the pprof endpoint on my server and then started watching the application under real-world load. I knew that some leaks could take time to manifest, so it was important to observe the app during normal production requests.&lt;/p&gt;

&lt;p&gt;To visualize the performance and memory usage, I installed Graphviz on my Mac using Homebrew:&lt;/p&gt;

&lt;p&gt;brew install graphviz&lt;br&gt;
With Graphviz installed, I could generate helpful visualizations of the memory allocations and goroutine activity, which greatly aided in pinpointing where resources were being consumed and not released.&lt;/p&gt;

&lt;p&gt;Next, I used go tool pprof to capture and analyze the memory and goroutine data. Here’s how I did it:&lt;/p&gt;

&lt;p&gt;For memory allocations:&lt;/p&gt;

&lt;p&gt;go tool pprof -http=:8080 &lt;a href="https://production.com/debug/pprof/allocs" rel="noopener noreferrer"&gt;https://production.com/debug/pprof/allocs&lt;/a&gt;&lt;br&gt;
And for goroutine profiling:&lt;/p&gt;

&lt;p&gt;go tool pprof -http=:8080 &lt;a href="https://production.com/debug/pprof/goroutine" rel="noopener noreferrer"&gt;https://production.com/debug/pprof/goroutine&lt;/a&gt;&lt;br&gt;
By running these commands, I was able to open up a web interface that allowed me to visually explore the application’s memory allocation and goroutine states. This gave me valuable insights into where things were going wrong and where I could optimize further.&lt;/p&gt;

&lt;p&gt;By exposing pprof in this manner, I was able to monitor production traffic and track down leaks that would’ve otherwise been hard to catch in a local environment. It’s a simple yet effective technique for diagnosing subtle performance issues that only appear under real-world conditions.&lt;/p&gt;

&lt;p&gt;Before:&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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2A1SQlVOJwyPAtAcWrX5S5Tw.jpeg" 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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2A1SQlVOJwyPAtAcWrX5S5Tw.jpeg" alt="image2" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After:&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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2AB8UiXI9GpNvCXwsfsNLpVg.jpeg" 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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2AB8UiXI9GpNvCXwsfsNLpVg.jpeg" alt="image" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After more monitoring, I realized there are more of them and I should find and fix them! But I hope It could help you to learn more about this issue.&lt;/p&gt;

&lt;p&gt;Example codes are from this blog.&lt;/p&gt;

&lt;p&gt;My Github: &lt;a href="https://Github.com/iw4p" rel="noopener noreferrer"&gt;https://Github.com/iw4p&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>backend</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Parsing ChatGPT JSON stream response - Partial and incomplete JSON parser python library OpenAI</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Fri, 24 Nov 2023 16:37:05 +0000</pubDate>
      <link>https://forem.com/iw4p/partial-and-incomplete-json-parser-python-library-openai-3h32</link>
      <guid>https://forem.com/iw4p/partial-and-incomplete-json-parser-python-library-openai-3h32</guid>
      <description>&lt;p&gt;In today's world of APIs and microservices, working with streaming JSON responses is common. To simplify this, I've created a handy open-source library to easily handle OpenAI's streaming APIs. While tailored to OpenAI and ChatGPT, this versatile library can parse streaming JSON from any API.&lt;/p&gt;

&lt;p&gt;This post will introduce you to my new open-source library and why it's useful for consuming OpenAI's streaming APIs. I'll also give a quick overview of how it works under the hood. Whether you're building an app with OpenAI or working with other streaming JSON APIs, read on to see how this library can save you time and effort.&lt;/p&gt;

&lt;p&gt;The core benefit is the easy handling of sizable JSON responses, even as they stream in. No need to deal with the complexity - the library takes care of that. It also works for any API returning streaming JSON, not just OpenAI's. I'll share examples of both so you can see just how much it simplifies things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyg9hf8khrq317ovi75n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyg9hf8khrq317ovi75n.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's get started! First, I'll give a quick primer on OpenAI and streaming JSON for context. Then we'll dive into the library itself and see some code examples.&lt;/p&gt;

&lt;p&gt;Here is an additional section expanding on the challenges of streaming JSON responses:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem with Streaming JSON&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Streaming text responses is straightforward - you can display each character or token to the user as it streams in. But JSON poses some unique headaches.&lt;/p&gt;

&lt;p&gt;JSON responses are structured as nested objects and arrays. A streaming JSON response is essentially malformed until the full response is completed. For example, halfway through a response, you may see something like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[{"age": "18&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This isn't valid JSON yet! So if you try to parse it with &lt;code&gt;JSON.parse()&lt;/code&gt;, it will fail.&lt;/p&gt;

&lt;p&gt;You face a tradeoff - either:&lt;/p&gt;

&lt;p&gt;✅ Wait for the full JSON response to complete before parsing/displaying it. But this negates the benefits of streaming for your users.&lt;/p&gt;

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

&lt;p&gt;💥 Try parsing the incomplete streaming JSON, and get errors.&lt;br&gt;
What we really want is a way to incrementally build and parse the streaming JSON in real-time as it comes in. Displaying it to the user with minimal lag, without running into errors.&lt;br&gt;
This is exactly what my library enables! Keep reading to see how it works…&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvhez094voz3gvmfpxly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvhez094voz3gvmfpxly.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My library provides a simple yet powerful solution. Install it via:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install partialjson&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then import the &lt;code&gt;JSONParser&lt;/code&gt; class:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;from partialjson.json_parser import JSONParser&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instantiate the parser, and pass any incomplete JSON string to the &lt;code&gt;parse()&lt;/code&gt; method. For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;parser = JSONParser()&lt;br&gt;
incomplete_json = '{"name": "John", "age": 18, "family":'&lt;br&gt;
print(parser.parse(incomplete_json))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here's the magic - despite the JSON being incomplete, &lt;code&gt;parse()&lt;/code&gt; incrementally parses what it has received so far into valid JSON objects.&lt;/p&gt;

&lt;p&gt;So at each moment, you can work with the fully structured JSON consisting of only the data received up until that point. No more errors or waiting for the full response!&lt;/p&gt;

&lt;p&gt;As more streaming data comes in, the parser seamlessly incorporates it into the existing JSON structure. This enables you to display the information to users with minimal lag. Just what we want.&lt;/p&gt;

&lt;p&gt;So in a nutshell, it empowers real-time processing and display of streaming JSON responses. Solving the problem elegantly via incremental parsing. &lt;/p&gt;

&lt;p&gt;This library is open source and the source is available on my &lt;a href="https://github.com/iw4p/partialjson/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>openai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Scraping tweets without Twitter API for FREE</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Tue, 14 Mar 2023 21:40:34 +0000</pubDate>
      <link>https://forem.com/iw4p/scraping-tweets-without-twitter-api-and-free-5g9c</link>
      <guid>https://forem.com/iw4p/scraping-tweets-without-twitter-api-and-free-5g9c</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcuobh7ynvehsmc0fv03n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcuobh7ynvehsmc0fv03n.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the past (before Elon Musk…), you could easily and freely apply for a developer account to get your own tokens and start using Twitter API without any struggle. One of the strengths of the developer account besides making bots and tweeting via API was search API. You could almost grab all the tweets you want. But after Elon Musk, unfortunately, you have to pay for it!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tiers will start at $500,000 a year for access to 0.3 percent of the company's tweets. Researchers say that's too much for too little data. [&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fwww.wired.com%2Fstory%2Ftwitter-data-api-prices-out-nearly-everyone%2F%23%3A~%3Atext%3DTiers%2520will%2520start%2520at%2520%2524500%252C000%2Cmuch%2520for%2520too%2520little%2520data." rel="noopener noreferrer"&gt;source&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is one solution that almost always works. Selenium! (Also, it's good to know that the great alternative for selenium in JS is puppeter).&lt;/p&gt;

&lt;p&gt;It almost allows you to scrape everything on the surface of the web. Just you have to write a script for your use case with the selenium library.&lt;/p&gt;

&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;p&gt;The algorithm for scraping tweets is so easy.&lt;br&gt;
These are the steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Twitter search with an advanced search query.&lt;/li&gt;
&lt;li&gt;Scrape specific tags to get the value&lt;/li&gt;
&lt;li&gt;scroll&lt;/li&gt;
&lt;li&gt;Repeat the steps until you scrape the number of tweets you need.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;It can be written by your script or using other libraries like twitter_scraper_selenium&lt;br&gt;
It's available on PyPI and GitHub.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

pip install twitter_scraper_selenium


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;(Note: For saving as CSV and working as data frames, we must install pandas and other dependencies too)&lt;br&gt;
Then you can write your own wrapper function like this&lt;/p&gt;

&lt;p&gt;from twitter_scraper_selenium import scrape_keyword&lt;br&gt;
import json&lt;br&gt;
import pandas as pd&lt;br&gt;
import asyncio&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

def scrape_profile_tweets_since_2023(username: str):
    kword = "from:" + username
    path = './users/' + username
    file_path = path + '.csv'
    tweets = scrape_keyword(
                            headless=True,
                            keyword=kword,
                            browser="chrome",
                            tweets_count=2, # Just last 2 tweets
                            filename=path,
                            output_format="csv",
                            since="2023-01-01",
                            # until="2025-03-02", # Until Right now
                            )
    data = pd.read_csv(file_path)
    data = json.loads(data.to_json(orient='records'))
    return data


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can call this function for multiple accounts at the same time, as this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

from twitter_scraper_selenium import scrape_keyword
import json
import pandas as pd
import asyncio

def scrape_profile_tweets_since_2023(username: str):
    kword = "from:" + username
    path = './users/' + username
    file_path = path + '.csv'
    tweets = scrape_keyword(
                            headless=True,
                            keyword=kword,
                            browser="chrome",
                            tweets_count=2, # Just last 2 tweets
                            filename=path,
                            output_format="csv",
                            since="2023-01-01",
                            # until="2025-03-02", # Until Right now
                            )
    data = pd.read_csv(file_path)
    data = json.loads(data.to_json(orient='records'))
    return data
You can call this function for multiple accounts at the same time, as this:
from multiprocessing import Pool

# Just one account
# scrape_profile_tweets_since_2023('elonmusk')

# Run in parallely
def functionToRunParallely(i):
    return i

noOfPools = 5

if __name__ == "__main__":
    with Pool(noOfPools) as p:
        p.map(scrape_profile_tweets_since_2023,['elonmusk', 'BarackObama', 'cathiedwood'])



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Result&lt;br&gt;
Your result will be something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyy3gyk7puhspocpvpan.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyy3gyk7puhspocpvpan.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next post, we are going to scrape mentions/replies as well.&lt;/p&gt;

&lt;p&gt;If you like the post, please use clap or follow me on GitHub and LinkedIn!&lt;br&gt;
&lt;a href="//Github.com/iw4p"&gt;Github.com/iw4p&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/nimk/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/nimk/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>selenium</category>
    </item>
    <item>
      <title>Machine Learning paradigms for beginners</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Mon, 09 Jan 2023 17:21:00 +0000</pubDate>
      <link>https://forem.com/iw4p/machine-learning-paradigms-for-beginners-1jn5</link>
      <guid>https://forem.com/iw4p/machine-learning-paradigms-for-beginners-1jn5</guid>
      <description>&lt;p&gt;These days, we are hearing a lot about Machine Learning, chatGPT, AI, Robots, etc. We should not skip the trends, specifically in technology.&lt;br&gt;
But what if we want to classify the general topics and methods of Machine Learning to understand better what is going on?&lt;/p&gt;

&lt;p&gt;Imagine you want to tell new things to a computer, and that computer learns those things and new experiences from you. How many ways do we have? Which methods and paradigms are acceptable?&lt;/p&gt;

&lt;p&gt;Currently, there are 3 main paradigms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supervised Learning&lt;/li&gt;
&lt;li&gt;Unsupervised Learning&lt;/li&gt;
&lt;li&gt;Reinforcement Learning&lt;/li&gt;
&lt;/ul&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%2Fmh34dz7wlus3qg3o1zih.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%2Fmh34dz7wlus3qg3o1zih.png" alt="Image description" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's start with examples that make these categories more understandable.&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%2Fhiq8l8jp9oivl6rsjmbg.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%2Fhiq8l8jp9oivl6rsjmbg.png" alt="Image description" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Machine Learning paradigms for beginners&lt;br&gt;
These days, we are hearing a lot about Machine Learning, chatGPT, AI, Robots, etc. We should not skip the trends, specifically in technology.&lt;br&gt;
But what if we want to classify the general topics and methods of Machine Learning to understand better what is going on?&lt;br&gt;
Imagine you want to tell new things to a computer, and that computer learns those things and new experiences from you. How many ways do we have? Which methods and paradigms are acceptable?&lt;/p&gt;




&lt;p&gt;In the Supervised Learning paradigm, We have a supervisor. Our data is labeled by someone else. For instance, you are a student and your teacher learns you new things. If you try to memorize exactly what your teacher said, you will fail, and if you don't learn, you will fail too. (It's the example of overfitting and underfitting in model training). You have to really LEARN!&lt;br&gt;
The model will learn from its labeled inputs and will learn it's a dog picture, it's a cat, it's a dog, it's a cat … and at the end, you can evaluate your trained model by providing a picture to predict that it is an image of cat or dog. Cat and dog are our labels 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%2Fjj3psa8r0kokvu563k0j.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%2Fjj3psa8r0kokvu563k0j.png" alt="Image description" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Unsupervised Learning paradigm, there is no label! Your data do not have labels. It's like a student that is trying to self-study by himself without a teacher or supervisor. The student tries to find patterns and relationships by himself.&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%2Fiidva45ssideypzjbp86.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%2Fiidva45ssideypzjbp86.png" alt="Image description" width="543" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reinforcement Learning is the third Machine learning paradigm.&lt;/p&gt;

&lt;p&gt;It is inspired by biological learning systems.&lt;br&gt;
Imagine you are stuck in a maze! What is your strategy to escape from it?&lt;/p&gt;

&lt;p&gt;One of the best strategies is Trial-And-Error.&lt;br&gt;
You need to brute force the maze, But wait, Reinforcement learning is more interesting!&lt;br&gt;
Another example. You can learn your pet what is bad and what is good by punishing or giving your animal a reward.&lt;br&gt;
In Reinforcement Learning, there is an agent (your pet), there is an environment (you), and a reward signal (Only you can give rewards).&lt;/p&gt;

&lt;p&gt;When you feed your dog after he successfully fetched the wood, you are indirectly telling your dog it's a good move. But when your dog is trying to bother your grandma, and you yell at your dog, he will receive a signal that this move was wrong. With the trial and error method, this dog (Agent) is trying to be a good pet (Maximizing his rewards) for you (his environment).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Verilog: Mux 2 to 1 (Multiplexer)</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Thu, 05 Jan 2023 17:24:36 +0000</pubDate>
      <link>https://forem.com/iw4p/verilog-mux-2-to-1-multiplexer-3kn4</link>
      <guid>https://forem.com/iw4p/verilog-mux-2-to-1-multiplexer-3kn4</guid>
      <description>&lt;p&gt;Understanding the low levels always helps me to know and learn better and touch the reality of computers, particularly when I am coding.&lt;/p&gt;

&lt;p&gt;Mux 2 to 1 (Multiplexer) is one of the easiest digital circuits which is made by different gates such as AND and OR gates.&lt;/p&gt;

&lt;p&gt;The point of the 2-to-1 multiplexer is that can help you to select your chosen input. For example, you have i0 and i1 as Input One and Input Two, and you need to select between inputs. You can set a Select to decide which inputs must transfer to output (F).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o73q1xta98xon0k9gnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o73q1xta98xon0k9gnn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the truth table you can see if you set your select equals to 0, then the first Input which is i0 (a) will choose and vice versa.&lt;/p&gt;

&lt;p&gt;To implement this module you need to know what gates you need.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8v7n247emxiaqkl0ioz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8v7n247emxiaqkl0ioz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It consists of two AND, one OR, and one NOT gates.&lt;br&gt;
The boolean logic equation for a 2-to-1 multiplexer is &lt;br&gt;
(A. ˉS)+(B. S)&lt;br&gt;
where A is the first input and B is the second input.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;embed module mux2to1(sel, i1, i0, f);
    input i0, i1, sel;
    output f;
    wire nsel, w1, w2;

    not(nsel, sel);

    and(w1, i0, nsel);
    and(w2, i1, sel);
    or(f, w1, w2);
endmodule
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To evaluate the code you can check it manually or write a testbench for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module test_mux2to1;
  reg s, a1, a0;
  wire q;
  mux2to1 mux(.sel(s), .i1(a1), .i0(a0), .f(q));
  initial begin
    $monitor("sel = %b: i0 = %b, i1 = %b --&amp;gt; f = %b", s, a0, a1, q);
    s = 1'b0; a1=1'b0; a0=1'b0;
    #10
    s = 1'b0; a1=1'b1; a0=1'b1;
    #10
    s = 1'b0; a1=1'b1; a0=1'b0;
    #10
    s = 1'b0; a1=1'b1; a0=1'b1;
    #10
    s = 1'b1; a1=1'b0; a0=1'b0;
    #10
    s = 1'b1; a1=1'b0; a0=1'b1;
    #10
    s = 1'b1; a1=1'b1; a0=1'b0;
    #10
    s = 1'b1; a1=1'b1; a0=1'b1;
  end
endmodule
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code is available on my &lt;a href="https://github.com/iw4p/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Here is the &lt;a href="https://github.com/iw4p/Verilog/blob/master/mux2to1.v" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>verilog</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Fragment.com API Library (TON - Telegram)</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Mon, 12 Dec 2022 17:17:11 +0000</pubDate>
      <link>https://forem.com/iw4p/ton-telegram-fragmentcom-library-4d0p</link>
      <guid>https://forem.com/iw4p/ton-telegram-fragmentcom-library-4d0p</guid>
      <description>&lt;p&gt;Fragment.com Library (TON - Telegram)&lt;br&gt;
Last week, I was trying to scrape data from &lt;a href="//Fragment.com"&gt;Fragment.com&lt;/a&gt;, But I didn't find any &lt;strong&gt;Official API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;📢 Advertisement &amp;amp; Important Disclaimer&lt;/p&gt;

&lt;p&gt;⚠️ Disclaimer: I am not the owner, operator, or developer of the 'ton-fragment' library or the associated commercial API service. I am simply sharing this information.&lt;/p&gt;

&lt;p&gt;TON Fragment&lt;/p&gt;

&lt;p&gt;UnOfficial Fragment API (buy stars - premium - gift - ton ads) (Telegram - Ton Coin) Python library&lt;br&gt;
Note 1: ⚠️ If you need API for buying stars and telegram premium (We Support Both KYC and no KYC Fragment), use @RobynHoodBot.&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%2Fiqiudmarji8b1x54xfyu.jpeg" 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%2Fiqiudmarji8b1x54xfyu.jpeg" alt="Fragment.com main page" width="756" height="746"&gt;&lt;/a&gt;&lt;br&gt;
After that, I decided to make my scripts open-source, and then suddenly I asked myself "Why not make a library?"&lt;br&gt;
So, I made an &lt;a href="https://github.com/iw4p/Ton-Fragment" rel="noopener noreferrer"&gt;UnOfficial Fragment (Telegram - Ton Coin) Python library&lt;/a&gt;, so everyone can easily scrape what he/she needs.&lt;br&gt;
Today's markets use the power of AI and robot traders. Classic trading methods are going to be deprecated as soon as possible.&lt;br&gt;
For making trader robots, firstly you need data from the target's auctions and prices, etc.&lt;br&gt;
This library can help you to grab and scrape what you need.&lt;/p&gt;

&lt;p&gt;You can install it easily via Pip python package manager&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install ton-fragment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's see some examples.&lt;br&gt;
For example, you need to get recently listed for-sale numbers&lt;br&gt;
You get fetch this data like that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from ton_fragment.numbers.numbers import Numbers
all_numbers = Numbers('sale', 'listed')
print(all_numbers.result)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you need to get the status of a username or a number to realize it's still on sale or what's the highest bid price for it or when the auction will end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from ton_fragment.numbers.number import Number
my_number = Number('8888888')
print(my_number.data)
print(my_number.number)
print(my_number.status)
print(my_number.ends_in)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This library is still under development, and it's a little buggy.&lt;br&gt;
Contributions are welcome and feel free to submit issues and enhancement requests.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>opensource</category>
      <category>api</category>
    </item>
    <item>
      <title>SOLID - Development principles</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Thu, 25 Aug 2022 13:57:42 +0000</pubDate>
      <link>https://forem.com/iw4p/solid-development-principles-50e8</link>
      <guid>https://forem.com/iw4p/solid-development-principles-50e8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M29XpGwI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wlk27zmuf1ro0zic2pgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M29XpGwI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wlk27zmuf1ro0zic2pgq.png" alt="https://www.youtube.com/watch?v=Tk9HVv8ZcOU" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Object-oriented programming has its principles, and it is not just turning everything into objects and using them when we need them. It's important to create understandable objects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question #1&lt;/strong&gt;&lt;br&gt;
Is it important? Why?&lt;/p&gt;

&lt;p&gt;Yes, It's important and makes more sense when the application grows and becomes bigger.&lt;br&gt;
Design principles encourage us to make maintainable and flexible software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question #2&lt;/strong&gt;&lt;br&gt;
How?&lt;/p&gt;

&lt;p&gt;In every work, if you have some principles and standards, your project will get a great structure to itself.&lt;br&gt;
Like using a framework, here should follow some principles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question #3&lt;/strong&gt;&lt;br&gt;
So, What is SOLID?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S: Single responsibility principle&lt;/li&gt;
&lt;li&gt;O: Open/Close principle&lt;/li&gt;
&lt;li&gt;L: Liskov substitution principle&lt;/li&gt;
&lt;li&gt;I: Interface segregation principle&lt;/li&gt;
&lt;li&gt;D: Dependency inversion principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Question #4&lt;/strong&gt;&lt;br&gt;
What do they mean?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S: Single responsibility principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A class should only have one responsibility.&lt;br&gt;
It should have one reason to change.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;br&gt;
Testing: A class with fewer test cases is better.&lt;br&gt;
Lower coupling: Less functionality in a single class will have fewer dependencies.&lt;br&gt;
Organization: Smaller and more well-organized classes are better than monolithic ones. (For example, don't create a single class for both car and its functionality, create two separates class, one for car and one for car functions)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O: Open/Close principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open for extension, close for modification.&lt;br&gt;
We are not allowed to modify existing class codes, because it creates new bugs.&lt;br&gt;
For example, when a new type of car has to implement into the system, you should not modify the car class, the right way is to extend the car class.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L: Liskov substitution principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A class and its subclass should be able to be replaced by each other. If you have a car and racing car class, and the racing car class is a subclass of car class, you should be able to change or replace them without disrupting the behavior of the program.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I: Interface segregation principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Larger interfaces should be split into smaller ones.&lt;br&gt;
For example, your barber interface consists of cutting the hair, shaving, and washing.&lt;br&gt;
It can happen that you hire someone for just washing and shaving, not cutting hair, and he is not a barber.&lt;br&gt;
So? It's really better if you split it into small pieces, don't put it all in one interface.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;D: Dependency inversion principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;High-level and Low-level modules should both depend on abstraction, not each other. In another form, a class should depend on abstraction.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>writing</category>
    </item>
    <item>
      <title>What is Kanban and how It helps big companies?</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Wed, 24 Aug 2022 20:37:21 +0000</pubDate>
      <link>https://forem.com/iw4p/what-is-kanban-and-how-it-helps-big-companies-1n62</link>
      <guid>https://forem.com/iw4p/what-is-kanban-and-how-it-helps-big-companies-1n62</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zXTsWgzu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ofcy8njnkejy094ltu9o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zXTsWgzu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ofcy8njnkejy094ltu9o.png" alt="https://www.knowledgetrain.co.uk/agile/agile-project-management/agile-project-management-course/kanban-principles" width="880" height="1431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you heard &lt;strong&gt;Kanban&lt;/strong&gt;? What about Trello?&lt;/p&gt;

&lt;p&gt;Kanban is a good and famous project management methodology that helps startups or companies to have their task visually, &lt;br&gt;
While &lt;a href="https://dev.to/iw4p/scrum-vs-agile-whats-the-difference-3m24"&gt;scrum&lt;/a&gt; gives structure to the team and schedule.&lt;/p&gt;

&lt;p&gt;Kanban and scrum are both considered project management methodologies that complete tasks in a short period of time.&lt;/p&gt;

&lt;p&gt;The best example of Kanban is Trello. Trello is a web-based kanban. &lt;/p&gt;

&lt;p&gt;The point of using kanban is that the tasks must be continuous, and it is not limited by time at all.&lt;/p&gt;

&lt;p&gt;But, instead, in the scrum, the goal is to move all to-do or doing tasks to the Done section in a fixed amount of time, which is called "Sprint".&lt;/p&gt;

&lt;p&gt;Companies like Toyota use kanban, and you can read more about their approach &lt;a href="https://mag.toyota.co.uk/kanban-toyota-production-system/"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>writing</category>
    </item>
    <item>
      <title>Scrum Vs Agile - what's the difference</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Wed, 24 Aug 2022 11:52:00 +0000</pubDate>
      <link>https://forem.com/iw4p/scrum-vs-agile-whats-the-difference-3m24</link>
      <guid>https://forem.com/iw4p/scrum-vs-agile-whats-the-difference-3m24</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dDkne3WN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gite3cqqdsifnil8hqke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dDkne3WN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gite3cqqdsifnil8hqke.png" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scrum is a framework that helps teams to work together. This makes people in the team learn based on the experiences they gain.&lt;/p&gt;

&lt;p&gt;But agile is a mindset. It's a set of rules and principles.&lt;br&gt;
Scrum is about shipping value to customers.&lt;br&gt;
All members of a team can use scrum like developers, HR, marketing, designing, and so on.&lt;/p&gt;

&lt;p&gt;Scrum embraces changes. It is the best option for these types of things that change a lot. For example, in software engineering, when you divide big or complex tasks into smaller tasks, your goals change quickly.&lt;/p&gt;

&lt;p&gt;In scrum, there are terms such as sprint, which means a short, time-boxed period to complete a work or task and move it to the done section.&lt;/p&gt;

&lt;p&gt;It makes projects more manageable and for example, if you make a bad decision, unlike &lt;a href="https://dev.to/iw4p/development-methodologies-waterfall-272p"&gt;waterfall&lt;/a&gt;, it allows you to fix it faster. Because it's based on iterations.&lt;br&gt;
Short iterations decrease risk and cost and help the team to stay focused.&lt;/p&gt;

&lt;p&gt;People and teams still make mistakes about agile and scrum, but the fact is they're not the same.&lt;br&gt;
Scrum is a framework, but agile is not. It is a mindset.&lt;br&gt;
In scrum, we have a scrum master. Big companies hire scrum masters to go through the development stages of the project in the best condition and at a low cost.&lt;/p&gt;

&lt;p&gt;The scrum master helps to facilitate scrum to the larger team by ensuring the scrum framework is followed. He/she is committed to the scrum values and practices, but should also remain flexible and open to opportunities for the team to improve their workflow.&lt;/p&gt;

&lt;p&gt;He has the duty to organize the scrum stand-ups.&lt;br&gt;
Stand-up is a daily meeting that involves the core team: product owners, developers, and the scrum master.&lt;br&gt;
Scrum stand-ups are 15-minute daily meetings that occur each day of the sprint to discuss progress and quickly note any issues.&lt;/p&gt;

&lt;p&gt;During the stand-up, everyone answers these three questions:&lt;br&gt;
1 - What did you do last day (last task)?&lt;br&gt;
2 - What are you going to do today?&lt;br&gt;
3 - Is there any problem or obstacle?&lt;/p&gt;

&lt;p&gt;I hope this post helped you to understand the differences between agile and scrum.&lt;/p&gt;

&lt;p&gt;Also, if you like to know about other development methodologies, read the &lt;a href="https://dev.to/iw4p/development-methodologies-waterfall-272p"&gt;waterfall method&lt;/a&gt; from here.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>writing</category>
    </item>
    <item>
      <title>Development methodologies - Waterfall</title>
      <dc:creator>Nima Akbarzadeh</dc:creator>
      <pubDate>Sat, 13 Aug 2022 14:43:00 +0000</pubDate>
      <link>https://forem.com/iw4p/development-methodologies-waterfall-272p</link>
      <guid>https://forem.com/iw4p/development-methodologies-waterfall-272p</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KDeDRgWD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r3hwmsanw9a1xfx3pnnp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KDeDRgWD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r3hwmsanw9a1xfx3pnnp.jpeg" alt="Waterfall image from [Here](https://thetravelauthor.com/why-do-we-love-waterfalls/)" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a software engineer, you must have a good sight of development methodologies.&lt;br&gt;
I always keep this sentence in my mind "Learn concepts, not languages".&lt;br&gt;
So It gives you a great view when you learn and know the concepts.&lt;/p&gt;

&lt;p&gt;What is &lt;strong&gt;development methodology&lt;/strong&gt;? The software development methodology is a process or series of processes used in software development&lt;/p&gt;

&lt;p&gt;You can do this process in different ways, but why reinvent the wheel again?&lt;/p&gt;

&lt;p&gt;There are several methodologies to use, one of the most traditional methodologies is &lt;strong&gt;Waterfall&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Why waterfall? when a water from waterfall comes down, there is no way to get back, and it passes through some big rocks (Here we say stages).&lt;/p&gt;

&lt;p&gt;In waterfall methodology, there are 5 stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analysis&lt;/li&gt;
&lt;li&gt;Design&lt;/li&gt;
&lt;li&gt;Implementation&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Maintenance&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Analysis
&lt;/h2&gt;

&lt;p&gt;It's rooted in sequence and logic, and it has a cycle. So when you complete a stage, you can not get back, you need to completely finish a stage to continue.&lt;br&gt;
In the first stage (Analysis), developers must write down all the requirements they need inside a requirement document.&lt;br&gt;
The document is about what the system is going to do, but not necessarily how it works. The document contains the future of the software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design
&lt;/h2&gt;

&lt;p&gt;Developers use requirement documents to research and make decisions on how they should design the system, but without considering costs like hardware or software.&lt;br&gt;
And also at the end of this stage, developers must make sure it works and it is not impossible with chosen hardware or software tech stacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;In this stage, the project enters the coding and implementing level, and developers write the actual code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;When coding is finished, the releases should test by beta testers, so they can report the bugs they face.&lt;br&gt;
Developers patch and fix these bugs in this stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintenance
&lt;/h2&gt;

&lt;p&gt;Deployment and review happen in this stage, some people consider two stages (Deployment - Review) for the last but it depends on you.&lt;br&gt;
This stage is where you release the stable version of your product, support your customers, maintain, and so on …&lt;/p&gt;

</description>
      <category>development</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
