<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Mobnia]]></title><description><![CDATA[People | Process | Projects | Products]]></description><link>http://blog.mobnia.com/</link><image><url>http://blog.mobnia.com/favicon.png</url><title>Mobnia</title><link>http://blog.mobnia.com/</link></image><generator>Ghost 3.0</generator><lastBuildDate>Thu, 20 Nov 2025 21:08:58 GMT</lastBuildDate><atom:link href="http://blog.mobnia.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Maintainable CSS]]></title><description><![CDATA[As a developer, one of the best practices you should always strive for is writing understandable and maintainable code.]]></description><link>http://blog.mobnia.com/maintainable-css/</link><guid isPermaLink="false">616d34429fb9f80624dc592f</guid><category><![CDATA[css]]></category><category><![CDATA[performance]]></category><category><![CDATA[developer]]></category><dc:creator><![CDATA[David Adedeji]]></dc:creator><pubDate>Wed, 20 Oct 2021 07:47:57 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2021/10/jackson-so-_t-l5FFH8VA-unsplash--1-.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://blog.mobnia.com/content/images/2021/10/jackson-so-_t-l5FFH8VA-unsplash--1-.jpg" alt="Maintainable CSS"><p>At the heart of writing good CSS code is maintainability. As a developer, one of the best practices you should always strive for is writing understandable and maintainable code. To achieve maintainability, a developer must put into consideration the next reader/developer that will make use of the codebase.</p><p>A CSS codebase is said to be maintainable when you can make changes to it without causing unintended side-effects elsewhere.</p><p>In this post, I will share everything you need to know about writing maintainable css, Here's what I will cover:</p><ol><li><em>Introduction to Modules and what they are</em></li><li><em>Semantic class naming</em></li><li><em>Code structuring</em></li><li><em>Commenting</em></li></ol><h2 id="introduction-to-modules">Introduction to Modules</h2><p>For a code to be maintainable, it has to be created and structured in the form of modules but what are modules? </p><p>A module is a distinct independent unit that can be combined with other modules to create a more complex structure. It is a reusable chunk of HTML and CSS that performs a specific function. On a webpage, a sidebar, navbar, a footer can be classified as modules. </p><p>Creating your HTML and CSS in this form makes it more "digestible" for a reader or other developers. Although writing your HTML/CSS in chunks is great, naming your classes semantically makes it even better.</p><h3 id="semantic-naming">Semantic naming</h3><p>Semantic class naming is a style in which we use class names that describe what an element is, or it’s intended purpose, rather than how it looks.</p><pre><code class="language-HTML"> &lt;div class="card"&gt;
       &lt;span class="card__img"&gt;&lt;/span&gt;
       &lt;div class="card__content"&gt;
           &lt;ul class="card__list"&gt;
               &lt;li class="card__item"&gt;Sketch&lt;/li&gt;
               &lt;li class="card__item"&gt;Figma&lt;/li&gt;
               &lt;li class="card__item"&gt;Invision&lt;/li&gt;
           &lt;/ul&gt;
       &lt;/div&gt;
  &lt;/div&gt;</code></pre><p>As seen above, the classes are easy to read without needing to be interpreted. It also becomes very glaring where the module begins and ends.</p><p>Naming is the most vital part of writing maintainable CSS. It is important that when naming classes we avoid names that describe how an element might be presented rather than what they mean. For example</p><pre><code>   &lt;div class="color-red"&gt;&lt;/div&gt;</code></pre><p>Semantic CSS helps to convey what an element represents just by looking at it. This would ensure that the next developer that would come across the codebase can easily understand what a section or module is all about, just by mere staring at the name. It's also important to use naming conventions like BEM or SMACSS. </p><p>BEM (Block, Element, Modifier) is a naming convention for classes in HTML and CSS. Its goal is to help developers understand the relationship between the HTML and CSS in a given project.</p><pre><code>   &lt;header class=”header”&gt;
       &lt;img class=”header__logo”&gt;
       &lt;div class="header__img"&gt;&lt;/div&gt;
    &lt;/header&gt;</code></pre><p>These classes are easy to read without needing to be interpreted. It's clear where the module begins and ends. This is what BEM helps with.</p><p><strong>Why use semantic HTML</strong></p><ul><li>It's easier to find on your code editor</li><li>They are easier to debug -you can easily debug a class that is semantically named</li><li>They produce a small HTML.</li></ul><h3 id="structuring"><br>Structuring</h3><p>Another thing to address when it comes to maintainability of code is how you structure it. This is one aspect I have fallen prey to. Sometimes it becomes tempting to bring in a class defined in module A to module B. The ideas of entangling classes from different modules could pop up because you are trying to follow the DRY rule, "Don't repeat yourself". </p><p>For example I decided to bring in a class called “card__item” from a module I have previously created because the class contains the style I needed. This can alter the way the code is understood and it becomes extremely difficult to maintain. <br></p><pre><code>  
   &lt;header class=”header”&gt;
       &lt;img class=”header__logo”&gt;
       &lt;div class="header__img"&gt;&lt;/div&gt;
   	 &lt;div class="card__item"&gt;Sketch&lt;/div&gt;
    &lt;/header&gt;</code></pre><p>If we try to combine them we will entangle two modules with CSS overrides. This entangling by definition is complex which in turn is hard to maintain.</p><h3 id="commenting">Commenting</h3><p>Commenting involves placing human readable descriptions inside of computer programs detailing what the<strong> </strong>Code is doing. Proper use of commenting can make code maintenance much easier.  </p><p>A user should be able to utilise a previously written CSS without ever having to look at the code, simply by reading the comments.</p><p><br></p>]]></content:encoded></item><item><title><![CDATA[Improving at Software Programming]]></title><description><![CDATA[Reading other people's code gives you different views and implementations to solve problems.]]></description><link>http://blog.mobnia.com/improving-at-software-programming/</link><guid isPermaLink="false">60926b929fb9f80624dc56de</guid><category><![CDATA[Jedi]]></category><category><![CDATA[Software Design]]></category><category><![CDATA[Coders at Work]]></category><category><![CDATA[Code]]></category><category><![CDATA[Programming]]></category><category><![CDATA[Software]]></category><category><![CDATA[Best Practice]]></category><dc:creator><![CDATA[Francis Onyishi]]></dc:creator><pubDate>Thu, 06 May 2021 10:23:52 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2021/05/lastjedicover.0.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://blog.mobnia.com/content/images/2021/05/lastjedicover.0.jpg" alt="Improving at Software Programming"><p>Last year I had a conversation with our Lead Dev with the main aim of hearing his story; no reviews or pull request here, just gist. It was very interesting to hear about his university days, how he managed school and coding, and so on. The proper title for this would have been a "letter to a JUNIOR engineer" lol... well I would just tell you some of the things he said and pass across my own two cents. Most times when you meet someone that has more experience in an industry where you work, some of the questions you always ask is how did you manage? how do I become like you? how do I move from here to there?. For me I knew I had to be more technical, before this meeting I had worked a bit in a codebase that he wrote; it was an API written in PHP without any framework 🤯 . I was marveled by the structure in the code; Design patterns, and Strategies plus how he managed to abstract and implement solutions for the problem at hand.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="http://blog.mobnia.com/content/images/2021/05/diffexpert.jpeg" width="900" height="490" alt="Improving at Software Programming"></div></div></div></figure><p>So when I asked him how he was able to organize and implement solutions in this very readable and efficient way. He replied simply: "<strong>read code</strong>". Yeah, it is that simple 😶 </p><p>Watching videos and reading books is not enough. It is true that in videos and mostly in books you see a lot of these patterns and implementations but most times the author does not take care of all the cases or it is just very theoretical that you doubt if this is even usable.</p><p>However, reading other peoples code gives you the different views and implementations to solve problems and he also mentioned that frameworks are certified codebases (if there is anything like that), many of them are open-sourced and are written by experienced engineers so it is even easier for instance to read the <a href="https://laravel.com/">laravel</a> codebase and see how things were done, there is no better model than these.</p><p>In a book I read recently, "<a href="https://www.amazon.com/Software-Developer-Life-Learning-Stories/dp/1732345902">Software Developer Life: Career, Learning, Coding, Daily Life, Stories</a>" by David Xiang he talks about having "code sense". He explained that this sixth sense comes with time, and it’s something we as software developers are constantly developing. It is the first impression you get when you look at a file. It’s the ability to spot bottlenecks and pinpoint vulnerabilities early. It’s being able to thoroughly fix a bug once and for all. It’s avoiding nonsensical dependencies, recognizing subtle side effects, and much, much more. This code sense originates from writing and reading a lot of code. The more code you write, the clearer it becomes and the more code sense you accumulate.</p><blockquote>All code will always reflect the code writer’s commitment. How do you personally develop a baseline for this? You start by practicing this commitment yourself. We must care about the code we write—<strong>it is our craft.</strong><br>There are two benefits here. First, your baseline as a  developer rises—you will write better code, faster. Second, you will  naturally recognize sloppy code and your code sense will strengthen.  Your attention to detail is what sets you apart - David Xiang</blockquote><p>One other important thing we talked about is the controversial decision to stick with one language or to test out a lot of languages; well this depends but I would summarise the most relevant ideas. First, it is encouraged that as an engineer you have a language you are proficient in or in simple terms a language you are very comfortable writing. Furthermore, because no language is perfect, other languages allow you to see things from another perspective and could even be a good way to improve or learn new concepts that would better your technical skills.</p>]]></content:encoded></item><item><title><![CDATA[Componentizing with Webpack and a Template Engine (Part 1)]]></title><description><![CDATA[This article is basically my findings in building an SPA without a framework or library. In-depth understanding of how SPAs are coupled can yield better product experiences and a lot of this can be achieved by going in-depth into how configurations, templates, and module bundling work.]]></description><link>http://blog.mobnia.com/componentizing-with-webpack-and-a-template-engine-1/</link><guid isPermaLink="false">5eebd7a59fb9f80624dc5472</guid><category><![CDATA[webpack]]></category><category><![CDATA[performance]]></category><category><![CDATA[react]]></category><category><![CDATA[vue]]></category><dc:creator><![CDATA[Francis Onyishi]]></dc:creator><pubDate>Fri, 19 Jun 2020 10:07:45 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2020/06/webpack-1.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.mobnia.com/content/images/2020/06/webpack-1.png" alt="Componentizing with Webpack and a Template Engine (Part 1)"><p>This article is basically my findings in building an SPA without a framework or library.</p><!--kg-card-begin: markdown--><p>Building web applications as Single Page Applictions (SPAs) is a big trend today with the SPA mode being defacto for most frameworks. Frontend frameworks like React and Vue.js provide you with <code>create-react-app</code> or <code>create-vue-app</code> respectively to easily give a headstart with less time to setup.</p>
<p>The number of people on this bandwagon is huge and unfortunately a lack of understanding of the underlying <code>magic</code> to these tools contribute to poor user experiences in product performance and accessibility of applications built with this approach.</p>
<p>In-depth understanding of how SPAs are coupled can yield better product experiences and a lot of this can be achieved by going in-depth into how configurations, templates, and module bundling work.</p>
<!--kg-card-end: markdown--><p>In every SPA, there is usually an entry point where every other dependency  is added in their order of need. This controller sometimes acts as a router to different components needed, or in some cases it just starts the train of events of transitioning between the different components. But there is a little of problem what will manage the bundling of these components in their order?</p><figure class="kg-card kg-image-card"><img src="http://blog.mobnia.com/content/images/2020/06/giphy.gif" class="kg-image" alt="Componentizing with Webpack and a Template Engine (Part 1)"></figure><p>Welcome to the Webpack Show. <strong>Webpack</strong> is an <a href="https://webpack.js.org/">open source JavaScript</a> module bundler. Below is an image from the webpack website that explains how it works.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="http://blog.mobnia.com/content/images/2020/06/webpack.png" class="kg-image" alt="Componentizing with Webpack and a Template Engine (Part 1)"></figure><!--kg-card-begin: markdown--><blockquote>
<p>I get ideas of what is essential when packing my suitcase<br>
<span style="red"><code>Diane von Fürstenberg</code></span></p>
</blockquote>
<!--kg-card-end: markdown--><p>From the image above it can be seen that webpack does not just bundle scripts. Since the app is controlled by javascript, webpack takes care of any imported module including images, stylesheets, etc. The remarkable thing about webpack is the quote above, webpack when configured with the proper plugins and loaders optimizes the codebase to the best; removing unused code, code splitting and compression of all other assets including CSS.</p><p>We have managed to solve our problem with webpack, now we can comfortably build a proper static app with all the optimization stated above. But it is obvious that most of the components we will work with will be dynamic components. This poses a new problem; while it might be possible to do this with the appending and prepending of HTML elements and playing with HTML strings, this approach would not make for clean code.</p><p>The most efficient way to handle a component approach in a clean way would be to utilise <strong>TEMPLATING</strong></p><p><strong>TEMPLATING</strong> is a document or file having a preset format, used as a starting point for a particular application so that the format does not have to be recreated each time it is used. There are many client side templating engines but for this project I used the <a href="https://mozilla.github.io/nunjucks/">nunjucks</a> template engine because it more sophisticated than the rest of the competition.</p><p>Nunjucks templating is well documented and can easily be followed. For instance the example code for looping through contents can be found below</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">var items = [{ title: &quot;foo&quot;, id: 1 }, { title: &quot;bar&quot;, id: 2}];
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code class="language-html">&lt;h1&gt;Posts&lt;/h1&gt;
&lt;ul&gt;
{% for item in items %}
  &lt;li&gt;{{ item.title }}&lt;/li&gt;
{% else %}
  &lt;li&gt;This would display if the 'item' collection were empty&lt;/li&gt;
{% endfor %}
&lt;/ul&gt;
</code></pre>
<!--kg-card-end: markdown--><p>Webpack also has a loader for nunjucks files, it takes care of the importing of the template and prepares it for rendering. with this the app can easily be broken into components and easily imported when needed.</p><p>In summary, webpack and the use of templates for componentizing an app can summarized in an anonymous quote I came across recently</p><!--kg-card-begin: markdown--><blockquote>
<p><strong>Cleaning</strong> out the past,  <strong>Packing</strong> the present, and <strong>Preparing</strong> for a much <strong>Better</strong> future</p>
</blockquote>
<!--kg-card-end: markdown--><p>In the second part of this article we'll utilize our in-depth understanding of webpack and nunjucks to build a small, componentized, and much more performant SPA than you'll get with a cookie-cutter approach typically recommend with off-the-shelf frameworks.</p>]]></content:encoded></item><item><title><![CDATA[Base64 Encoding]]></title><description><![CDATA[Base64 encoding schemes are commonly used when there is a need to encode  binary data that needs to be stored and transferred over media that are designed to deal with ASCII. This is to ensure that the data remain  intact without modification during transport.]]></description><link>http://blog.mobnia.com/base64-encoding/</link><guid isPermaLink="false">5ed123e69fb9f80624dc5318</guid><category><![CDATA[encoding]]></category><category><![CDATA[base64]]></category><category><![CDATA[Best Practice]]></category><dc:creator><![CDATA[Francis Onyishi]]></dc:creator><pubDate>Tue, 02 Jun 2020 12:35:06 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2020/06/base64-1-.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.mobnia.com/content/images/2020/06/base64-1-.png" alt="Base64 Encoding"><p>Base64 encoding is a group of binary-to-text encoding schemes that represent<a href="https://en.wikipedia.org/wiki/Binary_data"> </a>binary data in an ASCII string format by translating it into a radix-64 representation.</p><p>Common to all binary-to-text encoding schemes, Base64 is designed to carry data stored in binary formats across channels that only reliably support text content such as the hypertext transfer protocol (http). </p><p>Base64 is particularly prevalent on the<a href="https://en.wikipedia.org/wiki/World_Wide_Web"> </a>web where its use include the ability to transfer  and embed image files or other binary assets inside textual assets such as HTML and CSS files.</p><p>Below is an example of a text converted to base64 encoding</p><!--kg-card-begin: markdown--><p><code>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h4 id="base64encodingoftheabovetext">Base64 encoding of the above text</h4>
<p><span style="color:#f93f61"><code>TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLg==</code></span></p>
<!--kg-card-end: markdown--><p>You can find the design of the Base64 scheme on <a href="https://en.wikipedia.org/wiki/Base64">this page</a>, for now let's get into some its applications.</p><h2 id="applications-of-base64-encoding">Applications of Base64 Encoding</h2><p>Base64 encoding schemes are commonly used when there is a need to encode  binary data that needs to be stored and transferred over media that are designed to deal with ASCII. This is to ensure that the data remain  intact without modification during transport. Base64 is commonly used in  a number of applications including email via <a href="https://en.wikipedia.org/wiki/MIME" rel="noopener">MIME</a>, and storing complex data in <a href="https://developer.mozilla.org/en-US/docs/XML">XML</a>.</p><h3 id="convert-images-and-media-files-to-base64-for-web-transport">Convert images and media files to Base64 for web transport</h3><!--kg-card-begin: markdown--><p>The javascript construct <code>readAsDataURL</code> is able to convert a specified Blob or File into a <code>data: URL</code> representing the file's data as a base64 encoded string.<br>
To see a live example <a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL">visit</a></p>
<h6 id="example">Example:</h6>
<p><span style="color:#f93f61"><code>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUoAAAPaCAIAAADOa/W6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR42uydh18Td+OAf3 .....</code></span></p>
<!--kg-card-end: markdown--><h3 id="source-maps">Source Maps</h3><p>According to <a href="https://sourcemaps.info/spec.html" rel="noopener nofollow">Source map Proposal</a>, <code>mappings</code> in a source map is the information that allows us to connect a generated file, e.g. <code>script-transpiled.js</code>, to the original source, e.g. <code>script.js</code>. Source map mappings have the following properties:</p><!--kg-card-begin: markdown--><ul>
<li>each group representing a line in the generated file is separated by a ”;”</li>
<li>each segment is separated by a “,”</li>
<li>each segment is made up of 1,4, or 5 variable length fields.</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="http://blog.mobnia.com/content/images/2020/06/baseSor.png" class="kg-image" alt="Base64 Encoding"></figure><p>The secret is that if we consider every character of each segment as a Base64 variable length quantity (<a href="https://en.wikipedia.org/wiki/Variable-length_quantity">VLQ</a> ) encoded character, we will end up by having some interesting  mapping information between positions in generated file and original file. Taking the first character from the above source map we have;</p><figure class="kg-card kg-image-card"><img src="http://blog.mobnia.com/content/images/2020/06/ty.png" class="kg-image" alt="Base64 Encoding"></figure><!--kg-card-begin: markdown--><h3 id="caveatsinusingbase64">Caveats in using Base64</h3>
<p>Each Base64 digit represents exactly 6 bits of data. So, three 8-bits bytes of the input string/binary file (3×8 bits = 24 bits) can be represented by four 6-bit Base64 digits (4×6 = 24 bits).</p>
<p><strong>This means that the Base64 version of a string or file will be at most 133% the size of its source (a ~33% increase). The increase may be larger if the encoded data is small. For example, the string <code>&quot;a&quot;</code> with <code>length === 1</code> gets encoded to <code>&quot;YQ==&quot;</code> with <code>length === 4</code> — a 300% increase.</strong></p>
<p>In summary, it is always advised that inline processing of base64 like in html and css where it can be passed as <code>src</code> attribute should be avoided for large files</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[CSS float grids]]></title><description><![CDATA[As a starter to front-end web development taking your time to understand how to use CSS floats to achieve a grid system is super helpful for a strong CSS foundation.]]></description><link>http://blog.mobnia.com/css-float-grids/</link><guid isPermaLink="false">5da4f540b55d2105392db38d</guid><category><![CDATA[css]]></category><dc:creator><![CDATA[Jide Adebiyi]]></dc:creator><pubDate>Wed, 29 Apr 2020 12:07:42 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2017/07/grids2-2.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2017/07/grids2-2.png" alt="CSS float grids"><p>As defined by <a href="https://developer.mozilla.org/en-US/docs/Web/CSS">MDN</a>, Cascading Style Sheets (CSS) are a stylesheet language used to describe the presentation of a document written in HTML or XML (including XML dialects like SVG or XHTML). CSS describes how elements should be rendered on screen, on paper, in speech, or on other media...</p>
<p>One of the problems faced by starters in web development is how to arrange content using css on the web to fit the screen sizes of any device. With css floats you can achieve layout and positioning easily. As a starter to front-end web development taking your time to understand how to use CSS floats to achieve a grid system is super helpful for a strong CSS foundation.</p>
<h3>Basics</h3>
<h4>Normal Flow</h4>
The normal positioning for HTML elments in a webpage is the same way they are written in the HTML code i.e from top to bottom and left to right, the flow wraps depending on the space available on the screen. 
<p>CSS postioning allows us re-organise these HTML elements regardless of their position in the normal flow.</p>
<h4>CSS Positioning</h4>
Positioning simply refers to the layout of the items on your page.The CSS **position** property specifies the type of positioning method used for an element. The most used values of the position property are:
<ul>
     <li>static</li>
     <li>relative</li>
     <li>absolute</li>
</ul>
<p>Read more about CSS positioning <a href="http://blog.mobnia.com/css-positioning/" target="_blank">here</a></p>
<h4>The Box Model</h4>
It is necessary to understand how the CSS Box Model Works before explaining how to use CSS to arrange elements. HTML elements can be considered as boxes. The term **box model** is used when talking about design and layout.
The CSS box model refers to the space dimension of HTML elements which is usually of a box shape. This box shape dimension consists of: the actual content of the HTML element and its margin, border, and padding.
<p>The box model also determines the spacing of elements in relation<br>
to other elements.<br>
<img src="https://a419ef1f4bad85855c60-52a755e0ff70c6a119cad974604352c2.ssl.cf2.rackcdn.com/CSS-Box-Model.png" alt="CSS float grids"></p>
<p>When you specify the width and height properties of an element with CSS, you are just setting the width and height of the content area. To know the full dimension of the element, you must also add the padding, border and margin. That is:</p>
<ul>
<li>Total element width = defined width + left padding + right padding + left border + right border + left margin + right margin.</li><br>
<li>Total element height = defined height + top padding + bottom padding + top border + bottom border + top margin + bottom margin.
</li>
</ul>
<h4>Grids</h4>
In the world of design, a grid is a series of vertical and horizontal lines that can be used to specify vertical (columns) and horizontal (rows) sections of an art-board. Grid also refers to the space (gutters) between individual columns and rows.
<p>These sectioning helps ensure visual consistency between elements.<br>
<img src="https://a419ef1f4bad85855c60-52a755e0ff70c6a119cad974604352c2.ssl.cf2.rackcdn.com/grids.png" alt="CSS float grids"></p>
<ul>
<h5>The Container</h5>
As the name implies, the container houses the grid. Think of it like a warehouse filled with stacks of boxes. In css, the container takes the entire width of the page (i.e. 100%). Maximum width is then set to accommodate Lager displays.
<p>The css <strong>box-sizing property</strong> ensures that columns remain in the container after padding and floating.</p>
<iframe height="250" scrolling="no" title="css grids Container" src="//codepen.io/Jidemartins/embed/ayOZpL/?height=250&theme-id=light&default-tab=css,result&embed-version=2" frameborder="no" allowtransparency="true" allowfullscreen="true" style="width: 100%;">See the Pen <a href="https://codepen.io/Jidemartins/pen/ayOZpL/">css grids Container</a> by Jide  (<a href="https://codepen.io/Jidemartins">@Jidemartins</a>) on <a href="https://codepen.io">CodePen</a>.
</iframe><br>
<h5>The Row</h5>
Rows contain columns. On the webpage, the row keeps the columns within it from overflowing to other rows especially after floating it. This is achieved with the clear-fix hack or by setting overflow to auto. The overflow property makes ensures that the row-container has a height after floating.
<iframe height="265" scrolling="no" title="mMJEjY" src="//codepen.io/Jidemartins/embed/mMJEjY/?height=265&theme-id=light&default-tab=css,result&embed-version=2" frameborder="no" allowtransparency="true" allowfullscreen="true" style="width: 100%;">See the Pen <a href="https://codepen.io/Jidemartins/pen/mMJEjY/">mMJEjY</a> by Jide  (<a href="https://codepen.io/Jidemartins">@Jidemartins</a>) on <a href="https://codepen.io">CodePen</a>.
</iframe><br>
<h5>Column Positioning</h5>
The column is the most important part of the grid. There are several different ways of positioning columns in CSS. While trying to position the columns take into consideration, the various widths and factors like responsiveness. 
There are all different ways of positioning columns in CSS. They include: inline-blocks, display-table, display-flex and most popular and least error prone **floats**. If our columns are empty however, floated columns will stack on top of each other. To prevent this, a minimum height is given.
For the remainder of this write-up, we would be using a 6-column grid system. meaning 3 columns is 50% of the total 100% 6 columns, 1 column is 16.66% and so on.
<iframe height="265" scrolling="no" title="columns" src="//codepen.io/Jidemartins/embed/oeXzgO/?height=265&theme-id=light&default-tab=css,result&embed-version=2" frameborder="no" allowtransparency="true" allowfullscreen="true" style="width: 100%;">See the Pen <a href="https://codepen.io/Jidemartins/pen/oeXzgO/">columns</a> by Jide  (<a href="https://codepen.io/Jidemartins">@Jidemartins</a>) on <a href="https://codepen.io">CodePen</a>.
</iframe><br><!--kg-card-end: markdown--></ul>]]></content:encoded></item><item><title><![CDATA[Good Software Design Solves the Problem]]></title><description><![CDATA[Design many times  is overlooked but products are not built for self consumption]]></description><link>http://blog.mobnia.com/good-software-design-solves-the-problem/</link><guid isPermaLink="false">5e9479979fb9f80624dc4e88</guid><category><![CDATA[Best Practice]]></category><category><![CDATA[Coders at Work]]></category><category><![CDATA[product development]]></category><dc:creator><![CDATA[Francis Onyishi]]></dc:creator><pubDate>Thu, 16 Apr 2020 15:53:25 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2020/04/schedule-planning-startup-launching-7376-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<img src="http://blog.mobnia.com/content/images/2020/04/schedule-planning-startup-launching-7376-1.jpg" alt="Good Software Design Solves the Problem"><p>if you fail to plan you plan to fail — Benjamin Franklin</p>
</blockquote>
<!--kg-card-end: markdown--><p>The Benjamin Franklin saying, <em>if you fail to plan you plan to fail</em>, is true in life experiences and software engineering is no different. </p><p>Software engineering differs from other kinds of engineering and since it mostly deals with intangibles, it can easily change and seem very malleable. For instance, customers can ask for late minute feature additions or last minute changes that may even involve switching hardware platforms. </p><p>Therefore to manage these contingencies and have a great ribbon cutting ceremony, there is a need for software engineers to make a plan and follow it judiciously.</p><p>The first task of software product design is the <em>requirement gathering</em>. One can be tempted to say it is the most important stage of a project but keep in mind that a software project can also fail at other stages. </p><p>Requirements do set the stage for everything that follows, so it is definitely an important step. This is why <a href="https://recon.vet/about-purpose/">John F. kennedy said that <em>efforts and courage are not enough without purpose and direction</em></a>. </p><p>Requirements are the features that your application must provide and one very effective way to gather these requirements is using the five W’s questions ( Who, What, Where, When, Why) and one H (how). </p><p>These requirements helps one to figure out what is needed to be built. Throughout development, the requirements are used to guide development and ensure it is headed in the right direction. At the end of the project, one uses the requirements to verify that the finished application actually does what it’s supposed to do. Some features of a good requirement include : clarity, unambiguity, consistency, priority etc.</p><!--kg-card-begin: markdown--><blockquote>
<p>Design is not just what it looks like and feels like. Design is how it works —Steve Jobs.</p>
</blockquote>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="http://blog.mobnia.com/content/images/2020/04/analysis-blackboard-board-bubble-355952-2.jpg" class="kg-image" alt="Good Software Design Solves the Problem"></figure><p>Design is a way to show the implementation of the project requirement. There are two types of design namely; high level design and low level design</p><p><strong>High Level Design</strong></p><p>High‐level design provides a view of the system at an abstract level. It shows how the major pieces of the finished application will fit together and interact with each other.</p><p>High‐level design sets the stage for later software development. It deals with the grand decisions such as:</p><ul><li>What hardware platform will you use?</li><li>What type of database will you use?</li><li>What other systems will interact with this one?</li></ul><p>The high level design is meant to specify - Security, Hardware, user interfaces, <a href="https://en.wikipedia.org/wiki/Software_architecture">Architecture</a> ( monolithic, client/server, component-based, service-oriented, data-centric), Databases, Structure diagram(class diagram, object diagram, <a href="https://en.wikipedia.org/wiki/Composite_structure_diagram">component diagram</a>, package diagram), etc.</p><p><strong>Low Level Design</strong></p><p>Low‐level design fills in some of the gaps by providing extra detail and definitions for the actual logic for every system component that’s necessary before developers can start writing code. It gives more specific guidance for how the parts of the system will work and how they will work together. It refines the definitions of the database,the major classes, and the internal and external interfaces.It is based on High Level design but digs deeper, going into the separate modules and features for every program in order to document their specifications.</p><p>Simply said, High‐level design focuses on <strong><em>what</em></strong> while Low‐level design begins to focus on <strong><em>how</em></strong>. Low level design focuses mostly on object oriented design and database design (Normalizing the database to get the best design). </p><p>It is important to note that the line between the low level design and high level design can be a bit blurred since low level designs are high level designs but with greater detail.</p><p>As the whole idea of software products is to solve problems, it is necessary to keep in mind that <em> a problem well stated is a problem half solved - Charles Kettering </em></p>]]></content:encoded></item><item><title><![CDATA[New to Webpack]]></title><description><![CDATA[Apart from webpack's main purpose which is to bundle JavaScript files for usage in a browser. It also brings along other features, such as: - code splitting, optimizing modern code, stripping out unused code, dependency graph of your project.]]></description><link>http://blog.mobnia.com/new-to-webpack/</link><guid isPermaLink="false">5da4f540b55d2105392db3b1</guid><dc:creator><![CDATA[Eche Mkpadi]]></dc:creator><pubDate>Wed, 15 Apr 2020 16:35:22 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2019/07/webpack-builds.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2019/07/webpack-builds.png" alt="New to Webpack"><p>So, recently I was given a task at the office, for some reason, it was thought best I do it in Javascript.</p>
<p>I decided to go the normal way, as I would in PHP, modular approach. This is where the problem began. I discovered that the browser could not load the imported modules. A bit of search online pointed me to module bundlers, <a href="http://blog.mobnia.com/new-to-webpack/webpack.js.org" target="_blank">webpack</a> and <a href="http://blog.mobnia.com/new-to-webpack/browserify.org" target="_blank">browserify</a>, amid others. Well, I had a chat with an inhouse senior developer suggested I use Webpack. Hence, my encounter with <a href="http://blog.mobnia.com/new-to-webpack/webpack.js.org" target="_blank">Webpack</a>.</p>
<h4 id="introtowebpack">Intro to webpack.</h4>
<p><a http: blog.mobnia.com new-to-webpack href target="_blank">Webpack is an open-source JavaScript module bundler.</a>. Apart from its main purpose which is to bundle JavaScript files for usage in a browser. It also brings along other features, such as: - code splitting, optimizing modern code, stripping out unused code, <a href="https://webpack.js.org/concepts/dependency-graph/" target="_blank">dependency graph of your project</a>.</p>
<h6 id="projectsetupoptional">Project set up [optional]</h6>
<p>Project layout:</p>
<pre><code>project-root     
 |- /src
    |- index.js
    |- name.js
 |- index.html
 |- package.json
</code></pre>
<p>[Do not add package.json, it will be created automatically by the command: <code>npm init</code>.</p>
<h6 id="setup">Set up</h6>
<p>Ensure you have npm installed first, if not head over to <a href="https://www.npmjs.com/get-npm" target="_blank">npm</a>.<br>
To set up package.json, run the following in your project root and fill in the details:</p>
<pre><code>npm init ##or npm init -y to skip questions
</code></pre>
<p>Install webpack and it's cli:</p>
<pre><code>npm i -D webpack webpack-cli
</code></pre>
<p>An example:</p>
<pre><code>{
 &quot;name&quot;: &quot;imageboard&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;A platform to share images without creating any account&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
  &quot;build&quot;: &quot;webpack --mode development&quot;, ##For those using below NodeJs v8.2/npm v5.2.0
  &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot;
 },
  &quot;author&quot;: &quot;eche&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;devDependencies&quot;: {
  &quot;webpack&quot;: &quot;^4.35.0&quot;,
  &quot;webpack-cli&quot;: &quot;^3.3.5&quot;
  }
}
</code></pre>
<p>As from v4, Webpack can work without any configuration file. Although, without any configuration, it can only bundle JavaScript resources. An illustration without the config file, webpack.config.js, will show us why we need a config file for production.</p>
<p>index.html</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot;&gt;
    &lt;title&gt;webpack&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div&gt;
	    &lt;form id=&quot;myForm&quot;&gt;
                &lt;label for=&quot;username&quot;&gt;Enter your name&lt;/label&gt;
		    &lt;input type=&quot;text&quot; id=&quot;username&quot;&gt;
    		&lt;button id=&quot;submit&quot; type=&quot;button&quot;&gt;submit&lt;/button&gt;	
	    &lt;/form&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>name.js</p>
<pre><code>function displayName(myName) {
    document.write(&quot;Welcome&quot; + myName + &quot;!&quot;);
}

function getName(inputID) {
    return document.getElementById(inputID).value;
}

function treeShaking() {
    document.write(&quot;Dormant function!&quot;);
}

export {displayName, getName}
</code></pre>
<p>index.js</p>
<pre><code>import {displayName, getName} from './name.js';

let submitBtn = document.getElementById(&quot;submit&quot;);

submitBtn.addEventListener(&quot;click&quot;, () =&gt; {
    let myName = getName(&quot;username&quot;);
    displayName(myName);
});
</code></pre>
<p>Run webpack:</p>
<pre><code>npx webpack
</code></pre>
<p>If there is no error, you will notice that Webpack has added a new folder in our project root, dist/. Without any config file, Webpack will automatically store the bundled js file in this folder. It will also take the entry point as <code>src/index.js</code></p>
<p>Move index.html into the newly created distributable folder, dist/ and add a script tag to our HTML file:</p>
<pre><code>&lt;script src=&quot;./main.js&quot;&gt;&lt;/script&gt;
</code></pre>
<p>Open index.html in a browser; fill the form and click submit. If everything works well, you will see:</p>
<pre><code>Your name is &lt;your_name&gt;!
</code></pre>
<h6 id="thankstowebpack">Thanks to Webpack</h6>
<ul>
<li>All JavaScript files were bundled into a main.Js file.</li>
<li>main.Js file is minified, which is an optimization.</li>
<li>The browser understands some ES6 standards like; arrow functions, import and export statements.</li>
<li>function treeShaking appears in name.Js but not in  main.js. This is because Webpack removes unused code (tree-shaking effect).</li>
</ul>
<p>But notice that index.html was not minified. Likewise, if we had other non-JavaScript resources they will not be optimised. This will affect the size and rendering speed of our project. Hence, the need to use Webpack config file for production.</p>
<p>We will delve into webpack configuration in another article.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[A Simple Color Guide for Web projets (Part 2)]]></title><description><![CDATA[Creating your custom color palette is not as complicated as many people think. There are a few tricks you can use to create great color palettes.]]></description><link>http://blog.mobnia.com/a-simple-color-guide-for-web-projets-part-2/</link><guid isPermaLink="false">5da4f540b55d2105392db3ac</guid><category><![CDATA[design]]></category><category><![CDATA[color]]></category><dc:creator><![CDATA[Olamide Jegede]]></dc:creator><pubDate>Wed, 15 Apr 2020 16:27:18 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2020/04/1-c94SpnDXD8imHLUW0fl-ng.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2020/04/1-c94SpnDXD8imHLUW0fl-ng.jpeg" alt="A Simple Color Guide for Web projets (Part 2)"><p><em>In the previous part of this series, we talked about <a href="http://blog.mobnia.com/a-simple-color-guide-for-web-projects-part-1/">choosing a base color</a>.</em></p>
<p>Well, while that was important, I'm sure some of us were starting to wonder where the core stuff of actually creating a color guide comes in. In your defense, Part 1 was a month ago.</p>
<p>That's where Part 2 comes in. Here I will be talking about <strong>creating your own cohesive color palette.</strong> I'll cover choosing a good base color, picking neutrals, choosing an accent to the base color, creating balanced grays and finally applying our color scheme. By the end of this article, we should have learned how to create a simple color guide we can use in our next project.</p>
<h1 id="aquickreview">A Quick Review</h1>
<p>In part 1, we talked about choosing a base color and tips on choosing a base color, where we mentioned what we should consider when choosing a base color. Part of what we discussed is how we should be aware of our target audience and the inherent meaning of our base color to them, choosing complementary colors, and if possible avoid using our competitors'  colors. Remember that the colors you choose can work for or against the project you're trying to create.</p>
<h1 id="choosingagoodbasecolor">Choosing a Good Base Color</h1>
<p>With our tips from part 1 in mind, we want to choose a base color. So let's say we choose purple 😀.</p>
<p>What's next is to find a nice shade or tint or tone of blue 😥. Cheer up, so instead of opening up a color-picker to find this shade or tint or tone of blue, we will use other people's choices to aid us. Do you mean we will grab colors from people's designs? No, we will use inspiration websites like <a href="http://dribbble.com/colors">Dribbble</a> and <a href="http://designspiration.net">Designspiration</a> to help us out.</p>
<p>Go to  <a href="http://dribbble.com/colors">Dribbble</a> and <a href="http://designspiration.net">Designspiration</a> and click on the 'colors' link in both.</p>
<p>You should have these:</p>
<p><img src="http://blog.mobnia.com/content/images/2019/02/color-site.jpg" alt="A Simple Color Guide for Web projets (Part 2)"><br>
Inspiration websites to find the right base color. Dribble (up) and Designspiration (bottom)</p>
<p>Choose a shade from each website to see that color in use.</p>
<p>Apart from seeing different versions of your base color. You will also see colors that match.</p>
<p>Pick one that best suits your project.</p>
<h1 id="creatingamatchingcolorscheme">Creating a Matching Color Scheme</h1>
<h2 id="defaultcolorschemetypes">Default Color Scheme Types</h2>
<p>Below with examples for each are some of the predefined color scheme standards that make creating new schemes easier, especially for newbies.</p>
<h2 id="monochromatic">MONOCHROMATIC</h2>
<p>These color schemes are made up of different shades, tones and tints within a specific hue. They are more often than not the simplest schemes to create. But they can be boring when done poorly.</p>
<h2 id="analogous">ANALOGOUS</h2>
<p>These color schemes are created by using three colors that are next to each other on the color wheel. They all have the same chroma level, but by using tones, shades, and tints we can spice it up.</p>
<h2 id="complementary">COMPLEMENTARY</h2>
<p>These color schemes are created by combining colors from opposite side of the color wheel. Basically, they consist of only two colors, but can be expanded using tones, tints, and shades.</p>
<p><a href="https://www.notion.so/e76ef2bdffc74a8298e4cfe13d6edd8c#ab492802c0314f1e98961e5fbea7214b"></a><br>
<img src="http://blog.mobnia.com/content/images/2019/02/color-scheme.jpg" alt="A Simple Color Guide for Web projets (Part 2)"></p>
<p>Monochromatic, complementary and analogous color schemes. (Image credit: <a href="https://www.smashingmagazine.com/author/cameron-chapman">Cameron Chapman</a> for <a href="https://www.smashingmagazine.com/2010/02/color-theory-for-designer-part-3-creating-your-own-color-palettes/">Smashing magazine</a>)</p>
<p>Other predefined color schemes standard include:</p>
<ul>
<li>Split complementary</li>
<li>Triadic</li>
<li>Double-complementary (Tetradic)</li>
</ul>
<h2 id="creatingyourowncolorpalette">Creating Your Own Color Palette</h2>
<p>Finally !!! Time to create your custom color palette 🎉🎉🎉🎉</p>
<p>Creating your own color palette can be a bit intimidating and I know you might be thinking - <em>Olamide, why do I need to create my custom color palette since there are already predefined ones</em> 😒🙄</p>
<p>First of, creating your custom color palette is not as complicated as many people think. Also, the problem with those kinds of color schemes above is that applying it to a real design isn't very practical, and that's why we are here to know the few tricks you can use to create great color palettes.</p>
<p>So, for the purpose of our project here, we'll create a color palette for the onboarding of a mobile app. Our client is a Fintech mobile app.</p>
<p>All right, you should have a HEX value for your base color. Mine is <code>#B070BF</code>. We will be creating our palette from this color. So, our palette will have the following colors:</p>
<ul>
<li>Base color</li>
<li>Neutrals: White, dark gray, and light gray</li>
<li>Accent color.</li>
</ul>
<h2 id="gettingyouraccentcolor">GETTING YOUR ACCENT COLOR</h2>
<p>Our accent color is the color that we use when we want things to stand out in the design. It should be used in small amounts and it is usually used on Call to actions.</p>
<p>To get your accent color, go to <a href="http://paletton.com">Paletton</a>. Type in your color code into the color box<br>
<img src="http://blog.mobnia.com/content/images/2019/02/paletton_home.jpg" alt="A Simple Color Guide for Web projets (Part 2)"></p>
<p>Enter your base color code in the box</p>
<p>To generate a accent color, you can click around the icons at the top to find a suitable color scheme. The color scheme the icons generate are based off the predefined color scheme we talked about above.</p>
<p><img src="http://blog.mobnia.com/content/images/2019/02/paletton_2.jpg" alt="A Simple Color Guide for Web projets (Part 2)"><br>
Click through to get a color scheme you like</p>
<p>For this project, I like the pink (topmost right color) that comes up under the adjacent (also known as analogous) icon, so that's what I'm using as the accent for our scheme.</p>
<p><img src="http://blog.mobnia.com/content/images/2019/02/palette_1.jpg" alt="A Simple Color Guide for Web projets (Part 2)"></p>
<p>Our color palette so far - nice base color and a shot of an accent</p>
<p>As our color palette is shaping up, the next phase is to add our neutrals.</p>
<h2 id="addingtheneutrals">ADDING THE NEUTRALS</h2>
<p>Neutrals are an important part of creating a color scheme. Gray, black, white, brown, off-white and tan are considered as neutral colors.</p>
<p>Gray, black and white will take on either a warm or cool impression depending on surrounding colors.</p>
<p>Browns, tans, and off-whites tend to make color schemes warmer.</p>
<p>More often than not we need an average of three neutral colors to every scheme:</p>
<ul>
<li>White</li>
<li>Dark gray: is usually used for text <code>#424242</code></li>
<li>Light gray: I use this as a background for subtle differentiation against white backgrounds <code>#fafafa</code></li>
</ul>
<p>You can choose your grays with the following:</p>
<ul>
<li>Use <a href="http://dribbble.com/colors">Dribbble</a> and <a href="http://designspiration.net">Designspiration</a> again 😉 to find a nice gray from your previous result that matches your base color.</li>
<li>You could use <a href="http://v1.methodandcraft.com/videos/creating-harmonious-color-schemes">Erica Schoonmaker’s technique</a> if you have Photoshop to harmonize your grays with the base color.</li>
<li>You could use Olamide Jegede's (that's me 😁) method for balancing your grays.<br>
<em>Shameless plug-</em> Since this is my lesson, I'll be using my method and I urge you to do the same please 🤗</li>
</ul>
<h2 id="balancingyourgrays">BALANCING YOUR GRAYS</h2>
<p>To create our balanced grays using Olamide's method:</p>
<ul>
<li>We'll start with going to <a href="http://paletton.com">Paletton</a> and type in our color code into the color box like we did earlier when trying to pick our accent.</li>
<li>Revert back to Monochromatic and click on <strong>Presets</strong><br>
<img src="http://blog.mobnia.com/content/images/2019/02/adding_gray1.jpg" alt="A Simple Color Guide for Web projets (Part 2)"></li>
</ul>
<p>Select the icon to choose monochrome, then click on Presets to show a list of preset schemes.</p>
<ul>
<li>Select <strong>greyish dark</strong> and hover on the darkest color in the scheme and write the HEX code. In this case, it's <code>#1F1720</code><br>
<img src="http://blog.mobnia.com/content/images/2019/02/adding_gray2.jpg" alt="A Simple Color Guide for Web projets (Part 2)"></li>
</ul>
<p>Select the greyish dark Preset and pick the color</p>
<ul>
<li>Click on <strong>UNDO</strong> at the top of the page. This takes us back to our original color scheme. Click on <strong>Presets</strong> again.</li>
<li>Then select <strong>greyish lightest</strong> and hover on the lightest color in the scheme and write the HEX code. In this case, it's <code>#DAD4DC</code><br>
<img src="http://blog.mobnia.com/content/images/2019/02/adding_gray3.jpg" alt="A Simple Color Guide for Web projets (Part 2)"><br>
Select the greyish lightest Preset and pick the color</li>
</ul>
<p>So yeah that's Olamide Jegede's method for balancing your grays. Nice right 👌<br>
<img src="http://blog.mobnia.com/content/images/2019/02/grays.png" alt="A Simple Color Guide for Web projets (Part 2)"></p>
<p>Picking grays that balance with the base color might seem like a small detail but it makes a nice difference.</p>
<h2 id="yeswedidit">Yes!!! We did it!!! 🎉🎉🎉</h2>
<p>Ladies and Gentlemen, our color scheme is complete. I feel ecstatic and I hope you do too.</p>
<p>Presenting our color scheme:</p>
<p><img src="http://blog.mobnia.com/content/images/2019/02/palette_2.jpg" alt="A Simple Color Guide for Web projets (Part 2)"></p>
<p>Our glorious color scheme.</p>
<h1 id="yourcolorschemeinaction">Your Color Scheme in Action</h1>
<p>Ok, so we have finally made our color scheme, not it's time to put it to use. Here's a little tip on how to apply the colors in your color scheme to a project.</p>
<ul>
<li>Base color: Used for logos, call to actions.</li>
<li>Dark gray: Used for headings, and body text</li>
<li>Light gray: Used for backgrounds (sometimes for body text if Dark gray was used as background</li>
<li>White: Used for backgrounds.</li>
<li>Accent: like the name implies used as accents, in graphics (like icons, illustrations), button hover effect</li>
</ul>
<p>Like I said earlier, the project example we will use for the purpose of this lesson is the onboarding in a FinTech payment mobile app 🤑</p>
<p>For an insight on the transformation that will occur, here's a mockup of the screens in grayscale and with our color scheme put to use.</p>
<p><img src="http://blog.mobnia.com/content/images/2019/02/project_grayscale.png" alt="A Simple Color Guide for Web projets (Part 2)"></p>
<p>Laying it out in grayscale helps us to focus on hierarchy and layout</p>
<p><a href="https://www.notion.so/e76ef2bdffc74a8298e4cfe13d6edd8c#c8e0f079fdcf4be4bcc92a82512dad6f"></a><br>
<img src="http://blog.mobnia.com/content/images/2019/02/project_color.png" alt="A Simple Color Guide for Web projets (Part 2)"><br>
GLOW UP: courtesy of our color scheme</p>
<p>As you can see, <strong>purple</strong> is the base color here. It’s used on the logo and on button</p>
<p>Our accent, <strong>pink / pinkish - purple 😜</strong>, stands out beautifully against the base color. This is used in very small areas, for the and in the icons. The <strong>less</strong> you use this color, the more it will <strong>stand out</strong>. Less is more</p>
<p>The <strong>dark gray</strong> is used for the text, slider indicator outlines.</p>
<p>The <strong>light gray</strong> is used for the form text, the slider controls and the form-field outlines.</p>
<p>The <strong>white</strong> forms the background.</p>
<p>Keep in mind that when using color and text you need to ensure that there is sufficient contrast between the background and the text.</p>
<p>Why? This is because of people with color blindness or low vision read the text.</p>
<blockquote>
<p>Good design is not only aesthetically pleasing, but functional and accesible - Olamide Jegede</p>
</blockquote>
<p>The <a href="https://webaim.org/resources/contrastchecker/">WebAim Color Contrast Checker</a> is a tool to help you ensure that your colors comply with <a href="https://webaim.org/blog/wcag-2-0-and-link-colors/">WCAG Guidelines</a>.</p>
<h1 id="usingphotosforcolorschemes">Using Photos For Color Schemes</h1>
<p>Recently, I discovered a tool you can use to automatically generate color schemes from a photo; the <strong>Adobe Capture CC mobile app.</strong></p>
<p>With Adobe Capture, you can upload an image or use your camera. This is awesome for times when you might be inspired by a physical object. You can also pick an image from your Creative Cloud account or Adobe Stock.</p>
<p><img src="http://blog.mobnia.com/content/images/2019/02/adobe-capture.jpg" alt="A Simple Color Guide for Web projets (Part 2)"></p>
<p>Adobe Capture CC mobile app (Image credit: <a href="https://www.smashingmagazine.com/author/cameron-chapman">Cameron Chapman</a> for <a href="https://www.smashingmagazine.com/2010/02/color-theory-for-designer-part-3-creating-your-own-color-palettes/">Smashing magazine</a>)</p>
<h1 id="conclusion">Conclusion</h1>
<p>You're not restricted to using 5 colors in your scheme, as long as you follow the process above it's fine to find more colors that work with your scheme.</p>
<p>There are sites that allow you upload your color schemes and store them for later reference, take advantage of them.</p>
<p>Remember the best way to be good at creating color schemes of your own is to practice. If possible, create a scheme on a daily basis or rather weekly basis.</p>
<p>Play around and have fun. I would like to see what you create, mention me on twitter <a href="https://twitter.com/hola_mide">@hola_mide</a> and Instagram <a href="https://www.instagram.com/hola.mide/">@hola.mide</a></p>
<p>This post turned out to be longer than planned. Thank you for bearing with me 👍</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Are Enabling Environments a Myth?]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I recently had opportunity to speak with <a href="https://gdl.com.ng/team/member.php?id=18">Dr Nadu Denloye</a>, who I have a lot of respect for with her achievements as a pioneer of the digital industry in Nigeria and the experience she garnered in building a successful technology business, <a href="https://telnetng.com/">Telnet</a>, in a nascent era.</p>
<p>Dr Denloye suggested that</p>]]></description><link>http://blog.mobnia.com/are-enabling-environments-a-myth/</link><guid isPermaLink="false">5da4f540b55d2105392db3b0</guid><category><![CDATA[entrepreneurship]]></category><category><![CDATA[markets]]></category><dc:creator><![CDATA[Francis Onwumere]]></dc:creator><pubDate>Wed, 01 May 2019 13:48:25 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2019/10/bee.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2019/10/bee.jpg" alt="Are Enabling Environments a Myth?"><p>I recently had opportunity to speak with <a href="https://gdl.com.ng/team/member.php?id=18">Dr Nadu Denloye</a>, who I have a lot of respect for with her achievements as a pioneer of the digital industry in Nigeria and the experience she garnered in building a successful technology business, <a href="https://telnetng.com/">Telnet</a>, in a nascent era.</p>
<p>Dr Denloye suggested that I read <a href="https://en.wikipedia.org/wiki/Clayton_M._Christensen">Clayton Christensen's</a> recent article <a href="https://hbr.org/2019/01/cracking-frontier-markets">Cracking Frontier Markets</a>. Having studied Christensen's <a href="https://hbr.org/2016/09/know-your-customers-jobs-to-be-done"><em>jobs to be done framework</em></a>, and used it as lens across product development, business, and life; I expected Christensen to live up to his reputation, but truth be told - I was not ready for what he brought this time around.</p>
<p>In <a href="https://hbr.org/2019/01/cracking-frontier-markets">Cracking Frontier Markets</a>, Christensen, Dillon, and Ejomo embrace the <em>unembraceable</em> in their almost praise for the lack of enabling environments in frontier markets like Nigeria. They suggest embracing the lack of the most fundamental requirements to build businesses in frontier markets as a competitive advantage rather than a disadvantage.</p>
<p>You might think, this was akin to not crying over split milk but this is far from it, in this case not only is the milk split but the jug to hold said milk is either broken or non-existent.</p>
<blockquote>
<p>very real barriers exist. Corruption, the lack of functioning institutions—what Harvard Business School’s Tarun Khanna and Krishna Palepu call institutional voids—and dilapidated or nonexistent infrastructure constitute formidable challenges. How should companies think about and address them? - <a href="https://hbr.org/2019/01/cracking-frontier-markets">Cracking Frontier Markets</a></p>
</blockquote>
<p>This seemingly mad proposition is supposed to be the only path to unleashing market creating innovations in the frontier markets and somehow my entrepreneurial sub-conscious was nodding in agreement as the author laid out examples from <a href="https://www.forbesafrica.com/life/2018/01/30/fortune-fury-behind-nollywood/">Nollywood in Nigeria</a> (which innovated its way to second largest movie industry in the world on per-capita basis) to <a href="http://www.galanz.com">Galanz</a> in China (now the world's largest microwave oven maker)</p>
<blockquote>
<p>In practice, the opposite is true. Market-creating innovations don’t wait for such obstacles to be removed by resources that are pushed in. They essentially pull in the necessary resources—creating workarounds or funding the infrastructure and institutions needed to deliver their products—even if those efforts are not initially supported by the local government.- <a href="https://hbr.org/2019/01/cracking-frontier-markets">Cracking Frontier Markets</a></p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/Subsidiarity_(Catholicism)">The principle of subsidiarity</a> could say this makes for a red-herring moment where governments allow themselves comfort in not having to listen to entrepreneurs rant about the government's role in creating enabling environments.</p>
<p>The authors caught themselves a bit on this or so I think, and I suspect it must have been a point of conversation or even debate as they carried out their research. The allusion is drawn in the article;</p>
<blockquote>
<p>It may seem we are suggesting that governments in frontier economies transfer responsibility for infrastructure development to the private sector. We’re not. We are highlighting the importance of sequencing and the catalytic role of innovation in infrastructure’s development and improvement. - <a href="https://hbr.org/2019/01/cracking-frontier-markets">Cracking Frontier Markets</a></p>
</blockquote>
<p>There is some truth here but not the full story. Whilst it may be surmised by our witnesses of market creating innovations pulling infrastructure forward in this decade however, as Ory Okolloh emphatically pointed out in 2014 - *<a href="https://qz.com/africa/502149/video-ory-okolloh-explains-why-africa-cant-entrepreneur-itself-out-of-its-basic-problems/">It’s not possible to innovate people out of poverty*</a>;</p>
<blockquote>
<p><a href="https://twitter.com/kenyanpundit">Ory Okolloh</a><br>
: “I’m concerned about what I see is the fetishization around entrepreneurship in Africa. It’s almost like it’s the next new liberal thing. Like, don’t worry that there’s no power because hey, you’re going to do solar and innovate around that. Your schools suck, but hey there’s this new model of schooling. Your roads are terrible, but hey, Uber works in Nairobi and that’s innovation.<br>
… We can’t entrepreneur our way around bad leadership. We can’t entrepreneur our way around bad policies. Those of us who have managed to entrepreneur ourselves out of it are living in a very false security in Africa. There is growth in Africa, but Africans are not growing. And we have to questions why is there this big push for us to innovate ourselves around problems that our leaders, our taxes, our policymakers, ourselves, to be quite frankly, should be grappling with.</p>
</blockquote>
<blockquote>
<p>… I think sometimes we are running away from dealing with the really hard things. And the same people who are pushing this entrepreneurship and innovation thing are coming from places where your roads work, your electricity works, your teachers are well paid. I didn’t see anyone entrepreneuring around public schooling in the US. You all went to public schools, you know, and then made it to Harvard or whatever. You turned on your light and it came on. No one is trying to innovate around your electricity power company. So why are we being made to do that? Our systems need to work and we need to figure our shit out.” - <a href="https://twitter.com/kenyanpundit">Ory Okolloh</a></p>
</blockquote>
<iframe width="560" height="315" src="https://www.youtube.com/embed/frQaUH3NIR0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>From fintech where players like <a href="https://www.mypaga.com/">Paga</a>, <a href="https://paystack.com/">Paystack</a>, and <a href="https://flutterwave.com/">Flutterwave</a>, are championing financial inclusion for the unbanked and helping enable a new breed of entrepreneurs; to health-care where startups like <a href="https://lifebank.ng/">Lifebank</a> are literally providing a new lease of life via their blood and oxygen service to resuscitate the people of a health care system that has been grossly neglected by Government. And even garbage collection where <a href="http://wecyclers.com/">WeCyclers</a> is closing the gap left by an overwhelmed recycling infrastructure in Lagos Nigeria.</p>
<p>Some of these startups and initiatives would appear as a mad quest for someone in the developed world, but precisely that mad label has always been cast on great adventurers in history seeking to open new frontiers and markets.</p>
<p>Whilst embracing non-enabling environments could take getting used to, innovation might flourish and new markets emerge however, frontier nations still need enabling environments that take care of fundamental problems if entrepreneurs are to succeed and the mass of their people grow out of poverty.</p>
<blockquote>
<p><a href="https://mobile.twitter.com/kola_aina/status/1120736743609729024">Kola Aina on Twitter</a>: &quot;Man, anyone that's venturing, creative &amp; pushing the envelope here in Nigeria gets all my respect. The unnecessary battles, red-tape and obstructions to progress are draining and will easily swallow the unprepared. One day we will write, for now we soldier on. What a day! 👊🏿&quot; /</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[A Simple Color Guide for Web Projects - Part 1]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>“All colors are the friends of their neighbors and the lovers of their opposites” – Marc Chagall.</p>
</blockquote>
<p>Now to pick any color from the over 10 million colors we can see at any given time can be either easy or quite difficult. But what we need to have in mind, is</p>]]></description><link>http://blog.mobnia.com/a-simple-color-guide-for-web-projects-part-1/</link><guid isPermaLink="false">5da4f540b55d2105392db3aa</guid><dc:creator><![CDATA[Olamide Jegede]]></dc:creator><pubDate>Sat, 12 Jan 2019 09:02:22 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2019/01/Dribbble-Shot-HD-2-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<img src="http://blog.mobnia.com/content/images/2019/01/Dribbble-Shot-HD-2-1.jpg" alt="A Simple Color Guide for Web Projects - Part 1"><p>“All colors are the friends of their neighbors and the lovers of their opposites” – Marc Chagall.</p>
</blockquote>
<p>Now to pick any color from the over 10 million colors we can see at any given time can be either easy or quite difficult. But what we need to have in mind, is that this color will be the primary color for the project; that is, everything will revolve around this color.</p>
<p><em>No pressure: You can’t fail here, as I’m here to help you.</em></p>
<h2 id="choosingabaseprimarycolor"><strong>Choosing a Base (primary) color</strong></h2>
<p>This is one of the most important decisions when deciding on the visual interface of an app or website.</p>
<p><strong>For any project involving clients, one thing that is good to keep in mind is that you’ll have to defend most if not all your choices, so you should try to have to have solid reasons that justify your choices.</strong><br>
Else, it will be a case of their favorite color versus your favorite color, and this is a battle you can not win as they the ones paying for the project.</p>
<p>All in all, what I’m trying to say is that you make sure you have some valid reasoning behind not only your color choices but all your choices.</p>
<h2 id="tipsonchoosingabasecolor">Tips on Choosing a Base color</h2>
<h3 id="1usewhatyouhave">1. Use what you have</h3>
<p>More often than not, if the client has a logo with an established color, that will usually be your base color.<br>
<mark>However, note that if you decide to use the color from the logo, you can use different variants (shade or tint) of the same hue.</mark></p>
<h3 id="2donotuseyourcompetitorscolors">2. Do not use your competitors’ colors</h3>
<p>Sometimes, there might be an urge to copy if one of your main competitors has a strong brand color, don’t do it if you can help it. Instead, find their colors and remove them from your color schemes.</p>
<h3 id="3consideryourtargetaudience">3. Consider your target audience</h3>
<p>The colors of a website for a fashion store would likely not be the same as the colors for a primary school or a kid’s toys website.<br>
<img src="http://blog.mobnia.com/content/images/2019/01/Dribbble-Shot-HD-1.jpg" alt="A Simple Color Guide for Web Projects - Part 1"></p>
<p>Think about how your use of color might be perceived in other countries and cultures – <mark>Make sure the colors in your app send the appropriate message</mark>.</p>
<p>Think about who will be using the website and how you want them to feel (serious, relaxed etc.).</p>
<h3 id="4usecomplementarycolors">4. Use complementary colors</h3>
<p>Colors in your app should work well together, not conflict or distract. Use complementary colors throughout your app or website.<br>
<img src="http://blog.mobnia.com/content/images/2019/01/vr-game-appointment_4x.png" alt="A Simple Color Guide for Web Projects - Part 1"></p>
<h3 id="5usesufficientcolorcontrastratios">5. Use sufficient color contrast ratios</h3>
<p>Lack of sufficient contrast in your app or website makes content hard to read for everyone.<br>
<img src="http://blog.mobnia.com/content/images/2019/01/good-contrast-and-bad-contrast.png" alt="A Simple Color Guide for Web Projects - Part 1"></p>
<p>Consider using an online color contrast calculator to help you accurately analyze the color contrast in your project to ensure it meets optimal standards.</p>
<p><mark>7:1 is the preferred ratio because it meets more accessibility standards. Try to achieve a minimum contrast ratio of 4:5:1</mark>.</p>
<p>This is the first article in the series: A Simple Color Guide for Web Projects</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[CSS in the era of Ad Blocking]]></title><description><![CDATA[Today, there is increasing adoption of newer privacy focused browsers like Brave that offer privacy features like HTTPS-everywhere and Ad-blocking]]></description><link>http://blog.mobnia.com/css-in-the-era-of-ad-blocking/</link><guid isPermaLink="false">5da4f540b55d2105392db3a9</guid><category><![CDATA[Ads]]></category><category><![CDATA[AdBlockPlus]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[Francis Onwumere]]></dc:creator><pubDate>Mon, 07 Jan 2019 10:11:57 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2019/01/css-blocking.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2019/01/css-blocking.jpg" alt="CSS in the era of Ad Blocking"><p>Advert blocking in browsers has become the new norm as concerns around invasive adverts and privacy reaches mainstream, with most people discovering that blocking web advertisements can substantially improve their browsing speed and experience.</p>
<p>Popular browsers like Google Chrome, Firefox or Safari had in the past enabled privacy configurations via plugins and advanced settings but the sheer complexity of how to enable this proved elusive to most people.</p>
<p>Today, there is increasing adoption of newer privacy focused browsers on mobile and desktop like <a href="https://brave.com/">Brave</a>, <a href="https://vivaldi.com/">Vivaldi</a>, <a href="https://www.epicbrowser.com">Epic</a>, and <a href="https://play.google.com/store/apps/details?id=org.mozilla.focus&amp;hl=en">Firefox Focus</a> that offer privacy features like <a href="https://www.eff.org/https-everywhere">HTTPS-everywhere</a> and <a href="https://adblockplus.org/">Ad-blocking</a> already enabled out of the box.</p>
<p>Tracking users on the web for the purpose of serving ads has been one of the greatest culprits in the violation of online privacy. Every genuine effort today to improve privacy is now expected to block ads or ad-tracking.</p>
<p><img src="https://adblockplus.org/en/images/how-adblock-plus-works.png?3132281242" alt="CSS in the era of Ad Blocking"></p>
<p>Most ad-blocking services utilize a blacklist and behavior approach to block adverts. The first line of defense in blacklist filtering is usually server based. Such that ad-blocking services maintains a list of domains and ip addresses that serve ads and try to proactively block assets from these sources from reaching your browser.</p>
<p>Blocking ads via the server blacklists is necessary but difficult to scale as new servers are spawn every now and then. As this can become redundant very quickly another line of defense is introduced.</p>
<p>The second line of defense is executed in the website content. The ad-blocking service scans a website content for any expressions or terms that match a list of common advert keywords, in assets such as images or videos. This also extends to asset containers via their CSS classes or identifiers.</p>
<p>This process could lead to false positives where adverts are flagged correctly and blocked but they are needed to complete a website's experience. For instance, an advert that links to a new album on a musician's website. In cases like this, adverts are created as part of the experience and guide the user on their website journey rather than to third-party related/unrelated offerings that are annoying.</p>
<p>Knowledge of this blacklist of DOM element names usually could lead to better experience for your users and prevent false positives where assets are flagged for blocking even though they should not be.</p>
<p>For instance, <a href="https://adblockplus.org/">AdBlockPlus</a> will block images with common advert terms in their path or file name. For example naming images or saving them in folders with: banners, adv, ad, or myimage_300x250 will cause the image to be blocked.  DOM elements with classes or ids corresponding to such terms will also be blocked.</p>
<table border="1">
    <td><span style="font-weight:bold">paths/names: </span></td>
    <td>-ad-banner-</td>
    <td>_thumbnail<br></td>
    <td>/banners/</td>
    <td>ads/*</td>
    <td>/galleryad.</td>
  
  <tr>
    <td><span style="font-weight:bold">classes/ids:</span></td>
    <td>thumbnail</td>
    <td>displayAds</td>
    <td>lazyload</td>
    <td>banner</td>
    <td>displayAds</td>
  </tr>
  <tr>
    <td colspan="6"><small>Example of some patterns that will get flagged</small></td>
  </tr>
  <tr>
</tr></table>
<p>Luckily this is not arbitrary, <a href="https://adblockplus.org/">AdBlockPlus</a> maintains a <a href="https://easylist-downloads.adblockplus.org/easylist.txt">publicly accessible blacklist</a> that is updated every few days. Getting familiar with the list and the patterns in there could save you a lot of frustration.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Unlocking the Cash Machine: Pricing Higher]]></title><description><![CDATA[Price reduction is not a competitive strategy, always seek options that make it easy to charge a lot of money.]]></description><link>http://blog.mobnia.com/unlocking-the-cash-machine-pricing-higher/</link><guid isPermaLink="false">5da4f540b55d2105392db3a5</guid><category><![CDATA[startups]]></category><category><![CDATA[markets]]></category><category><![CDATA[cash machine]]></category><category><![CDATA[recurring revenue]]></category><dc:creator><![CDATA[John, Orakwe John]]></dc:creator><pubDate>Fri, 21 Dec 2018 17:06:51 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2018/12/Blog-Fronts-2.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2018/12/Blog-Fronts-2.png" alt="Unlocking the Cash Machine: Pricing Higher"><p>Having examined <a href="http://blog.mobnia.com/unlocking-the-cash-machine-good-market-bad-market/">markets</a>, <a href="http://blog.mobnia.com/unlocking-the-cash-machine-recurring-revenue/">recurring revenue and customer acquisition</a> models, we’ll now explore a few persuasion tools that make it easy for businesses to charge more money.</p>
<h6 id="1decoyeffect">1. Decoy Effect</h6>
<p>This can be leveraged when there are two price considerations (say $66 per month &amp; $21 per month). To make customers opt for the $66 p/m plan, create a third option (say $50 per month) close to your target price and leave a gulf in benefits between it and the $66 p/m option.</p>
<p>In this situation, the customer usually opts for the most expensive option ($66 p/m) to enjoy the full benefits of the product for only a few dollars more. The persuasion comes from perceiving the comparative advantage of this option against the $50 plan as much higher than the comparative advantage of the $50 plan over the $21 plan.</p>
<p>Alternatively, we can create a third price option (say $80) that is higher than our target price of $66 p/m. This new plan will have benefits similar to the $66 p/m option. In this case, also the customer opts for the cheaper option, settling on $66 per month.</p>
<p><img src="http://blog.mobnia.com/content/images/2018/12/Decoy-Effect---Iphone-71116.jpg" alt="Unlocking the Cash Machine: Pricing Higher"></p>
<p>Phew! If you spotted the decoy, don’t forget to leave a comment.</p>
<h6 id="2centerstageeffect">2. Center-Stage Effect</h6>
<p>It is experimentally verified that humans have a knack for choosing the middle options when confronted with the responsibility of choice.</p>
<p>Not too much, not too little – just moderate.</p>
<p>This phenomenon is called the center-stage effect and it can help businesses using three (3) price tiers with the preferred option in the middle.<br>
<img src="http://blog.mobnia.com/content/images/2018/12/Centre-Stage-Effect--coglode-com--1.png" alt="Unlocking the Cash Machine: Pricing Higher"></p>
<h6 id="3framingeffect">3. Framing Effect</h6>
<p>It is a fact that people are most likely to support a cause if it is presented in positive terms.</p>
<p>As a result, using the framing effect means you’ll have to project the value of the customer’s choice not just their potential benefits.</p>
<p>As a rule, show the customer how much they can save by opting for the more expensive options e.g. Save $50 with an annual subscription, save $25 with a quarterly subscription.<br>
<img src="http://blog.mobnia.com/content/images/2018/12/Framing-Effect-111.jpg" alt="Unlocking the Cash Machine: Pricing Higher"></p>
<h6 id="4bandwagoneffect">4. Bandwagon Effect</h6>
<p>If most people are opting for it, it must be the best option, right? For some dysfunctional reason, most of us answer in the affirmative. This is because of group-think – a psychological phenomenon that occurs within a group of people in which the desire for harmony or conformity in the group results in an irrational or dysfunctional decision-making outcome.</p>
<p>The trick is to design your price tiers and tag your preferred option as the “MOST POPULAR”</p>
<p><img src="http://blog.mobnia.com/content/images/2018/12/BWE1111.jpg" alt="Unlocking the Cash Machine: Pricing Higher"><br>
Incredible thoughts?</p>
<h6 id="5baserateneglect">5. Base Rate Neglect</h6>
<p>Often people judge that an outcome will occur without considering prior knowledge of the probability that it will occur i.e. most of us will only consider the price for an item only within the context of an immediate and applicable call to action on those prices at a given time.</p>
<p>Base rate flaw is noticed in the human tendency to make buying decisions based on prices in front of them rather than run comparisons with other similar products.</p>
<p>For example, a product that normally costs $3 is listed for $9 on a particular website, and the user goes ahead to pay without running a comparison.</p>
<h6 id="6otherhackstochargemoremoneyeasily">6. Other hacks to charge more money easily.</h6>
<ul>
<li>
<p><strong>i. Unique offerings:</strong>  unique offerings with distinguishable from competition allows you charge more.</p>
</li>
<li>
<p><strong>ii. Niche Promos:</strong> An approach that can be used is to create a niche discount and present this to some users that have crossed a determined milestone as an exclusive deal just for them.</p>
</li>
<li>
<p><strong>iii. Money back guarantees over free trials:</strong> Instead of offering a 30 – day free trial, adopt a model like a 60 – day money back guarantee. If your product is great, you can expect comments like <em>“ that 60-days didn’t seem like enough time”</em></p>
</li>
<li>
<p><strong>iv. Discount Offers:</strong> Say we have a price option of $49 per month<br>
An approach that was used at WP Engine to good effect was to write $79 (cross it out) and then write $49.</p>
</li>
</ul>
<p><strong>NB:</strong> <strong>Most businesses develop a pricing strategy using a suitable combination of the effects above</strong></p>
<p>Remember, <mark>“Price reduction is not a competitive strategy, always seek options that make it easy to charge a lot of money”.</mark></p>
<p>And this concludes our three parts series about unlocking predictable acquisition of recurring revenue with annual repay in a good market.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Unlocking the  Cash Machine: Recurring Revenue]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The <a href="http://blog.mobnia.com/unlocking-the-cash-machine-good-market-bad-market/">first post</a> in this series identified good and bad markets for building a cash machine.</p>
<p>When building out our revenue models and customer acquisition approach in a good market there are a few rules of thumbs that you need to keep in focus for a well-oiled cash machine.</p>
<blockquote>
<p>always</p></blockquote>]]></description><link>http://blog.mobnia.com/unlocking-the-cash-machine-recurring-revenue/</link><guid isPermaLink="false">5da4f540b55d2105392db3a6</guid><category><![CDATA[startups]]></category><category><![CDATA[markets]]></category><category><![CDATA[cash machine]]></category><category><![CDATA[recurring revenue]]></category><dc:creator><![CDATA[John, Orakwe John]]></dc:creator><pubDate>Fri, 14 Dec 2018 12:10:09 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2018/12/Blog-Fronts-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2018/12/Blog-Fronts-1.png" alt="Unlocking the  Cash Machine: Recurring Revenue"><p>The <a href="http://blog.mobnia.com/unlocking-the-cash-machine-good-market-bad-market/">first post</a> in this series identified good and bad markets for building a cash machine.</p>
<p>When building out our revenue models and customer acquisition approach in a good market there are a few rules of thumbs that you need to keep in focus for a well-oiled cash machine.</p>
<blockquote>
<p>always seek options to make it easy to charge a lot of money</p>
</blockquote>
<p>This may seem obvious but you find a lot of startups take the contrary approach of continually lowering prices as a customer acquisition strategy. This strategy quickly locks you into a long race to the bottom that <a href="https://techcrunch.com/2014/07/09/samsungs-race-to-the-bottom">ruins a lot of companies</a>.</p>
<p>Thus building a solid product always puts you in poll position with options to charge a lot of money. Your product pricing should reflect the value your product provides.</p>
<p>A recurring revenue model, especially for SaaS (Software as a Service) and subscription-based products offers the predictability of income stream which is a highly value asset for any business.</p>
<p>6 years ago, <a href="https://www.mckinsey.com/business-functions/digital-mckinsey/our-insights/reborn-in-the-cloud">Adobe’s Creative Cloud</a> launched Adobe Systems into the recurring revenue–based subscription model space. Subsequently, Adobe’s <a href="https://www.macrotrends.net/stocks/charts/ADBE/adobe/stock-price-history">stock price in 2016 appreciated nearly 300% of its 2012 value</a>.</p>
<p>Adoption of recurring revenue models by Adobe and software behemoths (Google, Amazon etc.) is compelling evidence that any start-up with cash machine ambitions must anchor on a recurring revenue model.</p>
<p>Some questions you have to answer as you implement the recurring revenue for you cash machine includes:</p>
<ul>
<li>What is the best frequency for recurring charges; charge per month, per quarter, or per year?</li>
<li>How much each customer should pay per month?</li>
<li>How many customers do we need to achieve a monthly revenue target?</li>
</ul>
<p>Suppose that our startup has a <strong>monthly recurring revenue (MRR) target of $10,000</strong>. A new rule of thumb suggests that the fewer customers that can help us meet this target then the easier it would be for us to achieve and grow the target sustainably.</p>
<blockquote>
<p><a href="https://kk.org/thetechnium/1000-true-fans/">Kevin Kelly's hypothesis</a> stated that creators need only a thousand true fans (customers) giving them $100 a year to make a living. However, <a href="https://www.linkedin.com/in/jasoncohen">Jason Cohen of WP Engine</a> cautions that an even smaller number of true fans i.e. 150 customers is more practical.</p>
</blockquote>
<p>In this context, your start-up needs only 150 loyal customers to reach $10,000 in revenue per month i.e. each customer pays an average of $66 per month.</p>
<h6 id="customeracquisitionstrategies">Customer Acquisition Strategies</h6>
<p>Now, from <a href="https://app.convertkit.com/kevindewalt/beginning-customer-development_ebook">Kevin DeWalt</a> to Jason Cohen, there's an absolute wealth of options on customer acquisition and customer development approach. Our focus will be on three (3) pragmatic acquisition methods.</p>
<ol>
<li>
<p>Scratching and clawing: which is done by reaching out to your immediate professional network. Given that you're creating value in a big market, this approach can help you capture the first 50 Customers.</p>
</li>
<li>
<p>Leverage guest blog posts and Social media by offering coupons to niche blogs and social media influencers. Less effective than paid advertising, but can pull in another 25 customers.</p>
</li>
<li>
<p>Use basic marketing – tools like Adwords and sponsored posts on relevant websites are the most effective and can pull in a set of 75 paying customers.</p>
</li>
</ol>
<p><strong>An example of scratching and clawing at WP Engine</strong></p>
<p>During the customer development phase at WP Engine, Jason achieved a 100% positive response from WordPress consultants on Linkedin using the email format below:</p>
<blockquote>
<p>Hi, I’m a founder of this new WordPress hosting company. It’s supposed to be designed for folks like you so I’d love to talk to you about your pains and your needs.</p>
</blockquote>
<blockquote>
<p>Now I know your time is valuable, you’re a consultant and so I absolutely do not want you to feel like I’m just trying to grab time from you.</p>
</blockquote>
<blockquote>
<p>I am very happy to pay whatever you think is fair for an hour of your time even if that’s more than your normal hourly rate cause I appreciate this is a weird one-off thing.</p>
</blockquote>
<p><strong>NB:</strong> The secret to great customer development is <strong>respect</strong>; People are most likely to pay you their attention when you place a premium on their time.</p>
<p>In some other not-so-unique instance of scratching and clawing, customers give money to businesses that address their pain even before they'd built anything tangible.</p>
<p>Perhaps, if you talk to enough people about how your idea can ease or erase their pain completely, You'll meet someone who is willing to pay you for the products even before it is built. <strong>Certainly</strong>, there's no better way to start than to have a market hungry for your products or services.</p>
<p>This is the second article in the series: Unlocking the Cash Machine for your Startup.</p>
<p>Stay tuned for the next article - Unlocking the Cash machine: Pricing Higher</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Unlocking the Cash Machine: Good Market Bad Market]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The key to turning your product into a <mark>cash machine</mark> lies in unlocking recurring revenue in a good market.</p>
<p>While there are several pragmatic revenue models and steps to recurring revenue in a chosen market, attaining this goal in a predictable fashion can be daunting.</p>
<p>At any rate, there are</p>]]></description><link>http://blog.mobnia.com/unlocking-the-cash-machine-good-market-bad-market/</link><guid isPermaLink="false">5da4f540b55d2105392db3a4</guid><category><![CDATA[startups]]></category><category><![CDATA[markets]]></category><category><![CDATA[cash machine]]></category><category><![CDATA[recurring revenue]]></category><category><![CDATA[bootstrapping]]></category><dc:creator><![CDATA[John, Orakwe John]]></dc:creator><pubDate>Fri, 07 Dec 2018 16:01:42 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2018/12/Blog-Fronts.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2018/12/Blog-Fronts.png" alt="Unlocking the Cash Machine: Good Market Bad Market"><p>The key to turning your product into a <mark>cash machine</mark> lies in unlocking recurring revenue in a good market.</p>
<p>While there are several pragmatic revenue models and steps to recurring revenue in a chosen market, attaining this goal in a predictable fashion can be daunting.</p>
<p>At any rate, there are restrictions to the kinds of the market where startups can develop predictable recurring revenue with annual repay from customers.</p>
<p>For instance, cash machines are relatively easy to build in a good market rather than in a bad market.</p>
<p>Finding a good market to build a cash machine is important for startup survival.</p>
<h6 id="goodmarket">Good Market</h6>
<p>The choice of market space is mostly either one of two classes:</p>
<ul>
<li>business to business (B2B) or</li>
<li>business to consumer (B2C).</li>
</ul>
<p>Consequently, drawing from industry experience, the better category to build a self-funded startup is the B2B market.</p>
<p>In B2C it is almost impossible to establish a revenue model that involves direct payment from your users. Regardless of your products' awesomeness, you'll have a good chunk of customers complaining if you decide to charge them.</p>
<p>For a product as awesome as Google Maps, Google experienced a massive backlash when they tried to charge for it. <a href="https://techcrunch.com/2012/03/09/google-maps-api-vs-openstreetmap/?guccounter=1">Today GoogleMaps is practically free and the direct revenue points have been pushed so far out that most users will never pay for it</a>.</p>
<p>By Nature, most business operations accrue in financial cycles, and this presents B2B startups with great opportunities to create value and build a cash machine. Like rain, activities such as tax, invoices, project management, content development, report processing, analytics, and human resource needs are inevitable. Similarly, after-markets for already successful products are great spaces for building a business with predictable recurring revenue.</p>
<p>Next, it is important to compete in a big market space where you can carve a niche with an intricate product because it is easier find customers in these spaces and there’s plenty of room to pivot if your product does not fly at first. This is what <a href="https://pando.com/2014/04/05/third-life-flickr-co-founder-pulls-unlikely-success-out-of-gaming-failure-again/"><em>Stewart Butterfield did at GameNeverending that became Flickr and later with Glitch that became Slack</em> </a></p>
<h6 id="badmarket">Bad Market</h6>
<p>A marketplace is an example of a bad market to build a cash machine because you have to attract both buyers and sellers. The marketplace startup is basically a combination of business–to–business and business–to–consumer companies. This is rather complex and is difficult to realize a cash machine from this setup.</p>
<p>Picking the right market is an important step to attain the reality of building a predictable acquisition of recurring revenue with annual repay.</p>
<p>This is the first article in the series: Unlocking the Cash Machine for your Startup.<br>
<mark>Read the next article - Unlocking the Cash machine: Revenue Models Here</mark></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[9 Lessons From a Case Study in African Enterprise Growth]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>We believe that the road to building a sustainable company is paved with learning. We often ply this road, and last week in Mobnia, we had cause to study an interesting tech company founded by a brilliant African woman - AppsTech. Our sprint ended with the reward of nine (9)</p>]]></description><link>http://blog.mobnia.com/9-lessons-from-a-case-study/</link><guid isPermaLink="false">5da4f540b55d2105392db3a2</guid><category><![CDATA[Rebecca Enonchong]]></category><category><![CDATA[AppsTech]]></category><category><![CDATA[Columbia Business School]]></category><category><![CDATA[Mobnia]]></category><dc:creator><![CDATA[John, Orakwe John]]></dc:creator><pubDate>Fri, 02 Nov 2018 09:02:00 GMT</pubDate><media:content url="http://blog.mobnia.com/content/images/2018/11/front--1-.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://blog.mobnia.com/content/images/2018/11/front--1-.png" alt="9 Lessons From a Case Study in African Enterprise Growth"><p>We believe that the road to building a sustainable company is paved with learning. We often ply this road, and last week in Mobnia, we had cause to study an interesting tech company founded by a brilliant African woman - AppsTech. Our sprint ended with the reward of nine (9) lessons shared in this post.</p>
<p><code>Right after this brief introduction...</code></p>
<p>In 1982, Rebecca Enonchong was only 15 years old when she moved to Uncle Sam’s land of opportunities to pursue the American dream. And being a passionate young woman with interest in democracy, peace and human rights, 17-year-old Rebecca would participate in a “Free South Africa” demonstration in Washington D.C., only 45 minutes away from Maryland where she would found her company, AppsTech.</p>
<p>After earning a Bachelor of Science and Master of science degree from the Catholic University of America, a prolific career in financial systems followed. It was during this spell that Rebecca was exposed to something that fascinated her very much - software technology.</p>
<p>Reflecting on how quickly Rebecca’s appreciation of technology translated into mastery of enterprise software applications, it can be argued that years before Cal Newport advocated for <a href="http://calnewport.com/books/deep-work/">Deep Work</a> (which we practice at Mobnia) - and the skill to master hard things quickly; Rebecca made a seamless career switch by devouring software application manuals from cover to cover, to attain expertise in installation and handling of enterprise applications. Deservedly, she gained recognition as a domain expert in Oracle products (becoming an early Oracle Financials certified instructor).</p>
<p><strong>Lesson 1: Ask questions</strong></p>
<p>When Alleygius - a consulting firm subcontracted a staffing operation for Global One to Rebecca and other subcontractors in '99. She would speak to her friend about the opportunity and be rewarded with the suggestion to sign the contract as if with a company and not a person - AppsTech was incorporated soon after.</p>
<blockquote>
<p><mark>&quot;No one loses their way by asking the right questions with an open heart&quot;</mark></p>
</blockquote>
<p><strong>Lesson 2: Build around what you know best</strong></p>
<p>AppsTech was unquestionably built around what Rebecca knew best, helping organizations set up and run financial and enterprise resource planning. And as expected, AppsTech took on new consulting projects. However, these earlier jobs were staffed with subcontractors, some of whom later joined AppsTech as full-time employees.</p>
<p><strong>Lesson 3: Build and nurture relationships</strong></p>
<p>Interestingly, Rebecca would go on to recruit some of the earliest employees from her network of ‘good students’ from her training years.</p>
<p>AppsTech revenue flowed from two main streams - implementation of financial systems (Oracle products) and application management services (database maintenance contracts). And about 2 years after AppsTech started, Apprio inc. was acquired for its Application Service Provider (ASP) expertise.  90% of AppsTech's customers used its application management services which offered low margins compared to systems implementation. In fact, 30% of their customers had long-term contracts with AppsTech - this provided a cushion through the economic hard times of early 2000’s.</p>
<p><strong>Lesson 4: Have the full picture in mind, start work, then fake it till you make it</strong></p>
<p>AppsTech was cradled in an extraordinary cocktail of resourcefulness, global vision, hard work, focused strategy, leadership, internal financing, and employees.</p>
<p>For instance, during the early days when it was just Rebecca and the subcontractors.  The global vision impressed a client who came in from France to see a “call center” filled with some computers (and staff). With the help of these borrowed staff and computers from neighboring offices, AppsTech won the contract!</p>
<p>Secondly, Rebecca lived by a conviction to build a sustainable global business, with globally-minded employees. AppsTech wasn’t going to reach for the low-hanging fruit so she set out from the outset to compete based on merit and competence. AppsTech was built to be better than everyone else in their space and this was only going to be possible through hard work and perseverance. Often times, Rebecca would concern herself with nothing else but her business, sleeping with her computer and responding to emails across time zones - she’d once said... <em>‘a global business never slept’.</em></p>
<p><strong>Lesson 5: Watch the Competition… like Rebecca Enonchong</strong></p>
<p>Rebecca believed that success with AppsTech rested on a  keen sense of the competitors next moves. So, she watched them like a hawk, spending 1-3 hours daily on competitive analysis. And frequently, checking domain names registered by AppsTech’s competitors. Fortunately, she’d been in political circle and picked up the uncanny ability to watch the opposition. A skill which proved useful in business.</p>
<p><strong>Lesson 6: Have a Focused Strategy</strong></p>
<blockquote>
<p><mark>“Where there is no vision, the people cast off restraint” - Proverbs 29:18</mark></p>
</blockquote>
<p>In firms with a robust technical skill set, the temptation to be opportunistic is greater when there is no driving vision. Rebecca resolved that AppsTech couldn't afford to be opportunistic despite the many profit possibilities made available by the firms' robust technical skill set. During lulls in business, AppsTech did not explore non-expert job opportunities even when similar firms appeared to be full-service, one-stop shops; AppsTech stuck to doing one thing and getting it right.</p>
<p><strong>Lesson 7: Decide on how much pressure you can take, and how fast you wish to make decisions</strong></p>
<p>Again, Rebecca’s ability to understand her business environment informed the decision not to take on the pressure of external debt nor dilute her equity control of the firm by accepting venture capital funding. Thus, the firm grew organically with reinvested profits. As a matter of fact, the 2001 acquisition of Apprio was paid for with cash. And thanks to AppsTech financial controller at the time - Patricia Gbeti, expenditures were scrutinized and strict processes were in place to force employees to make efficient decisions.</p>
<p><strong>Lesson 8: Lead by example</strong></p>
<p>Rebecca would often put employees on the spot, testing them about their software knowledge in the hallway. So high were her expectations of a high level of discipline, excellence, and work ethic. Being the daughter of a Cameroonian chief, she most likely adopted these attitudes and behaviours from her father.</p>
<blockquote>
<p>==“In any situation, the realm of possibilities far exceed what is apparent” - Rebecca Enonchong</p>
</blockquote>
<p>Like their leader, AppsTech employees had a triumvirate power of <em>business knowledge, product knowledge, and global knowledge</em>. Also key is open-mindedness and ability to disagree without animosity. AppsTech workforce treated each other as a second family and to prevent layoffs during the recessions of early 2000’s, they unanimously decided to cut individual benefits packages instead of AppsTech funding for philanthropic endeavours in Africa.</p>
<p><strong>Lesson 9: Work matters because it gives you the power to leave the world better than you found it</strong></p>
<p>Remember, the “Free South Africa” demonstration mentioned at the beginning of this article? It earned Rebecca an arrest at 17. Till date, Rebecca is an active member of African and Cameroonian communities in the USA. Duly noted by international media and Cameroonian media, Rebecca remains a strong supporter of democracy, peace and human rights.</p>
<blockquote>
<p>==“The power of technology excites me almost as much as a good meal. The desire for all to have a good meal drives me harder” - Rebecca Enonchong</p>
</blockquote>
<p>REFERENCE<br>
Columbia Business School. (2002). Information Technology from the United States to Cameroon: Rebecca Enonchong and AppsTech [PDF file]. Retrieved from <a href="https://www0.gsb.columbia.edu/mygsb/faculty/research/pubfiles/91/Cameroon_AppsTech.pdf">https://www0.gsb.columbia.edu/mygsb/faculty/research/pubfiles/91/Cameroon_AppsTech.pdf</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>