<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://yeldar.org/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
  <atom:link rel="self" type="application/rss+xml" href="https://feed.yeldar.org/blog" />
    <title>Yeldar Kudaibergen</title>
    <link>https://yeldar.org/</link>
    <atom:link href="https://yeldar.org/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Self-taught developer</description>
    <language>en</language>
      <item>
        <title>⊕ Direct Follow Beta is Live</title>
        <link>https://yeldar.org/blog/dfcb/</link>
        <description>&lt;p&gt;Today, something important happened.&lt;/p&gt;
&lt;p&gt;⊕ Direct Follow went live.&lt;/p&gt;
&lt;p&gt;For now, I&#39;m the only user, but it works exactly the way I hoped it would. Before showing it to anyone else, I wanted to answer one simple question:&lt;/p&gt;
&lt;p&gt;&amp;quot;Would I actually use this myself?&amp;quot;&lt;/p&gt;
&lt;p&gt;Today, I did. Not as a developer. Not as a tester. As a user.&lt;/p&gt;
&lt;p&gt;The idea survived its first real-world test. That&#39;s a bigger milestone than it might sound. A lot of projects look great in your head, in documents, or in demos. Reality is where most of them fall apart. This one didn&#39;t.&lt;/p&gt;
&lt;p&gt;There&#39;s still a lot of work ahead, but tonight I&#39;m going to bed with a rare feeling: the core idea works.&lt;/p&gt;
</description>
        <pubDate>Fri, 12 Jun 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/dfcb/</guid>
      </item>
      <item>
        <title>The ⊕ Direct Follow button might actually work on any website</title>
        <link>https://yeldar.org/blog/dftg/</link>
        <description>&lt;p&gt;A few weeks ago, I &lt;a href=&quot;https://yeldar.org/blog/dfb/&quot;&gt;wrote&lt;/a&gt; that the &lt;em&gt;Follow&lt;/em&gt; button on a website should perhaps behave not as an action, but as a signal. At the time, I described it like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The button will become a live interface with its own signals and actions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think I&#39;m finally starting to understand what I meant. Most Follow buttons on the web work roughly the same way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the button.&lt;/li&gt;
&lt;li&gt;Leave the website.&lt;/li&gt;
&lt;li&gt;Open another platform.&lt;/li&gt;
&lt;li&gt;Follow the source there.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This creates a strange situation. We say that we follow a website, a creator, or a project, but in reality we follow the platform through which that source is distributed. That is why I keep coming back to the idea of Direct Follow.&lt;/p&gt;
&lt;p&gt;Not following a platform.&lt;/p&gt;
&lt;p&gt;Not following an app.&lt;/p&gt;
&lt;p&gt;But following the source itself.&lt;/p&gt;
&lt;p&gt;Technically, this can be powered by many different mechanisms: RSS, podcasts, social networks, website monitoring, and many others. But the user shouldn&#39;t have to think about any of that. For the user, there is only one thing that matters: the source.&lt;/p&gt;
&lt;p&gt;If a website is interesting, the user clicks:&lt;/p&gt;
&lt;p&gt;⊕ Direct Follow&lt;/p&gt;
&lt;p&gt;And from that moment on, a relationship exists between the user and the source. The word &amp;quot;relationship&amp;quot; has become the most important word in this entire idea.&lt;/p&gt;
&lt;p&gt;In a previous post, I wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The website itself becomes part of the subscription experience.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today, I would put it even more simply. A website stops being a place that must be checked manually from time to time. It becomes a source that can be followed directly.&lt;/p&gt;
&lt;p&gt;This week I built the first local version of Direct Follow and successfully tested the core scenario for the first time. At that moment, the idea stopped being just something on paper.&lt;/p&gt;
&lt;p&gt;It became a working prototype. There is still a long road ahead before this becomes a complete product. But for the first time, I genuinely started to believe that subscribing to updates from any website might actually be possible.&lt;/p&gt;
&lt;p&gt;And if this idea succeeds, the most important part of the entire system may turn out to be a single small button:&lt;/p&gt;
&lt;p&gt;⊕ Direct Follow&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Jun 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/dftg/</guid>
      </item>
      <item>
        <title>Interesting and useful</title>
        <link>https://yeldar.org/blog/recs/</link>
        <description>&lt;p&gt;I have accounts on almost every social media platform out there today. I originally signed up for them for all kinds of reasons, but mostly because of friends, coworkers, and family. Then I discovered there was something more there. People I had never met. Content I had never even thought about before. Sometimes I don&#39;t even remember how I ended up following someone in the first place. I came there because of people close to me, but now I barely see any of them. Mostly strangers.&lt;/p&gt;
&lt;p&gt;Today it happened again.&lt;/p&gt;
&lt;p&gt;I opened my Facebook feed, and the very first post was from someone I unfollowed a couple of years ago. There&#39;s something slippery about that guy. I try to stay away from people like that. But somehow Facebook decided for me that I might find his post interesting. What&#39;s worse, I actually read it. It wasn&#39;t long, but it was full of conflict. The author was commenting on a video about himself and basically saying, &amp;quot;You better lawyer up.&amp;quot;&lt;/p&gt;
&lt;img src=&quot;https://yeldar.org/assets/images/blog/recs/tsn-lawyer-scene.jpg&quot; alt=&quot;The Social Network&quot; /&gt;
&lt;p&gt;I took the bait and went into the comments. I read a few comments from people I didn&#39;t know and was about to write my own when it suddenly clicked.
This guy is just baiting people. And because the post was generating a lot of engagement, Facebook decided it was probably something I&#39;d find interesting, useful, or relevant. What&#39;s strange is that with today&#39;s language models, it should be pretty easy to recognize something as simple as plain old engagement bait. So this time I ended up blocking the account entirely, just to make absolutely sure Facebook understood that I&#39;m not interested in this kind of content.&lt;/p&gt;
&lt;p&gt;Did you notice what happened? We came to social media for completely different reasons. But somewhere along the way, something else was slipped to us under the label of &amp;quot;interesting&amp;quot; and &amp;quot;useful.&amp;quot; Add a little dopamine on top of that, and the trap is complete.&lt;/p&gt;
&lt;p&gt;Ladies and gentlemen, we&#39;ve been caught.&lt;/p&gt;
</description>
        <pubDate>Fri, 05 Jun 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/recs/</guid>
      </item>
      <item>
        <title>Clarification about DirectFlow and QRX</title>
        <link>https://yeldar.org/blog/pwr/</link>
        <description>&lt;p&gt;If I had heard about QRX for the first time on &lt;a href=&quot;https://weekly.podnews.net/1538779/episodes/19257420-spotify-s-new-features-and-why-did-bipoc-podcast-creators-close&quot;&gt;Podnews Weekly Review&lt;/a&gt;, I would probably have wondered why a simple &lt;a href=&quot;https://www.rssboard.org/rss-autodiscovery&quot;&gt;RSS autodiscovery&lt;/a&gt; feature was being called &amp;quot;flow&amp;quot; or &amp;quot;DirectFlow&amp;quot;.&lt;/p&gt;
&lt;p&gt;&#39;DirectFlow&#39; is the name of the first application built on top of &lt;a href=&quot;https://qrx.dev/&quot;&gt;QRX&lt;/a&gt; (Quick Response Experience). The name &#39;QRX&#39; came from QR codes. It was when I added QR code support to the &lt;a href=&quot;https://directflow.app/&quot;&gt;DirectFlow&lt;/a&gt; app that I realized the idea was much bigger than following websites and podcasts directly. The goal of QRX is simple: let applications discover what experiences are available from a URL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Podcasters&lt;/strong&gt; usually don&#39;t need to do anything. Paste the website address of almost any podcast into the DirectFlow app and that&#39;s it. If the website contains a &lt;em&gt;special magic link&lt;/em&gt;, you will successfully subscribe to the podcast. This also works with links to any page on the podcast&#39;s website. To discover a special magic link automatically, DirectFlow, through QRX, uses a technology that has existed for more than 25 years.&lt;/p&gt;
&lt;p&gt;Soon, users will be able to subscribe not only from website URLs, but also by pasting or sharing links from podcast apps such as Apple Podcasts, Spotify, Overcast, Pocket Casts, and others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Podcast applications&lt;/strong&gt; don&#39;t even need to add QR code scanning to benefit from QRX. Simply allow users to paste a website URL into the search box and automatically discover RSS feeds from the page&#39;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section, exactly as the DirectFlow app does today. Or simply allow users to share a website URL directly into the application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About flows.&lt;/strong&gt; As I continued working on QRX, RSS became just one possible result among &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/head#see_also&quot;&gt;many&lt;/a&gt;. Since &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; contains other &lt;em&gt;machine-readable signals&lt;/em&gt; as well, I started using the word &amp;quot;flow&amp;quot; instead of &amp;quot;feed&amp;quot;. In the DirectFlow app, a feed is one type of flow.&lt;/p&gt;
&lt;p&gt;So QRX is the &lt;em&gt;method&lt;/em&gt;. The DirectFlow app is the first application built on top of it. I believe the DirectFlow app solved a podcast subscription problem, both technically and practically. But it is not limited to podcasts.&lt;/p&gt;
&lt;p&gt;I&#39;m curious to see what the podcast industry does with this idea. From my side, I&#39;m open to any conversations, feedback, partnerships, or experiments around it.&lt;/p&gt;
</description>
        <pubDate>Thu, 28 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/pwr/</guid>
      </item>
      <item>
        <title>( Direct follow ⊕ )</title>
        <link>https://yeldar.org/blog/dfb/</link>
        <description>&lt;p&gt;The &#39;follow&#39; button on the web probably should behave like a signal. Most buttons today work like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;click&lt;/li&gt;
&lt;li&gt;leave the website&lt;/li&gt;
&lt;li&gt;open another app/platform&lt;/li&gt;
&lt;li&gt;maybe subscribe there&lt;/li&gt;
&lt;li&gt;maybe come back&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But what if following worked more like a connection state? So I started experimenting with a DirectFlow button ⊕ on my Kazakh language podcast &lt;a href=&quot;https://podcast.yeldar.org/&quot;&gt;website&lt;/a&gt;. Right now the button is in its simplest form:&lt;/p&gt;
&lt;img src=&quot;https://yeldar.org/assets/images/blog/dfb/df-btn-v1-simple.jpg&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;After clicking the button, you are taken to the &lt;a href=&quot;https://directflow.app/&quot;&gt;DirectFlow&lt;/a&gt; homepage, which immediately follows the podcast for you. But in the future, it will work like this:&lt;/p&gt;
&lt;p&gt;Initial state:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Direct follow ⊕&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After click:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Following...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Followed · View&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No “open another app/platform” step. And finally, the stable connected state:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;DirectFlow ✓&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you hover over it:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Unfollow · View&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The website no longer feels separated from the web, where you can only follow it through some centralized app. The website itself becomes part of the subscription experience. The button will become a live interface with its own signals and actions. Like it becomes a tiny status widget representing the relationship between the user and the website.&lt;/p&gt;
&lt;p&gt;The button dynamically uses the &lt;em&gt;current&lt;/em&gt; page URL. Every time you click it, df will check all available flows on the website, follow the first one, and show other available options, like a comments flow. This will work on every page - at least that’s the idea for now. It means now the page itself becomes the subscription target. I think this is a very different mental model from the current web.&lt;/p&gt;
&lt;p&gt;I would already like to add this button to this website, but the RSS feed here doesn’t contain enclosures yet, and as I &lt;a href=&quot;https://yeldar.org/blog/df/&quot;&gt;mentioned&lt;/a&gt; earlier, df currently supports only those kinds of flows.&lt;/p&gt;
</description>
        <pubDate>Tue, 26 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/dfb/</guid>
      </item>
      <item>
        <title>QRX doesn&#39;t need HTML body</title>
        <link>https://yeldar.org/blog/slow/</link>
        <description>&lt;p&gt;It all started when I saw this error in the &lt;a href=&quot;https://directflow.app/&quot;&gt;df&lt;/a&gt; console:&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;622|direct | [DISCOVER HTML FAILED] [http://thesecularfoxhole.live/](http://thesecularfoxhole.live/) Request failed with status code 503 (Service Unavailable): GET [https://www.thesecularfoxhole.live/](https://www.thesecularfoxhole.live/)
622|direct | [DISCOVER HTML FAILED] [https://www.thesecularfoxhole.live/](https://www.thesecularfoxhole.live/) Request failed with status code 503 (Service Unavailable): GET [https://www.thesecularfoxhole.live/](https://www.thesecularfoxhole.live/)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The strange part was that the website was fully accessible in the browser, and the &lt;a href=&quot;https://yeldar.org/blog/dfsp/&quot;&gt;auto-discovery tag&lt;/a&gt; was also there:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;alternate&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;application/rss+xml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;The Secular Foxhole&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://feeds.captivate.fm/the-secular-foxhole/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At that moment it became clear that the problem was on our side. There were two possible explanations, and increasing the timeout immediately solved the issue. Previously it was 3 seconds, and the site simply did not have enough time to load &lt;em&gt;completely&lt;/em&gt;. And the word &amp;quot;completely&amp;quot; is the key point here.&lt;/p&gt;
&lt;p&gt;To extract flows from &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, &lt;a href=&quot;https://qrx.dev/&quot;&gt;QRX&lt;/a&gt; does not actually need to download the entire HTML page. We only need the document until &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And a check in &lt;a href=&quot;https://pagespeed.web.dev/analysis/https-thesecularfoxhole-live/wrlwl8qnmg?form_factor=mobile&quot;&gt;PageSpeed Insights&lt;/a&gt; showed that &lt;code&gt;thesecularfoxhole.live&lt;/code&gt; had problems specifically in &amp;quot;Performance&amp;quot;.&lt;/p&gt;
&lt;img src=&quot;https://yeldar.org/assets/images/blog/slow/thesecularfoxhole-live.png&quot; alt=&quot;thesecularfoxhole.live PageSpeed Insights&quot; /&gt;
&lt;h2&gt;The solution&lt;/h2&gt;
&lt;p&gt;Now QRX no longer waits for the page to fully load. (It would actually be interesting to understand &lt;em&gt;why&lt;/em&gt; it waited in the first place. Why did we need the full page?)&lt;/p&gt;
&lt;p&gt;As soon as we receive something like:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;const HTML = [
  &quot;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&quot;,
  &quot;&amp;lt;body&quot;
];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or if the entire page becomes too large while there is still no &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; ending, we stop reading. There is nothing more for QRX to discover at that point. Full HTML loading may appear later in QRX, but for now the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section is enough.&lt;/p&gt;
&lt;p&gt;Meet &lt;a href=&quot;https://www.npmjs.com/package/@qrxcode/js/v/0.8.1&quot;&gt;QRX 0.8.1 &amp;quot;No body&amp;quot;&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Tue, 26 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/slow/</guid>
      </item>
      <item>
        <title>Follow podcasts directly with QRX</title>
        <link>https://yeldar.org/blog/dfsp/</link>
        <description>&lt;p&gt;After DirectFlow was &lt;a href=&quot;https://podnews.net/update/uk-podcast-metrics-consolidation#story10&quot;&gt;mentioned&lt;/a&gt; in Podnews, I decided to explain in a bit more detail how podcast subscriptions can work now. Besides scanning a QR code or typing a website address manually, DirectFlow can already follow podcasts in several different ways.&lt;/p&gt;
&lt;p&gt;In DirectFlow, you can already follow a podcast by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;scanning a QR code of the podcast website&lt;/li&gt;
&lt;li&gt;pasting the website link&lt;/li&gt;
&lt;li&gt;pasting a link to almost any page of the podcast website&lt;/li&gt;
&lt;li&gt;typing the domain manually and pressing Enter&lt;/li&gt;
&lt;li&gt;or using this url:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;https://directflow.app/follow?url=https:// podcast website/page adresss&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Soon, DirectFlow will also support following podcasts directly from links shared by podcast players and podcast apps. The important part is this: everything here revolves around the &lt;em&gt;domain&lt;/em&gt;. Once DirectFlow receives a website link, it tries to discover the podcast flow directly from the website itself. So the website becomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the identity;&lt;/li&gt;
&lt;li&gt;the connection point;&lt;/li&gt;
&lt;li&gt;the thing you follow directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And this type of interaction with domains is what I call Quick response experience — &lt;a href=&quot;https://qrx.dev/&quot;&gt;QRX&lt;/a&gt;. It&#39;s a different way of thinking about what websites and links can do.&lt;/p&gt;
&lt;p&gt;For podcast developers, podcast hosting platforms, and website owners: if you want DirectFlow to reliably discover your podcast, expose the RSS feed in the HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; on every page of the website.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;alternate&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;application/rss+xml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Podcast RSS Feed&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://example.com/feed.xml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allows software to discover podcast feeds directly from websites, even when someone shares a random episode page, article, or other URL from the site. Feed autodiscovery reference: &lt;a href=&quot;https://www.rssboard.org/rss-autodiscovery&quot;&gt;https://www.rssboard.org/rss-autodiscovery&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a podcast, your RSS feed should also contain proper enclosures:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;enclosure&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://example.com/episode1.mp3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;12345678&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;audio/mpeg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RSS feed enclosure reference: &lt;a href=&quot;https://www.rssboard.org/rss-specification#ltenclosuregtSubelementOfLtitemgt&quot;&gt;https://www.rssboard.org/rss-specification#ltenclosuregtSubelementOfLtitemgt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Maybe podcasts were always meant to be followed this way - directly from websites themselves. The web already had most of the pieces. QRX is mostly about reconnecting them into a simpler interaction model.&lt;/p&gt;
</description>
        <pubDate>Mon, 25 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/dfsp/</guid>
      </item>
      <item>
        <title>Learn programming through &quot;Hello World&quot;</title>
        <link>https://yeldar.org/blog/hw/</link>
        <description>&lt;p&gt;Yesterday, just for fun, I decided to write a regular Hello World program in C while sitting in my server console. It turned out like this:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%s&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, World!&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And suddenly I discovered that Hello World seems like a very simple program, but it can be written in many different ways. For example, here is another version:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, World!&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%s&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you can keep expanding this for a very long time, finding solutions at your own level of understanding of the language. For example, if you are learning how to create functions:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;printStr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;string &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;printStr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;printStr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%s&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I will update this post as I create new variations.&lt;/p&gt;
&lt;p&gt;The most important thing is not to make the program more complicated just for the sake of complexity, and to remember that the goal of the program is simply to print the words “Hello, World”.&lt;/p&gt;
</description>
        <pubDate>Fri, 22 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/hw/</guid>
      </item>
      <item>
        <title>11ty tags as flows</title>
        <link>https://yeldar.org/blog/twf/</link>
        <description>&lt;p&gt;Spent some time this week cleaning up the site. Added &lt;a href=&quot;https://yeldar.org/tags/&quot;&gt;tags&lt;/a&gt; – but I think of them less as labels and more as flows. If you follow what I&#39;m building with ProxyFeed, you probably don&#39;t care about my C programming notes. If you&#39;re into QRX, you want QRX updates. Tags let you follow just the thread that matters to you.&lt;/p&gt;
&lt;p&gt;Which is why each of the three main projects – ProxyFeed, DirectFlow, and QRX – now has its own RSS feed. Subscribe to one, ignore the rest. That felt important to me: the whole point of RSS is control over what you read, so the feeds should reflect that.&lt;/p&gt;
&lt;p&gt;One thing I had to solve: my post frontmatter uses mixed case – &lt;code&gt;QRX&lt;/code&gt;, &lt;code&gt;DirectFlow&lt;/code&gt; – but URLs should be lowercase. Rather than going through every post manually, I normalized tags automatically at build time in Eleventy:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addCollection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_lowercaseTags&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;collectionApi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  collectionApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tags&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tags &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tags&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A dummy collection that returns nothing – it just mutates the data as a side effect before everything else runs.&lt;/p&gt;
&lt;p&gt;For the per-tag RSS feeds, I didn&#39;t want a feed for every tag – just the three projects. So I defined an allowlist and used Eleventy&#39;s pagination to generate one feed per entry:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RSS_TAGS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;qrx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;directflow&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;proxyfeed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;rssTags&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;rssTag&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;feed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;xml&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eleventy generates &lt;code&gt;/tags/qrx/feed.xml&lt;/code&gt;, &lt;code&gt;/tags/directflow/feed.xml&lt;/code&gt;, and &lt;code&gt;/tags/proxyfeed/feed.xml&lt;/code&gt; automatically. Clean and easy to extend.&lt;/p&gt;
&lt;p&gt;The homepage also got a rethink. Before it was basically just a blog list – fine if you already know me, confusing if you don&#39;t. Now it leads with who I am and what I&#39;m building, and the posts come after. Less personal diary, more actual homepage.&lt;/p&gt;
&lt;p&gt;Small changes, but they make the site feel like it has a point of view.&lt;/p&gt;
</description>
        <pubDate>Sat, 16 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/twf/</guid>
      </item>
      <item>
        <title>DirectFlow App – follow podcasts directly</title>
        <link>https://yeldar.org/blog/df/</link>
        <description>&lt;p&gt;I’ve been experimenting with a small project called &lt;a href=&quot;https://directflow.app/&quot;&gt;DirectFlow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Right now it looks like a simple podcast app, but the original idea behind it was actually much broader. At first, DirectFlow was an experiment around the idea that people should be able to &lt;em&gt;follow websites directly&lt;/em&gt;, without depending so heavily on platforms, directories, or centralized systems in between.&lt;/p&gt;
&lt;p&gt;The idea was simple: paste almost any website URL into a form, and the application would try to discover machine-readable flows directly from the website itself. RSS feeds, Atom feeds, JSON feeds, and other things websites already expose in their HTML metadata.&lt;/p&gt;
&lt;p&gt;But while building it, I realized something important: most people do not naturally think in terms of “following websites directly.” It is still not a familiar user experience outside of a few technical communities.&lt;/p&gt;
&lt;p&gt;Podcasting, however, immediately stood out as a place where this problem is very real.&lt;/p&gt;
&lt;p&gt;Subscribing to podcasts today is still strangely complicated compared to the rest of the modern internet. Usually you need to search inside a specific app, rely on podcast directories, or manually deal with RSS feeds that normal users were never supposed to think about in the first place.&lt;/p&gt;
&lt;p&gt;At the same time, the underlying infrastructure already exists and already works surprisingly well. Most podcast websites already expose feeds automatically. RSS already works. Open podcasting already works. The problem is mostly the user experience around it.&lt;/p&gt;
&lt;p&gt;So I decided to intentionally narrow DirectFlow down to podcasts for now.&lt;/p&gt;
&lt;p&gt;Today the idea is intentionally simple: you paste a podcast website URL into DirectFlow, scan a QR code, or share a link into the app — and DirectFlow automatically discovers the podcast feed and subscribes you to it.&lt;/p&gt;
&lt;p&gt;No searching through directories.&lt;/p&gt;
&lt;p&gt;No explaining RSS.&lt;/p&gt;
&lt;p&gt;No copying feed URLs manually.&lt;/p&gt;
&lt;p&gt;No platform lock-in.&lt;/p&gt;
&lt;p&gt;Just follow the podcast directly from its website.&lt;/p&gt;
&lt;p&gt;The current version is still very experimental, but it already supports both audio and video podcasts. If a feed contains playable audio or video enclosures, DirectFlow can detect them and play episodes directly inside the app.&lt;/p&gt;
&lt;p&gt;At some point I also realized that my own definition of podcasting had become much simpler than many industry discussions around it. To me, a podcast is basically just an open feed with playable enclosures. That’s it. If a feed contains playable audio or video files, applications should be able to discover it, subscribe to it, and play it.&lt;/p&gt;
&lt;p&gt;I also started using the word “flow” instead of only “feed,” because it feels broader and more correct for what I’m experimenting with. A feed is a technical format. A flow is more like a relationship between a website and an application.&lt;/p&gt;
&lt;p&gt;Some of these ideas later evolved into another small project called &lt;a href=&quot;https://qrx.dev/&quot;&gt;QRX&lt;/a&gt;, which experiments with discovering machine-readable flows from normal URLs and QR codes. I &lt;a href=&quot;https://yeldar.org/blog/qrx/&quot;&gt;wrote&lt;/a&gt; a bit more about that separately already.&lt;/p&gt;
&lt;p&gt;Right now DirectFlow is mostly a place where I experiment with podcast UX ideas in public. Maybe some of these ideas eventually become part of a bigger standalone application. Maybe some of them simply help existing podcast apps become better.&lt;/p&gt;
&lt;p&gt;Either way, I think podcast subscriptions should feel much more natural than they do today.&lt;/p&gt;
&lt;p&gt;I’ve been working with podcasts for many years now, both technically and creatively, and one thing I’ve seen again and again is how much friction still exists around subscriptions.&lt;/p&gt;
&lt;p&gt;I’ve had to explain RSS feeds to listeners countless times. I’ve had to explain how podcast apps work, how to copy a feed URL, where to paste it, why some apps behave differently, why searching sometimes fails, why a podcast appears on one platform but not another, and so on.&lt;/p&gt;
&lt;p&gt;And every extra step loses people.&lt;/p&gt;
&lt;p&gt;You can literally watch listeners disappear during the subscription process. Someone gets interested in a podcast, but before they actually subscribe, they already have to understand too many things that normal users should never have to think about. RSS feeds, directories, platform differences, search indexing, manual imports — all of this still leaks into the user experience.&lt;/p&gt;
&lt;p&gt;That’s one of the main reasons I started building DirectFlow.&lt;/p&gt;
&lt;p&gt;And honestly, I think I may have finally found a very simple solution to this problem.&lt;/p&gt;
&lt;p&gt;Imagine if podcast apps like Pocket Casts, Apple Podcasts, Fountain, Overcast, or others simply added a QR scanner inside the app itself. A person scans a QR code from a podcast website, poster, video, or screen — and the app immediately discovers the podcast feed and subscribes them natively.&lt;/p&gt;
&lt;p&gt;Or imagine someone simply pasting a podcast website URL into a podcast app, and the app instantly showing the podcast page and follow button automatically, without requiring the user to understand RSS at all. That changes the entire subscription experience.&lt;/p&gt;
&lt;p&gt;The really interesting part is that subscriptions would finally happen directly through the podcast’s actual open feed itself, instead of depending entirely on platform-specific IDs, internal databases, or centralized discovery systems.&lt;/p&gt;
&lt;p&gt;The infrastructure already exists. Most podcast websites already expose their feeds publicly. Applications simply need to discover and use them more naturally. I think it will be very interesting to watch how podcast subscriptions evolve from here.&lt;/p&gt;
&lt;p&gt;Podcasting has been a huge part of my life for a long time. I’ve created podcasts myself, worked with podcasters, built podcast-related tools, explained podcast infrastructure to companies and creators, and spent years thinking about how open podcasting actually works underneath the surface.&lt;/p&gt;
&lt;p&gt;I’m even writing a book about podcasting right now because I think there are still many things about this medium that people outside the industry do not fully see yet.&lt;/p&gt;
&lt;p&gt;That’s also why DirectFlow is not just a random experiment for me. It comes from years of seeing the same UX problems repeat over and over again, and finally trying to build a simpler approach around the infrastructure podcasting already has.&lt;/p&gt;
</description>
        <pubDate>Thu, 14 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/df/</guid>
      </item>
      <item>
        <title>QRX means Quick response experience</title>
        <link>https://yeldar.org/blog/qrx/</link>
        <description>&lt;p&gt;Right now I’m working on the idea that people should be able to follow sources directly, without platforms or intermediaries in between. And this is already possible. You can already subscribe to podcasts through &lt;a href=&quot;https://directflow.app/&quot;&gt;DirectFlow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Originally, I built DirectFlow so that a person could paste almost any website URL into a form, and DirectFlow would immediately discover the main flow of that site and subscribe to it. I started using the word “flow” because it felt broader than just “feed.” A feed is more of a technical format. A flow can also represent other machine-readable relationships.&lt;/p&gt;
&lt;p&gt;At some point I started thinking: what if a user simply scanned a website QR code, and DirectFlow instantly subscribed them to it? After all, DirectFlow already discovers the main flow of a website just from its URL. The system does not really care how that URL arrives - whether it was pasted into a form, shared from another app, typed manually, or... scanned from a QR code. That was the moment everything clicked.&lt;/p&gt;
&lt;p&gt;I realized I had accidentally solved one of the fundamental UX problems of podcasting: subscription. Suddenly, subscribing to a podcast could become as natural and lightweight as following someone on social media for the first time.&lt;/p&gt;
&lt;p&gt;Then I started looking around to see who else was thinking about QR codes this way. There were hints of similar ideas, but almost all of them had the same limitation: a QR code always triggered one fixed interpretation or one predefined action.&lt;/p&gt;
&lt;p&gt;In my case, the QR code itself stayed completely unchanged, but what applications could discover from it was no longer limited. If a website exposes machine-readable flows in its HTML head or HTTP headers, then different applications can discover completely different things from the exact same URL.&lt;/p&gt;
&lt;p&gt;For example, &lt;em&gt;https://example.com&lt;/em&gt; may expose a podcast RSS feed in its head metadata. If a podcast player scans that website QR code, it can automatically discover the feed and immediately offer the user a native “Follow podcast” experience. This scenario already works in DirectFlow using the &lt;a href=&quot;https://www.npmjs.com/package/@qrxcode/js&quot;&gt;QRX JavaScript SDK&lt;/a&gt;. That was the moment &lt;a href=&quot;https://qrx.dev/&quot;&gt;QRX&lt;/a&gt; became a separate project outside of DirectFlow.&lt;/p&gt;
&lt;p&gt;About the name. At first, the working name was QR-UX, because this idea is really about changing the user experience around QR codes without changing the QR code itself or the existing web infrastructure behind it. The QR code, the URL, and the website all stay the same. What changes is the experience applications can provide after scanning. Later the name became QRX. And eventually I realized it could naturally stand for &lt;em&gt;Quick Response Experience&lt;/em&gt;, because that is exactly what this approach changes: the experience of interacting with QR codes and URLs.&lt;/p&gt;
&lt;p&gt;I’ll continue writing about QRX here. Over the last week I’ve accumulated quite a lot of thoughts, observations, and already a bit of real implementation experience.&lt;/p&gt;
</description>
        <pubDate>Thu, 14 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/qrx/</guid>
      </item>
      <item>
        <title>Learn programming through undestanding</title>
        <link>https://yeldar.org/blog/lptu/</link>
        <description>&lt;p&gt;Sometimes I think about writing a blog post and then suddenly it feels like: “this is so banal”, “who would even care about this, let alone find it useful.” But still, let me try to explain what I’m experiencing right now in my programming journey.&lt;/p&gt;
&lt;p&gt;It’s strange. I realized that even though I already built ProxyFeed (backend in TS), it feels like I’ve never actually programmed before. It turned out that, in my current understanding, programming is when you write code yourself and run the program to see whether it works or not. And a person becomes a programmer exactly at that moment. A professional programmer becomes one when somebody pays them for it — usually money, by agreement.&lt;/p&gt;
&lt;p&gt;So yeah, I came up with something again. And I’m 100% going to build it. It’s one of those “projects” that simply deserves to exist, and &lt;a href=&quot;https://yeldar.org/blog/ai-study-buddy/&quot;&gt;my buddy&lt;/a&gt; confirmed it too. The funniest and most dramatic part is that I literally cannot not build it. So yes, in a more or less sane state of mind, I’m voluntarily getting myself into this story. Let’s see what happens.&lt;/p&gt;
&lt;p&gt;Even though I had never written a single line of Go in my life, I decided that Go would become the main backend language for &lt;a href=&quot;https://directflow.app/&quot;&gt;DirectFlow&lt;/a&gt;. I looked at the situation from many different angles and it seems that, at this moment, Go is the most suitable language for me. I even realized why. It’s strange to understand the difference between TypeScript and Go not only through syntax, but through the character, logic, explanations, and style of the language itself.&lt;/p&gt;
&lt;p&gt;I was immediately surprised that &lt;code&gt;:=&lt;/code&gt; in Go means both creating and assigning a value. Previously, I had creation and assignment both through &lt;code&gt;=&lt;/code&gt;, meaning one action represented two completely different things. Anyway, I liked Go because it feels like the language is built similarly to how I am as a person. I don’t fully understand it yet myself, but I like that it works.&lt;/p&gt;
&lt;p&gt;My next realization is that we learn programming by doing it. By writing code, creating programs, and running them. Previously, it felt to me like first you learn, and &lt;em&gt;only&lt;/em&gt; then you program. As if you cannot program until you’ve learned how. Sounds logical, right?&lt;/p&gt;
&lt;p&gt;But here’s what I discovered: computers do not grow naturally like trees. Humans created computers, languages, and embedded their logic into them. Our job is simply to &lt;em&gt;understand&lt;/em&gt; how things work — not memorize syntax. Then write code. Realize why it&#39;s wrong I mean error. Again and again. That’s it.&lt;/p&gt;
&lt;p&gt;But here’s what I discovered: computers do not grow naturally like trees. Humans created computers, programming languages, and embedded their logic into them. Our job is simply to understand how things work, not memorize syntax. Then write code. See why it’s wrong, fix the error, understand it. Then write code again. Again and again. That’s what a developer’s job is, right? And apparently, this is how a person becomes a programmer. You simply write code, understand it, and when you run the program — you are a programmer.&lt;/p&gt;
&lt;p&gt;I partially understand that the “writing code” part may sound old-fashioned now, especially when it feels like AI writes code for everyone. But this is my current understanding, and I’m sure it will evolve further. And I will definitely keep writing about it here.&lt;/p&gt;
&lt;p&gt;Follow my blog directly on DirectFlow: &lt;a href=&quot;https://directflow.app/follow?url=https://yeldar.org&quot;&gt;https://directflow.app/follow?url=https://yeldar.org&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 09 May 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/lptu/</guid>
      </item>
      <item>
        <title>Start a podcast before anyone listens</title>
        <link>https://yeldar.org/blog/podcen-start-before/</link>
        <description>&lt;p&gt;When you study at university, most things pass through you. Classes, notes, exams - and in the end, you’re left with a diploma that doesn’t show &lt;em&gt;how&lt;/em&gt; you think. Now imagine recording your journey from the first year every week, honestly: what you learn, what confuses you, what starts to make sense. You can talk to classmates, ask questions, reach out to people in the field. You’re creating content and thinking out loud.&lt;/p&gt;
&lt;p&gt;At first, no one listens - and that’s the advantage. No pressure, no need to perform. You can be wrong, change your mind, and figure things out. Over time, your thinking becomes clearer, and you build a record of your growth. After a few years, you don’t just study a subject - you understand it.&lt;/p&gt;
&lt;p&gt;People say “no one will listen.” I used to think that was a problem. Now I see it as freedom.&lt;/p&gt;
&lt;p&gt;Following this idea, I’m starting my own podcast about my podcasting journey, this time in English, to document the process of figuring things out.&lt;/p&gt;
&lt;p&gt;In this podcast, I’ll be talking about how I’m building it from zero, step by step. I’ll share the process of writing my book about podcasting, and also the ideas behind &lt;a href=&quot;https://yeldar.org/blog/proxyfeed-2-cleanup/&quot;&gt;ProxyFeed&lt;/a&gt; - a tool I’m working on.&lt;/p&gt;
&lt;p&gt;I know it might sound like I think too much about podcasting. Maybe I do. I just really care about freedom and independence - and podcasting, for me, is exactly about that.&lt;/p&gt;
&lt;p&gt;Recently, I started sharing this idea while working on UberX, aka a &amp;quot;classic immigrant job&amp;quot;, talking to students from USC and professionals. I realized these conversations shouldn’t just disappear, so I began offering my email if they ever wanted to start a podcast or continue the conversation. A couple of people wrote it down - that’s when it clicked: this idea resonates because it’s real.&lt;/p&gt;
</description>
        <pubDate>Thu, 09 Apr 2026 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/podcen-start-before/</guid>
      </item>
      <item>
        <title>Why does C have so many compilers?</title>
        <link>https://yeldar.org/blog/c-compilers/</link>
        <description>&lt;p&gt;When you first start learning C, you quickly find out that C is a compiled language. Compilation can feel like an &lt;em&gt;extra&lt;/em&gt; step after writing the code, unlike, for example, JavaScript. In JS, you don’t need to compile anything manually - compilation happens under the hood, making the process feel automatic, so the language appears to simply interpret your code.&lt;/p&gt;
&lt;p&gt;Compared to that, compilation in C can initially feel like an unnecessary and redundant step.&lt;/p&gt;
&lt;p&gt;But recently, I accidentally went deeper into the topic of compilers, and it slightly shifted my understanding of C.&lt;/p&gt;
&lt;p&gt;Have you ever noticed that the code written in C is the same, yet there are multiple compilers: &lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;clang&lt;/code&gt;, and so on? A natural question comes up - if the language is one, why does it need different compilers?&lt;/p&gt;
&lt;p&gt;It turns out the key point is that a compiler translates code for &lt;em&gt;specific hardware&lt;/em&gt;. This universality - a language built with portability across different architectures in mind - is exactly what made C so important in the first place. Since compilers are different, they can behave differently when compiling the same code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;they report errors differently&lt;/li&gt;
&lt;li&gt;they produce warnings differently&lt;/li&gt;
&lt;li&gt;they optimize code differently&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...while the source code itself remains the same. And for the same reason, data types in C can have different sizes - depending on the architecture and the compiler.&lt;/p&gt;
&lt;p&gt;If you think about it, it’s a brilliant solution: the same code can be compiled for different hardware. That’s why C has so many compilers.&lt;/p&gt;
</description>
        <pubDate>Tue, 16 Dec 2025 16:00:00 PST</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/c-compilers/</guid>
      </item>
      <item>
        <title>A deep cleanup of ProxyFeed</title>
        <link>https://yeldar.org/blog/proxyfeed-2-cleanup/</link>
        <description>&lt;p&gt;I realized that while improving &lt;a href=&quot;https://proxyfeed.io/&quot;&gt;ProxyFeed&lt;/a&gt; I overloaded it so much that its original purpose began to suffer: providing a stable address for a feed. So I removed &lt;em&gt;almost&lt;/em&gt; all feed modifications. Almost, because feeds have self-tags, and those must be rewritten so the feed reader has no doubts about the canonical source of the proxy feed.&lt;/p&gt;
&lt;p&gt;There is something interesting here: the less you interfere with someone else’s feed, the cleaner the architecture becomes. You remove one piece of logic, and immediately you see that another one is unnecessary. Then another. And step by step the system returns to its natural form. Without trying to “improve” what should not be improved.&lt;/p&gt;
&lt;p&gt;It turns out ProxyFeed should be a stable bridge between the original feed and the platforms. That is its only strength. Everything else is noise that gets in the way.&lt;/p&gt;
&lt;p&gt;Once I removed almost all modifications, it became clear that the true value of ProxyFeed is its reliability. That it does not break the feed. That it does not disappear. That once a stable address is created, it lives and makes it possible to change the original feed URL or even the original feed type without pain.&lt;/p&gt;
&lt;p&gt;And here is the fascinating part: the simpler the system becomes, the clearer the real work becomes. You need to correctly identify the feed type. You need to guarantee no duplicates. You need a cache system that does not fail. You need to ensure that self-tags always point to the proxy feed. You need proper support for JSON, Atom, and whatever comes next.&lt;/p&gt;
&lt;p&gt;Here is what was actually done:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fully removed all feed content modifications, no element edits and no attempts to &amp;quot;improve&amp;quot; the original feed;&lt;/li&gt;
&lt;li&gt;implemented feed type detection (RSS, Atom, JSON Feed) before parsing;&lt;/li&gt;
&lt;li&gt;kept only the essential rewriting of self-tags (rss/atom/json) so feed readers treat the proxy feed as canonical;&lt;/li&gt;
&lt;li&gt;added a strict check preventing the same original feed from being connected twice;&lt;/li&gt;
&lt;li&gt;added validation ensuring publicUrl is unique and never conflicts;&lt;/li&gt;
&lt;li&gt;added proper handling of JSON Feed without trying to mimic XML;&lt;/li&gt;
&lt;li&gt;improved XML normalization: remove BOM, add declaration only when missing;&lt;/li&gt;
&lt;li&gt;removed &lt;code&gt;itunes:new-feed-url&lt;/code&gt; so no player can redirect subscribers back to the original;&lt;/li&gt;
&lt;li&gt;rewritten caching logic: correct handling of hash, unchanged, partial and ok states;&lt;/li&gt;
&lt;li&gt;added atomic guarantees for cache and backup creation;&lt;/li&gt;
&lt;li&gt;moved the whole project closer to the “as-is” principle: minimal interference, maximum stability.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m self-taught dev, and I have to learn from my own experience from trying to improve things that, as it turns out, didn’t need to be touched. That’s okay. ProxyFeed grows together with me. And every time I simplify it, I understand the architecture, the responsibility, and the path itself a little better. I want this service to live a long life, and for the people who choose it to be able to rely on it with confidence.&lt;/p&gt;
</description>
        <pubDate>Fri, 14 Nov 2025 16:00:00 PST</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/proxyfeed-2-cleanup/</guid>
      </item>
      <item>
        <title>Is it a podcast? But why?</title>
        <link>https://yeldar.org/blog/definitions/</link>
        <description>&lt;p&gt;UPD. This post needs to udpate.&lt;/p&gt;
&lt;p&gt;For the past 10 years, I’ve been exploring podcasting — as a trend, as a business, and as something that has changed my life.&lt;/p&gt;
&lt;p&gt;This post — grew out of a desire to understand and explain what a podcast is, and what podcasting is. To understand — for myself. To explain — for anyone who one day asks the same question. What I do here is simple: I think out loud and write it down. Because for me, words — text — are the foundation of understanding.&lt;/p&gt;
&lt;p&gt;At the beginning, I just wanted to know what exactly I was doing. What does it mean when I say “I’m a podcaster”? I didn’t want to just repeat trendy words — I wanted to &lt;em&gt;understand&lt;/em&gt;. And it didn’t happen right away. Like many others, I tried to understand podcasting through other people’s definitions: articles, conferences, videos, opinions. But they left me uneasy. Something didn’t fit, something was confusing, something just felt off. I kept feeling that the definitions weren’t getting to the core.&lt;/p&gt;
&lt;p&gt;I met people who said, “Oh, a podcast is just a conversation on YouTube,” or others who insisted it’s simply an RSS feed — and that’s it. All of that is part of the journey.&lt;/p&gt;
&lt;p&gt;And so, after years of practice, conversations, research, debates — and especially the need to be heard (for some reason, that really mattered to me at the time) — I came to my own clear and simple definitions. They’re built on logic, evidence, history, and hands-on experience. These definitions answer today’s key questions about podcasts and podcasting. They don’t try to make someone right or wrong — they just clarify what’s what, without the noise.&lt;/p&gt;
&lt;p&gt;Most importantly, they finally gave me peace of mind. Now I know exactly what I do. And when I explain what a podcast is, I don’t hesitate, second-guess, or doubt. It’s clear. It’s simple. I’ve seen it many times — after I explain it, people feel free, light, clear.&lt;/p&gt;
&lt;p&gt;I’ve worked with large commercial companies and industry experts, as well as students and school kids — and it’s always the same effect. These people go on to create unique, untemplated podcasts. It’s amazing: I explain it the same way to everyone, and the outcomes are always different.&lt;/p&gt;
&lt;p&gt;I still don’t know exactly why I’m so passionate about podcasts and podcasting. It just happened. I have friends who obsessively photograph airplanes — I’ll probably never understand them. But I respect their passion and their attempts to explain it to me. Or like a chef who knows the subtle difference between one type of salt and another, and why this dish needs one and not the other. Thankfully, we don’t have to understand all that to enjoy a great meal. And you don’t have to dive as deep into podcasting as I have — you can simply enjoy the result.&lt;/p&gt;
&lt;h2&gt;What is podcasting?&lt;/h2&gt;
&lt;p&gt;Podcasting is the distribution of media files via an RSS feed with an &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element. These are usually audio or video files. In this context, an RSS feed using the &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element isn’t just a technical choice — it’s a foundation for freedom and independence.&lt;/p&gt;
&lt;p&gt;It could have been built on any other mechanism, but right now, only RSS with &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; gives us that level of openness, portability, and control. The key is that the RSS feed contains an &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element with a direct link to the file.&lt;/p&gt;
&lt;p&gt;If we remove RSS — or the &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element — and everything falls apart. We lose the definition of everything. What is podcasting? How is podcasting different from streaming or radio? RSS with an &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element is the cornerstone of podcasting. It’s not just a technical detail — it’s the very thing that makes a podcasting &lt;em&gt;a podcasting&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Without this distinction, it becomes impossible to tell podcasting apart from YouTube — or even Dropbox. Sure, those platforms might be more convenient, more intuitive, more centralized, with “smart” recommendations and polished interfaces. But they are also controlled: bound by laws, rules, algorithms, and corporate interests. You can call that many things — but if it doesn’t involve RSS with an &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element, it’s not podcasting.&lt;/p&gt;
&lt;p&gt;When does a piece of audio become &lt;em&gt;radio&lt;/em&gt;? When it’s broadcast over the airwaves. Before that, it’s just audio. Why does the same exact text get different names depending on how it’s sent? If sent over SMTP — it’s email. If sent over the SS7 signalling protocol — it’s an SMS. Even though the content is exactly the same.&lt;/p&gt;
&lt;p&gt;Same with the podcasting. It becomes the podcasting only because it distributing files via RSS with an &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element. Not content production, feeling, or opinion — just the delivery method.&lt;/p&gt;
&lt;p&gt;Oh, right — podcasting is not about content creation. Recording audio or video is production, with its own stages: pre-production, production, post-production. Podcasting only begins at the moment of publishing via RSS.&lt;/p&gt;
&lt;h2&gt;What is a podcast?&lt;/h2&gt;
&lt;p&gt;A podcast is a media files that is distributed through an RSS feed using the &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element. These are typically audio or video files — they become podcasts when they are distributed through podcasting.&lt;/p&gt;
&lt;p&gt;The main confusion in defining a podcast stems from the tendency to conflate the media file with its content. Many people assume a podcast is a specific &lt;em&gt;genre&lt;/em&gt; or &lt;em&gt;format&lt;/em&gt; — for example, a casual conversation, an interview, a narrative, or an investigative series.&lt;/p&gt;
&lt;p&gt;But this assumption quickly falls apart. If we define a podcast as a free-form conversation, what do we call solo podcasts — monologues recorded by a single person? And what about podcasts that feature no human voice at all, such as audio recordings of elevator sounds or birdsong in a forest?&lt;/p&gt;
&lt;p&gt;Every time we try to shift the definition toward genre or format, we end up creating countless exceptions. Eventually, the definition becomes meaningless — it no longer defines anything clearly.&lt;/p&gt;
&lt;p&gt;So why is it that people so often associate the word “podcast” with a conversation, or with the presence of a human voice, and so on? There are plenty of such labels. I’ve discovered something interesting: whatever kind of podcast someone first encountered — they tend to believe &lt;em&gt;that&lt;/em&gt; is what a podcast is supposed to be. And often, they end up creating podcasts in the same format or genre. And this is absolutely normal.&lt;/p&gt;
&lt;p&gt;If someone’s first exposure to podcasts was The Joe Rogan Experience, then that becomes their definition of what a podcast is — and whatever the host does becomes, for them, what podcasting means. Or if it was This American Life — then &lt;em&gt;that’s&lt;/em&gt; what they think podcast is. It’s not a rule — it’s just an observation of mine.&lt;/p&gt;
&lt;p&gt;Once, just for fun, I created a podcast that contains only a single episode, one second long —
&lt;a href=&quot;https://podcastindex.org/podcast/6521300&quot;&gt;&lt;em&gt;Бір&lt;/em&gt;&lt;/a&gt;. Another example: &lt;a href=&quot;https://podcastindex.org/podcast/4404594&quot;&gt;&lt;em&gt;Elevator&lt;/em&gt;&lt;/a&gt; — a podcast where I post elevator sounds. And these are podcasts. Just as much as &lt;em&gt;Serial&lt;/em&gt; or &lt;em&gt;Podcasting 2.0&lt;/em&gt; are. They have an RSS feed with an &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; element, they can be subscribed to, they’re published on the same platforms as all other podcasts, and so on. And the fact that there’s no human voice in them… well, that’s just the kind of podcast it is.&lt;/p&gt;
&lt;p&gt;I call this the absurd level of freedom. At first, it may seem ridiculous — but then you realize what kind of creative freedom you’ve gained.&lt;/p&gt;
&lt;p&gt;When I say that &lt;em&gt;“something is a podcast”&lt;/em&gt;, I mean one thing only: it&#39;s available via RSS — or distributed to platforms through an RSS feed. No RSS? Then it’s just file on the internet. Even with RSS, it’s still the same file — but now it becomes something more: part of a decentralized flow, powered by automation and driven by the principles of freedom and independence on both ends.&lt;/p&gt;
&lt;!-- Originally posted on definition.wtf in Jun 9 2025. --&gt;</description>
        <pubDate>Tue, 11 Nov 2025 16:00:00 PST</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/definitions/</guid>
      </item>
      <item>
        <title>ProxyFeed devlog: funding tags, bug fixes</title>
        <link>https://yeldar.org/blog/proxyfeed-1-tags-bugs/</link>
        <description>&lt;p&gt;&lt;strong&gt;Important update:&lt;/strong&gt; ProxyFeed has undergone significant architectural changes. Much of the old behavior and many earlier features have been removed or redesigned. For the latest and accurate information, please read the new post describing all recent changes: &lt;a href=&quot;https://yeldar.org/blog/proxyfeed-2-cleanup/&quot;&gt;A deep cleanup of ProxyFeed&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I submitted my application for the LinkedIn REACH Backend Apprenticeship and had to write three essays, so I didn’t have much time for coding. Fortunately, I got everything done and sent off — now I’m back to working on &lt;a href=&quot;https://proxyfeed.io/&quot;&gt;ProxyFeed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Originally, ProxyFeed was built specifically for podcast feeds, and even now, I still find remnants of that original thinking when adding new features. But my approach has changed — I now support Podcasting 2.0 tags for any type of RSS feed, not just podcasts. That said, I’ve kept a flag in the database just in case we need to distinguish between podcast and non-podcast feeds.&lt;/p&gt;
&lt;p&gt;One of the updates: I revised how the &lt;code&gt;&amp;lt;podcast:funding&amp;gt;&lt;/code&gt; tag works. Now, users can only add one funding tag per feed, regardless of whether it’s a podcast. Technically, multiple tags were allowed, but there&#39;s really no point — podcast players usually display just one, and I assume RSS readers will do too. After a tag is added, the feed is immediately re-fetched so the change appears in the proxy without delay. Also, I finally implemented tag deletion, and if a feed already has a funding tag in the original source, we now inform the user on the settings page.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;em&gt;This funding tag comes from the original feed and cannot be edited here. To change it, update your original RSS feed or remove the tag from the original feed — then you’ll be able to edit it here.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What happens if the original feed didn’t have a funding tag, but the user adds one through ProxyFeed — and then the original feed later adds its own funding tag? In that case, ProxyFeed keeps the original intact. The original feed always takes priority over proxy changes.&lt;/p&gt;
&lt;p&gt;This work, even just adding a seemingly simple tag like &lt;code&gt;&amp;lt;podcast:funding&amp;gt;&lt;/code&gt;, reminded me how complex this project really is.&lt;/p&gt;
&lt;p&gt;Another step: replacing the &lt;code&gt;atom:link&lt;/code&gt; with the URL of the generated proxy feed. This worked perfectly for new feeds, but didn’t apply to older ones — unless the user updated the domain or slug. So, I wrote a script that scanned all feeds and patched the outdated ones.&lt;/p&gt;
&lt;p&gt;I also cleaned up the database — removed old unused tables. At some point, I had the idea to fully parse feeds into structured database tables and reassemble them later. But due to the huge variety in RSS formats (or maybe I just wasn’t ready for it), this approach turned out to be unrealistic. So I deleted all related tables. The database is now clean.&lt;/p&gt;
&lt;p&gt;All of this is part of a gradual preparation for the next major step: adding Podping support.&lt;/p&gt;
&lt;p&gt;Oh, and I fixed another bug: ProxyFeed supports both system and custom domains. When users picked a system domain, I wasn’t generating a &lt;code&gt;slug&lt;/code&gt; for them, since system feeds used &lt;code&gt;feed id&lt;/code&gt;. Now, regardless of domain type, every feed gets a slug.&lt;/p&gt;
</description>
        <pubDate>Tue, 15 Jul 2025 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/proxyfeed-1-tags-bugs/</guid>
      </item>
      <item>
        <title>Cross-social networks</title>
        <link>https://yeldar.org/blog/cross-social-networks/</link>
        <description>&lt;p&gt;All modern social networks are basically the same. You can post text, photos, videos. Some even support audio. But they’re all closed off from each other.&lt;/p&gt;
&lt;p&gt;Now imagine this: you can read TikTok from Mastodon. Or subscribe to a YouTube channel from Bluesky, like it’s just another account in your feed. Or read Substack posts inside Threads.&lt;/p&gt;
&lt;p&gt;The answer already exists. Most platforms already have RSS feeds (some public, some hidden). And many RSS feeds already include rich media: text, images, video, audio — sometimes even files via &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This kind of future is already partially possible — especially in the Fediverse, where bots and parsers can deliver content across platforms. You can follow Bluesky feeds, Mastodon accounts, even podcasts, blogs, or YouTube channels. But right now it all feels like duct tape and magic — servers, APIs, proxies, and background scripts. It really feels like this should be much simpler.&lt;/p&gt;
&lt;p&gt;To be fair, RSS isn’t strictly required — the real goal is for any social network to be able to followproxyfeed-BKTgdpmS any other. No need for cross-posting, duplicate accounts, or “check out my Instagram here” links. You should just be able to read what you want, where you want. That said, right now, RSS is still the most practical and universal tool for this.&lt;/p&gt;
&lt;p&gt;Right now, it&#39;s still a bit of a mess to make it work. But the idea is simple: we just want to subscribe and read, without worrying about formats or protocols. Wherever you are, you follow what interests you — and it shows up in your feed.&lt;/p&gt;
</description>
        <pubDate>Sun, 15 Jun 2025 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/cross-social-networks/</guid>
      </item>
      <item>
        <title>A clearer vision for ProxyFeed</title>
        <link>https://yeldar.org/blog/proxyfeed-main/</link>
        <description>&lt;p&gt;&lt;strong&gt;Important update:&lt;/strong&gt; ProxyFeed has undergone significant architectural changes. Much of the old behavior and many earlier features have been removed or redesigned. For the latest and accurate information, please read the new post describing all recent changes: &lt;a href=&quot;https://yeldar.org/blog/proxyfeed-2-cleanup/&quot;&gt;A deep cleanup of ProxyFeed&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Note: This post was originally &lt;a href=&quot;https://weblog.kz/blog/proxyfeed-main-entity/&quot;&gt;written&lt;/a&gt; in Kazakh. This is an expanded English translation.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ProxyFeed.io is now powering live feeds — including my own audioblog — and everything is working as expected.&lt;/p&gt;
&lt;p&gt;The biggest difference from the previous version is that I’ve now clearly defined the &lt;em&gt;main entity&lt;/em&gt; of ProxyFeed: the new RSS feed we generate for the user. Every function in the system revolves around this feed. Previously, I don’t think that was entirely clear to me. But this realization helped structure the entire system’s architecture.&lt;/p&gt;
&lt;p&gt;At first, I made a big decision: Users couldn’t register unless they provided a fully valid RSS feed with &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; tags. But as I kept building, my thinking evolved. I realized there’s no real reason to limit ProxyFeed to podcast feeds only — &lt;strong&gt;we can accept any valid RSS feed&lt;/strong&gt;. It doesn’t have to be audio-based. If the feed is valid, ProxyFeed can work with it. This shift helped me open up new use cases I hadn’t even considered before.&lt;/p&gt;
&lt;p&gt;It’s important to be clear about one thing: &lt;strong&gt;ProxyFeed is, first and foremost, a stable feed URL.&lt;/strong&gt; Your RSS feed never changes — even if you change hosts. Everything else — Podcasting 2.0 tags, caching, feed enhancements — is built on top of that foundation.&lt;/p&gt;
&lt;p&gt;Another core principle: If your original feed already includes advanced tags, ProxyFeed doesn’t overwrite or interfere. We only add missing tags — nothing more. That’s intentional: it keeps things simple and shows respect for your existing setup.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S. One thought I’ve been toying with: what if we added some Podcasting 2.0 tags to regular blog feeds?&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 11 Jun 2025 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/proxyfeed-main/</guid>
      </item>
      <item>
        <title>ProxyFeed — a permanent URL for any RSS feed</title>
        <link>https://yeldar.org/blog/proxyfeed-v1/</link>
        <description>&lt;p&gt;&lt;strong&gt;Important update:&lt;/strong&gt; ProxyFeed has undergone significant architectural changes. Much of the old behavior and many earlier features have been removed or redesigned. For the latest and accurate information, please read the new post describing all recent changes: &lt;a href=&quot;https://yeldar.org/blog/proxyfeed-2-cleanup/&quot;&gt;A deep cleanup of ProxyFeed&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I built &lt;a href=&quot;https://proxyfeed.io/&quot;&gt;ProxyFeed&lt;/a&gt; — a tool that gives your podcast (or any RSS feed) a permanent, stable URL, no matter how often your hosting changes. It enhances your feed with Podcasting 2.0 features, supports custom subdomains, and works for any type of RSS. I made it to solve my own problem — now it’s ready for others to use. Core features will stay free; premium options may come later.&lt;/p&gt;
&lt;p&gt;Lately, this blog, podcast, and social channels have gone quiet — but behind the scenes, things have been moving fast. About a three months ago, I built a simple website for my podcast in Kazakh. As part of that, I had to change the RSS feed — a familiar problem in the podcasting world. If you switch podcast hosts, your feed URL changes. Sure, you can set up a 301 redirect, but even that isn’t guaranteed to work forever.&lt;/p&gt;
&lt;p&gt;So I decided to solve this problem once and for all — at least for myself. I built a tool that takes the feed my podcast site generates and republishes it under a stable, fast, permanent link. Now, no matter how often I change hosting platforms, my public feed stays the same. On top of that, the tool can enhance the RSS feed — for example, by adding Podcasting 2.0 tags and other advanced features. I have big plans for the future.&lt;/p&gt;
&lt;p&gt;This idea actually started years ago when I was still living in Kazakhstan. But back then, I didn’t have the knowledge, experience, or courage to follow through. It remained just a conversation. After moving to the U.S., I realized I &lt;em&gt;had&lt;/em&gt; to make it real. I built the first version just for myself — then realized it could help other podcasters too. That’s when I gave it a name — ProxyFeed — and turned it into its own project.&lt;/p&gt;
&lt;p&gt;Today, ProxyFeed is live and working. It’s currently powering the RSS feed for my audio blog, and everything is running smoothly. The core of the system is now clearly defined: the main product is the proxy RSS feed we create for the user. Everything else in the system — features, tools, domains — exists to support that one feed.&lt;/p&gt;
&lt;p&gt;This architectural clarity led to one key decision: if a user doesn&#39;t provide a valid RSS feed with &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt; tags (a full podcast feed), they won’t be able to register. If you don’t already have a feed, ProxyFeed isn’t for you.&lt;/p&gt;
&lt;p&gt;Having a clear definition of the system’s core made development much easier. For example, I used to treat the user’s custom subdomain and their original feed as equal. But now I see them both as secondary — just support elements for the main proxy feed we generate.&lt;/p&gt;
&lt;p&gt;One more major update: ProxyFeed no longer works only with podcasts. Now it can handle &lt;em&gt;any&lt;/em&gt; RSS feed. No restrictions. I initially built it from a podcasting perspective, but over time I realized users are much more diverse. For example, this blog now has its own ProxyFeed-powered RSS feed: &lt;a href=&quot;https://feed.yeldar.org/blog&quot;&gt;https://feed.yeldar.org/blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The old feed still works, for now. But if I ever move my blog to a new domain, only the ProxyFeed URL will remain stable. That’s the whole point — to ensure that your feed link never breaks, no matter what happens upstream.&lt;/p&gt;
&lt;p&gt;One area of focus is Podcasting 2.0 support. I’ve started adding new tags, beginning with &lt;code&gt;&amp;lt;podcast:funding&amp;gt;&lt;/code&gt;, and soon I’ll include &lt;code&gt;&amp;lt;podcast:locked&amp;gt;&lt;/code&gt;. My initial goal is to implement the full Podcast Standards Project &lt;a href=&quot;https://podstandards.org/features/&quot;&gt;feature list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Soon, I plan to share ProxyFeed with the podcasting community. If it solves your problem like it did mine — go ahead and use it. The core functionality will remain free. To be honest, I didn’t build this to make money. I built it to solve a problem I personally faced. Now I’m just sharing it with others.&lt;/p&gt;
</description>
        <pubDate>Sun, 08 Jun 2025 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/proxyfeed-v1/</guid>
      </item>
      <item>
        <title>Now AI is my Study buddy</title>
        <link>https://yeldar.org/blog/ai-study-buddy/</link>
        <description>&lt;p&gt;I&#39;m still reading K&amp;amp;R. As I’ve said before, I &lt;a href=&quot;https://yeldar.org/blog/want-work-c/&quot;&gt;like the book&lt;/a&gt; — it’s concise, clear, but sometimes a bit dry and requires a thoughtful approach. Without context, some things are hard to grasp, especially if you&#39;re learning C from scratch. Sometimes I just want to discuss certain parts with someone. After we moved to Los Angeles, my conversations with my mentor became rare — and to some extent, AI took his place.&lt;/p&gt;
&lt;p&gt;The main drawback of AI, I think, is that it &lt;em&gt;always&lt;/em&gt; tries to answer — even when it doesn’t know. It can &amp;quot;hallucinate&amp;quot; or make things up. So I always double-check its answers, test them, and look for confirmation elsewhere.&lt;/p&gt;
&lt;p&gt;For example, why bother a mentor with a question like “Why is &lt;code&gt;++i&lt;/code&gt; better than &lt;code&gt;i++&lt;/code&gt;?” I find even questions like that interesting, but for someone with decades of experience in commercial programming, it probably feels too basic. This way, if he finds it interesting, he can just read my post — and maybe later we’ll talk about it in person.&lt;/p&gt;
&lt;p&gt;Overall, I’d say this: learning with AI is faster — and more importantly, deeper. This might be the first book I’ve ever read &lt;em&gt;in conversation&lt;/em&gt;.&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Apr 2025 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/ai-study-buddy/</guid>
      </item>
      <item>
        <title>One shortcut for copy and paste</title>
        <link>https://yeldar.org/blog/dublicate-file/</link>
        <description>&lt;p&gt;When I’m writing posts in &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt;, I often need to create new posts by copying and pasting files into the same folder. While this isn&#39;t difficult, the repetitive nature of the task started to irritate me. I wanted to find a faster way.&lt;/p&gt;
&lt;p&gt;I discovered that while &lt;code&gt;⌘ + D&lt;/code&gt; works for duplicating files in macOS, but it doesn&#39;t work in VSCode. Than I found a way to streamline the process using the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=sleistner.vscode-fileutils&quot;&gt;&amp;quot;File Utils&amp;quot;&lt;/a&gt; extension.&lt;/p&gt;
&lt;p&gt;Here’s how to set it up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install the &amp;quot;File Utils extension;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Keyboard Shortcuts settings: go to Code &amp;gt; Settings &amp;gt; Keyboard Shortcuts or just press &lt;code&gt;⌘ + K ⌘ + S&lt;/code&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find the Duplicate File Command: in the Keyboard Shortcuts window, type &amp;quot;Duplicate file&amp;quot; in the search bar;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assign a Keybinding for Duplication.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I wanted to create the shortest keyboard shortcut to duplicate a file: &amp;quot;D&amp;quot; key. However, that didn’t work, as I couldn’t finish any word containing the letter &amp;quot;D&amp;quot; 😁 Every time I pressed &amp;quot;D&amp;quot;, the file duplication command triggered. As a result, I had to resort to using the key combination &lt;code&gt;⌘ + D ⌘ + D&lt;/code&gt;. Yes, twice. You just have to press &lt;code&gt;⌘&lt;/code&gt; and press &lt;code&gt;D&lt;/code&gt; twice.&lt;/p&gt;
&lt;p&gt;Now, when you want to duplicate a file, just select the file in the file explorer, press your newly assigned keybinding, and the file will be duplicated in the same folder. You will only need to enter a new file name.&lt;/p&gt;
</description>
        <pubDate>Sun, 15 Sep 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/dublicate-file/</guid>
      </item>
      <item>
        <title>Pointers in C made simple</title>
        <link>https://yeldar.org/blog/pointers-simple/</link>
        <description>&lt;p&gt;When I first came across pointers in C, I thought it was a pretty tricky topic. Even when I was just doing simple pointer exercises, like working with arrays, I didn&#39;t really understand what was going on under the hood. Today, I finally took the plunge and dived into chapter 5 of the &lt;a href=&quot;https://yeldar.org/blog/want-work-c/&quot;&gt;C book&lt;/a&gt;, which explains in detail what pointers are and how to work with them.&lt;/p&gt;
&lt;p&gt;I found this example really helpful in understanding pointers better. It goes like this:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// Don&#39;t worry about z[10] for now;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;z&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// I think this point was added to show that a pointer can also change its value; don&#39;t worry about z[10] for now;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Declaring variables and a pointer&lt;/h3&gt;
&lt;p&gt;Let&#39;s dive in and start declaring some variables! We&#39;ll go ahead and create variables: &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;. We also create an &lt;code&gt;ip&lt;/code&gt; pointer that will point to a variable of type &lt;code&gt;int&lt;/code&gt;, which we&#39;ll use to help us keep track of things.&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&#39;d like to draw your attention to the way a pointer is declared: &lt;code&gt;int *ip&lt;/code&gt;. This just means that &lt;code&gt;ip&lt;/code&gt; is a pointer to a variable of the &lt;code&gt;int&lt;/code&gt; type. The asterisk &lt;code&gt;*&lt;/code&gt; here is super helpful because it shows us that &lt;code&gt;ip&lt;/code&gt; is not just a regular variable, but a pointer! This means that it will store the address of a variable of the &lt;code&gt;int&lt;/code&gt; type in memory.&lt;/p&gt;
&lt;p&gt;It&#39;s really important to understand that the &lt;code&gt;*&lt;/code&gt; is referring to &lt;code&gt;ip&lt;/code&gt; and not &lt;code&gt;int&lt;/code&gt;. I&#39;m sure you&#39;ll find this example really helpful in understanding this point:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;w&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; k &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// w – a pointer to a variable of `int` type; k is just a variable of `int` type;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s continue parsing the code from the book...&lt;/p&gt;
&lt;h3&gt;Assigning the address of a variable to a pointer&lt;/h3&gt;
&lt;p&gt;Next, we assign the address of the &lt;code&gt;x&lt;/code&gt; variable to the &lt;code&gt;ip&lt;/code&gt; pointer:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;&amp;amp;&lt;/code&gt; operator before &lt;code&gt;x&lt;/code&gt; means “address of the variable &lt;code&gt;x&lt;/code&gt;”. Thus, now &lt;code&gt;ip&lt;/code&gt; stores the address of the variable &lt;code&gt;x&lt;/code&gt;. This is a key part of understanding pointers: a pointer itself does not store the value of a variable, it only stores its address in memory.&lt;/p&gt;
&lt;h3&gt;Pointer dereferencing&lt;/h3&gt;
&lt;p&gt;The next step is pointer dereferencing:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, the asterisk &lt;code&gt;*&lt;/code&gt; before &lt;code&gt;ip&lt;/code&gt; means “the value at the address pointed to by the &lt;code&gt;ip&lt;/code&gt; pointer”. Since &lt;code&gt;ip&lt;/code&gt; points to &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;*ip&lt;/code&gt; returns the value of &lt;code&gt;x&lt;/code&gt; which is 1. It means &lt;code&gt;*ip&lt;/code&gt; equal to &lt;code&gt;x&lt;/code&gt; or vice versa.&lt;/p&gt;
&lt;p&gt;Therefore, the variable &lt;code&gt;y&lt;/code&gt; is assigned the value &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Changing the value of a variable through a pointer&lt;/h3&gt;
&lt;p&gt;Now we will change the value of the variable &lt;code&gt;x&lt;/code&gt; through a pointer:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This line means “assign the value &lt;code&gt;0&lt;/code&gt; to the variable pointed to by &lt;code&gt;ip&lt;/code&gt;”. Since &lt;code&gt;ip&lt;/code&gt; points to &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt; becomes 0. That is, the &lt;code&gt;*&lt;/code&gt; in &lt;code&gt;*ip&lt;/code&gt; works both ways. With &lt;code&gt;*ip&lt;/code&gt; you can take out a value, likewise with &lt;code&gt;*ip&lt;/code&gt; you can write a value. In detail: &lt;code&gt;*ip&lt;/code&gt; is &lt;code&gt;x&lt;/code&gt;. Lines &lt;code&gt;printf&lt;/code&gt; in C code work the same way:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 1&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Important points&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The pointer itself stores only the address of the variable, not its value. This is an important distinction to understand. A pointer points to a memory location where the value of a variable is stored, but the pointer itself stores only the address of that location.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pointer dereferencing, that is, when we write “asterisk variable pointer” - &lt;code&gt;*ip&lt;/code&gt;, we are accessing the value of the variable pointed to by &lt;code&gt;ip&lt;/code&gt;. This is called pointer dereferencing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can assign the value of the variable through the pointer. That is, dereferencing works both ways.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The asterisk - &lt;code&gt;*&lt;/code&gt; is used to dereference a pointer and the ampersand - &lt;code&gt;&amp;amp;&lt;/code&gt; is used to get the address of a variable.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At first glance, pointers in C may seem complicated, but when you begin to understand their essence, they become a powerful tool for memory management.&lt;/p&gt;
&lt;p&gt;This example helped me to better understand how pointers work and how they can be used. I hope my experience will help you learn this topic faster.&lt;/p&gt;
&lt;p&gt;I also suggest you to read the post &lt;a href=&quot;https://yeldar.org/blog/asterisk-in-c/&quot;&gt;The Asterisk * Operator in C&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 30 Aug 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/pointers-simple/</guid>
      </item>
      <item>
        <title>Does every memory cell in a computer have its own address?</title>
        <link>https://yeldar.org/blog/mem-cells-addrs/</link>
        <description>&lt;p&gt;By diving into the world of C, I have encountered the concept of memory addresses and how they relate to variables and data storage. This topic intrigued me, and I decided to explore the question: &lt;strong&gt;Does every memory cell in a computer have its own address?&lt;/strong&gt; Here’s what I discovered.&lt;/p&gt;
&lt;p&gt;In the simplest terms, a computer&#39;s memory is organized into a series of storage locations, known as memory cells. Each of these cells can hold a small amount of data, typically one byte. To access and manipulate this data effectively, every memory cell is assigned a unique identifier known as an &lt;strong&gt;address&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When I declared a variable in C, like &lt;code&gt;int num;&lt;/code&gt;, I learned that the compiler allocates a memory address for &lt;code&gt;num&lt;/code&gt;, where its value will be stored. This made me realize that every time I create a variable, I am essentially creating a link to a specific location in memory.&lt;/p&gt;
&lt;p&gt;When a program is executed, the operating system allocates memory for it, dividing it into segments like code, data, and stack. Within these segments, individual variables and data structures are assigned specific addresses sequentially. For example, if a program starts execution at memory address &lt;code&gt;0x00400000&lt;/code&gt;, the first variable might be stored at that address, while subsequent variables get assigned addresses incrementally.&lt;/p&gt;
&lt;p&gt;One surprising fact I came across is that modern computers use something called &lt;strong&gt;virtual memory&lt;/strong&gt;, which creates an abstraction of memory. This means that the addresses used by a program may not correspond directly to physical memory addresses. The operating system manages these mappings, allowing programs to use a larger address space than what is physically available.&lt;/p&gt;
&lt;p&gt;Another interesting tidbit is that the number of unique addresses is determined by the architecture of the CPU. For instance, a 32-bit system can address about 4 billion unique locations, while a 64-bit system can address a significantly larger space. This is why 64-bit systems are now the norm—they can handle much more memory, which is crucial for running modern applications.&lt;/p&gt;
&lt;p&gt;In conclusion, I found that every memory cell in a computer does indeed have its own address, which plays a vital role in how we store and access data. Understanding these concepts is essential for anyone learning C programming, as it lays the groundwork for exploring more advanced topics like pointers and data structures.&lt;/p&gt;
&lt;p&gt;This exploration has given me a deeper appreciation for how computers manage memory and how crucial these addresses are for efficient programming. I’m excited to continue my journey and see where this knowledge takes me!&lt;/p&gt;
</description>
        <pubDate>Mon, 26 Aug 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/mem-cells-addrs/</guid>
      </item>
      <item>
        <title>About getchar() in C</title>
        <link>https://yeldar.org/blog/getchar/</link>
        <description>&lt;p&gt;&lt;code&gt;getchar()&lt;/code&gt; is a simple but powerful function from the C standard library that allows you to read characters from standard input.&lt;/p&gt;
&lt;p&gt;It is defined in the header file &lt;code&gt;&amp;lt;stdio.h&amp;gt;&lt;/code&gt; and has the following prototype:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;int&lt;/code&gt; return type is used because &lt;code&gt;getchar()&lt;/code&gt; returns a character from the input stream as an integer. This allows it to handle all possible character values, as well as special values like EOF (end of file). Because in C, characters (&lt;code&gt;char&lt;/code&gt;) are represented as integer values corresponding to their encoding in the ASCII table. For example, the letter &lt;code&gt;&#39;A&#39;&lt;/code&gt; has an ASCII code of 65, and &lt;code&gt;&#39;a&#39;&lt;/code&gt; has 97. And by returning the value as an &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;getchar()&lt;/code&gt; can handle not only all ASCII characters but also special values like EOF.&lt;/p&gt;
&lt;p&gt;EOF (end-of-file) is a special value indicating that the input stream has ended. It is usually represented as &lt;code&gt;-1&lt;/code&gt;. If &lt;code&gt;getchar()&lt;/code&gt; returned a &lt;code&gt;char&lt;/code&gt; type, it would be impossible to distinguish &lt;code&gt;EOF&lt;/code&gt; from valid characters, as &lt;code&gt;char&lt;/code&gt; ranges from -128 to 127 or from 0 to 255 (depending on the implementation). Using &lt;code&gt;int&lt;/code&gt; avoids this issue, as EOF typically has a value that is outside the range of ASCII characters.&lt;/p&gt;
&lt;p&gt;Also, calling &lt;code&gt;getchar()&lt;/code&gt; blocks the program&#39;s execution until a character is entered and the Enter key is pressed. This is convenient for interactive data input.&lt;/p&gt;
&lt;p&gt;Here’s a straightforward example of using &lt;code&gt;getchar()&lt;/code&gt; with two conditions for clarity:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Enter text (to finish, enter Ctrl+D or &#39;d&#39;):&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;d&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;EOF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;putchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;nProgram terminated.&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this example, &lt;code&gt;getchar()&lt;/code&gt; is used to read a character from standard input. This character is stored in the variable &lt;code&gt;c&lt;/code&gt;. The &lt;code&gt;while&lt;/code&gt; loop continues as long as the entered character is not &lt;code&gt;&#39;d&#39;&lt;/code&gt; and not EOF. This allows the program to terminate when the user inputs &lt;code&gt;d&lt;/code&gt; or presses &lt;code&gt;Ctrl+D&lt;/code&gt; on macOS. The entered character is output back to the screen using &lt;code&gt;putchar(c)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To fully understand how &lt;code&gt;getchar()&lt;/code&gt; works, try entering single characters as well as whole words and sentences. Input to &lt;code&gt;getchar()&lt;/code&gt; is buffered until you press the Enter key. This means that &lt;code&gt;getchar()&lt;/code&gt; does not receive a character immediately after it is pressed but only after the line of input is complete. So, if you enter &lt;code&gt;kghdkeh&lt;/code&gt;, the program will output only &lt;code&gt;kgh&lt;/code&gt; because it will stop at &lt;code&gt;d&lt;/code&gt; according to the condition.&lt;/p&gt;
</description>
        <pubDate>Tue, 13 Aug 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/getchar/</guid>
      </item>
      <item>
        <title>Understanding #define in C</title>
        <link>https://yeldar.org/blog/define-in-c/</link>
        <description>&lt;p&gt;As I dive into the world of programming with C, one of the fundamental concepts I&#39;ve encountered is the &lt;code&gt;#define&lt;/code&gt; preprocessor directive. Learning about &lt;code&gt;#define&lt;/code&gt; from the classic book &amp;quot;The C Programming Language&amp;quot; by Brian Kernighan and Dennis Ritchie has been quite enlightening. Here’s what I’ve understood about it and why it’s an essential tool for writing efficient and readable code.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#define&lt;/code&gt; is a preprocessor directive in C that allows us to create symbolic constants and macros. It essentially instructs the compiler to replace instances of a specific name in the code with a defined value before the actual compilation process begins. This happens during the preprocessing phase, which occurs before the compilation phase.&lt;/p&gt;
&lt;p&gt;Using &lt;code&gt;#define&lt;/code&gt; allows programmers to give meaningful names to values used in their code. Instead of scattering &amp;quot;magic numbers&amp;quot; throughout the code, which can make it difficult to understand, we can use &lt;code&gt;#define&lt;/code&gt; to give these numbers descriptive names. This makes the code much easier to read and understand, both for myself and others who might read my code.&lt;/p&gt;
&lt;p&gt;By defining constants at the beginning of the program with &lt;code&gt;#define&lt;/code&gt;, it&#39;s easy to update these values in one place if they ever need to change. This single-point change capability greatly simplifies maintenance and reduces the risk of errors. If I need to change a constant value, I can do it by modifying the &lt;code&gt;#define&lt;/code&gt; statement rather than searching through the entire codebase for every instance of that value.&lt;/p&gt;
&lt;p&gt;Kernighan and Ritchie emphasize the dangers of hardcoding values directly in code. Using &lt;code&gt;#define&lt;/code&gt; helps avoid this by abstracting the values into named constants. This abstraction layer is particularly useful in large codebases where the same value might be used in multiple places.&lt;/p&gt;
&lt;p&gt;Another advantage mentioned in the book is that using &lt;code&gt;#define&lt;/code&gt; can sometimes allow the compiler to optimize the code better. Since the compiler replaces the symbolic names with actual values during preprocessing, it can optimize the resulting code more effectively than if variables were used.&lt;/p&gt;
&lt;p&gt;Besides defining constants, &lt;code&gt;#define&lt;/code&gt; can also be used to create macros, which are like functions but are expanded inline. This can improve performance by avoiding the overhead of a function call, although it’s important to use them judiciously to maintain code clarity.&lt;/p&gt;
&lt;p&gt;The power of &lt;code&gt;#define&lt;/code&gt; lies in its simplicity and efficiency. By providing a way to name constants and create macros, it enhances the clarity, maintainability, and performance of C programs. Learning about &lt;code&gt;#define&lt;/code&gt; from Kernighan and Ritchie&#39;s book has taught me to appreciate the importance of writing clean, understandable, and maintainable code—a skill that&#39;s essential for any budding programmer like myself.&lt;/p&gt;
&lt;p&gt;While &lt;code&gt;#define&lt;/code&gt; is a powerful tool, it’s important to use it wisely. Overusing it or using it incorrectly can lead to code that is hard to debug and maintain. As I continue to learn, I aim to apply these principles to write code that is not only functional but also elegant and efficient.&lt;/p&gt;
</description>
        <pubDate>Sun, 11 Aug 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/define-in-c/</guid>
      </item>
      <item>
        <title>I want to work with C</title>
        <link>https://yeldar.org/blog/want-work-c/</link>
        <description>&lt;p&gt;Reading the book by Kernighan and Ritchie on the C language, I am beginning to realize how powerful and flexible this language is. One of its main goals was to provide maximum control over memory and program execution efficiency. While I understand this from the text, I am starting to grasp the concept more deeply as I read on.&lt;/p&gt;
&lt;p&gt;Today, I encountered an interesting point: it turns out that the assignment operation in C returns the value itself, not the assignment status, as I had assumed. At first, this seemed illogical to me. However, after researching online, I understood that this design makes sense in the context of low-level programming, where minimizing the number of operations and efficiently working with expressions is crucial.&lt;/p&gt;
&lt;p&gt;The C language assumes that the programmer knows exactly what they are doing and does not attempt to guess their intentions. C requires a deep understanding of its features, and I believe no one can explain it better than the authors of the language themselves. I am glad I found Kernighan and Ritchie&#39;s book from 1992 in the library. The examples from the book still work exactly as intended — it&#39;s impressive.&lt;/p&gt;
</description>
        <pubDate>Fri, 09 Aug 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/want-work-c/</guid>
      </item>
      <item>
        <title>Finding the Greatest Number in C</title>
        <link>https://yeldar.org/blog/find-great-num/</link>
        <description>&lt;p&gt;When programming, a common task is to find the greatest of three numbers. There are several ways to achieve this in C. In this blog post, we will explore multiple methods to solve this problem, ranging from simple conditional statements to using standard library functions.&lt;/p&gt;
&lt;h2&gt;Basic Approach Using Nested &lt;code&gt;if&lt;/code&gt; Statements&lt;/h2&gt;
&lt;p&gt;The most straightforward way to find the greatest number among three given numbers is to use nested &lt;code&gt;if&lt;/code&gt; statements. Here&#39;s how you can do it:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;233&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This method works well, but it can be made more concise.&lt;/p&gt;
&lt;h2&gt;Using Ternary Operator&lt;/h2&gt;
&lt;p&gt;A more compact way to write the function is by using the ternary operator:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;233&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This approach reduces the number of lines and makes the code more readable.&lt;/p&gt;
&lt;h2&gt;Using Standard Library Functions&lt;/h2&gt;
&lt;p&gt;If you can use the standard library, leveraging &lt;code&gt;fmax&lt;/code&gt; from &lt;code&gt;math.h&lt;/code&gt; can simplify the function:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;math.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;233&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This method uses &lt;code&gt;fmax&lt;/code&gt; to compare two numbers at a time, returning the greatest.&lt;/p&gt;
&lt;h2&gt;Using an Array and Loop&lt;/h2&gt;
&lt;p&gt;Another way is to put the numbers in an array and iterate through it to find the maximum value:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;233&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; max &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; max&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            max &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; max&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This approach is useful if you need to handle a larger set of numbers dynamically.&lt;/p&gt;
&lt;h2&gt;Using Utility Functions&lt;/h2&gt;
&lt;p&gt;Creating a utility function to compare two numbers and then using it can also be effective:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;233&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This method promotes code reuse and can be extended easily.&lt;/p&gt;
&lt;h2&gt;Using Non-Nested Conditions&lt;/h2&gt;
&lt;p&gt;Finally, using non-nested conditions can make the function easier to read:&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%d&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;233&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greatest_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This approach avoids nested conditions, making the logic clearer.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Finding the greatest of three numbers in C can be accomplished in various ways. The choice of method depends on your specific needs and preferences. Whether you prefer the simplicity of nested &lt;code&gt;if&lt;/code&gt; statements or the compactness of the ternary operator, understanding these different approaches can help you write more efficient and readable code.&lt;/p&gt;
&lt;p&gt;Feel free to experiment with these methods and choose the one that best suits your style and requirements!&lt;/p&gt;
</description>
        <pubDate>Tue, 06 Aug 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/find-great-num/</guid>
      </item>
      <item>
        <title>The Asterisk * Operator in C</title>
        <link>https://yeldar.org/blog/asterisk-in-c/</link>
        <description>&lt;p&gt;The asterisk &lt;code&gt;*&lt;/code&gt; operator in the C programming language is a versatile symbol with multifaceted applications. Understanding its usage across different contexts is essential for proficient programming and efficient code development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pointers:&lt;/strong&gt; Pointers are fundamental in C programming, allowing manipulation of memory addresses and data. The asterisk &lt;code&gt;*&lt;/code&gt; symbol is employed to dereference pointers, enabling access to the value stored at a particular memory address. This dereferencing operation is crucial for tasks such as dynamic memory allocation, data traversal, and passing data by reference to functions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multiplication:&lt;/strong&gt; In arithmetic operations, the asterisk &lt;code&gt;*&lt;/code&gt; serves as the multiplication operator. It is used to perform multiplication between numerical operands, yielding the product of the two values. While seemingly straightforward, understanding operator precedence and the order of operations involving the asterisk &lt;code&gt;*&lt;/code&gt; is essential for accurate mathematical computations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input-Output Operators:&lt;/strong&gt; Within input-output operations, such as &lt;code&gt;printf&lt;/code&gt; and &lt;code&gt;scanf&lt;/code&gt;, the asterisk &lt;code&gt;*&lt;/code&gt; is used as part of format specifiers to specify the formatting of input and output data. For instance, &lt;code&gt;%&#92;*d&lt;/code&gt; in &lt;code&gt;printf&lt;/code&gt; allows formatting of an integer with a variable field width, providing flexibility in output formatting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Function Pointers:&lt;/strong&gt; Function pointers are pointers that point to functions rather than data. The asterisk &lt;code&gt;*&lt;/code&gt; is crucial for dereferencing function pointers, allowing the invocation of the function they reference. This feature is particularly powerful in scenarios where functions need to be passed as arguments to other functions or stored in data structures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory Allocation:&lt;/strong&gt; Dynamic memory allocation functions like &lt;code&gt;malloc&lt;/code&gt;, &lt;code&gt;calloc&lt;/code&gt;, and &lt;code&gt;realloc&lt;/code&gt; are essential for managing memory dynamically at runtime. The asterisk &lt;code&gt;*&lt;/code&gt; is used in conjunction with these functions to specify the type of data for which memory is allocated. Proper memory management, including allocation and deallocation, is critical for preventing memory leaks and optimizing resource utilization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pointers to Pointers:&lt;/strong&gt; Pointers to pointers, also known as double pointers, add another layer of indirection in memory management. The asterisk &lt;code&gt;*&lt;/code&gt; is utilized for dereferencing double pointers to access the value or address pointed to by the pointer to a pointer. This concept is often encountered in scenarios where functions need to modify pointer variables or dynamically allocate multi-dimensional arrays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Arrays and Pointers:&lt;/strong&gt; In C, arrays and pointers exhibit close relationships, with arrays being essentially pointers to their first elements. The asterisk &lt;code&gt;*&lt;/code&gt; can be used to access array elements through pointer arithmetic or dereferencing. Understanding the equivalence between arrays and pointers is crucial for efficient data manipulation and memory access in C programming.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Variadic Functions:&lt;/strong&gt; Variadic functions, which accept a variable number of arguments, are prevalent in C programming. The asterisk &lt;code&gt;*&lt;/code&gt; is utilized within these functions to access additional arguments through a pointer to the argument list. Proper handling of variadic functions requires understanding the structure of the argument list and ensuring that arguments are retrieved and processed correctly.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Mastering the asterisk &lt;code&gt;*&lt;/code&gt; operator in C programming unlocks a wealth of capabilities, from efficient memory management and dynamic data structures to flexible function handling and precise arithmetic operations. By delving deep into its diverse applications and understanding its nuances, programmers can harness its power to write robust, efficient, and maintainable code.&lt;/p&gt;
</description>
        <pubDate>Thu, 23 May 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/asterisk-in-c/</guid>
      </item>
      <item>
        <title>The dilemma of first programming language to learn: resolved</title>
        <link>https://yeldar.org/blog/first-prog-lang/</link>
        <description>&lt;p&gt;I would like to share my experience of overcoming the challenge of choosing a first programming language to learn. This is a hurdle that many of us face when embarking on our programming journey. I hope my experience can shed some light on this common dilemma. When I first started learning to program, I felt overwhelmed by the multitude of languages and paths to choose from.&lt;/p&gt;
&lt;p&gt;My initial attempt at learning through a combination of paid and free courses did not yield the desired results. I experienced a degree of discouragement, but I was determined to identify the optimal path. I decided to pursue web development and enrolled in a comprehensive course covering HTML, CSS, and JavaScript. While it provided a solid foundation in web development, I yearned for a deeper understanding of the underlying principles of programming.&lt;/p&gt;
&lt;p&gt;This pursuit of deeper knowledge led me to self-study, where I explored JavaScript, HTML, and CSS through various open courses. However, it wasn&#39;t until I ventured into Ruby that I began to grasp the intricacies of programming on a more profound level. Ruby&#39;s elegant syntax and powerful features sparked my curiosity and propelled me further into the world of programming.&lt;/p&gt;
&lt;p&gt;After careful consideration, we have determined that Python, rather than Ruby, is the optimal choice for achieving my long-term goals. I have identified an online course on the fundamentals of programming in Python from the University of Helsinki that aligns with my needs. My mentor has approved this course and we have set a goal to complete part 12.&lt;/p&gt;
&lt;p&gt;In the course of our discussion, an interesting development occurred: my mentor suggested that I work on exercises in both Python and C. He believes that learning both languages will offer a more comprehensive understanding of programming.&lt;/p&gt;
&lt;p&gt;Thus, the proposed solution to the dilemma of choosing a first programming language is as follows: select a language and course that suits you. At this stage, it doesn’t matter whether the course is online or offline. Then, study this language in parallel with C. The learning process would look like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read the theory on your chosen programming language (language 1).&lt;/li&gt;
&lt;li&gt;Thoroughly review the course assignment.&lt;/li&gt;
&lt;li&gt;Complete the assignment in C.&lt;/li&gt;
&lt;li&gt;Complete the same assignment in language 1.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here’s why I believe this parallel approach can be highly beneficial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Studying two languages simultaneously allows you to see how different languages address the same problems, which can lead to a deeper understanding of programming concepts and principles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learning both Python and C in parallel can create a synergy where insights gained from one language enhance your understanding of the other. This can make complex concepts more accessible and intuitive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Engaging with both high-level (Python) and low-level (C) languages can help you better grasp abstract concepts and practical details, making it easier to tackle challenging programming tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The variety in tasks and approaches when learning two languages can keep the process dynamic and engaging, preventing monotony and maintaining motivation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Real-world programming often requires familiarity with multiple languages and technologies. By learning them in parallel, you prepare yourself for this reality, making you more versatile and adaptable.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach will help you gain a deeper understanding of fundamental programming concepts and see how these concepts are implemented at different levels of abstraction. This method has truly helped me not only to better understand programming but also to increase my confidence in my skills.&lt;/p&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fullstackopen.com/en/&quot;&gt;Full Stack Open&lt;/a&gt;, University of Helsinki;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.theodinproject.com/&quot;&gt;The Odin Project&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://leanpub.com/rubyisforfun/&quot;&gt;Ruby Is For Fun&lt;/a&gt; book;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://programming-24.mooc.fi/&quot;&gt;Python Programming MOOC 2024&lt;/a&gt; University of Helsinki.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 23 May 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/first-prog-lang/</guid>
      </item>
      <item>
        <title>Why does scanf require memory addresses while printf does not?</title>
        <link>https://yeldar.org/blog/scanf-vs-printf/</link>
        <description>&lt;p&gt;In C programming, the functions &lt;code&gt;scanf&lt;/code&gt; and &lt;code&gt;printf&lt;/code&gt; serve different purposes when it comes to input and output operations. One thing that sets them apart is how they handle variable arguments, especially in regard to memory addresses.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;scanf&lt;/code&gt; function is mainly used for input, where it reads data from the user and stores it in variables. So, to achieve this, &lt;code&gt;scanf&lt;/code&gt; requires the memory addresses (pointers) of the variables where the input values will be stored. This is because &lt;code&gt;scanf&lt;/code&gt; needs to know where in memory to write the input values that it reads from the user. By passing the memory address of a variable to &lt;code&gt;scanf&lt;/code&gt;, the function can directly write the user input to that memory location.&lt;/p&gt;
&lt;p&gt;On the other hand, the &lt;code&gt;printf&lt;/code&gt; function is used for outputting data to the console or to a file. Unlike &lt;code&gt;scanf&lt;/code&gt;, &lt;code&gt;printf&lt;/code&gt; doesn&#39;t need to modify the variables passed to it as arguments. It simply displays the values stored in those variables, so it doesn&#39;t require memory addresses as arguments because it doesn&#39;t need to write anything to those memory locations.&lt;/p&gt;
&lt;p&gt;It&#39;s really important for C programmers to understand the difference between passing a variable and passing its address. This helps them work with data in memory more effectively. When you explicitly specify the address of a variable in &lt;code&gt;scanf&lt;/code&gt;, it makes the code more reliable and secure. This prevents unintended data writes to memory.&lt;/p&gt;
&lt;p&gt;It&#39;s also really important to handle errors when using &lt;code&gt;scanf&lt;/code&gt;. If you don&#39;t, you might end up with issues like passing the wrong data type or the wrong variable address. It&#39;s really important for programmers to be aware of these potential pitfalls and to properly validate input to ensure the correctness and robustness of their code.&lt;/p&gt;
</description>
        <pubDate>Thu, 23 May 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/scanf-vs-printf/</guid>
      </item>
      <item>
        <title>Zero in C</title>
        <link>https://yeldar.org/blog/zero-in-c/</link>
        <description>&lt;p&gt;In the C programming language, the value &lt;code&gt;0&lt;/code&gt; holds special significance and is interpreted differently depending on the context:&lt;/p&gt;
&lt;p&gt;In conditional statements (such as &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, etc.), the value &lt;code&gt;0&lt;/code&gt; is interpreted as &amp;quot;false,&amp;quot; while any non-zero value is interpreted as &amp;quot;true.&amp;quot; For example, &lt;code&gt;if (0)&lt;/code&gt; will always evaluate to &amp;quot;false&amp;quot;, and the code block inside this statement will not be executed.&lt;/p&gt;
&lt;p&gt;C lacks a built-in boolean data type, as found in more &lt;em&gt;modern&lt;/em&gt; programming languages. Instead, integer values are used, where &lt;strong&gt;&lt;code&gt;0&lt;/code&gt; represents &amp;quot;false&amp;quot;&lt;/strong&gt; and &lt;code&gt;1&lt;/code&gt; (or any non-zero value) represents &amp;quot;true&amp;quot;. The C99 standard introduced the &lt;code&gt;_Bool&lt;/code&gt; type, along with the &lt;code&gt;&amp;lt;stdbool.h&amp;gt;&lt;/code&gt; header file, which allows using &lt;code&gt;bool&lt;/code&gt; as an alias for &lt;code&gt;_Bool&lt;/code&gt;, and &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;false&lt;/code&gt; as macros for &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt;, respectively.&lt;/p&gt;
&lt;p&gt;The value &lt;code&gt;0&lt;/code&gt; &lt;strong&gt;for pointers&lt;/strong&gt; is interpreted as a &amp;quot;null pointer,&amp;quot; indicating that the pointer does not point to any object in memory. The &lt;code&gt;NULL&lt;/code&gt; macro is typically used for this purpose in standard C libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In functions&lt;/strong&gt;, the value &lt;code&gt;0&lt;/code&gt; is often used as an indicator of successful completion. For instance, the &lt;code&gt;main&lt;/code&gt; function usually returns &lt;code&gt;0&lt;/code&gt; upon successful program termination. Standard C library functions also commonly return &lt;code&gt;0&lt;/code&gt; on success and a non-zero value on error.&lt;/p&gt;
&lt;p&gt;In an &lt;strong&gt;arithmetic context&lt;/strong&gt;, &lt;code&gt;0&lt;/code&gt; simply represents zero, a number without value. When added to any number, it does not change its value, and when multiplied by any number, it yields &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Understanding the context of zero usage helps avoid errors and improve code readability. It&#39;s important to be consistent and clearly define its value in each context to avoid misunderstandings and unexpected results.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://yeldar.org/blog/c-while/&quot;&gt;About While loop in C&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 23 May 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/zero-in-c/</guid>
      </item>
      <item>
        <title>Why does C have a while loop?</title>
        <link>https://yeldar.org/blog/c-while/</link>
        <description>&lt;p&gt;The C programming language is renowned for its efficiency, flexibility and control. One of the key constructs that contributes to these characteristics is the &lt;code&gt;while&lt;/code&gt; loop. But why does C have a while loop, and what makes it so important? In this article, we&#39;ll explore the various reasons and benefits of the &lt;code&gt;while&lt;/code&gt; loop in C.&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;condition&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// code to execute&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One of the main reasons why C includes the &lt;code&gt;while&lt;/code&gt; loop is to &lt;strong&gt;simplify repetitive tasks&lt;/strong&gt;. There are many situations in programming where a block of code needs to be executed several times. The &lt;code&gt;while&lt;/code&gt; loop provides an easy way of repeating a set of instructions until a particular condition is met. This eliminates the need to manually copy and paste code, thereby reducing errors and making the code more maintainable.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;while&lt;/code&gt; loop &lt;strong&gt;improves code readability&lt;/strong&gt; by clearly indicating the start and end of a repeating section of code. With a simple syntax, it makes it easier for developers to understand the flow of the program. For example, the condition within the &lt;code&gt;while&lt;/code&gt; statement explicitly shows when the loop will continue, making it intuitive for others to follow the logic.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;while&lt;/code&gt; loop in C &lt;strong&gt;provides flexibility&lt;/strong&gt; in specifying loop conditions. Unlike other loop constructs, the &lt;code&gt;while&lt;/code&gt; loop allows for conditions that can be checked before entering the loop. This is particularly useful in situations where the number of iterations is not known in advance. The loop continues to execute as long as the condition remains true, providing dynamic control over the flow of execution.&lt;/p&gt;
&lt;p&gt;Another reason C includes the &lt;code&gt;while&lt;/code&gt; loop is for &lt;strong&gt;better control over program flow&lt;/strong&gt;. The &lt;code&gt;while&lt;/code&gt; loop allows for easy integration of control statements such as &lt;code&gt;break&lt;/code&gt; and &lt;code&gt;continue&lt;/code&gt;, enabling precise management of how and when the loop should terminate or skip iterations. This control is crucial for writing robust and efficient programs.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;while&lt;/code&gt; loop is &lt;strong&gt;resource-efficient&lt;/strong&gt;, especially in scenarios where initialization and increment steps are not required. By focusing solely on the condition and the loop body, the &lt;code&gt;while&lt;/code&gt; loop can be more efficient in terms of both memory and processing power. This efficiency is vital for systems programming and applications where performance is a key concern.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;versatility&lt;/strong&gt; of the &lt;code&gt;while&lt;/code&gt; loop makes it suitable for a wide range of applications. From simple scripts to complex system software, the &lt;code&gt;while&lt;/code&gt; loop can be used to handle various tasks, such as waiting for user input, monitoring system states, and managing background processes. This versatility ensures that the &lt;code&gt;while&lt;/code&gt; loop remains a fundamental tool in the C programmer&#39;s toolkit.&lt;/p&gt;
&lt;p&gt;Finally, the &lt;code&gt;while&lt;/code&gt; loop aids in &lt;strong&gt;debugging and testing&lt;/strong&gt; by allowing specific sections of code to be executed repeatedly under controlled conditions. This repetitive execution helps in isolating and identifying bugs, as well as in testing the behavior of code under different scenarios. The simplicity and predictability of the &lt;code&gt;while&lt;/code&gt; loop make it an ideal construct for these purposes.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 May 2024 17:00:00 PDT</pubDate>
        <dc:creator>Yeldar Kudaibergen</dc:creator>
        <guid>https://yeldar.org/blog/c-while/</guid>
      </item>
  </channel>
</rss>