<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Steven Randolph</title>
    <description>The latest articles on DEV Community by Steven Randolph (@complexmathguy).</description>
    <link>https://dev.to/complexmathguy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F244583%2Fa1b40e93-1136-49a0-8ae0-606444354eb7.jpg</url>
      <title>DEV Community: Steven Randolph</title>
      <link>https://dev.to/complexmathguy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/complexmathguy"/>
    <language>en</language>
    <item>
      <title>Jumper Cables</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Mon, 24 Feb 2020 15:50:00 +0000</pubDate>
      <link>https://dev.to/realmethods/jumper-cables-1h00</link>
      <guid>https://dev.to/realmethods/jumper-cables-1h00</guid>
      <description>&lt;p&gt;Have a great idea but have limited to no cash and need help becoming VC, incubator or accelerator ready?  jumpstartup.io is worth a look.&lt;/p&gt;

</description>
      <category>startup</category>
    </item>
    <item>
      <title>realMethods now certified on Nutanix Acropolis Hypervisor</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Fri, 22 Nov 2019 15:23:23 +0000</pubDate>
      <link>https://dev.to/complexmathguy/realmethods-now-certified-on-nutanix-acropolis-hypervisor-aa0</link>
      <guid>https://dev.to/complexmathguy/realmethods-now-certified-on-nutanix-acropolis-hypervisor-aa0</guid>
      <description>&lt;p&gt;Nutanix has certified realMethods Project Generator as Nutanix Ready AHV in Applications on Nutanix Acropolis Hypervisor.&lt;/p&gt;

&lt;p&gt;Nutanix Ready identifies recommended applications and solutions that are trusted to enhance the Nutanix delivery infrastructure. &lt;/p&gt;

</description>
      <category>certified</category>
      <category>devops</category>
      <category>virtual</category>
    </item>
    <item>
      <title>Poll:  Please answer a few HPE questions.</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Fri, 22 Nov 2019 05:54:39 +0000</pubDate>
      <link>https://dev.to/complexmathguy/poll-a-few-hpe-questions-1gho</link>
      <guid>https://dev.to/complexmathguy/poll-a-few-hpe-questions-1gho</guid>
      <description>&lt;p&gt;I am curious to hear what others know and think about HPE. I do not work for HPE.  I am simply trying to get an understanding of the company software/DevOps wise. Not knowing or having heard of HPE is important to know too. &lt;/p&gt;

&lt;p&gt;Thanks to all. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Do you associate HPE with DevOps?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you hear &lt;em&gt;Hewlett Packard&lt;/em&gt;, what things come to mine?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have you used an HPE product in the normal course of building a software app? Was that product hardware or software and which one(s).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Would you consider using the HPE container platform in place of your current container platform?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>contributorswanted</category>
      <category>help</category>
    </item>
    <item>
      <title>We Built a Project Generator Because 
DevOps Needs One
</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Sat, 09 Nov 2019 22:28:48 +0000</pubDate>
      <link>https://dev.to/realmethods/we-built-a-project-generator-because-devops-needs-one-10id</link>
      <guid>https://dev.to/realmethods/we-built-a-project-generator-because-devops-needs-one-10id</guid>
      <description>&lt;p&gt;We, realMethods, are a small System Integrator.  As a small SI with limited resources, we needed an advantage to compete for large engagements.  We needed a lever we could pull that the bigger SIs could not.  Before plowing head first into developing something, it was important to reflect on what we actually needed, had tried and experienced, what worked and did not work, and what mattered today that would still be relevant tomorrow.  &lt;/p&gt;

&lt;p&gt;We came up with 9 statements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Simple to use, Then Get Out Of The Way&lt;/strong&gt;&lt;br&gt;
If a tool can serve a single purpose with minimum input and very useful output, they have me as a loyal user.  Good tool developers recognize they don’t own the entire toolbelt and find a place to fit for a well defined task.  And once used, they know how to get out of the way so work can continue.  They add value to the work continuum without needing to be the star of the show.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;It must fit a current need and do so without disrupting a Developer’s normal course of work.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Overcome “Generator Bias”&lt;/strong&gt;&lt;br&gt;
Some of the team initially had no interest in heading down the “Generator” path.  Generators fundamentally have a tenuous reputation.  Most come with a lot of hype and promise followed by a let down. &lt;/p&gt;

&lt;p&gt;Although automation is a pillar of DevOps, automation of the required code still has its skeptics.  More interesting is how “everything as code” is widely accepted yet using code to create code is not an integral DevOps phase.  &lt;/p&gt;

&lt;p&gt;We decided to use logic over prior bias. If we could generate entire projects, we could do more with fewer resources for lower cost in less time, leading to us winning more client engagements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. We need contextual projects generated, not just applications or code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A bit of common understanding&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code Generator:&lt;/em&gt; creates the beginning of an application with no promise of one.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Application Generator:&lt;/em&gt; creates code with the expectation of minimally functionality.  All the pieces are likely buildable, but the result still lacks the configuration required of an operational environment.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Project Generator:&lt;/em&gt; Creates an application along with all the files to build, test, archive, package, containerize, and finally deploy the application.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Model-Driven Project Generator:&lt;/em&gt; Creates everything by applying an entity domain wherever appropriate among the generated assets.  It is the closest a first commit of a project can come to its final commit.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;It must generate all business contextual code and files such that an operational CI/CD pipeline can flow the resulting application from build through deployment.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Can't Live Without It&lt;/strong&gt;&lt;br&gt;
We need to build something that when used once, we will never want to go back to life without it.  This is true for us and our clients.  Not only because it offers a clear competitive advantage.  It provides early project lift we have become professionally and psychologically dependent on.  We don’t have to worry about writing the low level plumbing any more.  We don’t want to.  Just as we have become dependent on the leverage our tool chain offers, having to instead manually reproduce the 10s to 100s of 1000s of lines of code would be demoralizing.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;It must provide so much value, once used a user will never want to start a DevOps project without it.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Can Never Predict What A Client Needs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We start new projects with a client,and until told, we have no idea about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business entity domain&lt;/li&gt;
&lt;li&gt;CI platform(s) to use&lt;/li&gt;
&lt;li&gt;Cloud or on-prem or hybrid&lt;/li&gt;
&lt;li&gt;Relational vs NoSQL&lt;/li&gt;
&lt;li&gt;Traditional App vs Serverless vs Restful APIs vs Microservices&lt;/li&gt;
&lt;li&gt;Technology Stack / Language&lt;/li&gt;
&lt;li&gt;Application specific things like name, description, corporate logo, etc.&lt;/li&gt;
&lt;li&gt;Git server and credentials&lt;/li&gt;
&lt;li&gt;Docker image creation details&lt;/li&gt;
&lt;li&gt;Kubernetes cluster details
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;It must be fully customizable to accommodate a project’s requirements&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Support Declarative DevOps&lt;/strong&gt;&lt;br&gt;
There is “as-code” for containers,orchestration, infrastructure, configuration, and pipelines, so why not a project?&lt;/p&gt;

&lt;p&gt;What we built had to follow suit.  If a project’s technical requirements can be described, then those requirements can be declared and codified in a YAML file. The tool had to hide the messy details of the "how" in order to create the "what". Just like other "as-code" implementations, it should be easy to use.&lt;/p&gt;

&lt;p&gt;Simply stated, &lt;a href="http://www.projectascode.com"&gt;Project-as-Code&lt;/a&gt; allows us to make the following declarative statement to turn requirements into a running CI pipeline with a functional application flowing through it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have a business model I would like to apply to an Angular7 tech stack. I want &amp;gt;to store data using MongoDB.  I would like the resulting project files to be &amp;gt;committed to my GitHub repo, the source files to be built and tested using &amp;gt;CircleCI, and the resulting application pushed as a Docker image to my container &amp;gt;repository then finally deployed to a designated Kubernetes cluster on GCP."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The resulting YAML looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    techstack:
       identifier:              Angular7Stack
    model:
       identifier:              Some business model file location
    options:
        application:
            name:             MyAngular7App
            version:           0.0.1
        cicd:
            platform:         circleci    
        git:            
            username:      gitUId
            password:       gitPwd
            repository:       gitRepo
            tag:                  anyTag
            host:                anyGitHost 
        docker:
            userName:      dockerUId
            password:       dockerPwd
            orgName:        dockerOrg
            repo:                dockerRepo
            tag:                  dockerTag
        kubernetes:
            host:                  https://xxx.xxx.xxx.xxx
            hostTarget:        google
            username:         k8UId
            password:          k8Pwd
        artifact-repo:
            type:                   jFrog
            userName:         jFrogUId
            password:          jFrogPwd
            repoUrl:              http://xxx.xxx.xxx.xxx:8081/repository/npm-public
        mongodb: 
            serverAddress:   localhost:27017
            databaseName:  angularDemoDB
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The tool must hide the heavy lifting of project generation by accepting a single configuration file containing the project declarations to then execute the intent of the file’s author&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Being Small and Lazy Is A Good Thing&lt;/strong&gt;&lt;br&gt;
A small SI needs to be super efficient doing as little as possible while still fulfilling all required tasks.  Each individual task is evaluated as a generation candidate and if found not to be, we look to discover if it (or a variant) has already been built. If it has, we either reuse or extend it.  That allows a small team to create output at the scale and pace of much larger teams.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Generate all you can, especially all the things nobody wants to write but are needed by the project.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Make Accommodations For Smarter People&lt;/strong&gt;&lt;br&gt;
By design we chose to capture expertise through the templatizing of a tech stack (we call it a tech stack package).  This package contains everything needed to represent the intent of its author, along with other information to interact with the tool during generation time.&lt;/p&gt;

&lt;p&gt;The tool cannot make assumptions about the purpose of a tech stack package, so long as it is well formed according to documented standards.  This allows expertise to be consumed indiscriminately.  Although the focus of the tool is on model-driven DevOps projects, a fortunate consequence of our design is that it can generate any type of application, project, and other packages relying on file-based outcomes.  &lt;/p&gt;

&lt;p&gt;There are too many permutations of languages and technologies to think we could capture them all at once or capture any perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. A Client Entity Model and Our Meta Model Make The Difference&lt;/strong&gt;&lt;br&gt;
Two projects might use the same programming  language with similar technical requirements but differ in their entity models.  We support standard model definition types to allow the inclusion of business context into the generation.  Without this, we would only be able to generate a glorified “Hello World” app.&lt;/p&gt;

&lt;p&gt;Importantly, we developed a meta-model with support for factory plug-ins for each model definition type.  A plug-in uses the tools’ meta-model API to help translate the input model to the meta-model structure.  In turn, a tech stack package consumes the meta-model through the same API.  A template within a tech stack package makes output decisions based on the content of the meta-model among other things.&lt;/p&gt;

&lt;p&gt;The tool must support an extensible way of including business context into project generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
We built a tool that we and our clients use to generate DevOps projects with minimal upfront effort.  Tens to hundreds of thousands of lines of code we need suddenly appear. With &lt;a href="http://www.projectascode.com"&gt;Project-as-Code&lt;/a&gt;, there is now something to automate the automation behind DevOps.  It serves as a catalyst to DevOps to help lower hurdles to get from idea to container easier and faster. &lt;a href="http://www.projectascode.com"&gt;Project-as-Code&lt;/a&gt; is a real thing because it makes sense.  It fits nicely between discovering the intent of a project and realizing its first commit.  It will take time before project generation becomes a standard phase in the DevOps life-cycle.  We believe it will eventually and for us and some forward thinking companies, it already has.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
      <category>docker</category>
      <category>opensource</category>
    </item>
    <item>
      <title>realMethods CircleCI Orb Integration</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Sat, 09 Nov 2019 22:02:02 +0000</pubDate>
      <link>https://dev.to/realmethods/realmethods-circleci-orb-integration-1mk8</link>
      <guid>https://dev.to/realmethods/realmethods-circleci-orb-integration-1mk8</guid>
      <description>&lt;p&gt;Demonstration of the realMethods Orb for integration in to CircleCI&lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
      <category>cicd</category>
    </item>
    <item>
      <title>realMethods 101</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Sat, 09 Nov 2019 22:01:39 +0000</pubDate>
      <link>https://dev.to/realmethods/realmethods-101-1c0m</link>
      <guid>https://dev.to/realmethods/realmethods-101-1c0m</guid>
      <description>&lt;p&gt;An introduction video to realMethods and project generation.  Includes integration to Nexus Sonatype&lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Project-as-Code: Furthering Declarative DevOps</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Tue, 22 Oct 2019 19:58:46 +0000</pubDate>
      <link>https://dev.to/complexmathguy/project-as-code-furthering-declarative-devops-1i83</link>
      <guid>https://dev.to/complexmathguy/project-as-code-furthering-declarative-devops-1i83</guid>
      <description>&lt;p&gt;If you are familiar with &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;, &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt;, and the most popular CI platforms (eg: CircleCI, Codeship), you already know the power behind &lt;a href="https://itnext.io/declarative-devops-30788ddd43cd"&gt;Declarative DevOps&lt;/a&gt;.  These technologies hide an incredible amount of reuse and detail by supporting simple structured syntax in an easy to create and read YAML file.  Need an Ubuntu image? Done.  How about a MongoDB instance?  You got it. Need to do something completely custom?  Got for it.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sU4uNAKt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9rwiy5oeiyeekznx2dpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sU4uNAKt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9rwiy5oeiyeekznx2dpu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation Makes DevOps Go
&lt;/h2&gt;

&lt;p&gt;I suggest taking a quick read of an article by BMC titled &lt;a href="http://documents.bmc.com/products/documents/92/38/509238/509238.pdf"&gt;Automate Cloud &amp;amp; DevOps Initiatives Across All Phases&lt;/a&gt;.  If automation is the orchestration of DevOps, declarative DevOps is its sheet music.  It provides a readable format to play out the intent of the composer.  Importantly, it simplifies the learning curve of using many traditional tools in the chain.  Sure, it takes time to set up all the distinct and disparate pieces, but once it is done, it hums along rather well uninterrupted.  It serves the project’s needs.  My CI platform orchestrates things and has its own declarative syntax and requirements.  Within it, I am able to do custom things to build and test my project, then invoke both my Docker and Terraform declarative requirements.  &lt;/p&gt;

&lt;p&gt;However, from project to project, nothing is exactly the same.  For example, Terraform changes due to cloud provider, CI changes due to tech stack selection, and Docker changes as well.  Different URLs and security credentials to connect to certain things, optional use of an artifact repository (like &lt;a href="https://jfrog.com/"&gt;JFrog&lt;/a&gt; or &lt;a href="https://www.sonatype.com/"&gt;Sonatype&lt;/a&gt;).  The list goes on with a great # of permutations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oennmT9a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/w626au1n7qosa3xwx6eo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oennmT9a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/w626au1n7qosa3xwx6eo.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A DevOps Project Shortcoming
&lt;/h2&gt;

&lt;p&gt;Again, declarative DevOps it to make life easier.  Repeatable, predictable, and fast.  Try something.  Don’t like it? Make a quick change and try again.  It is now a vital part of my development process. I have no interest in returning to how things used to be. &lt;/p&gt;

&lt;p&gt;But I don’t get to enjoy the fullest benefits of DevOps and automation without a project.  It’s like a factory waiting to receive the raw materials needed to make it actually be a factory.  I define a project as a “meaningful code base” along with all the scaffolding required to make the machines in the factory run at least once.  Many IDEs and CI platforms produce a simple tech stack specific “Hello World” app and some stubbed out/empty files to get the ball rolling.  Forget starting with a fully functioning app.  No ready to go Dockerfile, CI YAML file, or Terraform file.  These platforms simply do not know enough about a projects requirements to produce a meaningful project.&lt;/p&gt;

&lt;p&gt;Before the project starts and hands go to keyboard, there are quite a few things I already know. I “mostly” have my business requirements (these never change, do they…).  I know the tech stack I need to leverage.  I am directed to use CI platform ABC and cloud vendor XYZ.  Finally, I need a Docker image orchestrated on a remote Kubernetes cluster.    &lt;/p&gt;

&lt;p&gt;If I can describe the project’s requirements then I would like to declare those requirements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pQksM4Ej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/q1p63nw5tmblodamhliz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pQksM4Ej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/q1p63nw5tmblodamhliz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automating the Automation
&lt;/h2&gt;

&lt;p&gt;We have &lt;em&gt;Container-as-Code&lt;/em&gt; with Docker, &lt;em&gt;Orchestration-as-Code&lt;/em&gt; with Kubernetes,  &lt;em&gt;Infrastructure-as-Code&lt;/em&gt; with Terraform, and &lt;em&gt;Pipeline-as-Code&lt;/em&gt; with many CI platforms.  So why not Project-as-Code?&lt;/p&gt;

&lt;p&gt;A single YAML file that turns project declarations into business contextual tech stack specific source code along with CI/container/orchestration config files.  That’s a mouthful but worth considering. By infusing the business context it means no more “Hello World”.  Instead, start with a deployable application with (likely) 10s to 100s of 1000s of lines of stuff I need and honestly no longer want to write so long as I can edit as required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Project-as-Code YAML
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app:
    techstack:
       id:                Angular7MongoDB  # options: ASPNETCore, LambdaNoSQL, Lambda, Angular7MongoDB, Django, GoogleFunctions
                                           #          SparkMicroWeb, SpringCore, SpringMongoDB, Struts2, Apollo
                                           # To see the list of available tech stacks on a realMethods instance using command:
                                           #     realmethods_cli stack_list --output pretty

    model:
       identifier:        shopping-cart.sql           # options:     Unique id of an existing model or 
                                      #              full or relative path to a model file of a supported type
                                      # model types: UML, Eclipse Modeling Framework, JSON, SQL Script, JAR, EAR
                                      # To see the list of available model on a realMethods instance using command:
                                      #      realmethods_cli model_list --output pretty
                                      #

#
# DevOps Project Creation Options
#       
    options:

#            
# CI/CD parameters
#            
        cicd:
            platform: circleci     # options: codeship, circleci, 
                                   # jenkins, azure, aws, gitlab, 
                                   # bitbucket, buddy, semaphore
            AES key:               # codeship project key; ex: XKyy2IDcSptIIvMY8KLMVMcxVs+ZK6AyNu1B4Wu1DPY=
#            
# Application parameters
#            

        application:
            name:                  angular7demo
            description:           Demo Angular7 application generated by realMethods
            author:                Dev Team
            email:                 xxxx.xxxxxxxxx@xxxxxxxx.com
            application logo URL:  ./img/turnstone.biologics.png
            company name:          Turnstone Biologics
            version:               0.0.1


#            
# Docker parameters
#            
        docker:
            userName:     your_docker_user_name
            password:     your_docker_password
            orgName:      your_dockerorg_name
            repo:         your_repository
            tag:          latest

#
# Git repository parameters
#
        git:            
            name:        GitAngularSetting     # an arbitrary name
            username:    your_git_user_name
            password:    your_git_password:  
            repository:  your_git_repo_name
            tag:         latest
            host:        bitbucket.org            

#
# HashiCorp Terraform parameters
#
        terraform:
            inUse:             true 
            provider:          aws                   # options: aws, google, azure, nutanix
            region:            us-east-1             # options: any cloud provider region
            ssh-fingerprint:   xxxxxxxxxxxxxxxxx     # required by CircleCI for SSH


#
# AWS parameters
#
        aws:
            key-pair-name:     xxxxxxxxxxxx      
            vpc:               xxxxxxxxxxxxx        
            ec2-instance-type: t2.medium          # options: any AWS instance type
            access-key:        ASSIGN__ON_CICD_PLATFORM_AS_ENV_VARS
            secret-key:        ASSIGN__ON_CICD_PLATFORM_AS_ENV_VARS

#
# Nutanix parameters
#
        nutanix:
            inUse:         false
            userName:      xxxxxxxxxxxxxxxxxxxxxxxxx
            password:      xxxxxxxxxxxxxx
            endpoint:      xxx.xxx.xxx.xxx
            insecure:      true
            port:          xxxxx    
            clusterId:     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            email:         dev@realmethods.com
            vmUserName:    xxxxxxxxxxx
            vmPassword:    xxxxxxxxxxx
            vmHost:        xxx.xxx.xxx.3xxx
            vmOS:          linux    # options linux, windows - windows not yet supported

#
# Kubernetes parameters: If not in use, and Terraform
#                        is in use, physical infrastructure
#                        will be provisioned on the provider
#
        kubernetes:
            inUse:              true
            host:               https://xxx.xxx.xxx.xxx
            project:            xxxxxxxxxxx        # assigned project name
            region:             us-central1-a      # options: any provider region
            hostTarget:         google             # option: google, aws, azure, nutanix
            username:           admin
            password:           5UhfcIPAPsiPXklT  # generic value
            exposeAsService:    true
            serviceType:        LoadBalancer      # options: LoadBalancer, NodePort, ClusterIP
            useSessionAffinity: true


#            
# Artifact repository for build dependencies and binaries            
#
        artifact-repo:
            inUse:              false
            type:               nexus                  # options: nexus, jfrog
            userName:           xxxxxxx
            password:           xxxxxxxx
            email:              xxxx.xxxxxx@xxxxxxx.com
            repoUrl:            http://xxx.xxx.xxx.xxx:8081/repository/npm-public


#            
#  MongoDB parameters - defaults to a local accessible instance    
#
#  If Terraform is in use, will attempt to instantiate a MongoDB instance via Docker image,
#  and use the instance IP address when binding the lambda functions
#  
        mongodb: 
            server address:          localhost:27017
            database name:           angular7demo
            search size:             10
            default collection name: default_collection
            auto-increment id name:  _id
            auto-increment seq name: seq
            mongooseHost:            http://localhost
            mongoosePort:            4000        
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xdzM8tda--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3gr2oyuwn5ahyefbsswv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xdzM8tda--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3gr2oyuwn5ahyefbsswv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Project-as-Code moves the project starting line out and the overall timeline in.  It gives (new) purpose to &lt;a href="https://www.bmc.com/blogs/sprint-zero/"&gt;Sprint Zero&lt;/a&gt;.  The upfront work required to get it setup (often less than a day) pays massive dividends in saving weeks of time to the first meaningful project commit.  Every project has certain things that are more fun to work on than others.  I prefer to automate the mundane and predictable (although much needed) to focus on more important dev.  You can view a sample generated project &lt;a href="https://bitbucket.org/tylertravismya/angular_mongodb_example/src/master/"&gt;here&lt;/a&gt; to get an idea of what is possible from a single &lt;a href="https://github.com/realmethods-public/orb/blob/master/samples/yamls/demo/angular-mongodb-circleci-project-as-code"&gt;Project-as-Code YAML file&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>declarative</category>
      <category>projectascode</category>
      <category>automation</category>
      <category>devops</category>
    </item>
    <item>
      <title>CRUD Is a Great Way To Go Serverless</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Sat, 19 Oct 2019 18:54:43 +0000</pubDate>
      <link>https://dev.to/realmethods/crud-is-a-great-way-to-go-serverless-19e0</link>
      <guid>https://dev.to/realmethods/crud-is-a-great-way-to-go-serverless-19e0</guid>
      <description>&lt;p&gt;If you don’t know how cool Serverless is, take a look at &lt;a href="https://serverless-stack.com/chapters/what-is-serverless.html"&gt;this article&lt;/a&gt; and then this &lt;a href="https://dev.to/johndemian/how-are-people-using-aws-lambda-461p"&gt;post&lt;/a&gt;.  AWS is clearly the most popular Serverless implementation so it will be the focus here.  To be honest, serverless isn’t exactly void of a server since code must run on something, but not having to deal with the common issues of code deployment/execution is a good thing to at least consider.&lt;/p&gt;

&lt;p&gt;On to &lt;a href="https://stackify.com/what-are-crud-operations/"&gt;CRUD&lt;/a&gt;, which is short for Create/Read/Update/Delete.  Let’s consider the fundamental intra-operations related to each business entity, and the inter-operations for relationships between entities.  Doing the latter increases complexity but these relationships are too important to ignore.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ycTYYZgz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4zo2dvbv5sr19sysjqs7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ycTYYZgz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4zo2dvbv5sr19sysjqs7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the example in the figure above, let’s do a little math to determine how many discrete functions are needed.  I count thirteen (13).  Now let’s be clear, creating a function in a Java class (for example) is, for the most part, less time consuming than creating a corresponding function as an &lt;a href="https://aws.amazon.com/lambda/"&gt;AWS Lambda&lt;/a&gt; function.  Let’s assume the difference is minimal, but as the # of functions increases, so will time time along with the difficulty in debugging and monitoring.  Checkout &lt;a href="https://dashbird.io/"&gt;dashbird&lt;/a&gt; for help in this area&lt;/p&gt;

&lt;p&gt;Let’s now grow the domain model a bit so we can continue to better size up the energy involved to create discrete functions for each CRUD operation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gn49CnHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dkfrvbgdeqacdn1vonkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gn49CnHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dkfrvbgdeqacdn1vonkz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this small change to the domain model, we can now create a table and equation to better estimate the total number of required discrete CRUD functions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iutUI5R8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wi3jf64i72lw9aelbczj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iutUI5R8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wi3jf64i72lw9aelbczj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine if we expand our model to 10 business entities each having one (1) single association and one (1) multi association.  We suddenly have 240 (100+60+80) CRUD functions in total. &lt;/p&gt;

&lt;p&gt;Doesn’t sound like I am actually making much of a case for CRUD going Serverless but I am getting there.  If what makes AWS Lambda valuable is still important to us, let’s assume no matter how many functions we have to write, the additional time to create and manage is near zero to negligible when compared to other development/deployment options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless and Relational DBs Can Be a Go!
&lt;/h2&gt;

&lt;p&gt;CRUD is associated with persistence operations and these operations are primarily accomplished using either an &lt;a href="https://techterms.com/definition/rdbms"&gt;RDBMS&lt;/a&gt; or &lt;a href="https://searchdatamanagement.techtarget.com/definition/NoSQL-Not-Only-SQL"&gt;NoSQL&lt;/a&gt; solution.  An AWS Lambda function is not only a serverless function but it is a stateless function.  This means each function knows nothing about the current state of anything dependent on it or anything it depends on.  This is critical when it comes to persistence.  If you have ever tried connecting to a database like &lt;a href="https://www.mysql.com/"&gt;MySQL&lt;/a&gt;, you know the first connection is often the slowest with subsequent connections performing acceptably.  Unfortunately, since a serverless function is stateless, each call requiring a database connection is considered a cold call first connection and the performance is unbearable.   There are &lt;a href="https://medium.com/swlh/databases-that-play-nice-with-your-serverless-backend-13eb7dc1e1c"&gt;some databases that play nice in a stateless scenario&lt;/a&gt;, but if you have already invested in a traditional RDBMS these won’t suffice. Fortunately, there are implementation strategies where the database persistence implementations are abstracted out of the serverless function itself, into a remotely accessed stateful RESTful API. The great part is that API can be accessed by other applications too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jdYG-4EO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6sj4bl9lhp2p0va2atmr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jdYG-4EO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6sj4bl9lhp2p0va2atmr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Serverless or otherwise, we more often than not need these CRUD functions.  They form the core functionality of most modern application architectures, whether microservices, RESTful APIs, or monolithic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Lambda Ecosystem is a Snap!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i-atvStD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2dxi0dmgu7nbb7y5gvon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i-atvStD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2dxi0dmgu7nbb7y5gvon.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used a domain model to help illustrate the relationship between entities, operations, and associations.  The more complex the domain, the more complex the model and the more CRUD functions.  I have worked on projects using UML with a class diagram having in excess of 100 business entities and more than 250 associations.  Not visually appealing to look at but it helps to have a single picture to help grasp the scope of an effort.  Another reason why I create a domain model is to help illustrate how the details of the model map nicely to what we need in terms of creating a corresponding Lambda function ecosystem.  If the model is well defined and understood, and the mapping from the CRUD capabilities can be inferred simply from the model’s entities and associations, and it is understood how each CRUD capability is to be represented as a Lambda function, we have an opportunity to generate it all.  No need to write the 100s Lambda functions when they can be quickly generated using a model as input.  For this example, I used UML as input to represent a domain model, but I could have just as easily described the model in a JSON file or used database schema notation.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;del&gt;Application&lt;/del&gt; Function Refactoring
&lt;/h2&gt;

&lt;p&gt;The latter point of database schema notation being another form of a domain model is very important.  If we consider many legacy applications are built on an architecture where a relational database is used to persist data, the schema of that database gives us a very close to perfect representation of that application’s domain model.  As stated, if that model can be used to apply as input to then create a corresponding set of Lambda functions, we can consider this a form of refactoring.  It might be easier to consider this &lt;em&gt;function refactoring&lt;/em&gt; as an easy first step in application refactoring than refactoring an entire application itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Even though the number of CRUD functions can be large for even a small project, generating them as AWS Lambda functions simplifies things significantly.  Feel free to &lt;a href="https://bitbucket.org/tylertravismya/awslambdamongodbexample/src/master/"&gt;browse this Bitbucket repository&lt;/a&gt; to review the output for a sample project generated for &lt;a href="https://www.circleci.com"&gt;CircleCI&lt;/a&gt; using &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>crud</category>
      <category>functional</category>
    </item>
    <item>
      <title>The importance of the right partnerships</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Sun, 13 Oct 2019 17:27:03 +0000</pubDate>
      <link>https://dev.to/realmethods/the-importance-of-the-right-partnerships-5eb1</link>
      <guid>https://dev.to/realmethods/the-importance-of-the-right-partnerships-5eb1</guid>
      <description>&lt;p&gt;Recently, my company was chosen by CloudBees to be a part of their new &lt;a href="https://devops.com/cloudbees-announces-new-technical-alliance-partner-program/"&gt;Technical Alliance Partner program&lt;/a&gt;.  Unlike other partnerships that often do not have significant criteria or a well-defined purpose, this partnership was formed among only 27 companies to create new revenue and growth opportunities in the DevOps marketplace.&lt;/p&gt;

&lt;p&gt;As a small dev team (~5 people), it is critical we expend energy on the right things, including partnerships.  We typically only create partnerships with the largest technology companies that have a certification process.  This allows us to demonstrate value to their business, sales and technical teams firsthand.  This is one of the best ways to gain traction within the partner organization and open up opportunities to collaborate with the them and others in their partner ecosystem.  Ultimately, it can lead to significant business and relationships we would struggle to create due to our size.&lt;/p&gt;

&lt;p&gt;Most do not want to go it alone, nor do they have to.  Finding the right strategic partnerships can expand and grow your company in ways it might not be able to otherwise.&lt;/p&gt;

&lt;p&gt;I'd be interested to hear how others leverage partnerships, even personal ones for career advancement.&lt;/p&gt;

</description>
      <category>partner</category>
      <category>partnership</category>
      <category>ecosystem</category>
      <category>alliance</category>
    </item>
    <item>
      <title>CloudBees Announces New Technical Alliance Partner Program</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Sat, 12 Oct 2019 19:02:36 +0000</pubDate>
      <link>https://dev.to/realmethods/cloudbees-announces-new-technical-alliance-partner-program-3h4c</link>
      <guid>https://dev.to/realmethods/cloudbees-announces-new-technical-alliance-partner-program-3h4c</guid>
      <description>&lt;p&gt;Grateful to CloudBees for including realMethods in the select company of other great Technical Alliance partners.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devops.com/cloudbees-announces-new-technical-alliance-partner-program/"&gt;https://devops.com/cloudbees-announces-new-technical-alliance-partner-program/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>container</category>
      <category>devopstools</category>
      <category>projectgeneration</category>
    </item>
    <item>
      <title>Share Your Expertise; Earn Commission &amp; Equity</title>
      <dc:creator>Steven Randolph</dc:creator>
      <pubDate>Mon, 07 Oct 2019 21:16:58 +0000</pubDate>
      <link>https://dev.to/realmethods/share-your-tech-stack-expertise-2nbj</link>
      <guid>https://dev.to/realmethods/share-your-tech-stack-expertise-2nbj</guid>
      <description>&lt;p&gt;It's cool to contribute uncompensated time and energy into an open source effort, but it's also cool to get something for your efforts and share in a common success.&lt;/p&gt;

&lt;p&gt;This is a chance to &lt;em&gt;templatize&lt;/em&gt; your design and development tactics/strategies into a reusable asset for the DevOps community to leverage!&lt;/p&gt;

&lt;p&gt;Your work will become part of a growing library of open source tech stack packages offered by realMethods.  Developers use these stacks to generate model-driven DevOps projects using &lt;em&gt;&lt;a href="http://www.projectascode.com"&gt;Project-as-Code&lt;/a&gt;&lt;/em&gt; declarative YAML.  These projects include all source/build/test/CI/Docker/Terraform files.&lt;/p&gt;

&lt;p&gt;Specific areas of immediate interest include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java (Spring, Struts2)&lt;/li&gt;
&lt;li&gt;AWS Lambda (Java, NodeJS, Python, C#)&lt;/li&gt;
&lt;li&gt;Apollo GraphQL&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Ruby (RAILS)&lt;/li&gt;
&lt;li&gt;Python (DJango)&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Swift&lt;/li&gt;
&lt;li&gt;C/C++&lt;/li&gt;
&lt;li&gt;ASP.NET (C#)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the existing tech stack packages &lt;a href="https://github.com/realmethods-public/tech.stack.packages"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bitbucket.org/tylertravismya/angular_mongodb_example/src/master/"&gt;Look here&lt;/a&gt; for an example of generated output.&lt;/p&gt;

&lt;p&gt;Thanks in advance!&lt;/p&gt;

&lt;p&gt;contact: &lt;a href="mailto:support@realmethods.com"&gt;support@realmethods.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>contributorswanted</category>
      <category>react</category>
      <category>vue</category>
      <category>serverless</category>
    </item>
  </channel>
</rss>
