<?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: Rodel Talampas</title>
    <description>The latest articles on DEV Community by Rodel Talampas (@limacon23).</description>
    <link>https://dev.to/limacon23</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1007505%2F547b54e0-f5b1-4eec-b7c3-2e31fce315cd.jpg</url>
      <title>DEV Community: Rodel Talampas</title>
      <link>https://dev.to/limacon23</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/limacon23"/>
    <language>en</language>
    <item>
      <title>Local Kubernetes Setup</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Sat, 04 Jul 2026 08:56:03 +0000</pubDate>
      <link>https://dev.to/limacon23/local-kubernetes-cluster-3jm7</link>
      <guid>https://dev.to/limacon23/local-kubernetes-cluster-3jm7</guid>
      <description>&lt;p&gt;I started learning Kubernetes or &lt;code&gt;Kube&lt;/code&gt; a few years ago but never really written a documentation on how I started. I am not an expert, if you are going to ask, but I know my ways. &lt;/p&gt;

&lt;p&gt;In this short document, I used &lt;code&gt;helm&lt;/code&gt; and &lt;code&gt;minikube&lt;/code&gt; as my tools. If you are using Windows as your OS (or wants a Linux GUI instead), the Docker Desktop alone is your friend. Just enable Kubernetes and it will download everything you need as a start. But if you are a &lt;code&gt;linux terminal&lt;/code&gt; fan like me, then this is a guide.&lt;/p&gt;

&lt;p&gt;Let's start.&lt;/p&gt;




&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;docker client : There are many ways to install the docker client. I'd like to install it from apt directory (ubuntu fan here). This &lt;a href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository" rel="noopener noreferrer"&gt;guide &lt;/a&gt; can help.&lt;/li&gt;
&lt;li&gt;kube client (kubectl) : Similarly, you can install kubectl in different ways. I install it using &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;homebrew&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;helm : I was introduced to helm version 2 but recently changed to helm version 3. And its a big change.  I would advise to use &lt;a href="https://helm.sh/blog/helm-3-released/" rel="noopener noreferrer"&gt;helm 3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;minikube : This is your &lt;a href="https://minikube.sigs.k8s.io/docs/" rel="noopener noreferrer"&gt;local kubernetes cluster&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Basic Docker Commands
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;build : &lt;code&gt;docker build -t myapptag -f myapp/Dockerfile .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run : &lt;code&gt;docker run -p &amp;lt;container port&amp;gt;:&amp;lt;host port&amp;gt; myapptag&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Server Running Locally
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;To start the local server &lt;code&gt;minikube&lt;/code&gt; run the following
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Make sure to switch to the minikube context
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &amp;lt;minikube context&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enable inbound or internal ingress access
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube addons &lt;span class="nb"&gt;enable &lt;/span&gt;ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Helm Chart
&lt;/h4&gt;

&lt;p&gt;A &lt;strong&gt;Helm Chart&lt;/strong&gt; is a package for deploying applications to a Kubernetes cluster.&lt;br&gt;
If Docker images are like compiled applications, then Helm Charts are like installers that know how to deploy and configure those applications on Kubernetes.&lt;/p&gt;

&lt;p&gt;Without Helm, you need to use kubectl commands multiple times&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; deployment.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; service.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; ingress.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; configmap.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; secret.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; hpa.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Helm, you just need to run 1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;my-app ./my-chart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is inside a Helm Chart?
&lt;/h4&gt;

&lt;p&gt;A typical chart looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-chart/
├── Chart.yaml          # Chart metadata
├── values.yaml         # Default configuration
├── templates/
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── configmap.yaml
│   └── hpa.yaml
└── charts/             # Dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Chart.yaml
&lt;/h5&gt;

&lt;p&gt;Defines information about the package to be deployed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v2&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;My application&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;appVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.5.1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  values.yaml
&lt;/h5&gt;

&lt;p&gt;Contains configurable settings.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mycompany/my-app&lt;/span&gt;
  &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;

&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterIP&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of hardcoding values into Kubernetes YAML, templates reference them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;.Values.image.repository&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;
  &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;.Values.image.tag&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Templates
&lt;/h5&gt;

&lt;p&gt;Helm uses the Go template engine.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;.Values.replicaCount&lt;/span&gt; &lt;span class="pi"&gt;}}&lt;/span&gt;

&lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;.Values.image.repository&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}:{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;.Values.image.tag&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you install the chart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;myapp &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;replicaCount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; image.tag&lt;span class="o"&gt;=&lt;/span&gt;v2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Helm generates:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;mycompany/my-app:v2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Managing Helm Charts
&lt;/h4&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;my-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm upgrade my-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm rollback my-app &amp;lt;revision&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm uninstall my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>kube</category>
      <category>kubernetes</category>
      <category>iac</category>
      <category>container</category>
    </item>
    <item>
      <title>Codex - a.k.a. ChatGPT's AI Agent</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Thu, 02 Jul 2026 08:24:49 +0000</pubDate>
      <link>https://dev.to/limacon23/codex-aka-chatgpts-ai-agent-2g8l</link>
      <guid>https://dev.to/limacon23/codex-aka-chatgpts-ai-agent-2g8l</guid>
      <description>&lt;p&gt;Codex is OpenAI's AI coding agent, and ChatGPT is the interface you can use to interact with it. That's the difference.  &lt;/p&gt;

&lt;p&gt;As a software engineer, software development has gone through drastic shifts over the decades. We moved from assembly language to high-level programming languages, from waterfall to Agile, from on-premise infrastructure to cloud computing, and from manual deployments to DevOps and continuous delivery.&lt;/p&gt;

&lt;p&gt;The next major shift is the emergence of AI coding agents.&lt;/p&gt;

&lt;p&gt;Rather than simply generating code snippets, modern coding agents can understand an entire codebase, plan changes, execute them, run tests, fix issues, and explain their reasoning. One of the leading tools in this space is Codex.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Codex?
&lt;/h2&gt;

&lt;p&gt;Codex is an AI-powered software engineering agent designed to help developers work directly with their source code. &lt;/p&gt;

&lt;p&gt;Unlike traditional AI assistants that answer questions or generate isolated functions, Codex operates much more like another engineer on your team. It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore an existing repository&lt;/li&gt;
&lt;li&gt;Understand project architecture&lt;/li&gt;
&lt;li&gt;Make changes across multiple files&lt;/li&gt;
&lt;li&gt;Execute commands&lt;/li&gt;
&lt;li&gt;Run tests&lt;/li&gt;
&lt;li&gt;Fix compilation errors&lt;/li&gt;
&lt;li&gt;Refactor code&lt;/li&gt;
&lt;li&gt;Generate documentation&lt;/li&gt;
&lt;li&gt;Create pull-request-ready changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of asking "How do I implement JWT authentication?", you can ask Codex:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"Implement JWT authentication across this Express application using our existing middleware patterns."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Codex then performs the work inside your repository rather than simply describing how it could be done.&lt;/p&gt;




&lt;h2&gt;
  
  
  From AI Assistant to AI Engineer
&lt;/h2&gt;

&lt;p&gt;Many developers have used AI chatbots to generate code snippets.&lt;/p&gt;

&lt;p&gt;That workflow typically looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
      │
      ▼
Copy code into ChatGPT
      │
      ▼
Receive code
      │
      ▼
Paste into IDE
      │
      ▼
Fix compilation errors
      │
      ▼
Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex changes the workflow entirely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
      │
      ▼
Describe the task
      │
      ▼
Codex explores repository
      │
      ▼
Implements changes
      │
      ▼
Runs tests
      │
      ▼
Fixes issues
      │
      ▼
Produces ready-to-review changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interaction becomes goal-oriented instead of code-oriented.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the Entire Codebase
&lt;/h2&gt;

&lt;p&gt;One of Codex's biggest strengths is repository awareness.&lt;/p&gt;

&lt;p&gt;Rather than treating every prompt independently, Codex understands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;project structure&lt;/li&gt;
&lt;li&gt;frameworks&lt;/li&gt;
&lt;li&gt;existing coding conventions&lt;/li&gt;
&lt;li&gt;dependency management&lt;/li&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;naming conventions&lt;/li&gt;
&lt;li&gt;testing framework&lt;/li&gt;
&lt;li&gt;deployment configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, in a large Node.js monorepo, Codex can recognize:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apps/
packages/
shared/
infra/
docs/
.github/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It understands how these components interact and modifies only the areas relevant to the requested task.&lt;/p&gt;

&lt;p&gt;This dramatically reduces the amount of context developers need to manually provide.&lt;/p&gt;




&lt;h2&gt;
  
  
  Working Like a Real Engineer
&lt;/h2&gt;

&lt;p&gt;A typical software task rarely involves writing one function.&lt;/p&gt;

&lt;p&gt;Consider a request such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"Add audit logging whenever an invoice is approved."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A human engineer would likely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;locate the approval endpoint&lt;/li&gt;
&lt;li&gt;identify the service layer&lt;/li&gt;
&lt;li&gt;update the database model&lt;/li&gt;
&lt;li&gt;modify unit tests&lt;/li&gt;
&lt;li&gt;update integration tests&lt;/li&gt;
&lt;li&gt;document the API&lt;/li&gt;
&lt;li&gt;verify linting&lt;/li&gt;
&lt;li&gt;run the test suite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Codex follows a remarkably similar workflow. Rather than generating a single function, it works through the complete implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skills and Project Memory
&lt;/h2&gt;

&lt;p&gt;One of the most useful capabilities of Codex is its support for project-specific guidance.&lt;/p&gt;

&lt;p&gt;Teams can provide instructions that describe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coding standards&lt;/li&gt;
&lt;li&gt;architectural principles&lt;/li&gt;
&lt;li&gt;testing requirements&lt;/li&gt;
&lt;li&gt;security practices&lt;/li&gt;
&lt;li&gt;repository structure&lt;/li&gt;
&lt;li&gt;naming conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows Codex to behave consistently across an organization.&lt;/p&gt;

&lt;p&gt;For example, instructions may specify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always use dependency injection.&lt;/li&gt;
&lt;li&gt;Never access the database directly from controllers.&lt;/li&gt;
&lt;li&gt;Write unit tests before integration tests.&lt;/li&gt;
&lt;li&gt;Use repository pattern.&lt;/li&gt;
&lt;li&gt;Follow Domain-Driven Design boundaries.&lt;/li&gt;
&lt;li&gt;Never commit generated files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of repeating these instructions in every prompt, Codex learns them from project configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is an AGENTS.md
&lt;/h2&gt;

&lt;p&gt;Many teams create an AGENTS.md file that acts as an operating manual for AI coding agents. An AGENTS.md file can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;project overview&lt;/li&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;folder structure&lt;/li&gt;
&lt;li&gt;coding conventions&lt;/li&gt;
&lt;li&gt;build commands&lt;/li&gt;
&lt;li&gt;testing commands&lt;/li&gt;
&lt;li&gt;deployment process&lt;/li&gt;
&lt;li&gt;common pitfalls&lt;/li&gt;
&lt;li&gt;review checklist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Node.js 22
&lt;span class="p"&gt;-&lt;/span&gt; TypeScript only
&lt;span class="p"&gt;-&lt;/span&gt; Use Prisma ORM
&lt;span class="p"&gt;-&lt;/span&gt; No direct SQL
&lt;span class="p"&gt;-&lt;/span&gt; Unit tests required
&lt;span class="p"&gt;-&lt;/span&gt; Follow Clean Architecture
&lt;span class="p"&gt;-&lt;/span&gt; Run npm test before completion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The better this document is maintained, the more consistently Codex performs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Use Cases
&lt;/h2&gt;

&lt;p&gt;Codex excels at repetitive and complex engineering tasks.&lt;/p&gt;

&lt;p&gt;Some examples I've used Codex for include:&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs&lt;/li&gt;
&lt;li&gt;GraphQL resolvers&lt;/li&gt;
&lt;li&gt;UI components&lt;/li&gt;
&lt;li&gt;database migrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Refactoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;rename services&lt;/li&gt;
&lt;li&gt;split large classes&lt;/li&gt;
&lt;li&gt;introduce dependency injection&lt;/li&gt;
&lt;li&gt;improve architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bug fixing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;investigate failing tests&lt;/li&gt;
&lt;li&gt;locate regressions&lt;/li&gt;
&lt;li&gt;repair compilation errors&lt;/li&gt;
&lt;li&gt;resolve lint issues&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;generate API documentation&lt;/li&gt;
&lt;li&gt;update README files&lt;/li&gt;
&lt;li&gt;explain complex modules&lt;/li&gt;
&lt;li&gt;document infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;create unit tests&lt;/li&gt;
&lt;li&gt;generate mocks&lt;/li&gt;
&lt;li&gt;improve coverage&lt;/li&gt;
&lt;li&gt;fix broken test suites&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Infrastructure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS CDK&lt;/li&gt;
&lt;li&gt;Terraform&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Strengths
&lt;/h2&gt;

&lt;p&gt;Codex offers several advantages over traditional AI-assisted coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Repository Awareness&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It understands your project's structure instead of treating every prompt in isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Multi-file Editing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Real-world features often require coordinated changes across many files. Codex can handle those changes in one workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Command Execution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Codex can build projects, execute tests, run linters, and validate its own work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Consistency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When provided with project instructions, it follows the team's engineering standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Reduced Context Switching&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developers spend less time copying code into chat windows and more time reviewing completed work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Am Not trusting AI Agents 100%
&lt;/h2&gt;

&lt;p&gt;I am discussing the uses of Codex and yet, I still don't trust it. Conflicting? Probably. Despite its capabilities, Codex (and all AI Agents) is not a replacement for seasoned software engineers.&lt;/p&gt;

&lt;p&gt;Human judgment remains essential for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;system architecture&lt;/li&gt;
&lt;li&gt;product design&lt;/li&gt;
&lt;li&gt;business requirements&lt;/li&gt;
&lt;li&gt;security decisions&lt;/li&gt;
&lt;li&gt;trade-off analysis&lt;/li&gt;
&lt;li&gt;stakeholder communication&lt;/li&gt;
&lt;li&gt;technical leadership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best results come from treating Codex as an &lt;strong&gt;engineering partner&lt;/strong&gt; rather than an autonomous replacement.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Future of Software Engineering
&lt;/h1&gt;

&lt;p&gt;AI coding agents represent a significant evolution in software development.&lt;/p&gt;

&lt;p&gt;Just as integrated development environments replaced text editors, and CI/CD transformed software delivery, AI agents are reshaping how engineers interact with code.&lt;/p&gt;

&lt;p&gt;Rather than focusing on writing every line manually, developers increasingly define objectives, review implementations, and guide architectural decisions while AI handles much of the repetitive engineering work.&lt;/p&gt;

&lt;p&gt;Codex exemplifies this shift. It combines repository understanding, code generation, automated validation, and project-specific guidance into a workflow that feels less like using an autocomplete tool and more like collaborating with another engineer.&lt;/p&gt;

&lt;p&gt;For organizations willing to invest in clear architecture, strong engineering practices, and well-maintained project documentation, AI coding agents like Codex can significantly accelerate development while allowing engineers to concentrate on solving the problems that require human creativity, judgment, and experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;Teams adopting Codex tend to achieve better results when they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep repositories well organized.&lt;/li&gt;
&lt;li&gt;Maintain clear documentation.&lt;/li&gt;
&lt;li&gt;Define coding standards.&lt;/li&gt;
&lt;li&gt;Write comprehensive tests.&lt;/li&gt;
&lt;li&gt;Provide architectural guidance through AGENTS.md.&lt;/li&gt;
&lt;li&gt;Review AI-generated changes before merging.&lt;/li&gt;
&lt;li&gt;Use small, well-defined tasks.&lt;/li&gt;
&lt;li&gt;Encourage iterative collaboration rather than one-shot prompts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These practices improve not only AI-generated code but also the overall quality of the software project.&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>agents</category>
      <category>programming</category>
    </item>
    <item>
      <title>Google SRE Review - Points Taken</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Thu, 02 Jul 2026 07:56:03 +0000</pubDate>
      <link>https://dev.to/limacon23/google-sre-review-points-taken-f66</link>
      <guid>https://dev.to/limacon23/google-sre-review-points-taken-f66</guid>
      <description>&lt;p&gt;This is a continuation of my &lt;a href="https://dev.to/limacon23/google-sre-review-cheat-sheet-2hih"&gt;Google SRE Review - Cheat Sheet&lt;/a&gt;. You may want to continue reading this or jump on to the cheat sheet first.&lt;/p&gt;

&lt;p&gt;Every person will have their own ideas and perceptions. These are my own. &lt;/p&gt;

&lt;p&gt;Few chapter and points that sticked to my mind were:&lt;/p&gt;

&lt;h2&gt;
  
  
  Service Level Objectives (SLOs)
&lt;/h2&gt;

&lt;p&gt;Probably the most important chapter to me. Defining measurable metrics that tells you about the service you are providing.&lt;/p&gt;

&lt;p&gt;Many teams say:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"We need 100% uptime."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Google instead asks:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"How reliable does the service actually need to be?"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SLIs (Service Level Indicators)&lt;/li&gt;
&lt;li&gt;SLOs (Service Level Objectives)&lt;/li&gt;
&lt;li&gt;Error Budgets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Instead of saying&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"Never have downtime"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;you might define&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Availability SLO = 99.95%&lt;/li&gt;
&lt;li&gt;Latency SLO = 95% of requests under 200 ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now engineering decisions become measurable rather than emotional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eliminating Toil
&lt;/h2&gt;

&lt;p&gt;Removing repetitive manual work before it consumes the team - &lt;strong&gt;sounds&lt;/strong&gt; familiar?&lt;/p&gt;

&lt;p&gt;Google defines toil as repetitive operational work that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is manual&lt;/li&gt;
&lt;li&gt;provides no lasting value&lt;/li&gt;
&lt;li&gt;scales linearly with service growth&lt;/li&gt;
&lt;li&gt;should be automated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;restarting services&lt;/li&gt;
&lt;li&gt;cleaning queues&lt;/li&gt;
&lt;li&gt;rotating logs manually&lt;/li&gt;
&lt;li&gt;clicking deployment buttons&lt;/li&gt;
&lt;li&gt;manual failovers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If someone performs the same task every week, the system—not the person—is the problem.&lt;/p&gt;

&lt;p&gt;This chapter changed how many engineering organizations think about operational work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring Distributed Systems
&lt;/h2&gt;

&lt;p&gt;This chapter provides an excellent practical advice.&lt;/p&gt;

&lt;p&gt;It explains the famous "Golden Signals":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;traffic&lt;/li&gt;
&lt;li&gt;errors&lt;/li&gt;
&lt;li&gt;saturation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even today these are the foundation of monitoring systems.&lt;/p&gt;

&lt;p&gt;This chapter also explains why dashboards aren't enough—you need actionable alerts.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to have Alerts
&lt;/h2&gt;

&lt;p&gt;One of the most applicable chapters for all engineers. The book argues against alerting on infrastructure metrics like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU &amp;gt; 80%&lt;/li&gt;
&lt;li&gt;Memory &amp;gt; 90%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead alert when users are actually affected.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Alert if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checkout success rate drops&lt;/li&gt;
&lt;li&gt;API latency exceeds the SLO&lt;/li&gt;
&lt;li&gt;login failures increase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;rather than merely because CPU is high.&lt;/p&gt;

&lt;h2&gt;
  
  
  Responding to Incidents
&lt;/h2&gt;

&lt;p&gt;What to do when incidents happen? This covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incident commanders&lt;/li&gt;
&lt;li&gt;communication&lt;/li&gt;
&lt;li&gt;postmortems&lt;/li&gt;
&lt;li&gt;blameless culture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important thing that struct me is "The blameless postmortem philosophy".&lt;br&gt;
This has become an industry standard. Fix the issue than blame someone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capacity Planning
&lt;/h2&gt;

&lt;p&gt;How should we (not only Google) predict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storage growth&lt;/li&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;memory requirements&lt;/li&gt;
&lt;li&gt;traffic growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;before any system fails.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;The biggest lesson isn't technical.&lt;/p&gt;

&lt;p&gt;It's this:&lt;br&gt;
&lt;code&gt;Reliability is an engineering problem—not an operations problem.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instead of hiring more operators, Google (We should) writes more software.&lt;/p&gt;

&lt;p&gt;Instead of more runbooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automate deployments&lt;/li&gt;
&lt;li&gt;automate failover&lt;/li&gt;
&lt;li&gt;automate recovery&lt;/li&gt;
&lt;li&gt;automate scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a philosophy you can apply whether you run ten servers or ten thousand.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>google</category>
      <category>reviews</category>
      <category>sre</category>
    </item>
    <item>
      <title>Google SRE Review - Cheat Sheet</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Thu, 02 Jul 2026 07:18:48 +0000</pubDate>
      <link>https://dev.to/limacon23/google-sre-review-cheat-sheet-2hih</link>
      <guid>https://dev.to/limacon23/google-sre-review-cheat-sheet-2hih</guid>
      <description>&lt;p&gt;If you're a software engineer, architect, engineering manager, or platform engineer, I consider the Google SRE Book to be one of the handful of books that fundamentally changes how you think about running production systems. It's available for free online: &lt;a href="https://sre.google/sre-book" rel="noopener noreferrer"&gt;Google Site Reliability Engineering Book&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unlike many infrastructure books, it isn't about Kubernetes, AWS, or a particular technology. It's about the engineering principles behind operating systems at massive scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it different?
&lt;/h2&gt;

&lt;p&gt;Google's definition of SRE is: &lt;code&gt;"What happens when you ask a software engineer to design an operations team."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instead of treating operations as manual work, the philosophy is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automate everything possible&lt;/li&gt;
&lt;li&gt;measure reliability objectively&lt;/li&gt;
&lt;li&gt;accept that failures will happen&lt;/li&gt;
&lt;li&gt;continuously improve the system rather than firefight it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That mindset has influenced companies such as Netflix, LinkedIn, Spotify, Airbnb, and many cloud-native organizations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Review
&lt;/h2&gt;

&lt;p&gt;This is a table-format companion to the SRE book table of contents. It is meant for quick scanning, not deep reading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Model
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Short Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;Treat it as an engineering requirement, not a support outcome.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRE&lt;/td&gt;
&lt;td&gt;Run operations with software engineers and automation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk&lt;/td&gt;
&lt;td&gt;Define acceptable failure instead of pretending failure can be eliminated.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error budgets&lt;/td&gt;
&lt;td&gt;Use measurable limits to balance reliability and velocity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toil&lt;/td&gt;
&lt;td&gt;Remove repetitive manual work before it consumes the team.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incidents&lt;/td&gt;
&lt;td&gt;Respond fast, learn systematically, and improve the system.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Part I - Introduction
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;What It Says&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Foreword&lt;/td&gt;
&lt;td&gt;Reliability work deserves the same rigor as product engineering.&lt;/td&gt;
&lt;td&gt;Sets the book’s tone: operations is a discipline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preface&lt;/td&gt;
&lt;td&gt;Explains the book’s audience and purpose.&lt;/td&gt;
&lt;td&gt;Frames the book as a practical operating model, not theory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 1 - Introduction&lt;/td&gt;
&lt;td&gt;Contrasts classic ops with Google’s SRE approach.&lt;/td&gt;
&lt;td&gt;Introduces the “engineers run production” idea.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 2 - The Production Environment at Google, from the Viewpoint of an SRE&lt;/td&gt;
&lt;td&gt;Describes scale, change, and complexity in production.&lt;/td&gt;
&lt;td&gt;Shows why manual operations break at scale.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Part II - Principles
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;What It Says&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 3 - Embracing Risk&lt;/td&gt;
&lt;td&gt;Reliability is risk management with explicit trade-offs.&lt;/td&gt;
&lt;td&gt;Makes it possible to choose speed without guessing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 4 - Service Level Objectives&lt;/td&gt;
&lt;td&gt;SLIs, SLOs, and error budgets define acceptable performance.&lt;/td&gt;
&lt;td&gt;Turns reliability into measurable policy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 5 - Eliminating Toil&lt;/td&gt;
&lt;td&gt;Toil is scalable only by headcount, not software.&lt;/td&gt;
&lt;td&gt;Forces teams to invest in automation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 6 - Monitoring Distributed Systems&lt;/td&gt;
&lt;td&gt;Monitor user-visible symptoms and service health.&lt;/td&gt;
&lt;td&gt;Helps catch the failures users actually feel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 7 - The Evolution of Automation at Google&lt;/td&gt;
&lt;td&gt;Automation evolves from scripts to resilient systems.&lt;/td&gt;
&lt;td&gt;Reduces human burden and error rate.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 8 - Release Engineering&lt;/td&gt;
&lt;td&gt;Safe releases rely on testing, staging, rollout, and rollback.&lt;/td&gt;
&lt;td&gt;Makes shipping a reliability activity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 9 - Simplicity&lt;/td&gt;
&lt;td&gt;Simpler systems are easier to run and recover.&lt;/td&gt;
&lt;td&gt;Complexity is a reliability tax.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Part III - Practices
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;What It Says&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 10 - Practical Alerting&lt;/td&gt;
&lt;td&gt;Alerts should be actionable and low-noise.&lt;/td&gt;
&lt;td&gt;Prevents pager fatigue and ignored signals.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 11 - Being On-Call&lt;/td&gt;
&lt;td&gt;On-call load must remain sustainable.&lt;/td&gt;
&lt;td&gt;Protects both response quality and team health.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 12 - Effective Troubleshooting&lt;/td&gt;
&lt;td&gt;Troubleshooting is structured hypothesis testing.&lt;/td&gt;
&lt;td&gt;Reduces time wasted on random guessing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 13 - Emergency Response&lt;/td&gt;
&lt;td&gt;Incident response needs clear roles and communication.&lt;/td&gt;
&lt;td&gt;Keeps teams coordinated under pressure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 14 - Managing Incidents&lt;/td&gt;
&lt;td&gt;Incidents should be run with process, not improvisation.&lt;/td&gt;
&lt;td&gt;Improves recovery speed and consistency.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 15 - Postmortem Culture: Learning from Failure&lt;/td&gt;
&lt;td&gt;Postmortems should be blameless and action-driven.&lt;/td&gt;
&lt;td&gt;Converts outages into engineering improvements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 16 - Tracking Outages&lt;/td&gt;
&lt;td&gt;Outage data should be tracked and analyzed.&lt;/td&gt;
&lt;td&gt;Exposes patterns that individual incidents hide.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 17 - Testing for Reliability&lt;/td&gt;
&lt;td&gt;Test the failure modes, not just the happy path.&lt;/td&gt;
&lt;td&gt;Finds problems before customers do.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 18 - Software Engineering in SRE&lt;/td&gt;
&lt;td&gt;SRE must build tools and systems, not just operate them.&lt;/td&gt;
&lt;td&gt;Software leverage is what makes SRE scalable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 19 - Load Balancing at the Frontend&lt;/td&gt;
&lt;td&gt;Balance traffic at the edge to improve service behavior.&lt;/td&gt;
&lt;td&gt;Helps with latency, availability, and resilience.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 20 - Load Balancing in the Datacenter&lt;/td&gt;
&lt;td&gt;Balance traffic inside the datacenter too.&lt;/td&gt;
&lt;td&gt;Prevents hotspots and uneven failure impact.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 21 - Handling Overload&lt;/td&gt;
&lt;td&gt;Use backpressure, shedding, and prioritization.&lt;/td&gt;
&lt;td&gt;Avoids catastrophic collapse under high demand.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 22 - Addressing Cascading Failures&lt;/td&gt;
&lt;td&gt;Prevent local failures from spreading.&lt;/td&gt;
&lt;td&gt;Limits blast radius and protects the rest of the system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 23 - Managing Critical State: Distributed Consensus for Reliability&lt;/td&gt;
&lt;td&gt;Shared state needs correctness under fault.&lt;/td&gt;
&lt;td&gt;Critical coordination requires hard reliability guarantees.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 24 - Distributed Periodic Scheduling with Cron&lt;/td&gt;
&lt;td&gt;Scheduled work at scale has timing and duplication risks.&lt;/td&gt;
&lt;td&gt;Even simple jobs need operational design.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 25 - Data Processing Pipelines&lt;/td&gt;
&lt;td&gt;Pipelines should recover cleanly from partial failure.&lt;/td&gt;
&lt;td&gt;Makes large-scale processing dependable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 26 - Data Integrity: What You Read Is What You Wrote&lt;/td&gt;
&lt;td&gt;Data correctness is part of reliability.&lt;/td&gt;
&lt;td&gt;Silent corruption is a production incident.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 27 - Reliable Product Launches at Scale&lt;/td&gt;
&lt;td&gt;Launches need planning, monitoring, and rollback.&lt;/td&gt;
&lt;td&gt;Turns product launches into managed risk events.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Part IV - Management
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;What It Says&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 28 - Accelerating SREs to On-Call and Beyond&lt;/td&gt;
&lt;td&gt;Ramp SREs quickly and deliberately.&lt;/td&gt;
&lt;td&gt;Improves team capacity without lowering quality.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 29 - Dealing with Interrupts&lt;/td&gt;
&lt;td&gt;Interrupts damage deep work and throughput.&lt;/td&gt;
&lt;td&gt;Protects engineering time from fragmentation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 30 - Embedding an SRE to Recover from Operational Overload&lt;/td&gt;
&lt;td&gt;Embed SREs to stabilize overloaded teams.&lt;/td&gt;
&lt;td&gt;Sometimes the fix is changing the operating model.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 31 - Communication and Collaboration in SRE&lt;/td&gt;
&lt;td&gt;Reliability depends on trust and shared language.&lt;/td&gt;
&lt;td&gt;Reduces friction across teams.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 32 - The Evolving SRE Engagement Model&lt;/td&gt;
&lt;td&gt;SRE relationships should change as services mature.&lt;/td&gt;
&lt;td&gt;Aligns support model with system reality.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Part V - Conclusions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;What It Says&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 33 - Lessons Learned from Other Industries&lt;/td&gt;
&lt;td&gt;Other industries have useful reliability lessons.&lt;/td&gt;
&lt;td&gt;Broadens the model beyond software.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 34 - Conclusion&lt;/td&gt;
&lt;td&gt;Reliability comes from engineering discipline and automation.&lt;/td&gt;
&lt;td&gt;Reasserts the book’s main argument.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Fast Takeaways
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Takeaway&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reliability is explicit&lt;/td&gt;
&lt;td&gt;Define it, measure it, and manage it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation wins&lt;/td&gt;
&lt;td&gt;Manual ops do not scale cleanly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error budgets matter&lt;/td&gt;
&lt;td&gt;They are the mechanism for trade-offs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incidents are data&lt;/td&gt;
&lt;td&gt;Learn from them instead of just recovering.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity helps&lt;/td&gt;
&lt;td&gt;Fewer moving parts means fewer failure modes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>google</category>
      <category>sre</category>
      <category>devops</category>
    </item>
    <item>
      <title>Dynatrace monitoring for AWS Lambda</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Thu, 02 Jul 2026 06:46:49 +0000</pubDate>
      <link>https://dev.to/limacon23/dynatrace-monitoring-for-aws-lambda-2e4j</link>
      <guid>https://dev.to/limacon23/dynatrace-monitoring-for-aws-lambda-2e4j</guid>
      <description>&lt;p&gt;There are many ways to setup the dynatrace agent for Lambdas. The list can be seen below:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fssnqw4k3vr5vzjr46ewe.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fssnqw4k3vr5vzjr46ewe.png" alt=" " width="500" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't have a preferred way to do so, but looking at the way we build our lambdas, the most efficient for us is a combination of environment variables and serverless framework. &lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;As of 3 Sept 2021, Dynatrace only supports the OneAgent for Lambda which runtime based on Amazon Linux 2 image. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dynatrace.com/support/help/setup-and-configuration/setup-on-cloud-platforms/amazon-web-services/aws-lambda-integration/deploy-oneagent-as-lambda-extension/" rel="noopener noreferrer"&gt;Trace Python, Node.js, and Java Lambda functions &lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" rel="noopener noreferrer"&gt;Lambda runtimes - AWS Lambda &lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Environment Variables
&lt;/h3&gt;

&lt;p&gt;The following base environment variables need to be set into the Lambda’s environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;AWS_LAMBDA_EXEC_WRAPPER&lt;/span&gt; = /&lt;span class="n"&gt;opt&lt;/span&gt;/&lt;span class="n"&gt;dynatrace&lt;/span&gt;
&lt;span class="n"&gt;DT_TENANT&lt;/span&gt; = &lt;span class="n"&gt;vpc123456&lt;/span&gt;
&lt;span class="n"&gt;DT_CLUSTER_ID&lt;/span&gt; = &lt;span class="m"&gt;1234456789&lt;/span&gt; &lt;span class="c"&gt;# Dynatrace Cluster Id
&lt;/span&gt;&lt;span class="n"&gt;DT_CONNECTION_BASE_URL&lt;/span&gt; = &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;vpc123456&lt;/span&gt;.&lt;span class="n"&gt;live&lt;/span&gt;.&lt;span class="n"&gt;dynatrace&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="n"&gt;DT_CONNECTION_AUTH_TOKEN&lt;/span&gt; = &lt;span class="n"&gt;dt0a01&lt;/span&gt;.&lt;span class="n"&gt;vpc123456&lt;/span&gt;.&lt;span class="n"&gt;b19e9577f4cqerew43f9721ba4282a0d8004ae36bbba9983421231aaa4e&lt;/span&gt;
&lt;span class="n"&gt;DT_LOGGING_DESTINATION&lt;/span&gt;: &lt;span class="n"&gt;stdout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add log monitoring there are language-specific values that need to added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;DT_LOGGING_NODEJS_FLAGS&lt;/span&gt;: &lt;span class="n"&gt;Exporter&lt;/span&gt;=&lt;span class="n"&gt;true&lt;/span&gt;,&lt;span class="n"&gt;LambdaSensor&lt;/span&gt;=&lt;span class="n"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;DT_LOGGING_PYTHON_FLAGS&lt;/span&gt;  &lt;span class="n"&gt;dynatrace&lt;/span&gt;=&lt;span class="n"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;DT_LOGGING_JAVA_FLAGS&lt;/span&gt;=&lt;span class="n"&gt;log&lt;/span&gt;-&lt;span class="n"&gt;Transformer&lt;/span&gt;=&lt;span class="n"&gt;true&lt;/span&gt;,&lt;span class="n"&gt;log&lt;/span&gt;-&lt;span class="n"&gt;EmbeddedJarClassLoader&lt;/span&gt;=&lt;span class="n"&gt;true&lt;/span&gt;,&lt;span class="n"&gt;log&lt;/span&gt;-&lt;span class="n"&gt;OpenTelemetryUtils&lt;/span&gt;=&lt;span class="n"&gt;true&lt;/span&gt;,&lt;span class="n"&gt;log&lt;/span&gt;-&lt;span class="n"&gt;AsyncClassRetransformer&lt;/span&gt;=&lt;span class="n"&gt;true&lt;/span&gt;,&lt;span class="n"&gt;log&lt;/span&gt;-&lt;span class="n"&gt;ClassValue&lt;/span&gt;=&lt;span class="n"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the lambda is coded in NodeJS, use DT_LOGGING_NODEJS_FLAGS accordingly, and so on.&lt;br&gt;
These are hard-coded values that really never change unless we change our Dynatrace Tenancy.&lt;/p&gt;
&lt;h3&gt;
  
  
  Dynatrace Agent
&lt;/h3&gt;

&lt;p&gt;The Dynatrace agent is nothing but a simple Lambda Layer.  There are 3 Programming Languages supported at the moment: Java, NodeJS, and Python.  Each has its own Lambda Layer ARN. The AWS Region also plays a part on the ARN String Formulation. The 725887861453 being the Dynatrace AWS Account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;NodeJS&lt;/span&gt; = &lt;span class="n"&gt;arn&lt;/span&gt;:&lt;span class="n"&gt;aws&lt;/span&gt;:&lt;span class="n"&gt;lambda&lt;/span&gt;:&lt;span class="n"&gt;ap&lt;/span&gt;-&lt;span class="n"&gt;southeast&lt;/span&gt;-&lt;span class="m"&gt;2&lt;/span&gt;:&lt;span class="m"&gt;725887861453&lt;/span&gt;:&lt;span class="n"&gt;layer&lt;/span&gt;:&lt;span class="n"&gt;Dynatrace_OneAgent_1_215_1_20210326&lt;/span&gt;-&lt;span class="m"&gt;040705&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;nodejs&lt;/span&gt;:&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Java&lt;/span&gt; = &lt;span class="n"&gt;arn&lt;/span&gt;:&lt;span class="n"&gt;aws&lt;/span&gt;:&lt;span class="n"&gt;lambda&lt;/span&gt;:&lt;span class="n"&gt;ap&lt;/span&gt;-&lt;span class="n"&gt;southeast&lt;/span&gt;-&lt;span class="m"&gt;2&lt;/span&gt;:&lt;span class="m"&gt;725887861453&lt;/span&gt;:&lt;span class="n"&gt;layer&lt;/span&gt;:&lt;span class="n"&gt;Dynatrace_OneAgent_1_215_161_20210428&lt;/span&gt;-&lt;span class="m"&gt;142723&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;:&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; = &lt;span class="n"&gt;arn&lt;/span&gt;:&lt;span class="n"&gt;aws&lt;/span&gt;:&lt;span class="n"&gt;lambda&lt;/span&gt;:&lt;span class="n"&gt;ap&lt;/span&gt;-&lt;span class="n"&gt;southeast&lt;/span&gt;-&lt;span class="m"&gt;2&lt;/span&gt;:&lt;span class="m"&gt;725887861453&lt;/span&gt;:&lt;span class="n"&gt;layer&lt;/span&gt;:&lt;span class="n"&gt;Dynatrace_OneAgent_1_215_2_20210326&lt;/span&gt;-&lt;span class="m"&gt;095702&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;:&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Serverless Framework
&lt;/h3&gt;

&lt;p&gt;Depending on how you configure your serverless framework, files to be updated depends on that. In our case, we split out stages (or environment) and serverless yaml.&lt;/p&gt;

&lt;h4&gt;
  
  
  stages.yml | env.yml
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;default_env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;amp;default_env&lt;/span&gt;
  &lt;span class="na"&gt;apm_exec_wrapper&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/opt/dynatrace'&lt;/span&gt;
  &lt;span class="na"&gt;apm_tenant&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vpc123456&lt;/span&gt;
  &lt;span class="na"&gt;apm_cluster_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1234456789&lt;/span&gt; 
  &lt;span class="na"&gt;apm_base_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://vpc123456.live.dynatrace.com&lt;/span&gt;
  &lt;span class="na"&gt;apm_auth_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dt0a01.vpc123456.b19e9577f4cqerew43f9721ba4282a0d8004ae36bbba9983421231aaa4e&lt;/span&gt;
  &lt;span class="na"&gt;apm_layer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:lambda:ap-southeast-2:725887861453:layer:Dynatrace_OneAgent_1_215_1_20210326-040705_nodejs:1&lt;/span&gt;
  &lt;span class="na"&gt;apm_log_dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stdout&lt;/span&gt;
  &lt;span class="na"&gt;apm_log_flags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Exporter=true,LambdaSensor=true'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On every environment key, add the following line &amp;lt;&amp;lt;: *default_env:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;qa&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default_env&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;

&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default_env&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;

&lt;span class="na"&gt;prod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default_env&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will tell each environment to use the same settings as the default_env.&lt;/p&gt;

&lt;h4&gt;
  
  
  serverless.yml
&lt;/h4&gt;

&lt;p&gt;Create a custom layer if not yet created, add the following lines&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;custom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# custom environment &lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}}&lt;/span&gt;
  &lt;span class="c1"&gt;# dynatrace environment variables&lt;/span&gt;
  &lt;span class="na"&gt;apm_exec_wrapper&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_exec_wrapper}&lt;/span&gt;
  &lt;span class="na"&gt;apm_tenant&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_tenant}&lt;/span&gt;
  &lt;span class="na"&gt;apm_cluster_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_cluster_id}&lt;/span&gt;
  &lt;span class="na"&gt;apm_base_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_base_url}&lt;/span&gt;
  &lt;span class="na"&gt;apm_auth_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_auth_token}&lt;/span&gt;
  &lt;span class="na"&gt;apm_log_dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_log_dest}&lt;/span&gt;
  &lt;span class="na"&gt;apm_log_flags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_log_flags}&lt;/span&gt;
  &lt;span class="c1"&gt;# dynatrace lambda layer&lt;/span&gt;
  &lt;span class="na"&gt;apm_layer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${file(./stages.yml):${opt:stage}.apm_layer}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plugin the Environment variables under the provider layer, create if none&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;environment&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="s"&gt;# dynatrace environment variables&lt;/span&gt;
    &lt;span class="s"&gt;AWS_LAMBDA_EXEC_WRAPPER&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.environment.apm_exec_wrapper}&lt;/span&gt;
    &lt;span class="s"&gt;DT_TENANT&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.environment.apm_tenant}&lt;/span&gt;
    &lt;span class="s"&gt;DT_CLUSTER_ID&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.environment.apm_cluster_id}&lt;/span&gt;
    &lt;span class="s"&gt;DT_CONNECTION_BASE_URL&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.environment.apm_base_url}&lt;/span&gt;
    &lt;span class="s"&gt;DT_CONNECTION_AUTH_TOKEN&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.environment.apm_auth_token}&lt;/span&gt;
    &lt;span class="s"&gt;DT_LOGGING_DESTINATION&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.environment.apm_log_dest}&lt;/span&gt;
    &lt;span class="s"&gt;DT_LOGGING_NODEJS_FLAGS&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.environment.apm_log_flags}&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On every function that is defined, add the Dynatrace Lambda Layer&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;functions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;consume&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="na"&gt;layers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;${self:custom.apm_layer}&lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dynatrace UI
&lt;/h3&gt;

&lt;p&gt;When a Lambda is fully integrated into Dynatrace you will be able to see a direct link to the Lambda Cloudwatch Logs and it will be part of the Dynatrace Service.&lt;/p&gt;

</description>
      <category>dynatrace</category>
      <category>aws</category>
      <category>lambda</category>
    </item>
    <item>
      <title>Sending Custom / Error Events to Dynatrace</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Thu, 02 Jul 2026 06:32:14 +0000</pubDate>
      <link>https://dev.to/limacon23/sending-custom-error-events-to-dynatrace-529l</link>
      <guid>https://dev.to/limacon23/sending-custom-error-events-to-dynatrace-529l</guid>
      <description>&lt;p&gt;Alert and Notifications can be sent to Dynatrace for a Single Source of Truth against Errors and Issues encountered within an organization's applications. &lt;/p&gt;

&lt;p&gt;More detail can be found at &lt;a href="https://www.dynatrace.com/support/help/dynatrace-api/environment-api/events-v1/post-event" rel="noopener noreferrer"&gt;Events API v1 - POST an event&lt;/a&gt; and &lt;br&gt;
&lt;a href="https://www.dynatrace.com/support/help/dynatrace-api/environment-api/events-v2/post-event" rel="noopener noreferrer"&gt;Events API v2 - POST an event&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Events can be sent to Dynatrace using the Events API. For this tutorial, we will be using Events API v2 as it is very easy to use. The Events API v1 though is more precise based on my opinion. Will look into it more in another documentation post.&lt;/p&gt;
&lt;h3&gt;
  
  
  Requirements:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dynatrace API Token that can Ingest Events and Write Entities&lt;/li&gt;
&lt;li&gt;Dynatrace Events API URL&lt;/li&gt;
&lt;li&gt;Dynatrace Events API Json Body&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  API Token
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frngmalio9djbd6o0570g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frngmalio9djbd6o0570g.png" alt=" " width="640" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The API URL is https://.live.dynatrace.com/api/v2/events/ingest. &lt;/p&gt;
&lt;h3&gt;
  
  
  Request Body
&lt;/h3&gt;

&lt;p&gt;Basic Event structure is below.&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;"eventType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AVAILABILITY_EVENT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"startTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&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;"endTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&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;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&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;"entitySelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;eventType - is the type of event you want to post to Dynatrace&lt;/li&gt;
&lt;li&gt;title - is the Name of the Problem that will be displayed on the Problems Page&lt;/li&gt;
&lt;li&gt;startTime - start time of the event in UTC Milliseconds&lt;/li&gt;
&lt;li&gt;endTime - the end time of the event in UTC Milliseconds&lt;/li&gt;
&lt;li&gt;timeout - the amount of time, in seconds, the event will be highlighted on the Problems Page&lt;/li&gt;
&lt;li&gt;entitySelector - set of entities you want the event to be associated with, this is an entity query selector format&lt;/li&gt;
&lt;li&gt;properties - a map of entity properties &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only eventType and title are required and the rest are optional. If you want to attach the event to specific resources, entitySelector is your friend. If you don’t specify the timeout, 15 minutes is the default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sample Request
&lt;/h3&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;"eventType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ERROR_EVENT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Error Test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&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;"entitySelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type(service),entityName(&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;app-prod - app-lambda-instance&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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;"properties"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>dynatrace</category>
      <category>events</category>
      <category>api</category>
    </item>
    <item>
      <title>Singleton Connection with Transactions in MongoDB</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Sat, 23 Sep 2023 00:05:47 +0000</pubDate>
      <link>https://dev.to/limacon23/singleton-connection-with-transactions-in-mongodb-1b5c</link>
      <guid>https://dev.to/limacon23/singleton-connection-with-transactions-in-mongodb-1b5c</guid>
      <description>&lt;p&gt;I was looking at some patterns on how to use MongoDB Transactions but I want it to be a common wrapper and should be simple enough for nodejs beginners (like me) to understand. I saw some functions accepting another, function with multiple parameters, as a parameter, but you need to take care of &lt;code&gt;overloading&lt;/code&gt; cases.&lt;/p&gt;

&lt;p&gt;Thinking of a simple solution, why not just wrap all arguments into a single variable like a &lt;code&gt;map&lt;/code&gt;.  This may not work for others but certainly works on our case.&lt;/p&gt;

&lt;p&gt;First, I need to make sure that I only have 1 DB Connection always. Hence I created a &lt;code&gt;Singleton&lt;/code&gt; class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const mongoose = require('mongoose');
...
...

// Define Singleton DB Connection Class
class Connection {
  constructor() {
    if (!Connection.instance) {
      mongoose.connect(config.mongoose.url, config.mongoose.options);
      this.conn = mongoose.connection;
      this.conn.on('error', () =&amp;gt; logger.error.bind(console, 'connection error'));
      this.conn.on('open', () =&amp;gt; logger.info(`Connected to MongoDB ${config.mongoose.url} for Transaction...`));
    }
  }
}

module.exports = new Connection();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I will use this class in every part of my systems and it will ensure that I won't be having multiple cases of DB connection.&lt;/p&gt;

&lt;p&gt;Now to create a transaction wrapper, I do this. This is a self-managed transaction meaning I dont need to call commit and rollback. But if you want to manually handle each commit and rollback, you may do so here as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const db = require('./connection');

const withTransaction = async (fn) =&amp;gt; async (map) =&amp;gt; {
  const session = await db.conn.startSession();
  await session.withTransaction(fn(map), { session });
  session.endSession();
};

module.exports = withTransaction;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To call do something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function saveFunction(map) {
  //.. implementation
  const { var1, var2 } = map;
  // use the var1, var2 here ....
  // call mongodb CRUD here 
}

// service call
const save = async (map) =&amp;gt; {
  withTransaction(saveFunction(map));
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoping to get some comments so that I can improve this wrapper in the future.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>node</category>
    </item>
    <item>
      <title>Authorisation using NodeJS, AzureAD and MongoDB (Part 1 - Design)</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Tue, 17 Jan 2023 01:04:19 +0000</pubDate>
      <link>https://dev.to/limacon23/authorisation-using-nodejs-azuread-and-mongodb-part-1-design-5488</link>
      <guid>https://dev.to/limacon23/authorisation-using-nodejs-azuread-and-mongodb-part-1-design-5488</guid>
      <description>&lt;p&gt;Application administrators use roles to group together permissions and assign them to individual users or groups of users. These permissions determine the actions that a user is able to take within a particular software. The roles that are assigned to a user depend on their tasks within the application itself. For instance, in a simple inventory application, users who are analysts might only need permissions to browse and download, but not to modify or change information. However, in an analyst group, a senior analyst may be granted full permissions to allow them to modify existing data or create/upload new inventory data.&lt;/p&gt;

&lt;p&gt;In general, roles are used to make it easier to manage permissions by allowing administrators to assign a set of permissions to a user or group of users all at once, rather than having to assign individual permissions one at a time. This can make it more efficient to set up and manage access controls within an application.&lt;/p&gt;

&lt;p&gt;A role is therefore defined as a collection of permissions that are grouped together and assigned to a user or group of users. A permission, on the other hand, is a specific action or set of actions that a user is allowed to take within a particular application.&lt;/p&gt;

&lt;p&gt;I am designing an integration with AzureAD, and MongoDB collections using NodeJS. Roles/Groups will be created in AzureAD that will be synced in MongoDB for application usage. Each role will have its own permissions and Users can have one or more roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Definition
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Permission Schema
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const permissionSchema = mongoose.Schema(
  {
    permission: {
        type: String,
        unique: true,
        required: true
    }
  }
  {
    timestamps: true,
  }
);

const Permission = mongoose.model('Permission', permissionSchema);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Role Schema
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const roleSchema = mongoose.Schema(
  {
    role: {
        type: String,
        unique: true,
        required: true
    },
    permissions: [
      {
        permissionId: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Permission',
        },
      },
    ]
  }
  {
    timestamps: true,
  }
);

const Role = mongoose.model('Role', roleSchema);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  User Schema
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const userSchema = mongoose.Schema(
  {
    firstName: {
      type: String,
      required: true,
    },
    lastName: {
      type: String,
      required: true,
    },
    phone: {
      type: String,
      required: true,
    },
    email: {
      type: String,
      required: true,
      unique: true,
      lowercase: true,
    },
    roles: [
      {
        roleId: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Role',
        }
      },
    ],
  },
  {
    timestamps: true,
  }
);

const User = mongoose.model('User', userSchema);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Management Process
&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%2Fm14e801jbgq36btz3hdt.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%2Fm14e801jbgq36btz3hdt.png" alt=" " width="723" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sync Process
&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%2Fept7ib95c84r6g3pb38p.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%2Fept7ib95c84r6g3pb38p.png" alt=" " width="781" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  On Load
&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%2Fddql1r1hgcte06fdm051.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%2Fddql1r1hgcte06fdm051.png" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>welcome</category>
      <category>career</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>GIT Flow</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Sun, 15 Jan 2023 03:58:58 +0000</pubDate>
      <link>https://dev.to/limacon23/git-flow-5c89</link>
      <guid>https://dev.to/limacon23/git-flow-5c89</guid>
      <description>&lt;p&gt;&lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow#:~:text=The%20overall%20flow%20of%20Gitflow,merged%20into%20the%20develop%20branch" rel="noopener noreferrer"&gt;Gitflow Workflow&lt;/a&gt; is a Git workflow that helps with continuous software development and implementing &lt;a href="https://www.atlassian.com/devops/what-is-devops" rel="noopener noreferrer"&gt;DevOps&lt;/a&gt; practices. It was first published and made popular by Vincent Driessen at nvie. The Gitflow Workflow defines a strict branching model designed around the project release. This provides a robust framework for managing larger projects. This is suited for projects that releases are based on a schedule.&lt;/p&gt;

&lt;p&gt;Gitflow workflow is not for everybody. But for those who loves and using it below are some shortcuts that can help you understand what is this workflow.&lt;/p&gt;

&lt;p&gt;Installing git-flow plugin for git client is plain and simple. For mac-os, easiest to install is &lt;code&gt;brew install git-flow&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic Commands and Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;git flow init&lt;/li&gt;
&lt;li&gt;git flow feature start/finish &lt;/li&gt;
&lt;li&gt;git flow release start/finish &lt;/li&gt;
&lt;li&gt;git flow hotfix start/finish &lt;/li&gt;
&lt;li&gt;git merge &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Basic Configuration Flow&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%2Fz08ks0yavlp4po8mvwqy.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%2Fz08ks0yavlp4po8mvwqy.png" alt=" " width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concurrent Configuration Flow&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%2Fu9nneyirdqu4faiivbzw.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%2Fu9nneyirdqu4faiivbzw.png" alt=" " width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The overall flow of Gitflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;code&gt;develop&lt;/code&gt; branch is created from &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;release&lt;/code&gt; branch is created from &lt;code&gt;develop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Feature&lt;/code&gt; branches are created from &lt;code&gt;develop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When a &lt;code&gt;feature&lt;/code&gt; is complete it is merged into the &lt;code&gt;develop&lt;/code&gt; branch.&lt;/li&gt;
&lt;li&gt;When the &lt;code&gt;release&lt;/code&gt; branch is done it is merged into &lt;code&gt;develop&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If an issue in &lt;code&gt;main&lt;/code&gt; is detected a &lt;code&gt;hotfix&lt;/code&gt; branch is created from &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Once the &lt;code&gt;hotfix&lt;/code&gt; is complete it is merged to both &lt;code&gt;develop&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt; and/or &lt;code&gt;feature&lt;/code&gt; branches.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Git vs Git Flow Commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are base guidelines that corresponds to some of the git commands used by the git-flow wrapper client. These commands are not fixed in stone. Depending on situations, there are steps that can be altered or change within the course of the development.&lt;/p&gt;

&lt;p&gt;Create a develop branch on your local if one doesn’t exists in the repo. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initialisation (specific for git flow only)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git flow init
Which branch should be used for bringing forth production releases?
   - develop
   - master
Which branch should be used for integration of the "next release"?
   - master
   - develop
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Bugfix branches? [bugfix/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Hooks and filters directory? [../../.git/hooks]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creating feature branches
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git flow feature start &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout develop                     # this switches the branch to the develop branch, do a `git pull` to make sure it is latest
git checkout -b feature/&amp;lt;branch&amp;gt;         # this creates a branch named 'feature/&amp;lt;branch&amp;gt;'
git push --set-upstream origin feature/&amp;lt;branch&amp;gt;   # push changes to git repo to a new 'feature/&amp;lt;branch&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Completed a feature
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git flow feature finish &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout feature/&amp;lt;branch&amp;gt;            # this switches the branch to the 'feature/&amp;lt;branch&amp;gt;' if you are not in it, do a `git pull` to make sure it is latest
git checkout develop                     # this switches the branch to the develop branch, do a `git pull` to make sure it is latest
git merge feature/&amp;lt;branch&amp;gt;               # merge feature/branch to develop
git push                                 # push changes to git repo in develop branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creating a release branch
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git flow release start &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout develop                     # this switches the branch to the develop branch, do a `git pull` to make sure it is latest
git checkout -b release/&amp;lt;branch&amp;gt;         # this creates a branch named 'release/&amp;lt;branch&amp;gt;'
git push --set-upstream origin release/&amp;lt;branch&amp;gt;   # push changes to git repo to a new 'release/&amp;lt;branch&amp;gt;' and this will trigger the BUILD to QA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Release Completed
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git flow release finish &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout release/&amp;lt;branch&amp;gt;            # this switches the branch to the 'release/&amp;lt;branch&amp;gt;' if you are not in it, do a `git pull` to make sure it is latest
git checkout develop                     # this switches the branch to the develop branch, do a `git pull` to make sure it is latest
git merge release/&amp;lt;branch&amp;gt;               # merge release/branch to develop
git push                                 # push changes to git repo in develop branch
git checkout main                        # this switches the branch to the main branch, do a `git pull` to make sure it is latest
git merge release/&amp;lt;branch&amp;gt;               # merge release/branch to main
git push                                 # push changes to git repo in main branch
git push --tags                          # push tags
git push -d origin release/&amp;lt;branch&amp;gt;      # delete remote branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creating a hotfix
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git flow hotfix start &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout main                        # this switches the branch to the main branch, do a `git pull` to make sure it is latest
git checkout -b hotfix/&amp;lt;branch&amp;gt;          # this creates a branch named 'hotfix/&amp;lt;branch&amp;gt;'
git push --set-upstream origin hotfix/&amp;lt;branch&amp;gt;   # push changes to git repo to a new 'hotfix/&amp;lt;branch&amp;gt;' and this will trigger the BUILD to QA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Hotfix Completed
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git flow hotfix finish &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout hotfix/&amp;lt;branch&amp;gt;             # this switches the branch to the 'hotfix/&amp;lt;branch&amp;gt;' if you are not in it, do a `git pull` to make sure it is latest
git checkout develop                     # this switches the branch to the develop branch, do a `git pull` to make sure it is latest
git merge hotfix/&amp;lt;branch&amp;gt;                # merge hotfix/branch to develop
git push                                 # push changes to git repo in develop branch
git checkout main                        # this switches the branch to the main branch, do a `git pull` to make sure it is latest
git merge hotfix/&amp;lt;branch&amp;gt;                # merge hotfix/branch to main
git push                                 # push changes to git repo in main branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>discuss</category>
      <category>community</category>
      <category>welcome</category>
    </item>
    <item>
      <title>Enabling PlantUML in Visual Studio Code</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Sun, 15 Jan 2023 03:42:45 +0000</pubDate>
      <link>https://dev.to/limacon23/enabling-plantuml-in-visual-studio-code-6ca</link>
      <guid>https://dev.to/limacon23/enabling-plantuml-in-visual-studio-code-6ca</guid>
      <description>&lt;p&gt;&lt;a href="https://plantuml.com/" rel="noopener noreferrer"&gt;PlantUML&lt;/a&gt; is a component that allows you to quickly write the following diagrams in plain and simple intuitive language - a.k.a. Diagram-As-Code.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sequence diagram&lt;/li&gt;
&lt;li&gt;Usecase diagram&lt;/li&gt;
&lt;li&gt;Class diagram&lt;/li&gt;
&lt;li&gt;Object diagram&lt;/li&gt;
&lt;li&gt;Component diagram&lt;/li&gt;
&lt;li&gt;Deployment diagram&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are many similar tools out there. &lt;code&gt;PlantUML&lt;/code&gt; is free to use and was created using Java and GraphViz.  A simple way of using it is to download the &lt;a href="http://sourceforge.net/projects/plantuml/files/plantuml.jar/download" rel="noopener noreferrer"&gt;plantuml.jar&lt;/a&gt; and run it to open PlantUML's &lt;a href="https://plantuml.com/gui" rel="noopener noreferrer"&gt;graphical user interface&lt;/a&gt;. There is no need to unpack or install anything.&lt;/p&gt;

&lt;p&gt;Most developers use Visual Studio Code, why not install its plugin:&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%2Facgkgcaytxno7s15mt4k.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%2Facgkgcaytxno7s15mt4k.png" alt=" " width="603" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Browse the plugin and click install.  After installing the plugin, there is a need to install GraphViz binary. You can follow the link to install &lt;a href="https://graphviz.org/download/" rel="noopener noreferrer"&gt;it&lt;/a&gt;.  For mac users, easy to run &lt;code&gt;brew install graphviz&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When all done, create a test file &lt;code&gt;test.puml&lt;/code&gt;  and add the following code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@startuml Basic Sample
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(admin, "Administrator")
System_Boundary(c1, "Sample System") {
    Container(web_app, "Web Application", "C#, ASP.NET Core 2.1 MVC", "Allows users to compare multiple Twitter timelines")
}
System(twitter, "Twitter")

Rel(admin, web_app, "Uses", "HTTPS")
Rel(web_app, twitter, "Gets tweets from", "HTTPS")
@enduml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press &lt;code&gt;Option + D&lt;/code&gt; in Mac or &lt;code&gt;Alt-D&lt;/code&gt; for other OS's, should give the following output:&lt;/p&gt;

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

</description>
      <category>tutorial</category>
      <category>vscode</category>
      <category>uml</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Blackbox - Secrets amongst your code</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Sun, 15 Jan 2023 03:29:21 +0000</pubDate>
      <link>https://dev.to/limacon23/blackbox-secrets-amongst-your-code-11jm</link>
      <guid>https://dev.to/limacon23/blackbox-secrets-amongst-your-code-11jm</guid>
      <description>&lt;p&gt;One of the major concerns amongst developers is how to store shared secrets. Storing secrets in a config file along with your source code is problematic as it can compromise privacy. Storing it outside without proper process or documentation can tend to be forgotten (not saying this is not good as using &lt;code&gt;SAAS&lt;/code&gt; tools like &lt;code&gt;Vault&lt;/code&gt; is the way to go). But in case you have a limited budget and limited capability, using &lt;code&gt;GPG&lt;/code&gt; is the way to go. Here comes &lt;a href="https://github.com/StackExchange/blackbox" rel="noopener noreferrer"&gt;Blackbox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For any secrets you want to store alongside the source code, we should limit the risk of intentional or accidental sharing by encrypting secrets.&lt;/p&gt;

&lt;p&gt;You should encrypt these data in your repositories:&lt;/p&gt;

&lt;p&gt;SSH keys&lt;br&gt;
Private keys&lt;br&gt;
Usernames and passwords&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Blackbox&lt;/code&gt; is a GPG-based encryption tool for Git. Assuming &lt;code&gt;Homebrew&lt;/code&gt; is installed in a mac or linux machine, the command below is sufficient. Otherwise look for the Blackbox link above for more information&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GPG Keys&lt;/strong&gt;&lt;br&gt;
GnuPG, also known as GPG, is a free, full implementation of the OpenPGP standard as outlined in RFC4880 (also known as PGP). It enables you to encrypt, sign and authenticate data and communication.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --full-generate-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When key has been generated, look through the messages that displayed on the screen and find your Key ID.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg: key &amp;lt;key_id&amp;gt; marked as ultimately trusted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate a revocation certificate for the primary public key. If your private key is compromised or lost, this revocation certificate may be published to notify others that the public key should no longer be used.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --output revoke.asc --gen-revoke &amp;lt;key_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The revoke.asc file is stored in your user directory. Store the certificate key somewhere safe, ideally &lt;code&gt;keypass&lt;/code&gt; or &lt;code&gt;macpass&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add your public key to the keys server so that others have verify it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --keyserver=pgp.key-server.io --armor --send-keys &amp;lt;key_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browse to pgp.key-server.io and search for your name to see if your gpg key is there or not.&lt;/p&gt;

&lt;p&gt;In case pgp.key-server.io is not registering your key, use other public known keyservers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://keys.openpgp.org/" rel="noopener noreferrer"&gt;https://keys.openpgp.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://keyserver.ubuntu.com/" rel="noopener noreferrer"&gt;https://keyserver.ubuntu.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pgp.mit.edu/" rel="noopener noreferrer"&gt;https://pgp.mit.edu/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Using Blackbox&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make a repository a &lt;code&gt;blackbox&lt;/code&gt; repo
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ blackbox_initialize 
Enable blackbox for this git repo? (yes/no) y
VCS_TYPE: git

NEXT STEP: You need to manually check these in:
      git commit -m'INITIALIZE BLACKBOX' .blackbox /talampas/development/repo/.gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add a new user in the &lt;code&gt;blackbox&lt;/code&gt; repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a need to look for the user's key to verify and add it in your keychain&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --keyserver keys.openpgp.org --search-key &amp;lt;personA@email.com | fingerprint&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the user as an admin of &lt;code&gt;blackbox&lt;/code&gt; for that repo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blackbox_addadmin &amp;lt;personA@email.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update all secret files to incorporate the new key registered&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Do a commit / push for the repo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# the next two lines are not required if no other files where edited
git add .
git commit -m"Add new user - personA"
# Required to push changes
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Updating Blackbox Encrypted files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If there is a need to update the secrets in the encrypted file, follow the steps below    &lt;/p&gt;

&lt;p&gt;Open the file for editing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blackbox_edit_start &amp;lt;filename&amp;gt;.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;End the Editing process&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blackbox_edit_end &amp;lt;filename&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same as above, commit and push when you're done&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Developer Setup for Mac</title>
      <dc:creator>Rodel Talampas</dc:creator>
      <pubDate>Sun, 15 Jan 2023 02:49:44 +0000</pubDate>
      <link>https://dev.to/limacon23/developer-setup-for-mac-epc</link>
      <guid>https://dev.to/limacon23/developer-setup-for-mac-epc</guid>
      <description>&lt;p&gt;You have a new MacBook! Congrats! &lt;/p&gt;

&lt;p&gt;You need to setup your mac to be Developer Ready and don't know what to do. You are in the right place. I have compiled a list of installation scripts for a typical Developer to kick start a Developer Machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macOS Updates&lt;/strong&gt;&lt;br&gt;
Before installing any applications you require, it is a good idea to update the Operating System. As much as possible, I try to have the latest version of the MacOS with patches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XCode&lt;/strong&gt;&lt;br&gt;
First step, you need to install &lt;b&gt;XCode&lt;/b&gt; which is Apple's integrated development environment for MacOS. You can download it in the Apple Store free of charge. There is a command line instruction to install xcode. Open a new terminal and type the code below.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Homebrew&lt;/strong&gt;&lt;br&gt;
I pretty much use &lt;code&gt;Homebrew&lt;/code&gt; or &lt;code&gt;brew&lt;/code&gt; to install anything on my MacBook and Linux Machines. Run the following commands to download and install &lt;code&gt;brew&lt;/code&gt; and upgrade it, though there should not be anything to upgrade. No harm doing though.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Python 3 and JQ&lt;/strong&gt;&lt;br&gt;
Next to Java, Python is probably my next go to programming language. I used python a lot to build client tools and serverless applications. &lt;code&gt;JQ&lt;/code&gt; is a tool to parse JSON Strings and I predominantly use this with python and aws. &lt;code&gt;VirtualEnv&lt;/code&gt; is my favorite environment configuration for python. Python virtualization is a must if you are going to develop using python. Python is also a requirement for some client tools like &lt;code&gt;awscli&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install python3
curl https://bootstrap.pypa.io/get-pip.py | python3
pip install virtualenv
brew install jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;br&gt;
I work mostly with AWS Cloud hence I require AWS Client that uses Python. If you are not in AWS, you may skip this part. This command will help you install and upgrade your aws client. I have both added &lt;code&gt;awscli&lt;/code&gt; and &lt;code&gt;awscli-local&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install awscli
brew link awscli --overwrite 
pip install awscli-local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Docker Desktop&lt;/strong&gt;&lt;br&gt;
Since Mac-OS is not a linux distro, it is impossible to install docker base binaries. Don't fear though, docker created a desktop installer for mac &lt;a href="https://docs.docker.com/desktop/install/mac-install/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Localstack&lt;/strong&gt;&lt;br&gt;
Since AWS is a paid service, creating infrastructure usually cost $$$ if you are unable to use the free-tier. To test out my infrastructure-as-code scripts, I spin up a Mock AWS Service called &lt;code&gt;localstack&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terminal&lt;/strong&gt;&lt;br&gt;
MacOS' terminal is nice, no complains about it. As a developer, sometimes I would like to work on multiple Terminals but within the same window. Hence, I require some Split functionality and &lt;code&gt;iTerm2&lt;/code&gt; has that capability. ZSH is the prefered console of MacOS terminal nowadays.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chsh -s /bin/zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
brew install iterm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NodeJS&lt;/strong&gt;&lt;br&gt;
As much as I don't want to tackle NodeJS, this programming language is pretty much use anywhere from backend processing to UI development using frameworks such as &lt;code&gt;react&lt;/code&gt; or &lt;code&gt;angular&lt;/code&gt; or &lt;code&gt;vue&lt;/code&gt;. Somehow, I got the hang of this programming framework as well. I've been using this in my side projects. &lt;code&gt;Yarn&lt;/code&gt; is my favourite package manager. You can install any PM you want.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Serverless Framework&lt;/strong&gt;&lt;br&gt;
Between AWS Severless Application Model (&lt;code&gt;SAM&lt;/code&gt;) and Serverless Framework (&lt;code&gt;SLS&lt;/code&gt;), I prefer the latter. Both framework patterns their syntax from AWS Cloudformation, but I firmly believe Serverless Framework is more mature. Don't get me wrong, I love &lt;code&gt;AWS&lt;/code&gt;. SLS is my own choice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -o- -L https://slss.io/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Infrastructure As Code&lt;/strong&gt;&lt;br&gt;
I've been using Cloudformation ever since I had moved to the cloud. But when I've learned &lt;code&gt;Terraform&lt;/code&gt;, I seldom touch Cloudformation unless I am working with &lt;code&gt;SLS&lt;/code&gt; above.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Git and Git Flow&lt;/strong&gt;&lt;br&gt;
In one way or another, you might be using a Source Code Versioning System like &lt;code&gt;github&lt;/code&gt; or &lt;code&gt;gitlab&lt;/code&gt;. A &lt;code&gt;git&lt;/code&gt; client is required.I have added a plugin called &lt;code&gt;git flow&lt;/code&gt; for the purpose of following a release framework.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Database Connectivity Tool&lt;/strong&gt;&lt;br&gt;
We use databases to persist data. I've used a lot of databases in my career, from &lt;code&gt;MS SQL Server&lt;/code&gt; to &lt;code&gt;Oracle&lt;/code&gt; to &lt;code&gt;Postgres&lt;/code&gt; or &lt;code&gt;MySQL&lt;/code&gt;. I don't have a clear favourite but for this tutorial, I will go with the easiest &lt;code&gt;postgres&lt;/code&gt;. Take note, this is only a connection tool, you may ask how do you install your database? As I've mentioned above, I would containerise my databases, read it &lt;a href="https://dev.to/limacon23/postgres-database-in-a-docker-container-367g"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Miscellaneous Tools&lt;/strong&gt;&lt;br&gt;
The rest of the apps in this code block are optional. Some are required due to the fact that I am using it like gpg for encryption and java being my favourite programming language. It is to your discretion if you will install them or not. &lt;code&gt;Atom&lt;/code&gt; here is a good IDE but since Microsoft bought Github, it is not being developed anymore and &lt;a href="https://go.microsoft.com/fwlink/?LinkID=534106" rel="noopener noreferrer"&gt;Visual Studio Code Express&lt;/a&gt; is the preferred IDE.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install atom
brew install kubectx
brew install gpg
brew install blackbox
brew install java
brew cask install eclipse-java
brew cask install postman
brew install macpass
brew install credstash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;Full Script&lt;/h4&gt;

&lt;p&gt;For all the apps that can be installed using the terminal, I've compiled a full list below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install Homebrew - preferred apps installation manager
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew upgrade

# Install Python 3
brew install python3
# update pip 
curl https://bootstrap.pypa.io/get-pip.py | python3
# install virtualenv for python, if you dont use python no need to install this
pip install virtualenv
# install jq
brew install jq

# Install AWS Client using Homebrew
brew install awscli
# if there is already an install client, ovewrite its softlink
brew link awscli --overwrite 
# install aws client for localstack
pip install awscli-local


# install docker using docker installer
brew cask install docker

# install localstack
pip install localstack

# preferred mac terminal
brew install iterm2

# CHANGE TO zsh, if you want too.
chsh -s /bin/zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# all about NODEJS
brew install node
brew install nvm
brew install yarn
# if your office has certificate restrictions, you may want to remove ssl restriction
yarn config set strict-ssl false

# for AWS lambda deployment, we prefer Serverless Framework
curl -o- -L https://slss.io/install | bash

# for Infrastructure as Code
brew install terraform

#install git
brew install git

# install git flow
brew install git-flow

# postgres tool
brew install libpq 

# this is my preferred editor, if you dont like it dont install it
brew install atom

# some passwords used for OPs are in keepass and macpass is the keepass version for mac
brew install macpass

# we do use kubernetes, this is required to connect to it
brew install kubectx

# install gpg 
brew install gpg

# install Java
brew install java
brew cask install eclipse-java
brew cask install postman

# password tools
brew install blackbox
brew install credstash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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