<?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"><channel><title><![CDATA[Untitled Publication]]></title><description><![CDATA[Untitled Publication]]></description><link>https://barcovanrhijn.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 22:23:13 GMT</lastBuildDate><atom:link href="https://barcovanrhijn.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Using Filters in Tina4 ORM]]></title><description><![CDATA[A normal ORM call in Tina4PHP includes a where function which is similar to what you may see in Laravel. However, the syntax more closely matches SQL. But once you have a lot of where conditions this becomes quite a long unwieldy line.
To solve this ...]]></description><link>https://barcovanrhijn.hashnode.dev/using-filters-in-tina4-orm</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/using-filters-in-tina4-orm</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:49:11 GMT</pubDate><content:encoded><![CDATA[<p>A normal ORM call in Tina4PHP includes a where function which is similar to what you may see in Laravel. However, the syntax more closely matches SQL. But once you have a lot of where conditions this becomes quite a long unwieldy line.</p>
<p>To solve this and make the conditions a bit more flexible you can use a filter variable and extending it a little.</p>
<p>So now I can send in the slug and category into my function and create the conditions dynamically. This would be even more useful in this example once you want to send in an array of slugs or categories and create the where condition in your SQL</p>
<pre><code class="lang-php">
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getPosts</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> $slug, <span class="hljs-keyword">string</span> $categories</span>)
</span>{
    $posts = <span class="hljs-keyword">new</span> $posts();

    $filter = [];
    $filter[] = [<span class="hljs-string">"condition"</span> =&gt; <span class="hljs-string">"slug = '<span class="hljs-subst">{$slug}</span>'"</span>,
                 <span class="hljs-string">"type"</span> =&gt; <span class="hljs-string">"and"</span>];
    $filter[] = [<span class="hljs-string">"condition"</span> =&gt; <span class="hljs-string">"category = 'Holidays'"</span> ,
                 <span class="hljs-string">"type"</span> =&gt; <span class="hljs-string">"or"</span>];

    $filter = <span class="hljs-keyword">$this</span>-&gt;buildFilter($filter);


    $posts-&gt;select(<span class="hljs-string">"title,excerpt,slug,content"</span>)
        -&gt;where($filter)
        -&gt;asResult();
}
</code></pre>
<p>So here's how I've tackled the issue of building out the filter conditions. I create a long string and add the Condition specified in the $filter array (above code).</p>
<p>An important bit is that I don't add the condition when the $where variable is empty.</p>
<pre><code class="lang-php"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">buildFilter</span>(<span class="hljs-params"><span class="hljs-keyword">array</span> $filters</span>)
</span>{
    $where = <span class="hljs-string">""</span>;

    <span class="hljs-keyword">foreach</span> ($filters <span class="hljs-keyword">as</span> $filter)
    {
        <span class="hljs-keyword">switch</span> (<span class="hljs-literal">true</span>)
        {
            <span class="hljs-keyword">case</span> ($filter[<span class="hljs-string">"type"</span>] == <span class="hljs-string">"and"</span>):
                (<span class="hljs-keyword">empty</span>($where))
                ? $where = $filter[<span class="hljs-string">"condition"</span>] <span class="hljs-comment">//true don't add AND</span>
                : $where .= <span class="hljs-string">"AND <span class="hljs-subst">{$filter["condition"]}</span>"</span> <span class="hljs-comment">//2nd value add the AND</span>
                ;
            <span class="hljs-keyword">case</span> ($filter[<span class="hljs-string">"type"</span>] == <span class="hljs-string">"or"</span>):
                (<span class="hljs-keyword">empty</span>($where))
                ? $where = $filter[<span class="hljs-string">"condition"</span>]
                : $where .= <span class="hljs-string">"AND <span class="hljs-subst">{$filter["condition"]}</span>"</span>
                ;
        }
    }

    <span class="hljs-keyword">return</span> $where;
}
</code></pre>
<p>That's all there is to it.</p>
]]></content:encoded></item><item><title><![CDATA[Importance of Offline Documentation]]></title><description><![CDATA[So I know we can Google documentation for just about anything. But I often find I use way more clicks than I need to find the exact version of documentation I'm looking for. 
Using ZealDocs is a great time-saver instead of having to look up documenta...]]></description><link>https://barcovanrhijn.hashnode.dev/importance-of-offline-documentation</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/importance-of-offline-documentation</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:49:00 GMT</pubDate><content:encoded><![CDATA[<p>So I know we can Google documentation for just about anything. But I often find I use way more clicks than I need to find the exact version of documentation I'm looking for. </p>
<p>Using ZealDocs is a great time-saver instead of having to look up documentation for things like HTML, Bootstrap, PHP, JS and more.</p>
<p>The added bonus is that you have documentation to continue coding if your Internet connection goes down. </p>
<p>Another technique has been to reference documentation from the IDE. I've used Jetbrains IDEs extensively for simple reference as I type.</p>
<p>But every, so often I'm looking for full reference and zeal is just perfect for that. </p>
<p>Download <a target="_blank" href="https://zealdocs.org/">ZealDocs here</a></p>
]]></content:encoded></item><item><title><![CDATA[How much JS is enough?]]></title><description><![CDATA[There's been a growing trend towards Front-end JS frameworks in the past years. I think these frameworks have their uses. 
But I don't think Frameworks like React, Vue and Angular always make sense for every project. For me it all comes down to simpl...]]></description><link>https://barcovanrhijn.hashnode.dev/how-much-js-is-enough</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/how-much-js-is-enough</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:48:49 GMT</pubDate><content:encoded><![CDATA[<p>There's been a growing trend towards Front-end JS frameworks in the past years. I think these frameworks have their uses. 
But I don't think Frameworks like React, Vue and Angular always make sense for every project. For me it all comes down to simplicity and getting work out the door close to budget. </p>
<p>In adopting VUE and REACT I've noticed that we're effectively doing in JS what a Back-end language like Python, PHP, Node or Ruby would do rather well. 
So effectively we're duplicating the role and relegating the back-end to an API with a Database connection.</p>
<p>So now we have routers and state etc all running in the front end. No matter how you spin it, running business logic in the front end is a bad idea. 
As a result you're going to need a bit of both on such a project to keep sensitive data out of your front-end code. On some projects this can make perfect sense.</p>
<p>Then we have the issue of State which becomes rather complex when you're trying to run a webserver in the browser. All of which is perfectly liable to drive you to more abstraction.</p>
<p>Then there's the issue of how heavy things become after a bit. So if you've been writing a bit of VUE or REACT you reach a point where there's too much JS to be practical.
So you need to render down to HTML on the Server side and then just bring in dynamic bits. So effectively you're using React and VUE as a backend and front-end language at that point.
Unless you're doing something rather special this is no different from using AJAX and a Back-end language. Except that you've now moved all your code into JS and added heaps of complexity into the mix.</p>
<p>So am I saying front-end frameworks are bad? Not necessarily, but you do have to consider the budget implications of writing more code to do the same thing. For me the benefits don't generally outweigh the cost of doing so just yet.</p>
<h2 id="heading-when-id-use-a-front-end-framework">When I'd use a front-end Framework</h2>
<p>There are cases where a front-end framework makes complete sense. </p>
<ul>
<li>You want a highly interactive site. </li>
<li>You're not concerned with how much data your end user will need on his mobile phone. React and Vue make API calls just a bout every second. So unless you're using GraphML you're going to run up bill for your end user for sure.</li>
<li>You have a customer with a very large budget</li>
<li>You have a very large team </li>
</ul>
<h3 id="heading-thoughts-on-vue">Thoughts on VUE</h3>
<p>I've used React but have come to enjoy the syntactic sugar Vue adds on top of all this. In my opinion it's the most approachable of the Front-end frameworks. 
It's ability to add interactivity in your code without taking over your codebase until unless a page's complexity warrants it, is a sure win.</p>
<h2 id="heading-when-id-just-drop-in-bits-of-js-for-interactivity">When I'd just drop in bits of JS for interactivity.</h2>
<p>On an average project you may just need a little interactivity. Similar interactivity can be achieved with a little JS or Jquery or another JS library without making things more complex than they really need to be.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Each project is different, but in the end it comes down to what makes sense. If you are able to keep things simple you can deliver more of what the client wants and spend less time driving yourself to Abstraction.</p>
]]></content:encoded></item><item><title><![CDATA[Tina4 we meet again]]></title><description><![CDATA[A number of years have passed since I first saw the Tina4 stack. Tina4 officially strives not to be a framework. So rather call a collection of best practices for PHP but soon other languages as well. 
I recall the Manga graphics and names to differe...]]></description><link>https://barcovanrhijn.hashnode.dev/tina4-we-meet-again</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/tina4-we-meet-again</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:48:39 GMT</pubDate><content:encoded><![CDATA[<p>A number of years have passed since I first saw the <a target="_blank" href="https://tina4.com/documentation">Tina4</a> stack. Tina4 officially strives not to be a framework. So rather call a collection of best practices for PHP but soon other languages as well. </p>
<p>I recall the Manga graphics and names to different sections of the code back in 2014 when I first saw Tina4.</p>
<p>I've been working with Andre van Zuydam full time for the past 3 weeks. In this time I've gotten to know Tina4 toolset up close. </p>
<p>One of the key things that I've found striking is that Tina4 does not abstract work unnecessarily by adding NPM scripts. There are some Composer scripts for most Tina4 tasks. Everything else is done either in the browser or in PHP. 
Of course if you want to do Ajax you'll need to write some JS. </p>
<h2 id="heading-whats-included">What's included</h2>
<p>Out of the box Tina4 includes quick ways to get you up and running in a lightweight way when you want to build a new PHP app. Its installable with Composer. </p>
<p>Talking about includes. Tina4 makes in unnecessary to add include lines in any of your files.  </p>
<h3 id="heading-caching-by-default">Caching by default</h3>
<p>Caching is included out the gate with PHP Fast Cache. There's no config required.</p>
<h3 id="heading-sass-support">SASS Support</h3>
<p>No need to add extra build scripts unless you're building very complex SASS hierarchies. Drop you SASS in the SASS directory and run your APP. Your SASS builds to CSS without extra commandline tasks to manage.</p>
<h3 id="heading-migrations">Migrations</h3>
<p>Migrations in Tina4 are brought right back to SQL. It's been a pain point to me that many frameworks so abstract migrations that people forget that they are working with SQL.</p>
<p>In Tina4 you write your migrations in the browser which creates the required migration files that create a record in the migration database. Execute migrations by calling a migration endpoint in your browser. You see the output directly. Migration files are editable since they really only contain the SQL you entered the browser.
If you can write SQL you can do migrations immediately. This is a benefit that is easily overlooked unless you've felt the contortion caused by Frameworks that abstract migrations and other bits for the sake of abstraction. </p>
<h3 id="heading-env-support">ENV Support</h3>
<p>Naturally any modern workflow needs ENV support out the box. </p>
<h3 id="heading-routes">Routes</h3>
<p>Routes can be written in different files as long as they are stored in the Routes directory even if they are sorted in subdirectories. This makes managing routes much simpler in practice. </p>
<p>Routing in Tina4 is similar to what you'd get to know in Frameworks like Laravel. You should remember that Tina4 is a much lighter stack in kb not features. </p>
<h3 id="heading-orm">ORM</h3>
<p>The Tina4 ORM supports Firebird, Mysql, Sqlite right out the gate. So expect very similar syntax for each Database you interface with</p>
<p>If you write your database column names according to convention then you get to include very minimal information in an ORM class.</p>
<pre><code>$firstName = <span class="hljs-string">"Bob"</span>
$user = (<span class="hljs-keyword">new</span> User())-&gt;select(<span class="hljs-string">"*"</span>)
                    -&gt;<span class="hljs-keyword">from</span>(<span class="hljs-string">"user"</span>)
                    -&gt;where(<span class="hljs-string">"first_name = {$firstName}"</span>)
                    -&gt;asArray();
</code></pre><h3 id="heading-api">API</h3>
<p>Consuming and generating API's are easy in Tina4. </p>
<h4 id="heading-consuming-api">Consuming API</h4>
<p>Tina4 Comes with API functions that make consuming rest endpoints as simple as can be. Even easier than using Javascript Fetch(). And you can still use JS Fetch if it catches your fancy.</p>
<h4 id="heading-creating-an-api">Creating an API</h4>
<p>Tina4 comes with a one line CRUD generator that you include in a new API endpoint file. Once you fire up the app in the browser Tina4 scaffolds all the crud routes for an ORM Object onto the API endpoint of your choice. 
One line of code, and your API works out the box. It's all still written in PHP.</p>
<p>ORM classes cleverly extends to CRUD routes that are widely used in Tina4 to create API's with a single line of code.
A CRUD route is linked to an ORM object, if you post a form containing inputs that match the ORM fields you don't need to write any code to create or update records.
This works so seamlessly that at first glance it almost feels like magic.</p>
<h3 id="heading-templates">Templates</h3>
<p>Templates are elegantly integrated in Tina4 using Symphony's Twig template engine with some custom work where it matters. </p>
<p>Templates can run without any routing if there is no route with the same name. This makes for convenient testing and less hassle when you have a route that really only serves up a page. </p>
<h3 id="heading-html-functions">HTML Functions</h3>
<p>Tina4 includes a library of php functions that can generate HTML right out the box. </p>
<p>There's an underscored function for every HTML class imaginable. So you literally can generate valid HTML from code</p>
<h3 id="heading-admin-dashboard">Admin Dashboard</h3>
<p>Tina4CMS is probably the best kept secret when it comes to Tina4. It creates a fully functional Admin Dashboard with minimal lines of code. 
You get Templates and Crud Grids generated with create, edit, delete, search and export out the gate.</p>
<p>Login is included as well out the box to get your Admin Dash functional as soon as possible. With a little tweaking your Admin dashboard works exactly like you want it.</p>
<h3 id="heading-ajax">Ajax</h3>
<p>Tina4 comes with a JS helper library to post and get page parts, modals and more from api endpoints</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Simplicity is the ultimate complexity. Tina4 is a flexible and rapid starting point to any PHP project. As I've worked with it I'm fascinated by how simple Tina4 makes things that are often very complex in the PHP world. </p>
<p>If you've been frustrated with how Frameworks abstract things away too far, Tina4 is a good place to invest your time. 
There's a Slack group where the community join in and ask and answer questions. Along with Documentation on how Tina4 works.</p>
<p>I've been contributing to expanding the documentation in the past 3weeks. </p>
<p>I'll be posting some insights on the blog. So keep an eye for more on this soon.</p>
]]></content:encoded></item><item><title><![CDATA[Email Template design]]></title><description><![CDATA[Email template design has always been a particularly tricky spot when it comes to mail client support.
Recently a client asked me to design them a template for a signature with complex overlapping images. On the web that's a very easy thing to do. Bu...]]></description><link>https://barcovanrhijn.hashnode.dev/email-template-design</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/email-template-design</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:48:27 GMT</pubDate><content:encoded><![CDATA[<p>Email template design has always been a particularly tricky spot when it comes to mail client support.</p>
<p>Recently a client asked me to design them a template for a signature with complex overlapping images. On the web that's a very easy thing to do. But in the email space layers are poorly supported. </p>
<h2 id="heading-quirky-mail-clients">Quirky Mail clients</h2>
<p>Even after years I still find it odd that mail clients have grown more quirky in their support of web standards. We're all still coding like it's the late 90's for email. </p>
<p>It's 2021 and we're really in need more modern features on email clients. But the thing we need most is standardized support between mail clients.</p>
<p>Interestingly Mozilla just dropped several critical CSS features that enabled responsive designs. So Responsive mail now gets to display in mobile view on Thunderbird. Luckily that's a small portion of the market right now. </p>
<p>Outlook has also not grown as much as I'd hoped over the past decade. But clearly still takes the lead on the Desktop front. </p>
<p>Although the recent widespread Exchange server hacks gives reason for pause if you where the admin. But I digress.</p>
<h2 id="heading-should-i-embed-link-attach-that-image">Should I embed, link, attach that image?</h2>
<p>Most notably embedding, attaching or linking images is supported by differently accross email clients with links being best supported and most hidden due to "privacy warnings".</p>
<h2 id="heading-kiss">KISS</h2>
<p>Bottom line. When it comes to email design you can go to the moon and back if you've got the budget. Otherwise keeping to highly supported simpler layouts will come back in budget every time.</p>
<p>This reminds me of a good project principle. </p>
<blockquote>
<p>Cheap, Good, Fast. Pick two.</p>
</blockquote>
<h2 id="heading-some-neat-posibillities">Some neat posibillities</h2>
<p>I do still create some pretty neat things these days in email though, like including sliders and menus and faq sections in mail. And buttons that work right out the gate. So it's not all lost.</p>
<p>However my most favorite email feature is still conscise writing and good formatting. Without this foundation it's pretty hard to build a good mail.</p>
]]></content:encoded></item><item><title><![CDATA[SEO in a mobile first world]]></title><description><![CDATA[It's official! Mobile Performance affects rankings. Since Jan 2020 Google now considers the mobile view of your page as a large factor to your SEO score.
This is hardly surprising since so many users browse the web from their phones. 
Recent case stu...]]></description><link>https://barcovanrhijn.hashnode.dev/seo-in-a-mobile-first-world</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/seo-in-a-mobile-first-world</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:48:15 GMT</pubDate><content:encoded><![CDATA[<p>It's official! Mobile Performance affects rankings. Since Jan 2020 Google now considers the mobile view of your page as a large factor to your SEO score.</p>
<p>This is hardly surprising since so many users browse the web from their phones. </p>
<h3 id="heading-recent-case-study">Recent case study</h3>
<p>On a recent e-Commerce project the statistic was close to 90% of visitors. </p>
<h3 id="heading-conversion-still-a-challenge">Conversion still a challenge</h3>
<p>Obviously this is hard to ignore although conversion on mobile is an interesting thing to consider with such limited screen space. </p>
<p>And the fact that mobile only users are often only slightly Digitally literate.</p>
<p>All people muddle their way through the web but when it comes to Mobile users they are the ultimate muddlers from my observation.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>So as of 2021 if you're site performs poorly on mobile it will start affecting your rankings negatively. </p>
<p>It's clearly time to rethink &amp; rework out Apps and Sites. While we at it a good dose of UX wouldn't hurt SEO or users either.</p>
<p>Just my two cents...</p>
]]></content:encoded></item><item><title><![CDATA[Delving into TypeScript - first impressions]]></title><description><![CDATA[I discovered recently that Ionic have made VueJs quite a priority on their development line-up. And since I've got a new project lined up I decided to dig in and see what they've got. 
I've always liked the concise syntax to VueJs over ReactJs so I d...]]></description><link>https://barcovanrhijn.hashnode.dev/delving-into-typescript-first-impressions</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/delving-into-typescript-first-impressions</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:48:05 GMT</pubDate><content:encoded><![CDATA[<p>I discovered recently that Ionic have made VueJs quite a priority on their development line-up. And since I've got a new project lined up I decided to dig in and see what they've got. </p>
<p>I've always liked the concise syntax to VueJs over ReactJs so I decided to give the two a go together.</p>
<p>Some early previews of the app working with working API intergration.
<img src="assets/images/picking-screen.png" alt="alt Work Picking Screen" />
<img src="assets/images/screenshot_2021-01-18-app.png" alt="alt Work Overview" /></p>
<h2 id="heading-ionic-vue-comes-with-ts">Ionic Vue comes with TS</h2>
<p>So with VueJS and Ionic came a recommendation to keep Typescript. And so my journey began Mid Jan 2021 with types. </p>
<p>It's not been all love at first bite but after delving into a 60min crash course I've been able to survive the first few days. The promised gains seem worth the pain.</p>
<p>My first few days have come with intense pain though. After coding for a few days I kept running into Type errors that I did not quite know how to solve. </p>
<p>Initially it seemed that TS is the roadblock to getting any code to work. I'd write out perfect JS and it would fall on it's face every time. Test it outside of TS and it works flawlessly. </p>
<p>And after spending a few days chasing Type errors I decided to dig deeper as there has to be something I missed initially. </p>
<h2 id="heading-a-few-lessons-learned">A few lessons learned</h2>
<h3 id="heading-run-time-errors-with-ts-and-ionic-sometimes-show-skewed-line-numbers">Run-time errors with TS and Ionic sometimes show skewed line numbers.</h3>
<p>This seems to be a current bug relating to SFC in VueJS. My Temporary work around has been to code with hot reload and fix errors immediately before proceeding. It's a better way of coding that leads to better productivity any way. </p>
<h3 id="heading-git-is-your-friend">Git is your friend</h3>
<p>When line numbers go fuzzy and minutes go by. It's often easier to revert a small change and start it again. Since we've got git might as well put it to good use.</p>
<h3 id="heading-types-are-easy">Types are easy</h3>
<p>The fundamentals of Types are not hard. But you need to give you brain some time to absorb the implications in code. </p>
<p>Most of TS is really just JS and you can actually partially implement TS in a project.</p>
<p>Essentially Types are a way of documenting expected data types and values for</p>
<ul>
<li>variables</li>
<li>arrays </li>
<li>objects. </li>
</ul>
<p>There's much debate around this but the simplest way is that you should only use Interfaces for Objects. For all the rest use type definitions.</p>
<h3 id="heading-bypass-types-in-a-pinch">Bypass Types in a pinch</h3>
<p>In a pinch you can define the type as Any. But this should be used with caution as it sort of negates the benefits of using TS in the first place.</p>
<h2 id="heading-sage-advice">Sage Advice</h2>
<p>As a Senior Ionic Dev pointed out types are mostly inferred in Ionic and you'll run into type issues if you're trying to do something too radical.</p>
<h2 id="heading-wrap-it-up">Wrap it up</h2>
<p>Looking forward to seeing how TS will improve my development experience. I already enjoy the variable hinting TS introduces in VS Code. </p>
]]></content:encoded></item><item><title><![CDATA[Booting up my personal Blog]]></title><description><![CDATA[I've been keeping notes of projects for some time. And have meant to publish this for the benefits of others to learn from some of the experiences I've had. And to share some of my though process.
So Here goes....
Github, Meet Jekyl
To get a Github p...]]></description><link>https://barcovanrhijn.hashnode.dev/booting-up-my-personal-blog</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/booting-up-my-personal-blog</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:47:54 GMT</pubDate><content:encoded><![CDATA[<p>I've been keeping notes of projects for some time. And have meant to publish this for the benefits of others to learn from some of the experiences I've had. And to share some of my though process.</p>
<p>So Here goes....</p>
<h2 id="heading-github-meet-jekyl">Github, Meet Jekyl</h2>
<p>To get a Github pages site up you need to start a repo with your username.githubpages.com. You'll find the the <a target="_blank" href="https://pages.github.com/"> getting started with github pages </a>.</p>
<h2 id="heading-can-you-say-jekyll">Can you say Jekyll?</h2>
<p>This site is based of Jekyll which is a Jamstack site framework built with Ruby on Rails. It's Github's recommended default although you can use things like Hugo or others. I like the simplicity of Jekyll which allows for maximum design expression with little fuss. </p>
<p>Jekyll speaks HTML, Markdown, JSON and more. It's a fantastic way to get technical content up if you don't need a back-end. </p>
<h2 id="heading-where-do-i-put-images-in-jekyll">Where do I put images in Jekyll</h2>
<p>Under the main Assets folder. The _site folder is generated on build in Jekyll.</p>
<h2 id="heading-adding-classes-in-jekyll-markdown">Adding classes in Jekyll Markdown</h2>
<p>Just add your classes like this</p>
<pre><code>{: .rounded .image}

![alt text](logo.png <span class="hljs-string">"Title"</span>)
</code></pre><p>This will render out the image tag with the classes you specified.</p>
<h2 id="heading-ready-set-launch">Ready Set Launch</h2>
<p>Write, Build, Git Push and we're off to a beautiful friendship.</p>
]]></content:encoded></item><item><title><![CDATA[Hello Ruby]]></title><description><![CDATA[I've been hearing about Ruby on Rails for some years. But I've been skeptical about the amount of moving parts (Magic) that are introduced by Ruby and Rails in the process of development. So this year I decided to test it out for myself in the holida...]]></description><link>https://barcovanrhijn.hashnode.dev/hello-ruby</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/hello-ruby</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:47:43 GMT</pubDate><content:encoded><![CDATA[<p>I've been hearing about Ruby on Rails for some years. But I've been skeptical about the amount of moving parts (Magic) that are introduced by Ruby and Rails in the process of development. So this year I decided to test it out for myself in the holidays.</p>
<p>In 2020 I've built out a small Project in Laravel that handles Reseller packages and Pricing for B2B. It feels familiar coming from the Javascript side of things. I also discovered that Laravel combines ideas from JS and Ruby.</p>
<p>One of the Developers I follow online mentioned what they've been doing on Ruby and I was intrigued to take a look. Well I spent a today and learned the basics.</p>
<p>So far I like that Ruby is similar in it's ability to scaffold various parts of an application. After learning how that works it no longer seems like a Ruby Project can spin out of control. </p>
<h1 id="heading-what-i-like">What I like</h1>
<ul>
<li>I like how easy CRUD is with Ruby - feels like Laravel.</li>
<li>The stack feels less fragmented than JS stacks do.</li>
<li>The language so far seems enjoyable.</li>
</ul>
<h1 id="heading-what-i-may-have-to-learn-to-love">What I may have to learn to love</h1>
<ul>
<li>Deployment of Ruby projects seem to be a bit more complicated than PHP but not so much more complicated than Node.js apps. I manage several VPS' running production code. So It's not insurmountable to deploy.</li>
</ul>
<h1 id="heading-what-i-learned">What I learned</h1>
<ul>
<li>Intalling a Ruby Development environment
Learned that this part of Ruby on Windows can be tricky and how to get it done. </li>
<li>Ruby MVC and Project structure
The Ruby project Structure is remarkably easy to understand coming from Laravel</li>
<li>Routing with Ruby
Routing uses </li>
<li>Variables in Ruby
Ruby variables are just words like in Bash unless you want to increase their scope. Variables passed from controller to page are written @variable</li>
<li>Finding and Using Gems</li>
<li>Defining production vs development gems</li>
<li>Controllers in Ruby
Controllers are </li>
<li>Migrations and Databases in Ruby</li>
<li>Production v.s. Development configs</li>
<li>Creating CRUD forms in Ruby</li>
<li>Add custom styling to Ruby elements </li>
<li>Use Devise to create login and profile pages</li>
<li>Database Associations</li>
<li>Controllers beyond basic Crud</li>
<li>Deploying Ruby code to git and Heroku</li>
</ul>
<h1 id="heading-wrap-up">Wrap up</h1>
<p>Getting my feet wet with Ruby has been a good experience that has broadened my thinking. I love how simple the syntax is. And I'm looking forward to use some of the insights gained in other languages.</p>
<p>I may just build out a next personal project in Ruby for fun.</p>
]]></content:encoded></item><item><title><![CDATA[Vanilla PHP]]></title><description><![CDATA[Another PHP developer approached me about collaborating on a Vanilla PHP project. His requirement was for us to work according to his Php standard. 
Our Goal
Build a [template engine]{https://github.com/barcovanrhijn/sitebuilder} and Cms that work to...]]></description><link>https://barcovanrhijn.hashnode.dev/vanilla-php</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/vanilla-php</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:47:22 GMT</pubDate><content:encoded><![CDATA[<p>Another PHP developer approached me about collaborating on a Vanilla PHP project. His requirement was for us to work according to his Php standard. </p>
<h2 id="heading-our-goal">Our Goal</h2>
<p>Build a [template engine]{https://github.com/barcovanrhijn/sitebuilder} and Cms that work together through an Api connection.</p>
<p>The idea was building template engine that could be easily filled out with details to generate brand sites. </p>
<h2 id="heading-creating-a-design-system">Creating a Design System</h2>
<p>I asked to do the front-end generating code. I was inspired by how Atomic Design systems worked and decided to build out a template engine with some overlapping features with Twigg. </p>
<p>Since the requirements was that there be no dependencies I could not use Twigg or Handlebars or other such systems. </p>
<p>The project consisted of three parts. </p>
<ol>
<li>A UI that was customer facing and centrally manages all the site information and links (similar to a CMS backend).</li>
<li>Template builder which connects to the API and parses the Json into arrays and then outputs this in a template.</li>
<li>The API defines several settings that makes the Customer facing builder allow simple UI configurations and style changes.</li>
</ol>
<p>I discovered that some of what I wanted to do to make the template more flexible is known as Meta programming. I discussed ways we could free the data model by moving to JsON in MySQL or MongoDB. Because after the first few days it became apparent that each new change in the data model introduced heaps of new work on both ends.</p>
<p>Moving the data model into JSON would actually allow dynamic assignment of some properties like classes. And would make implementing new classes and design features fairly easy. Allowing us to focus on getting to optimal designs for the front-end and back in a quicker time-frame.</p>
<p>It became clear that we needed a single language between the two code bases. I was starting to see a lot of variable assignment where I would reference a property on the API and rename it entirely.</p>
<p>So I came up with some naming conventions for different UI parts along with their properties. After we agreed on naming that made sense to both of us I documented this on a Wiki I'd started for our project. This in turn helped standardise the language in code and made it flow like good poetry.</p>
<p>I've always loved the simplicity of DokuWiki for such use cases.</p>
<p>I also started to get the sense that some of the design should be driven from the front end as it would allow more page flexibility for the template. </p>
<p>To fully enable this would require a more unlimited data model especially when it comes to how many rows and columns are involved in the final design.</p>
<h2 id="heading-meeting-php-unit">Meeting PHP Unit</h2>
<p>In the process of doing the work I decided to learn how to build unit tests in PHP. </p>
<p>I've just touched on the basics of doing this in Javascript after what I'd learned in FreeCodeCamp. But I'd not used this in PHP yet. </p>
<p>In the past I'd mostly customized PHP code or written small Wordpress plugins which did not have enough code to make Unit tests a viable option. </p>
<p>When I asked the developer I worked with it turned out that he had not used PHPUnit before,so I was on my own with this. </p>
<h2 id="heading-lessons-learned">Lessons learned</h2>
<ul>
<li>The project contributed valuable experience but the partnership was not well-matched.</li>
<li>When comparing notes I was producing 6 Months of output in 3 Weeks compared to the other dev's output. </li>
<li>I was putting out more hours and my workflow was more productive. </li>
<li>The structure of our agreement was a percentage based project partnership which does not support varying degrees of input very well.</li>
<li>I was teaching Git and local PHP setup techniques since he was still pushing changes through shared hosting web interface to view changes to the code base making collaboration painfully slow. </li>
<li>Cooperation could have worked but the nature of the partnership agreement did not account how much each person puts in. </li>
</ul>
<p>For future projects I'd favor an hourly fee or fixed monthly fee.</p>
<h2 id="heading-wrap-up">Wrap up</h2>
<p>In 3 Weeks I coded up my Vanilla PHP and produced a minimum viable product as part of an attempt to partner up with this PHP developer. </p>
<p>I had started with a blank canvas and PHP documentation and 5min worth of Sage advice on how we'd structure the app.</p>
<p>All in all the project could be refined a lot, but I'm <a target="_blank" href="https://github.com/barcovanrhijn/sitebuilder">pretty pleased with the outcome</a> given how short the development time-frame was. </p>
]]></content:encoded></item><item><title><![CDATA[Image Manipulation with Python]]></title><description><![CDATA[So an e-Ccommerce project I'm working with has hit a new requirement to create bulk vouchers images for clients that can be sent out using social media. 
We set out to create a template and fill it out with a loop. 
I chose Python3 for the task. Ther...]]></description><link>https://barcovanrhijn.hashnode.dev/image-manipulation-with-python</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/image-manipulation-with-python</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:47:12 GMT</pubDate><content:encoded><![CDATA[<p>So an e-Ccommerce project I'm working with has hit a new requirement to create bulk vouchers images for clients that can be sent out using social media. </p>
<p>We set out to create a template and fill it out with a loop. </p>
<p>I chose Python3 for the task. There are lots of libraries like Image Magic that have overlay systems. But this is done in Raster so the image will get re-compressed.</p>
<p>Then it hit me that SVG is really just an XML spec. And a great idea emerged. </p>
<ul>
<li>Add template tags like {{ name }} in a text box in an SVG file. </li>
<li>Do a plain find and replace on the file. </li>
<li>Convert to PNG with ChairoSVG</li>
</ul>
<h2 id="heading-wrap-up">Wrap up</h2>
<p>I ended up with a script that reads a template file and inserts fields from an Excel sheet. This can be extended further to run from within a PHP front end. But it works nicely as is.</p>
]]></content:encoded></item><item><title><![CDATA[Scraping Data with Python]]></title><description><![CDATA[So I reached a point where I needed to get data from a 3rd party portal to send on to customers. 
I've got access to the backend but there's no API so making the data useful in a customer context requires some hacking. 
I ended up going with the Pyth...]]></description><link>https://barcovanrhijn.hashnode.dev/scraping-data-with-python</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/scraping-data-with-python</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:47:01 GMT</pubDate><content:encoded><![CDATA[<p>So I reached a point where I needed to get data from a 3rd party portal to send on to customers. </p>
<p>I've got access to the backend but there's no API so making the data useful in a customer context requires some hacking. </p>
<p>I ended up going with the Python Requests library and used Xpath</p>
<pre><code># create sesson
session_requests = requests.session()
# extract CSRF token using xpath and lxml
login_url = <span class="hljs-string">"https://example.com/login.php"</span>
result = session_requests.get(login_url)
tree = html.fromstring(result.text)
authenticity_token = list(
set(tree.xpath(<span class="hljs-string">"//input[@name='loginSubmit']/@value"</span>)))[<span class="hljs-number">0</span>]

# login &amp; send payload
result = session_requests.post(
login_url,
data=payload,
headers=dict(referer=login_url)
)
</code></pre><h2 id="heading-lessons-learned">Lessons learned</h2>
<p>Load all the assets</p>
<ul>
<li><p>Interestingly it's important that you load all the assets (css and js) from the page to keep the scraper looking like a normal web client. Call it stealthy if you like.</p>
</li>
<li><p>Useful for legacy integration.
Scraping if not used maliciously can actually save lots of integration time. When dealing with legacy systems managed by 3rd parties it's an indispensable technique. </p>
</li>
<li><p>Consider the resource you're scraping
Always consider if the 3rd party is ok with you doing this. In my case I have permission to use the information.</p>
</li>
<li><p>Remember the CSRF token
CSRF tokens are a security measure to protect against bots. We're writing a scraping bot. But thankfully simpler forms are easy to submit - just include the CSRF token in the request after you identify and scrape it.</p>
</li>
</ul>
<p>-Chasing a moving target
Sites that change structure frequently are harder to scrape consistently. There will always be times when scraping breaks and needs re-adjustment.</p>
<h2 id="heading-next-challenge">Next Challenge</h2>
<p>Scraping JS table data.</p>
]]></content:encoded></item><item><title><![CDATA[HTML and CSS refresher]]></title><description><![CDATA[I decided to sign up for FreeCodeCamp as a refresher for Front End design skills. Been using several resources around the web like W3Schools while building customer and internal projects. 
But there has never been a way for me to Showcase what I know...]]></description><link>https://barcovanrhijn.hashnode.dev/html-and-css-refresher</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/html-and-css-refresher</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:46:51 GMT</pubDate><content:encoded><![CDATA[<p>I decided to sign up for FreeCodeCamp as a refresher for Front End design skills. Been using several resources around the web like W3Schools while building customer and internal projects. 
But there has never been a way for me to Showcase what I know. Plus I think it may be high time I run through everything from top to bottom. </p>
<p>I know much of this will be a review, but I've seen how learning, then sharing deepens knowledge. </p>
<p>So after first helping an intern with Front End design back in 2017 I've opened up a lot things I'd like to explore in Front End design. So I'm eager to jump in and get started. </p>
]]></content:encoded></item><item><title><![CDATA[The Ultimate Development Environment]]></title><description><![CDATA[I've been thinking about great Development setups for about 2 Decades. I've gotten very good at getting the most out of the Windows machines I've used. Windows7 has served me well over the years, and it's become a nice stable environment for the most...]]></description><link>https://barcovanrhijn.hashnode.dev/the-ultimate-development-environment</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/the-ultimate-development-environment</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:46:40 GMT</pubDate><content:encoded><![CDATA[<p>I've been thinking about great Development setups for about 2 Decades. I've gotten very good at getting the most out of the Windows machines I've used. Windows7 has served me well over the years, and it's become a nice stable environment for the most part.</p>
<p>So it finally happened this week. After Dabbling in Linux from 2008 I started running hosting servers and managing Linux servers for clients in 2013. But now in 2018 I finally found a very compelling reason to only work from Linux rather than dual boot.</p>
<h2 id="heading-some-background">Some background</h2>
<p>I started out my Career in the early 2000's in a small Software Development startup called P37 Solutions. </p>
<h2 id="heading-vb6-meets-travel-agencies">VB6 Meets Travel Agencies</h2>
<p>The company built out software predominantly in Visual Basic 6 and later C# for the Travel Industry to simplify bookings through Amadeus a travel network. </p>
<p>Amadeus was known to introduce a slew of virus infections into Travel agencies and general machines used to be air-gaped from the Amadeus machines. </p>
<h2 id="heading-the-virus-coliseum">The Virus Coliseum</h2>
<p>A Tech back then told me that once a machine hit around 2000-3000 virus infections it actually got more usable because the different viruses where competing for the same resources to the point that none of them had much success. These machines where so Virus Infected that you'd crash Windows by even attempting to clear anything up. I tried as a rookie, it was a pointless endeavour.</p>
<h2 id="heading-anything-was-possible">Anything was possible</h2>
<p>P37 built out Smaller projects like stock management systems. </p>
<p>It was an interesting time in tech. </p>
<ul>
<li>XML was just becoming a standard that would lead to PDF and HTML standards among others. </li>
<li>CSS1 was in its infancy, we had our first graduate Designer joining at the time. </li>
<li>Linux had not been thought up yet. And our Dev house had been toying with writing an OS. </li>
</ul>
<h2 id="heading-volunteering">Volunteering</h2>
<p>As a volunteer Part of my initial responsibilities in the Office was supporting Senior developers by rebuilding their the Windows 2000 and later XP machines. </p>
<p>Back then Dev machines would generally only remain reliable for 3-9months. </p>
<p>Developers where pushing these machines very hard and before XP. Testing Desktop software meant constantly adding DLL's and registry entries when installing and removing apps created heaps 
of clutter resulting in early Windows crashes.</p>
<h2 id="heading-fast-forward-3-months">Fast Forward 3 months</h2>
<p>I quickly got hired 3months later and promoted to building out UI, Debugging and supporting customers (remotely as soon as the first cellular networks landed).</p>
<p>The firm hired a replacement to take care of hardware &amp; OS maintenance while I stepped into a software &amp; support role.</p>
<p>In a few months I Administrated the Windows Servers that ran production code we built.</p>
<h2 id="heading-back-to-the-dev-stack">Back to the Dev Stack</h2>
<p>Back then the benchmark I set for rebuilding a Developer machine from Format to deployed was around 4hours. </p>
<p>This included all the tooling and custom components etc. that devs needed.</p>
<p>While it may sound long, most things where a manual process and this time cut the previous timeline by half. Deployment tooling &amp; OS automation have come a long way since then. Many installers did not have terminal extensions.</p>
<p>Plug and Play was jokingly referred to as Plug and Pray in the pre Windows7 world.</p>
<p>We're really spoiled in the modern OS by loads of automations we take for granted.</p>
<h2 id="heading-so-why-i-switched-to-linux">So why I switched to Linux</h2>
<h3 id="heading-windows-81-the-new-vista">Windows 8.1 the new Vista?</h3>
<p>With the introduction of Windows 8 looking much like the historic release of Windows Millennium, I was eager to see what 8.1 would bring. </p>
<p>But sadly 8.1 looked like another Vista release taking effectively double the Ram to boot up that Windows 8 did. </p>
<p>It was not a great situation since you need every ounce of Ram once you start emulating Android devices, or LAMP Servers for WebDevelopment. </p>
<h3 id="heading-back-to-windows-7">Back to Windows 7</h3>
<p>I moved back to Windows7 it's a nice stable environment that works reliably for several years unless you really maintain it poorly and mess it up.</p>
<h3 id="heading-trying-out-development-on-ubuntu">Trying out Development on Ubuntu</h3>
<p>I'd been dual booting Ubuntu for a while and found it a wonderful space for Web Development. I moved some of my Front End development to Ubuntu 18.04. it was going great! </p>
<h3 id="heading-upgrading-to-windows-10">Upgrading to Windows 10</h3>
<p>Windows 10 rolled around. It was more polished and reminded me of the early days of Windows7. At least it showed potential after it had been around a few months. </p>
<p>But it had one nagging issue. Forced updates was a mistake from the get go. Non-enterprise users where forced to become gineu pigs. </p>
<p>Microsoft had been culling its testing team for some years which has really reduced code quality. </p>
<h3 id="heading-the-ultimate-update-wipes-my-drive">The ultimate update wipes my drive</h3>
<p>Anyway fast-forward to Oct 2018. </p>
<p>KB4532693 rolled around, and I was one of the lucky ones to get my drive wiped. But this update in my case low level formatted the drive beyond repair and dropped all partitions including Ubuntu with it Kamakazi style. </p>
<h3 id="heading-windows7-crashes-weeks-after-install">Windows7 crashes weeks after install</h3>
<p>I moved back to Windows7 and somehow that installation was short-lived. It's a first experience after decades with Windows installations where I'd seen a double whammy.</p>
<h2 id="heading-ubuntu-the-start-of-a-beautiful-friendship">Ubuntu - the start of a beautiful friendship</h2>
<p>So this was the start of a beautiful friendship between me and my Ubuntu environment. </p>
<ul>
<li>It's fast and efficient. </li>
<li>Updates are small. </li>
<li>Redeploying after the crash is a dream. </li>
</ul>
<p>I'm up and running from backups with my Bitbucket repo's synchronized and entire development stack reinstalled in about 90min flat. </p>
<p>And on top of that almost everything a Web Developer could ever want is native. </p>
]]></content:encoded></item><item><title><![CDATA[Bitbucket & Git]]></title><description><![CDATA[Been looking at version control for some time. I’ve been doing small code and CSS fixes to sites for a few months. Built out simple Wordpress plugins. 
It has generally felt like learning to push such code to a Git repo would take more effort than re...]]></description><link>https://barcovanrhijn.hashnode.dev/bitbucket-and-git</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/bitbucket-and-git</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:46:28 GMT</pubDate><content:encoded><![CDATA[<p>Been looking at version control for some time. I’ve been doing small code and CSS fixes to sites for a few months. Built out simple Wordpress plugins. </p>
<p>It has generally felt like learning to push such code to a Git repo would take more effort than reward. But after I’ve looked at other version control systems out there like SVN I decided that Git is a clear winner in terms of enabling team work. 
Team work was the bit that really got me interested in Git in the end.</p>
<h2 id="heading-the-intern">the Intern</h2>
<p>Recently had a Grad Student make contact for Internship. He’s a friend of a friend which made for a nice warm introduction. He’s about to finish his degree but has gotten stuck in the Job readiness department. </p>
<p>I’ve been looking at ways for us to collaborate remotely when we can’t work in person.</p>
<p>I ended up going with </p>
<ul>
<li>Asana</li>
<li>Bitbucket </li>
<li>Slack 
as our remote work stack. And we’ve just heading into a new project together.</li>
</ul>
<p>We’ve taken quite some time going over Wordpress themes and setup for Web design. </p>
<p>Also moved my Development environment over to Ubuntu from Windows7 after dabbling in Windows8 then 8.1 then 10.</p>
<p>After careful consideration I actually enjoy using Bitbucket it’s got more functionality and is more integrated with Atlassian’s Development tool-set. </p>
<p>It’s been fairly easy to onboard an Intern. All it took was writing some walk-throughs and links to relevant docs and we’re all set. Shared this on our Wiki, and everyone was on the same page quickly.</p>
<p>Will be re-looking Github again in the future.</p>
]]></content:encoded></item><item><title><![CDATA[Atomic Design]]></title><description><![CDATA[I’ve recently enjoyed learning about Atomic design. It’s really broadened my thinking in terms of how I plan out design. 
Some of the smaller projects like themes for Wordpress sites of small Businesses don’t really have the budget to invest in desig...]]></description><link>https://barcovanrhijn.hashnode.dev/atomic-design</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/atomic-design</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:46:18 GMT</pubDate><content:encoded><![CDATA[<p>I’ve recently enjoyed learning about Atomic design. It’s really broadened my thinking in terms of how I plan out design. </p>
<p>Some of the smaller projects like themes for Wordpress sites of small Businesses don’t really have the budget to invest in design systems. </p>
<p>I think as time goes on more businesses will start to think this way. But right now Small business is stuck in the design, neglect, abandon and redesign cycle. 
This really alienates end users who really resent having to re-learn how to use a site they love.</p>
<p>My take-away from this is moving consistently and incrementally in a design. And thinking in layers</p>
<p>And I'm looking forward to taking on larger projects that have room for the gains caused by getting everything consistent.</p>
<p>If you've not come across <a target="_blank" href="https://atomicdesign.bradfrost.com/">Brad Frost's Atomic Design</a> you should really read it! It's a wonderful way to think of design as components. </p>
]]></content:encoded></item><item><title><![CDATA[Working Remotely]]></title><description><![CDATA[A family crisis pushed me into moving to fully remote work for the first time in 2014. After some initial planning I've realized that I could actually pull it off without significant impact on my current customers and contracts. 
I bounced the idea o...]]></description><link>https://barcovanrhijn.hashnode.dev/working-remotely</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/working-remotely</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Tue, 15 Nov 2022 14:46:06 GMT</pubDate><content:encoded><![CDATA[<p>A family crisis pushed me into moving to fully remote work for the first time in 2014. After some initial planning I've realized that I could actually pull it off without significant impact on my current customers and contracts. </p>
<p>I bounced the idea off a smaller client, but her level of alarm was enough to make me decide not to cause any customers undue panic. Interestingly I was able to turn this around and the customer never left.
So I set off and moved 1000km away from most customers I worked with. </p>
<p>Initially it was hard work to keep up communications in ways that compensated for my lack of presence. Lots of phone calls and emails followed to keep project communications going.
It became clear that the traditional tooling used when you have Face to Face contact is not really sufficient in remote interactions. </p>
<p>Strong trust relationships built with customers prior to the move made this a lot easier. I scheduled visits once in 6months to larger projects to just re-enforce the human connection. But as time moved on I was able to move to yearly visits.</p>
<p>Oddly looking back after two years most customers never knew that I left. </p>
<p>The only piece of the puzzle I have yet to solve at this time has been how to convey the same warmth in the sales phase as an in person connection. On-boarding new remote customers has been a bit more tricky in practice.</p>
<p>We live and learn, I think there's room for improving our processes. But it's clear that many parts of work are ready to go remote.</p>
]]></content:encoded></item><item><title><![CDATA[Video Meetings]]></title><description><![CDATA[Many ideas in the Digital world begin by mimicing something that we've done on paper. 
Think email, Windows Desktop (copy of your desk), Files, folders. The list goes on. 
However every digital app starts it's life as a way to make life easier. 
Nota...]]></description><link>https://barcovanrhijn.hashnode.dev/video-meetings</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/video-meetings</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Mon, 25 Apr 2022 14:52:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/sW_BS0OVgv0/upload/v1668523863104/YtoARiyP_.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many ideas in the Digital world begin by mimicing something that we've done on paper. </p>
<p>Think email, Windows Desktop (copy of your desk), Files, folders. The list goes on. </p>
<p>However every digital app starts it's life as a way to make life easier. </p>
<p>Notably email made writing letters faster before that turned into a way to flood people with communications they can never read. My personal inbox tends to receive 50-200 emails per day of which a vast majority has newsletter content or system notifications. </p>
<p>Great filtering rules reduces the load sligthly. But over time we've realised that we don't write letters to people about everything and may even need to think about other ways of communication. </p>
<p>Enter SMS, Instant Messaging, Virtual Video Meetings, Project management solutions. 
All things considered each of these are worthy tools if used correctly. </p>
<p>What's started surfacing lately though is the overuse of Instant Messaging like Whatsapp for it's ability to show pressence and when people receive messages. The result has been that people expect faster and faster answers at all hours of the day. This can be especially challenging when work follows you on personal channels after hours. And I often see people suffering from feeling like they are always switched on (on call) - which can be exhausting.</p>
<p>To managers and business owners this initially sounds like a great deal since employees are always on call often without getting paid for that. But in time the quality of the work people do is determined by the quality of the rest they have. This is curiously why govenments have stringent laws about overtime. But I digress. Over time forcing employees to be always connected leads to either burned out employees or high staff turnover or both. Neither of which comes at a low cost to company. So in the end this kind of operation is shortsighted.</p>
<p>So then we created Business Instant Messaging with topics for every possible thing. That has kicked of nicely but often suffers from too many channels instead of one channel per project.</p>
<p>Imagine working on one project but commenting on certain parts of it in one channel then other parts in another channel. In exceptional cases I've seen 5-10 channels for what really is a project. </p>
<p>Let's relate this back to the real world. Would you move into a room to discuss a project then change rooms to discuss another aspect of the project and keep doing that for 60min each time you finish with one topic related to the project? That would be tiring and a bit nuts considering that everyone to who this is relevant would need to move to the new location with you.</p>
<p>However just like it's personal couterpart Business Instant messaging often comes with the expectation of immediacy.</p>
<p>In the digital world we often expect exactly than resulting in employees hopping channel to channel to make sure they don't miss crucial communications. This is known as chasing threads. And is a phenomenon where people are required to view all communications as it flies by just in case it relates to them.</p>
<p>On top of this decisions also get made in thread. So if you're not chasing the thread people may decide that you agreed because you've said nothing when this discussion was initiated. All of this is akin to discussing something in the hallway and making a decision on the spot based on who had proximity at the time.</p>
<p>And to some degree this may sound terribly productive. But when we look at the quality of work that gets produced I'm not so convinced we're on to a winning combination. </p>
<p>Everyting from Music, Art, Science and Technology is for the most part coasting on inventions that date back to the previous world war. And I hear you say Space Flight, Lithium Ion Batteries, Cellphones, Internet. But most of these things has had their origin in military necessity.</p>
]]></content:encoded></item><item><title><![CDATA[How to solve Github Amnesia]]></title><description><![CDATA[If you work with any technology long enough you get to see some quirks. 
In the recent couple of months I've started seeing something that I can only term Github Amnesia.
Often when I push up code it goes MIA. In some cases I've seen code refuse to g...]]></description><link>https://barcovanrhijn.hashnode.dev/how-to-solve-github-amnesia</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/how-to-solve-github-amnesia</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Thu, 28 Oct 2021 14:54:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/ULDjeyeQL08/upload/v1668524037849/DJNw4Qtl0r.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you work with any technology long enough you get to see some quirks. 
In the recent couple of months I've started seeing something that I can only term Github Amnesia.</p>
<p>Often when I push up code it goes MIA. In some cases I've seen code refuse to get marked as changed on a fresh Clone. In the end it became apparent that Origin had lost the plot.
So today I'll show you some strategies in dealing with this kind of thing. </p>
<p>Most people are quite a bit confused when they first see this. Some Devs still live in denial of the fact. So when you ask around the office it's almost assumed that the issue cannot possibly be git or Github.  And So I thought I'd write something about this in the hope that it can be useful to others who reach equally perplixing stages of git.</p>
<h2 id="heading-how-it-looks">How it looks</h2>
<ul>
<li>Commit the files. </li>
<li>Check that everything that's changed shows up. </li>
<li>Push confirm no errors are shown.</li>
</ul>
<pre><code class="lang-bash">git commit
git push
</code></pre>
<h3 id="heading-confirm-if-the-code-is-on-github">Confirm if the code is on Github</h3>
<p>If it's still missing try the next step</p>
<h3 id="heading-add-the-files-again-with-f">Add the files again with -f</h3>
<pre><code class="lang-bash">git add -f path/to/file
git push
</code></pre>
<h3 id="heading-confirm-if-the-code-is-on-github">Confirm if the code is on Github</h3>
<p>Copy your code folder elsewhere temporarily</p>
]]></content:encoded></item><item><title><![CDATA[How to compare strings in twig]]></title><description><![CDATA[Twig supports several operators that are similar to the ones in PHP. But often there are simplified versions like
PHP
// Exact match
if ($x === $y) 
? echo true 
: echo false
;

Twig
{% raw %}
{% if x is same as y %}
{% endraw %}]]></description><link>https://barcovanrhijn.hashnode.dev/how-to-compare-strings-in-twig</link><guid isPermaLink="true">https://barcovanrhijn.hashnode.dev/how-to-compare-strings-in-twig</guid><dc:creator><![CDATA[Barco van Rhijn]]></dc:creator><pubDate>Wed, 23 Jun 2021 14:56:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/uzPZuRXLu_Y/upload/v1668524194602/50QUTwZD-.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Twig supports several operators that are similar to the ones in PHP. But often there are simplified versions like</p>
<h3 id="heading-php">PHP</h3>
<pre><code class="lang-php"><span class="hljs-comment">// Exact match</span>
<span class="hljs-keyword">if</span> ($x === $y) 
? <span class="hljs-keyword">echo</span> <span class="hljs-literal">true</span> 
: <span class="hljs-keyword">echo</span> <span class="hljs-literal">false</span>
;
</code></pre>
<h3 id="heading-twig">Twig</h3>
<pre><code class="lang-twig">{% raw %}
{% if x is same as y %}
{% endraw %}
</code></pre>
]]></content:encoded></item></channel></rss>