<?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: Samina Rahman Purba</title>
    <description>The latest articles on Forem by Samina Rahman Purba (@saminarp).</description>
    <link>https://forem.com/saminarp</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%2F921482%2F984d8bfb-b086-4ab6-b8f2-69ae9f7325cc.png</url>
      <title>Forem: Samina Rahman Purba</title>
      <link>https://forem.com/saminarp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/saminarp"/>
    <language>en</language>
    <item>
      <title>Building Disco Week 2: Making Event Networking Less Random 🪩</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Tue, 21 Oct 2025 00:07:41 +0000</pubDate>
      <link>https://forem.com/saminarp/building-disco-week-2-making-event-networking-less-random-88h</link>
      <guid>https://forem.com/saminarp/building-disco-week-2-making-event-networking-less-random-88h</guid>
      <description>&lt;p&gt;Last week, I started a new series documenting the journey of building &lt;strong&gt;Disco&lt;/strong&gt;, a more effective networking app for in-person events.&lt;/p&gt;

&lt;p&gt;We also formed our first pilot partnership with &lt;strong&gt;York University&lt;/strong&gt;, which helped validate the idea early on and gave us real-world feedback to shape our next steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the right people to build with ✨
&lt;/h2&gt;

&lt;p&gt;For the past two weeks, I've been building &lt;strong&gt;Disco&lt;/strong&gt; with two friends. A small, scrappy team that believes in the idea as much as I do.&lt;/p&gt;

&lt;p&gt;As I started sharing about &lt;strong&gt;Disco&lt;/strong&gt; more, demoing it at friends' parties, at the &lt;strong&gt;Startup Open House&lt;/strong&gt; event that recently took place in Toronto, and even to incubators such as the DMZ, new ideas kept coming in and the feedback was amazing.&lt;/p&gt;

&lt;p&gt;Every conversation helped me refine what matters most for our MVP and where we should focus next.&lt;/p&gt;

&lt;p&gt;I used to be terrified of talking about my ideas in public and sharing the work in progress. However, I soon realized that creating an app is just the beginning. There's so much more than just the coding part.&lt;/p&gt;

&lt;p&gt;Finding the right team members, setting a clear vision, getting partnerships, and staying disciplined to do the work day in and day out without going insane all matter in the building process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Disco is hoping to solve 🪩
&lt;/h2&gt;

&lt;p&gt;As an introvert, I've always found networking events overwhelming. The awkward small talk, the frantic search for someone new to speak to, and the pile of business cards that I collect but never look back at.&lt;/p&gt;

&lt;p&gt;As a product studio founder, I love meeting potential collaborators or clients, but there's no good way to meet the right people at the right time during events. Most of the meaningful connections I've made at events happened completely by chance. That always made me wonder:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What if meeting the right person at an event didn't depend on luck? What if I knew who was coming to the event and what their goals were?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's exactly what &lt;strong&gt;Disco&lt;/strong&gt; aims to solve. An app that connects people at in-person events based on their goals for attending. Users create profiles sharing what they're looking for, whether that's finding co-founders, landing clients, or learning from experts, so you can meet the right people at the right time.&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%2Fph102len40sg5v56axp3.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%2Fph102len40sg5v56axp3.PNG" alt=" " width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll be sharing weekly updates on building Disco, lessons learned, and behind-the-scenes progress. If you're interested in trying Disco at your next event or have feedback to share, drop a comment. If you are interested in becoming a beta tester, I'd love to hear from you!&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>showdev</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Disco Build 🪩 Week 1: MVP Sprint</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Sat, 11 Oct 2025 14:14:47 +0000</pubDate>
      <link>https://forem.com/saminarp/the-disco-build-week-1-mvp-sprint-154o</link>
      <guid>https://forem.com/saminarp/the-disco-build-week-1-mvp-sprint-154o</guid>
      <description>&lt;p&gt;We overthink, over-research, and over-plan until the idea dies in our notes app. &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%2Fk2msml3umydeqx5krifr.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%2Fk2msml3umydeqx5krifr.gif" alt=" " width="480" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last week, we did the opposite. We built a networking app called Disco in 3 days, pitched it at York University with a barebones demo, and walked out with a pilot partnership in under an hour.&lt;/p&gt;

&lt;h2&gt;
  
  
  If You Have an Idea, Build It
&lt;/h2&gt;

&lt;p&gt;As an introvert, I find networking events overwhelming. The awkward small talk, the frantic search for the next person to speak to, the business cards that end up in the trash. All of it feels draining. Yet I understand its importance and the role it plays in opening doors to opportunities. In fact, most of my work opportunities came through people I met at events.&lt;/p&gt;

&lt;p&gt;Last week, we showed up at York University with an idea: Disco, an app that makes networking at events actually work. I’ll discuss more about its features as we get closer to the launch date.&lt;/p&gt;

&lt;p&gt;We built a barebones demo in just three days and had one shot to pitch it to decision-makers.&lt;/p&gt;

&lt;p&gt;We presented the demo to the heads of engineering student clubs and the manager of the entrepreneurship program at the Lassonde School of Engineering. Their eyes lit up as they watched the app in action, and within an hour, we walked out with an agreement to pilot Disco at their upcoming events.&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%2Frwz7tgzjngv9zo4ub0u1.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%2Frwz7tgzjngv9zo4ub0u1.PNG" alt=" " width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If You Don’t Try, You’ll Never Know
&lt;/h2&gt;

&lt;p&gt;For years, I’ve struggled with self-doubt, imposter syndrome, and a persistent sense of confusion about what I truly want to pursue in life.&lt;/p&gt;

&lt;p&gt;I get new ideas. I start a project. I find competition. Then self-doubt creeps in, and I stop.&lt;/p&gt;

&lt;p&gt;But every time that shroud of negativity begins to take over, I remind myself: If I don’t try, I’ll never know.&lt;/p&gt;

&lt;p&gt;A lot of great products that exist today almost didn’t. Slack started as an internal tool for a failing gaming company. They were about to shut down when they realized the chat tool was actually the product. Discord was built by a team whose previous gaming company had just crashed. They made it for themselves and almost gave up on it. Notion’s founders were down to their last $10K, and it took them two years to get 1,000 users.&lt;/p&gt;

&lt;p&gt;There are countless stories like these: teams pivoting, products evolving, and ideas rising from the ashes. The lesson is simple — try, because you’ll never know otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early Signs of Validation
&lt;/h2&gt;

&lt;p&gt;A few months ago, I joined several WhatsApp groups where tech founders discuss AI, share ideas, and help each other out.&lt;/p&gt;

&lt;p&gt;I shared my idea for Disco, and to my surprise, many of them were interested in signing up. That early signal gave me confidence, but more importantly, clarity. I started to see who our users really were and what features actually mattered.&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%2F2eaofxt4cjmpy17ebqds.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%2F2eaofxt4cjmpy17ebqds.png" alt=" " width="800" height="874"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also have an incredible team of four working on this project, people who believe in it every single day and keep our Discord project server alive.&lt;/p&gt;

&lt;p&gt;AI is making it ridiculously easy to build quick prototypes for feedback and validation. It’s helping us automate repetitive tasks and move faster than ever. There’s never been a better time to just start and figure out the details as you go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cultivating a Culture of Building
&lt;/h2&gt;

&lt;p&gt;My partner and I have built a strong culture of collaboration and problem-solving at home.&lt;/p&gt;

&lt;p&gt;We set up a cozy double workstation even before we purchased a couch, a TV, or a dining table.&lt;/p&gt;

&lt;p&gt;Being in the zone and completely locked in was critical for us. It got us through college, multiple hackathon wins, our engineering jobs, and now building our product studio, Foam On Latte Inc.&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%2Fsk9x2hskr9kb5if338db.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsk9x2hskr9kb5if338db.jpeg" alt=" " width="768" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s what I want you to take away from this:&lt;/p&gt;

&lt;p&gt;If you have an idea sitting in your notes app, your Notion workspace, or just rattling around in your head — build it. Build a rough version. Show it to people. Get feedback. Iterate.&lt;/p&gt;

&lt;p&gt;You don’t need perfect timing. You don’t need to wait until you feel “ready” because the stars will never align.&lt;/p&gt;

&lt;p&gt;You just need to start. Because if you don’t try, you’ll never know.&lt;/p&gt;

&lt;p&gt;This is Week 1 of The Disco Build. Follow along as we build Disco in public. &lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>startup</category>
      <category>mvp</category>
      <category>showdev</category>
    </item>
    <item>
      <title>From 10-Week Project to Long-Term Partnership</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Mon, 22 Sep 2025 20:53:40 +0000</pubDate>
      <link>https://forem.com/saminarp/from-10-week-project-to-long-term-partnership-551p</link>
      <guid>https://forem.com/saminarp/from-10-week-project-to-long-term-partnership-551p</guid>
      <description>&lt;h3&gt;
  
  
  Thank you, from the bottom of my heart 💌
&lt;/h3&gt;

&lt;p&gt;Huge thanks to everyone who read my last post, &lt;strong&gt;&lt;a href="https://dev.to/saminarp/from-devto-posts-to-running-a-startup-2np0"&gt;From Dev.to Posts to Running a Startup&lt;/a&gt;,&lt;/strong&gt; and gave me a follow here on DEV. I never expected that sharing my entrepreneurial journey — the ups, downs, and struggles — would resonate with so many people.&lt;/p&gt;

&lt;p&gt;In my previous post, I briefly mentioned the early days of my studio &lt;a href="https://www.foamonlatte.co/" rel="noopener noreferrer"&gt;Foam On Latte&lt;/a&gt; and how difficult it was to land clients consistently and get them to pay us what we deserved. After months of underpricing ourselves and battling constant self-doubt, fear of failure, and rejection, we finally found some stability.&lt;/p&gt;

&lt;p&gt;So, I'm going to make it a habit to post weekly about what I'm learning and building in my digital product studio. In these weekly blogs, I'll document product building, forming partnerships, and the projects we're building on our own.&lt;/p&gt;

&lt;p&gt;I'll be sharing real case studies, real struggles, and the lessons learned through each project. Many of these short-term projects have turned into long-term engagements, and we're super grateful for that.&lt;/p&gt;

&lt;p&gt;If you want to see more behind the scenes of my studio, follow me on &lt;a href="https://www.instagram.com/foamonlatte/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recent Project Highlight
&lt;/h2&gt;

&lt;p&gt;We recently partnered with a mission-driven company based in Ontario that provides learning solutions for younger generations. They approached us to build an AI-powered gamified learning app designed to change how young people develop soft skills.&lt;/p&gt;

&lt;p&gt;They needed Version 1 built in just 10 weeks. As a nonprofit, they had strict reporting requirements from donors and funding organizations.&lt;/p&gt;

&lt;p&gt;In our initial call, I quickly found common ground. When I learned they were a nonprofit, I shared my background as a grant writer for Thai organizations before pivoting to tech, and my contributions to various nonprofits through open-source during Hacktoberfest. This connection immediately created trust and set us apart from others.&lt;/p&gt;

&lt;p&gt;I understood the unique pressures of building tech in the nonprofit space: how the right metrics can make or break funding continuity, and how every feature needs to tie back to measurable impact for their stakeholders.&lt;/p&gt;

&lt;p&gt;Together we designed the app to include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gamified soft skills development&lt;/li&gt;
&lt;li&gt;Real-time experience tracking&lt;/li&gt;
&lt;li&gt;Built-in community features for peer support&lt;/li&gt;
&lt;li&gt;AI-powered growth recommendations&lt;/li&gt;
&lt;li&gt;Dynamic resumes that showcase true potential&lt;/li&gt;
&lt;li&gt;Workforce connections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ysc0jufcb4tfc2ibi85.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%2F9ysc0jufcb4tfc2ibi85.png" alt=" " width="800" height="1344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bs9qvijsyufms4194pn.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%2F9bs9qvijsyufms4194pn.png" alt=" " width="800" height="1417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Went From 10 Weeks to a Partnership
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Obsessive Communication&lt;/strong&gt;&lt;br&gt;
This client came in with serious skepticism. They'd previously worked with a dev team that failed to deliver for an entire year. Knowing this, I provided daily updates, no matter how small the progress. Showing proof of work being completed and breaking down each piece weekly assured them we'd deliver on time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast Bug Fixes&lt;/strong&gt;&lt;br&gt;
We didn't let bugs sit for days. If something was simple, we fixed it while the client was still on the call. With today's AI tools, it's easier than ever to quickly identify and ship fixes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Valuable Strategic Advice&lt;/strong&gt;&lt;br&gt;
Since the client was non-technical, I provided extensive guidance on technology choices for cost savings, future-proofing the system, and optimizing product experience. This consultative approach showed we cared about their long-term success, not just completing the project. This also helped the client see us as true partners and not just a one-time vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kindness Goes a Long Way&lt;/strong&gt;&lt;br&gt;
Being genuinely kind and maintaining a sense of humour during client interactions creates lasting relationships. It sounds simple, but it's often overlooked.&lt;/p&gt;

&lt;p&gt;This 10-week project evolved into a true partnership. We're now responsible for building Version 2 with more robust features.&lt;/p&gt;

&lt;p&gt;The transformation happened because we treated the client as a partner from day one, not just as another project to complete.&lt;/p&gt;

&lt;p&gt;I get it — it's not always possible to go from a one-time project to a long-term engagement due to budget constraints or other issues from the client side. However, if you show this level of care, you will also end up being recommended within their circle. This is another great outcome that happened to us, and it's been incredibly valuable for growing our business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question for you:&lt;/strong&gt; What aspect of client relationships do you struggle with most? Communication? Pricing? Scope creep? Let me know in the comments.&lt;/p&gt;

&lt;p&gt;Until next week — keep building, keep learning!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <item>
      <title>From Dev.to Posts to Running a Startup</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Fri, 08 Aug 2025 15:43:45 +0000</pubDate>
      <link>https://forem.com/saminarp/from-devto-posts-to-running-a-startup-2np0</link>
      <guid>https://forem.com/saminarp/from-devto-posts-to-running-a-startup-2np0</guid>
      <description>&lt;p&gt;In 2022, I was learning how to make my first pull request on GitHub. Today, my development studio hit a $56K month milestone, with just three people on the team.&lt;/p&gt;

&lt;p&gt;It's surreal to see just how much has changed. Looking back at my posts from 2022, I was just getting into open source, experimenting with new programming languages, doing Hacktoberfest, and exploring GitHub for the first time. A lot has changed since then. I worked as a software developer for about 1.5 years, then started my own web and app development studio with my partner.&lt;/p&gt;

&lt;p&gt;Coming from learning how to squash and merge on GitHub to now managing client projects serving thousands of people around the world is a big jump, and it all happened in under 3 years.&lt;/p&gt;

&lt;p&gt;A big thank you to the  &lt;a href="http://dev.to/"&gt;dev.to&lt;/a&gt; community. It is the first platform that welcomed me to share my coding journey, no matter how beginner my questions were or how small my wins seemed.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Brutal Start
&lt;/h3&gt;

&lt;p&gt;Diving into entrepreneurship was always part of the plan. I always had this deep desire and need to be involved in creative work where I'm in control—a place where I can get my hands dirty, live in the startup chaos, and even dream in pixels. No, really, I actually dream about my work nowadays. Is that normal?&lt;/p&gt;

&lt;p&gt;I've always wanted to create and build applications for others that are as solid in the backend as they are scroll-stoppingly beautiful in the frontend. Most importantly, my definition of success in this world is the freedom to choose what projects I want to work on while creating value for others, especially other business owners.&lt;/p&gt;

&lt;p&gt;So, I founded &lt;a href="http://www.foamonlatte.co" rel="noopener noreferrer"&gt;Foam On Latte Inc.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foam On Latte is a full-stack product studio building web and mobile apps for startups worldwide. Here, I can not just work with amazing clients but also have creative control over my work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Baby Steps, But We're Getting Somewhere
&lt;/h3&gt;

&lt;p&gt;The first few months of starting Foam On Latte were brutal. We were SO scared to charge our clients because we were afraid of losing them!&lt;/p&gt;

&lt;p&gt;Honestly, it was a totally valid fear.&lt;/p&gt;

&lt;p&gt;We had zero projects in our portfolio at this point, $0 in revenue, and among thousands of mature development agencies out there, it seemed impossible to convince clients that we would be a valuable addition to their team. So, we underpriced ourselves to get our foot in the door.&lt;/p&gt;

&lt;p&gt;We started working with very early-stage startups who also had no revenue or budget for their MVP development.&lt;/p&gt;

&lt;p&gt;Did we burn out? Yeah, a lot. But was it finally worth it? Absolutely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outside the Comfort Zone
&lt;/h3&gt;

&lt;p&gt;Everything changed when we decided to stop competing on price and start competing on value.&lt;/p&gt;

&lt;p&gt;Our big break came when we landed a client who was already in business for 6+ years and had 8 figures in revenue.  &lt;/p&gt;

&lt;p&gt;Now, the scary part—we were, for the first time ever, going to charge higher than we had before.&lt;/p&gt;

&lt;p&gt;We fired off the proposal and sat in silence for a few hours, thinking and overthinking that maybe the quote we sent was too high.&lt;/p&gt;

&lt;p&gt;Did we just ruin everything? We were constantly battling these crippling thoughts, and my co-founder and I started arguing over the number.&lt;/p&gt;

&lt;p&gt;I even called my mom asking if the quote I sent was too high.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Maybe the number should have been lower. Maybe... just maybe.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And THEN, a few hours later, our proposal got signed and approved! It all happened too fast for us to process. We started working on it the very next day. &lt;/p&gt;

&lt;p&gt;This was suddenly the most money we had made from a single project deal—a $17,000 client.&lt;/p&gt;

&lt;p&gt;Our confidence was restored, and it all felt like a fresh start.&lt;/p&gt;

&lt;h3&gt;
  
  
  A 17K Win and Then Silence
&lt;/h3&gt;

&lt;p&gt;But things weren't all rosy and beautiful after that. There were many months of downtime after that initial win. We did not have a proper customer acquisition system in place. &lt;/p&gt;

&lt;p&gt;We were just relying on luck.&lt;/p&gt;

&lt;p&gt;After all, can you blame us? We were just a two-person team at this point.&lt;/p&gt;

&lt;p&gt;The winter months, coupled with no projects on the map, were severely affecting my mental health. I started falling into depressive episodes, and my co-founder and I were questioning if we were cut out for being founders.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tipping Point
&lt;/h3&gt;

&lt;p&gt;The whole notion of entrepreneurship was starting to feel like a house of cards. The dream that people sell of a digital nomad's life on the beach felt like a scam. But just as we were again taking some small projects that underpaid us, we got another massive break. &lt;/p&gt;

&lt;p&gt;What happened next was unfathomable.&lt;/p&gt;

&lt;p&gt;We landed a client in HealthTech, and then in the same month another client in FinTech, and then again in EdTech.&lt;/p&gt;

&lt;p&gt;Three back-to-back huge clients who already had thousands of customers, established products, and good budgets. &lt;/p&gt;

&lt;p&gt;And that became our biggest month — with $56,000 in contracts signed.&lt;/p&gt;

&lt;p&gt;Our clients came in expecting to work with just another dev shop but found a deeply caring tech partner who became part of their team. &lt;/p&gt;

&lt;p&gt;They became our biggest advocates, brought in other clients, and extended our contracts to become multi-phase projects. &lt;/p&gt;

&lt;h3&gt;
  
  
  Scrappy and Happy
&lt;/h3&gt;

&lt;p&gt;Suddenly, I was also doing a whole lot more accounting, keeping track of invoices and learning how to set up payroll accounts. With that money flowing in, we finally had breathing room and space to experiment with a lot of side project ideas that had been sitting and rotting in our Notion folders. &lt;/p&gt;

&lt;p&gt;Honestly, it all happened too fast. We are a small and scrappy team, deeply passionate about our work and in creating value. &lt;/p&gt;

&lt;p&gt;Our unfair advantage is our team size and, dare I say, youth. Being twenty-something and full of energy really keeps us delusional enough to say yes to big projects and deliver, then overdeliver. &lt;/p&gt;

&lt;p&gt;With nothing but work to think about all day, we work incredibly efficiently. We live in our Discord servers, pair program effectively, and plug in AI tools where necessary to speed things up.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next
&lt;/h3&gt;

&lt;p&gt;Working with clients has been great, but now we have a few more projects of our own. With AI prototyping now making it easier than ever to validate an idea, I understand there are no excuses not to build.&lt;/p&gt;

&lt;p&gt;The journey from GitHub newbie to running a profitable dev studio taught me that the biggest barriers are often in our own minds. Sometimes you just need to be delusional enough to believe you can do it, even when you don’t feel ready, then put in the work to make it happen. &lt;/p&gt;

&lt;p&gt;Our goal is to continue increasing monthly revenue through a mix of client work and our own suite of SaaS products. Honestly, we have a LONG way to go, but I am very happy with how far we have come.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're thinking about starting your own business or have questions about our journey, feel free to reach out. Always happy to help fellow builders.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>2022 Highlights: Open Source Development! ✨</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Wed, 14 Dec 2022 08:53:06 +0000</pubDate>
      <link>https://forem.com/saminarp/2022-highlights-open-source-development-1k27</link>
      <guid>https://forem.com/saminarp/2022-highlights-open-source-development-1k27</guid>
      <description>&lt;p&gt;Looking back at 2022, I can certainly say that this year has been one of the best years of my life in terms of self-growth, learning, and productivity. &lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Skills Gained ✅
&lt;/h2&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%2Flikt5xnhhr1m1nsq1ij6.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%2Flikt5xnhhr1m1nsq1ij6.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cool projects I worked on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/saminarp/rwar" rel="noopener noreferrer"&gt;rwar&lt;/a&gt; - My static site generator&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://exploit.herokuapp.com" rel="noopener noreferrer"&gt;Exploit&lt;/a&gt; - A browser-based cybersecurity game built with three.js &lt;/li&gt;
&lt;li&gt;Fragments - A cloud computing course project built with AWS tools &lt;/li&gt;
&lt;li&gt;A Seneca College research project for automating the customer onboarding process using Optical Character Recognition (OCR). &lt;/li&gt;
&lt;li&gt;Built multiple iOS and Android applications for my portfolio. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open-Source Development 💻
&lt;/h2&gt;

&lt;p&gt;I made some awesome contributions to these repos in the last 14 weeks. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/intel/cve-bin-tool" rel="noopener noreferrer"&gt;intel/cve-bin-tool &lt;/a&gt;- 2 pull requests &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ifmeorg/ifme" rel="noopener noreferrer"&gt;ifmeorg/ifme&lt;/a&gt;- 2 pull requests &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/glific/glific-frontend" rel="noopener noreferrer"&gt;glific/glific-frontend&lt;/a&gt; - 1 pull request &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/flutter/flutter" rel="noopener noreferrer"&gt;flutter/flutter&lt;/a&gt;- 1 pull request &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/saminarp/my-photohub" rel="noopener noreferrer"&gt;humphd/my-photohub &lt;/a&gt;- 2 pull requests &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/esatya/rahat-agency" rel="noopener noreferrer"&gt;rahat agency&lt;/a&gt; - 1 pull request &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/withfig/autocomplete" rel="noopener noreferrer"&gt;fig/autocomplete&lt;/a&gt; - 1 pull request &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Two most recent open-source contributions 2️⃣
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. My favorite repository: &lt;a href="https://github.com/humphd/my-photohub" rel="noopener noreferrer"&gt;My-Photohub&lt;/a&gt; 📸
&lt;/h3&gt;

&lt;p&gt;I began working on this repository a few weeks ago as an internal project of Seneca College.  As someone who loves photography, I knew I had to contribute to this. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/humphd/my-photohub/issues/5" rel="noopener noreferrer"&gt;The issue&lt;/a&gt;: GitHub Action to Generate Website and Commit to Repo
&lt;/h3&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Seneca-CDOT/my-photohub/issues/5" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        GitHub Action to Generate Website and Commit to Repo
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#5&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/humphd" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F427398%3Fv%3D4" alt="humphd avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/humphd" rel="noopener noreferrer"&gt;humphd&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Seneca-CDOT/my-photohub/issues/5" rel="noopener noreferrer"&gt;&lt;time&gt;Oct 19, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Similar to #3, we need a way to generate an HTML page that uses all of the optimized images.  Once it has been created, we need to re-commit everything in the Actions filesystem back to the repo's &lt;code&gt;gh-pages&lt;/code&gt; branch (i.e., we want the built web site to be put into the gh-pages branch).&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Seneca-CDOT/my-photohub/issues/5" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  The solution 💡
&lt;/h3&gt;

&lt;p&gt;This issue required me to work with GitHub Actions and what I had to do was use the images uploaded by the users and generate a website for them using GitHub pages. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Seneca-CDOT/my-photohub/pull/34" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
         GitHub Action to Generate Website and Commit to Repository
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#34&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/saminarp" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F71540402%3Fv%3D4" alt="saminarp avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/saminarp" rel="noopener noreferrer"&gt;saminarp&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Seneca-CDOT/my-photohub/pull/34" rel="noopener noreferrer"&gt;&lt;time&gt;Dec 08, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fixes &lt;a href="https://github.com/humphd/my-photohub/issues/5" rel="noopener noreferrer"&gt;https://github.com/humphd/my-photohub/issues/5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This GitHub Action workflow takes the images uploaded from &lt;code&gt;optimized&lt;/code&gt; directory and generates a website using GitHub pages. See the example of &lt;a href="https://saminarp.github.io/my-photohub/" rel="nofollow noopener noreferrer"&gt;generated website from this link&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Preview of the website&lt;/h3&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/71540402/206369303-84bd1755-23f8-4a03-9add-a9e11576018d.png"&gt;&lt;img width="2000" alt="CleanShot 2022-12-08 at 00 56 20@2x" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F71540402%2F206369303-84bd1755-23f8-4a03-9add-a9e11576018d.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;:  The branch is currently named as &lt;code&gt;issue#5-gen-web&lt;/code&gt;. Every test image that is currently in the optimized folder is in this branch. It copies over to &lt;code&gt;gh-pages&lt;/code&gt; branch to generate the website.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once this gets approved, we need to replace the branch name (&lt;code&gt;issue#5-gen-web&lt;/code&gt;) in &lt;code&gt;publish.yml&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;To test&lt;/h3&gt;
&lt;p&gt;You can change your branch to &lt;code&gt;issue#5-gen-web&lt;/code&gt; and upload your desired pictures to &lt;code&gt;optimized&lt;/code&gt; directory. After a successful commit and a push, this branch will result in a gh-pages website.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Seneca-CDOT/my-photohub/pull/34" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  2. Risky contribution: Flutter 🔵
&lt;/h3&gt;

&lt;p&gt;Flutter is an open-source UI software development kit created by Google and is used to develop cross-platform applications for Android, iOS, Linux, macOS, Windows, Google Fuchsia, and the web from a single codebase.&lt;/p&gt;

&lt;p&gt;I took a huge risk making this contribution to Flutter, but I knew it was a very useful one and the biggest I have done. I wanted to step way out of my comfort zone to do something, unlike anything I had done before. At first, I did not think I would end up contributing to Flutter as I was just simply experimenting with the issue I was thinking about. After about four days of work, I figured it out. But of course, the pull request was not so smooth, and tonight I discovered I still have some failing tests which I need to address promptly.&lt;/p&gt;

&lt;h5&gt;
  
  
  A little bit of backstory... 📽️
&lt;/h5&gt;

&lt;p&gt;This summer, I was working as a research assistant at Seneca College for their industry partner which is an exciting startup in the vehicle renting industry -  similar to Turo. &lt;/p&gt;

&lt;p&gt;I had to do a lot of research for an efficient and automated customer onboarding process for them as it was their number one priority. &lt;br&gt;
Their mobile application was built using Flutter and I found myself looking at a lot of Flutter code. Even though I was not directly involved in building the mobile application, I was required to quickly learn Flutter and therefore, Dart which is the language used by Flutter. &lt;/p&gt;
&lt;h3&gt;
  
  
  The Issue 📝
&lt;/h3&gt;

&lt;p&gt;I took a big risk and filed the issue myself before working on it! So, how did the idea come about?&lt;br&gt;
As I was browsing through the  5000+ issues currently filed on Flutter, it felt intimidating. I was not being able to find the right issue to work on. I tried working on one and it was going nowhere. Then, I had this sudden aha moment after reading many issues and thought, why don't I just file the issue myself that I was thinking about and work on it? I had seen many others do the same. &lt;br&gt;
The issue was filed by me as a new feature request. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/flutter/flutter/issues/116702" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Add a way to flip/mirror an widget
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#116702&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/saminarp" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F71540402%3Fv%3D4" alt="saminarp avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/saminarp" rel="noopener noreferrer"&gt;saminarp&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/flutter/flutter/issues/116702" rel="noopener noreferrer"&gt;&lt;time&gt;Dec 08, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Use case&lt;/h2&gt;

&lt;p&gt;We need a named option to flip widgets horizontally or vertically. It's been mentioned in certain discussions that flutter does not provide a way to flip/mirror widgets. Though we can mirror a child by applying negative scaling, but it would be more appealing to have a dedicated option to flip/mirror widgets.&lt;/p&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Proposal&lt;/h2&gt;

&lt;p&gt;Add a named constructor in the Transform widget to flip/mirror it's child&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/flutter/flutter/issues/116702" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  The Solution ✅
&lt;/h2&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/flutter/flutter/pull/116705" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Add transform flip
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#116705&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/saminarp" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F71540402%3Fv%3D4" alt="saminarp avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/saminarp" rel="noopener noreferrer"&gt;saminarp&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/flutter/flutter/pull/116705" rel="noopener noreferrer"&gt;&lt;time&gt;Dec 08, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Adds Transform.flip to allow flipping/mirroring child widgets&lt;/p&gt;

&lt;p&gt;Fixes &lt;a href="https://github.com/flutter/flutter/issues/116702" rel="noopener noreferrer"&gt;https://github.com/flutter/flutter/issues/116702&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Pre-launch Checklist&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[x] I read the &lt;a href="https://github.com/flutter/flutter/wiki/Tree-hygiene#overview" rel="noopener noreferrer"&gt;Contributor Guide&lt;/a&gt; and followed the process outlined there for submitting PRs.&lt;/li&gt;
&lt;li&gt;[x] I read the &lt;a href="https://github.com/flutter/flutter/wiki/Tree-hygiene" rel="noopener noreferrer"&gt;Tree Hygiene&lt;/a&gt; wiki page, which explains my responsibilities.&lt;/li&gt;
&lt;li&gt;[x] I read and followed the &lt;a href="https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo" rel="noopener noreferrer"&gt;Flutter Style Guide&lt;/a&gt;, including &lt;a href="https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#features-we-expect-every-widget-to-implement" rel="noopener noreferrer"&gt;Features we expect every widget to implement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[x] I signed the &lt;a href="https://cla.developers.google.com/" rel="nofollow noopener noreferrer"&gt;CLA&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[x] I listed at least one issue that this PR fixes in the description above.&lt;/li&gt;
&lt;li&gt;[x] I updated/added relevant documentation (doc comments with &lt;code&gt;///&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;[x] I added new tests to check the change I am making, or this PR is &lt;a href="https://github.com/flutter/flutter/wiki/Tree-hygiene#tests" rel="noopener noreferrer"&gt;test-exempt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[x] All existing and new tests are passing.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;/div&amp;gt;
&amp;lt;div class="gh-btn-container"&amp;gt;&amp;lt;a class="gh-btn" href="https://github.com/flutter/flutter/pull/116705"&amp;gt;View on GitHub&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Flutter uses a 4-dimensional matrix to transform the image a widget is producing just like OpenGL. To mirror that image we have to rotate it around an axis. 

&lt;p&gt;To mirror it horizontally we have to rotate it around the y axis by 180 degrees, and to rotate it vertically we have to rotate it around the x-axis by 180 degrees. &lt;br&gt;
With that theory in mind, we can apply matrix rotation to get the expected results. And by applying the transformation we get the scary math results as in the photo.&lt;br&gt;
I love maths! &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%2Fvq7rucaqmwdezlyx301k.jpg" 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%2Fvq7rucaqmwdezlyx301k.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flutter already has transform widgets and it has named constructors to facilitate different transformations like translate and scale, but it did not have one to flip/mirror. So inspecting their way of implementing those transformations, I simply plugged in the values for the final matrix for the arguments flipX and flipY. :) &lt;br&gt;
I know it sounds simple, but it took me a lot of figuring out and studying the codebase to come up with this. I did not honestly think it would work out as I was just experimenting with it and ...ta-da... it did work out! &lt;/p&gt;

&lt;p&gt;The hardest part about the PR was writing the tests. It took a lot of research, trial, and error. It took me around 4-5 days to complete the entire pull request and I still am fixing some failing CI/CD workflow tests.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Going forward... 🚀
&lt;/h2&gt;

&lt;p&gt;I need to improve on code reviews and it is a big part of my 2023 goals. &lt;/p&gt;
&lt;/div&gt;

</description>
      <category>terraform</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>✨Day in the life of a college student during finals week - self reflection blog</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Sat, 10 Dec 2022 08:01:48 +0000</pubDate>
      <link>https://forem.com/saminarp/day-in-the-life-of-a-college-student-during-finals-week-self-reflection-blog-45md</link>
      <guid>https://forem.com/saminarp/day-in-the-life-of-a-college-student-during-finals-week-self-reflection-blog-45md</guid>
      <description>&lt;p&gt;Dear college students, &lt;/p&gt;

&lt;p&gt;I am sure we all can relate to this. &lt;/p&gt;

&lt;p&gt;Finals week is here, and everything is about to go to..... &lt;em&gt;bleep&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why are all the assignments due on the same day?&lt;/p&gt;

&lt;p&gt;I sleep and wake up at unusual times. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Maybe I can implement a few more features before sleep for my cloud computing assignment. Maybe just one more cup of coffee will keep me awake for a few more hours. Well no, the extra cup of coffee just made me jittery and now I am left with a racing heart.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;There is no sleeping schedule anymore. There are just random hours of sleep in a 24-hour period. &lt;/p&gt;

&lt;p&gt;Upon waking up, I check my email and Slack and Teams messages. &lt;br&gt;
My messages are somewhat like this:&lt;/p&gt;

&lt;p&gt;"CI/CD failed from the flutter pull request I had done." Great! &lt;/p&gt;

&lt;p&gt;"Your assignment 4 is due tonight." Awesome. &lt;/p&gt;

&lt;p&gt;"Your promo code that is set to expire in 24 hours for Ugg boots."&lt;/p&gt;

&lt;p&gt;I panic. Because the decision is tough. I have just 24 hours to decide that  if I fit in another pair of Ugg boots in my meticulously planned Christmas shopping list already containing 993732 items, will I suffer financially?   &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Back to reality....&lt;/em&gt; 💭
&lt;/h2&gt;

&lt;p&gt;I panic. I realize I have no time for Christmas shopping. It needs to happen after the finals. &lt;em&gt;Well, will the stuff I like be out of stock before the finals?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;I think of this, and I stress even more. &lt;/p&gt;

&lt;p&gt;The Uber Eats bill is piling up fast.  &lt;/p&gt;

&lt;p&gt;My bank app is displaying a warning message stating there might be a possibility of duplicate charges from the same merchant. No mistakes there. It's all me. &lt;/p&gt;

&lt;p&gt;I pour my Starbucks coffee beans into my french press. The first sip of the morning coffee feels like an elixir. I eat my daily dose of morning eggs and protein wraps and promptly sit to study. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;7 hours later&lt;/em&gt; ⏰
&lt;/h2&gt;

&lt;p&gt;I  finally debugged the flutter issue I was working on. Debugged. It all looks good. All the checks pass now. ...&lt;/p&gt;

&lt;p&gt;I take a small break, stretch out my legs, and eat a meal...&lt;/p&gt;

&lt;p&gt;I catch a glimpse of myself in the mirror and I notice new stress pimples. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Time to study again&lt;/em&gt; 🥹📖
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Another 6 hours later&lt;/em&gt; ⏰
&lt;/h2&gt;

&lt;p&gt;I think to myself, "wow that was a productive 6 hours". &lt;br&gt;
At this point though I feel my cognitive functions declining. &lt;br&gt;
Maybe I should nap or maybe I should get more coffee. &lt;/p&gt;

&lt;p&gt;I look at my TODO list and  I get a momentary sense of deep satisfaction every time I mark something as done; but then I realize  I have a lot more in blues and pinks than greens.&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%2Fgdksux128fh2dq5uw02w.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%2Fgdksux128fh2dq5uw02w.png" alt=" " width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what a typical day for me looks like leading up to finals. But this is neither healthy nor sustainable. So, don't be like me during finals week. This semester I took five difficult courses, but I am glad this is my last semester. &lt;/p&gt;

&lt;p&gt;In my previous blog - I set myself some really big goals for December..So far, I am really satisfied with how much I have accomplished. I also realize that if I focus, really focus on my work without distraction for hours, I can get so much done.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's going good? 😃 ✨
&lt;/h2&gt;

&lt;p&gt;1) The open-source contributions are going well! &lt;br&gt;
    -  I was able to successfully make pull requests to &lt;a href="https://github.com/flutter/flutter/pull/116705" rel="noopener noreferrer"&gt;flutter&lt;/a&gt; and to &lt;a href="https://github.com/humphd/my-photohub/pull/34" rel="noopener noreferrer"&gt;my-photohub&lt;/a&gt;&lt;br&gt;
    -  I am currently working on responding to the issues I worked on. &lt;/p&gt;

&lt;p&gt;2) I have also been keeping up with the &lt;a href="https://tryhackme.com/christmas" rel="noopener noreferrer"&gt;advent of cyber&lt;/a&gt; but fell behind on the &lt;a href="https://adventofcode.com/" rel="noopener noreferrer"&gt;advent of code&lt;/a&gt;. But not to worry. I am going to catch up right after the finals. &lt;/p&gt;

&lt;p&gt;3) I have also responded to some changes requested for a  pull request I did last month for &lt;a href="https://github.com/withfig/autocomplete/pull/1714" rel="noopener noreferrer"&gt;fig/autocomplete&lt;/a&gt; and had it successfully merged yesterday. &lt;/p&gt;

&lt;p&gt;4) Most of my assignments are complete. Thanks to careful planning, Uber Eats and the Thai food store 5 mins away from me. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's not going good 🥲
&lt;/h2&gt;

&lt;p&gt;1) I am behind on code reviews and I realize I should put more effort into it. &lt;br&gt;
2) I missed out on writing two blogs for my static site generator.&lt;br&gt;
3) I had no time to workout for the last two weeks &lt;/p&gt;

&lt;p&gt;Thank you all for reading! Next blog will be filled with technical details about my  pull requests made for flutter and my-photohub. &lt;/p&gt;

&lt;p&gt;Also, I just started a brand new desk setup and studygram on instagram... Please do give me a follow on &lt;a href="https://www.instagram.com/foamonlatte/" rel="noopener noreferrer"&gt;Foam On Latte&lt;/a&gt;! &lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>ai</category>
      <category>security</category>
      <category>discuss</category>
    </item>
    <item>
      <title>☃️ My December Goals🎄: ending the year right by learning new things ✨</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Sun, 04 Dec 2022 06:12:42 +0000</pubDate>
      <link>https://forem.com/saminarp/my-december-goals-ending-the-year-right-by-learning-new-things-2m7o</link>
      <guid>https://forem.com/saminarp/my-december-goals-ending-the-year-right-by-learning-new-things-2m7o</guid>
      <description>&lt;p&gt;About 12 weeks ago, I set on a mission to get comfortable with the uncomfortable. I decided to try out open-source development and contribute to interesting projects on GitHub. It was an amazing process in terms of learning new technologies, communicating with others, getting active in the open-source community, and building my resume. Over the next 10 days, I will be contributing to more open-source projects and working on some small issues or bugs.  Not just that, I also came across some amazing challenges to take part in to learn new things and end the year on the right note. I will be blogging about my progress along the way!&lt;/p&gt;

&lt;h2&gt;
  
  
  1) More Open Source Project Contributions 🚀
&lt;/h2&gt;

&lt;p&gt;For the next two weeks, I will be focusing on making contributions to a few open-source projects. Although I have not settled on which issue I will tackle yet, below I have curated a list of potential repositories I will contribute: &lt;/p&gt;

&lt;p&gt;1) &lt;a href="https://github.com/humphd/my-photohub" rel="noopener noreferrer"&gt;My-Photohub&lt;/a&gt;: This is a Seneca College student-run project. Previously, I already contributed to this project where I wrote code for the functionality of uploading resources to GitHub. &lt;/p&gt;

&lt;p&gt;2) &lt;a href="https://github.com/glific/glific-frontend" rel="noopener noreferrer"&gt;Glific-frontend&lt;/a&gt;: This was a project I had the opportunity to work on during Hacktoberfest. I loved the idea behind the project and how it was helping to solve a crucial challenge for community-led organizations regarding data collection at a grassroots level. I am planning on working on one front-end issue from Glific. They are also a very welcoming community of people and ready to answer questions whenever I have any. &lt;/p&gt;

&lt;p&gt;3) &lt;a href="https://github.com/intel/cve-bin-tool" rel="noopener noreferrer"&gt;Intel/cve-bin-tool:&lt;/a&gt; There are some issues I found here that seemed interesting to me to work on, especially related to refactoring the code or creating new checkers. &lt;/p&gt;

&lt;p&gt;4) Some other cool repositories I found containing beginner-friendly issues: &lt;br&gt;
    - &lt;a href="https://github.com/pandas-dev/pandas/issues?page=1&amp;amp;q=is%3Aissue+is%3Aopen" rel="noopener noreferrer"&gt;pandas&lt;/a&gt;&lt;br&gt;
    - &lt;a href="https://github.com/freeCodeCamp/freeCodeCamp" rel="noopener noreferrer"&gt;freeCodeCamp &lt;/a&gt;&lt;br&gt;
    - &lt;a href="https://github.com/pytest-dev/pytest" rel="noopener noreferrer"&gt;pytest&lt;/a&gt;&lt;br&gt;
    - &lt;a href="https://github.com/bokeh/bokeh" rel="noopener noreferrer"&gt;bokeh&lt;/a&gt;&lt;br&gt;
        - &lt;a href="https://github.com/flutter/flutter" rel="noopener noreferrer"&gt;flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am not entirely sure I will end up successfully contributing to any of these repositories yet. We will find out in my next blog! &lt;/p&gt;

&lt;h2&gt;
  
  
  2) &lt;a href="https://tryhackme.com/christmas" rel="noopener noreferrer"&gt;Advent of Cyber&lt;/a&gt; 🤖
&lt;/h2&gt;

&lt;p&gt;Stumbling upon this amazing challenge was one of the best things for my December learning goals. If you like me and want to learn the basics of cybersecurity, while solving fun challenges and then getting a certificate in the end, this is perfect! &lt;br&gt;
For my project management and implementation course at Seneca College this semester, my teammates and I are building a browser-based cybersecurity quiz game with three.js. This was one of the most difficult projects I have been working on over the last 3 months. Advent of Cyber is great for learning those basics and then applying them to building content for the gaming project I am building. &lt;/p&gt;

&lt;h2&gt;
  
  
  3) &lt;a href="https://adventofcode.com/" rel="noopener noreferrer"&gt;Advent of Code&lt;/a&gt; 💻
&lt;/h2&gt;

&lt;p&gt;Advent of Code is great for putting our problem-solving skills to work! We can solve the puzzles in any language we like and do not require knowledge of any fancy tools or frameworks. When I attempted doing Advent of Code last year with just a few months' worth of coding experience under my belt, I felt miserable. This year, I want to challenge myself to go through all the questions and attempt to solve them with a mix of using JavaScript and Python. &lt;/p&gt;

&lt;h2&gt;
  
  
  4) &lt;a href="https://www.adventofjs.com" rel="noopener noreferrer"&gt;Advent of JavaScript&lt;/a&gt; 📺
&lt;/h2&gt;

&lt;p&gt;This is another cool challenge to try if you are into JavaScript or want to improve on it. I found this somewhat accidentally when I was just randomly googling "advent of stuff".... Although, the first three are my priority I would love to give this a go and complete it if I can manage the time. &lt;/p&gt;

&lt;h3&gt;
  
  
  Some Non-Code Stuff 📝
&lt;/h3&gt;

&lt;p&gt;Apart from coding, I also do a lot of writing for Asia-based community-led organizations and non-governmental organizations. I am ending the year writing and designing a 25-page report for a Bangkok-based organization summarizing the impact of COVID-19 on marginalized populations over the last two years based on research materials they provided me. &lt;/p&gt;

&lt;p&gt;So...let's make the most of the last month of the year and have fun doing some amazing projects and challenges! &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>✨Today I learned: Using Octokit! 🐙✨</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Fri, 25 Nov 2022 07:24:38 +0000</pubDate>
      <link>https://forem.com/saminarp/today-i-learned-using-octokit-2bdm</link>
      <guid>https://forem.com/saminarp/today-i-learned-using-octokit-2bdm</guid>
      <description>&lt;h2&gt;
  
  
  A little reflection...
&lt;/h2&gt;

&lt;p&gt;As important as it is to set goals, it is also important to measure progress along the way. I wanted to take a moment and see how far I have come in my first couple of months of open-source development journey and what more I want to achieve. &lt;/p&gt;

&lt;p&gt;Part of the goal I set for my open-source development journey is to aim for continuous progression and development.  Hacktoberfest was a great way for me to navigate the mysterious world of open-source projects. Well, a little less mysterious than before. I am more comfortable now with the process of forking, cloning, experimenting with a project, and following the contribution guideline rules to make a proper pull request. I also learned to be more professional in my communication with maintainers and make changes according to their requests. I am also better at reading contribution guidelines now and following them. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Project
&lt;/h2&gt;

&lt;p&gt;Along with a small team of incredible developers, I decided to work on the&lt;a href="https://github.com/humphd/my-photohub" rel="noopener noreferrer"&gt; My Photohub&lt;/a&gt; project. &lt;/p&gt;

&lt;p&gt;As stated in the README.md &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My Photohub&lt;/strong&gt; is a web app that makes it easy to share your photos on the web. &lt;strong&gt;My Photohub&lt;/strong&gt; takes your images and optimizes them for the web, creates a beautiful HTML page to show them, and hosts everything in a new &lt;a href="https://docs.github.com/en/repositories" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt; owned by you! Your photo web page is made available to the world via &lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;. Best of all, everything is free, and &lt;strong&gt;you&lt;/strong&gt; are in control of the end product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As someone who loves photography and working with images, the moment I saw this project, I knew I had to contribute to it. I also liked the idea of using GitHub to upload images, it felt original and innovative. &lt;/p&gt;

&lt;h2&gt;
  
  
  Teamwork
&lt;/h2&gt;

&lt;p&gt;Having a great team all sharing a common vision and being equally motivated and active is so important to making a project work. I was truly lucky to have worked on the My PhotoHub project with some brilliant developers who were ready to review my code, provide feedback and actively communicate on our team chat. Since the project was new, it took a lot of coordination and communication to figure out the conflicting parts of the code could be resolved and turned into one properly functioning whole. &lt;/p&gt;

&lt;h2&gt;
  
  
  My Contribution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Issue&lt;/strong&gt;: &lt;a href="https://github.com/humphd/my-photohub/issues/7" rel="noopener noreferrer"&gt;"Figure out how to 'upload' resources to GitHub"&lt;/a&gt;
&lt;/h3&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%2Fmvglz2ithentilfb1ywl.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%2Fmvglz2ithentilfb1ywl.png" alt=" " width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of the time, in order to make code contributions, we need to have some idea of what the entire codebase is doing or what the project is about. Unless, of course, the issue is very minor and won't affect the entire project. I had to look through the pull requests of two other members of the team to have an idea of how to approach 'uploading' resources to GitHub. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is Octokit? 🐙
&lt;/h2&gt;

&lt;p&gt;To contribute to this project, I first had to learn about &lt;a href="https://github.com/octokit" rel="noopener noreferrer"&gt;Octokit&lt;/a&gt;. I never used it before for any of my projects so I had to read some articles about it first and go through the documentation. &lt;/p&gt;

&lt;p&gt;Octokit is a lineup of GitHub-maintained client libraries for the GitHub API. &lt;br&gt;
The &lt;code&gt;Octokit&lt;/code&gt; client can be used to send requests to &lt;a href="https://docs.github.com/rest/" rel="noopener noreferrer"&gt;GitHub's REST API&lt;/a&gt; and make queries to &lt;a href="https://docs.github.com/graphql" rel="noopener noreferrer"&gt;GitHub's GraphQL API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example taken from the documentation&lt;/strong&gt;: Get the username for the authenticated user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create a personal access token at https://github.com/settings/tokens/new?scopes=repo&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;octokit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Octokit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`personal-access-token123`&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Compare: https://docs.github.com/en/rest/reference/users#get-the-authenticated-user&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;octokit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAuthenticated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, %s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;I came up with the code below to upload the resources following the pull requests for other issues for the project.  To form the logic, the &lt;a href="https://docs.github.com/en/rest/repos/contents" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; was my main source of guidance. It had a lot of code examples for me to follow and work with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Octokit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://cdn.skypack.dev/octokit?dts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UPLOAD_DIRECTORY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;raw&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getBase64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readAsDataURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onerror&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;githubUpload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;octokit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Octokit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;octokit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUT /repos/{owner}/{repo}/contents/{path}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;UPLOAD_DIRECTORY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Upload File - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getBase64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Going forward... 🚀
&lt;/h2&gt;

&lt;p&gt;For the next few weeks, I want to actively work on turning the My Photohub project into a functioning application. There are important bits and pieces of it still missing and I want to actively contribute to making it whole. &lt;/p&gt;

</description>
      <category>api</category>
    </item>
    <item>
      <title>What's so cool about Fig Autocomplete? 💭</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Tue, 22 Nov 2022 21:25:44 +0000</pubDate>
      <link>https://forem.com/saminarp/whats-so-cool-about-fig-autocomplete-2j1f</link>
      <guid>https://forem.com/saminarp/whats-so-cool-about-fig-autocomplete-2j1f</guid>
      <description>&lt;h2&gt;
  
  
  The Perfect Trio ³
&lt;/h2&gt;

&lt;p&gt;It was around 2:00 am when two of my classmates (&lt;a href="https://github.com/batunpc" rel="noopener noreferrer"&gt;Batu&lt;/a&gt;, &lt;a href="https://github.com/SerpentBytes" rel="noopener noreferrer"&gt;TD&lt;/a&gt;) and I  were online sharing our screens and helping each other out with an open-source project. We were scanning the documentation as we kept working, cautiously coding away to maintain proper style and clean code. We each picked an issue to work on and reviewed each other's codes at the end to squash any bugs ahead of time before making the pull requests. &lt;/p&gt;

&lt;p&gt;The three of us decided to work on &lt;code&gt;Fig&lt;/code&gt; - a tool that provides IDE-style autocomplete but for the terminal. As developers, we all know how important the terminal is. We thought this would be a cool project to contribute to since we use this tool daily.  &lt;/p&gt;

&lt;h2&gt;
  
  
  What's So Cool About &lt;code&gt;Fig Autocomplete&lt;/code&gt; ❓📺
&lt;/h2&gt;

&lt;p&gt;As written in their README:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fig.io/?ref=github_autocomplete" rel="noopener noreferrer"&gt;Fig&lt;/a&gt; makes the command line easier for individuals and more collaborative for teams.&lt;/strong&gt;&lt;br&gt;
 Our most popular product is &lt;a href="https://github.com/withfig/autocomplete" rel="noopener noreferrer"&gt;Autocomplete&lt;/a&gt;. As you type, Fig pops up subcommands, options, &lt;br&gt;
 and contextually relevant arguments in your existing terminal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Look how beautifully it gives suggestions &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%2F837cxxyd99hp1qnvlzpf.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%2F837cxxyd99hp1qnvlzpf.png" alt=" " width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29149ftatyx8a3qmm522.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%2F29149ftatyx8a3qmm522.png" alt=" " width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install Fig:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install fig 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use Fig every day. The Fig autocomplete repo had clear documentation and a lot of activity going on. Plus, it was written in Typescript, a language I have experience with. The development environment setup took only a few minutes, again, thanks to the clear documentation. I scanned the list of issues and found an interesting one.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/withfig/autocomplete/issues/1549" rel="noopener noreferrer"&gt;Issue&lt;/a&gt;: hyperfine missing spec
&lt;/h3&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%2Fdxtpvihsw95uzu7wzz1y.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%2Fdxtpvihsw95uzu7wzz1y.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's &lt;code&gt;Hyperfine&lt;/code&gt;❓ 🤖
&lt;/h2&gt;

&lt;p&gt;Hyperfine is a command line benchmarking tool with the following features as written in their README.md &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Statistical analysis across multiple runs.&lt;/li&gt;
&lt;li&gt;  Support for arbitrary shell commands.&lt;/li&gt;
&lt;li&gt;  Constant feedback about the benchmark progress and current estimates.&lt;/li&gt;
&lt;li&gt;  Warmup runs can be executed before the actual benchmark.&lt;/li&gt;
&lt;li&gt;  Cache-clearing commands can be set up before each timing run.&lt;/li&gt;
&lt;li&gt;  Statistical outlier detection to detect interference from other programs and caching effects.&lt;/li&gt;
&lt;li&gt;  Export results to various formats: CSV, JSON, Markdown, AsciiDoc.&lt;/li&gt;
&lt;li&gt;  Parameterized benchmarks (e.g. vary the number of threads).&lt;/li&gt;
&lt;li&gt;  Cross-platform&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;To install &lt;a href="https://github.com/sharkdp/hyperfine" rel="noopener noreferrer"&gt;hyperfine&lt;/a&gt; I did:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install hyperfine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So let's say I type &lt;code&gt;hyperfine ls&lt;/code&gt;. This shows how much time it takes the &lt;code&gt;ls&lt;/code&gt; command to run on my computer. Below, you see the screenshot of the command run on a 2020 Intel MacBook 13-inch 2020 model with 16 GB RAM. &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%2F9vim3b38yn5yi4149nmf.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%2F9vim3b38yn5yi4149nmf.png" alt=" " width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this one was done on my 16GB 2021 M1 iMac.&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%2Fjqw4jlwgmr0lxdzxg0l0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqw4jlwgmr0lxdzxg0l0.jpeg" alt=" " width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Honestly, this was fun for me to watch the performance metrics. I then followed the documentation and played around with a few other commands across all my machines. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Are &lt;code&gt;Completion Specs&lt;/code&gt;❓ 📝
&lt;/h2&gt;

&lt;p&gt;For this issue, I had to write a completion spec for hyperfine. &lt;a href="https://fig.io/docs/getting-started/first-completion-spec" rel="noopener noreferrer"&gt;Completion specs &lt;/a&gt;are: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A completion spec is a &lt;em&gt;declarative&lt;/em&gt; schema that specifies the &lt;code&gt;subcommands&lt;/code&gt;, &lt;code&gt;options&lt;/code&gt;, and &lt;code&gt;args&lt;/code&gt; for a CLI tool. Fig uses these schemas to generate suggestions. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As mentioned in the issue above, the hyperfine completion spec was missing. I had to read through the documentation very carefully and study the manual of hyperfine to figure out how to get this working. &lt;/p&gt;

&lt;p&gt;After typing in &lt;code&gt;man hyperfine&lt;/code&gt; on my terminal to pull up the hyperfine manual,  I studied the long list of options and commands for the type of arguments I had to pass in. Then, I started coding. &lt;br&gt;
The file ended up being almost 300 lines long, but here is a small snippet of the code structure. &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%2Fe82pwcby9bg0vilyfzll.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%2Fe82pwcby9bg0vilyfzll.png" alt=" " width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I was doing the autocompletion spec, I was testing the commands as well to make sure they were working as intended. I also had two more pairs of eyes checking and testing my work before I made the &lt;a href="https://github.com/withfig/autocomplete/pull/1714" rel="noopener noreferrer"&gt;pull request&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring My Progress 📏
&lt;/h2&gt;

&lt;p&gt;This was a much bigger pull request in an open-source project compared to the ones I had done before. I realized that previously I spent way too much time just setting up the development environment and it took time away from the actual coding part itself. I was also working with unfamiliar languages so the scope and size of my contribution were small. This time I decided to work on a bigger repo and write more lines of code. &lt;/p&gt;

&lt;p&gt;So, what are some of the things I did right this time, compared to Hacktoberfest which was my very first plunge into the world of open-source development?&lt;/p&gt;

&lt;p&gt;1) I read the CONTRIBUTING.md file and followed it.&lt;br&gt;
2) I used proper commit messages as they specified as their guideline.&lt;br&gt;
3) I used proper naming conventions.&lt;br&gt;
4) I looked through their examples of completion specs to make them consistent with others.&lt;br&gt;
5) I squashed and rebased my commits.&lt;br&gt;
6) I was more professional in my communication while making the pull request. &lt;br&gt;
7) I collaborated with others working on this repo so that we can speed up the process and help each other out. &lt;br&gt;
8) I did a lot more research on the topics - in this case, hyperfine and completion specs, before writing code. &lt;/p&gt;

&lt;p&gt;Note: I received some feedback from the maintainers to make some minor changes and I am currently working on fixing them.&lt;/p&gt;

&lt;p&gt;Well, it is quite evident that as a beginner I learned a LOT of things contributing to open-source projects and I continue to learn something new each day. &lt;/p&gt;

</description>
      <category>beginners</category>
    </item>
    <item>
      <title>✨Today I Learned: The Subtle Art of Code Reviews 💡✨</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Sun, 20 Nov 2022 08:14:07 +0000</pubDate>
      <link>https://forem.com/saminarp/today-i-learned-the-subtle-art-of-code-reviews-3pef</link>
      <guid>https://forem.com/saminarp/today-i-learned-the-subtle-art-of-code-reviews-3pef</guid>
      <description>&lt;p&gt;Code reviewing is hard. The pull requests I reviewed were for the &lt;a href="https://github.com/humphd/my-photohub" rel="noopener noreferrer"&gt;My Photohub&lt;/a&gt; project. &lt;/p&gt;

&lt;p&gt;Code reviewing for the first time in my life made me realize how difficult the task is. As a first-time code reviewer, I found myself staring at the code, pondering about what could be done to make it better. Feeling rather lost. I came up with some mediocre suggestions. Nothing too great. Nothing that I felt truly satisfied with suggesting. Then came &lt;a href="https://github.com/humphd" rel="noopener noreferrer"&gt;professor Dave&lt;/a&gt; to do his code review on the same pull request I was reviewing. I just sat there astounded at the details he looked at and all that I missed. He suggested major things such as better programming logic, and minor things such as updating the project description. I could have suggested those minor issues too; a better project description, a better logo that goes with the project instead of the default React logo, and creating follow-up issues for certain things. Why did I overlook the obvious, which professor Dave so elegantly and effortlessly pointed out? &lt;br&gt;
Well, I was so fixated and overloaded with trying to find something big to suggest that my senses had completely shut down on the easy stuff. This made me realize just how much I need to practice reading other people's codes and thinking critically about them. Like attaining mastery in any skill, being a good code reviewer is a skill that takes time, patience, and practice. &lt;/p&gt;

&lt;h2&gt;
  
  
  Some code review best practices 🌱
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://google.github.io/eng-practices/review/reviewer/looking-for.html" rel="noopener noreferrer"&gt;This is a great article&lt;/a&gt; I came across while researching for the code review best practices. &lt;br&gt;
It beautifully elaborates on how design, functionality, complexity, testing, naming, commenting, style, consistency, documentation, and context are all important components of a code review. &lt;/p&gt;

&lt;h2&gt;
  
  
  Time. Attention. Communication ⏳‼️
&lt;/h2&gt;

&lt;p&gt;A good review takes time and attention. It requires us to think critically about the programming logic. For beginners, it can feel overwhelming to stare at the code someone else wrote to suggest something meaningful. There is a fear of being wrong. A fear of offending the person writing the code. I know, because I felt all those. However, in open-source development, it is always important to remain polite and respectful in communication while giving constructive feedback. We can sometimes disagree with the review but if we do so, we should communicate that politely. &lt;/p&gt;

&lt;p&gt;It is also important to keep an open mind while giving and receiving feedback. It is through this exchange of ideas, and feedback that we can improve over time. &lt;/p&gt;

&lt;p&gt;If you have some coding experience and spend enough time and give undivided attention to the code, it is almost always possible to come up with suggestions for improvement. &lt;/p&gt;

&lt;h2&gt;
  
  
  Start small 🐌 🌱
&lt;/h2&gt;

&lt;p&gt;If you are a beginner, start small and learn from others. I learned a lot of important things by reading professor Dave's reviews. Then I realized that it is by seeing how more experienced people review code, that I can get better. I made some notes of the things I learned by reading a lot of his code reviews on GitHub. I turned those things into some sort of a checklist:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask specific questions regarding certain lines of code, if unclear.&lt;/li&gt;
&lt;li&gt;Look for unused dependencies and ways to optimize package.json.&lt;/li&gt;
&lt;li&gt;Look at the code from the context of the entire codebase.&lt;/li&gt;
&lt;li&gt;Leave some words of encouragement to point out what the developer is doing right! &lt;/li&gt;
&lt;li&gt;Focus on functionality and compatibility.&lt;/li&gt;
&lt;li&gt;Look for clear names and proper naming conventions. &lt;/li&gt;
&lt;li&gt;When reviewing README or CONTRIBUTING.md files, look for consistency in style, formatting, spelling, and grammar. &lt;/li&gt;
&lt;li&gt;Make sure that the design and UI look good. &lt;/li&gt;
&lt;li&gt;Ensure that the unit tests are appropriately designed for the code. &lt;/li&gt;
&lt;li&gt;Make sure that the code conforms to a certain style guide provided.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My code reviews
&lt;/h2&gt;

&lt;p&gt;Here are the code reviews I did over the last few days. Click on the links to view the entire review :) &lt;/p&gt;

&lt;p&gt;While suggesting changes, I also provided the rationale behind suggesting the changes and asked for the developer's opinion. This kept communication professional and polite.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/humphd/my-photohub/pull/10#pullrequestreview-1179813555" rel="noopener noreferrer"&gt;Review 1&lt;/a&gt;
&lt;/h3&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%2Fw5uepmc7n5hj9f5g0iu2.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%2Fw5uepmc7n5hj9f5g0iu2.png" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/humphd/my-photohub/pull/9#pullrequestreview-1179806293" rel="noopener noreferrer"&gt;Review 2&lt;/a&gt;
&lt;/h3&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%2Fi5xukg5svkpbh7lhaoy6.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%2Fi5xukg5svkpbh7lhaoy6.png" alt=" " width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In &lt;code&gt;linters&lt;/code&gt; we trust 🚀
&lt;/h2&gt;

&lt;p&gt;Automated code checkers and static tool analyzers can help a reviewer save a lot of time looking for silly typos or stylistic errors. Linters and scanners act like spell and grammar checks for a code. With the headache of formatting and other stylistic issues out of the way, the reviewer can focus on the actual logic of the code. As code reviewers, it is essential to make use of the automated code checkers available to save time and sanity. &lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thoughts on productivity 💭
&lt;/h2&gt;

&lt;p&gt;If you are someone like me who loves reading about psychology and productivity, &lt;a href="https://jamesclear.com/focus#Focus%20on%20the%20Process" rel="noopener noreferrer"&gt;this is a great article&lt;/a&gt;! &lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>github</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>🧪🐍✨Unit Testing Python Code With The unittest Framework</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Mon, 14 Nov 2022 01:26:59 +0000</pubDate>
      <link>https://forem.com/saminarp/unit-testing-python-code-with-the-unittest-framework-21d8</link>
      <guid>https://forem.com/saminarp/unit-testing-python-code-with-the-unittest-framework-21d8</guid>
      <description>&lt;p&gt;Unit testing is an important part of software development as it isolates different components of a software program or system and checks if it operates the right way. It ensures that the code meets quality standards and that flaws or bugs in a system can be properly traced back to the isolated unit of code that is failing, and remedy the failure promptly. &lt;/p&gt;

&lt;p&gt;My static site generator - &lt;a href="https://github.com/saminarp/rwar" rel="noopener noreferrer"&gt;rwar&lt;/a&gt; is evolving and getting better over time, which means I need to ensure that the code is professional and of high quality! Also, being able to work with testing frameworks and learning them well can help you stand out during interviews. 😃&lt;/p&gt;

&lt;h2&gt;
  
  
  The learning curve 📚🧠
&lt;/h2&gt;

&lt;p&gt;I was not used to writing tests much for the personal projects and small group projects I have worked on so far, which is why thinking of code from a test-driven perspective was challenging for me. I could feel my neurons firing as I was trying hard to think how to put all the unit testing pieces together. Until now, I only had a little bit of experience working with the &lt;code&gt;Jest&lt;/code&gt; testing framework for JavaScript, and  &lt;code&gt;Junit&lt;/code&gt; for Java, so I had to go through a big learning curve to understand the &lt;code&gt;unittest&lt;/code&gt; framework. &lt;a href="https://realpython.com/python-testing/" rel="noopener noreferrer"&gt;This explanation&lt;/a&gt; was really useful for me to get an overview of what &lt;a href="https://docs.python.org/3/library/unittest.html" rel="noopener noreferrer"&gt;unittest&lt;/a&gt; is and how to get started with it. I used to underestimate the importance of reading documentation, but I know now how crucial that skill is. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why  &lt;code&gt;unittest&lt;/code&gt; framework❓
&lt;/h2&gt;

&lt;p&gt;Upon doing some research on some of the most popular testing frameworks for Python I came across &lt;code&gt;pytest&lt;/code&gt;, &lt;code&gt;nose&lt;/code&gt;, and &lt;code&gt;unittest&lt;/code&gt;. They are all great tools, however, I decided to give &lt;code&gt;unittest&lt;/code&gt; a try for this project because unittest was inspired by &lt;code&gt;JUnit&lt;/code&gt; which I had some prior experience with. It is always good to experiment and learn different frameworks to eventually find out what we like most. I am going to give &lt;code&gt;pytest&lt;/code&gt; a try for my next Python project.  Each testing framework has its conventions for naming files and structuring code, which is another important reason to look at examples and go through the documentation for the framework of your choice. &lt;/p&gt;

&lt;h2&gt;
  
  
  Having a good test plan 📝
&lt;/h2&gt;

&lt;p&gt;It is really important to have a good test plan before starting. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;1) Understanding what your code does&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What kind of inputs the function takes&lt;/li&gt;
&lt;li&gt;What are the program's functions &lt;/li&gt;
&lt;li&gt;What are the expected outputs &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;2) Good and bad test scenarios&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Think of the success cases and cases that are anomalies. For example, if you are building a school management system - adding the same student twice should result in some sort of warning. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;3) What does not need testing&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A good example of what does not need testing would be functions from external packages. Another example would be a program invoking functions where the code was already tested. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;4) Writing the tests&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Then, comes the test writing part!&lt;/li&gt;
&lt;li&gt;For example, if you are building a school management system - then you can test for functions such as adding students, loading an existing student, adding the same student twice, and so on. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The process 🔨
&lt;/h2&gt;

&lt;p&gt;For my project I have created two test files - &lt;code&gt;test_parser.py&lt;/code&gt; and &lt;code&gt;test_ssg.py&lt;/code&gt; - under the &lt;code&gt;test&lt;/code&gt; folder. &lt;/p&gt;

&lt;p&gt;As stated in this &lt;a href="https://realpython.com/python-testing/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;unittest&lt;/code&gt; requires that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You put your tests into classes as methods&lt;/li&gt;
&lt;li&gt;You use a series of special assertion methods in the &lt;code&gt;unittest.TestCase&lt;/code&gt; class instead of the built-in &lt;code&gt;assert&lt;/code&gt; statement&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;1) To get started with unittest I first had to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Then, I created a class &lt;code&gt;SSGTest&lt;/code&gt; that inherits from the &lt;code&gt;TestCase&lt;/code&gt; class and it is meant to test my &lt;code&gt;class SSG&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SSGTest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similarly, I have done this for my other test_parser.py file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CLIParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  An example:
&lt;/h3&gt;

&lt;p&gt;It is hard to go over all the test I have written for my project because there are many! However,&lt;br&gt;
here is an example from &lt;code&gt;test_parser.py&lt;/code&gt;. Notice, how I have used descriptive names for my test. Here I am checking if the test has any input files or not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CLIParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_without_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertRaises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="nf"&gt;get_parser_args&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No input directory provided&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;assertRaises()&lt;/code&gt; verifies that a specific exception gets raised.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertRaises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SomeException&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;do_something&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;assertEqual()&lt;/code&gt; checks for an expected result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertRaises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SomeException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;cm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;do_something&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;the_exception&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;
&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When to use setUp() and tearDown() ❓👀
&lt;/h2&gt;

&lt;p&gt;If you go through my code on &lt;code&gt;test_ssg.py&lt;/code&gt;, you will see that I have used the &lt;code&gt;setUp()&lt;/code&gt; and &lt;code&gt;tearDown()&lt;/code&gt; methods. For every test in test_ssg.py, a temporary file was created which needed to be deleted after the test, which is what I could accomplish with setUp() and tearDown(). These were repetitive processes that I could simplify using these methods. Imagine you have a suite with 10 tests and 7 of them require the same setup/teardown code, while the 3 don't, &lt;code&gt;setup&lt;/code&gt; and &lt;code&gt;teardown&lt;/code&gt; gives you a nice way to refactor the code. It is often used when we need to create a fake database for testing purposes or for mocking purposes. &lt;/p&gt;

&lt;p&gt;Here is an example of how I have used it in my code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SSGTest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tempdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tempfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TemporaryDirectory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tempdir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;

&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stylesheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test-stylesheet-link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tearDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tempdir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test discovery 💡
&lt;/h2&gt;

&lt;p&gt;Test discovery is the process of locating where the tests are in your codebase. This means that you don't have to explicitly state where the tests are located as the testing framework can automatically locate them based on the matching patterns of the naming convention. In this case, it will look for test*.py `files.&lt;/p&gt;

&lt;p&gt;As stated in the &lt;a href="https://docs.python.org/3/library/unittest.html" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Unittest supports simple test discovery. To be compatible with test discovery, all of the test files must be &lt;a href="https://docs.python.org/3/tutorial/modules.html#tut-modules" rel="noopener noreferrer"&gt;modules&lt;/a&gt; or &lt;a href="https://docs.python.org/3/tutorial/modules.html#tut-packages" rel="noopener noreferrer"&gt;packages&lt;/a&gt; importable from the top-level directory of the project (this means that their filenames must be valid &lt;a href="https://docs.python.org/3/reference/lexical_analysis.html#identifiers" rel="noopener noreferrer"&gt;identifiers&lt;/a&gt;).&lt;br&gt;
Test discovery is implemented in &lt;a href="https://docs.python.org/3/library/unittest.html#unittest.TestLoader.discover" rel="noopener noreferrer"&gt;&lt;code&gt;TestLoader.discover()&lt;/code&gt;&lt;/a&gt;, but can also be used from the command line. The basic command-line usage is:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
cd project_directory&lt;br&gt;
python -m unittest discover&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Upon running that command, it shows the number of passing and failing tests. I had two tests that were failing, so I went back and fixed those before pushing my changes to GitHub. &lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation ✏️
&lt;/h2&gt;

&lt;p&gt;A good software or system is properly documented. I used to underestimate the value of documentation until I participated in Hacktoberfest and had to work on large open-source projects. Some interesting projects I wanted to contribute to had unclear documentation and even though I wanted to work on them, I just couldn't. The projects I ended up contributing to were all properly structured and had clear documentation. &lt;/p&gt;

&lt;p&gt;The same goes for rwar. I am trying to write clear documentation so that anyone interested in using it or contributing to it will find it easy to do so. I have added the instructions for testing on the CONTRIBUTING.md file! &lt;/p&gt;

&lt;p&gt;For the full codebase, please feel free to &lt;a href="https://github.com/saminarp/rwar" rel="noopener noreferrer"&gt;check it out on GitHub&lt;/a&gt; :) &lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Part 2: Building a Cybersecurity Game with Three.js - Inspired by Google’s Interland</title>
      <dc:creator>Samina Rahman Purba</dc:creator>
      <pubDate>Wed, 09 Nov 2022 03:26:11 +0000</pubDate>
      <link>https://forem.com/saminarp/part-2-building-a-cybersecurity-game-with-threejs-inspired-by-googles-interland-1k6g</link>
      <guid>https://forem.com/saminarp/part-2-building-a-cybersecurity-game-with-threejs-inspired-by-googles-interland-1k6g</guid>
      <description>&lt;h2&gt;
  
  
  Preview 👾
&lt;/h2&gt;

&lt;p&gt;In part 1 of this series, I talked about how we were inspired by &lt;a href="https://beinternetawesome.withgoogle.com/en_us/interland/reality-river" rel="noopener noreferrer"&gt;Google Interland's Reality River&lt;/a&gt; and decided to build a cybersecurity game similar to it with three.js called &lt;a href="https://exploitt.herokuapp.com" rel="noopener noreferrer"&gt;Exploit&lt;/a&gt;. We wanted to create a lightweight browser-based game that would be fun, engaging, and educational. As complete beginners who are learning three.js for the first time and also our first game-building experience, we are happy with our progress. &lt;/p&gt;

&lt;p&gt;Each week we are working hard coding as a team, to meet our deadline of having a basic version of the game ready by mid-December 2022. We also wanted to publish weekly blogs as we believe it might help out others who are interested in game development to see what the process is like for beginners. We did not find many game development processes being blogged out so we believe documenting this will be of massive value to those interested in three.js, game development, open-source development, and collaborative coding! &lt;/p&gt;

&lt;p&gt;After our initial release in mid-December, we invite all developers interested in open-source to contribute to this project!&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new ❓🤖
&lt;/h2&gt;

&lt;p&gt;Our little game character that we call &lt;em&gt;threat hunter&lt;/em&gt;  is now able to jump from one building to another as it answers questions. Last time, we did not have any buildings or environments at all. However, this time our threat hunter and its question-answering ability is fully functional. &lt;/p&gt;

&lt;p&gt;This logic of our character jumping through buildings is very similar to Google Interland's game where the little character crosses a river successfully upon answering questions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; However,  the game is still buggy at the moment and we are working hard to debug them. The question display sometimes fails and sometimes the character keeps walking endlessly without stopping. But hey, it is okay, this is a work in progress and we are going through a huge learning curve working on this project.&lt;/p&gt;

&lt;p&gt;To check out our progress so far you can always visit our&lt;a href="https://github.com/orgs/XpI0It/repositories" rel="noopener noreferrer"&gt; GitHub repo &lt;/a&gt;for the game environments.  Please see the &lt;a href="https://github.com/XpI0It/3xploit/issues" rel="noopener noreferrer"&gt;GitHub issues&lt;/a&gt; as our project documentation. &lt;/p&gt;

&lt;p&gt;The code for &lt;a href="https://github.com/XpI0It/exploit-game-environments/blob/main/robot.js" rel="noopener noreferrer"&gt;our awesome character resides here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisgkq78xaaw697f2k8lu.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%2Fisgkq78xaaw697f2k8lu.png" alt=" " width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have also created some user stats such as modules completed, last score, and time taken to complete those modules. &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%2F8p13eiujgvs6agmc2bg1.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%2F8p13eiujgvs6agmc2bg1.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also have a dynamic leaderboard now which shows the scores of all the users playing the game for each module. For example, if I play the  &lt;code&gt;ransomware&lt;/code&gt; module, then my scores will appear under the &lt;code&gt;ransomware&lt;/code&gt; leaderboard dynamically. &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%2F0woa7mr8b0ger90vghgt.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%2F0woa7mr8b0ger90vghgt.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Experimenting 🔍🌘
&lt;/h2&gt;

&lt;p&gt;Until this point, we had to go through many trials and errors to figure out how the environment would come together. The &lt;a href="https://threejs.org" rel="noopener noreferrer"&gt;three.js documentation&lt;/a&gt; was our main source of guidance while implementing this project. We experimented with creating clouds, different positioning of the buildings, shadowing, and sphere geometry. In our environment, we have the moon, clouds, and buildings so far and of course, the game character that interacts with its environment. Since the moon was the very first component of the environment we worked on, I want to provide some code snippets to explain it. &lt;/p&gt;

&lt;h3&gt;
  
  
  The moon 🌙
&lt;/h3&gt;

&lt;p&gt;We started by working on the moon for a night sky. There are many things to consider while making a game environment. We find textures and think of the camera setup, renderer setup, and light directions. &lt;/p&gt;

&lt;p&gt;As shown in the code snippet below, we first defined the moon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// &amp;lt;Define Env Components&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 

&lt;span class="nx"&gt;moon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Mesh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SphereGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MeshPhongMaterial&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textures&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moonTexture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;displacementMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textures&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moonDisplacementMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;displacementScale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;bumpMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textures&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moonDisplacementMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;bumpScale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reflectivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;shininess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;emissive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;0xffffffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;emissiveMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textures&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moonTexture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;emissiveIntensity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;})),&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PointLight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xffffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;moon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What is mesh?
&lt;/h3&gt;

&lt;p&gt;A mesh is a collection of vertices, edges, and faces that describe the shape of a 3D object:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A vertex is a single point. The plural is "vertices". &lt;/li&gt;
&lt;li&gt;  An edge is a straight line segment connecting two vertices.&lt;/li&gt;
&lt;li&gt;  A face is a flat surface enclosed by edges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can kind of imagine it to be like the skeleton of an environment, to which we need to add texture on top to make it realistic. &lt;/p&gt;

&lt;h3&gt;
  
  
  What is texture?
&lt;/h3&gt;

&lt;p&gt;Textures add artistic control and realism of a game. For creating our moon, we had to download some realistic moon textures and then use the &lt;code&gt;textureLoader&lt;/code&gt; function to load them. We then read the documentation of sphere geometry and displacement maps to build the moon. Afterward, we set the moon's positions and gave it a point light.  So, what is point light? As written in their documentation, "A light that gets emitted from a single point in all directions. A common use case for this is to replicate the light emitted from a bare lightbulb."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moonDisplacementMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textureLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;displacement.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moonTexture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textureLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;moon.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moonBody&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Mesh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SphereGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MeshPhongMaterial&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;moonTexture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;displacementMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;moonDisplacementMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;displacementScale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;bumpMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;moonDisplacementMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;bumpScale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reflectivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;shininess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;emissive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;0xffffffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;emissiveMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;moonTexture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;emissiveIntensity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;three&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PointLight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xffffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;moon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;moonBody&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What is game physics? 👀
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Physics simulation is a field within computer science that aims to reproduce physical phenomena using a computer. In general, these simulations apply numerical methods to existing theories to obtain results that are as close as possible to what we observe in the real world. (Source: &lt;a href="https://www.toptal.com/game/video-game-physics-part-i-an-introduction-to-rigid-body-dynamics" rel="noopener noreferrer"&gt;Toptal&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Games are getting more and more realistic and part of this realism is also ensuring that the laws of physics we see in the real world also apply to the virtual gaming world. Things such as collision detection, gravity, joint movements, inertia, acceleration, and mass are all part of game physics. As someone who loves science, thinking of the game from a physics perspective was very exciting. &lt;/p&gt;

&lt;p&gt;Three.js usually works better with another physics engine such as Ammo.js. There are a handful of JavaScript physics engines available such as Matter.js, Planck.js, Cannon.js, Oimojs, and Ammo.js.  For this project, we will be experimenting with Ammo.js. We are not entirely sure yet how that will go in our initial release of this project, given the time constraint. We will find that out in the next blog. &lt;/p&gt;

&lt;h2&gt;
  
  
  Thoughts 💭
&lt;/h2&gt;

&lt;p&gt;This is, by far, the most challenging project I worked on in my college life. It is also occupying most of my time as learning all this amazing new JavaScript 3D library is time-consuming but also rewarding. &lt;/p&gt;

&lt;h2&gt;
  
  
  Moving forward...🚀
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1) Better use of GitHub
&lt;/h4&gt;

&lt;p&gt;As a team, we have not been keeping everything clean on GitHub. Moving forward it is going to be our focus to write cleaner code and organize the folders more to enhance professionalism. &lt;/p&gt;

&lt;h4&gt;
  
  
  2) Continuous improvement
&lt;/h4&gt;

&lt;p&gt;And of course.. we have a LOT to debug and keep working on for the game environments. &lt;/p&gt;

&lt;p&gt;This is going to be a many-part series so stay tuned for the next blog! &lt;/p&gt;

&lt;p&gt;Thank you all for reading and being part of this crazy game-building journey!! 🪐&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>gamedev</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
