Ryan Kettrey – Rōnin Consulting https://www.ronin.consulting Expert Engineers Delivering Superior Software Thu, 23 Apr 2026 17:55:14 +0000 en-US hourly 1 https://wordpress.org/?v=7.0 https://www.ronin.consulting/wp-content/uploads/2022/01/cropped-Logo-Red-100x100-1-32x32.png Ryan Kettrey – Rōnin Consulting https://www.ronin.consulting 32 32 Right Now, AI is the Worst it Will Ever Be https://www.ronin.consulting/artificial-intelligence/agentic-ai-development/ Fri, 06 Mar 2026 20:12:49 +0000 https://www.ronin.consulting/?p=2191

Right Now, AI is the Worst it Will Ever Be

Why the way you’re thinking about AI capabilities today is already outdated – Agentic AI development is changing the game.

There’s a phrase that keeps rolling around in my head, and once you hear it, you can’t unhear it: “AI is the worst it will ever be right now.”

Think about that for a second.

Every complaint you have about AI’s limitations today, every “it’s not quite good enough for that” or “it can’t really do this yet,” all of that is already on its way to being obsolete.

Not in five years. Not even in one year. In months. Sometimes in a few weeks.

At any given moment, it’s the worst it’ll ever be, and that’s the saying I keep in my head all the time.

Working at Rōnin, I’ve spent the last few months watching this transformation happen in real-time. But what I’m seeing isn’t just incremental improvement; it’s a change in how software gets built.

The growing divide between code assistants and Agentic AI development

A clear line is forming in the development community, and I can spot it immediately in how people talk about AI.

On one side, developers still describe AI development as a “code assistance tool,” something that helps them write code faster, suggests completions, and catches bugs. They’re saying things like “I’ll try that eventually” or “I don’t think it’s ready to be used for production code.”

On the other: developers who’ve fully embraced agentic coding. They’re no longer writing code at all. They’re architecting, validating, guiding. The AI models are creating the actual code, and they’re reviewing the output.

You can tell the difference between the people who are leaning into agentic coding and those who still think of it like 2025 (or even early January of 2026, as crazy as that sounds).

Why evaluating AI based on today’s capabilities is a strategic mistake

Here’s where most companies and developers are getting wrong: they’re evaluating AI based on what it can do right this minute.

If a business leader tries an AI tool in January and finds it lacking for their specific use case, they might file it away as “not ready yet.” But by March, that same tool will have doubled its capabilities. By June, it’s doing things that felt impossible in January.

If you’re thinking about how AI is right this minute, you’re thinking about it wrong. You need to think about how AI will look in six months or a year and plan and adjust accordingly.

I know it’s overused, but everyone I know loves that hockey metaphor about skating to where the puck is going. But the truth is that most people aren’t doing it. They’re not skating to where the puck is going; they’re skating to where the puck was last month. It’s the same with AI. You need to move forward and stop looking back.

agentic ai development

How Agentic AI is changing modern software development

At Rōnin, we’re not waiting to see how this plays out. We’re actively experimenting with restructuring our entire software development process to align with where AI is heading, not where it is today.

The old model: Developer writes all the code → tests it → deploys it

The emerging model: Developer works with AI to design the plan → AI generates code → developer and/or AI tests it → developer and/or AI deploys it

We still need developers with real-world technical experience who can work with the business, understand requirements, develop an architecture, and guide the AI in its planning. But in more and more cases, that doesn’t mean that person needs to write any of that code anymore. It’s more of an oversight role.

Does this work for every scenario?  Not yet.

Highly regulated industries, some government work, systems with strict governance requirements, they’re not quite ready for this shift. But they’re getting there faster than anyone expected.

The unpleasant truth: this is going to ruffle some feathers

I can’t sugarcoat what’s going on right now, and the truth is that some developers aren’t going to like this future.

Honestly, I get it. Byron McClain (my Rōnin co-founder) and I have worked together for years. If you put a few pieces of code in front of me and asked me to guess which one he wrote, I could point it out in a second based on his variable naming patterns alone. I know his coding style. I can see his fingerprint in the logic.

Unfortunately, that level of fingerprinting will change.

We are shifting to a place where coders will no longer write code. It will be someone telling the machine, “Here’s what I want it to be, here are my ideas, here is the architectural vision,” and then validating the machine did it.

For many developers who are used to getting their dopamine hits from writing that perfect piece of logic, from seeing their code compile cleanly, from the craftsmanship of it all, this new change might feel like a loss.

However, I don’t think you should view it that way. If anything, I encourage those developers to lean in and implement features they previously couldn’t create due to deadlines or cost constraints. A lot more creative approaches and complex solutions will be possible now, where they just weren’t before.

Don’t panic: how business leaders should adapt to Agentic AI now

If you’re a business leader trying to figure out your AI strategy, here’s my advice: 

Stop evaluating AI based on today. That AI assessment is outdated before you finish writing it. Look at the trajectory. Where was this technology three months ago? Where is it now? Where will it be in six months? Look ahead.

Start experimenting now. The learning curve isn’t getting any shorter, but the capabilities are accelerating. The gap between “trying it out” and “falling behind” is measured in weeks or months, not years.

Focus on architecture and validation, not implementation. The future advantage isn’t in having people who can write code the fastest. It’s in having people who can design the right solutions and validate that AI-generated code meets requirements.

Expect disruption in your vendor relationships. Those massive enterprise software contracts might start looking very different when you can build custom solutions at a fraction of the cost and time. Do you really need all that software?

Because here’s how I see it: AI is the worst it will ever be right now.

Which means it’s already darn good.

And by the time you finish reading this article, it’s gotten even better.

]]>
How I Built a Mobile App Without Coding https://www.ronin.consulting/artificial-intelligence/mobile-app-without-coding/ Tue, 17 Feb 2026 22:00:36 +0000 https://www.ronin.consulting/?p=2193

How I Built a Mobile App Without Coding

What I learned by taking an AI development experiment all the way to the Apple App Store

I gave myself a challenge: build a full-featured mobile game without writing a single line of code.

Not a prototype. Not a proof-of-concept. A real app, ready for the App Store, with daily puzzles, AI-generated content, friend groups, leaderboards, push notifications, actual authentication, admin controls, profile management, etc.

The result is Puzoozle, a puzzle game where players scramble images, compete with friends, and solve AI-generated daily challenges. It’s not perfect, there are a dozen more features and enhancements I could add. But that’s not the point.

The point is I didn’t write any of the code to make it. I just talked to Claude Code.

What tools I used to build an app without coding

With Puzoozle, I wasn’t trying to reinvent gaming. It’s built on a familiar concept (picture puzzles) because my goal wasn’t innovation. It was exploration. How far could I build an app just through a conversation with Claude Code?

Turns out, it’s a lot, and the game I built includes everything you’d expect from a mobile app, from push notifications to private friend groups and full user management.

All of it was built using Claude Code, Anthropic’s tool for agentic coding (aka vibe coding). But I wasn’t asking for isolated functions or copy-paste code snippets. I was having full architectural conversations.

The process was simple. I would describe what I wanted. Claude Code would propose a plan, and then I would review it. We’d bat it back and forth, then I’d have Claude Code implement it.

Sometimes it nailed it on the first try. Sometimes it didn’t. But when it didn’t work correctly – that’s where the real breakthrough happened.

Letting Claude Code debug itself

It didn’t take long for me to hit a frustrating loop.

I’d request a feature, giving Claude Code broad instructions and the freedom to interpret how to implement my request with a UI that fits the theme I had described.

However, when I ran the app, something would sometimes be off. A notification would appear under a window. A button wouldn’t respond correctly. A new UI element would run off the screen.

Each time this happened, I’d have to give Claude Code more context about the problem it had just created, restart the application in my mobile simulator, navigate to the page, take a screenshot, send it to Claude Code, and point out what was wrong. It was painful and time-consuming, and Heaven forbid it got it wrong a second time.

I worked with Claude Code this way for a while, and I kept thinking that I needed to address it, and surely there is a better way.

So, I took steps to remove myself from this inefficient loop as much as possible. Using MCP (model context protocol), I wired Claude Code into additional tools so it could interact autonomously with the development environment. With these new tools, Claude Code could:

  • Deploy the app to the simulator.
  • Launch it and interact with it.
  • Take screenshots of what it was seeing.
  • Evaluate the visual output against what it was supposed to do.
  • Identify problems on its own.
  • Fix issues and try again.

Once that was connected, everything changed.

Claude Code would implement a feature, deploy it, run the simulator, click around, take a screenshot, realize something wasn’t right (oh, I don’t see the pop-up where it should be), figure out what went wrong in the code, adjust it, and try again. All without me stepping in.

I’d watch it work through the problem. It was like watching someone else debug code, except that someone was the AI that wrote the code in the first place.

Watching that happen feels like a fundamentally different development model. The validation loop is tightened, and problems are caught and fixed within minutes rather than requiring my intervention each time.

The taco lunch moment

The most surreal moment happened at a taco lunch with my family.

I showed the game to my kids, and they started playing with it, solving puzzles, and drawing things. And, of course, their suggestions for improvement were immediate.

My son: “I’d really like to play my own puzzles I just made.”

My daughter: “Dad, can you add shapes, text, and more colors?”

My son: “I think I crashed it when I went to publish my puzzle.”

In the old world, I’d say, “Yeah, that’s a good idea, I’ll add it to the backlog,” or “I’d better try to recreate that issue,” and maybe get to it in a few weeks. Or I’d forget entirely because, you know, life. It’s a side puzzle game, after all.

But in this new world, things are different. I opened GitHub on my phone right there at the table (and for sure caught some stray eyes from my wife while doing so) and created a few new issues in my project. I typed quick descriptions of what they wanted, asked Claude Code to come up with a plan, and if everything was clear enough, implement it.

We finished our tacos. Drove home, and when I walked in the door a couple of hours later, all their features had a plan written out and had been coded up on a new branch.

I pulled down the branch on my laptop. Validated Claude Code’s implementation on my iPhone simulator, then had it deploy the updated app to my phone.

“Hey, kids, come look. Here are your features from lunch.”

They thought it was super cool to see their ideas already implemented. So did I, honestly.

It took just a couple of hours from idea to implementation, and largely because we kept eating tacos. Features that would have taken me an evening or two to code manually, test, and integrate properly – took hours.

The conversation between “we should build that” and “it exists and works” has essentially collapsed. The friction is gone. It’s just conversation and validation now.

Built a Mobile App Without Coding

What I learned along the way

As I said earlier, I didn’t start this project to reinvent puzzle games. I started it to really understand where we are with agentic coding and what lessons I could take away from driving something all the way to production.

That experiment taught me a few lessons along the way. If you’re thinking about developing something similar, these are the takeaways I wish I had going in.

Start with a full vision

I built Puzoozle iteratively, adding features as ideas came up. One feature led to another. I started by letting users create puzzles and share them. Then I added leaderboards. Then I decided to add friend groups. Then someone asked me to add daily puzzles of the day. Then the drawing tools needed more features.

It worked. The app got built. But it wasn’t efficient. I spent a lot of time restructuring because I hadn’t planned the architecture up front. Friend groups were over here in the code, but leaderboards were structured differently over there. When I added a new feature, I’d realize it should integrate with something I’d built three features ago, so I’d have to go back and refactor.

If I had written a complete PRD (product requirements document) upfront and mapped the full architecture before building, I would have gotten to the finish line much faster. I would have seen how all the pieces fit together. I would have built the database schema right the first time. I would have structured the user flows correctly from day one.

AI executes incredibly quickly, and Claude Code can write in an hour what might have taken me a day or two. That speed is amazing, but it also means bad architectural decisions compound faster.

You can iterate your way to a finished product (like I did), but you’ll waste a lot of time. Planning still matters. It may matter more now because it’s so easy to build extra features; you will tend to build a lot of extra coolness and go down fun paths without a good plan.

Go all the way to production

I deliberately pushed this project through the App Store submission process. I wanted to find out where the process breaks down, where AI capabilities end, and what still needs development.

Many people are experimenting with agentic coding right now. I see it in the developer community online and amongst many of my friends. People are building impressive demos, cool prototypes, and neat features.

But the number of them that are finishing and shipping is much smaller. Like never before, you have this sense that anything is possible to build. You start a project, and before it’s complete, your mind is quickly on the idea for the next project.

It’s addictive.

As someone who just finished a product, I’m here to tell you there’s a lot more to learn by taking it all the way. The deployment requirements. Seeing users use your products. Reporting issues. Fixing bugs. All of these taught me additional lessons about using AI to develop.

Claude Code handled mobile deployment surprisingly well. But you don’t see the friction until you push all the way through it. You don’t find the limitations until you hit them.

Starting five projects is easy. Finishing one project teaches you the rest of the story.

So my advice is this: pick one thing and run with it. Don’t get distracted by the next shiny idea. Push through deployment. Submit it to the store. Deal with deployment, the user feedback, and the support of code while developing new features, all from an agentic coding world.

There’s a lot of education when you take it all the way.

Fundamentals still matter

I’ve watched teammates at Rōnin build genuinely impressive things with Claude Code despite having little to no coding background. Chuck Harris, our VP of Client Relations, has built multiple functional apps. Chris Bybee, our Director of Operations, who hasn’t coded seriously in years, jumped back in and has been building complex features. One of our Business Analysts, Marcia Clark, went from zero coding experience to building working applications.

That alone is remarkable. The fact that you can have a conversation with AI and produce functional software without typing syntax is amazing when you step back and think about it.

But there’s still a ceiling if you don’t understand the fundamentals.

I have had multiple sessions with Claude Code now, where we talked through big architectural decisions. I’ve noticed that, when talking with non-traditional agentic coders, the mentality is to simply ask Claude Code for a recommendation and run with it.

This can take you very far without really understanding how it’s solving the problem or the potential trade-offs. For complex enterprise solutions with security, governance, and integration concerns, there remains a need for an experienced development mind to conduct these interviews. Not to write the code, but to provide the right context to the agentic coding tool.

The roles are shifting. Development is becoming more about being the technical brain that guides the AI toward the right solution. The job is moving from “write code” to “ensure the right code gets written.”

Is It possible to build a mobile App without coding? You bet.

Puzoozle is live in the App Store right now. You can download it here and try it yourself.

Every feature inside it, every engagement, every line of code running on the backend, was generated through conversation. I described what I wanted. Claude Code built it.

Ten years ago, building Puzoozle would have required months of development time. Five years ago, maybe a month with modern frameworks and tools. Today, I built it in scattered evenings over a few weeks without writing any code myself.

The barrier between “I have an idea” and “I built it and shipped it” is thinner than it’s ever been in the history of software development. The gap between idea and execution isn’t just shrinking; it’s closing. It’s disappearing. So, the question isn’t whether you can build something anymore. The question isn’t even what you’re going to build.

The question is: how much longer are you going to wait?

Ready to try Puzoozle? Download it now from the App Store and solve some AI-generated puzzles. See for yourself what’s possible when AI does the coding.

puzoozle
]]>
An Essential Guide to AI Hosting: Finding the Right Platform https://www.ronin.consulting/cloud-technology/guide-to-ai-hosting/ Tue, 13 Aug 2024 21:28:47 +0000 https://www.ronin.consulting/?p=1647

Running AI models requires substantial hardware resources, often beyond the capacity of standard servers or virtual machines. To address this, enterprise software can leverage AI models hosted in the cloud or on specialized on-premises machines.

Over the past year, AI hosting has grown tremendously, not only in model capabilities and pricing, but also in how cloud providers are baking agentic features, governance, and observability directly into their platforms.

Many of our clients seek to incorporate AI into their businesses, and we’ve been approached multiple times for guidance on selecting the best hosting model, starting with whether private or public AI is the right fit before they even get to hosting

Drawing on our years of experience in the cloud, we are well-equipped to help clients choose the right AI hosting platform. Whether it’s scalability, cost-effectiveness, or specialized features, we’ve successfully guided clients in selecting the hosting platform that best aligns with their business goals.

To help address common questions, we created this primer on popular hosting platforms. Below is a brief overview of some of the more popular cloud and on-premises AI hosting platforms we work with:   

Popular Cloud AI Hosting Platforms

Azure AI Foundry Microsoft Azure 10 01 2025 04 01 PM

Azure AI Foundry

Azure AI Foundry (formerly Azure AI Studio) is Microsoft’s unified platform for building, deploying, and governing AI solutions. Beyond hosting models, Foundry now supports Agent Factory with governance/observability dashboards, and orchestration tools that let enterprises deploy Agentic AI at scale.

  • Overview: Azure AI Foundry supports the deployment of a wide range of models from a model catalog. It offers a playground to test prompts, fine-tuning support, content filters (violence/hate/etc.), and Prompt Flow (a Logic app-like builder supporting chaining of prompts, logic, other tools, and execution tracing).
  • Models: Almost 2,000 models commercial and open-source models are available, including GPT-5 family (gpt-5, gpt-5-mini, gpt-5-nano) and Sora for video generation.
  • Deployment: Serverless pay-as-you-go (PAYG) and Managed Compute are offered, and adds Model Router (preview) to automatically select the right model per use case.
  • Pricing: Token-based for serverless and per hour for Managed Compute.
  • RAG: Supported through Azure AI Search.
  • Data Privacy: Customer data is not available to other customers, OpenAI, and is not used to train/improve any MS or third-party products or services. OpenAI offers a BAA for HIPAA compliance.
Azure OpenAI hosting platform

Azure OpenAI Service

Azure OpenAI Service is a cloud-based platform that brings the power of OpenAI’s advanced language models to Microsoft Azure’s secure and scalable infrastructure. This service enables developers and businesses to integrate AI capabilities, such as natural language processing and conversational AI, into their applications.  It also offers fine-grained content filter controls and region-locked deployments for compliance. It also benefits from Azure AI Foundry’s orchestration features.

  • Overview: API service accessible in Azure. Offers a playground to test prompts and content filters (violence/hate/etc.).
  • Models: Several GPT flavors with varying context sizes, model sizes, and prices. 
  • Deployment: Can run globally (requests routed to whatever region has capacity, higher throughput limits, latency may vary) or locked to a specific region. 
  • Pricing: Token-based pricing. pay-as-you-go (PAYG) and Provisioned Throughput Units (PTU) are offered (PTU only if you have an MS account team).  
  • RAG: Supported through Azure AI Search.
  • Data Privacy: Customer data is not available to other customers, OpenAI, and not used to train/improve any MS or 3rdparty products or services. Offers a BAA for HIPAA compliance.
AWS Bedrock AI hosting platform

AWS Bedrock

AWS Bedrock is Amazon’s fully managed generative AI service that gives businesses access to a broad library of foundation models and tools without requiring them to manage any infrastructure. It allows organizations to build, scale, and govern AI applications within the secure and flexible AWS environment.

  • Overview: AWS Bedrock provides immediate access to popular foundation models without custom deployment. It includes a playground for prompt testing, support for fine-tuning and customization, Prompt Flows (a visual builder for chaining prompts, conditionals, API calls, and inline code), Agents, for orchestration, and robust governance with auditing. Guardrails now allow policy preview (detect mode), granular enforcement on inputs/outputs, and sensitive information masking. Bedrock is also integrated with SageMaker Unified Studio for unified development., governance, and audibility.
  • Models: The catalog hosts 50+ models, including Amazon’s own Nova family, Anthropic’s Claude 4 and Claude Sonnet 4, and DeepSeek-V3.1 with enhanced reasoning. It also supports open-weight models such as gpt-oss-120B and gpt-oss-20B, along with imports of custom models (Mistral, Flan, LLaMA). Models are continuously updated, with lifecycle and deprecation policies requiring migration to newer versions.
  • Deployment: Models are already running.
  • Pricing: Token-based pricing
  • RAG: Supported through Knowledge Bases.
  • Data Privacy:  Customer data is not available to other customers and not used to train/improve any products or services. It also offers a BAA for HIPAA compliance.
  • Other: Supports a feature called Prompt Flows, which allows users to visually design the chaining together of various prompts to models, conditionals, and other tools. It supports guardrails, which are content filters for violence, hate, explicit, etc. It supports a playground for testing prompts and offers a full auditing of calls.
Vertex AI Hosting Platform

GCP Vertex AI

GCP Vertex AI is Google Cloud’s platform for developing, deploying, and managing machine learning models. It provides a unified interface for building custom models, automating workflows, and leveraging pre-trained models. Vertex AI integrates seamlessly with other Google Cloud services, offering tools for scalable and efficient AI solutions.

  • Overview: Vertex AI offers several popular models, some of which are already running and ready for access without any special deployment needed. It also offers a playground to test prompts and fine-tuning support. With their Gemini and PaLM models, this hosting platform provides content filters (violence/hate/etc.) and grounding (connecting model output to verifiable sources of information to prevent hallucinations).
  • Models: 80-90 of the most popular models.
  • Deployment: Some models are already running (managed APIs), and some must be deployed to a specific machine size.
  • Pricing: Token-based pricing for managed API models, and per-hour pricing for models you deploy.
  • RAG: They provide a reference architecture for you to build it using their document AI technology.
  • Data Privacy:  Customer data is not available to other customers and not used to train/improve any products or services. Offers a BAA for HIPAA compliance.
  • Other: It supports direct Google Colab Enterprise integration, a playground for testing prompts, full call auditing, content filters for Gemini and PaLM models, and Apache Airflow via several operators. Vertex AI continues to expand model availability (Gemini 1.5 family, PaLM 3). Grounding features are more robust, helping enterprises connect outputs to verifiable data.
Hugging face Enterprise AI hosting Platform

Hugging Face Enterprise

Hugging Face Enterprise is a cloud-based platform offering advanced tools for deploying and managing state-of-the-art machine learning models. It provides access to a wide range of pre-trained models, including those for natural language processing and computer vision, with tons of support for customization and fine-tuning.

  • Overview: Hugging Face Enterprise offers many open-source and commercial models and fine-tunings, some of which have a playground to test with.
  • Models:  It has over 800,000 base and fine-tuned models.
  • Deployment: The models must be deployed, but you can choose Hugging Face’s AWS, Azure, GCP instance.
  • Pricing: Pricing is per hour.
  • RAG: Not built in. Instead, RAG models can be deployed, and Python code must be written/run on your environment to invoke them and wire them together with other models.
  • Data Privacy: Customer data is not available to other customers and is not used to train/improve any products or services. It offers a BAA for HIPAA compliance, but it is very expensive.
  • Other: Supports direct Google Colab Enterprise integration. It supports a playground for testing prompts, full auditing of calls and content filters for Gemini and PaLM models. Pricing remains high for HIPAA BAA; however, Hugging Face now offers tighter integration with enterprise observability stacks and continues to expand open-source model hosting.

Our Favorite Alternatives to Cloud Hosting AI Platforms

BentoML AI hosting platform

BentoML

BentoML is an open-source platform designed to deploy, manage, and scale machine learning models across environments such as on-premises, Data Centers, Edge, and embedded offerings.

Overview: BentoML is a development library for building AI applications with Python. It contains everything you need to boot up an open-source model of your choice and make it accessible as an API endpoint for your application. Typically, you would download an open-source model from Hugging Face, package it with BentoML, export it as a Docker image, and run it anywhere you like.

Huggingface TGI AI hosting platform

Hugging Face TGI

Hugging Face TGI (Text Generation Inference) is designed to deploy and manage Hugging Face models across various environments such as on-premises, Data Centers, Edge, and embedded offerings.

Overview: Hugging Face TGI is a development toolkit for deploying and serving LLMs. It has built-in support for buffering multiple API requests and support quantization, token streaming, and telemetry (using Open Telemetry and Prometheus). Specialized versions are available for different GPU lines (Nvidia, AMD, AWS Inferentia). Delivered as a Docker image, you typically boot it up with parameters anywhere you like.

Nvidia Triton AI hosting platform

NVIDIA Triton Inference Server

NVIDIA Triton Inference Server is a powerful platform for deploying and managing large-scale AI models. It supports multiple frameworks and provides a unified interface for model serving.

Overview: Triton Inference Server is an open-source software toolkit developed by Nvidia to serve one or more models of many types concurrently on Nvidia GPUs. It supports model ensembles (allowing multiple models to be chained together), a C and Java API (to link directly with application code), metrics (via Prometheus), and both HTTP and gRPC APIs. It is available as a Docker image.

Which Hosting Solution Will Work for Your Business?

When selecting the best hosting solution for your AI model, several factors must be considered, such as scalability, cost, deployment options, and platform-specific features.  You might also need to consider the business problems AI addresses when choosing which hosting platform works best for you. 

Azure AI Studio, Azure OpenAI Service, AWS Bedrock, and GCP Vertex AI are strong contenders for cloud-based flexibility and ease of use. If you don’t require a BAA, Hugging Face Enterprise is an incredibly cost-effective option. Hugging Face TGI, BentoML, and Nvidia Triton offer robust deployment options for those preferring on-premises solutions.   

Regardless of the hosting platform you want to deploy your AI solution, our Rōnin Consulting team can help. Contact us today to learn how we can set up your team with the right on-premises or cloud platform.  

]]>
The Ultimate Cheat Sheet of AI Terms https://www.ronin.consulting/artificial-intelligence/cheat-sheet-of-ai-terms/ Mon, 29 Jul 2024 16:25:42 +0000 https://www.ronin.consulting/?p=1599

No matter how often I jump into a new technology, the number of new concepts, acronyms, and buzzwords always sends my brain into overdrive. What do these AI terms mean? Where is that concept used? It’s like getting lost, bouncing from one YouTube video to the next. I want to understand everything fully, but there are so many starting points.

I’ve been so focused on Artificial Intelligence (AI) this last year. I’ve experimented, read technical books, taken a postgraduate course, and done real-world implementations for our clients. During that time, I made notes of all the useful acronyms and concepts until they were drilled into my brain.

When I heard others on my team trying to learn and understand the terms (and sometimes using them incorrectly), I realized it would be cool to organize my notes to help others get a jump start. A sort of “cheat sheet,” if you will.

So, I built it out and sent it over to my content team, who immediately wanted me to alphabetize it for “easy reference.” But as you can see, it is NOT alphabetized. My cheat sheet was not meant to be an A to Z guide for people to look up a single term but a way for folks to understand and get caught up with AI.

To learn AI, I’ve found that so many terms build off the next, so that is exactly how this cheat sheet reads. So, please follow along from beginning to end, and by the time you get to the last term, give yourself an air-high five and imagine I’m on the other end.

AI Terms You Need To Know

 

ML / Machine Learning

Unlike traditional programming that involves writing fixed sets of rules, machine learning is a subset of AI where computers learn from data to make predictions or decisions. It allows systems to improve performance over time as they are exposed to more data.

DL / Deep Learning

A further subset of machine learning. It uses neural networks with many layers to analyze various forms of data and extract complex patterns. It’s much more sophisticated than traditional ML but requires much more data and processing power.

ANN / Artificial Neural Network

A conceptual framework and model structure that mimics the human brain’s structure and function to improve decision-making and predictive accuracy. Specifically, it consists of interconnected layers of nodes (neurons) that process and transmit information. They are used to recognize patterns, make decisions, and predict outcomes by learning from data through a process called training.

Model

A type of mathematical model that, after being trained on a data set, can be used to make predictions or classifications on new data. A model can refer to a general model and its learning algorithm or a fully trained model with all its internal parameters tuned.

Inference

Using a trained model to make predictions or decisions against new, unseen data.

Training

A process where a learning algorithm adjusts a model’s internal parameters to minimize errors in its predictions.

Parameters

The internal variables of a trained model whose values are learned from the training data. Training the same initial model on different datasets will produce different parameter values. There are two types of parameters called weights and biases.

Hyperparameter

A value that is set before training begins to control the learning process. Unlike normal parameters, these values are not learned from the training data.

Architecture

Architecture defines the blueprint for how a model is built, prior to it being trained. It’s part of the design and structure of a neural network, including the number and types of layers, connections between neurons, and methods for processing data.  Different architectures are better suited to different tasks.

Task

The specific problem a model is trying to solve. Some examples are classification, regression, NLP, vision, and speech recognition.

Generative AI

A class of AI models designed to create new content, such as text, images, music, or even videos, based on patterns learned from existing data. These models generate new data that is similar to the training data they were exposed to based on an input prompt. Generative AI is closely related to NLP, often overlapping with language generation tasks.

NLP / Natural Language Processing

A range of tasks that enable machines to understand, interpret, and generate human language. The most common examples are:

Text classification – Categorizing or assigning predefined labels to textual data based on its content.

Document summarization – Creating a concise and coherent summary of a longer text document.

Sentiment analysis – Identifying opinions or emotions in text as positive, negative, or neutral.

Machine translation – Converting text from one language to another.

Named entity recognition – Identifying and classifying named entities such as people, organizations, locations, and dates within a text.

*Note: Modern LLMs blur the lines between “NLP” (understanding) and “Generative AI” (creating). The same model is often used for both.

LLM / Large Language Model

Models that are designed to perform NLP tasks by leveraging their large-scale architectures and vast amounts of training data. Examples are Google’s BERT and OpenAI’s GPT 4o.

Corpus

Refers to the large set of text used for training and evaluating a language model. The Wikipedia data set is an example corpus.

Prompt Engineering

Process of designing and refining the input prompt that gets passed to a language model. It involves crafting the prompts in such a way that the model can understand the task and generate the desired output effectively.

Tokens

When a prompt is provided to a model for an NLP task, this text is first broken down into smaller pieces called tokens in a process called tokenization. These tokens are words, parts of words, or even single characters. These tokens are what the model processes for the task.

Context Window

The range of tokens that a model can consider at one time when processing or generating text. This size influences the model’s ability to understand and utilize the surrounding context to make accurate predictions or generate responses. For a simple example, suppose a context window was only 100 tokens, and the input provided was 500 tokens. The model would only consider the first 100 tokens for its processing.

Sliding Context Window

When the number of input tokens of a prompt is larger than the model’s available context window, a sliding context window can be used to process all input tokens, chunks at time. For a simple example, suppose a context window was only 100 tokens and the input provided was 500 tokens. Tokens 1 – 100 could be processed, followed by 101 – 200, followed by 201 – 300, etc. This is useful for NLP tasks with very large inputs, like document summarization or chats.

Pre-trained Model

A model that has already been trained on an extensive data set for a general task. Usually, when people talk about a pre-trained model, it’s in the context of re-using that pre-trained model for a new specific task.

Fine-Tuning

Taking a pre-trained model and doing a much smaller training set to adjust its parameters slightly on a new, smaller, task-specific dataset. Fine-tuning is much more cost-effective than building and training a model from scratch.

For example, suppose we had a pre-trained model trained on an extensive data set to provide sentiment analysis. We could take that model and fine-tune it on the IMDB database of reviews to create a model specifically tuned to perform sentiment analysis on movie reviews. Theoretically, this new model would result in much better accuracy for movie reviews.

SFT / Supervised Fine-Tuning

A post-training step using curated instruction data (prompt–response pairs) to make a base model follow directions. Often, the first stage is before preference optimization.

RLHF / Reinforcement Learning from Human Feedback

Aligns model behavior using a reward model and reinforcement learning (commonly PPO) trained on human preference labels.

DPO / Direct Preference Optimization

A simpler alternative to RLHF that optimizes directly on pairwise preference data with a classification-style loss, avoiding on-policy RL. Often more stable and cheaper than PPO-based RLHF.

RLAIF / Reinforcement Learning from AI Feedback

Scales preference training by using a strong model to generate preference labels instead of humans, optionally guided by a written “constitution.”

Adapter

A technique used to fine-tune pre-trained models efficiently. This is done by adding small task-specific layers (adapters) between the layers of a pre-trained model, then only training these adapters and keeping the original model parameters unchanged.

LoRA / Low‑Rank Adaptation

Injects small trainable low-rank matrices into layers while keeping base weights frozen; delivers strong quality-per-dollar versus full fine-tuning.

QLoRA

Combines 4‑bit quantization of base weights with LoRA to fine-tune very large models on a single high-memory GPU.

Transformer

A specific deep learning model architecture introduced in 2017 has become the foundation for many state-of-the-art models in NLP, such as BERT, GPT, T5, and Mistral. Transformers make heavy use of the attention mechanism to capture word context much better than prior model architectures. Additionally, it is designed to be parallelizable at every stage to support the training of much larger models.

BERT / Bidirectional Encoder Representations from Transformers

Focuses on bidirectional context to achieve state-of-the-art performance on many NLP tasks. Imagine reading a sentence left to right and right to left simultaneously. This type of “reading” allows BERT to understand the full context of each word better than if it were only reading in one direction.

BERT is not designed to generate text but excels at extracting information from text. These extractions include classification, summarization, question answering, sentiment analysis, and named entity recognition. Google developed this transformer, and it’s well-known BERT model versions are BERT Base, BERT Large, DistilBERT, BioBERT, and ClinicalBERT.

GPT / Generative Pre-trained Transformer

Uses a unidirectional transformer for generating coherent and contextually relevant text. Since it reads text from left to right, it excels at predicting each word based on the words that came before it.

It generates text by predicting the next word in a sentence, one word at a time. GPT is designed to generate text and excels at story generation and conversational agents. OpenAI developed this transformer, and its more well-known GPT model versions are GPT-1/2/3/4o, GPT-Neo, and GPT-J.

T5 / Text-To-Text Transfer Transformer

Treats all NLP tasks as text-to-text problems, allowing a single model to be fine-tuned on various tasks. This means that it takes text as input and produces text as output. Google developed this transformer, and its well-known T5 model versions are T5 Base, T5 Large, mT5, T5 1.1, and Flan-T5.

Mistral

A series of models that combine text understanding and generation for NLP tasks. Mistral AI developed this transformer, and some well-known model versions are Mistral and Mistral Instruct.

Attention

Mechanism in neural networks, particularly transformers, that assigns varying degrees of importance to different parts of the input sequence when processing each token and making predictions. This helps to prioritize relevant information and improve performance.

Zero-shot, One-shot, Few-shot Learning/Prompting

When we define it in regards to learning, this is when the model performs tasks having seen no (Zero-shot), one (Single-shot), or few (Few-shot) specific examples during training. When we define it in regards to prompting, this is when the model is given no (Zero-shot), one (Single-shot), or few (Few-shot) examples of how to perform the task/return the expected output.

Multi-Modal

Models designed to handle and integrate multiple types of data (modalities), such as text, images, audio, and video. For example, there can be handling text data, outputting an image, or taking in speech and producing text.

VLM / Vision‑Language Model

A multimodal LLM that jointly understands images and text (and increasingly audio/video) for tasks like visual Q&A, chart interpretation, and image-grounded reasoning.

RAG / Retrieval Augmented Generation

A model architecture developed by Facebook AI (now Meta AI) that combines retrieval-based methods with generative models to improve the quality and accuracy of generated text.

When an input prompt is processed, passages or relevant documents that likely contain the information needed to answer the query are first retrieved. Then, the query and retrieved documents are input to generate the response, incorporating the relevant information from the retrieved documents. RAG can leverage large external databases, allowing models to access vast information and generate responses against data they were not trained initially against.

Embeddings & Vector Search

Embeddings are dense numeric vectors that capture the semantic meaning of text (and other modalities). Vector search (e.g., FAISS, Pinecone, pgvector) retrieves the most similar chunks by cosine or dot-product similarity—core building blocks for most RAG systems.

GraphRAG

Uses knowledge graphs alongside vector search to capture relationships between entities and improve reasoning over interconnected or narrative-heavy data.

Self‑RAG

Lets the model decide when to retrieve, and to critique/edit its own draft output via special reflection tokens—improving factuality and citations.

Agentic RAG

Wraps RAG in an agent that plans multi-step retrieval, tool calls, and self-correction rather than a single retrieve‑then‑generate step. Helpful for complex, multi-hop questions.

Reinforcement Learning

A type of machine learning where an agent learns to make decisions by performing actions and receiving feedback in the form of penalties or rewards. It uses this feedback to learn and improve over time. In this way, it’s like fine-tuning a model to better its performance. However, it’s computationally more expensive and is employed for sequential decision-making tasks (like games or robotics).

AI Agent

Software that autonomously interacts with its environment makes decisions and takes actions to achieve its goals. It uses AI models to understand the input data (textual prompt, image, spoken language, etc.) and to make decisions (predict outcomes, evaluate possible actions, and select the best course of action). The AI agent software then carries out the course of action.

A Diagram of AI Terms

Along with the AI terms cheat sheet, I created a few diagrams during my postgraduate course on AI, ML, and DL. I found these very helpful in guiding me through the concepts when I started learning about AI.

AI Diagram

In the diagram above, the first set of circles shows how Deep Learning is a subset of Machine Learning, and they are both subsets of Artificial Intelligence.

VennDS

Early on, I was unclear how Computer Science and Math correlated exactly with Data Science, so I created this Venn diagram of the various fields of study that comprise Data Science.

Inference Pipeline

inference pipeline

The above diagram is admittedly simplified but demonstrates the relationships between some of the model architecture topics. The inference pipeline shows where input text is converted to tokens, the next token probabilities are predicted, and those probabilities are finally decoded into the next predicted word. Creativity vs. stability can be controlled with top_k and temperature (two example hyperparameters).

Neural Network Example

Neural Networks

Although every Neural Network is different, this diagram represents a few key components. Here we can see the inputs (e.g. tokens values, pixel values, category values, etc) being passed to the input layer. Every circle represents a neuron. Neurons pass their output value to the next layer. In this example we have the input layer, the output layer, and two hidden layers (layers between input and output).

It is important to note the parameters here. Parameters are divided into two categories, weights, and biases. The values for these are learned during training of the model. Every black line really represents two things: the output of the neuron and a learned weight (the strength of the connection). The red lines represent a bias (an overall adjustment of that neuron). Every black line is 2 parameters, and every red line is 1 parameter.

As you can imagine, the more neurons and layers you have, the more parameters the model will have. As the number of trainable parameters goes up, more complex relationships can be captured.

Don't Be Sad - There Will Be More AI Terms!

Just as new trends in technology and AI are constantly evolving, so will this document. It is a living document, and I will update it with new terms as they emerge. If you feel I’ve missed something or if you want to collaborate with our team on your next AI project, please don’t hesitate to contact us.

I truly hope you find this helpful!

Ryan Kettrey

]]>
ETL in Azure https://www.ronin.consulting/cloud-technology/azure/etl-in-azure/ Mon, 20 Apr 2020 23:56:57 +0000 http://www.ronin.consulting/?p=561 ETL (Extract, Transform, and Load) has been a part of just about every digital transformation project we have worked on at Ronin. Whether it’s moving data out of an on-premise legacy system to be consumed by newer cloud-based applications or just combining data from disparate systems to be used in a reporting data warehouse, ETL processes are a necessary part of most enterprise solutions. So, what does Azure provide to help us with ETL?

Revising Our Approach

For a few years, the approach we used was relatively bare metal. That is, we leveraged Azure Functions and Web Jobs to connect to data sources, transform the data with custom code, and ultimately push it to a target location. It got the job done for sure, but as you can imagine there is fair amount of boiler plate code. Additionally, the monitoring and scaling implementations were different for each solution. 

Today, every ETL discussion starts with Azure Data Factory. While we had to pass on using early versions of ADF in favor of the bare metal process to really get our work done, that’s not the case anymore. ADF has a ton of ways to ingest data, it scales well, and Data Flow offers a ton of transformation options without writing any custom code.

Our High-Level Decision Guide

Microsoft positions ADF specifically as an Azure service to manage ETL and other integrations at big data scale. While there are many ways to employ ADF for the solution, we’ve specifically found the following questions and answers most useful as our guide:

  • If we only need to perform extraction and loading of data (for example making data from a legacy system available in the cloud), ADF’s basic pipeline activities are sufficient.
  • If we also need transformations, we’ll start out using ADF’s Data Flow features. We have found that the majority of transformations that we need (joins, unions, derivations, pivots, aggregates, etc) can be handled with the Data Flow user interface.
  • If the transformations involve some edge case scenarios, are hard to visualize in a UI, or there is just a comfort level developing it as code, Azure Databricks (ADB) integration can be used to perform these transformation.

Basic Pipeline Activities Approach

The basic workflow in an Azure Data Factory is called a pipeline. A pipeline is an organization of activities (data movement, row iteration, conditionals, basic filtering, etc) against source and target data sets. Directly, it offers little in the way of transformation activities, though you can hook it to Azure Functions or Azure Databricks (see Azure Databricks Approach below) for more advanced cases.

Below is an example basic pipeline I created very quickly using just a few standard activities. This pipeline simply reads an Employee CSV dataset from Azure BLOB storage, filters the records to only those of new employees, then loops over each row and calls a stored procedure to insert each employee record into a SQL Server database table. The resulting output in the bottom frame is from a debug session.

Screen Shot 2020 04 17 at 11.54.41 AM 1024x526 1

For more information on pipelines and available activities, check out https://docs.microsoft.com/en-us/azure/data-factory/concepts-pipelines-activities.

Data Flow Approach

A Data Flow is a visually designed data transformation for use in Azure Data Factory. The Data Flow is designed in ADF, then invoked during a pipeline using a Data Flow Activity. The transformations offered here offer a lot of power and configuration options through an easy to follow interface. Joining and splitting data sets, cleaning data, deriving new columns, filtering and sorting results, and running expression functions on row data are some of the possibilities with Data Flow. All of it is done through simple user interface controls.

Below is an example mapping data flow I created to show just a few of the transformation components that can be used. of the very quickly. This data flow reads HR employee data, contractor data, and billing info from three different systems. It performs some filtering and new column generation, then combines all of these results. Finally, it sorts the results and drops it to a CSV file.

Screen Shot 2020 04 17 at 3.05.39 PM 1024x337 1

For more information on Data Flows, check out https://docs.microsoft.com/en-us/azure/data-factory/concepts-data-flow-overview.

Azure Databricks Approach

There are times when it makes sense to simply write code to perform a data transformation. For example:

  • There’s a weird edge case that the data flow user interface can’t accommodate.
  • There’s going to be a high degree of refactoring (change) needed over time and the data flows will be large. It would be much easier / faster to tweak the code than to try to re-write large data flows.
  • The source data is already exported as enormous amounts of unstructured data into Azure Data Lakes Storage, the file system natively integrated into Azure Databricks.

In these cases, Azure Data Factory pipelines can invoke notebooks in Azure Databricks using a Databricks Notebook activity. Notebooks define Scala, Python, SQL, or Java code to manipulate and query large volumes of data (terabytes) on its specialized Azure Data Lake Storage file system.

In the below example, I created a simple Databricks notebook to read two CSV files that have been dropped into Azure Data Lake Storage. These could have just as easily been Excel, JSON, parquet, or some other file format as long as there is an extension to read them into data frames. This example takes employee and HR files, joins the rows, computes a PTO Remaining column, orders the results, then stores the data back out as a new CSV file. Azure Data Factory would have a pipeline configured with a Databricks Notebook activity to call this notebook, passing the two CSV file names.

Screen Shot 2020 04 17 at 6.28.38 PM 1024x515 1

Note how you can seamlessly switch between languages in a notebook. This one is a Scala based notebook that switches to SQL midway through. The environment is also very interactive for debugging against large amounts of data, a nice feature since the ADF user interface can only show limited amounts of data in its debug sessions.

Interestingly, ADF’s data flows are implemented as generated Scala code running in its own managed Databricks cluster. This all happens behind the scenes, but it explains why it’s actually hard to come up with everyday use cases where data flows aren’t sufficient. For more information on transformations with ADB, check out https://docs.microsoft.com/en-us/azure/azure-databricks/databricks-extract-load-sql-data-warehouse.

Parting Thoughts

As awesome as ADF is, it is true that it’s not always the be-all and end-all for ETL. There are still times when ADF is only part of the solution. For example:

  • The server infrastructure hosting an on-premise or alternate cloud database from which ADF needs to pull can’t host the integration runtime (a requirement for ADF to reach the data). In this case, we may have to design and build interesting ways to get the data out and into Azure, accessible to ADF
  • Though accessible by network to ADF, the source data is contained in a format ADF can’t read. In this case, we may have to build or leverage 3rd party software to extract the data into a digestible format for ADF
  • The source data’s schema is so bonkers, Azure Databricks is necessary to pull off the transformation. However, the client may be unwilling to pay the heft ongoing cost of ADB, or they may not be comfortable supporting it down the road and would rather see a more traditional C# or T-SQL coded solution. In this case, we may fall back to a bare metal approach.

Like most software projects, one-size never fits all. But we highly recommend you give ADF a strong look on your next ETL adventure. We’d love to help you with it!

About Rōnin Consulting – Rōnin Consulting provides software engineering and systems integration services for healthcare, financial services, distribution, technology, and other business lines. Services include custom software development and architecture, cloud and hybrid implementations, business analysis, data analysis, and project management for a range of clients from the Fortune 500 to rapidly evolving startups. For more information, please contact us today.

]]>
Solving the Mapping Problem for Web Service APIs https://www.ronin.consulting/cloud-technology/solving-the-mapping-problem-for-web-service-apis/ Mon, 23 Mar 2020 00:05:00 +0000 http://www.ronin.consulting/?p=536 At Ronin, it’s typical for us to be working on a project that needs to tie multiple systems together. These can be bare metal integrations that work directly against application databases, but more modern integrations will feature some type of web service API (typically REST or SOAP) with the actual payload being JSON or XML data. Today, I thought I’d share a solution I recently used to solve the problem of mapping the payload from one web service API to another.

Mapping API Data

For this particular project, I needed to receive a large web service API payload (a SalesForce event notification with an XML payload), do some interesting internal work (audits, fire off messages to an Azure Service Bus topic, etc.), and finally deliver the payload to another 3rd party application. Since the incoming payload (XML) would be different than the payload accepted by the 3rd party application’s web service API (JSON), payload transformation also needed to occur.

There are many ways to pull off this implementation in Azure (HTTP triggered Azure Function App, Azure App Service API, Azure Logic App, etc.), but for this project, we chose Azure Logic Apps. Using Logic Apps would allow the client to make minor tweaks to the process flow without needing us to come back and write additional C# code, which is a bit of a holy grail for many small IT shops requesting project help.

A

However, the approach did present a problem regarding the payload transformation. For small/simple payloads, it makes sense to use the Logic App JSON creation actions and built-in function expressions, but it gets messy as the payload grows in complexity. Writing some C# code to read a large XML or JSON payload and creating another is relatively simple. This could be placed in an Azure Function App and called from our Logic App, but I’d arrive at a mapping mechanism that would not be tweakable by our client later on.

We used Azure Logic Apps for a previous client to produce EDI flat files. For that implementation, an Azure Integration Account was used to hold maps. These maps described transforming an XML payload to an EDI flat file. That same exact approach would be a bit heavy as it involves navigating custom source XML schemas, using the Microsoft BizTalk mapper (heavy), and in some cases some custom XSLT or BizTalk scriptoid development. 

B

Still, something like this approach that was lighter weight and integrated with Logic Apps would be a solid fit.

Liquid is Solid

After some research, I stumbled upon the perfect solution for this client: Liquid templates.

Azure Logic Apps have a series of actions for data transformation, pulling the transformation definitions, or maps, from an Azure Integration Account. In addition to BizTalk maps, Integration Accounts natively support Liquid templates (https://shopify.github.io/liquid/). Liquid is an open-source template language that works a bit like XSLT. Using Liquid tags (control flow) and filters (output manipulation), intermediate and some complex JSON and XML transformations can be achieved from an Azure Logic App by editing a simple text file and loading it into an Azure Integration Account.

C

For example, suppose I have the following incoming XML payload from web service API (e.g. Sales Force):

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <notifications xmlns="http://soap.sforce.com/2005/09/outbound">
   <OrganizationId>00DL0000005xwjAMAQ</OrganizationId>
   <ActionId>04kL00000000BCFIA2</ActionId>
   <SessionId>... session id ...</SessionId>
   <EnterpriseUrl>... url ...</EnterpriseUrl>
   <PartnerUrl>... url ...</PartnerUrl>
   <Notification>
    <Id>12345</Id>
    <sObject xsi:type="sf:Beneficiary__c" xmlns:sf="urn:sobject.enterprise.soap.sforce.com">
     <sf:Id>67890</sf:Id>
     <sf:First_Name__c>Susan</sf:First_Name__c>
     <sf:Last_Name__c>Smith</sf:Last_Name __c>
     <sf:Address_City__c>Atlanta</sf:Address_City__c>
     <sf:Address_State__c>GA</sf:Address_State__c>
     <sf:Phone__c>(678) 867-5309</sf:Phone__c>
     <sf:Primary__c>Yes</sf:Primary__c>
     <sf:Contingent__c>No</sf:Contingent__c>
     <sf:DOB__c>2012-05-11T00:00:00.000Z</sf:DOB__c>
     <sf:Allocation__c>80%</sf:Allocation__c>
    </sObject>
   </Notification>
  </notifications>
 </soapenv:Body>
</soapenv:Envelope>

Further, suppose I need to map this to an outgoing JSON payload for a target web service API as follows:

{
  "Id": 67890,
  "First": "Susan",
  "Last": "Smith",
  "City": "Atlanta",
  "State": "GA",
  "Phone": "6788675309",
  "Status": "CNTG",
  "DoB": "05/11/2012",
  "Allocation": 80.0
}

Notice a couple of wrinkles in this sample mapping:

  • I need to strip some formatting from a phone number
  • I need to collapse Primary and Contingent elements to a single JSON value
  • I need to re-format a date to mm/dd/yyyy

Here’s a Liquid template I would write to get this transformation done:

{
  "Id": {{content.Envelope.Body.notifications.Notification.sObject.Id}},
  "First": "{{content.Envelope.Body.notifications.Notification.sObject.First_Name__c}}",
  "Last": "{{content.Envelope.Body.notifications.Notification.sObject.Last_Name__c}}",
  "City": "{{content.Envelope.Body.notifications.Notification.sObject.Address_City__c}}",
  "State": "{{content.Envelope.Body.notifications.Notification.sObject.Address_State__c}}",

{%- capture formattedPhone -%}
  {{content.Envelope.Body.notifications.Notification.sObject.Phone__c | Strip | Remove: "("  
      | Remove: ")" | Remove: "-" | Remove: "." | Remove: " "}}
{%- endcapture -%}
  "Phone": "{{formattedPhone}}",

{%- if content.Envelope.Body.notifications.Notification.sObject.Primary__c == "Yes" -%}
  "Status": "PRIM",
{%- else -%}
  "Status": "CNTG",
{%- endif -%}

{%- capture extractedYear -%}
  {{content.Envelope.Body.notifications.Notification.sObject.DOB__c | Slice: 0, 4 }}
{%- endcapture -%}
{%- capture extractedMonth -%}
  {{content.Envelope.Body.notifications.Notification.sObject.DOB__c | Slice: 5, 2 }}
{%- endcapture -%}
{%- capture extractedDay -%}
  {{content.Envelope.Body.notifications.Notification.sObject.DOB__c | Slice: 8, 2 }}
{%- endcapture -%}
  "DoB": "{{extractedMonth}}/{{extractedDay}}/{{extractedYear}}",

  "Allocation": {{content.Envelope.Body.notifications.Notification.sObject.Allocation__c 
      | Remove: "%"}}
}

This is just a simple text file I typed up in Notepad++ and then uploaded into an Azure Integration Account:

D

The Map Type field is key. Instead of using the output XSLT file from BizTalk mapper, I choose Liquid as the type.

Finally, I used the uploaded Liquid template in the Azure Logic App like so:

E

Real World Web Service Approach

I used this approach to perform all of the XML to JSON payload transformations that were needed for our client’s project. The best part of this approach is its well within their reach to tweak. As more fields are exposed from Sales Force that need to be shuffled down to their target web service API, the client can simply update the map and the JSON parsing.

The approach isn’t without a few issues. A few things I’d consider before using it for another client are:

  • The built-in formatting is currently very limited. I had to write my own formatting markup to rework phone numbers and dates. There are a lot of advanced filters out there that would format strings as I needed, but until Microsoft supports registering these extensions, you’re stuck writing your own.
  • When you do write your own filtering code, the problem is compounded by the fact that you can’t call a block of code over and over. You end up having to cut and paste any complex formatting. Again, this problem should be solved once Microsoft supports registering extensions.

All-in-all, if you are looking for that in-between mapping solution (easily edited, doesn’t need a lot of complex features, etc.), have a look at Liquid templates!

To learn more about or process, or talk to a Rōnin Software development consultant, contact us today!

]]>
Why Blazor Has Me Excited https://www.ronin.consulting/microsoft/why-blazor-has-me-excited/ Wed, 19 Feb 2020 19:33:00 +0000 http://www.ronin.consulting/?p=502 A Trip Down Memory Lane

Back in the 90s (it wasn’t that long ago, was it?), our development teams that built internal business applications were pretty simple. As we were building mostly desktop applications, we either had a team of Java Swing developers or a team of Microsoft WinForms developers. While we sometimes brought in user interface experts to help us with flow or imagery, everyone could do everything when it came to actual development. Life was much simpler regarding building out and maintaining our development team.

As the web took over for all the right reasons, we enterprise developers had to adapt. We had to learn a separate technology stack of HTML and JavaScript to build our user interfaces while simultaneously keeping our Java and C++ or C# stack for the backend. Java Servlets, Java Server Pages, and Microsoft ASP/ASP.NET initially bridged the gap for us, allowing enterprise developers to use their primary language skillsets still.

However, as more and more JavaScript frameworks arose, AJAX became a thing, and SPAs eventually took over, and many of us adopted. We learned one set of languages for our frontend work and another for our backend work. Those that couldn’t (or didn’t want to) became backend developers. In fact, it was around this time that developers began to specialize into frontend and backend roles. It’s a concept that seems common now but wasn’t always. Hiring got more complicated.

As technologies like Adobe Flex, Microsoft Silverlight, Java FX, and others arrived, enterprise application developers got excited. Could we really have nice-looking web user interfaces for our enterprise applications that were written by our (now) server developers? Could it be done using one language again for the user interface and backend? If you’re a Microsoft developer, you know full well of the sadness of Silverlight. A lot of promise that fizzled when the browser plug-in model died. The dream was dead again, and frontend stacks like Angular took over. 

Enter Blazor

I’ve been hearing bits and pieces about Blazor for several months, whether from podcasts or articles. It has kept my attention because it promises to fill that space again, letting one developer skilled in C# build both the front end and backend of an enterprise application.

To date, I had not really taken a deep-dive look at Blazor. That changed last night when I saw Carl Franklin’s Blazor Road Show here in Atlanta. Carl is well-known in the Microsoft community as he co-hosts one of my go-to podcasts, .NET Rocks. His stamp on Blazor drew me in instantly.

What I Learned And Why Blazor Has Me Excited

Carl spent three hours with us explaining the theory behind Blazor, its internal workings, its concepts, and building out demo applications. I left feeling like I could spin up a Blazor application in minutes and wouldn’t be working with a product that will be abandoned by Microsoft. Further, I could see a path to simpler IT development teams for the right shops for the first time in a long time. 

Now, don’t get me wrong. I have seen the benefit of working with some seasoned frontend developers in making an awesome user interface. We have a couple on staff at Ronin that consistently create beautiful user interfaces. However, if I’m a shop building and supporting internal enterprise web applications or creating and maintaining a suite of line-of-business applications, Blazor could be the future. How?

With Blazor, all development is with C# and Razor pages (think of a much cleaner and simpler version of ASP.NET Web Forms markup), so I only need C# developers to build web applications that function like any other SPA.

@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    [Parameter]
    public int IncrementAmount { get; set; } = 1;

    private void IncrementCount()
    {
        currentCount += IncrementAmount;
    }
}
@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<Counter IncrementAmount="10" />

The out-of-the-box Blazor UI components are probably good enough for many internal enterprise applications, minimizing or eleminating the need for specialized frontend user interface developers. That said, you can certainly customize the styling with CSS if desired. Additionally, companies such as Telerik and DevExpress have already created several themes and components that can be used, eliminating the need for any CSS development to achieve even better looking applications than Blazor produces out of-the-box.

Blazor Table

There are other benefits, too. For example, depending on what Blazor mode you choose, performance may even be better. Blazor server-side mode, for instance, utilizes binary data over web sockets for it’s communication, eliminating the need for HTTP web sockets to be opened on each request and thereby performing faster than today’s web applications.

Microsoft already has Blazor support in their current development tools, and according to Carl, they are releasing further updates in May. 

About Rōnin Consulting – Rōnin Consulting provides software engineering and systems integration services for healthcare, financial services, distribution, technology, and other business lines. Services include custom software development and architecture, cloud and hybrid implementations, business analysis, data analysis, and project management for a range of clients from the Fortune 500 to rapidly evolving startups. For more information, please contact us today.

]]>
CI/CD Pitfalls with Branches and Azure Functions Uncovered https://www.ronin.consulting/cloud-technology/ci-cd-pitfalls-with-branches-and-azure-functions/ Wed, 29 Jan 2020 15:03:46 +0000 http://www.ronin.consulting/?p=327 Intro

Azure Functions are a key part of the Microsoft Cloud computing platform. Focusing on integration and continuous delivery, we provide our clients with excellent results with cloud computing. However, while recently building out some Azure Functions for one of our clients, I encountered an unexpected problem while deploying them. I thought I’d share what I found with some of these CI/CD pitfalls.

The Problem and CI/CD Pitfalls

The problem arose during the setup of the CI/CD pipeline. Like most Azure implementations, we wanted to set up our build and release pipelines using Azure DevOps, which allows us to automatically run unit tests during check-in and automatically deploy code to Azure Function Apps. The setup was extremely smooth with Azure DevOps integration since the codebase was being stored in Azure Repos. The default branch of code (master) deployed perfectly to the Azure Function App.

Azure Function Deploy Pipeline
Azure Function Deploy Pipeline

As smooth as this was, however, I hit a wall when trying to deploy the code from the development branch to a development slot of the Function App. The Azure DevOps deployment logs were not particularly helpful, and web searches turned up little on the problem. After spending a lot of time experimenting, digging through logs on the server, and reading through the project Kudu source code, it became clear there was a problem using Zip Deployments. The reason this was so difficult to track down, and there is not much information out there about is that it’s only a problem under the following conditions:

  • You’re deploying a non-default branch (not master), such as a feature or dev branch
  • The deployment method is using:
    • An Azure Function App’s integrated Deployment Center
    • An Azure DevOps pipeline using an Azure Functions task

Both of these deploy using ZipPushDeploy, which at the time of this writing, counts on the source branch being the default (master).

The Solution

Taking some advice from a fellow business partner and Azure expert Byron McClain, I tried using an Azure App Service Deploy task from the release pipeline. Since this task’s advanced options let you choose Web Deploy over the default Zip Deploy, I was back in business. This is our workaround until the good contributors at Project Kudu can patch the issue.

Azure Function App Service Deploy

For more details about the ticket, go here.
For more details about Azure Functions and Serverless Computing, go here.

Happy Azure Trails!

About Rōnin Consulting – Rōnin Consulting provides software engineering and systems integration services for healthcare, financial services, distribution, technology, and other business lines. Services include custom software development and architecture, cloud and hybrid implementations, business analysis, data analysis, and project management for a range of clients from the Fortune 500 to rapidly evolving startups. For more information, please contact us today.

]]>