Blog Entries


WordPress for Beginners

If you own a business, you’ve probably heard a lot about WordPress lately. Maybe you’ve heard about why WordPress is better than other website platforms or maybe you just know that it’s all the rage and everyone’s using it. Either way, here’s what you need to know about the website management king that is WordPress.

What Is WordPress?

WordPress is what’s known as a content management system – or CMS for short. A CMS is an online system that allows you to manage everything on your website, from your page content to blog posts to your navigation and links. Once you purchase your domain (something like www.caprockapps..com), you can install WordPress on your server so you have an easier time editing your content. Without WordPress, you may need to know coding – think: HTML, CSS, PHP, MySQL – or find another CMS you like.

WordPress is not the only CMS out there, but it is the most popular. Most people hear “WordPress” and immediately think “blog.” While it’s true that WordPress started out primarily as a blogging platform in the early 2000s, it’s come a long way since then.

Today, businesses use WordPress to create gorgeous websites that are user-friendly on any device. The backbone of a WordPress website is its theme. WordPress allows you to choose a theme that has the basic structure of the website you’re looking for. Then you can customize that theme to look exactly like what you’ve envisioned for your business’s online presence.

How Much Does WordPress Cost?

Nothing! That’s the beauty of WordPress. The CMS itself costs you nothing. That means you get to create custom navigation menus, use widgets, personalize your site with plugins, run a blog, and manage all of your website content in one easy-to-use system for free. You can even get WordPress themes for free, though they are usually basic and have limited customization.

If you want to create a professional website that your customers can access from any and all of their devices – and why make it hard on them to buy what you’re selling? – you can invest in a premium WordPress theme. Premium themes cost anywhere from $20 to $250, though the average theme costs about $70. Premium themes come with a plethora of customizable options, compatible plugins, regular updates, and support from the theme’s creators.

If you’re serious about creating a website that’s truly unique to your brand, you could invest in professional plugins, a custom-built theme, or a team to manage your content for you. However, if you’re just starting out with WordPress and getting a feel for how the CMS can help your business, rest assured that it’s entirely free to use.

Do I Need to Hire Someone to Manage My WordPress Site?

That depends. If you have experience building a website, writing content, and editing your content so it’s optimized for search engines like Google, Yahoo!, and Bing, then you can probably handle it on your own. Editing a web page or blog post in WordPress is similar to using Microsoft Word. So if you can use Microsoft Word, you can use WordPress.

However, if you want your website to rank high on Google when customers search for your service or product, you may want to invest in some help. First, customers are impressed by a visually attractive website with interactive features. A WordPress expert can create just such a website for you. Second, there’s nothing worse than visiting a website and trying to click on a link only to find that the link doesn’t work. By hiring someone to build and manage your WordPress site for you, you’ll never have to worry about broken links.

Finally, search engine optimization (known by tech pros as SEO) is a tricky business. Google is constantly changing what it considers to be “good SEO” and SEO experts spend hours keeping up with the latest trends to make sure your website stays at the top of page 1. If you don’t have the time – or the desire – to learn SEO and use it well, hiring someone to handle that for you is a wise investment that can drive sales and increase profits for your business.

WordPress is as complicated as you make it. It’s so popular because it’s so easy to use. Beginning website owners love WordPress because it’s intuitive, user-friendly, and similar to other programs they are familiar with. However, WordPress can easily become complicated when you set high expectations for your website and want to use your online presence to drive traffic to your business.

Read Full Entry

Improve Compliance with Custom Applications

<h1>Improve Compliance with Custom Applications </h1>

You don’t want your employees to break the law, do you? Of course, not. But, keeping up with government regulations and ensuring corporate compliance is challenging. You need flexible solutions that can help reduce risks and improve compliance. Custom applications can be an integral part of your compliance strategy.

What is compliance?

Compliance is the ability of an organization to meet both external regulations and internal policies. Whether you are running a construction business or a medical practice, you must understand government regulations and ensure you and your employees comply with the law. From HIPAA to OSHA to Sarbanes-Oxley, government regulations designed to protect consumers, workers, and investors can often overwhelm business owners.

According to the International Compliance Association, trained compliance officers help their organizations manage regulatory risks. Yet, many small businesses can’t afford to have a full-time compliance officer. That’s where custom applications can help.

How can custom applications help?

Among their duties, corporate compliance officers must:

  • Develop and implement controls that help mitigate risks
  • Create reports that demonstrate the effectiveness of those controls

Caprock Custom Applications has designed applications that implement controls and ease reporting.

For one client, we developed an application that helps solo and small medical practices run their businesses while complying with HIPAA and Medicare regulations. Instead of multiple applications and interfaces, this solution enables clients to do everything from scheduling patient appointments to managing health records in a single, integrated tool.

For another client, we designed a custom application that helps monitor and report asbestos sampling results to customers. Unlike off-the-shelf solutions, our solution enabled our client to customize data points and gather unique information across customers. Users then generated consistent, professionally formatted reports in one quarter of the time typically taken.

If you’re looking for an automated software or application to help your business improve regulatory compliance, we’ll create a custom application tailored to your exact needs. Tell us about your problem and we’ll offer a custom solution today.

Sources:

What It Means to be Compliant

An Example of a Compliant Project

Read Full Entry

Build Your Business on a Scalable Platform for High Growth

Build Your Business on a Scalable Platform for High Growth

 

You want your business to grow, right? Isn’t that the whole point? If so, you need to plan for the large customer base you hope to work with in the future, even if you’re dealing in small numbers today. Don’t make the mistake of limiting your growth with a platform that can’t accommodate your success. Instead, plan for the growth you want with a scalable platform.

 

What is a scalable platform?

When businesses first establish a platform online or as an application, their first inclination is to build a platform that can meet the needs of the current customer base. However, when that business grows to include more customers, users, or downloads, the platform requires significant redesign and development work to handle the larger population. This often means down time, loss of connectivity, or even loss of customers.

 

A scalable platform avoids all of these problems by operating in a growth-minded fashion from day one. A scalable platform allows more customers to use the software without changing the functionality, code, or style of the application. With a scalable platform, your application can accommodate larger numbers without extensive work behind the scenes.

 

The key to developing a successful scalable platform is in understanding the stress points on your unique application. For some applications, stress points may occur in memory, speed of information transmission, or simply loading a new window. It takes insight and an in-depth knowledge of customer behavior to predict these stress points and implement creative solutions to set up a reliable platform. Once the stress points are identified, a robust architectural foundation is created to support these stress points.

 

A scalable platform establishes the groundwork for increasing the number of users, amount of data, and amount of processing required over time. In order to accommodate this growth, custom software developers create a strong architectural framework within the application that allows different parts of the application to communicate with each other. In technological terms, we call this a “service oriented architecture” or SOA. Better communication means better functionality and room for growth. Overall, a scalable platform is a strategic method of preparing for the future with a strong foundation that can support greater success over time.

 

What does a scalable platform do for your business?

Running a business naturally involves a great deal of problem solving. However, you should be focused on solving your customers’ problems – not your own. In order for you to be the go-to resource for your customers, everything needs to run smoothly on your home turf. That’s where a scalable platform comes in handy.

 

A scalable platform anticipates future problems in the form of stress points. Working backwards, skilled software developers can create a service oriented architecture that reinforces these stress points and provides room for expansion. When customers use your application, they’ll enjoy a more fluid experience no matter how many users or how much data are being processed in the system. This translates into better functionality, greater customer appeal, and more revenue for your business.

 

How does CCA facilitate growth for my business?

Caprock Custom Applications specializes in designing and creating scalable platforms to meet the needs of your business and customers. We design your custom scalable platform with your future success in mind.

 

For example, we recently built a custom software application for a client who owns an insurance wholesale company that was processing just a few thousand dollars per month. Our client was working hard to grow the business and reach new clients, and we saw bright things in his future. So we designed a scalable platform that could handle the type of revenue he was hoping to earn.

 

Now he process millions of dollars every month on the custom platform we built. Although his business grew substantially, he didn’t need to make any changes in his operations because the platform we created for him was able to handle the dramatic increase in volume.

 

Modern businesses are expanding on a wide variety of technological frontiers. We want to meet you where you’re most comfortable. Whether you’re working with WordPress and need a custom plugin to handle your growing ecommerce inventory or you need a mobile app that will facilitate your business on the go, we’ll create the technology solution that you can take with you as you climb the ladder.

 

If you’re looking system that meets the needs of your business as it grows we can create a custom solution tailored to your exact needs. Tell us about your problem and we’ll offer a custom solution today.

 

Read Full Entry

Outsmart the Clock: Using Custom Software to Automate Tasks

You know your business inside and out, but it’s still a challenge to keep up with all the processes that go into handling each client relationship. From the sales funnel to getting signatures in all the right places, some tasks feel like more trouble than they’re worth.

That’s why automation is your best friend as a business owner. If you have a series of tasks you need to perform with each new client or customer you work with, why not automate those tasks? Here’s what automation can do to free up your time and head space so you can focus on quality client interactions.

Reaching Clients

Think about how you reach your potential clients. While you probably use a number of different marketing techniques, there are probably some that could run on their own. For example, if you like to keep in touch with your target audience through email marketing, why not set those touch points on an automated sequence.

With a custom software application, you can relax while an automated system constructs your email list, sorts prospects by position or industry, sends perfectly-timed emails, and records the open and response data for you. No more hustling to make sure you’ve followed up with each prospect. No more wondering about whether your email went through or was well-received.

How many hours per week would that save you?

Sales

As of 2014, 90 percent of Americans preferred using an electronic method of payment like using credit cards, debit cards, and PayPal. Americans love plastic and digital payments so much that 75 percent of shoppers over age 15 bought something online in 2014. So why are you still using paper invoices?

Now, if you have a soft spot for USPS and feel it’s your personal responsibility to keep the Federal Post alive, that’s one thing. But if you just like saving time and seeing black in your books, switch to an automated payment system.

Whether you’re collecting rent from tenants, sending a project invoice, or need a deposit on creative services, a custom application designed to fit your business processes can save you time while meeting your clients where they’re most comfortable.

Onboarding

What does your onboarding process look like? Are there forms to fill out, questionnaires to answer, contracts to sign? If so, automate it! You can serve your clients better by putting your skills to work rather than pushing papers.

Sure onboarding is a necessary step vital to the success of any project, but it doesn’t have to be painful. A custom application can house all of your onboarding documents in one attractive user interface and help you make sure all your I’s are dotted and T’s are crossed for each client.

Feedback

You’ve done your job, made your client happy, and collected your payment. Awesome! There’s just one thing left to do. Get a review.

In 2015, “a study of more than 57 million online reviews indicate[d] that consumer-generated content has an impact on purchasing decisions, even when customers research online, and buy in store.” So those Google+, Facebook, and Yelp reviews have a major impact on whether or not future shoppers will become your customers.

At the end of a project, rely on an automated system of collecting reviews and testimonials from each person you worked with. The right application will gather the information, get your client’s permission to publish online, and ready your rock star review for publishing on your website.

If you’re looking for an automated software or application to help your business maximize its productivity, we’ll create a custom application tailored to your exact needs. Tell us about your problem and we’ll offer a custom solution today.

Read Full Entry

THE QUICK GUIDE TO RESPONSIVE WEB DESIGN

If your business has its own website, you know how important responsive web design is, and if you don’t, you should! In late 2016, mobile device usage surpassed desktop usage for the first time. With the ever-growing use of mobile devices, we must also consider the tremendous diversity of screen sizes and resolutions. It would be completely impractical, and honestly, I’d question your sanity if you tried to build a different website for all the different variations of devices. Thankfully, responsive web design frees up all the time you’d have spent building your legion of webpages designed to be aesthetically pleasing on a constantly expanding number of platforms and devices.

Now, let’s get into the basics of responsive web design. It’s built around three pillars; Fluid grids, Flexible images, and Media queries. These pillars allow us to build a webpage without a fixed layout. Fluid grids are basically guidelines for your website content to keep things fluid and flowing enhancing the viewer’s experience. Fluid grids shrink and expand the content within them based on the size of the screen being used to view them.

Ever tried to look at a website on your phone that you couldn’t navigate because the images or pop-ups covered your entire screen? That’s the second pillar’s job. Flexible images, can be arranged horizontally and vertically and sized accordingly to accommodate the viewing experience. Together, these two pillars and their arrangement provide the aesthetic of the page. The third pillar, media queries, ties it all together. Media queries identify the device being used and adjust the website accordingly. Pretty neat? The advent of language that allowed for media queries permitted the page to figure out what the physical aspects of the device are that the page is being viewed on. Is the device viewing in landscape or portrait? Is it 480 pixels or 1200 pixels? A media query will answer these questions, allowing the page to respond to the specifications of the device. How does text need to wrap? Do images need to align vertically or more horizontally? The response to the query provides these answers.

Simply put, together the three pillars of responsive web design identify what kind of device is being used for viewing, and adjust the website accordingly for the best viewing experience. Responsive web design, with its digital intelligence, provides us the means to build a single web page that will respond to whatever device it’s being viewed on and look good doing it! Not sure if your website is built with a responsive design? We can help! Contact us and we will be happy to run your website through our responsiveness checklist and let you know how it is doing.

References:

  1. https://www.smashingmagazine.com/2011/01/guidelines-for-responsive-web-design/t
  2. https://www.smashingmagazine.com/2011/01/guidelines-for-responsive-web-design/
  3. http://blog.teamtreehouse.com/beginners-guide-to-responsive-web-design
  4. https://alistapart.com/article/responsive-web-design
  5. https://techcrunch.com/2016/11/01/mobile-internet-use-passes-desktop-for-the-first-time-study-finds/

Read Full Entry

Application Configuration in ASP.NET 5 MVC 6 (or Where’d my web.config go?)

Introduction

Where’d my web.config go?

The first thing you will notice when you begin to set up application configuration in the new ASP.NET 5 framework is that the web.config file is gone.  XML has gone the way of the dinosaurs and been replaced by JSON.  It may seem a little confusing at first, but once you get it down things get a lot simpler.  No more tedious release vs debug transformations and the new configuration file are much easier to read and understand (for me anyway).  Plus… we get the benefits of strongly typed configuration data that can be separated into models.  In this article I’ll walk you through everything you need to know to get started using .Net Core's new configuration system.

How It Works

The new configuration file is aptly named appsettings.json, although you can name it anything you want.  When you create a new ASP.NET 5 Web Application project using the scaffolding wizard, this file is automatically placed in the root of your project.  We can also create separate versions of this file to override values for each environment such as debug and release, but more on that later.

The default contents of the appsettings.json file.

   1:  {
   2:    "Data": {
   3:      "DefaultConnection": {
   4:        "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=blah-blah-blah..."
   5:      }
   6:    },
   7:    "Logging": {
   8:      "IncludeScopes": false,
   9:      "LogLevel": {
  10:        "Default": "Verbose",
  11:        "System": "Information",
  12:        "Microsoft": "Information"
  13:      }
  14:    }
  15:  }

As you can see above, the default content gives us some basic application settings in JavaScript Object Notation (JSON).  Here’s where we’ll find the connection string just as we would have in our old web.config, and there’s some Logging configuration values here too.  Notice the hierarchical structure of the key-value-pairs.  Let’s break away from the appsettings.json file for a moment (we’ll get back to it later), and look at Startup.cs.

First a quick note:

You'll also need to make sure you have the correct packages loaded via Nuget's new package system by placing the following lines in project.json. Note: these are included by default in the scaffold generated project.

   1:  // Make sure you have these assemblies added under dependencies in project.json
   2:    "dependencies": {
   3:      ///...
   4:      ///...
   5:      "Microsoft.Extensions.Configuration.FileProviderExtensions" : "1.0.0-rc1-final",
   6:      "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
   7:      "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
   8:      ///...
   9:      ///...
  10:    }

The default contents of the Startup.cs file.

   1:  // These two usings are needed for the configuration we have below.
   2:  using Microsoft.AspNet.Hosting;
   3:  using Microsoft.Extensions.Configuration;
   4:   
   5:  namespace HelloConfigWorld
   6:  {
   7:      public class Startup
   8:      {
   9:          public Startup(IHostingEnvironment env)
  10:          {
  11:              // Set up configuration sources.
  12:              var builder = new ConfigurationBuilder()
  13:                  .AddJsonFile("appsettings.json")
  14:                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
  15:   
  16:              if (env.IsDevelopment())
  17:              {
  18:                  builder.AddUserSecrets();
  19:              }
  20:   
  21:              builder.AddEnvironmentVariables();
  22:              Configuration = builder.Build();
  23:          }
  24:   
  25:          public IConfigurationRoot Configuration { get; set; }
  26:   
  27:          /// The rest of Startup.cs.
  28:          ///...
  29:          ///...
  30:          ///...
  31:   
  32:      }
  33:  }

In Startup.cs we have a ConfigurationBuilder. At its simplest, the "Configuration" is a series of "Providers". After we new up a ConfigurationBuilder() we simply add providers. i.e. We add the JSON file provider via builder.AddJsonFile("appsettings.json"), in the same way we add the environment variables provider via builder.AddEnvironmentVariables(). To illustrate my point look below at the following simple example from Microsoft's documentation. Here we've done something totally different, we've added a MemoryConfigurationProvider(). If you miss XML there's a built-in XML provider, and you can even write your own providers if you need special cases.

   1:  var builder = new ConfigurationBuilder();
   2:  builder.Add(new MemoryConfigurationProvider());
   3:  var config = builder.Build();
   4:  config.Set("somekey", "somevalue");
   5:   
   6:  // do some other work
   7:   
   8:  string setting2 = config["somekey"]; // returns "somevalue"

Overriding Configuration Values

Now you're thinking to yourself, he said earlier I didn't have to worry about those pesky transformations that came from using web.config. Well, let me show you how to handle overriding configuration based on you're current environment. The providers are added in order, and each new provider will override the values set by the previous provider. By adding them in order we can have base values, overridden by say development or release values, overridden by user secrets (which I'll cover next week in an upcoming post), and finally overridden by environment variables. The order is configurable but this is a basic best practice.

Look back at the default Startup.cs, notice the lines,

   1:  var builder = new ConfigurationBuilder()
   2:      .AddJsonFile("appsettings.json")
   3:      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

Now supposing we're in our development environment, we would first read appsettings.json, then we would read appsettings.development.json overriding all matching values.  Let's add a development file to our project. The values in this file will override any values that previously existed in appsettings.json. To add the new file right click on your project, and choose Add->New Item. Next choose ASP.NET Configuration File from the menu and name it appsettings.development.json.

Do this again to create an appsettings.release.json, and you should see this at the bottom of your Solution Explorer.

The code below helps illustrate values being first defined in a base file, then if those values exist in a file added further down the chain, how the values are replaced. Values that do not exist in subsequently loaded providers are maintained in their original state.

   1:  // appsettins.json
   2:  {
   3:    "myKey": "baseValue",
   4:    "anotherKey": "unchangedValue"
   5:  }
   6:   
   7:  // appsettins.development.json
   8:  {
   9:    "myKey": "developmentValue"
  10:  }
  11:   
  12:  // appsettins.release.json
  13:  {
  14:    "myKey": "releaseValue"
  15:  } 
  16:   
  17:  // Set up configuration sources.
  18:  var builder = new ConfigurationBuilder()
  19:     .AddJsonFile("appsettings.json")
  20:     .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
  21:   
  22:  Configuration = builder.Build();
  23:   
  24:  // In development.
  25:  Configuration.Get("myKey");         //&lt;-- developmentValue (overidden)
  26:  Configuration.Get("anotherKey");    //&lt;-- unchangedValue
  27:   
  28:  // In release.
  29:  Configuration.Get("myKey");         //&lt;-- releaseValue (overidden)
  30:  Configuration.Get("anotherKey");    //&lt;-- unchangedValue

It's as easy as that. You can also override values based on other environments, such as staging. Your file doesn't have to be called appsettings.json, you could just as easily have foo.json and override with bar.json, etc. Much more flexible than the old way, wouldn't you say?

Using the configuration in your application.

Okay, so now we have our application values configured, how do we get them so we can use them in say a controller? First, It's worth saying something about strongly typed values. Before, in the web.config days, all we stored were strings, and then when we consumed them in our application, we parsed them into whatever we needed. Now, in the new system we store values in the JSON as whatever type we need. Integers as numbers, booleans as booleans, etc. No more coercing our values to use them. We do this by creating POCO classes and "loading" them with our config values on startup. Next we're going to create some configuration options for an SMTP client and use them in our application.

Let's add an SMTP configuration to our application via appsettings.json. We could override them in other files depending on environment. Perhaps we use a differnt server in production with different credentials, but we've already know how to do that so I'll keep it simple.

   1:  {
   2:    "Data": {
   3:      "DefaultConnection": {
   4:        "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=blah-blah-blah..."
   5:      }
   6:    },
   7:    "Logging": {
   8:      "IncludeScopes": false,
   9:      "LogLevel": {
  10:        "Default": "Verbose",
  11:        "System": "Information",
  12:        "Microsoft": "Information"
  13:      }
  14:    },
  15:    // Defined later and overridden in appsettings.development.json or appsettings.release.json.
  16:    "SmtpOptions": {
  17:      "UserName": "Troy",
  18:      "Password": "Locke",
  19:      "FromName": "Troy Locke",
  20:      "FromAddress": "Troy@slnzero.com",
  21:      "DeliveryMethod": "Network",
  22:      "Host": "smtp.slnzero.com",
  23:      "Port":25,
  24:      "DefaultCredentials": false,
  25:      "EnableSsl": false
  26:    }
  27:  }

Notice that we have strings, an integer to specify the Port, and boolean values for DefaultCredentials and EnableSsl. Nice!

Next we have to create a class for our application to hold the values so we can use them. We'll create a matching POCO called SmtpOptions like so.

   1:  // Our SmtpOptions POCO class will hold our settings at runtime.
   2:  namespace HelloConfigWorld
   3:  {
   4:      public class SmtpOptions
   5:      {
   6:          public string UserName { get; set; }
   7:   
   8:          public string Password { get; set; }
   9:   
  10:          public string FromName { get; set; }
  11:   
  12:          public string FromAddress { get; set; }
  13:   
  14:          public string DeliveryMethod { get; set; }
  15:   
  16:          public string Host { get; set; }
  17:   
  18:          public int Port { get; set; }
  19:   
  20:          public bool DefaultCredentials { get; set; }
  21:   
  22:          public bool EnableSsl { get; set; }
  23:      }
  24:  }

Again, notice we have strongtly typed values for our configuration options, these map straight out of the JSON configuration file appsettings.json into our SmtpOptions class by adding a line in Startup.cs, lets look at how to do that now.

Look back at your Startup.cs again, you'll notice, just below the area we focused on earlier, a method called ConfigureServices() Add the line at the bottom as shown below.

   1:  // This method gets called by the runtime. Use this method to add services to the container.
   2:  public void ConfigureServices(IServiceCollection services)
   3:  {
   4:      // Add framework services.
   5:      services.AddEntityFramework()
   6:          .AddSqlServer()
   7:          .AddDbContext&lt;ApplicationDbContext&gt;(options =&gt;
   8:              options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
   9:   
  10:      ///...
  11:      ///...
  12:      ///...
  13:      
  14:      // Here we add our new SmtpOption values and map them to our POCO we created.
  15:      services.Configure&lt;SmtpOptions&gt;(Configuration.GetSection("SmtpOptions"));
  16:  }

Next we need to be able to reference these values in our Application. .Net Core is big on DI (Dependency Injection) and we're going to use it to "inject" our SmtpOptions class into our app where we need it via the IOptions interface. In the constructor, we simply pass in an IOptions<SmtpOptions>, and assign it to a class variable or property. We then have it available with all it's values for use in the class. Below is a snippet from the default MessageService.cs that implements our options class.

   1:  public class AuthMessageSender : IEmailSender, ISmsSender
   2:  {
   3:      private readonly IOptions&lt;SmtpOptions&gt; _smtpOptions;
   4:      public AuthMessageSender(IOptions&lt;SmtpOptions&gt; smtpOptions)
   5:      {
   6:          _smtpOptions = smtpOptions;
   7:      }
   8:   
   9:      public Task SendEmailAsync(string email, string subject, string message)
  10:      {
  11:          // Use SMTP here to send an email.
  12:          var host = _smtpOptions.Value.Host;
  13:          var port = _smtpOptions.Value.Port;
  14:          var userName = _smtpOptions.Value.UserName;
  15:          var password = _smtpOptions.Value.Password;
  16:          var fromName = _smtpOptions.Value.FromName;
  17:          var fromAddress = _smtpOptions.Value.FromAddress;
  18:          var deliverMethod = _smtpOptions.Value.DeliveryMethod;
  19:          var defaultCredentials = _smtpOptions.Value.DefaultCredentials;
  20:          var enableSsl = _smtpOptions.Value.EnableSsl;
  21:   
  22:          var msg = new MimeMessage();
  23:          msg.From.Add(new MailboxAddress(fromName, fromAddress));
  24:          msg.To.Add(new MailboxAddress(email, email));
  25:          msg.Subject = subject;
  26:   
  27:          ///...
  28:          ///...
  29:          ///...
  30:   
  31:       }
  32:  }

Acknowledgment

You may have noticed AddUserSecrets() and AddEnvironmentVariables() in the Startup.cs examples. I have left these out to keep this post from becoming too long. In short these are methods to “safely” store configuration settings out and away from your applications code. Passwords and such are never in code and thus never stored in version control or passed between developers sharing a code base. By pulling our configuration values from environment variables in production we greatly reduce the likelihood of them being compromised. I fully intend to cover this topic in an upcoming article. Also, I've stated that there is no web.config, this is only partially true, there does exist a web.config file under the /wwwroot directory of the project that is used to configure certain server values.

Summary

As you can see, the new .Net Core is vastly improved over the old web.config. It’s much more versatile in that we can take complete control over our application’s configuration. It’s simpler to read, configure, and setup than the old system. And the use of strongly typed values make for a better practice overall. I hope this article helps you better understand and implement configuration in the new ASP.NET 5 .Net Core framework.

Read Full Entry

The Future of Apps: Disconnected Mobile Web Applications

The Future of Apps: Disconnected Mobile Web Applications

 

How many apps do you have on your phone right now? If you go to your app menu, do you scroll and scroll and scroll, unable to find the one you’re looking for in the clutter? Have you noticed that your phone has slowed down gradually as you add, remove, and replace apps on your phone? Welcome to the future of mobile apps where you and your phone will be free to operate at maximum efficiency. Disconnected mobile web apps can help you clear up all that mess while enjoying a faster and more secure mobile experience.

 

What is a disconnected mobile web application?

A disconnected mobile web application is much simpler than it sounds. It’s really just an app that isn’t stored on your phone. Rather than downloading an app to your mobile device and letting it eat up your memory, storage space, and battery life, you access it on the web.

 

So instead of sorting through your apps list or waiting for an app to load because you have 12 running in the background (which you can’t see or shut down), a disconnected mobile web app can be opened from an icon on your device that launches the app in a web browser.

 

If you have multiple disconnected web apps, they’ll all run smoothly and efficiently with just your web browser. No more phone brain freeze.

 

Why do I need a disconnected mobile app?

First, no more worrying about how much storage space you have left on your device or if it’s capable of doing umpteen things at once. Disconnected mobile apps streamline the way your device focuses its attention and energy so you can tap, tap, tap your way through all your tasks in a flash.

 

Second, they’re more secure. In the recent digital crisis caused by viruses like WannaCry, device security is a top priority for businesses and individuals alike. If you’re like most Americans, you use your mobile device for everything from calling your loved ones to paying bills to juggling your work calendar.

 

Using downloaded mobile apps means you have vast amounts of personal information stored on your phone that could be dangerous in the wrong hands. However, when you use disconnected mobile apps, nothing is stored on your phone. That means you can lose your phone and not shed a single drop of sweat over who might be accessing what on your phone.

 

Also, as an added bonus, since disconnected mobile apps are run on the web, they’re always updated. Gone are the days of sitting by your phone waiting for it to update 72 apps before you can use it again.

 

Why aren’t more people using disconnected web apps?

Think about where you get your apps currently. If you’re an Android user, it’s the Google Play Store. IOS users turn to the Apple App Store. This benefits the top dogs because they get data on what you download and, when you buy apps (even those $0.99 ones), they get to keep a chunk of the change. So of course Apple and Google don’t want their mobile users switching over to disconnected web apps.

 

But the truth is that disconnected web apps are safer, more reliable, are always up to date, and let you enjoy your mobile device the way it was fresh out of the box. Better yet, if you are tired of hunting through the app stores looking for one that will do what you need, you can have a custom disconnected mobile app made exactly to your specs.

 

If you’re looking for the app of your dreams, we can create a custom solution tailored to your exact needs. Tell us about your problem and we’ll offer a custom solution today.

Read Full Entry

Web Development and Web Designing – Know the Difference

If you’ve ever played around in WordPress or SquareSpace, you know it takes more than being competent with a mouse to click your way to a great website. User friendly platforms like these are great for people who just need to get their name out on the web quick. But if you’re going to be relying on your website for any kind of serious conversion, you’ll want more than just a quick fix.

What Makes a Website Great?

An effective website comes down to four crucial elements:

  • Appealing visual design
  • Clear navigation
  • Strong content
  • Mobile-friendly

These days it’s not enough to have a fabulous website for desktop users. Now it has to work well and look great on mobile devices, too. According to Hubspot, “one-third of people use their smartphone as their primary device to access the internet.” What’s more, “34% of online retail purchases now happen on mobile devices.”

To check both “clear navigation” and “mobile-friendly” off your list, your development need to be on point. Your web design is the other critical piece to the successful web presence puzzle.

What Is Web Development?

When you visit a website, there are two parts: the front end and the back end. As a website visitor, you’re looking at and interacting with the front end. However, as you scroll, click, and fill out forms, the back end is dictating how the website works.

In other words, think of “development” as synonymous with “functionality.” Web developers are the contractors of the internet. They’re in charge of making sure the lights turn on when you flip a switch and the water’s always running. You’ll need to have strong development to make sure that your videos play, your links all head to the right place, and your contact form is collecting and sending info correctly.

What Is Web Design?

If web developers are the contractors, web designers are the interior designers. Web designers make sure that each visitor’s first impression is a positive and profound one. Your web design is what sets you apart, establishes your brand, and ensures that visitors are relaxed, reassured, and inspired to spend their valuable time on your site now and in the future.

The design of your website can make or break your online presence. Even if you create incredible content and have a fun, interactive website, people will bounce away instantly if the page is hard to look at.

While it’s tempting to want to pick your favorite colors and make your site all about your own personality, your design really should be all about your end user. Whether you have an ecommerce site, offer software-as-a-service, or just want people to call and schedule an appointment, the person you’re trying to reach has to love the look and feel of your site.

Which Is More Important?

Both are equally important. If you want to have a website that encourages visitors to stick around, learn more about you and your business, and make grand gestures – like buying your products or signing up for a free trial – you need to have functional web development and seamless web design.

Many business owners are surprised to learn that today’s web design goes beyond pretty colors and graphics. In fact, researchers have discovered that there are distinct patterns website visitors follow when they read text on a page or interact with features. A good web designer will understand these patterns and set your site up for success from the start.

At the same time, web developers use the latest marketing techniques and features to make your site appeal to the largest audience. In addition to making your site function as it should, web developers test your site on the latest mobile devices (think: iPhones, Androids, tablets, e-readers) and different web browsers (Safari, Firefox, Chrome, and even good ol’ Internet Explorer).

Having a strong website is nothing to scoff at. Make sure you’re making the best first impression possible by having high-quality web design and development. If you’re looking for a website that you can’t help but visit again and again, we can create a custom solution tailored to your exact needs. Tell us about your problem and we’ll offer a custom website today.

Read Full Entry

Interview with the Caprock Custom Application’s Chief Operating Officer, Nat Joyner, on what it means to be a small business owner.

With the New Year coming up small business owners around the United States are setting goals to really launch their business in 2018. This could mean hiring new employees, expanding into another physical location and, of course, generating revenue.

We sat down with our COO and asked him “What does it mean to be a small business owner in today’s age?”.

With being a small business owner, people understand there are sacrifices to be made…. What have you sacrificed to grow your software company?

“Time… by far”, he said. “Gaining the knowledge to run a business takes time and we quickly realized if we wanted to expand our business we had to learn a lot. Getting our business up and running was made easier by talking to other business owners and meeting with our local Small Business Development Center to get a business plan. Gaining experience is key to growth and it took a lot of time to get our experience.”

He continued, “Spending, on average, 50-60 hours per week working has become the norm. Family and friends have to understand that we have to shift our time and focus on the business and that can be difficult.”

“Giving up my hobby of disk golf on the weekends has had a big impact on my overall relationship with my friends”, he admitted. “Thankfully, they understand my goals of growing Caprock Custom Applications”.

We are about halfway through 2018. Where do you see Caprock Custom Applications in 2019?

“I see us focusing on consistent work within the private sector and the public sector. Aiming for stability has been our goal and we know that if we want to grow then we’ll have to create predictability. Diversifying our portfolio and expanding into new horizons is something that we’ll have to do in order to gain the trust of professionals that need the services we offer. That will be the key.”

Now that we know where you see Caprock Custom Applications in 2019… how will you use the remainder of 2018 in the means of getting there?

“Great question, Our business plan going into 2018 is chasing private bids, capitalizing on networking, and getting better on competing for government bids,“ Nat explained. “We are constantly evolving in the way we handle our business processes and finding more efficient ways of getting our work done”.

What are the biggest lessons you have learned in the previous years?

“Really the biggest thing we have learned in 2017 is understanding better ways of pricing our work. Taking pride in our work and not undervaluing our time has been an important realization for everyone” he said.

“The accuracy of our estimated timelines and costs is getting better and better over time… sometimes biting the bullet on sunk cost has only made us more conscious of the time and energy spent going in on a particular project”.

“Other than that, I’d say stressing the importance of professional relationships and understanding the value of networking has also been a huge lesson learned.”

What are some of the things you wish Caprock Custom Applications did in 2017?

“Something we have all learned is the importance of nailing down operational structure and sticking to it. We wish we would have emphasized the importance of using our Project Management Software, JIRA to achieve an effective operational structure… Really just using it to see who is responsible for what. It can all be a mess at times” he said.

“We’ve also noticed a growing interest in the products that we have made internally, such as Lightning Import (a software used by the SEMA data co-op to pull information on vehicle parts such as mufflers, steering wheels, etc.). Investing time into Lightning Import would have been well worth it if users wanted to utilize the software.”

“Last but not least, hiring high quality developers. It’s tough to find qualified developers here in Lubbock, TX. We wish we would have spent more time on seeking great software developers”.

What does it mean to you to reinvest back into Caprock Custom Applications, instead of taking the profits for yourself?

Nat answer, “Well it would be naïve of a business owner if they believed they could start a business to get fast money.” He went on, “I think somewhere five years down the road I could see myself receiving more compensation, but for right now I know it’s essential to reinvest in Caprock.”

“Mike, Ethan, and I haven’t had to finance anything through loans from the bank and we’re very proud of running a debt free business. Self-funding a start-up is tough. There’s no doubt about it. The guys, and myself included, have missed paychecks due to hard times. It’s been important to balance growing the business and being able to pay the bills. It’s just unrealistic to expect a quick payday from a young business”.

Read Full Entry

Custom Software vs. Off-the-Shelf Solutions

It can be tempting to stalk the aisles of your local electronics store looking for a quick fix, but are you really getting the most out of your dollar with an out-of-the-box solution? If you’re looking for a software program or app to solve a problem for your business, consider your options before investing a dime.

The Software Dilemma

Whether it’s an accounting issue, a record-keeping problem, or you’re just looking to technology to make your job easier overall, there comes a time when every business owner needs the help of a software solution. If you’re in this predicament, you have two options: buy an off-the-shelf software package or talk with a developer about creating a custom software solution.

An off-the-shelf solution is likely going to be cheaper and take less time to implement at your business than a custom software solution. However, a software program or mobile app that’s designed to suit your exact needs will solve your business’s unique problem perfectly. So which do you choose?

Finding the Right Fit

Choosing the right software solution is like completing a jigsaw puzzle. If you choose an off-the-shelf product, it’s inevitably going to come with some features you don’t need. Also, you might be lucky enough to find a product that has four out of the five features you do want, but rarely does a single product solve every technological need you want to fill. As you’re sorting through the available software pieces to complete your picture, you’ll find some products that are too big, some that are too small, and others that you have to bend, manipulate, and flat out bite chunks out of to make fit.

When you opt for a custom software solution, you’ll have a team of software experts measuring every nook and cranny of your problem to make sure the solution they deliver fits just right. Custom software solutions allow you to pick and choose which features you want and exclude what you don’t need. You can also customize the user interface to match your company’s branding. When the final product is delivered, you’ll have the opportunity to give your software engineers feedback so they can make the final tweaks necessary for your software solution to blend seamlessly with your operations.

You Get What You Pay For

Most business owners try multiple off-the-shelf software programs before finding one that’s at least in the ballpark of what they need. That’s wasted money and wasted time. Do it right the first time and spring for the custom software solution. While a custom software solution may have a bigger sticker price than your average pre-made software-in-a-box, a custom solution is the only way to ensure you’re maximizing your efficiency on the job. When you factor in the value of your time and productivity, a custom software solution will save you thousands of dollars.

If you’re looking for a particular software or mobile app to help your business reach its goals, we’ll create a custom application tailored to your exact needs. Tell us about your problem and we’ll offer a custom solution today.

Read Full Entry

The JavaScript Module Pattern used with jQuery

I have always been primarily a backend developer, I love OOP, and try my best to follow all the best principles such as Encapsulation, Polymorphism, Separation of Concerns, and even the Law of Demeter when I design and write software. As such, I have fought tooth and nail to avoid writing in-browser apps. I have nothing against them, I believe that’s where the View needs to be... philosophically. I just want someone else to do it, to deal with the JavaScript and CSS because it’s so hard to disciple ourselves to writing good, clean code. OOP code in the browser with JavaScript ES5 isn't difficult to write correctly, it’s just easy not to. (in future articles I’ll discuss how I’ve overcome this with Angular 2, Typescript, and even ES6 features)

Here we introduce the Module Pattern, this gives us a way in JavaScript to introduce private variables and functions, exposing only those parts we need to the outside world. There are several flavors of this available, you can implement it as a JavaScript object, you can use prototypes, or you can write it as an IIFE a JavaScript Immediately Invoked Function Expression. To do this we implement a JavaScript Closure. More about closures here.
Here’s the pattern.

   1:  /// JavaScript source code representing example jQuery aware module pattern
   2:  /// Solution Zero, Inc. Lubbock Texas 
   3:  /// Troy Locke -- troy@slnzero.com
   4:  var myMessageApp = (function() {
   5:      "use strict"
   6:   
   7:      // I avoid these with the bindControls functionality but I show if for example.
   8:      var someElement = $("#foo"); // some element I know I'll use lots
   9:   
  10:      // private variables
  11:      var pvtMessageVal;
  12:      var pvtAdditionalMessageVal;
  13:      
  14:      // we create an object to hold all the jQuery controls, so we can call
  15:      // binding after loading an HTML page dynamically via AJAX
  16:      // see bindControls further down
  17:      var messageCtrls = {};
  18:   
  19:      var config = {
  20:          // *example, this must be passed into init(config)
  21:          fooSelector: null, // $("#foo")
  22:          messageSelector: null, // $(".message")
  23:          additionalMessageSelector: null, // $(".additional_message")
  24:          options: {
  25:              showOK: true,
  26:              showCancel: true,
  27:              warningLevel: 1,
  28:          }
  29:      }
  30:   
  31:      // AJAX calls
  32:      var getMessage = function(message) {
  33:          $.ajax({
  34:              url: '/getMessagePage',
  35:              type: 'POST',
  36:              dataType: "json",
  37:              data: {'message' : message},
  38:              success: function(data) {
  39:                  // ...
  40:                  messageCtrls.mainMessageDiv.html(data.message);
  41:                  // call bind controls to bind to the newly introducted dom elements
  42:                  messageCtrls = bindMessageControls();
  43:                  },
  44:              error: function() {
  45:                  // ...
  46:                  }
  47:          });
  48:      };
  49:   
  50:      var inputClick = function(event) {
  51:          event.preventDefault();
  52:          // depending on if you'll reuse these selectors throughout the app I might have these as variables
  53:          $('.loading').html('<img class="remove_loading" src="/graphics/loading.gif" />');
  54:   
  55:          // try to avoid these
  56:          var msg = $(".additionalMessage").val();
  57:          // and use this 
  58:          var msg = config.additonalMessageSelector.val();
  59:          // or
  60:          var msg = pvtAdditionalMessageVal;
  61:   
  62:          if (msg == ""){
  63:              $("#message_empty").jmNotify();
  64:              $('.remove_loading').remove();
  65:          } else {
  66:              getMessage(msg);
  67:          }
  68:      };
  69:   
  70:      var bindMessageControls = function () {
  71:          var self = {};
  72:   
  73:          // Modal
  74:          self.thisModal = $(".MessageModal");
  75:   
  76:          // CheckBoxs
  77:          self.fooCb = $(".foo_checkbox");
  78:          
  79:          // Buttons
  80:          self.okBtn = $(".btnOk");
  81:          self.cancelBtn = $(".btnCancel");
  82:   
  83:          // Divs
  84:          self.mainMessageDiv = $(".main_message");
  85:          self.additionalMessageDiv = $(".addtional_message");
  86:   
  87:          //Help Icons
  88:          self.HelpIcon = $(".help-icon");
  89:   
  90:          return self;
  91:      };
  92:   
  93:      var bindVals = function () {
  94:          //check to make sure we have a valid config passed in before we set the values
  95:          if (!config.messageSelector) throw "Invalid configuration object passed in init()";
  96:          
  97:          //bind the values to "private variables"
  98:          pvtMessageVal = config.messageSelector.val();
  99:          
 100:          //this control is optional, test existence
 101:          if(config.additionalMessageSelector.length)
 102:              pvtAdditionalMessageVal = config.additionalMessageSelector.val();
 103:      };
 104:   
 105:      var bindFunctions = function() {
 106:          // you can use jQuery
 107:          $("btnOk").on("click", inputClick)
 108:          // but we have the controls object to use, so instead
 109:          messageCtrls.okBtn.on('click, inputClick')
 110:      };
 111:   
 112:      var init = function () {
 113:          messageCtrls = bindMessageControls();
 114:          bindFunctions();
 115:      };
 116:   
 117:      var showMessage = function (cfg) {
 118:          config = cfg;
 119:          bindVals();
 120:          messageCtrls.thisModal.modal({
 121:              show: true,
 122:              keyboard: false,
 123:              backdrop: "static"
 124:          });
 125:      };
 126:      
 127:      return {
 128:          init: init,
 129:          show: showMessage,
 130:          getMessage: getMessage
 131:          //anything else you want available
 132:          //through myMessageApp.function()
 133:          //or expose variables here too
 134:      };
 135:   
 136:  })();
 137:   
 138:  //usage
 139:  $("document").ready(function () {
 140:      myMessageApp.init();
 141:  });

Enjoy the example, and remember, it’s just an example as each case may call for something a little different. For example, I’ve separated Init() and showMessage() functionality which in many cases can be combined.

This is the first in a series that will explore the Module Pattern in JavaScript. In the next part I will break down the code in this example and explain in detail the whats and whys. Then I hope to show examples of other implementation of the this pattern using objects, prototypes, and other variations such as the Revealing Module Pattern.

I welcome any question and comments.

Read Full Entry

If You Dream It, We Can Build It, and Your Customers Will Love It!

You’ve heard the phrase “There’s an app for that” only to discover that every application you find is close, but just isn’t quite what you’re looking for. You may catch yourself saying, “I wish we could get an app with this feature and that feature.” Have you considered developing your own application specifically designed to give you exactly the features you need, and built to grow with your business? It’s easier than you think!

Customizable Technology

There is customizable technology to build apps that can do almost anything you can imagine. Some of our clients have built applications for recording and analyzing data, increasing efficiency and performance, and others put the app directly in the hands of their customers. Did you know if your app solves a challenge in your industry, you can license the technology? Then the app not only pays for itself, but improves the bottom line. A customized application will set you apart from the competition and give your business the edge it needs. Utilizing technology, molded to fit the demands of your business, is critical in today’s world.

CONSUMER-DRIVEN

Mobile and web applications are often driven by your consumers. They need an easier way to access their orders, shop, participate, and join your workflow seamlessly. A custom application can provide a personalized experience that builds loyalty. Focusing on your customer’s needs will help you stand out in the digital world. Developers for Target, recently deployed turn by turn navigation in their stores to help customers find the items. Sam’s Wholesale Club introduced scan and shop features that let customers scan items in the store from their phone, then check out on their device and skip the lines! What are some features your customers would love? If you aren’t sure, go directly to your customer complaints. If you see an overarching theme, that may be your answer.

INNOVATION

Your employees and customers are looking forward. You should, too. Ask your employees which processes need attention and bring in an expert to help navigate the discussion. Innovation will keep your business moving and growing well into the future. Technology investments like these are built to last. As the needs of your business expand and change, applications expand and change with it to keep you at the forefront of technology and your competition. Off-the- shelf applications aren’t always a good fit. You know your business better than anyone, so build something that works for you.

What features are in your dream application?

Read Full Entry

Interview with the Caprock Custom Application’s Chief Financial Officer, Ethan Eckstein, on what it means to be a small business owner.

With the New Year coming up small business owners around the United States are setting goals to really launch their business in 2018. This could mean hiring new employees, expanding into another physical location and, of course, generating revenue.

We sat down with our CFO and asked him “What does it mean to be a small business owner in today’s age?”.

What’s been the most rewarding thing about being a small business owner?

“For me… Personally, getting to give people jobs and reward hard working people have been the most rewarding things.” he said.

“It’s pretty cool to give individuals validation on their overall efforts. It’s awesome allowing people to enjoy what they do. Finding people who are inexperienced and working with them on a daily basis to grow their knowledge… it’s really rewarding,” Ethan admitted.

What does Caprock Custom Application’s motto “turn your ideas into reality” mean to you?

“It means that we help people not just think about something but create something tangible that will help their business,” he said without hesitation.

“We get to mold their idea into something useful.”

So, help businesses grow?

“Not just businesses.”

“It can be creating a process or awareness of a particular aspect of life. Just like Last Line of Cancer Defense,”

A project Ethan has recently undertaken. A local Lubbock firefighter, Joseph Wallace, came to Caprock Custom Applications in the hopes of creating a website that will sell anti-carcinogen products and provide education to assist Firefighters in combating their exposure to cancerous carcinogens.

“It’s meaningful to help our community grow in anyway that we can,” he said.

Where do you see Caprock Custom Applications in five years?

“I’d like the company to be well-known in the state of Texas. We’d like to have hired dozens more of employees, as well. Providing products for customers as well as services.”

He continued, “We’d also like to get to the point of having our employees volunteering and assisting the local communities. We’ve always liked giving back and helping people learn how to code. I think coding boot camps can really help the youth and really anyone who wants to learn.”

Now that we have an understanding of where you see the company in the future… what got you interested in the software industry in the first place?

“Well. I had no intentions to go into the software industry at first,” he confessed. “I had no idea to be honest. Basically, I took some programming classes back in college and I didn’t enjoy it at first.”

“My degree was Computer Information Systems, and I was required to take an internship for my degree. Thankfully, I met Mike (CEO of Caprock Custom Applications) before he graduated and he started his own company, Lonestar Programming, up shortly after. He asked me to intern for him for a few months and I did… This was back in 2007.”

“He showed me how to engineer useful things, instead of what I was programming in college… This changed my perspective on programming entirely.” Ethan said.

“Having meaning behind my coding made a world of a difference. I wanted to solve problems for people through programming. It gave me satisfaction to help people in something they needed.”

What’s the biggest thing, in your opinion, that will change the technology world? And why?

“Artificial Intelligence.” He said immediately.“No doubt. It’s gotten to the point where it will affect everything. It’ll take time….”

He paused.

“It’s kind of a weird concept if you think about it.”

“It will touch every aspect of life in the next 20 years. It’s not even developed fully, but it’s already making an impact.”

“It’s really science fiction-like. It’s happening pretty quickly. It’s the biggest thing that will change the technology world because it potentially will make things easier for us. In my opinion it needs to be developed carefully because of its capability.”

“I can’t state where it will go but someday there will be a breakthrough like nothing we have seen before.”

Read Full Entry