<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Meet Gandhi</title>
    <description>The latest articles on Forem by Meet Gandhi (@geniusmind9999).</description>
    <link>https://forem.com/geniusmind9999</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3581063%2Fff016f6b-facf-4a8d-be41-0d366d0ff97c.jpg</url>
      <title>Forem: Meet Gandhi</title>
      <link>https://forem.com/geniusmind9999</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/geniusmind9999"/>
    <language>en</language>
    <item>
      <title>Contributing to Ubuntu — Day 6: Getting my MR merged!</title>
      <dc:creator>Meet Gandhi</dc:creator>
      <pubDate>Mon, 02 Mar 2026 05:37:00 +0000</pubDate>
      <link>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-6-getting-my-mr-merged-4i9d</link>
      <guid>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-6-getting-my-mr-merged-4i9d</guid>
      <description>&lt;p&gt;I know I am consistently losing my consistency of writing posts but this one is worth your time, really ;)&lt;/p&gt;

&lt;p&gt;So guess what? My merge request was finally ACCEPTED! What does this mean? Oh even I have to figure out that part 😂 but it just means there is still hope for open source!&lt;/p&gt;

&lt;p&gt;So last time I had commented on a PR multiple times (like an annoying kid waiting for you to get frustrated 😂) and also got myself embarassed on the matrix chat several times. And what happened now is just the amplification…&lt;/p&gt;

&lt;p&gt;Yeah literally, at the end of the post you may feel it is different but not so much 😁&lt;/p&gt;

&lt;p&gt;Anyways, for starters, I pushed that small 1 line change into my fork and then according to the reply on matrix from a maintainer whose name I won’t be able to give on the blog but he really felt like an angel throughout this whole process! And hence I opened a merge request.&lt;/p&gt;

&lt;p&gt;Yeah like an actual merge request just for a one liner 🫣&lt;/p&gt;

&lt;p&gt;And something amazing about gitlab’s merge request is that it automatically shows that in the related PR so if you go to that PR, you will see a MR by me! But a few days went by and it felt like everyone is happy ignoring me, except I did not want the hapiness to last longer. So I commented… again. And guess what? there was no response this time either 😂&lt;/p&gt;

&lt;p&gt;So after some more days, this was my approach (yeah, could have been better but hey no judging me 😅).&lt;/p&gt;

&lt;p&gt;So someone (can’t name them without their permission 😅) first told that they are awaiting their PR to be reviewed which they opened just 4 hours ago and then there were some more 6–7 messages solving the issue by calling in the correct maintainer, informing them and blah blah. So I thought to myself if someone with a PR opened 4 hours can get their issue solved so quickly, it should not take much time for someone like me who is waiting for over a month now and so my hands typed this message (trust me, if my brain was totally active at that time, I would not be writing the message!!)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Actually I also opened a MR in the gnome characters app but I am not getting any reply 😅&lt;br&gt;&lt;br&gt;
It’s been a week and I have also added 2 comments in the issue.&lt;br&gt;&lt;br&gt;
Would be glad if someone looked into it, just a small one line change nothing huge 😅&lt;/p&gt;

&lt;p&gt;This is the link:&lt;br&gt;&lt;br&gt;
&lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/56" rel="noopener noreferrer"&gt;https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/56&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I really wrote this message humbly and meant no harm; but credits to my insane luck, it sounded a bit off when you switch perspectives 😵‍💫&lt;/p&gt;

&lt;p&gt;(Maybe my username is a problem? Does Genius_Mind sound too arrogant for a username?!)&lt;/p&gt;

&lt;p&gt;So these were the next 2 messages in chat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maintainer:&lt;/p&gt;

&lt;p&gt;Gentle reminder that we’re all volunteers, stretched thin, and that nobody is owed a review&lt;/p&gt;

&lt;p&gt;Me:&lt;/p&gt;

&lt;p&gt;I do agree, all of us do this in our free time but I just wanted to bring it into attention, did not mean anything else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And there’s something more to it, remember there was this maintainer I tagged a month ago when I did not make any changes but wanted to? Yeah, Then it was their turn to see these messages…&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maintainer:&lt;/p&gt;

&lt;p&gt;:Genius_Mind: reviewed the characters one; I was on a break at the time&lt;/p&gt;

&lt;p&gt;generally if you pinged me somewhere in january, please ping again because I guarantee I missed it&lt;/p&gt;

&lt;p&gt;I’ve been focusing on libadwaita stuff so far, since I’m being paid to do it but not characters, and since I was away for most of the january I kinda have to &lt;/p&gt;

&lt;p&gt;either way, landed your MR  —  thanks!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the &lt;strong&gt;:Genius_Mind&lt;/strong&gt; thing you see at the start is actually a tag to me its just how matrix does it (maybe element specifically but you get it)&lt;/p&gt;

&lt;p&gt;And according to this response from the maintainer, anyone who has a good level of communication would send the ideal message&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks a ton for closing the issue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But me being me, wrote something extra which was something I regretted later 🫣&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Me:&lt;/p&gt;

&lt;p&gt;Thanks a ton for closing the issue. I kinda got an idea that you were busy so I thought it would be best to wait. Anyways, this was it, thanks again!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And this is true, when I was looking for other issues in the characters app, I did see a comment in a PR mentioning this maintainer being on leave for sometime so I decided to stay silent for sometime.&lt;/p&gt;

&lt;p&gt;But maybe my wording was bad or its just my amazing luck striking again, this was their response:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maintainer:&lt;/p&gt;

&lt;p&gt;I was just on a break for mental health reasons, after that I was busy but still listening to pings — I just forgot to go through characters backlog, sorry&lt;/p&gt;

&lt;p&gt;Since I wa focusing on libadwaita instead&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🫣 Yeah… I think I could have had some control on my wording? Tone of a message just feels too important here, and unfortunately emoji's don't work I guess 😅&lt;/p&gt;

&lt;p&gt;I think you as a reader might also wish that I could undo the previous message 😂 but that's unfortunately out of my hands!&lt;/p&gt;

&lt;p&gt;But it does not end here, there’s another message I sent after this and I don’t know what to say about it, it just depends on what perspective you’re viewing it from…&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Me:&lt;/p&gt;

&lt;p&gt;I understand dw! No need for sorries 🙂&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One part of me is okay with this message while the other wants me to quit open source right away, just trying to the hang of being an open source contributor I guess? 😅&lt;/p&gt;

&lt;p&gt;But even after all this the biggest regret I have is this (all in one image):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m7kn1j2al4rh3zc4j14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m7kn1j2al4rh3zc4j14.png" alt="Gitlab merge request showing the maintainer replacing my one line code change with their own" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For someone who did not understand this, the maintainer understood my one line change and changed that one line change. So what I did was adding the version option after the constructor class, the maintainer moved it inside the constructor.&lt;/p&gt;

&lt;p&gt;Now this is a dilema cause when you have a one line change and the maintainer changes the location of the one line change in the code, it feels confusing whether I should call it my work or just another tuesday doing "collaboration" 😂. So I could ideally call this merge accepted but the contribution does not feel mine 😅.&lt;/p&gt;

&lt;p&gt;So I figured out everything from the flow to the code to even getting embarrased on element and yet got the merge request to complete but it just doesn’t feel like I have really earned it.&lt;/p&gt;

&lt;p&gt;So, I don’t know what I should call it but hey atleast I have an open source contribution! After all, I am looking forward to contributing to more issues on the characters app (or should I consider libadwaita now that the maintainer has mentioned it? I might get a job if I can convince them😜).&lt;/p&gt;

&lt;p&gt;But this MR merge taught me something new, it is not always your fault in communication, sometimes its just perspective that matters. And maybe this post might sound like me criticizing myself but that's important to keep me going cause according how much I know myself if I get satisfied in this MR, I am probably not gonna go further. But hey, celebration is also needed (and that was the opening 😂) and I do celebrate but more quietly instead of making a ton of noise!&lt;/p&gt;

&lt;p&gt;Also, this MR showed me how much a single maintainer has to juggle, I mean they are helping newcomers like me while having to do work that actually counts in their salary. Like amazing... literally!&lt;/p&gt;

&lt;p&gt;THANKS A LOT for reading till here and I really value your time, but if you are someone who has already gone through this, I would really like to know this in the comments. If possible please guide me or maybe just comment on how bad I am at something, I would appreciate that too 😁!&lt;/p&gt;

&lt;p&gt;Will keep you in the loop, byeee!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzd8vtbjw4ub7ib2pc4rf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzd8vtbjw4ub7ib2pc4rf.gif" alt="Bye GIF" width="200" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Credits: &lt;a href="https://tenor.com/view/ami-b%E1%BB%A5ng-b%E1%BB%B1-gif-4987291232759059685" rel="noopener noreferrer"&gt;https://tenor.com/view/ami-b%E1%BB%A5ng-b%E1%BB%B1-gif-4987291232759059685&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I also write on other platforms, if you like my blogs and are interested in keeping me motivated for writing more of these blogs you can just give a view to this same blog on the other two platforms 🙂&lt;/p&gt;

&lt;p&gt;Hashnode: &lt;a href="https://contributing-to-ubuntu.hashnode.dev/contributing-to-ubuntu-day-final" rel="noopener noreferrer"&gt;https://contributing-to-ubuntu.hashnode.dev/contributing-to-ubuntu-day-final&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Medium: &lt;a href="https://medium.com/p/88c12c4fe875" rel="noopener noreferrer"&gt;https://medium.com/p/88c12c4fe875&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Day 5: The Guidance arrives... Finally!</title>
      <dc:creator>Meet Gandhi</dc:creator>
      <pubDate>Fri, 06 Feb 2026 07:26:58 +0000</pubDate>
      <link>https://forem.com/geniusmind9999/day-5-the-guidance-arrives-finally-2bbf</link>
      <guid>https://forem.com/geniusmind9999/day-5-the-guidance-arrives-finally-2bbf</guid>
      <description>&lt;p&gt;Firstly, thanks for reading this and secondly I finally got the flow of GNOME Open Source Contributions!&lt;/p&gt;

&lt;p&gt;So after a long time of getting ignored by the maintainers (not saying the maintainers don’t pay attention but there’s a ton of new issues popping up in the app I am trying to contribute to 😅), I decided to try out something else in GNOME and by something else I mean some other issue or maybe another app altogether.&lt;/p&gt;

&lt;p&gt;Hence I started looking for more issues with the &lt;code&gt;newcomers&lt;/code&gt; tag but sadly there were none other than the one I made the fix for 🥲. So I did what anyone would not have done, I just closed the window and started focusing on other stuff, come on what else would you expect from a BTech CSE student getting ignored for straight 2 weeks 😂&lt;/p&gt;

&lt;p&gt;But then yesterday (5th Feb), I opened gitlab again and seeing nothing I lost hope again but… I opened a new tab and searched this &lt;em&gt;how does contributing to GNOME work??&lt;/em&gt; And then I got this &lt;a href="https://handbook.gnome.org/" rel="noopener noreferrer"&gt;link&lt;/a&gt; as the 4th result which changed everything, literally!&lt;/p&gt;

&lt;p&gt;This was the GNOME Project Handbook made for guiding any one be it a newcomer or a maintainer. And I don’t even qualify for a newcomer yet 😂 so I did what I do best, I just read the whole page before I came across this &lt;a href="https://welcome.gnome.org/" rel="noopener noreferrer"&gt;link&lt;/a&gt; which is the link for the GNOME Welcome page which is meant to specifically guide beginners. I wish I had found this earlier 😂🥲&lt;/p&gt;

&lt;p&gt;The welcome page had a good amount of information but my eyes dragged right on the matrix chat for newcomers. Yeah there is an actual chat on the matrix for newcomers! Which I got to know so late 🧐&lt;/p&gt;

&lt;p&gt;So me being me I instantly joined the chat and sent this message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi there, I am Meet and I am looking forward to contributing to GNOME. Where can I find some instructions on the flow of making a contribution? (something like first create a PR or tag a maintainer in a PR to get assigned and then something else and then the contribution is merged into the main repo)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And there were 2 maintainers online (yeah so glad 😌) and one of them then replied making a conversation a bit interesting. I asked about the flow of contribution in GNOME and it was totally different than what I expected! The flow goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Find an issue where you think you can help&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check if someone is not already working on it (you can figure this out if the issue is simple yet there have been no comments for more than 2-3 weeks about making a fix on it)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create your fix in your own fork of the GNOME app repository&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a Merge Request and put the issue link or number in the description (yeah GitLab is smart enough to link the MR and the PR!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There might be changes to your proposed fix, do those&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The maintainer will finally accept the merge request&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You have sucessfully contributed to GNOME, now go out enjoy and dance! 😂&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to step for a separate issue 🙃&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now after learning this I am ready to create a MR for the fix (which was a one liner waiting for almost a month now 🥲) which I will soon and let you guys know this in the upcoming blogs!&lt;/p&gt;

&lt;p&gt;But I also need some help from you dear reader, If you are motivated enough to read these blogs which are nothing more than my mood swings 😂 you might as well be ready to start your own blog series!! So just think about this for a minute or so, what if you started your own blog series on anything could be open source contributions, could be college related stuff or maybe even just a normal dev diary where you speak out loud on how you have been upskilling all these years and how you see your future self! Trust me it helps a lot more than it might sound 😂&lt;/p&gt;

&lt;p&gt;And if you do manage to start your own blog series I would definitely be a daily reader and I can promise that! Just put the link the comments and see your viewer count reach atleast 1 every time you write a blog!&lt;/p&gt;

&lt;p&gt;So now that I have learned from the professionals, its time to become atleast a newcomer in this open source world! I will be writing more so do keep reading, but for now byeee 👋&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.tenor.com%2Fm%2FvJexcUuMCv8AAAAC%2Fvazei-bye.gif%2520align%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.tenor.com%2Fm%2FvJexcUuMCv8AAAAC%2Fvazei-bye.gif%2520align%3D" alt="a little girl is going down a red slide" width="305" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Credits:&lt;/em&gt; &lt;a href="https://tenor.com/view/vazei-bye-leaving-goodbye-little-girl-gif-16362534" rel="noopener noreferrer"&gt;&lt;em&gt;Tenor&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Links to my blog on other platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Medium: &lt;a href="https://medium.com/@meetgandhi13062005/day-5-the-guidance-arrives-finally-c3352a8ab6ed" rel="noopener noreferrer"&gt;https://medium.com/@meetgandhi13062005/day-5-the-guidance-arrives-finally-c3352a8ab6ed&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hashnode: &lt;a href="https://contributing-to-ubuntu.hashnode.dev/day-5-the-guidance-arrives-finally" rel="noopener noreferrer"&gt;https://contributing-to-ubuntu.hashnode.dev/day-5-the-guidance-arrives-finally&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devjournal</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Contributing to Ubuntu — Day xyz: When I found the real open source</title>
      <dc:creator>Meet Gandhi</dc:creator>
      <pubDate>Tue, 27 Jan 2026 08:42:42 +0000</pubDate>
      <link>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-xyz-when-i-found-the-real-open-source-1bph</link>
      <guid>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-xyz-when-i-found-the-real-open-source-1bph</guid>
      <description>&lt;p&gt;Hello dear reader,&lt;/p&gt;

&lt;p&gt;I know you might be thinking that the title is a bit too dramatic, but what happened between today and the previous time I wrote is also similarly crazy 😂&lt;/p&gt;

&lt;p&gt;So, firstly I found an amazing issue on GitLab for GNOME, but as you might know, life is never a straight line for anyone 🥲 which obviously applies to me too. So I searched the web and also ChatGPT to look for ways to come up with the solution, it was difficult not because I was very new to GJS (yes, GNOME has its own version of JavaScript just to render things on your PC 🫠). So I first saw a bit of GJS documentation and it did not take me longer than an hour to realize the docs were almost useless, yeah I said it literally out loud when I was seeing the docs.&lt;/p&gt;

&lt;p&gt;The docs had the implementation part but that was not at all what I needed. So I turned to ChatGPT and it had performance issues if I put it in very simple words 😅. So I asked it to teach me GJS (which I do for almost all languages and frameworks whose docs overwhelm me, as a matter of fact, I learnt NextJS, Flutter and NodeJS from ChatGPT but polished it with docs and personal projects) and then it started listing facts about GJS, I knew learning from ChatGPT is a very iterative process of me explaining what I want and what I understood and &lt;strong&gt;hope&lt;/strong&gt; it just understands but this time ChatGPT decided to take a different route. It first told me the pros and cons of GJS, then why GNOME uses GJS, what I should do about it and a mixture of multiple “sorry” and “I apologise” messages that ChatGPT generally gives when either its training data is insufficient or my context is insufficient which is obvious, you cannot force a LLM to learn something not in its training data 😅 (though my friends have totally different arguments ready for this 😂).&lt;/p&gt;

&lt;p&gt;So then I started looking for help online again but using google search — “How does GJS start something“, “How do I write something in GJS“, “How to make my first app in GNOME Builder“, “What does GJS use in GNOME Builder“ and tons of similar questions of which none helped 😂 expectedly.&lt;/p&gt;

&lt;p&gt;So I just did what I could the best, I waited for 2 days for the reply of the comment I put in the issue. Yeah that was the only thing I could do then… 😅&lt;/p&gt;

&lt;p&gt;And guess what, I did not get a reply and hence I had to put in another message saying please read the first one 🙂, I mean come on that issue got a like after I put the comment, but not a reply 😓&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t9bl88ihom11p3zuacm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t9bl88ihom11p3zuacm.png" alt="GNOME GitLab Issue Screenshot" width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If someone wants to view the full issue, here it is: &lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/56" rel="noopener noreferrer"&gt;https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/56&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finding this issue was not so easy and finding the actual maintainers to tag was another battle in itself! But even after this, I’m waiting — and learning patience. Once I get clarity from maintainers, I’ll either move forward with this issue or pivot again.&lt;/p&gt;

&lt;p&gt;Also, I just started writing on the platform called Medium because a lot of my friends recommended me for a better reach, so just check it out if you do have time, not major difference in feelings just the text 😂&lt;/p&gt;

&lt;p&gt;So these are the two other places I have my series going on, if you do have sometime and want to help me just visit these blogs too but you've already helped me a ton by reaching till the end&lt;/p&gt;

&lt;p&gt;Hashnode: &lt;a href="https://contributing-to-ubuntu.hashnode.dev/day-xyz-when-i-found-the-real-open-source" rel="noopener noreferrer"&gt;https://contributing-to-ubuntu.hashnode.dev/day-xyz-when-i-found-the-real-open-source&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@meetgandhi13062005/contributing-to-ubuntu-day-xyz-when-i-found-the-real-open-source-56b3913dca4b" rel="noopener noreferrer"&gt;https://medium.com/@meetgandhi13062005/contributing-to-ubuntu-day-xyz-when-i-found-the-real-open-source-56b3913dca4b&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s open source, I guess 🙂&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftenor.com%2Fsearch%2Fbye-bye-gifs" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftenor.com%2Fsearch%2Fbye-bye-gifs" alt="Bye Bye GIF" width="" height=""&gt;&lt;/a&gt;&lt;br&gt;
Credits: &lt;a href="https://tenor.com/search/bye-bye-gifs" rel="noopener noreferrer"&gt;Tenor&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Contributing to Ubuntu — Day 3: When I didn't touch code</title>
      <dc:creator>Meet Gandhi</dc:creator>
      <pubDate>Wed, 17 Dec 2025 10:24:25 +0000</pubDate>
      <link>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-3-when-i-didnt-touch-code-202c</link>
      <guid>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-3-when-i-didnt-touch-code-202c</guid>
      <description>&lt;p&gt;Okay so first of all — thanks a lot for reading this.&lt;br&gt;
Probably you are expecting me to do something with the &lt;code&gt;sl&lt;/code&gt; command, according to what I promised last time...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the next post, I’ll finally start modifying the train — maybe make it rainbow-colored or emoji-powered 🚂&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, I flipped 😅&lt;/p&gt;

&lt;p&gt;So this time I was away from code since my excitement to explore made me wander in the Ubuntu and GNOME community — Matrix chats, GitLab issues and discussions — which made me realize that code is just half the game, the other half is community interaction!&lt;/p&gt;

&lt;h2&gt;
  
  
  The silence:
&lt;/h2&gt;

&lt;p&gt;This exam week felt longer than it actually was, I mean time went a bit too slow for me.&lt;/p&gt;

&lt;p&gt;So I had 7 exams this semester and almost every exam went in a &lt;em&gt;not-so-good&lt;/em&gt; way 😅&lt;br&gt;
I studied hard starting from 2 days before the exams and during the exams. I also watched a movie the evening my last exam finished 😆. And finally I am back to my routine of exploring Ubuntu and documenting it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Work in the silence:
&lt;/h2&gt;

&lt;p&gt;During this period of silence where I did not write blogs and my exams weren't there (yeah, my exams finished just a week ago but I am also talking about the few days before the exam 🫠), I did not sit idle — I went to Google, ChatGPT and GitHub to look for what the Ubuntu community does and how they do it. So I searched about their contribution flow, it is fairly simple but yet difficult to wrap my head around since I never saw such a flow before 😅.&lt;br&gt;
I haven't understood everything and I know it (and you'll know it too when you read below 😅), but please feel free to correct me in the comments!&lt;br&gt;
The general flow goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You go to GitHub and clone their repo&lt;/li&gt;
&lt;li&gt;You first create an issue stating the problem or bug or whatever you found and add a comment saying "Please assign this issue to me" (not so sure on how you convince the maintainer though 😅)&lt;/li&gt;
&lt;li&gt;You wait for the maintainer to assign the issue to you&lt;/li&gt;
&lt;li&gt;When the issue is assigned to you, you start working on the fix&lt;/li&gt;
&lt;li&gt;First you discuss about the fix in the issue comment&lt;/li&gt;
&lt;li&gt;There will be some response from the community, when that happens, you iterate and ideate&lt;/li&gt;
&lt;li&gt;Once everyone agrees that you have a good idea, you implement it and push it in a new branch&lt;/li&gt;
&lt;li&gt;Once pushed, create a pr (pull request) and attach the pr link in the issue comment&lt;/li&gt;
&lt;li&gt;Let the community check your code, wait for testing to happen and improve on feedback&lt;/li&gt;
&lt;li&gt;That's it, once they finish their testing, they will merge the pr themselves (maybe, I have yet to figure this out since online sources don't tell me exactly this 😅)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So now you have an open source contribution in your name! And that too merged! But as usual there's a ton of pitfalls 🥲&lt;br&gt;
Firstly, if your issue is too big it might not even get accepted, leave alone getting assigned to you. So yeah I cannot directly open a pr saying 'Redesign the emoji picker', they'll just close the pr as if nothing happened!&lt;br&gt;
Secondly, this flow is approximately the general flow, it differs from project to project 🥲 — confusing, I know it, but helps get somewhere at least.&lt;br&gt;
So according to the online sources and some ChatGPT help I found that I should contribute to smaller issues and the community actually helps with those, there's issues with tags and for beginners like me, the 'good-first-issue' tag works great since it lets me contribute as well as gets me introduced to the community!&lt;/p&gt;

&lt;p&gt;So reading Ubuntu's docs, I found Matrix&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lhqq8kz34dcc8aa67kp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lhqq8kz34dcc8aa67kp.gif" alt="The matrix movie GIF" width="500" height="206"&gt;&lt;/a&gt;&lt;br&gt;
&lt;small&gt;Credits: &lt;a href="https://media.giphy.com/media/v1.Y2lkPWVjZjA1ZTQ3czduNzhpajJtejliMXZnZnQ0NWl2YmJldDhyemg4M2x1ejNtNzF2byZlcD12MV9naWZzX3JlbGF0ZWQmY3Q9Zw/ip5L71rU6sjcc/giphy.gif" rel="noopener noreferrer"&gt;giphy&lt;/a&gt;&lt;/small&gt;&lt;br&gt;
Not this one though 😂. Matrix is a platform which I found similar to discord but the only difference is that the Ubuntu community uses that (couldn't find more 😅).&lt;br&gt;
So as a newcomer who was very anxious, I stared at the chat for straight 30 minutes just thinking what should be my first message. Finally I thought about this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hello everyone! I’m Meet, and I’m very new to open source contributions. I came across a couple of “good first issues” in the Open Documentation Academy repo, but I’m not fully sure how to get started with them.&lt;/p&gt;

&lt;p&gt;Could someone guide me on which one might be more suitable for a beginner, or how I should begin exploring them?&lt;/p&gt;

&lt;p&gt;These are the issues I found:&lt;br&gt;
&lt;a href="https://github.com/canonical/open-documentation-academy/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22%20no%3Aassignee" rel="noopener noreferrer"&gt;https://github.com/canonical/open-documentation-academy/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22%20no%3Aassignee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And after this I waited for a day or so until someone really replied! And just by seeing the notification I got too overjoyed 😅&lt;br&gt;
So the reply was what you'd expect, they pointed out an issue saying this is something good you can try, but it really felt amazing to me at that moment 😁&lt;/p&gt;

&lt;p&gt;This was 2 days before my first exam though 🙂 — I just got a bit toooo bored I guess 😅&lt;/p&gt;

&lt;p&gt;But after my exams finished I explored the contribution related to that emoji picker (which, unfortunately for me, is a lot better in Ubuntu version 24 than it was in version 22) and I found that GNOME is actually the UI engine that runs in Ubuntu. I also found that the name &lt;em&gt;"Emoji Picker"&lt;/em&gt; that I been calling it is actually an app called the &lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters" rel="noopener noreferrer"&gt;Characters App&lt;/a&gt; and it handles all this. So I thought for a bit and then created an account in GitLab, had the tokens and everything setup and cloned the repo in GNOME Builder app (which is pre-installed in Ubuntu just like the Characters App).&lt;/p&gt;

&lt;p&gt;After cloning, I went to GitLab and saw the open issues and started scanning the issue titles. I found two issues which I thought I could contribute to &lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/175" rel="noopener noreferrer"&gt;first issue&lt;/a&gt; and &lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/151" rel="noopener noreferrer"&gt;second issue&lt;/a&gt;. Then I searched for tags (searching how to search via tags was a different battle in itself for me 😅) and found &lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/56" rel="noopener noreferrer"&gt;this&lt;/a&gt; issue where newcomers could join in.&lt;br&gt;
So I decided to go with the &lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/151" rel="noopener noreferrer"&gt;second issue&lt;/a&gt; 🤓. I commented in the issue saying that this bug does not exist in my system — except, I did not give any system specs 😅. But surprisingly, the issue had another comment in 2 days saying it is still glitchy in some other machine (and this guy gave specs). So because of me an issue that was inactive since 2 months finally started to have a conversation going on.&lt;br&gt;
The chat went on for 3-4 days, not a long one though, and the issue was first closed and then reopened because they found a bug! And yeah, I am thinking of contributing to fixing that bug...&lt;br&gt;
Just after doing the "&lt;a href="https://gitlab.gnome.org/GNOME/gnome-characters/-/issues/56" rel="noopener noreferrer"&gt;this&lt;/a&gt;" contribution 😅&lt;/p&gt;

&lt;p&gt;So finally I am a bit confident about my step of going into the open-source world of GNOME and Ubuntu but I am just as anxious 😅&lt;br&gt;
Can't wait to see what's next though 😁&lt;/p&gt;

&lt;h2&gt;
  
  
  What this taught me
&lt;/h2&gt;

&lt;p&gt;This experience taught me something better, sometimes there are a lot of things which cannot happen without people collaborating and talking on it or maybe even arguing if necessary and I hope to be a part of at least one argument 😁 (even if just once).&lt;br&gt;
Not touching code taught me a lot of human perspective in the open-source world now let's see what touching code can teach me 😂&lt;br&gt;
But anyone who is reading this maybe for starting from scratch like me, I just want to tell you, it is better to understand the community before we can begin to understand the Kernel 🙂&lt;/p&gt;

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

&lt;p&gt;Thanks a ton for the time mate! I really appreciate you came until here, stay tuned till the next time where I might code and even help with some issues! Super excited yet somehow nervous 😁&lt;br&gt;
Just love the open-source vibes!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9dvwt0lkreuk3xpdnhd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9dvwt0lkreuk3xpdnhd.gif" alt="Its all about the vibes - Simpsons Bart GIF" width="498" height="373"&gt;&lt;/a&gt;&lt;br&gt;
&lt;small&gt;Credits: &lt;a href="https://media1.tenor.com/m/1CcXIDK6YboAAAAC/the-simpsons-bart.gif" rel="noopener noreferrer"&gt;tenor&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devjournal</category>
      <category>ubuntu</category>
      <category>community</category>
    </item>
    <item>
      <title>Contributing to Ubuntu — Day 2.5: When I had to pause my journey ⏸️</title>
      <dc:creator>Meet Gandhi</dc:creator>
      <pubDate>Mon, 10 Nov 2025 06:31:52 +0000</pubDate>
      <link>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-25-when-i-had-to-pause-my-journey-55b</link>
      <guid>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-25-when-i-had-to-pause-my-journey-55b</guid>
      <description>&lt;p&gt;Hello people! I know you would want to hit me hard in the face for not writing a blog for a week (I know I am not that important but I can always pretend so 😁) but I will be as honest I can in this one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What happened to my excitement?
&lt;/h2&gt;

&lt;p&gt;My excitement is at its place but my end semester exams are coming close. Due to them I have to slow down my blogs a bit and also sacrifice my ubuntu exploration 🥲. So just like any good engineering student, I also over burdened myself with a ton of heavy courses this semester along with a number of other side activities (yeah, I also wanted to type the word &lt;strong&gt;side-kick&lt;/strong&gt; here 😂). So now if I do not get to studying, the examiners in the exam hall will laugh looking at my blank answer shit (that is not a typo!).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71s05oqofuwmrcwt3wyq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71s05oqofuwmrcwt3wyq.png" alt="Mr. Bean trying to not look at the questions but looks and gets frustrated" width="220" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I want to geniuinely continue this exploration as I have recently fallen in love — with &lt;strong&gt;Operating Systems&lt;/strong&gt; 🙃 and I do plan to change my career in that direction. So you'd say, what is the worst you could have done in your life that you have to give up your passion right? I thought the same a month ago 🫠&lt;/p&gt;




&lt;h2&gt;
  
  
  Why should passion suffer?
&lt;/h2&gt;

&lt;p&gt;So the dumbest thing I can do to help my future self is take a course so tough it literally questions my existence!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8ugpdaatrft5ni0pyjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8ugpdaatrft5ni0pyjo.png" alt="Me recalling my self taking some courses just for fun and crying" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Currently, in my third year, I’ve somehow managed to stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;9 college courses ☠️,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An internship (yes, it pays 😎),&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IEEE student branch work,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and a programming club role&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So yeah... I probably shouldn’t have started this blog series with that much on my plate. But honestly? I’m glad I did. Because even if I had to pause at Day 2 — I know I’ll be back after 7th December (post-exams 🫠).&lt;/p&gt;




&lt;h2&gt;
  
  
  What are my plans next?
&lt;/h2&gt;

&lt;p&gt;So my next plans are a change of mind, I think tinkering with the &lt;code&gt;sl&lt;/code&gt; command might teach me something new but the journey feels a bit slow to me. So maybe I will make some small changes and get to exploring how to package this command into a &lt;code&gt;.deb&lt;/code&gt; which is I think a good achievement. After I finish that, I am planning to create a new issue on ubuntu for their emoji menu looking so bad. If the maintainer is in a good mood I may get assigned or my issue might get deleted 😶‍🌫️. In that case... I will create another issue! No issues from my side 😂&lt;/p&gt;

&lt;p&gt;And for the long term plans, I was thinking of understanding the internals of ubuntu, like how memory management and all works but I know my interests will change (can't blame me, I am a Gemini 😅 — not Google Gemini, my zodiac sign in Gemini) but those interest changes will be local, in a global view I would like to pursue a career in OS development or System Design since both are my favourites!&lt;/p&gt;

&lt;p&gt;And also, you may see some delay in blogs in december since I will be going out for a vacation! So yeah, I have asked for a leave officially and you have to approve it (please 😅).&lt;/p&gt;




&lt;h2&gt;
  
  
  Now what?
&lt;/h2&gt;

&lt;p&gt;Now what, nothing, go back to work while I go back to studying, we don't have much time to spare remember? Or atleast I do not 🙃 So hang in tight, since everytime I remember this blog series, I get an adrenaline rush and I promise myself that I have to make the ubuntu emoji picker the best one yet!!&lt;/p&gt;

&lt;p&gt;In case, you have any interesting idea, please let me know in the comments and if you are as crazy as me I would even try that out!&lt;/p&gt;

&lt;p&gt;Thanks for reading through! Sayonara!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabeupcy70664npjbz1ql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabeupcy70664npjbz1ql.png" alt="a picture of a minion holding a teddy bear and a mouse with the words bye-bye below him" width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>studentlife</category>
      <category>osdev</category>
    </item>
    <item>
      <title>Contributing to Ubuntu — Day 2: When I understood the Train 🚂</title>
      <dc:creator>Meet Gandhi</dc:creator>
      <pubDate>Mon, 27 Oct 2025 10:33:50 +0000</pubDate>
      <link>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-2-when-i-understood-the-train-23cn</link>
      <guid>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-2-when-i-understood-the-train-23cn</guid>
      <description>&lt;p&gt;Welcome back to Day 2 of my Ubuntu contribution journey!&lt;br&gt;
This time, I went deep into the source code of the legendary &lt;code&gt;sl&lt;/code&gt; command — the tiny train that runs across your terminal when you mistype &lt;code&gt;ls&lt;/code&gt;. 🚂&lt;br&gt;
I learned way more than I expected: about C pointers, terminal control, static memory, and even the ancient magic of the curses library. And yes — I broke my terminal once or twice while doing it 😅&lt;/p&gt;
&lt;h2&gt;
  
  
  The Background:
&lt;/h2&gt;

&lt;p&gt;Last time I installed the sl package and its source code but did not get time to dive deep into it, but this time I have explored the source code and am too excited to share my findings with you!&lt;/p&gt;
&lt;h2&gt;
  
  
  The Journey:
&lt;/h2&gt;

&lt;p&gt;So first of all, let me be totally clear here — I haven't used ChatGPT a single time in this whole journey (even I cannot believe that, but it is what it is 😂)&lt;br&gt;
I went through code in the pretty unstructured way which is very hard to explain, but here goes nothing:&lt;/p&gt;
&lt;h2&gt;
  
  
  The function exploration:
&lt;/h2&gt;

&lt;p&gt;Firstly, I saw what all functions are defined&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void add_smoke(int y, int x);
void add_man(int y, int x);
int add_C51(int x);
int add_D51(int x);
int add_sl(int x);
void option(char *str);
int my_mvaddstr(int y, int x, char *str);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And of course, the main function is always there!&lt;/p&gt;

&lt;h2&gt;
  
  
  The main() boss:
&lt;/h2&gt;

&lt;p&gt;Now, I saw the main function in detail and got my first discovery&lt;br&gt;
This is a small part of the main function, If you know C very well it might not be obvious what I found, if not you'll learn something new as well!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    for (i = 1; i &amp;lt; argc; ++i) {
        printf("index: %d, current char: %s\n", i, argv[i]); // Added by me
        if (*argv[i] == '-') {
            printf("in if: '%s'\n", argv[i] + 1); // Added by me
            option(argv[i] + 1);
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See this tiny snippet here? This has 2 C secrets (at least they were secrets for me 😜).&lt;br&gt;
First one is that here argv is and array of pointers each pointing to a string (the command line arguments) defined by &lt;code&gt;char *argv[]&lt;/code&gt;. Hence doing &lt;code&gt;argv[i]&lt;/code&gt; gives the pointer to the string.&lt;br&gt;
Now comes the &lt;em&gt;real part&lt;/em&gt;, read carefully&lt;br&gt;
doing &lt;code&gt;argv[i] + 1&lt;/code&gt; removes the first character from the string! If you knew that, tell me in the comments "You did not surprise me 😁" but if I did surprise you, I know what you'll be doing next! You might be tempted to Google or ask ChatGPT and ask what all the features of this? So instead of you working through this, let me help open this suspense for you!&lt;br&gt;
So if you do &lt;code&gt;argv[i] + n&lt;/code&gt; for a number &lt;code&gt;n&lt;/code&gt; where &lt;code&gt;n &amp;lt; strlen(argv[i])&lt;/code&gt; then it skips those many characters in the string&lt;br&gt;
For a better understanding, see this diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkihj0flxip9ilkn0i3e5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkihj0flxip9ilkn0i3e5.png" alt="This image shows the initial string with the pointer at position 0 and the final string with the pointer incremented by 1, the observation is that the pointer incrementation just makes the pointer point to the second character and the printf function assumes the string as the characters from this memory address to the memory address where the content is the special null terminator character '\0'" width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was a very new concept for me especially since I am used to python, javascript, java, etc. hence for a minute it felt like magic until I discovered what is in the diagram. I used the &lt;code&gt;printf&lt;/code&gt; function calls to figure out exactly how this went about and after around 30 minutes of tinkering around, I got this solution and I have never been so happy learning this.&lt;/p&gt;
&lt;h2&gt;
  
  
  The great curse 🫥:
&lt;/h2&gt;

&lt;p&gt;Now, if you have been programming in C for some time, you will know the curses library but I was new and did not see it coming. Initially I thought that the curses library should be some kind of a joke library because the first things that seemed &lt;strong&gt;extra-ordinary&lt;/strong&gt; were the constants like &lt;code&gt;ERR&lt;/code&gt;, &lt;code&gt;OK&lt;/code&gt;, &lt;code&gt;TRUE&lt;/code&gt; and &lt;code&gt;FALSE&lt;/code&gt; and thanks to VSCode I was able to see what their values are without having to open the header file. So I just ignored it at the start but that was a small mistake (yeah, not a huge mistake, no exaggeration, we are programmers not writers 😂). So after this option function was over, I saw the next few lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    initscr();
    noecho();
    if (INTR == 0) {
        signal(SIGINT, SIG_IGN);
    }
    // endwin();
    // return 0;
    curs_set(0);
    nodelay(stdscr, TRUE);
    leaveok(stdscr, TRUE);
    scrollok(stdscr, FALSE);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, after seeing this, any normal human being should go begging for some help online... excecpt me 🙂&lt;br&gt;
I tinkered the code a bit to see what this does (since my VSCode could not load up the documentation for the functions 🤷)&lt;br&gt;
This was my perfectly failing first approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    initscr();
    endwin();
    return;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yeah, that is another mistake, bigger than the last one 🥴&lt;br&gt;
So after I compiled the code and ran it, I did not find anything wrong happenning, I mean the code executed without doing anything as expected, no logs, no nothing — and it happened...&lt;br&gt;
My terminal went to the next line but did not let me type anything! For a second I just panicked, did my computer freeze? What did I do wrong? Will my ubuntu become corrupt again? Shall I restart my computer?&lt;br&gt;
But then I just opened a new tab in the shell window and closed the previous one, problem solved 😵&lt;br&gt;
So then I thought why this must be a problem, I mean the main function as a whole also ends with the &lt;code&gt;endwin()&lt;/code&gt; function and starts with the &lt;code&gt;initscr()&lt;/code&gt; function, then after 2-3 more runs and 2-3 more terminals I tried this solution which did work!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    initscr();
    if (INTR == 0) {
        signal(SIGINT, SIG_IGN);
    }
    endwin();
    return;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This worked perfectly (at least I was able to type in the terminal after its execution 😂), then I inspected this code closely, the if statement does a very clever thing, if you press &lt;code&gt;Ctrl + C&lt;/code&gt; during the execution of the sl command, it won't stop 💀&lt;br&gt;
So after doing this I figured, the &lt;code&gt;initscr()&lt;/code&gt; function might be doing something in parallel hence it needs some small delay to set everything up before the &lt;code&gt;endwin()&lt;/code&gt; function destroys that.&lt;br&gt;
So now, I had a program which just executed, no errors, no logs, nothing! Just silence!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffd0xckzgq5yhw4t5yg61.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffd0xckzgq5yhw4t5yg61.gif" alt="Awkward Silence GIF" width="498" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So then I understood what the curses library did! It was not a joke library but it is used to get advanced control on the terminal of any system, it can change colors, animate things, listen for scroll or touch events which do seem impossible but according to my single google search it is possible 😄&lt;/p&gt;
&lt;h2&gt;
  
  
  The train finally appears 🥹!
&lt;/h2&gt;

&lt;p&gt;Okay, so far so good! Now what, I wanted to see the 🚂 so I just tinkered the code again!&lt;br&gt;
I now knew that functions I don't understand will definitely be from curses so I ain't touching those 😂&lt;br&gt;
So I did what normal people nowadays don't do, I read the code alound in my head line by line and the for loop seemed a bit fishy&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    for (x = COLS - 1; ; --x) {
        if (LOGO == 1) {
            if (add_sl(x) == ERR) break;
        }
        else if (C51 == 1) {
            if (add_C51(x) == ERR) break;
        }
        else {
            if (add_D51(x) == ERR) break;
        }
        getch();
        refresh();
        usleep(40000);
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'd say &lt;em&gt;What is so fishy in here meet?&lt;/em&gt; but look at those three functions at the end, I mean I do understand why usleep is there (without it, the train would move at 99.99% light speed 😂) and even refresh makes sense (literally the only curses function which made sense by just looking at it 🥺) buuut what is &lt;code&gt;getch&lt;/code&gt; doing here? I mean is that not used to get character inputs in C?&lt;br&gt;
If you thought the same, let me tell you that this function here is a member of the curses gang and should not be trusted at all! Hence I did exactly what I just said, did not trust the function and skipped it 🫠&lt;br&gt;
Now, generally we programmers use &lt;code&gt;if&lt;/code&gt; statements to eliminate things right? (At least I do) but here, there is a function inside! So, I commented everything and wrote a better code snippet myself 😁&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    add_D51(((COLS - (COLS % 2))/2) + 2);
    getch();
    refresh();
    usleep(4000000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, I literally replaced the whole for loop with these 4 lines 😇&lt;br&gt;
Notice how I kept the delay in the usleep so large? I wanted to see the details in the train and that actually came very handy later on. But before I show you the output, &lt;code&gt;((COLS - (COLS % 2))/2) + 2&lt;/code&gt; this complex looking formula actually calculates the middle column in the terminal and passes it the to the &lt;code&gt;add_D51&lt;/code&gt; function to draw the train.&lt;br&gt;
Output with this new 4 line code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsj9ew9fr9t0biaq2qqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsj9ew9fr9t0biaq2qqj.png" alt="The train drawn by the sl command stuck in place starting at around the middle directed from right to left" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And yes, this train does stay in this same position for 1 second, and you can make it stay longer (10 seconds) by adding another '0' to the &lt;code&gt;4000000&lt;/code&gt; microsecond delay I have given!&lt;/p&gt;
&lt;h2&gt;
  
  
  The genius of &lt;code&gt;add_D51()&lt;/code&gt;!
&lt;/h2&gt;

&lt;p&gt;Now, my curiosity got hold of me and took me straight to the &lt;code&gt;add_D51&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
int add_D51(int x)
{
    static char *d51[D51PATTERNS][D51HIGHT + 1]
        = {{D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7,
            D51WHL11, D51WHL12, D51WHL13, D51DEL},
           {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7,
            D51WHL21, D51WHL22, D51WHL23, D51DEL},
           {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7,
            D51WHL31, D51WHL32, D51WHL33, D51DEL},
           {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7,
            D51WHL41, D51WHL42, D51WHL43, D51DEL},
           {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7,
            D51WHL51, D51WHL52, D51WHL53, D51DEL},
           {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7,
            D51WHL61, D51WHL62, D51WHL63, D51DEL}};
    static char *coal[D51HIGHT + 1]
        = {COAL01, COAL02, COAL03, COAL04, COAL05,
           COAL06, COAL07, COAL08, COAL09, COAL10, COALDEL};

    int y, i, dy = 0;

    if (x &amp;lt; - D51LENGTH)  return ERR;
    y = LINES / 2 - 5;

    if (FLY == 1) {
        y = (x / 7) + LINES - (COLS / 7) - D51HIGHT;
        dy = 1;
    }
    for (i = 0; i &amp;lt;= D51HIGHT; ++i) {
        my_mvaddstr(y + i, x, d51[(D51LENGTH + x) % D51PATTERNS][i]);
        my_mvaddstr(y + i + dy, x + 53, coal[i]);
    }
    if (ACCIDENT == 1) {
        add_man(y + 2, x + 43);
        add_man(y + 2, x + 47);
    }
    add_smoke(y - 1, x + D51FUNNEL);
    return OK;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now just like you might feel a bit overwhelmed, but don't you worry, I got you! This function uses a really powerful feature of C which resides in the &lt;code&gt;static&lt;/code&gt; keyword which allows a function to retain its value on every subsequent call after the first one! Cool right? New for me too 😁&lt;br&gt;
So this function here is built by a very intelligent human being and I will tell you why I am telling so ahead. Firstly, don't look at anything other than these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    int y, i, dy = 0;

    if (x &amp;lt; - D51LENGTH)  return ERR;
    y = LINES / 2 - 5;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the if condition checks if the train goes out of the terminal screen or not and then &lt;code&gt;y&lt;/code&gt; is calculated but here notice that &lt;code&gt;y&lt;/code&gt; is the same every time since &lt;code&gt;LINES&lt;/code&gt; is a constant, but this is necessary for the flying train feature!&lt;br&gt;
And finally this legendary 4 line for loop (yeah, I removed for loop for 4 lines, now the for loop consists of 4 lines, good change 😜):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    for (i = 0; i &amp;lt;= D51HIGHT; ++i) {
        my_mvaddstr(y + i, x, d51[(D51LENGTH + x) % D51PATTERNS][i]);
        my_mvaddstr(y + i + dy, x + 53, coal[i]);
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So here, the &lt;code&gt;my_myaddstr&lt;/code&gt; function adds this given string to the x and y coordinates and this is where the true genius of the programmer comes! Instead of writing 6 if statements to decide which train instance should be placed, the programmer creates an array &lt;code&gt;d51&lt;/code&gt; which consists of 6 arrays each with a different combination of the train, so then when he wants to decide the instance, he just indexes the array for the correct instance using the modulus operation and then one by one puts the whole string collection on the screen.&lt;br&gt;
Frankly speaking, the first time I realized his trick I got so amazed and excited I was ready to share this with all of you but then I did not realize he had more tricks up his sleeve 🥲&lt;br&gt;
So similar to how the first &lt;code&gt;my_addstr&lt;/code&gt; function call writes the main train to the screen, the second call writes the coal cell of the train but here as well, look at the &lt;code&gt;+53&lt;/code&gt; operation, this is done so that the extra space in every line does not get seen and you know why there is an extra trailing space for each line? So that the next time when the train is the drawn, any older characters written get erased!&lt;/p&gt;
&lt;h2&gt;
  
  
  Where's my smoke?
&lt;/h2&gt;

&lt;p&gt;And just after this for loop is the add_smoke function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void add_smoke(int y, int x)
#define SMOKEPTNS        16
{
    static struct smokes {
        int y, x;
        int ptrn, kind;
    } S[1000];
    static int sum = 0;
    static char *Smoke[2][SMOKEPTNS]
        = {{"(   )", "(    )", "(    )", "(   )", "(  )",
            "(  )" , "( )"   , "( )"   , "()"   , "()"  ,
            "O"    , "O"     , "O"     , "O"    , "O"   ,
            " "                                          },
           {"(@@@)", "(@@@@)", "(@@@@)", "(@@@)", "(@@)",
            "(@@)" , "(@)"   , "(@)"   , "@@"   , "@@"  ,
            "@"    , "@"     , "@"     , "@"    , "@"   ,
            " "                                          }};
    static char *Eraser[SMOKEPTNS]
        =  {"     ", "      ", "      ", "     ", "    ",
            "    " , "   "   , "   "   , "  "   , "  "  ,
            " "    , " "     , " "     , " "    , " "   ,
            " "                                          };
    static int dy[SMOKEPTNS] = { 2,  1, 1, 1, 0, 0, 0, 0, 0, 0,
                                 0,  0, 0, 0, 0, 0             };
    static int dx[SMOKEPTNS] = {-2, -1, 0, 1, 1, 1, 1, 1, 2, 2,
                                 2,  2, 2, 3, 3, 3             };
    int i;

    if (x % 4 == 0) {
        for (i = 0; i &amp;lt; sum; ++i) {
            my_mvaddstr(S[i].y, S[i].x, Eraser[S[i].ptrn]);
            S[i].y    -= dy[S[i].ptrn];
            S[i].x    += dx[S[i].ptrn];
            S[i].ptrn += (S[i].ptrn &amp;lt; SMOKEPTNS - 1) ? 1 : 0;
            my_mvaddstr(S[i].y, S[i].x, Smoke[S[i].kind][S[i].ptrn]);
        }
        my_mvaddstr(y, x, Smoke[sum % 2][0]);
        S[sum].y = y;    S[sum].x = x;
        S[sum].ptrn = 0; S[sum].kind = sum % 2;
        sum ++;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now this function is as well just another crazy function which decides how to smoke looks like and at which level it resides every 4 writes (that is the use of the static variable &lt;code&gt;x&lt;/code&gt;) hence if you see the screen shot of my train halted you won't see so much smoke while the actual &lt;code&gt;sl&lt;/code&gt; command has a whole line of smoke. Now this function has a much much more consise implementation but a similar genius behind it!&lt;br&gt;
In the if statement inside the for loop (not of 4 lines this time 😂) see that every some character until now is first erased and then redrawn according to the defined arrays, but a small and easy to miss thing is there, let's see if you can find it!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If it redraws every character to the right, how do we not see a smoke trail till the end in the output of the sl command? The smoke trail should not stop the end of the train but go till the end of the terminal?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you think you have a solution, comment it down! I would love to hear it, no judging I promise 😁&lt;br&gt;
So the real answer is the use of a space in every array, look at the declarations of the Smoke and Eraser variables, each array has a single space &lt;code&gt;' '&lt;/code&gt; as its last element, this means that after some point, there is a smoke trail but the trail is made of spaces and not readable characters!&lt;br&gt;
Now, if you were paying attention, you'd ask &lt;em&gt;Hey meet, you said that the smoke trail stops at some point, but for that we have to define that ghost point right? The code ain't gonna do it for itself!&lt;/em&gt; and I'd say you have a really valid question but the answer is hidden cleanly in the code itself!&lt;br&gt;
Look at this specific line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S[i].ptrn += (S[i].ptrn &amp;lt; SMOKEPTNS - 1) ? 1 : 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What do you see here? There is a &lt;code&gt;ptrn&lt;/code&gt; property of a struct is being incremented by 1 if the current value is less than &lt;code&gt;SMOKEPTNS&lt;/code&gt; which is &lt;code&gt;16&lt;/code&gt; and now look at this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_mvaddstr(S[i].y, S[i].x, Smoke[S[i].kind][S[i].ptrn]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now if the the smoke trail grows larger than &lt;code&gt;SMOKEPTNS&lt;/code&gt; value, the space character is added and if not, some other readable character is used! Cool right? I find it mesmerizing as well!&lt;br&gt;
And after all of this nice smoke dance is done, the &lt;code&gt;sum&lt;/code&gt; variable is incremented so that next time this smoke can be pushed back!&lt;/p&gt;

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

&lt;p&gt;This deep dive into the sl command was honestly one of the most fun and chaotic learning experiences I’ve had so far.&lt;br&gt;
I broke my terminal (a few times), learned more about pointers and curses than I expected, and gained a whole new respect for the people who built such creative software decades ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;In the next post, I’ll finally start modifying the train — maybe make it rainbow-colored or emoji-powered 🚂&lt;br&gt;
If you enjoyed this, leave a comment with your favorite C trick or just say “enjoyed!” — it genuinely keeps me motivated to keep writing these. 😄&lt;/p&gt;

&lt;p&gt;Thank you so much for your time dear reader! Appreciate it 😁! &lt;br&gt;
Signing Off&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rktvehec023aq6bnwg9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rktvehec023aq6bnwg9.gif" alt="Signing Off GIF" width="371" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>opensource</category>
      <category>devjournal</category>
      <category>linux</category>
    </item>
    <item>
      <title>Contributing to Ubuntu — Day 1: When I Met the ‘sl’ Train Command 🚂</title>
      <dc:creator>Meet Gandhi</dc:creator>
      <pubDate>Fri, 24 Oct 2025 05:45:53 +0000</pubDate>
      <link>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-1-when-i-met-the-sl-train-command-555k</link>
      <guid>https://forem.com/geniusmind9999/contributing-to-ubuntu-day-1-when-i-met-the-sl-train-command-555k</guid>
      <description>&lt;p&gt;Hello reader! I know this is my first blog and you don't know me, but you will eventually (trust me on this one 😁).&lt;br&gt;
But I am just another developer curious about how I can contribute to Ubuntu without any prior experience with open source.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Background:
&lt;/h2&gt;

&lt;p&gt;I always felt very curious on how Operating systems like Windows work but as luck may have it, Windows is closed source and I cannot dig deep into it. But as my interest in system design grew deeper, I got to know of Linux. And about a month later (to my surprise), having Ubuntu 22.04 on either a VM or on dual boot became a must in the Operating Systems course at my University. That's when I first met Ubuntu, then I explored its command line (which is till date a maze for me). Slowly we were introduced to a ton of OS concepts like scheduling and memory management which just sank into my brain — but I wanted to see them in action. Now, I could make an OS myself using QEMU but then I decided why not tinker with Ubuntu first? After all, I have it up and running and it is open source. Hence I started my blog series on &lt;em&gt;Contributing to Ubuntu&lt;/em&gt;, here I show my journey of how much I learn while trying to figure my way out. Plus, I could not find something which can really help me do what I want hence this could also act as a "mini guide" (atleast sort of...) for any other beginner who has a passion similar to mine and wants to start as well.&lt;/p&gt;
&lt;h2&gt;
  
  
  The goal:
&lt;/h2&gt;

&lt;p&gt;My goal at the end of this series is to develop a good solution for the boring emoji picker in Ubuntu. This is because I use a ton of emoji's in a single sentence (though i have controlled myself too much here) I need something better than this to keep using Ubuntu 🥴&lt;/p&gt;
&lt;h2&gt;
  
  
  The installation headaches:
&lt;/h2&gt;

&lt;p&gt;So i had Ubuntu 22.04 which after a headache got upgraded to 24.04 (glad ChatGPT is a thing right now)&lt;br&gt;
After upgrading I first installed the build tools which are seemingly necessary to proceed ahead&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install build-essential devscripts fakeroot git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I did what a great programmer does — I asked ChatGPT what I should start with as a noob 😁&lt;br&gt;
So after some spiraling talks, I got to the conclusion of tinkering the sl package since it does not do anything (yep, that is the actual reason 🫠)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install sl
apt source sl
cd sl-*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But as the saying goes &lt;strong&gt;Bugs follow programmers everywhere&lt;/strong&gt; (which I created a minute ago), I encountered a bug!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meet@Genius:~$ apt source sl
Reading package lists... Done
E: You must put some 'deb-src' URIs in your sources.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I edited the &lt;code&gt;sources.list&lt;/code&gt; file in &lt;code&gt;/etc/apt&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Previous file content:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deb http://archive.ubuntu.com/ubuntu/ noble main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ noble-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Updated file content:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deb http://archive.ubuntu.com/ubuntu/ noble main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ noble-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ noble main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ noble-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This finally allowed me to get the source code of sl&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
apt source sl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I opened the &lt;code&gt;/home/meet/sl-5.02&lt;/code&gt; folder in VSCode. And while VSCode was opening the folder (yes, my laptop is not as fast as your pcs folks!), I typed &lt;code&gt;sl&lt;/code&gt; in my terminal in a new desktop and I was flabbergasted! I cannot describe my first time experience but I would recommend anyone reading this &lt;strong&gt;Just Try It!&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code exploration:
&lt;/h2&gt;

&lt;p&gt;After having everything setup (finally!), I started exploring the source code. there were 2 main files I found &lt;code&gt;sl.c&lt;/code&gt; and &lt;code&gt;sl.h&lt;/code&gt;. the c file seemed normal enough until I opened the header file 🤯&lt;br&gt;
This file had all the train parts hardcoded into it!&lt;br&gt;
After getting amazed the second time I came back to the c file and started dry running the main function. I found that the sl command accepted not just 3 options (I think I read it in the docs), but 4 options, (&lt;code&gt;-a&lt;/code&gt;, &lt;code&gt;-c&lt;/code&gt;, &lt;code&gt;-F&lt;/code&gt;, &lt;code&gt;-l&lt;/code&gt;) out of which I loved option &lt;code&gt;-F&lt;/code&gt; since it requires a good understanding of what you are doing in order to do such amazing tricks in the terminal. And for 10-20 minutes, I was a bit confused too since I could not figure out what is the use of the constants with the 'C' prefix in the headers, but after seeing this &lt;code&gt;option&lt;/code&gt; function I did get clarity on where it is used (it is used in the &lt;code&gt;-c&lt;/code&gt; option, which anyone with some common sense could figure out — except me, I had to try it once 😂)&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The conclusion:
&lt;/h2&gt;

&lt;p&gt;So thanks a lot dear reader, you have reached till here, I respect you for giving your time here! After exploring the source code I cannot wait to just tinker it, but college assignments demand time hence the tinkering part goes on to day 2 (I hope my Day 2 comes around quickly) where I plan to tinker this code a bit to see how it works internally, maybe even create my own mini walking robot some days later? 🤖 But until then, &lt;strong&gt;Sayonara Amigos&lt;/strong&gt; (I hope i said it right 😅).&lt;br&gt;
If you enjoyed this, drop a 🐧 in the comments — it’ll help me know someone’s reading these and Stay Tuned!&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>opensource</category>
      <category>linux</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
