<?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: Jesse Orshan</title>
    <description>The latest articles on DEV Community by Jesse Orshan (@jorshman).</description>
    <link>https://dev.to/jorshman</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%2F183441%2F83d39b51-d817-4f9d-befe-bcb9af4f190a.jpg</url>
      <title>DEV Community: Jesse Orshan</title>
      <link>https://dev.to/jorshman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jorshman"/>
    <language>en</language>
    <item>
      <title>3 Examples of DevOps Remediation with Datadog and WayScript</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Wed, 16 Jun 2021 20:19:58 +0000</pubDate>
      <link>https://dev.to/jorshman/3-examples-of-devops-remediation-with-datadog-and-wayscript-3c5k</link>
      <guid>https://dev.to/jorshman/3-examples-of-devops-remediation-with-datadog-and-wayscript-3c5k</guid>
      <description>&lt;p&gt;As a scaling software company, we experience periods of unpredictable platform usage spikes which can come from all over the world. This volatility fosters complexity around instance scaling and other core dev infrastructure. &lt;strong&gt;If our instances don’t scale properly, our users experience a less performant product. If our servers are too large, it is a waste of dollars.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hooking into Datadog gave our company newfound and much-needed insights into our AWS infrastructure. Moreover, the alerting functionality built into Datadog’s event monitoring unlocked the ability for us to monitor, investigate, and ultimately resolve issues with our infrastructure. &lt;strong&gt;However, although Datadog alerted us to issues, we still had to manually manage our AWS infra. Our goal was to build a platform that could remediate infra challenges in an automated way by leveraging Datadog alerts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;h1&gt;
  
  
  Examples of Datadog Remediation with WayScript
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1) AWS EC2 Instance Management —&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I eluded to this use case in the intro paragraph. Mainly, with Datadog alerting and &lt;a href="https://wayscript.com" rel="noopener noreferrer"&gt;WayScript&lt;/a&gt;, users can set up alerting for high or low levels of usage of a particular instance. To do this, &lt;a href="https://youtu.be/ZQdl9mB017Q" rel="noopener noreferrer"&gt;users quickly set up a Datadog trigger on WayScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlqyk4vwhob9nsn7cdbm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlqyk4vwhob9nsn7cdbm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Once you Datadog trigger is setup, you can run Shell Scripts, Python, JavaScript, Java, or SQL queries directly from WayScript.&lt;/strong&gt; In this case, we use the boto3 python library to automate a variety of different EC2 remediation functions (&lt;a href="https://www.youtube.com/watch?v=mxwa4BCvZIc" rel="noopener noreferrer"&gt;full example tutorial&lt;/a&gt; and &lt;a href="https://wayscript.com/script/EMdGmezr" rel="noopener noreferrer"&gt;ReadMe&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;For example, if we get an alert that our instance has high traffic load, we can automate running a script to add another EC2 instance to our system with this type of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3

def turn_instance_on( instance_id ):
    ec2 = build_client()
    current_state = check_instance_state( instance_id )
    if current_state == 'not running':
        try:
            response = ec2.start_instances(InstanceIds=[instance_id], DryRun=False)
            new_state = response.get('StartInstances')[0].get('CurrentState').get('Name')
            return 'Success'
        except ClientError as response:
            return response
    else:
        return 'Instance Already Running'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same type of logic can be run to turn instances off with low traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://wayscript.com/script/EMdGmezr" rel="noopener noreferrer"&gt;Full Example Here.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ...
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2) Rollback to a previous deployment with CircleCI after an admin confirmation via text message.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When building a remediation tool, we found ourselves needing automated tasks mixed with &lt;strong&gt;‘Human-in-the-loop’ interactions&lt;/strong&gt;. Mainly, we wanted to design a program that would roll our production server back to the previous version based on a Datadog alert. Moreover, once the alert hit our backend we wanted to generate a text message approval by our lead backend development team. &lt;strong&gt;Once approved by a text message response, the rollback kicks off via &lt;a href="https://circleci.com/" rel="noopener noreferrer"&gt;CircleCI&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhz2c3cfqwa6zwmk9vq0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhz2c3cfqwa6zwmk9vq0k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So how does this work? First, we set up an event alert on Datadog that is linked to our &lt;a href="https://rollbar.com/" rel="noopener noreferrer"&gt;Rollbar&lt;/a&gt; incident reporting for deployments. &lt;strong&gt;If this incident is marked as a &lt;code&gt;bad_deploy&lt;/code&gt;, our trigger fires&lt;/strong&gt;. Next, a python script interprets the event and determines if a rollback is necessary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;event = variables['Event']
title = event.get('Title')
try:
    if 'bad_deploy' in title:
        status = 'bad'
        variables['status'] = status
    else:
        status = 'good'
except:
    variables['status'] = 'good'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a rollback is necessary, we use the Twilio API to send a text message to our backend dev team. &lt;strong&gt;If/when a dev response with ‘approve’, CircleCI is set to rollback to the previous working version of our production system.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wayscript.com/script/WDzvj4oG" rel="noopener noreferrer"&gt;Full Example Here.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ...
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3) Terminate a deadlocked DB query and log the issues.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As we continue to scale, there have been instances where we have experienced unanticipated database issues such as deadlocks from long running queries. This type of event can cause significant degradation of performance for our user base. &lt;strong&gt;Therefore, we wanted to build a process for logging the deadlocked process, but then ultimately killing the query in an automated way&lt;/strong&gt; (we determined this is better than user wide degradation).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkepbwr6drt8h28cz399m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkepbwr6drt8h28cz399m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to do this we set up &lt;strong&gt;Datadog alerts for High CPU usage (degraded status) or High memory usage on our database.&lt;/strong&gt; When this alert hits WayScript, it kicks of a couple of processes.&lt;/p&gt;

&lt;p&gt;Initially, we use Python &amp;amp; SQL to grab all currently running queries on our db (RDS on AWS). The first process builds a Pandas Dataframe of the running queries information, stores this in a file, and then emails the file to our backend dev team. The second process looks for queries that have exceeded an expected time threshold. For these queries, they are passed to a third process which kills them based on their RDS ID.&lt;/p&gt;

&lt;p&gt;Example of Pulling the Running Queries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3
from botocore.exceptions import ClientError
def build_client():
    ec2 = boto3.client(
    'rds',
    region_name = 'us-east-2',
    aws_access_key_id=context['key_id'], #stored in .secrets
    aws_secret_access_key=context['key_secret'] # stored in .secrets
)
    return rds
rds = build_client()
response = rds.execute_statement(
    continueAfterTimeout=False,
    database='database-1',
    includeResultMetadata=False,
    resourceArn='aws:rds:us-east-&amp;lt;DB_ID&amp;gt;',
    schema='string',
    secretArn='string',
    sql='string',
    transactionId='string'
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://wayscript.com/script/2xS-HbSF" rel="noopener noreferrer"&gt;Full Example Here.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ...
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Our goal was to build a platform that could remediate infra challenges in an automated way by leveraging Datadog alerts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://wayscript.com" rel="noopener noreferrer"&gt;WayScript&lt;/a&gt; let’s users trigger processes from Datadog monitors and events to automatically address infrastructure needs. WayScript is a virtual development environment that runs scripts in Shell, Python, or JavaScript and connects with external services like EC2, CircleCI, and SQL Server.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>systems</category>
      <category>aws</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>5 Things Low-Code Is Missing
</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Thu, 28 Jan 2021 19:48:59 +0000</pubDate>
      <link>https://dev.to/jorshman/5-things-low-code-is-missing-11nk</link>
      <guid>https://dev.to/jorshman/5-things-low-code-is-missing-11nk</guid>
      <description>&lt;p&gt;Currently, the ‘Low-Code’/’No-Code’ (LC/NC) space is a ‘hot’ market with a growing number of high-profile venture capital investments. Startups are receiving funding to forge various visions of ‘the future of software development’. These platforms have a spectrum of target users ranging from the non-technical ‘citizen developer’ to more technical developers. They also have varying use cases that range from interface/GUI front-end building to backend event processing with logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Low-Code has the power to materially improve the lives of developers looking to rapidly build production tooling. However, many ‘visual programming’ platforms are architected in ways that limit usability by developers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A disclaimer, I am a co-founder @ &lt;a href="https://wayscript.com"&gt;WayScript&lt;/a&gt; — a development hub for internal tooling. We have been building a platform in the developer tooling space (which happens to have some low-code overlap which I’ll get to later). I am a backend software developer and come from a background in application development. As we continue to learn and build, we’ve studied myriad features/decisions in the spectrum of low-code products coming to market.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So here’s 5 missing components from current platforms that would be game-changing for developers.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  1) A Cloud Based Dev Environment that feels like my Localhost Environment.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Need:
&lt;/h2&gt;

&lt;p&gt;As a software developer, my workflow is building software in a local dev environment which is subsequently stored in a cloud based git repository such as GitHub. When I am writing scripts, they are often built in a virtual environment which contains code, a complex file directory structure, and third-party dependencies. The trouble is that in order to turn these local command-line scripts into production tools, I need to do a lot more work for basic production (provisioning servers, deploying source code, configuration files, etc.). I also have to do much, much more work for robustness (CI/CD, unit testing, etc.). A lot of this infrastructure work ends up taking as much or more time than the core application. &lt;strong&gt;What I want is a cloud based development environment that feels like my local host environment, but seamlessly converts my script directories into stable production software.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Focus of Current Platforms and What’s Missing:
&lt;/h2&gt;

&lt;p&gt;At their core, many LC/NC platforms are ‘JSON parsing’ utilities. Mainly, the platforms enable users to pull JSON data (usually from third party apis), and parse particular key/value pairs to pass to another API or interface.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sample_json_data = {
 'name'  : 'Jesse Orshan',
 'email' : 'jesse[at]wayscript.com',
 ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As an example, users are empowered to pass &lt;code&gt;sample_json_data.email&lt;/code&gt; from an event trigger to another API without having to build the underlying API queries.&lt;/p&gt;

&lt;p&gt;I want to mention that of course JSON parsing services are useful and can be used to build compelling automations / interfaces. However, core product architecture built around JSON Parsing limits the types of applications that can be enhanced by low-code.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solution:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A low-code platform architecture built as a virtual environment file-system which can read, write, and delete arbitrary file structures.&lt;/strong&gt; When ready for production, any project can be executed through the core platform engine on a dedicated cloud service. JSON data from an event trigger can be passed into the script as an importable variable (e.g. runs when a new customer is added to Salesforce and passes the data). Moreover, this virtual file system can support various programming languages and dependencies out of the box (python, java, c#, …). The virtual environment is cloud based and serves as a uniform runtime environment across varying devices and operating systems. Even when working on my local desktop, this environment runs in the cloud but feels indistinguishable from my local machine. Finally, this virtual environment can interact with third party file structures such as GitHub, S3, Dropbox, etc. &lt;strong&gt;The system is seamless because a configuration file for production execution on a cloud server is automatically constructed by the platform (and editable if more customization is required).&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  2) Prioritizing Coding Ease, not Dragging and Dropping.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Need:
&lt;/h2&gt;

&lt;p&gt;A platform that offers the ease of event-triggering and software hosting/running for any code repository (servers, tasks, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Focus of Current Platforms and What’s Missing:
&lt;/h2&gt;

&lt;p&gt;When most people think low-code, they think visual programming (a.k.a. end-user development). Although visual programming is an example, in reality just about everything in software development is &lt;strong&gt;‘low-code’ — the abstraction of lower-level code through a higher-level interface.&lt;/strong&gt; For example, the Python programming language can be interpreted as a low-code abstraction of the C programming language. Secondly, a popular API such as Twilio is a low-code improvement over building a text-messaging interface from scratch. In other words, an API is just as much a low-code product as a visual programming interface. The important point here is just that there should be a distinction between low-code and visual programming.&lt;/p&gt;

&lt;p&gt;This distinction fosters two questions. First, is visual programming the right paradigm for production grade scripting and tooling? Secondly, what are the most valuable features of these platforms?&lt;/p&gt;

&lt;p&gt;For the first question, the answer is that visual programming can be a useful aid in software development, but it can also be a hindrance when it’s forced for its own sake. An example of a useful visual interface might be setting up a cron job to execute a script or interacting with a simple API. &lt;strong&gt;Often, the use cases that benefit from visual programming are components of software that require a lot of specialized code to deliver simple and common functionality. However, by forcing an entire platform to use visual programming, you end up stuck in places where it becomes a hindrance.&lt;/strong&gt; Often, code is the simplest and fastest way to express what you want to do. For example, building boolean logic such as &lt;code&gt;if/else&lt;/code&gt; statements with visual programming quickly become unruly to setup and manage. &lt;strong&gt;As a developer, I’d rather just write my logic in python.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what are the most valuable features of visual programming platforms? First, the builtin event based triggering mechanisms are a great benefit (e.g. run whenever a new customer is added to my database or CRM). This is useful because setting up this type of trigger system requires another coding project (hosting a server for incoming webhooks) and distracts me from the core problem I am trying to solve. Secondly, the ability of these platforms to seamlessly run the constructed automations in the cloud without any dev ops process is beneficial.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solution:
&lt;/h2&gt;

&lt;p&gt;A virtual environment platform with integrated event triggering from third party APIs (at the least a generalizable HTTP endpoint) that can push the request response data into scripts at execution of the application. Secondly, baked in APIs that handle oauth/credentialing, easy parameter inputs, and proper querying can save time. These APIs also benefit from visual interfaces (sending a custom email, slack message, etc.).&lt;/p&gt;




&lt;h1&gt;
  
  
  3) File Dependency Management.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Need:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The service should be ‘smart’ about understanding dependencies and treat this as a first class problem to solve.&lt;/strong&gt; For example, if an internal tool relies on a file in a particular directory location, a particular db schema, or another constant then at a minimum the platform should &lt;strong&gt;recognize breaking changes and alert stakeholders immediately&lt;/strong&gt; with an explanation of what changed. The best experience would allow users to easily build unit-tests with minimal added work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Focus of Current Platforms and What’s Missing:
&lt;/h2&gt;

&lt;p&gt;When working with teams building internal scripts and workflow automations, we often find that shared files are a potential pressure point / weakness in production stability. For example, we worked with a company that was running workflow automations on a Google Sheet which was simultaneously being edited by employees. If a sheet, column, or particular cell was accidentally edited, the automations would break without any indication (at least not immediately). Tracking down the root cause here when debugging is hard, time consuming, and doesn’t prevent this issue in the future. In another case, a company had a few internal tools that expected a database schema to be in a certain format and the tools all crashed when the db was upgraded. &lt;strong&gt;The reality is that both file dependencies and real world data is messy, and many platforms expect users to manage this mess.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solution:
&lt;/h2&gt;

&lt;p&gt;The platform’s auto-generated configuration file for each program should include a mapping of all files and folders utilized within the program. Any references to these files should be stored in the metadata. &lt;strong&gt;In other words, the application ‘understands’ file dependencies and the nature of the dependency (directory location, internal data structures, typing, etc.).&lt;/strong&gt; With this architecture, one can envision a low-code mapping that shows all file interdependencies within a system of scripts and tools that are running.&lt;/p&gt;




&lt;h1&gt;
  
  
  4) Versioning &amp;amp; Repo Integration.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Need:
&lt;/h2&gt;

&lt;p&gt;A platform paradigm that enables users to seamlessly run code, scripts, and servers in a cloud virtual environment without dev ops or setup (it feels like your local environment). Versioning and collaboration are much easier to apply to a file architecture than to a proprietary program saved in a third party services database. In other words, &lt;strong&gt;the user owns the source code instead of the service.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Focus of Current Platforms and What’s Missing:
&lt;/h2&gt;

&lt;p&gt;Many End-User Programming LC/NC platforms are architected so that the program content lives in the company database (Zapier stores your ‘zaps’, etc.). This paradigm is antithetical to the git/repository paradigm utilized by most developers when building tooling. The benefits of a git paradigm like GitHub are version control, shareability, portability, and collaboration (open source repos as an example). &lt;strong&gt;For building tooling, a paradigm that empowers developers to store and collaborate on a program by treating all elements as files in a directory is crucial.&lt;/strong&gt; This returns to the notion that the low code program at its core should work as an editable file within a system where the purpose of the platform is to aid users in configuration (whether through visual programming or great documentation). This paradigm unlocks the ability for more sophisticated tooling and can leverage many of the tools software developers already use such as GitHub for source control. As an added benefit, this same architecture unlocks a more modular development experience where more fundamental pieces can be manipulated (in other words, users can edit / understand the lowest level code if they need to).&lt;/p&gt;

&lt;p&gt;In my opinion, the platform &lt;a href="https://www.gitbook.com/"&gt;GitBook&lt;/a&gt; does this well for building documentation. Mainly, the visual interface GitBook provides makes it super easy to build dynamic documentation and the underlying content is stored in each users GitHub account as a repository of markdown files (see our own &lt;a href="https://docs.wayscript.com/"&gt;docs&lt;/a&gt; here and the &lt;a href="https://github.com/wayscript/docs"&gt;underlying file structure&lt;/a&gt;). By utilizing GitHub, GitBook is able to leverage the platform for conflict management and facilitates better low-level capabilities for devs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solution:
&lt;/h2&gt;

&lt;p&gt;A LC platform that aids/automatically constructs a configuration file in the source code to run arbitrary code on a cloud service (scripts, servers/endpoints, etc.). All the files related to the script are owned and stored by the user instead of the services database. All the service stores is references to where these files are stored (GitHub, S3, Dropbox, etc.)&lt;/p&gt;




&lt;h1&gt;
  
  
  5) Vendor Flexibility
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Need:
&lt;/h2&gt;

&lt;p&gt;Forced vendor lock in creates a true barrier for developers. What happens if a company goes out of business or spikes their pricing? What happens if I suddenly need a feature or more resources that the service is unable to provide? In these instances, it is a problem if I am locked in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Focus of Current Platforms and What’s Missing:
&lt;/h2&gt;

&lt;p&gt;When building software tools, many tend to become mission critical over time. As a developer, a huge value proposition of building my tooling from scratch is that I have complete autonomy. I can decide which frameworks to use, where to host, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today, most visual programming platforms inherently lock users into their system with their paradigm and treat this ‘stickiness’ as a business benefit.&lt;/strong&gt; For example, using AirTable is highly convenient in many cases but also creates some uneasiness as a choice when building tooling. Mainly, I do not have the ability to access the underlying relational database if I needed/wanted to.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solution:
&lt;/h2&gt;

&lt;p&gt;A platform that treats each component of the service it offers (such as event triggering, hosting, credentials, etc.) as a file inside a repository. With this paradigm, I can write all my code however I want and could always replace a configuration file with another service (swap a Heroku ProcFile for an AWS config file as an example). Yes, sometimes this work is tedious BUT I need to have the option. Secondly, &lt;strong&gt;this architecture aligns incentives for the service to offer best in class service of their components or those pieces will be swapped for a better service.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Low-code has the power to materially improve the lives of developers looking to rapidly build production tooling. However, ‘visual programming’ platforms which leverage low-code are often architected in ways that limit use by developers. A service that solves these problems would be a major value prop to all developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think? Do you have other major problems with these platforms as a developer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;At &lt;a href="https://wayscript.com"&gt;WayScript&lt;/a&gt;, we are building a platform for developers looking to quickly build internal tooling. In a future post, I will write a follow-up as to how our platform is architected to address the issues raised in this article.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>lowcode</category>
      <category>programming</category>
    </item>
    <item>
      <title>Automate SQL Queries in the cloud</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Thu, 30 Jan 2020 19:30:06 +0000</pubDate>
      <link>https://dev.to/jorshman/automate-sql-queries-in-the-cloud-3ci1</link>
      <guid>https://dev.to/jorshman/automate-sql-queries-in-the-cloud-3ci1</guid>
      <description>&lt;p&gt;You can use the WayScript beta (free) to automate running SQL queries on a hourly, data, or weekly basis in the cloud. You can also output the results and send them via Slack, email, text message, etc. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/V83pDqulQSE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>sql</category>
    </item>
    <item>
      <title>How to Schedule a Python Script to Run Daily</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Mon, 27 Jan 2020 21:38:44 +0000</pubDate>
      <link>https://dev.to/jorshman/how-to-schedule-a-python-script-to-run-daily-a6b</link>
      <guid>https://dev.to/jorshman/how-to-schedule-a-python-script-to-run-daily-a6b</guid>
      <description>&lt;p&gt;When I started programming, I remember feeling frustrated that I didn't have a simple way to take my python script and get it to automatically run everyday. With the WayScript beta (free tool), we created a super rapid way for you to get your script running in the cloud without any DevOps setup. &lt;/p&gt;

&lt;p&gt;Sample Template - &lt;a href="https://wayscript.com/shared/D9ToJA2M"&gt;https://wayscript.com/shared/D9ToJA2M&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tutorial Video - &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/PHyrJ3fOmas"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Build Personalized Discord Bots with Python and WayScript</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Wed, 02 Oct 2019 22:10:08 +0000</pubDate>
      <link>https://dev.to/jorshman/build-personalized-discord-bots-with-python-and-wayscript-1i3d</link>
      <guid>https://dev.to/jorshman/build-personalized-discord-bots-with-python-and-wayscript-1i3d</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sWpAfML5h0I"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In this video we'll look at how we can build custom commands onto a WayScript discord bot using python programming, discord, and &lt;a href="https://wayscript.com"&gt;WayScript.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Python Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import re

keywords = inputs['keywords']
result = inputs['result']
discord_message = inputs['Discord Message Text']

command = re.compile(r'\![a-z]*')
matches = command.findall(discord_message)
print(matches[0])
found_keyword = matches[0]
print(keywords)
position = keywords.index(found_keyword)
action = result[position]

outputs['action'] = action
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>python</category>
      <category>showdev</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Run a Python Script with a Google Assistant Voice Command</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Mon, 09 Sep 2019 21:36:21 +0000</pubDate>
      <link>https://dev.to/jorshman/run-a-python-script-with-a-google-assistant-voice-command-57n4</link>
      <guid>https://dev.to/jorshman/run-a-python-script-with-a-google-assistant-voice-command-57n4</guid>
      <description>&lt;h2&gt;
  
  
  The "WayScript Trigger" Google Assistant Action
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will learn how to use WayScript to run your Python script in the cloud using a Google Assistant voice command. (Check out the &lt;a href="https://wayscript.com/library/Google_Assistant_Bot" rel="noopener noreferrer"&gt;Google Assistant Bot template&lt;/a&gt; to try it out!) &lt;/p&gt;

&lt;p&gt;This is done using the &lt;a href="https://assistant.google.com/u/0/services/a/uid/000000dfb9940d69?hl=en-US&amp;amp;source=blog" rel="noopener noreferrer"&gt;WayScript Trigger action&lt;/a&gt;, which you will first need to enable on your Google account. &lt;/p&gt;

&lt;p&gt;After enabling the action, you will then need to link it to your WayScript account using the Google Assistant app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Google Assistant Action
&lt;/h2&gt;

&lt;p&gt;The next step is to build a WayScript program with a Google Assistant Trigger. To do so, first go to your WayScript dashboard and select "Create a new Script". &lt;/p&gt;

&lt;p&gt;Give your program a name, like "Run Python with Google Assistant".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0manudnxuwq63ftdptkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0manudnxuwq63ftdptkl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once your program is created, you'll start by adding a &lt;a href="https://docs.wayscript.com/library/triggers/google-assistant-trigger" rel="noopener noreferrer"&gt;Google Assistant Trigger&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Click the "+" icon next to "Add Trigger(s)" and select the Google Assistant Trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzyfa6k7ec82fcsxxabgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzyfa6k7ec82fcsxxabgj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should now have the Google Assistant Trigger in the "Triggers" section of your program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fw98o72adml2q0f8i2n1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fw98o72adml2q0f8i2n1k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up the Google Assistant Trigger
&lt;/h2&gt;

&lt;p&gt;Now that you have added the trigger to your program, let's get it set up! Start by clicking on the trigger to open it in the settings panel. &lt;/p&gt;

&lt;p&gt;You should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpbdubzny86b7sh9hbklx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpbdubzny86b7sh9hbklx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set "Activate Trigger" to "On".&lt;/p&gt;

&lt;p&gt;If you haven't yet linked your Google Assistant account, select "Add an Account..." from the "Select an Account" dropdown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fu9c5a2bba2yqzjvg9z0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fu9c5a2bba2yqzjvg9z0x.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will show a dialog with the option to "Enable Action and Link Account" on the Google Assistant site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmy8dadn6mhrbhhq9bflz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmy8dadn6mhrbhhq9bflz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, notice that the trigger shows the text "Hey Google, ask WayScript Trigger to run 'Run Python with Google Assistant'." &lt;/p&gt;

&lt;p&gt;That's kind of a mouthful, so you'll set the "Program Alias" field to create a phrase that's easier to say and easier for your Google Assistant to understand. &lt;/p&gt;

&lt;p&gt;In this case, you'll simply set the Program Alias field to "Python". &lt;/p&gt;

&lt;p&gt;Now you have a much nicer phrase!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fl0k64f4ae4g4sbuzwk2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fl0k64f4ae4g4sbuzwk2a.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a Python Script
&lt;/h2&gt;

&lt;p&gt;With the Google Assistant Trigger in place, it's time to add a Python Script. Start by dragging the &lt;a href="https://docs.wayscript.com/library/modules/python" rel="noopener noreferrer"&gt;Python module&lt;/a&gt; into your program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjpfv9iza828my1nkpo93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjpfv9iza828my1nkpo93.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, click on the Python module and paste your script into the code box.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq7lu26pabxc4mrszhphk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq7lu26pabxc4mrszhphk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it! You're done!
&lt;/h2&gt;

&lt;p&gt;Run your Python script from any of your Google Assistant-enabled devices by saying &lt;em&gt;"Hey Google, ask WayScript Trigger to run 'Python'&lt;/em&gt;." &lt;/p&gt;

&lt;p&gt;Of course, you don't have to stop at Python. You can run any WayScript program - including an evergrowing list of modules - using the Google Assistant Trigger.&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>showdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Run any Python Script with an Alexa Voice Command</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Fri, 06 Sep 2019 17:51:20 +0000</pubDate>
      <link>https://dev.to/jorshman/run-any-python-script-with-an-alexa-voice-command-194l</link>
      <guid>https://dev.to/jorshman/run-any-python-script-with-an-alexa-voice-command-194l</guid>
      <description>&lt;p&gt;&lt;a href="https://wayscript.com/view_template/Amazon%20Alexa%20Bot"&gt;https://wayscript.com/view_template/Amazon%20Alexa%20Bot&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>showdev</category>
      <category>discuss</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Standup a Web App on the Cloud in 1 Minute</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Thu, 29 Aug 2019 22:05:17 +0000</pubDate>
      <link>https://dev.to/jorshman/standup-a-web-app-on-the-cloud-in-1-minute-j35</link>
      <guid>https://dev.to/jorshman/standup-a-web-app-on-the-cloud-in-1-minute-j35</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/OrZMjdVhFfA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Using WayScript, you are able to turn your scripts and tools into live web applications rapidly. Anything you build is automatically running in the cloud. You can run javascript (and install libraries with npm), python (can pip install libraries), and more.  &lt;/p&gt;

</description>
      <category>python</category>
      <category>javascript</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Building a Google Calendar Slack Bot - 5 minute tutorial</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Tue, 30 Jul 2019 17:46:58 +0000</pubDate>
      <link>https://dev.to/jorshman/building-a-google-calendar-slack-bot-5-minute-tutorial-2b4d</link>
      <guid>https://dev.to/jorshman/building-a-google-calendar-slack-bot-5-minute-tutorial-2b4d</guid>
      <description>&lt;p&gt;I am one of the developers of WayScript - a visual programming language for developers&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/UFgg-vUjx_A"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>slack</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Web Scraping with Python Tutorial</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Wed, 24 Jul 2019 17:23:13 +0000</pubDate>
      <link>https://dev.to/jorshman/web-scraping-with-python-tutorial-3bkk</link>
      <guid>https://dev.to/jorshman/web-scraping-with-python-tutorial-3bkk</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7mqnktzvs2lu8fsudnvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7mqnktzvs2lu8fsudnvl.png"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtu.be/JU2GjEEj0TY" rel="noopener noreferrer"&gt;https://youtu.be/JU2GjEEj0TY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial, I use BeautifulSoup and Requests in Python to pull the market cap of a stock (AAPL) from Yahoo Finance. Next, we set our program to run everyday and to send us an sms text message with the results.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>sms</category>
      <category>python</category>
    </item>
    <item>
      <title>Documentation Overhaul - Our Startups Sprint</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Fri, 19 Jul 2019 16:32:10 +0000</pubDate>
      <link>https://dev.to/jorshman/documentation-overhaul-our-startups-sprint-2989</link>
      <guid>https://dev.to/jorshman/documentation-overhaul-our-startups-sprint-2989</guid>
      <description>&lt;p&gt;Our team (4 developers) decided it was time to overhaul our docs. Therefore, we all stopped what we were doing and spent the week sprinting on building much better docs for WayScript (drag and drop programming language).&lt;/p&gt;

&lt;p&gt;Here are the results: &lt;a href="https://docs.wayscript.com/"&gt;https://docs.wayscript.com/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;As a startup that is constantly shipping, changing, and altering our software.. we are striving to make sure we prioritize always having the most up to date docs we can. &lt;/p&gt;

</description>
      <category>documentation</category>
      <category>gitbook</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building a Slack SQL "inventory" Bot</title>
      <dc:creator>Jesse Orshan</dc:creator>
      <pubDate>Fri, 21 Jun 2019 16:04:45 +0000</pubDate>
      <link>https://dev.to/jorshman/building-a-slack-sql-inventory-bot-5flj</link>
      <guid>https://dev.to/jorshman/building-a-slack-sql-inventory-bot-5flj</guid>
      <description>&lt;p&gt;I have been recording tutorial videos on youtube. In this video,  I build a Slack Bot that relays SQL database data back to users posting on a Slack channel using WayScript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/VIcTgs5Uw4Q"&gt;https://youtu.be/VIcTgs5Uw4Q&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>slack</category>
      <category>chatbot</category>
    </item>
  </channel>
</rss>
