<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rita {FlyNerd} Lyczywek</title>
    <description>The latest articles on DEV Community by Rita {FlyNerd} Lyczywek (@ritaly).</description>
    <link>https://dev.to/ritaly</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%2F156043%2F47660bf9-5d13-4a28-8d10-163d6262c703.jpeg</url>
      <title>DEV Community: Rita {FlyNerd} Lyczywek</title>
      <link>https://dev.to/ritaly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ritaly"/>
    <language>en</language>
    <item>
      <title>You’ve got Chat instead of a brain: how AI is messing up junior developers</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Tue, 17 Jun 2025 19:33:31 +0000</pubDate>
      <link>https://dev.to/ritaly/youve-got-chat-instead-of-a-brain-how-ai-is-messing-up-junior-developers-451k</link>
      <guid>https://dev.to/ritaly/youve-got-chat-instead-of-a-brain-how-ai-is-messing-up-junior-developers-451k</guid>
      <description>&lt;p&gt;I wasn’t sure if I should write this, and share these thoughts mmm... but hey, soon no one will be reading &lt;em&gt;humans&lt;/em&gt; anyway. &lt;/p&gt;

&lt;p&gt;No original ideas, just AI-generated content everywhere. So yeah, a bit of a rant this time, but what can you do, that’s the vibe these days. Let’s look at what happens when you rely too much on AI early in your career. And why companies, and finally managers, are starting to notice. And we are not so happy about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I’m not anti-AI. I use tons of AI-based tools myself 😉&lt;/p&gt;




&lt;h2&gt;
  
  
  It’s 2025. You’re entering IT.
&lt;/h2&gt;

&lt;p&gt;You’ve done some courses, maybe a bootcamp.&lt;br&gt;&lt;br&gt;
You know your way around Python, SQL, and you’ve started doing take-home tasks.&lt;br&gt;&lt;br&gt;
And then you discover ChatGPT. Well, not just now – it’s been around since late 2023 – but let’s say you’re just now discovering ✨~ vibe coding ~✨ &amp;amp; 10xDevelopers. You start asking the chatbot everything: how to write a function, how to set up tests, how to fix this weird error. At first – wow. And then… well.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI does too much, we think too little
&lt;/h2&gt;

&lt;p&gt;Generative AI in dev work is &lt;em&gt;hot&lt;/em&gt;. Everyone’s using it, because, let’s be honest - it works. Code comes out faster, you can test ideas on the fly.  &lt;/p&gt;

&lt;p&gt;But more and more people are doing something else: instead of understanding what they’re writing – they just throw in a prompt and see what the model spits out. The result? The code works, but no one knows why. And if it &lt;em&gt;doesn’t&lt;/em&gt; work? &lt;br&gt;
Next prompt. &lt;br&gt;
And another. &lt;/p&gt;

&lt;p&gt;Then just panic 😱&lt;/p&gt;

&lt;p&gt;Chat writes your functions, Copilot reviews the code. One AI codes, another runs the checks. &lt;br&gt;
Time to pop some champagne, right?&lt;/p&gt;

&lt;p&gt;Mentors and team leads keep saying the same thing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;juniors write code they can’t explain,
&lt;/li&gt;
&lt;li&gt;copy stuff blindly without knowing if it’s safe,
&lt;/li&gt;
&lt;li&gt;have no clue how the systems they build actually work.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, it’s not a &lt;em&gt;new&lt;/em&gt; problem. Copy-pasting StackOverflow answers without thinking has been around for years. But I haven’t seen this level of &lt;em&gt;mental shutdown&lt;/em&gt; in over a decade.&lt;/p&gt;

&lt;h2&gt;
  
  
  StackOverflow vs now
&lt;/h2&gt;

&lt;p&gt;In real life: someone builds a login feature but doesn’t know the difference between GET and POST. JWT? Rings a bell, but not sure where.  &lt;/p&gt;

&lt;p&gt;Or they use AI to generate unit tests – without understanding what those tests are even proving. Whether they’re covering test paths at all. Not to mention the AI mocking an entire class and then testing the mock itself. Yikes.&lt;/p&gt;




&lt;h2&gt;
  
  
  When AI breaks, so does the dev workflow
&lt;/h2&gt;

&lt;p&gt;In March 2025, ChatGPT went down hard. Then again a few days ago.&lt;br&gt;&lt;br&gt;
What happened? Chat was offline for just a few hours. Reddit lit up with posts like “Guess I’ll grab coffee.” Half-joking, half-not.&lt;br&gt;&lt;br&gt;
But the real issue? &lt;br&gt;
Without AI, work stops. &lt;br&gt;
Not because things are slower – but because people literally don’t know what to do without hints.&lt;/p&gt;

&lt;p&gt;That’s a &lt;em&gt;real&lt;/em&gt; problem – especially for folks just learning to code. No base knowledge: no grasp of the language, data structures, or how to debug anything.&lt;/p&gt;

&lt;p&gt;AI isn’t the problem.&lt;br&gt;&lt;br&gt;
Treating it as a replacement for knowledge is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Vibe coding – this is no longer fun
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“It works, but no idea why.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Again – not new.&lt;br&gt;&lt;br&gt;
What’s new? The &lt;em&gt;scale&lt;/em&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%2Fqvvh4x2pudejeao0abu4.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%2Fqvvh4x2pudejeao0abu4.jpg" alt="my code doesn’t work idk why" width="700" height="1025"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But shhh – we don’t talk about how much AI is doing for us.&lt;br&gt;&lt;br&gt;
Teams are starting to feel the pain.&lt;br&gt;&lt;br&gt;
Whole companies are.  &lt;/p&gt;

&lt;p&gt;This “vibe coding” is everywhere – code that looks fine, runs okay, but underneath? It’s chaos. No tests, no structure, no understanding.&lt;/p&gt;

&lt;p&gt;This isn’t about juniors being lazy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;74 GB per day – that's how much info we consume on average&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The kind of info a well-educated person in the Middle Ages would take a lifetime to absorb.&lt;br&gt;&lt;br&gt;
Evolution doesn’t move that fast. The brain isn’t lazy – it’s overloaded.&lt;/p&gt;

&lt;p&gt;What I mean is:&lt;br&gt;&lt;br&gt;
🧠 AI today gives us a &lt;strong&gt;false sense of competence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Someone using ChatGPT can produce code that looks like mid-level dev work – but &lt;em&gt;can’t maintain it, extend it, or secure it&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security isn’t just a prompt
&lt;/h2&gt;

&lt;p&gt;AI-generated code often has security flaws. Not because AI is dumb – but because it has zero context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it doesn’t know your compliance rules,
&lt;/li&gt;
&lt;li&gt;it doesn’t know your architecture,
&lt;/li&gt;
&lt;li&gt;it doesn’t know your threat model.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might get an encryption function that &lt;em&gt;looks&lt;/em&gt; fine, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uses an outdated algorithm,
&lt;/li&gt;
&lt;li&gt;has no input validation,
&lt;/li&gt;
&lt;li&gt;works only in example X.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you won’t notice – unless you &lt;em&gt;already&lt;/em&gt; know how secure code works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source licenses and other traps
&lt;/h2&gt;

&lt;p&gt;AI often generates code it saw in training – including stuff from GitHub, StackOverflow, and elsewhere.&lt;br&gt;&lt;br&gt;
What does that mean? It might suggest code with unclear licensing. Drop it into your project – and now you’ve got legal issues. Not technical – legal.&lt;/p&gt;

&lt;p&gt;A snippet under GPL? You can’t just use that in a closed-source app without specific steps.&lt;br&gt;&lt;br&gt;
AI won’t tell you that.&lt;/p&gt;

&lt;p&gt;Wasn’t copy-pasting StackOverflow the same?&lt;br&gt;&lt;br&gt;
Well… not quite. You weren’t feeding it &lt;em&gt;four full files&lt;/em&gt; and saying “write me X.” Using code from the internet, snippets, blog fragments – that at least forced you to &lt;em&gt;understand&lt;/em&gt; what you were pasting. Change function names, tweak logic, test it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who are companies hiring now?
&lt;/h2&gt;

&lt;p&gt;We’re seeing a clear shift in hiring. Code alone isn’t enough.&lt;br&gt;&lt;br&gt;
What matters now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architectural and systems thinking,
&lt;/li&gt;
&lt;li&gt;deep understanding of security,
&lt;/li&gt;
&lt;li&gt;resistance to “AI blindness” – blindly trusting model output.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some companies are already testing this: can the candidate &lt;em&gt;code&lt;/em&gt;, or do they just &lt;em&gt;know what to prompt&lt;/em&gt;?&lt;br&gt;&lt;br&gt;
There’s a big difference.&lt;br&gt;&lt;br&gt;
Live coding from a mockup. Screen sharing. And yes (&lt;em&gt;gasp&lt;/em&gt;) interviews in the office again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What now?
&lt;/h2&gt;

&lt;p&gt;Don’t stop using AI.&lt;br&gt;&lt;br&gt;
Just use it &lt;em&gt;smartly&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
It’s a great tool for exploring options, generating boilerplate, automating the boring stuff.&lt;br&gt;&lt;br&gt;
Writing emails, improving communication, helping you learn – yes.&lt;br&gt;&lt;br&gt;
But it won’t replace understanding algorithms, systems, or cause-effect logic.&lt;/p&gt;

&lt;p&gt;Companies investing in juniors (yes, those still exist – stop saying they don’t) are already shifting their approach to training and hiring.  &lt;/p&gt;

&lt;p&gt;More real-world tasks, less theory.&lt;br&gt;&lt;br&gt;
Fewer “what does this function do,” more “what happens if this breaks?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;If you’re just starting out Today - treat AI as a &lt;strong&gt;co-pilot&lt;/strong&gt;, not an &lt;strong&gt;autopilot&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Learn to code. &lt;br&gt;
Learn to think. &lt;br&gt;
Learn to &lt;em&gt;search&lt;/em&gt;, not just &lt;em&gt;ask&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;Debug manually before asking for help. Try to understand before you copy.&lt;/p&gt;

&lt;p&gt;Because tech will change.  &lt;/p&gt;

&lt;p&gt;But your ability to think clearly, think logically and understand what you’re doing - that stays.&lt;/p&gt;

&lt;p&gt;And that’s what will separate people who “asked the AI” from those who truly know how to code – and talk to machines for real.&lt;/p&gt;




&lt;p&gt;PS: I published this article in polish on my blog:&lt;br&gt;
&lt;a href="https://www.flynerd.pl/2025/06/chyba-masz-chat-zamiast-mozgu-czy-ai-psuje-programistow.html" rel="noopener noreferrer"&gt;Chyba masz Chat zamiast mózgu… czy AI psuje programistów?&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>chatgpt</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Why your site needs a sitemap?</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Sun, 15 Jun 2025 14:57:50 +0000</pubDate>
      <link>https://dev.to/ritaly/why-your-site-needs-a-sitemap-23if</link>
      <guid>https://dev.to/ritaly/why-your-site-needs-a-sitemap-23if</guid>
      <description>&lt;p&gt;We don’t build websites just to admire them ourselves (ok.. sometimes we do). &lt;br&gt;
We want them seen. &lt;br&gt;
Indexed. &lt;br&gt;
Found. &lt;/p&gt;

&lt;p&gt;That’s where sitemaps come in. They’re not glamorous, but they do serious behind-the-scenes work. So let’s break down what they are, why they matter, and when you actually need one.&lt;/p&gt;

&lt;h3&gt;
  
  
  First things first: what is a sitemap?
&lt;/h3&gt;

&lt;p&gt;A sitemap is a simple XML file that lists the pages on your site. Think of it as a guide for search engine bots. It tells them:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what pages exist,
&lt;/li&gt;
&lt;li&gt;when they were last updated,
&lt;/li&gt;
&lt;li&gt;how important they are compared to others,
&lt;/li&gt;
&lt;li&gt;how often they change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t something your users will ever see. It’s strictly for bots like Googlebot, Bing, Yahoo etc . For SEO, it’s one of the must-have requirements. It helps search engines crawl your site more efficiently. And the more efficiently they crawl, the better your pages get indexed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do all websites need a sitemap?
&lt;/h3&gt;

&lt;p&gt;No. But most sites benefit from having one. A sitemap makes a real difference if:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your site has more than just a few pages,
&lt;/li&gt;
&lt;li&gt;you’re publishing content regularly (blog posts, products, articles),
&lt;/li&gt;
&lt;li&gt;your internal linking isn’t perfect (and let’s be honest, whose is?),
&lt;/li&gt;
&lt;li&gt;you’ve got dynamic pages that aren’t easily discoverable,
&lt;/li&gt;
&lt;li&gt;you care about SEO even a little.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even small sites can benefit. It’s low effort and high potential return.&lt;/p&gt;

&lt;h3&gt;
  
  
  Okay, but what does it actually do for you?
&lt;/h3&gt;

&lt;p&gt;Here’s what a sitemap helps with in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speeding up indexing&lt;/strong&gt;: new pages get noticed faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making sure nothing gets missed&lt;/strong&gt;: pages without links won’t slip through the cracks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Helping with site updates&lt;/strong&gt;: uncle Google knows what changed and when.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporting structured data&lt;/strong&gt;: sitemaps can include extra metadata (for videos, images, news, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like handing Google a map instead of hoping it’ll find its way on its own. Less guesswork and waiting for bot visits.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you make one?
&lt;/h3&gt;

&lt;p&gt;Most CMSs like WordPress, Webflow, Shopify, or Ghost handle this for you. If you’re running a custom site, you can generate one with tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Yoast SEO&lt;/em&gt; (for WordPress)
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Screaming Frog&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;XML-sitemaps.com&lt;/em&gt;)
&lt;/li&gt;
&lt;li&gt;Static site generators like Hugo or Jekyll have own plugins too&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just don’t forget to submit it in &lt;strong&gt;Google Search Console&lt;/strong&gt; and &lt;strong&gt;Bing Webmaster Tools&lt;/strong&gt;. It takes a minute, and it’s worth it!&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%2Fgp184ozmzniiv0dwdnl0.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%2Fgp184ozmzniiv0dwdnl0.png" alt="Add sitemap to google search console" width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What if your site has 10 pages?
&lt;/h3&gt;

&lt;p&gt;Still worth it. Google won’t penalize you for being organized. A sitemap doesn’t hurt performance or SEO – it’s just a signal. If you’re making updates or adding content, a sitemap is how you keep search engines in the loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR?
&lt;/h3&gt;

&lt;p&gt;If your site has more than a landing page and a contact form, you want a sitemap. It's not about traffic hacks or playing with algorithms  it's about giving search engines a clear view of your site. So they crawl the right stuff, skip the junk, and keep up when you publish something new. Sure, it doesn’t guarantee you a higher ranking position - but it gives you a clean shot at being seen.&lt;/p&gt;

&lt;p&gt;It’s simple. It works. And there’s really no downside.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>website</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>My Prespective After 9 Years of Coding</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Wed, 06 Mar 2024 21:11:18 +0000</pubDate>
      <link>https://dev.to/ritaly/empowering-growth-lessons-learned-after-9-years-of-coding-5ec1</link>
      <guid>https://dev.to/ritaly/empowering-growth-lessons-learned-after-9-years-of-coding-5ec1</guid>
      <description>&lt;p&gt;I want to share &lt;strong&gt;&lt;a href="https://dev.to/devteam/wecoded-2024-empowering-change-for-gender-equity-in-tech-30nj"&gt;#we_coded&lt;/a&gt;&lt;/strong&gt; thoughts as an opportunity to say - use your voice in various ways, especially to support each other on the dev journey.&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%2F4jonvxoapf61besu7j2k.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%2F4jonvxoapf61besu7j2k.jpg" alt="we_coded 2024" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've started my blog in 2016 and initially &lt;strong&gt;I felt embarrassed to admit it was mine&lt;/strong&gt;. I didn't sign it and wouldn't confess it was me writing, even though my closest friends knew I was writing about programming. &lt;/p&gt;

&lt;p&gt;It wasn't that I was ashamed of writing about code, but rather that I felt incompetent. Not ready to face criticism and unpleasant comments. I was still studying Faculty of Computing Science and working as a Junior to be "allowed" to speak about programming. I knew too little, but I also I’d love to share my current stage of the knowlegde to those who needed it.&lt;/p&gt;

&lt;p&gt;I was too afraid to use my voice openly.&lt;/p&gt;

&lt;p&gt;Even when, I was presenting at Frontownia a front-end meeting (on "How to build landing pages that convert like crazy") and  mentor at PyCode Workshops 2015, and later Django Girls and so on..., but I always felt it was not enough. &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%2Fgdutjwelytdr87wiw4bg.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%2Fgdutjwelytdr87wiw4bg.jpeg" alt="frontownia 2015" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;Frontownia 2015&lt;/center&gt;




&lt;p&gt;There were many moments in my coding career when I just wanted to cry because I didn't know how to move forward or couldn't fix an issue.&lt;/p&gt;

&lt;p&gt;But I survived. &lt;br&gt;
&lt;strong&gt;And it have been 9 years!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today, I work at a great company as Software Engineer and spare my time to the &lt;strong&gt;&lt;a href="https://codeme.pl/" rel="noopener noreferrer"&gt;foundation CODE:ME&lt;/a&gt;&lt;/strong&gt;, mentoring, teaching programming. &lt;br&gt;
I have founded a local women's tech community, organize groups &amp;amp; meetings - &lt;strong&gt;&lt;a href="https://www.linkedin.com/company/nerds-coding-gang" rel="noopener noreferrer"&gt;Nerds Coding Gang&lt;/a&gt;&lt;/strong&gt;, and maintain a blog (&lt;strong&gt;&lt;a href="https://www.flynerd.pl/" rel="noopener noreferrer"&gt;flynerd.pl&lt;/a&gt;&lt;/strong&gt; with free python course in polish). &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%2Fja7wxn157kb4tawdj255.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%2Fja7wxn157kb4tawdj255.jpeg" alt="Nerds Coding Gang" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;Nerds Coding Gang - first offline meetup 2023&lt;/center&gt;




&lt;p&gt;I offer support to everyone to prevent those unnecessary tears over "it's just a machine" and "it's just a code".&lt;/p&gt;

&lt;p&gt;Last year, I received the Women Who Code, Technologies to Watch Award. Did I deserve it? I don't know, but it definitely made me think and act, realizing that someone is watching and I can be an inspiration. My sister found her path to IT, I hope you are on yours too. &lt;/p&gt;

&lt;p&gt;Here are some tips if you're just starting your career as a developer, regardless of your identity.&lt;/p&gt;

&lt;h3&gt;
  
  
  You don't have to love your job, but why spend 8 hours a day on something you hate?
&lt;/h3&gt;

&lt;p&gt;Ok, I love what I'm doing, and at times, I hate it. It's a love-hate relationship. &lt;strong&gt;If you imagine programmers as people from whose fingertips only clean and functional code flows, then… you have a vivid imagination&lt;/strong&gt; 😉&lt;/p&gt;

&lt;p&gt;Programming is actually a tedious task, and the number of lines of code produced is often inversely proportional to the time spent thinking about the complexity of a given problem and finding a solution. Sometimes the most efficient code is just two lines long, and sometimes a task titled "simple UI changes" turns out to be an 8-day backend task, whose visible end result is displaying an additional column in a table. And this is not hyperbole, but a real-life example.&lt;/p&gt;

&lt;p&gt;There are days when reality hits you in the face, and you have to deal with it, feeling frustrated that technology isn't responding to you.&lt;/p&gt;

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

&lt;center&gt;PythonAnywhere decided to act more like PythonNowhere (Django Girls Warsaw 2015)&lt;/center&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%2Fwsfyqb7fltoc4g3vecmp.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%2Fwsfyqb7fltoc4g3vecmp.png" alt="PyCodeCarrots" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;During PyCode Carrots, I literally hit my face on the column and needed break from coding&lt;/center&gt;




&lt;p&gt;Once (in was 2013) I wrote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"While searching for a solution to a given task or algorithm, I often feel like a homing pigeon searching for its route...&lt;br&gt;
I forgot to add:&lt;br&gt;
...a blind homing pigeon that suffers from a fear of heights and Alzheimer's."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Everyone has started at some point and felt this way.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Coding is also about working with people
&lt;/h3&gt;

&lt;p&gt;Once, I thought programming was a calm, stress-free, well-paid job. Today, I know that only the last part is true 😉 Maybe it's also a matter of approach, but I can't stand leaving work with my code not working. &lt;br&gt;
It has to be 1:0 for me, end of story. (But lastly, I'm working at my stress-free attitude - wish me luck)&lt;/p&gt;

&lt;p&gt;If it doesn't work out – tough, QA will joyfully hit the "rejected" button. &lt;/p&gt;

&lt;p&gt;You have to learn from mistakes. Over the last 8 years, I've gained a vast amount of technical skills, but also discovered what "teamwork" really means, and learned quite a bit about myself. Example, I'm not naturally a "team player". I prefer to concentrate on tasks within my own bubble. And that's ok - I'm able to work through it. At the same time, I'm a natural leader with the ability to convince others of my ideas, yet I have also learned how to listen more. I have become the coworker I would prefer to meet, finding ways to effectively collaborate with my team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't be afraid to ask questions
&lt;/h3&gt;

&lt;p&gt;Learning when to ask for help is an important part of being a developer. When I was a Junior, I didn't want to be the person who constantly asks silly questions. On the other hand, I didn't want to spend hours on something, having a nervous breakdown, when the help of a more experienced developer could simply save a lot of time and stress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There’s no silly questions. And yes, you can and you definitely will repeat same questions. Until finally, you understands.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I started my internship, I was told to &lt;strong&gt;spend 30 minutes searching, and if I didn't know what and how – to ask and not waste time&lt;/strong&gt;. The worse situation is when you don't even know what to ask about.&lt;/p&gt;

&lt;p&gt;Find a mentor and ask questions, there's nothing wrong in it.&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%2Fup65pdmde7o3ivfei58r.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%2Fup65pdmde7o3ivfei58r.jpeg" alt="javascript mentoring" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;Poznań JavaScript Meet-up 2018&lt;/center&gt;




&lt;h3&gt;
  
  
  Don't be afraid to start, seniors start too
&lt;/h3&gt;

&lt;p&gt;You should start from the beginning. Every child in preschool knows this. Unfortunately, it's not always possible.&lt;/p&gt;

&lt;p&gt;When I started working, I joined a company that operates in the market. We develop code that has been evolving for several years. New features are added, bugs are fixed, old code needs refactoring, and some of it we say goodbye to forever. &lt;/p&gt;

&lt;p&gt;The domain knowledge or project-specific knowledge is vast, and &lt;strong&gt;acquiring this knowledge always takes time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your career path is a journey or marathon, not a sprint. You grow in your own time.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rubber Duck method and all little steps
&lt;/h3&gt;

&lt;p&gt;To this day, I use the rubber duck method.&lt;br&gt;
Really! &lt;strong&gt;Although I thought that the whole idea of talking to an object was a joke, I myself experienced that vocalizing my thoughts aloud suggests a solution.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It also happens that by introducing another developer to the task, we are forced to recount everything we already know. It's possible that at that moment, the solution will present itself.&lt;/p&gt;

&lt;h2&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%2Fw9w5l7thbihhtwxjh130.jpeg" alt="Rubber Duck" width="800" height="1200"&gt;
&lt;/h2&gt;

&lt;p&gt;Writing down steps or creating flowcharts of how I want to solve a problem can help. This is also a good basis for discussion with another developer when something doesn't work out. Then, it could turns out that I was missing some information, which I would never have figured out on my own, or it would have taken me a tremendous amount of time, and all I needed to do was ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dev Journal
&lt;/h2&gt;

&lt;p&gt;Write down interesting statements or intriguing snippets of code. I collect all tips, pro-tips, and useful information in my notes. They are enriching, but selection is necessary - there are so many interesting topics that there's no time to dedicate to each one of them.&lt;/p&gt;

&lt;p&gt;I write it down too little, but partly that's what my blog and dev.to are for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nevertheless, #We_Coded! 🦄
&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%2Fgxef87zgohr9shyrwyrb.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%2Fgxef87zgohr9shyrwyrb.jpeg" alt="We Coded" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I was starting out, initiatives for women in tech were just beginning to gain momentum. Offensive or just unpleasant jokes were quite commonplace (one of very popular during my studies: "Two girls are walking, one is ugly and the other is also from IT"), and women constituted only 10% of Computer Science programs (now slowly growing). &lt;/p&gt;

&lt;p&gt;I don't believe in artificial quotas, but I have personally experienced that being the only girl in the room is not... pleasant. You need role models for growth. When you see other people similar to you, your presence no longer feels out of place. You don't feel odd. It has nothing to do with whether I work well with men or not. Again, currently, I am the only woman in a team of 10 developers, such is life in tech roles.&lt;/p&gt;

&lt;p&gt;Sharing space with people who reflect different perspectives - with whom we don't have to agree, enriches the work environment and builds a sense of belonging and acceptance, as opposed to isolation. Everyone, from juniors, should feel like a valuable member of the team. Let give each other space to use their voices.&lt;/p&gt;

&lt;p&gt;We have achieved significant social progress since when I started, making IT much more diverse &amp;amp; inclusive space. But it would not have been possible without efforts to create a more inclusive environment, driven by all allies. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's keep doing this, keep creating an open and empathetic environment.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>career</category>
      <category>learning</category>
      <category>development</category>
    </item>
    <item>
      <title>Poorly managed IT project – it's not your responsibility</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Thu, 29 Feb 2024 09:29:50 +0000</pubDate>
      <link>https://dev.to/ritaly/poorly-managed-it-project-its-not-your-responsibility-4l2m</link>
      <guid>https://dev.to/ritaly/poorly-managed-it-project-its-not-your-responsibility-4l2m</guid>
      <description>&lt;p&gt;&lt;em&gt;This text was originally published on my blog in Polish 🇵🇱 "&lt;a href="https://www.flynerd.pl/2024/02/zle-zarzadzany-projekt-it-to-nie-twoja-odpowiedzialnosc.html" rel="noopener noreferrer"&gt;Źle zarządzany projekt IT – to nie Twoja odpowiedzialność&lt;/a&gt;" (if you have any comments, please leave it bellow! thank you in advance)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poorly managed IT project – it's not your responsibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;..unless you are the Project Manager, Product Manager, Product Owner, etc. 😉 In other words, if you're not the project manager, then stop taking on responsibility that isn't yours.&lt;/p&gt;

&lt;p&gt;Lately, on social medias, I've been reading a lot of posts about being overworked in projects, taking overtime, delivering something that was sold, the business accepted, the client expects, and the developer has to conjure up. Sometimes that's how it looks, and there's nothing we can do about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it really true that we, as a dev team, can't do anything?
&lt;/h2&gt;

&lt;p&gt;As a team that delivers the solution and is responsible for it from an engineering perspective, &lt;strong&gt;we have the right and even the obligation to inform what is possible to achieve within the given timeframe&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Of course, in an ideal world, the team should estimate the tasks and provide the delivery time. But few of us live in an ideal world. &lt;/p&gt;

&lt;p&gt;Often, even in a well-managed project, there comes a time when the business wants something "right now," "yesterday," or in a more optimistic scenario: someone non-technical has estimated the delivery time without asking the developers for their opinion and comes with the information – "this needs to be done – when? – for next quarter."&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%2Fhammrwl6gkykha3p6pey.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%2Fhammrwl6gkykha3p6pey.png" alt="Greatest inspiration is deadline" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sounds like a lot of time?&lt;/strong&gt;&lt;br&gt;
As always: &lt;em&gt;it depends…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It depends on what needs to be delivered. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new landing page, a small SPA (Single Page Application) on a ready framework – sure.&lt;/li&gt;
&lt;li&gt;Rebuilding a site with a 10-year history and data migration… hmm, not necessarily.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why it's important for a dev team to be aware of their role and communicate what is realistically achievable in the given time.&lt;/p&gt;

&lt;p&gt;One could argue that the role of a programmer or engineer is not limited to coding but also involves active participation in the life of the project. Ultimately, it's our ability to communicate clearly that determines whether we can avoid overwork and frustration in the project.&lt;/p&gt;

&lt;p&gt;However, often &lt;strong&gt;the decision is made outside the development team&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At the same time, members of the development team often take on the responsibility or have &lt;strong&gt;the responsibility thrust upon them for the project's shortcomings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nevertheless, it's important to understand the limits of this responsibility.&lt;/p&gt;

&lt;p&gt;Are you not a PM, PMO, or PO? Then why should you bear the burden that is not yours to carry? &lt;br&gt;
Many people forget to ask themselves this question. &lt;br&gt;
Worse, they accumulate frustrations from the failure of projects. Often projects that were doomed from the start (I mean, of course, failure in terms of delivery time 😉).&lt;/p&gt;

&lt;p&gt;No matter how much we want our project to succeed. Regardless of our level of advancement, degree of experience, and position. &lt;strong&gt;It is important to remember common sense and our own limits.&lt;/strong&gt; Working overtime, stressful deadlines, attempts to deliver the impossible – all this can do more harm than good. Both for the project and for our own health.&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%2Fv8o2hx6x44sgn4c2x3ep.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%2Fv8o2hx6x44sgn4c2x3ep.png" alt="project or myself" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What can we do when it's not too late yet?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  First of all: communication
&lt;/h3&gt;

&lt;p&gt;I'll repeat myself, but communication is essential for understanding expectations and realistic possibilities. An open conversation with the project manager, presenting realistic time estimates, as well as indicating potential problems and challenges, is fundamental. These matters cannot be left to the last moment, hoping that things will somehow work out. Proactivity and honesty in communication. Miracles won't happen, but it's also about being honest with ourselves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second, education
&lt;/h3&gt;

&lt;p&gt;Sometimes project managers or clients do not fully understand the technical aspects of the project. &lt;strong&gt;It's our role, as experts, to explain why certain solutions require more time, and why some changes can be costly or risky&lt;/strong&gt;. Educating others about our work not only builds mutual respect but also helps in better planning and managing expectations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finally: assertiveness
&lt;/h3&gt;

&lt;p&gt;The art of saying "no" or "this is impossible in the given timeframe" is not a sign of weakness or lack of commitment. It's a sign of professionalism and a realistic approach to the project. Not every request or requirement is realistic, and it's our job to ensure that the project is carried out in a way that is both feasible and does not harm the team or leave a problem for future generations.&lt;/p&gt;




&lt;p&gt;Management is a separate skill. The team works towards success, and each team member has their role and responsibility.&lt;/p&gt;

&lt;p&gt;We did what we could – &lt;strong&gt;we communicated the problems, explained where the risks come from, and said that the expected solution is not achievable in the allocated time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We go back to our work, not taking on excessive burdens. Ultimately, if the above efforts did not help, &lt;strong&gt;it is no longer our responsibility.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>management</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Why I Love Nrwl Nx and Why You Should Too ;)</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Mon, 19 Feb 2024 15:01:32 +0000</pubDate>
      <link>https://dev.to/ritaly/why-i-love-nrwl-nx-and-why-you-should-too--5ep8</link>
      <guid>https://dev.to/ritaly/why-i-love-nrwl-nx-and-why-you-should-too--5ep8</guid>
      <description>&lt;p&gt;🤖 Disclaimer: 🤖&lt;br&gt;
I wasn't the person who introduced Nx to our project. Here is a huge shout-out &amp;amp; kudos to Damian Bielecki. I joined the project that was already up and running. &lt;/p&gt;

&lt;p&gt;And to be honest, initially, I was not convinced. A monorepo sounded counter-intuitive to me. WHY one big repo for many apps? 🤔 Sounds like a developer's nightmare for maintaining and management. And probably it can be, when you do this without the right strategies and right tools. &lt;br&gt;
&lt;strong&gt;Nx is our right tool&lt;/strong&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%2Fwzlc03yac3566jzis97i.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%2Fwzlc03yac3566jzis97i.png" alt="Nx is the way" width="800" height="996"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  So, what exactly is a monorepo?
&lt;/h2&gt;

&lt;p&gt;First off, our repository is what's known as a "&lt;strong&gt;monorepo&lt;/strong&gt;". This means that instead of managing multiple apps and libraries across separate repositories, we handle them all within a single repository. To effectively manage our monorepo, we use Nrwl Nx.&lt;/p&gt;

&lt;p&gt;Nx tools provide us with the capabilities to run only the projects that are affected by changes, cache results, and more. &lt;/p&gt;
&lt;h2&gt;
  
  
  Applications and Libraries
&lt;/h2&gt;

&lt;p&gt;In a monorepo, applications and libraries are 2 basic components.&lt;/p&gt;
&lt;h3&gt;
  
  
  Application:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;can be transformed into a deployable artifact&lt;/li&gt;
&lt;li&gt;holds configurations for its building process&lt;/li&gt;
&lt;li&gt;holds configurations for running its tests&lt;/li&gt;
&lt;li&gt;can utilize code from libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Library:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;consists of code that can be utilized by applications or other libraries, can utilize code from other libraries&lt;/li&gt;
&lt;li&gt;holds configurations for running its tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📦.
 ┣ 📂apps
 ┃ ┣ 📂 auth-service
 ┃ ┣ 📂 management-service
 ┃ ┣ 📂 web-service
 ┃ ┗ subs-service
 ┃   ┣ 📂 sls
 ┃   ┣ 📂 sls-api
 ┃   ┗ 📂 sls-e2e
 ┣ 📂libs
 ┃ ┗ 📂 shared
 ┃   ┗ 📂 utils
 ┗ 📂tools
   ┗ 📂 generators
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you see monorepo includes several applications and libraries (and could be more... like tools).&lt;/p&gt;

&lt;p&gt;Suppose you update a library in your project. &lt;br&gt;
Naturally, this library might be used by two or more apps (or microservices etc.). In such cases, you need to test the change against those dependent apps to ensure the updated library is backward compatible.&lt;br&gt;
As a developer and a human, I'm aware that my thought process and workflow can sometimes be unreliable. Although the app is well-covered with tests (let's even say perfectly, following the test pyramid), if you have many dependent apps, you still need to remember to update the lib version, run those tests, and sometimes you might forget about that one little-used service somewhere.&lt;/p&gt;

&lt;p&gt;With Nx, this is no longer an extra task for my brain. Nx automatically runs the projects affected by your changes. So, when you update something, Nx identifies all the code impacted by this change and automatically runs tests for those projects for you.&lt;/p&gt;

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

&lt;p&gt;Adding a little magic to the mix, you can check which projects are affected by your changes with a simple command - &lt;code&gt;nx affected&lt;/code&gt; - and even see a cool visualization of the affected projects as a graph. &lt;/p&gt;

&lt;p&gt;This reassures us that releasing code, which alters several applications at once, won’t result in any breaking changes. This is not just a nice-to-have; it's a massive improvement, especially when it comes to deploying. You know exactly what needs to be deployed together with the new changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioning simplified
&lt;/h2&gt;

&lt;p&gt;In my previous organization, I witnessed firsthand navigating through the versioning chaos. It was a struggle, maybe not daily, but frequent enough to notice. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; you bump a library version in one repo, then you need switch to 3 different repositories to ensure the update is applied. But only to those projects that are still being maintained – and that's assuming you're in the loop of knowledge and have the needed access. &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%2Frx1o8rmis79sumyuxwjd.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%2Frx1o8rmis79sumyuxwjd.png" alt="version bump across repos" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even with a tight process, up-to-date documentation, and checklists in check, it wasn’t uncommon to find deprecated functions still being used, long after they should have been phased out.&lt;/p&gt;

&lt;p&gt;With Nx in our monorepo setup, things are starkly different. Every app within the monorepo uses a single version of a dependency. And... this dependency &lt;strong&gt;gets updated automatically with every merge to master&lt;/strong&gt;, ensuring all projects are on the same page. That means significantly less risk of running into unexpected breaking changes. No more energy wasted on manually bumping library versions across multiple repos. &lt;br&gt;
No more cluttered &lt;code&gt;chore: version bump&lt;/code&gt; commits. &lt;br&gt;
Everything updates in unison, saving us 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%2Fg5utggchrpsuu2g3cvzv.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%2Fg5utggchrpsuu2g3cvzv.png" alt="Image description" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nx Cloud
&lt;/h2&gt;

&lt;p&gt;I need to mention Nx Cloud too. Nx Cloud literally boosts project by its caching capabilities.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching is caching, what could be so cool here? 🤔&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nx Cache stores the output of our operations and reuses it if there are no changes. This way ensures that only the necessary work is done. The rest is either skipped or retrieved from the cache. This caching works across the board, no matter what tools we use for building, testing, or linting.&lt;br&gt;
It also caches all terminal output when running tasks, so if a task's results are fetched from the cache, you'll see the terminal output as if the task had just been run.&lt;/p&gt;

&lt;h4&gt;
  
  
  💻 Time for a practical example:
&lt;/h4&gt;

&lt;p&gt;So, during a deployment, if &lt;strong&gt;we've already built and packaged the application&lt;/strong&gt; (like the last run on your env), Nx Cloud ensures for us there's &lt;strong&gt;no need to repeat these steps. They're fetched from the cache instead.&lt;/strong&gt; (Cache hit less than 1s)&lt;br&gt;
Then the deployment is executed to ensure it’s up-to-date, given it's a step that could have been modified since last run. Take a look 👇&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%2F4alq7yqjmv3dw10lkwgb.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%2F4alq7yqjmv3dw10lkwgb.png" alt="Nx Cloud runs" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The criteria for what makes a cache valid or not is configurable. For anyone curious about the nitty-gritty of how Nx Cloud's caching works, the Nx documentation is a great resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generators
&lt;/h2&gt;

&lt;p&gt;In my experience, setting up development workspaces for a new application, then develop new endpoint could take up to week. With Nx, this process can be shortened to less than a day. Nx Generators enable you to create or modify your codebase in a straightforward and repeatable manner. &lt;/p&gt;

&lt;p&gt;You can generate an entire project with a serverless lambda setup (which we use in our team, again huge kudos for Damian 👏👏👏) or choose from other ready-to-go configurations provided by Nx. This reminds me of the Rails generators I missed in the Node.js stack, but Nx has more than made up for it 💜 &lt;/p&gt;

&lt;p&gt;Huge capabilities in free tier - so, give it a try if you still wonder ;D&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nx</category>
      <category>devops</category>
      <category>development</category>
    </item>
    <item>
      <title>Git Lesson: How to Use .gitignore and .gitkeep?</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Tue, 16 Jan 2024 21:38:16 +0000</pubDate>
      <link>https://dev.to/ritaly/git-lesson-how-to-use-gitignore-and-gitkeep-5edm</link>
      <guid>https://dev.to/ritaly/git-lesson-how-to-use-gitignore-and-gitkeep-5edm</guid>
      <description>&lt;p&gt;&lt;em&gt;This article is translation of the original post from my blog&lt;/em&gt;: &lt;br&gt;
🇵🇱 &lt;a href="https://www.flynerd.pl/2024/01/gitignore-i-gitkeep.html" rel="noopener noreferrer"&gt;Git: Jak używać .gitignore i .gitkeep?&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;If you work with Git and have your repositories on platforms like Github, Gitlab, Bitbucket, etc., you probably come across "dot files" such as &lt;code&gt;.gitignore&lt;/code&gt; or &lt;code&gt;.gitkeep&lt;/code&gt;. What are they and how do they differ from each other? I'll try to explain briefly.&lt;/p&gt;
&lt;h3&gt;
  
  
  What is a &lt;code&gt;.gitignore&lt;/code&gt; file?
&lt;/h3&gt;

&lt;p&gt;While working with a Git repository, you'll quickly notice that some files and folders are unnecessary. You might encounter files automatically added by your editor, temporary files, or files with environment variables that you definitely don't want to share publicly. &lt;/p&gt;

&lt;p&gt;Here comes into play a special file named &lt;code&gt;.gitignore&lt;/code&gt;, usually placed directly in the main directory of our repository.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;.gitignore&lt;/code&gt; file allows us to specify &lt;strong&gt;and exclude from the repository those elements that are unnecessary&lt;/strong&gt;, be it configuration files, temporary files, or personal data. In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Git, the &lt;code&gt;.gitignore&lt;/code&gt; file is used to specify which files or directories the change tracking process should ignore.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks to &lt;code&gt;.gitignore&lt;/code&gt;, developers can avoid accidentally adding unwanted files to the repository. Our repository remains clean and organized, and the change history is not cluttered with irrelevant files.&lt;/p&gt;

&lt;p&gt;To ensure files are ignored, one must follow the conventions found in Git's official documentation as Patterns.&lt;/p&gt;

&lt;p&gt;For example, by adding the pattern &lt;code&gt;*.log&lt;/code&gt; to the &lt;code&gt;.gitignore&lt;/code&gt; file, we prevent the tracking of any log files.&lt;/p&gt;
&lt;h4&gt;
  
  
  Use gitignore templates
&lt;/h4&gt;

&lt;p&gt;Here you can find ready-made &lt;code&gt;.gitignore&lt;/code&gt; templates for various technologies and languages such as Python, Java, Kotlin, Go, and many others: &lt;a href="https://github.com/github/gitignore/tree/main" rel="noopener noreferrer"&gt;https://github.com/github/gitignore/tree/main&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you can't find something in this project, someone has surely already prepared such a template. Just need to search well 😉&lt;/p&gt;

&lt;p&gt;It's also worth noting that there are two approaches to using .gitignore files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 – Each repository should contain a &lt;strong&gt;standardized .gitignore file that ignores all language-specific files&lt;/strong&gt;, operating system files, and tools used by its developers (e.g., pycache), as well as any files removed for business reasons (e.g., data files, files too large for the repository).&lt;/li&gt;
&lt;li&gt;2 – The developer should be responsible for their own &lt;strong&gt;personal .gitignore file&lt;/strong&gt;, which will ignore all unnecessary repository files related to the languages and tools they are currently using. If there is a .gitignore file in the repository, it is there to accommodate logic specific to that particular repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What is a .gitkeep file?
&lt;/h3&gt;

&lt;p&gt;Unlike &lt;code&gt;.gitignore&lt;/code&gt;, &lt;code&gt;.gitkeep&lt;/code&gt; is not a part of Git's official documentation. It's an unofficial convention used by Git users to &lt;strong&gt;track empty directories&lt;/strong&gt;. Git, by default, does not track empty directories – it doesn't add them to our repository. &lt;code&gt;.gitkeep&lt;/code&gt; is a way to circumvent this limitation.&lt;/p&gt;

&lt;p&gt;In short, we want to convey to Git:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Hey, this folder is important, even if it's empty for now"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Since it is a convention rather than a part of the Git tool, it's worth noting that the name is not as important as the location. The file used to track an empty directory can have any name – it doesn't necessarily have to be &lt;code&gt;.gitkeep&lt;/code&gt;. You can choose names like &lt;code&gt;.empty&lt;/code&gt;, or simply &lt;code&gt;.keep&lt;/code&gt;, or any other. It's important to place this file directly in the empty directory that we want to track in the repository. This way, it's no longer empty 😉&lt;/p&gt;
&lt;h3&gt;
  
  
  .gitignore vs .gitkeep
&lt;/h3&gt;

&lt;p&gt;On one hand, &lt;code&gt;.gitkeep&lt;/code&gt;, an elegant and simple solution for tracking empty directories. On the other hand, &lt;code&gt;.gitignore&lt;/code&gt;, which besides its primary role, can also be used for this purpose. The choice depends on the context of the project.&lt;/p&gt;
&lt;h4&gt;
  
  
  How to track an empty folder through gitignore?
&lt;/h4&gt;

&lt;p&gt;Well, you can create a &lt;code&gt;.gitignore&lt;/code&gt; file in an empty folder, then add the following lines according to the pattern from the documentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ignore everything in this directory
*
# But do not ignore this .gitignore file
!.gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;*&lt;/code&gt; – the asterisk means that all files in the directory are ignored, except for the &lt;code&gt;.gitignore&lt;/code&gt; file, which we excluded using the &lt;code&gt;!&lt;/code&gt; exclamation mark, corresponding to negation. Since the &lt;code&gt;.gitignore&lt;/code&gt; file is tracked, the entire directory will also be tracked by Git.&lt;/p&gt;

&lt;p&gt;Then just add this change to Git, as usual, and commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="s2"&gt;"path/to/empty_directory/.gitignore"&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add empty directory"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Importantly, this solution will also work, not just for an empty folder!&lt;/p&gt;

&lt;p&gt;In this way, we can add to the repository as an empty directory, a folder that contained files, but for some reason, we do not want to track those files. The folder in Git is not empty – it contains a .gitignore file inside ;) &lt;/p&gt;

&lt;h4&gt;
  
  
  How-To track an empty folder with .gitignore and .gitkeep when the folder contains some local files?
&lt;/h4&gt;

&lt;p&gt;Does it make sense? Yes, although it's not often needed. &lt;/p&gt;

&lt;p&gt;This method is useful if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a directory in the repository, but without the files inside it, e.g., a system log folder, but without the log files that are only of interest locally.&lt;/li&gt;
&lt;li&gt;You want to send the directory structure to the Git repository before there are any files in it, e.g., they will be added later, but you want to define the structure now.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  How to track a directory that already has files locally, but should remain empty remotely?
&lt;/h5&gt;

&lt;p&gt;So, the previous point partly answered this question, but maybe we don't like that solution because we have two &lt;code&gt;.gitignore&lt;/code&gt; files and we want to differentiate these files.&lt;/p&gt;

&lt;p&gt;In the folder, create a &lt;code&gt;.gitkeep&lt;/code&gt; file to track the folder in Git, and add lines to the &lt;code&gt;.gitignore&lt;/code&gt; file to ignore all files inside our folder.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step by Step
&lt;/h4&gt;

&lt;p&gt;Step 1. Assume we have a logs folder in our project. This folder contains various system files that we don't want to add to our remote repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app
│   .gitignore
│   index.html
│   script.js
│
├───images
│
└───logs
    │   2452321.log
    │   2453111.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step  2. In the logs folder, create an empty &lt;code&gt;.gitkeep&lt;/code&gt; or &lt;code&gt;.keep&lt;/code&gt; file (the name is just a convention).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app
│   .gitignore
│   index.html
│   script.js
│
├───images
│
└───logs
    │   .gitkeep
    │   2452321.log
    │   2453111.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step  3. Now, if you want to track the folder, but not its content – which makes sense for logs, add the following content to the .gitignore file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ignore everything inside the logs folder
logs/*
# Do not ignore the .gitkeep file in the logs folder
!logs/.gitkeep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tada 🎉 We can commit these changes and add them to the repository. Our files inside the logs folder will not appear online.&lt;/p&gt;

</description>
      <category>git</category>
      <category>tutorial</category>
      <category>github</category>
      <category>development</category>
    </item>
    <item>
      <title>☁️ Intro to the Cloud ☁️</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Tue, 20 Jun 2023 10:20:00 +0000</pubDate>
      <link>https://dev.to/ritaly/intro-to-the-cloud-1fph</link>
      <guid>https://dev.to/ritaly/intro-to-the-cloud-1fph</guid>
      <description>&lt;p&gt;Clouds &amp;amp; the cloud computing are new buzz words all over the Internet. &lt;/p&gt;

&lt;p&gt;Noble Desktop:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Currently, cloud computing is one of the most in-demand skills you can have on your resume. (January 2023)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NextGen Education Foundation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;LinkedIn reported that cloud computing-related jobs have a growth rate of 30% year over year, making it one of the fastest-growing jobs (March 2023)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, if you are on dev.to then you already known that it's not all just about a fluffy thing up in the sky. In the tech realm, "the cloud" is a beast of its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Short historical view
&lt;/h3&gt;

&lt;p&gt;Once upon a time, back in the 1960s, a computer scientist named John McCarthy mused, &lt;strong&gt;"computation may someday be organized as a public utility."&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Did he glimpse the future? &lt;br&gt;
Yes, he did&lt;/p&gt;

&lt;p&gt;But he didn't invented the cloud. And in my opinion, it's hard to say that cloud computing was really invented in the '60s (more like 70s), but if we need to point to a father, J. C. R. Licklider is our best bet. He was certainly dedicated to implementing the cloud computing concept with his work on ARPANET, connecting people and data from anywhere at any time.&lt;/p&gt;

&lt;p&gt;Fast forward to the 90s and early 2000s, the internet became a landing place for applications and services. Modern business lives on the Internet or in "the clouds". This set the stage for the cloud's grand entrance. &lt;/p&gt;

&lt;p&gt;In 2006, Amazon Web Services (AWS) introduced its cloud storage service. It marked the dawn of an era where the cloud was no longer a distant idea but a reality for businesses and individuals alike. &lt;/p&gt;

&lt;p&gt;Since then, tech gigants like Google Cloud Platform and Microsoft Azure joined the market fray. The cloud, once a mere concept, has now become a cornerstone in the tech industry.&lt;/p&gt;

&lt;p&gt;The iconic cloud symbol we often spot in diagrams became the namesake for this popular tech.&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%2Fhye7skjpqcr8fo167ng1.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%2Fhye7skjpqcr8fo167ng1.png" alt="what is cloud computing" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is cloud computing in simple words?
&lt;/h3&gt;

&lt;p&gt;How is it difftent from classic hosting for our applications? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud computing&lt;/strong&gt; refers to the use of hosting services such as: data storage, databases, networks or software over the Internet. Resources including memory and computing power are shared and available on demand in the amount user needs&lt;br&gt;
and do not require user management (or require very little effort).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional hosting&lt;/strong&gt; is carried out on a single server. This is your space, manage it as you wish, install as you wish, remember to updated software, BUT if you exceed the limit, the application will be unavailable.&lt;/p&gt;

&lt;p&gt;In the case of Cloud Services (cloud-based hosting), there is no predetermined number of servers assigned to our service. Software &amp;amp; many services are delivered and configured by default (or again require very little effort).&lt;/p&gt;

&lt;p&gt;Imagine you're renting a single apartment in single building (&lt;em&gt;**classic hosting&lt;/em&gt;&lt;em&gt;at *) versus having the ability to instantly enlarge the area of ​​the apartment, rent more apartments or reduce the number as needed in the same building or even diffrent buildings (&lt;/em&gt;&lt;strong&gt;cloud computing&lt;/strong&gt;*). Classic hosting gives you a fixed space, while cloud computing is more flexible, allowing you to use more or less space and resources based on your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros &amp;amp; Cons of Cloud Computing
&lt;/h3&gt;

&lt;h4&gt;
  
  
  PROS:
&lt;/h4&gt;

&lt;p&gt;💰 &lt;strong&gt;Cost-Efficiency&lt;/strong&gt;: You only pay for what you use, which typically means it's cheaper.&lt;/p&gt;

&lt;p&gt;🤷 &lt;strong&gt;No Guesswork&lt;/strong&gt;: No need to predict how much capacity you'll require.&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;No Hardware Hassles&lt;/strong&gt;: No need for your own equipment or data centers; low-level administration isn't your concern.&lt;/p&gt;

&lt;p&gt;🌍 &lt;strong&gt;Global Reach&lt;/strong&gt;: Launch a geographically independent application in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Resource Access&lt;/strong&gt; ⚡: Get more resources on-demand in just a few moments.&lt;/p&gt;

&lt;h4&gt;
  
  
  CONS:
&lt;/h4&gt;

&lt;p&gt;💸 &lt;strong&gt;Potential Hidden Costs&lt;/strong&gt;: While it may seem cheaper, unexpected charges can arise. Nightmar of developers, with scalability comes the price.&lt;/p&gt;

&lt;p&gt;🔒 &lt;strong&gt;Security Concerns&lt;/strong&gt;: Storing data off-site might raise security, privacy and legal issues. Clouds are generally secure this days, but there's always risk of a leak.&lt;/p&gt;

&lt;p&gt;⏳ &lt;strong&gt;Downtime Risks&lt;/strong&gt;: Relying on third-party providers can lead to unexpected downtimes - single huge AWS outage Dec 2021 caused outage of hundreds global services.&lt;/p&gt;

&lt;p&gt;🎛️ &lt;strong&gt;Limited Control&lt;/strong&gt;: Less control over infrastructure and software updates (this can be both a good and bad thing; it depends)&lt;/p&gt;

&lt;p&gt;📡 &lt;strong&gt;Data Transfer Costs&lt;/strong&gt;: Moving data in and out of the cloud after some time can be...crazy costly.&lt;/p&gt;

&lt;p&gt;In the grand selection of tech, cloud computing is both a blessing for developers and business and a challenge. &lt;/p&gt;

&lt;h3&gt;
  
  
  Types of the Clouds
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Public Cloud&lt;/strong&gt;: This refers to cloud resources managed by an external cloud service provider. They offer computing assets like servers, software, and storage via the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private Cloud&lt;/strong&gt;: This is a cloud solution dedicated solely to a single business or organization. It can be hosted on-site at the company's data center or by an external provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Cloud&lt;/strong&gt;: This blends both public and private cloud structures. Integrated technologies enable them to share data and applications. This setup offers businesses greater flexibility and a variety of deployment choices.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Public Cloud&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Private Cloud&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Hybrid Cloud&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Definition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Owned and operated by third-party providers. Examples: AWS, GCP.&lt;/td&gt;
&lt;td&gt;Cloud resources used exclusively by one organization.&lt;/td&gt;
&lt;td&gt;Combines public and private clouds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Characteristics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resources shared among multiple users. Accessed via web browsers.&lt;/td&gt;
&lt;td&gt;Resources not shared, offering more control and security.&lt;/td&gt;
&lt;td&gt;Offers flexibility by moving workloads between cloud solutions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web apps, development/testing environments, big data analytics.&lt;/td&gt;
&lt;td&gt;Strict data security, regulatory compliance, infrastructure customization.&lt;/td&gt;
&lt;td&gt;Keep sensitive data in private cloud, use public cloud for high-volume, less-sensitive data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cost-effective, no physical maintenance, high scalability.&lt;/td&gt;
&lt;td&gt;Greater control, enhanced security, customization options.&lt;/td&gt;
&lt;td&gt;Flexibility, more deployment options, optimizes existing infrastructure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Might be less secure due to shared resources, potential latency.&lt;/td&gt;
&lt;td&gt;More expensive, requires in-house expertise, limited scalability.&lt;/td&gt;
&lt;td&gt;More complex to manage, requires&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>aws</category>
      <category>programming</category>
      <category>cloud</category>
    </item>
    <item>
      <title>How-To Export AWS DynamoDB Data To S3 For Recurring Tasks</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Sat, 25 Feb 2023 16:20:42 +0000</pubDate>
      <link>https://dev.to/ritaly/how-to-export-aws-dynamodb-data-to-s3-for-recurring-tasks-4l47</link>
      <guid>https://dev.to/ritaly/how-to-export-aws-dynamodb-data-to-s3-for-recurring-tasks-4l47</guid>
      <description>&lt;p&gt;Have you ever tried to schedule export of DynamoDB data to S3? I mean the automated recurring task everyday e.g. at 6 AM? &lt;br&gt;
You went to AWS console only to discover that it limits you to a single "on click" export?&lt;/p&gt;

&lt;p&gt;I did 😏&lt;/p&gt;

&lt;p&gt;Therefore, in this article I'll try to &lt;strong&gt;cover the whole process of exporting AWS DynamoDB data to S3 as a recurring task&lt;/strong&gt;. Additionally, I'd like my data to be filtered by secondary index. Also, I'll answer: &lt;em&gt;why and how&lt;/em&gt; do this, and compare what solutions AWS offers.&lt;/p&gt;

&lt;p&gt;📔 One side note: I explore universal options, but keep in mind that my table size is below 1 GB. &lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Let's go!&lt;/strong&gt; ✨&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why export data from DynamoDB to S3?&lt;/li&gt;
&lt;li&gt;
How-to export data from DynamoDB to S3?

&lt;ul&gt;
&lt;li&gt;Requirements&lt;/li&gt;
&lt;li&gt;
AWS DynamoDB Export to S3 feature

&lt;ul&gt;
&lt;li&gt;Guide&lt;/li&gt;
&lt;li&gt;
Costs &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

AWS Glue Jobs

&lt;ul&gt;
&lt;li&gt;Guide&lt;/li&gt;
&lt;li&gt;
Costs &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

AWS Data Pipeline

&lt;ul&gt;
&lt;li&gt;Guide&lt;/li&gt;
&lt;li&gt;
Costs &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Comparison table&lt;/li&gt;

&lt;li&gt;Final thoughts on export costs&lt;/li&gt;

&lt;li&gt;What's next?&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;First things first: &lt;em&gt;Why?&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Why export data from DynamoDB to S3?
&lt;/h2&gt;

&lt;p&gt;From AWS website we can learn what are the benefits or reasons for exporting data from DynamoDB to S3. They divide it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ETL&lt;/strong&gt;: Perform ETL (Extract, Transform, Load) operations on the exported data in S3, and then import the transformed data back into DynamoDB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Archiving&lt;/strong&gt;: Retain historical snapshots for audit and compliance requirements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Integration&lt;/strong&gt;: Integrate the data with other services and applications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Lake&lt;/strong&gt;: Build a data lake in S3, allowing users to perform analytics across multiple data sources using services such as Amazon Athena, Amazon Redshift, and Amazon SageMaker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ad-hoc queries&lt;/strong&gt;: Query data from Athena or Amazon EMR without affecting your DynamoDB capacity&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my case, BI team asked about a &lt;strong&gt;daily snapshot of our table&lt;/strong&gt; from DynamoDB but only exported &lt;strong&gt;partially&lt;/strong&gt;. So, I started the investigation: &lt;strong&gt;what are my options&lt;/strong&gt;?.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to export data from DynamoDB to S3?
&lt;/h2&gt;

&lt;p&gt;At the beginning, I excluded the idea of scanning the table at the lambda level. Such a solution would be inefficient and costly, since AWS has tools for this - would also be a waste of time. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Those are 3 possible ways in 2023&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"basic" Export DynamoDB to S3 feature&lt;/li&gt;
&lt;li&gt;AWS Glue Job&lt;/li&gt;
&lt;li&gt;AWS Data Pipeline (to be deprecated)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But before you start prepare this&lt;/p&gt;

&lt;h4&gt;
  
  
  Requirements:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enable &lt;strong&gt;Point-in-time recovery (PITR)&lt;/strong&gt; on the source table that allows export table data from any point in time within the PITR window, up to 35 days. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add &lt;strong&gt;IAM role&lt;/strong&gt; with permissions to access the DynamoDB table and write to the S3 bucket, allow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ExportTableToPointInTime&lt;/code&gt;(DynamoDb)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PutObject&lt;/code&gt;(S3)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"dynamodb:ExportTableToPointInTime"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"s3:PutObject"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;S3 bucket&lt;/strong&gt; - create new bucket or select to use an existing one&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build-in Export DynamoDB to S3
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Export to S3&lt;/strong&gt; as DynamoDB feature is the easiest way to dump the table data to S3. Also it doesn't run a scan against whole table, so it is efficient, cheaper way.&lt;/p&gt;

&lt;p&gt;It is a simple, one-click feature in the DynamoDB console that exports the data in either JSON or Amazon Ion text format. &lt;/p&gt;

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

&lt;p&gt;🚨 &lt;strong&gt;no filter the data before export&lt;/strong&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%2Fh7gynq5ojhloalmjlz7s.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%2Fh7gynq5ojhloalmjlz7s.png" alt="Build-in Export DynamoDB to S3 feature" width="289" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  HOW-TO: Export DynamoDB → S3
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Step by step instruction:
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;Go to DynamoDB console, select table you want to export.&lt;/li&gt;
&lt;li&gt;There is a tab "Export table",click export button and to fill details:

&lt;ul&gt;
&lt;li&gt;S3 bucket&lt;/li&gt;
&lt;li&gt;IAM role (created earlier)&lt;/li&gt;
&lt;li&gt;Format: choose the format for the exported data (JSON or AWS Ion)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Start the export process and wait until it to complete.&lt;/li&gt;
&lt;li&gt;Check the S3 bucket to verify that the exported data is available in the specified format.&lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;
  
  
  Lambda
&lt;/h5&gt;

&lt;p&gt;As you may notice - there's no option to schedule recurring task on the AWS console level.&lt;/p&gt;

&lt;p&gt;That's why we would need a minimal &lt;strong&gt;Lambda function&lt;/strong&gt; triggered daily at the specified time e.g. via EventBridge rule, that calls the &lt;code&gt;exportTableToPointIntime&lt;/code&gt; from AWS SDK.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/classes/exporttabletopointintimecommand.html" rel="noopener noreferrer"&gt;AWS SDK v3 DynamoDB Client | ExportTableToPointInTimeCommand&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%2Fq5lgadch8yuml6bnyx6u.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%2Fq5lgadch8yuml6bnyx6u.png" alt="AWS Lambda export" width="466" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Monitoring
&lt;/h5&gt;

&lt;p&gt;We need to configure it, it's not provide as default. For example use AWS CloudTrail logs for table export to enable logging, continuous monitoring, and auditing  &lt;/p&gt;

&lt;h5&gt;
  
  
  Limitations
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Always dump whole table data&lt;/li&gt;
&lt;li&gt;For recurring tasks needs extra lambda, that would run 1 per day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task number:&lt;/strong&gt; Up to 300 export tasks, or up to 100 TB of table size, can be exported concurrently. &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/S3DataExport.HowItWorks.html" rel="noopener noreferrer"&gt;Doc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format&lt;/strong&gt;: DynamoDB JSON format or Amazon Ion text format&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Cost
&lt;/h5&gt;

&lt;p&gt;Export to S3 is “free” to setup, as it's part of the DynamoDB service. &lt;br&gt;
We are charged $0.10 per GB exported + additional S3 costs for data storage and upload, which vary depending on the region you're in.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Glue Jobs
&lt;/h3&gt;

&lt;p&gt;Probably, (right now) it is the best way for data integration, especially when one source needs to stay alive while coping. &lt;strong&gt;AWS Glue is flexible&lt;/strong&gt; as it allows you to export data from not just DynamoDB, but also other AWS services.&lt;br&gt;
It is &lt;strong&gt;efficient for large datasets&lt;/strong&gt; because the export feature uses the DynamoDB backup/export functionality (so it doesn't do a scan on the source table). In other words, it performs the Export to S3 (described above) under the hood.&lt;/p&gt;

&lt;p&gt;AWS Glue crawl a DynamoDB table, extract the data into Amazon S3, and perform analysis using SQL queries. Technically, &lt;strong&gt;AWS Glue runs jobs in an Apache Spark serverless environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;📔 Side note: I'm not covering the ETL capabilities of Glue here. For me, I need only data export, but if you plan to use Glue for ETL operations, you may want to create Glue Data Catalog for your jobs.&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%2Ffz97wuwm2uqv4pn5g0d5.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%2Ffz97wuwm2uqv4pn5g0d5.jpg" alt="AWS Glue to export data to S3" width="451" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  HOW-TO: Export AWS Glue Jobs → S3
&lt;/h4&gt;

&lt;p&gt;Step by step instruction:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to AWS Glue Job: 

&lt;ul&gt;
&lt;li&gt;Navigate to the AWS Glue Studio&lt;/li&gt;
&lt;li&gt;Click on the "Jobs" menu. &lt;/li&gt;
&lt;li&gt;"Add job" button to create a new AWS Glue job&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select the source:&lt;/strong&gt; select DynamoDB table as the source &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select the destination&lt;/strong&gt;: select S3&lt;/li&gt;
&lt;li&gt;Confirm with create button&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This opens Glue Studio editor.&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%2Fw9y5axsyj1eunr27ejy4.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%2Fw9y5axsyj1eunr27ejy4.png" alt="AWS Glue Studio" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visual editor is guides through job's properties. But you need to know what you want to do because it is a powerful tool full of options.&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%2Fb144tep5xwn49hsmhm8p.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%2Fb144tep5xwn49hsmhm8p.jpg" alt="AWS Glue job editor" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure the job details: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data source: DynamoDB table

&lt;ul&gt;
&lt;li&gt;AWS Glue is using DynamoDB's feature - export to S3 and creates a temporary S3 bucket&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data transform: &lt;code&gt;ApplyMapping&lt;/code&gt; - add filtering in SQL&lt;/li&gt;
&lt;li&gt;Data target: set format (e.g. JSON), then select the S3 bucket as the destination&lt;/li&gt;
&lt;li&gt;Set schedule&lt;/li&gt;
&lt;/ol&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%2F7oh5usz2njuwyzafihci.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%2F7oh5usz2njuwyzafihci.png" alt="Add AWS job schedule" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After configuring the AWS Glue job, click the Run Job button to start the export process.&lt;br&gt;
AWS Glue will automatically extract the data from the DynamoDB and store it in the specified S3 bucket.&lt;/p&gt;

&lt;p&gt;👉 In my case, I also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;set timeout after 8 hours. &lt;/li&gt;
&lt;li&gt;added number of retries - 3 time per day. AWS Glue will automatically restart the job if it fails&lt;/li&gt;
&lt;li&gt;narrowed down number of workers from default 10 to 2 (it's experimental decision, the export takes 10 min, and total cost is lower than with 10 allocated workers. Again this may vary, depending on the size of the input data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Monitoring
&lt;/h5&gt;

&lt;p&gt;Some logs &amp;amp; monitoring are created by default with job, which is nice 👍&lt;/p&gt;

&lt;p&gt;It's good idea to add the alerts in AWS Cloud Watch, that could inform you on email/slack/any way you want, that your job is failing. &lt;/p&gt;

&lt;h5&gt;
  
  
  Jobs Cost
&lt;/h5&gt;

&lt;p&gt;0.44 USD per DPU-Hour + S3 storage&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Data Pipeline [to be deprecated]
&lt;/h3&gt;

&lt;p&gt;✨ I quickly go through the main aspects, but without a detailed configuration, because I personally &lt;strong&gt;skipped it as it's not worth delving into anymore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AWS Data Pipeline is being deprecated and will no longer be available after January 1, 2025. AWS recommends alternative solutions&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please note that Data Pipeline service is in maintenance mode and we are not planning to expand the service to new regions. We plan to remove console access by 04/30/2023.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, AWS Pipeline is often recommended on StackOverflow 😉 &lt;/p&gt;

&lt;p&gt;AWS Data Pipeline is a more complex service that requires configuration, management, and monitoring of pipelines. Sounds similar to Glue when it comes to the functionalities (flexible - many data sources, large scale). What's the difference?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deprecated, sure 🙈&lt;/p&gt;

&lt;p&gt;Also, this approach is a bit old-fashioned as it utilises EC2 instances and triggers the EMR cluster to perform the export activity. If instance and the cluster configuration is not properly provided in the pipeline, it could cost... 💸  dearly 💸 &lt;/p&gt;

&lt;h4&gt;
  
  
  HOW-TO: Export AWS Data Pipeline → S3
&lt;/h4&gt;

&lt;p&gt;To export a DynamoDB table, we start with the AWS Data Pipeline console to create a new pipeline. The pipeline launches an Amazon EMR cluster to perform the actual export. Amazon EMR reads the data from DynamoDB, and writes the data to the export file in an Amazon S3 bucket.&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%2F7rxfd5f1wjd7ilc83mwh.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%2F7rxfd5f1wjd7ilc83mwh.png" alt="AWS Data Pipeline" width="456" height="704"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Data Pipeline&lt;/strong&gt; — manages the import/export workflow for you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt; — contains the data that you export from DynamoDB, or import into DynamoDB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon EMR&lt;/strong&gt; — runs a managed Hadoop cluster to perform reads and writes between DynamoDB to Amazon S3 (The cluster configuration is one m3.xlarge instance leader node and one m3.xlarge instance core node)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Pipeline Cost
&lt;/h5&gt;

&lt;p&gt;It charges for pipeline creation, execution, and storage&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0.06$ per low frequency task [e.g. daily activity lambda]&lt;/li&gt;
&lt;li&gt;1.00$ per high frequency task [e.g. hourly activity lambda]&lt;/li&gt;
&lt;li&gt;Amazon EMR (+EC2) cost for 120 minutes  = 17 USD per month&lt;/li&gt;
&lt;li&gt;additional S3 cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Overview: Export a table from Amazon DynamoDB to an Amazon S3 bucket steps via AWS Data Pipeline:
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; &lt;/th&gt;
&lt;th&gt;AWS Dynamo Export&lt;/th&gt;
&lt;th&gt;AWS Glue Job&lt;/th&gt;
&lt;th&gt;AWS Data Pipeline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Use for&lt;/td&gt;
&lt;td&gt;Data transfer&lt;/td&gt;
&lt;td&gt;ETL, Data Catalog, AWS Glue Crawlers&lt;/td&gt;
&lt;td&gt;Data transfer, transform and process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serverless&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (default setting manages the lifecycle of AWS EMR clusters and AWS EC2 instances to execute  jobs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allows filters / mapping&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;$0.10/GB + S3 storage&lt;/td&gt;
&lt;td&gt;$0.44/DPU + S3 storage&lt;/td&gt;
&lt;td&gt;$1.00/high-freq, $0.06/low-freq task + Amazon EMR(+EC2)+ S3 storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Replication&lt;/td&gt;
&lt;td&gt;Full table; Export from a specific point in time&lt;/td&gt;
&lt;td&gt;Full table; Export from specific point of time; Incremental&lt;/td&gt;
&lt;td&gt;Full table; Incremental replication via Timestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output format&lt;/td&gt;
&lt;td&gt;JSON, Ion(json.gz - compressed)&lt;/td&gt;
&lt;td&gt;JSON, Ion, CSV, Parquet, XML, Avro, grokLog, ORC(compression optional)&lt;/td&gt;
&lt;td&gt;CSV, JSON, Custom formats&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Final thoughts on export costs 💰
&lt;/h3&gt;

&lt;p&gt;As an AWS developer, you should have a little bit of the accountant inside your heart too 🖤. &lt;br&gt;
Try to keep your records as small as possible, and use on-demand pricing wisely. It is ✨ &lt;strong&gt;so convenient&lt;/strong&gt; ✨, I know. While it may seem not expensive and you don't need to think about scaling, it can sometimes be up to 4-6 times more expensive per request compared to a provisioned capacity. Therefore, it's better to sit down and calculate before making a final decision.&lt;/p&gt;

&lt;p&gt;For me on-demand is cheaper than fixed capacity, but please refer to oldest programmer's answer "IT DEPENDS".&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%2Fg794pl6txkkkuewg97r6.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%2Fg794pl6txkkkuewg97r6.jpeg" alt="AWS costs - it depends" width="610" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's next?
&lt;/h3&gt;

&lt;p&gt;Now, your data is in S3? That's time to think about &lt;strong&gt;retention policy&lt;/strong&gt; 🧹, when should we archive data to AWS S3 Glacier. But maybe that's subject for next post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worth reading&lt;/strong&gt; 📚 &lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/premiumsupport/knowledge-center/back-up-dynamodb-s3/" rel="noopener noreferrer"&gt;How can I back up a DynamoDB table to Amazon S3?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/accelerate-amazon-dynamodb-data-access-in-aws-glue-jobs-using-the-new-aws-glue-dynamodb-elt-connector/" rel="noopener noreferrer"&gt;Accelerate Amazon DynamoDB data access in AWS Glue jobs using the new AWS Glue DynamoDB Export connector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/glue/latest/dg/monitor-profile-glue-job-cloudwatch-alarms.html" rel="noopener noreferrer"&gt;Amazon CloudWatch alarms on AWS Glue job&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>My ChatGPT Adventure: Unveiling Abilities &amp; Bold Lies</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Sat, 18 Feb 2023 18:29:02 +0000</pubDate>
      <link>https://dev.to/ritaly/my-chatgpt-adventure-unveiling-abilities-bold-lies-2pkd</link>
      <guid>https://dev.to/ritaly/my-chatgpt-adventure-unveiling-abilities-bold-lies-2pkd</guid>
      <description>&lt;p&gt;This post is longer, more compehensive version of my &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7032701274479337472/" rel="noopener noreferrer"&gt;LinkedIn post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Not only will it mislead you, but it will be blatantly lying&lt;/strong&gt; 🔴 &lt;/p&gt;

&lt;p&gt;tl;dr - my 2-week experience with with chatGPT. &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%2Fmedia.tenor.com%2FxIK0QA7WQiUAAAAd%2Fhouse-doctor.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%2Fmedia.tenor.com%2FxIK0QA7WQiUAAAAd%2Fhouse-doctor.gif" width="600" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ Let's start with something positive that amazed me: writing emails and correcting texts. &lt;/p&gt;

&lt;p&gt;Honestly, &lt;strong&gt;I hate writing emails&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It gives me physical pain every time I need to communicate via email instead of slack or I need to produce more "public" documentation. &lt;br&gt;
But email communication exist, so I need to &lt;em&gt;deal with it&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;My "formal" or "semi-formal" English got stuck at school level, and only &lt;strong&gt;Grammarly&lt;/strong&gt; is my relief (I love it with all my heart ❤️, even this post is checked. Grammarly folks, you do great job).&lt;/p&gt;

&lt;p&gt;So, of course, I wanted to see what if I copy-pasted bullet points with basic info and sprinkled them with a recipe from Alan D. Thompson's "ChatGPT Prompt Book". &lt;/p&gt;
&lt;h3&gt;
  
  
  Emails perfectly written by ChatGPT
&lt;/h3&gt;

&lt;p&gt;According to the book I can prompt like that: &lt;em&gt;"Respond to email diplomatically and comprehensively"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;💡 The prompt should be prescriptive: tell, don’t ask.&lt;br&gt;
💡 The prompt shouldn't be complex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Send a semi-formal email to a co-worker about 
- weekly meeting
- next Friday
Remind him to prepare a 10-minute presentation 
summarizing the DB migration process.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;result (original spelling):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Subject: Weekly Meeting on Friday - Reminder to Prepare Presentation&lt;/p&gt;

&lt;p&gt;Dear [Co-worker's Name],&lt;/p&gt;

&lt;p&gt;I hope this email finds you well. I am writing to remind you of the&lt;br&gt;
weekly meeting that is scheduled for next Friday, [Date]. As discussed&lt;br&gt;
in our previous meeting, you are expected to give a 10-minute&lt;br&gt;
presentation summarizing the database migration process. I believe&lt;br&gt;
your insights on this topic will be valuable to the rest of the team.&lt;/p&gt;

&lt;p&gt;Please make sure to prepare your presentation in advance to ensure a&lt;br&gt;
smooth and efficient meeting. If you need any assistance or have any&lt;br&gt;
questions, please don't hesitate to reach out to me.&lt;/p&gt;

&lt;p&gt;Thank you for your attention to this matter. I look forward to hearing&lt;br&gt;
your presentation next week.&lt;/p&gt;

&lt;p&gt;Best regards,&lt;/p&gt;

&lt;p&gt;[Your Name]&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write a formal to Manager with request to attend a conference.
- CraftConf Annual Conference, 18-19 May, Budapest, Hungary
- relevant to current tasks and position
- industry experts speakers
- ask to cover costs: ticket, travel expenses, hotel 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;result (original spelling):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Subject: Request to Attend the CraftConf Annual Conference&lt;/p&gt;

&lt;p&gt;Dear [Manager's Name],&lt;/p&gt;

&lt;p&gt;I am writing to request your approval to attend the CraftConf Annual&lt;br&gt;
Conference, which will be held in Budapest, Hungary from May 18-19, 2023. I believe this conference will provide valuable insights and updates on the latest trends and practices in our industry.&lt;/p&gt;

&lt;p&gt;As you know, my current role and responsibilities involve [briefly&lt;br&gt;
describe your current tasks and position]. Based on the conference&lt;br&gt;
program, I am confident that attending the CraftConf Annual Conference&lt;br&gt;
will provide me with new skills, knowledge, and innovative ideas that&lt;br&gt;
I can apply to my work and share with the team. The conference&lt;br&gt;
features several renowned industry experts as speakers, which will&lt;br&gt;
offer an excellent opportunity to network and learn from their&lt;br&gt;
experiences.&lt;/p&gt;

&lt;p&gt;I would like to request that the company cover the costs associated&lt;br&gt;
with attending the conference, including the ticket, travel expenses,&lt;br&gt;
and accommodation. I assure you that I will attend the conference with&lt;br&gt;
a keen focus and will make the most of the learning opportunities&lt;br&gt;
presented.&lt;/p&gt;

&lt;p&gt;Thank you for considering my request. I look forward to hearing from&lt;br&gt;
you soon.&lt;/p&gt;

&lt;p&gt;Sincerely,&lt;/p&gt;

&lt;p&gt;[Your Name]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✨ &lt;strong&gt;MAGIC&lt;/strong&gt; ✨
&lt;/h3&gt;

&lt;p&gt;The pain of my existence — grueling emails — is gone. &lt;/p&gt;

&lt;p&gt;In general. Because I still need to add the final touch.&lt;br&gt;
&lt;sup&gt;&amp;lt;joke&amp;gt; My perfect sign offs like: &lt;em&gt;"Yours unfaithfully"&lt;/em&gt; &amp;amp; &lt;em&gt;"Slay Serve Survive"&lt;/em&gt;&amp;lt;/joke&amp;gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Somebody asked for ✨ Beautiful ✨ &lt;strong&gt;technical documentation&lt;/strong&gt;? &lt;br&gt;
Here you are; just first write it in your style, then ask chat to fix your mistakes, and ask for suggestions - how to bring it to the next level.&lt;/p&gt;

&lt;p&gt;As a non-English speaker, I love this experience. &lt;br&gt;
I see it and appreciate all the possibilities coming with chatGPT, which I'm still exploring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BUT&lt;/strong&gt; (there is a huge "BUT") &lt;/p&gt;

&lt;p&gt;👉 I tried to use chatGPT instead of search. &lt;/p&gt;

&lt;p&gt;I'm sure you hear about it: &lt;/p&gt;

&lt;h3&gt;
  
  
  "ChatGPT better than Google"
&lt;/h3&gt;

&lt;p&gt;So, I asked Chat for advice. And it failed me miserably and...&lt;br&gt;
unexpectedly.&lt;/p&gt;

&lt;p&gt;I had to check &lt;strong&gt;how to export part of the AWS DynamoDB table to S3&lt;/strong&gt;. I have some assumptions and conclusions. Why not ask Chat, when maybe it could provide me with something I overlooked? &lt;/p&gt;

&lt;p&gt;ChatGPT has knowledge limited to 2021, but that is enough to "scan" and provide me answers from AWS documentation (which its not fun to read, not particularly human-friendly). &lt;/p&gt;

&lt;p&gt;Yes, it did, but the answer to 2 technical questions included&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👉 2 lies (3 in context)&lt;/li&gt;
&lt;li&gt;👉 deprecated method (which "she" was aware of; btw, yes, I did name my chat Pythia* - perhaps too early).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1️⃣ Firstly, Chat suggested that I could go to DynamoDB and "Export to S3" and just select the secondary index 😏 &lt;/p&gt;

&lt;p&gt;What you need to know (if you're not AWS user), that there's no such option in AWS as &lt;strong&gt;exporting the DynamoDB table partially&lt;/strong&gt;, and there never was. &lt;/p&gt;

&lt;p&gt;2️⃣ Secondly, it suggested that I should use AWS Data Pipeline (which is going to be deprecated soon and absolutely ❌ &lt;strong&gt;NOT&lt;/strong&gt; ❌ &lt;strong&gt;recommended to use in 2023&lt;/strong&gt;). &lt;/p&gt;

&lt;p&gt;3️⃣ Again, when I directly asked about &lt;strong&gt;AWS glue&lt;/strong&gt;, but chat suggested the same mid-step: Export to S3 by secondary index. &lt;/p&gt;

&lt;p&gt;4️⃣ Then, Chat admitted it was a mistake and tried to convince me that I can do this by primary index — I need to repeat: DynamoDB export does not support export tables partially. DOT.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Chat suggests non-existing Export a table partially from DynamoDB to S3?&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1tmv1gy7pc2e1so71jl.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%2Fx1tmv1gy7pc2e1so71jl.png" alt="Chat suggests: non-existing Export a table partially from DynamoDB to S3?" width="800" height="656"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I don't even know what to call it.&lt;/strong&gt; Simplification? &lt;br&gt;
Chat proposes some non-existent features that are, in fact, highly misleading. &lt;/p&gt;

&lt;p&gt;When you point out, it turns out that chat knows from the beginning. Why doesn't it suggest the correct answer from the beginning?&lt;/p&gt;

&lt;p&gt;Earlier, I did my research, and I read the AWS documentation, but if I used the chat as a general overview of the possibilities, e.g. as a helper in my estimation, I could greatly miscalculate. &lt;/p&gt;

&lt;p&gt;Shouldn't I be doing that? Nobody should? &lt;/p&gt;

&lt;p&gt;Oh, 🦌... LinkedIn, tech portals rave about how amazingly chat allows non-technical people to understand the degrees of tech difficulty 😜 &lt;/p&gt;

&lt;p&gt;Although it won't replace specialists, it could help, for example, in ESTIMATING the scope of technical tasks.&lt;/p&gt;

&lt;p&gt;Estimation based on GPT, sounds wonderful!&lt;/p&gt;

&lt;p&gt;Yes, well... NO&lt;/p&gt;

&lt;p&gt;It's just that such an underestimated task is unrealistic in its implementation because Chat lied about technical "details".&lt;/p&gt;

&lt;p&gt;Contrary to media hype, we are obligated to warn decision-makers that a convenient tool is unreliable. At least, not yet.  &lt;/p&gt;

&lt;p&gt;We are at the &lt;strong&gt;threshold of an era when AI will become an everyday tool&lt;/strong&gt;. Let's use it consciously, because chat "consciously" lies us.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Pythia - in Greek mythology, the priestess of the Delphic Oracle&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devjournal</category>
      <category>chatgpt</category>
      <category>openai</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Simplest Guide to Curl for REST API Requests</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Fri, 10 Feb 2023 20:26:28 +0000</pubDate>
      <link>https://dev.to/ritaly/the-simplest-guide-to-curl-for-rest-api-requests-35ii</link>
      <guid>https://dev.to/ritaly/the-simplest-guide-to-curl-for-rest-api-requests-35ii</guid>
      <description>&lt;p&gt;If I had to give a one sentence definition of a &lt;code&gt;curl&lt;/code&gt;, I would write something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;cURL&lt;/strong&gt; (&lt;em&gt;Client for URLs&lt;/em&gt;) is a command line tool that is used for transferring data over the internet via multiple protocols&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Short, but powerful! ✨ &lt;/p&gt;

&lt;p&gt;Let's face it - it's hard to imagine a API world without curl today. Almost every API documentation out there shows you how-to examples using &lt;code&gt;curl&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; provides a generic, language-agnostic way to demonstrate HTTP requests and responses. &lt;/p&gt;

&lt;p&gt;It's handy command line tool that makes it easy to send HTTP/HTTPS requests, receive data in different formats, and even automate these requests through scripting. Whether you're new to programming or more experience user earning how to use curl can save you a ton of time and effort when working with REST APIs. &lt;/p&gt;

&lt;p&gt;So, grab a cup of coffee, and let's dive into the basics of &lt;code&gt;curl&lt;/code&gt;! ☕&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GET request&lt;/li&gt;
&lt;li&gt;POST request&lt;/li&gt;
&lt;li&gt;PUT request&lt;/li&gt;
&lt;li&gt;PATCH request&lt;/li&gt;
&lt;li&gt;DELETE request&lt;/li&gt;
&lt;li&gt;Read request data from file&lt;/li&gt;
&lt;li&gt;Write response to file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For demo purposes I'm using &lt;a href="https://restful-api.dev/" rel="noopener noreferrer"&gt;{REST-API}&lt;/a&gt; - free fake API for testing &amp;amp; educational projects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;Notice for Windows users&lt;/strong&gt;:&lt;br&gt;
Windows 11: curl is provided with your system. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have Windows 10 version below 1803 (May 2018), install curl from official website (32-/64-bit)&lt;/li&gt;
&lt;li&gt;OR if you already use &lt;em&gt;Git for Windows&lt;/em&gt; (downloaded Git from git-scm.com), you have curl.exe under: &lt;code&gt;C:\Program Files\Git\mingw64\bin\&lt;/code&gt;. Simply add the path to system &lt;code&gt;PATH&lt;/code&gt; and restart command line.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, we can open terminal or command line and let's our tutorial begin! ✨&lt;/p&gt;

&lt;h3&gt;
  
  
  GET request
&lt;/h3&gt;

&lt;p&gt;GET requests are the easiest to send. All you need to do is pass our URL as an argument to the &lt;code&gt;curl&lt;/code&gt; command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.restful-api.dev/objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and receive response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Pixel 6 Pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cloudy White"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"capacity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"128 GB"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple iPhone 12 Mini, 256GB, Blue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use curl with &lt;code&gt;-v&lt;/code&gt; (shortcut to &lt;code&gt;--verbose&lt;/code&gt;) to switch on verbose mode and see more details of request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; https://api.restful-api.dev/objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's try url with &lt;strong&gt;path params&lt;/strong&gt;. We want to get object with &lt;code&gt;id&lt;/code&gt; 1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.restful-api.dev/objects/1/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Url with query params. Fetch item by id:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.restful-api.dev/objects?id=3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's try with live example - fetch dev.to articles by author's username.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://dev.to/api/articles?username&lt;span class="o"&gt;=&lt;/span&gt;ritaly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Multiple query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When using multiple query parameters in a GET request, we separate them with an ampersand (&amp;amp;).&lt;/p&gt;

&lt;p&gt;Take a look into dev.to API - combine 3 query params:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tag&lt;/code&gt;: articles that contain #devjournal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;top&lt;/code&gt;: most popular articles in the last 5 days&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;per_page&lt;/code&gt;: limit to 5 articles per page &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Note&lt;/strong&gt;&lt;br&gt;
Here we had to add double quotes for URL. Without the quotes, the shell might mistake the ampersand for the end of the command.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl  &lt;span class="s2"&gt;"https://dev.to/api/articles?tag=devjournal&amp;amp;top=5&amp;amp;per_page=5"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  POST request
&lt;/h3&gt;

&lt;p&gt;Create new object with body like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple MacBook Pro 16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2049.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"CPU model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Intel Core i9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Hard disk size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1 TB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"silver"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send POST request with curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.restful-api.dev/objects &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name":"Apple MacBook Pro 16","data":{"year":2019,"price":2049.99,"CPU model":"Intel Core i9","Hard disk size":"1 TB","color":"silver"}}'&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In response you see created object (keep its &lt;code&gt;id&lt;/code&gt; for later example).&lt;/p&gt;

&lt;p&gt;curl options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-X &amp;lt;METHOD&amp;gt;&lt;/code&gt; - specifies the HTTP method e.g. POST, PUT, PATCH, DELETE&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-H&lt;/code&gt; - submits a custom header ( curl uses &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt; as the default &lt;code&gt;Content-Type&lt;/code&gt;, we change it to &lt;code&gt;JSON&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt; - request data also called API payload, as we mention in Content-Type, data is going to be JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you need pass more than one header, just use multiple &lt;code&gt;-X&lt;/code&gt;  commands.&lt;/p&gt;

&lt;p&gt;Like in this sample &lt;code&gt;GET /objects&lt;/code&gt; example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Connection: keep-alive'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept-Language: en-GB,en-US;q=0.8,en;q=0.6'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     https://api.restful-api.dev/objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;-v&lt;/code&gt; verbose you can inspect headers applied:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; GET /objects HTTP/2
&amp;gt; Host: api.restful-api.dev
&amp;gt; user-agent: curl/7.79.1
&amp;gt; connection: keep-alive
&amp;gt; accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
&amp;gt; accept-language: en-GB,en-US;q=0.8,en;q=0.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;-A&lt;/code&gt; (&lt;code&gt;--user-agent&lt;/code&gt;) to change user agent&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Connection: keep-alive'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept-Language: en-GB,en-US;q=0.8,en;q=0.6'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s1"&gt;'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     https://api.restful-api.dev/objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; GET /objects HTTP/2
&amp;gt; Host: api.restful-api.dev
&amp;gt; user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
&amp;gt; connection: keep-alive
&amp;gt; accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
&amp;gt; accept-language: en-GB,en-US;q=0.8,en;q=0.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PUT request
&lt;/h3&gt;

&lt;p&gt;Method to update all fields = replace existing record, thats why we need to provide its &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Send &lt;code&gt;PUT&lt;/code&gt; request (replace with your &lt;code&gt;:id&lt;/code&gt;) .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT https://api.restful-api.dev/objects/:id &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name":"Apple MacBook Pro 16","data":{"year":2022,"price":2399.99,"CPU model":"M1","Hard disk size":"1 TB","color":"space grey"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PATCH request
&lt;/h3&gt;

&lt;p&gt;This method is also use to update record, but &lt;code&gt;PATCH&lt;/code&gt; only updates specified fields. &lt;/p&gt;

&lt;p&gt;Send PATCH request (replace with your &lt;code&gt;:id&lt;/code&gt;) .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH https://api.restful-api.dev/objects/:id &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name":"Fruity name"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check your record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.restful-api.dev/objects/:id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DELETE request
&lt;/h3&gt;

&lt;p&gt;Remove our resource with &lt;code&gt;DELETE&lt;/code&gt;. No payload required, just again our resource &lt;code&gt;id&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE https://api.restful-api.dev/objects/:id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your object has been deleted ;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Read request data from file
&lt;/h3&gt;

&lt;p&gt;We can read the contents of a file as a payload and use it as the request body in a curl command by using option &lt;code&gt;-d @requestfile&lt;/code&gt; - &lt;code&gt;@&lt;/code&gt; and the path to the file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST https://api.restful-api.dev/objects \
     -d @request.json \
     -H "Content-Type: application/json"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and file request.json in current directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple MacBook Pro 16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1849.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"CPU model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Intel Core i9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Hard disk size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1 TB"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Write response data to file
&lt;/h3&gt;

&lt;p&gt;We can write the response data to a file using curl, you can use the &lt;code&gt;-o&lt;/code&gt; or &lt;code&gt;--output&lt;/code&gt; option followed by the file name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.restful-api.dev/objects &lt;span class="nt"&gt;-o&lt;/span&gt; response.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Hurray! 🥳
&lt;/h3&gt;

&lt;p&gt;We've covered the basics of making API requests with cURL and different HTTP methods. But there is a lot more!&lt;/p&gt;




&lt;p&gt;I recently publish this article in polish on my blog:&lt;br&gt;
&lt;a href="https://www.flynerd.pl/2023/02/testowanie-api-curl.html" rel="noopener noreferrer"&gt;Tutorial: Jak testować API za pomocą cURL?&lt;/a&gt;&lt;/p&gt;

</description>
      <category>curl</category>
      <category>api</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to mock AWS SDK with Jest</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Fri, 24 Jun 2022 09:42:58 +0000</pubDate>
      <link>https://dev.to/ritaly/how-to-mock-aws-sdk-with-jest-361j</link>
      <guid>https://dev.to/ritaly/how-to-mock-aws-sdk-with-jest-361j</guid>
      <description>&lt;p&gt;From me to future me - how to write unit test for AWS SDK S3 presigned url with Jest&lt;/p&gt;

&lt;p&gt;Dear Journal 📖&lt;/p&gt;

&lt;p&gt;From me to future me: how to write unit test for AWS SDK S3 by example (presigned url with Jest).&lt;/p&gt;

&lt;p&gt;I hate mocks. &lt;br&gt;
That's why I always forgot how to use them when I need them.&lt;/p&gt;

&lt;p&gt;Oh Rita, have you tried to &lt;code&gt;spyOn&lt;/code&gt; AWS SDK service again? 🤦‍♀️&lt;/p&gt;

&lt;p&gt;🛑 STOP &lt;/p&gt;

&lt;p&gt;You need to either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mock element on the object (when you have an object)&lt;/li&gt;
&lt;li&gt;mock whole file (&lt;code&gt;@aws-sdk/s3-request-presigner&lt;/code&gt;). I do hate that, but I guess you don't have that much choice, unless you want to wrap it in something else 🤷‍♂️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one of the reasons OOP and dependency injection (even manual one) is better (personal preference). I can define unit, its dependencies and then in tests I simply &lt;strong&gt;deliver something that fulfils the contract&lt;/strong&gt;. No need to overwrite objects, files, etc. 🚫 &lt;strong&gt;No mocks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But sometimes there's no other option.&lt;/p&gt;

&lt;p&gt;Let's say I have a javascript or typescript file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// handler.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getSignedUrl&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="s1"&gt;@aws-sdk/s3-request-presigner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GetObjectCommand&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="s1"&gt;@aws-sdk/client-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="cm"&gt;/* do stuff */&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;command&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;GetObjectCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getSignedUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;expiresIn&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="cm"&gt;/* do other stuff */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Then in spec file: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create an mock of whole the module&lt;/li&gt;
&lt;li&gt;use empty mock function as you wish
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// handler.spec.ts&lt;/span&gt;

&lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-sdk/s3-request-presigner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getSignedUrl&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="s1"&gt;@aws-sdk/s3-request-presigner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-sdk/client-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GetObjectCommand&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="s1"&gt;@aws-sdk/client-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;handler&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="s1"&gt;./handler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;when sth do sth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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;expectedInput&lt;/span&gt; &lt;span class="o"&gt;=&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;await&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GetObjectCommand&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveBeenCalledWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expectedInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getSignedUrl&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveBeenCalled&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;p&gt;Honestly, it doesn't test this function. The fact that sth was called is not enough to confirm that expected behavior happened. It comes to the absurd: to get "real" behavior I need to mock the &lt;code&gt;getSignerUrl()&lt;/code&gt; response. &lt;/p&gt;

&lt;p&gt;So, I come to the point, where I write the mock, to test the function response, which is response from another mock, but technically is the nearest simulation of the function response and expected output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// handler.spec.ts&lt;/span&gt;

&lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-sdk/s3-request-presigner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getSignedUrl&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="s1"&gt;@aws-sdk/s3-request-presigner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-sdk/client-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GetObjectCommand&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="s1"&gt;@aws-sdk/client-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;handler&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="s1"&gt;./handler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GetUrl&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="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="na"&gt;getSignedUrlMock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Mock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getSignedUrl&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// calm down TypeScript screaming about types&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;when sth do sth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="nx"&gt;getSignedUrlMock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mockResolvedValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example-url.com&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;expectedInput&lt;/span&gt; &lt;span class="o"&gt;=&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GetObjectCommand&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveBeenCalledWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expectedInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toEqual&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;statusCode&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="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example-url.com&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="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hope, that next time you will thank yourself for this&lt;/p&gt;

&lt;p&gt;Sincerely yours &lt;br&gt;
Rita&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>javascript</category>
      <category>testing</category>
      <category>aws</category>
    </item>
    <item>
      <title>Architecture Decision Record - all you want to know about ADR</title>
      <dc:creator>Rita {FlyNerd} Lyczywek</dc:creator>
      <pubDate>Wed, 22 Jun 2022 21:52:08 +0000</pubDate>
      <link>https://dev.to/ritaly/all-you-want-to-know-about-architecture-decision-record-adr-4fag</link>
      <guid>https://dev.to/ritaly/all-you-want-to-know-about-architecture-decision-record-adr-4fag</guid>
      <description>&lt;p&gt;Developing a system over years is hard, as is writing clean, maintainable, up-to-date code. But believe me, writing easy-to-maintain AND up-to-date documentation is not trivial either. &lt;/p&gt;

&lt;p&gt;That's why I invite you to take a look at &lt;strong&gt;the Complete Guide about ADR&lt;/strong&gt; and how do we implement it in the D&amp;amp;D Beyond eCommerce team, which covers: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Engineering teams' problems&lt;/li&gt;
&lt;li&gt;What is ADR?&lt;/li&gt;
&lt;li&gt;What are the benefits of ADR?&lt;/li&gt;
&lt;li&gt;How to make ADR effective?&lt;/li&gt;
&lt;li&gt;When should ADR be written?&lt;/li&gt;
&lt;li&gt;Where should ADR be stored?&lt;/li&gt;
&lt;li&gt;ADR template&lt;/li&gt;
&lt;li&gt;References in ADR&lt;/li&gt;
&lt;li&gt;Real life examples, public repos with ADRs&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://medium.com/fandom-engineering/keep-programmers-decisions-documentation-up-to-date-and-simple-with-architecture-decision-records-8ef5f1761ba" rel="noopener noreferrer"&gt;How to keep programmers’ decisions documentation up-to-date and simple with Architecture Decision Records&lt;/a&gt;
&lt;/h3&gt;

</description>
      <category>architecture</category>
      <category>development</category>
      <category>documentation</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
