<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Archive on Goncalo Pereira</title><link>https://goncalopereira.com/archive/</link><description>Recent content in Archive on Goncalo Pereira</description><generator>Hugo</generator><language>en-GB</language><lastBuildDate>Mon, 15 Jun 2026 14:03:26 +0100</lastBuildDate><atom:link href="https://goncalopereira.com/archive/index.xml" rel="self" type="application/rss+xml"/><item><title>Engineering a Digital Identity: AI-Driven Architecture for Personal Brand</title><link>https://goncalopereira.com/archive/multi-persona-framework/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/multi-persona-framework/</guid><description>&lt;p&gt;Analysis of my personal website revealed systematic technical debt: years of incremental patches, theme modifications, and content sprawl had created the type of architectural drift I routinely address in enterprise systems.&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#multi-persona-ai-framework-evaluation-methodology"&gt;Multi-Persona AI Framework: Evaluation Methodology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#data-foundation-professional-context-as-training-input"&gt;Data Foundation: Professional Context as Training Input&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#domain-driven-identity-architecture"&gt;Domain-Driven Identity Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#technical-stack-deliberate-constraints"&gt;Technical Stack: Deliberate Constraints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#decision-framework-example-homepage-layout-analysis"&gt;Decision Framework Example: Homepage Layout Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#advanced-framework-features-veto-authority--emergency-protocols"&gt;Advanced Framework Features: Veto Authority &amp;amp; Emergency Protocols&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#weighted-decision-matrix-domain-expertise-authority"&gt;Weighted Decision Matrix: Domain Expertise Authority&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#creative-technical-intersection-underserved-positioning"&gt;Creative-Technical Intersection: Underserved Positioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#methodology-replicable-framework"&gt;Methodology: Replicable Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#technical-implementation-analysis"&gt;Technical Implementation Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#framework-limitations-and-critical-analysis"&gt;Framework Limitations and Critical Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#migration-lessons-personal-and-professional"&gt;Migration Lessons: Personal and Professional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#technical-and-creative-roi"&gt;Technical and Creative ROI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#architecture-for-evolution"&gt;Architecture for Evolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#engineering-identity-ai-assisted-self-discovery"&gt;Engineering Identity: AI-Assisted Self-Discovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#next-continuous-improvement"&gt;Next: Continuous Improvement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="multi-persona-ai-framework-evaluation-methodology"&gt;Multi-Persona AI Framework: Evaluation Methodology&lt;/h2&gt;
&lt;p&gt;Rather than ad-hoc decision-making, I implemented a structured evaluation process where 12 specialized personas assessed architectural decisions across three functional domains:&lt;/p&gt;</description></item><item><title>Load Testing with K6</title><link>https://goncalopereira.com/archive/k6-load-testing/</link><pubDate>Fri, 14 Feb 2020 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/k6-load-testing/</guid><description>&lt;p&gt;At my current job we were looking at new ways to load test user journeys.&lt;/p&gt;
&lt;p&gt;As some of our code base is &lt;code&gt;nodejs&lt;/code&gt; we looked at tools that would allow us to dog feed into existing libraries and make it as easy as possible to add tests.&lt;/p&gt;
&lt;p&gt;We found &lt;a href="https://docs.k6.io/"&gt;K6&lt;/a&gt; allowed us to write &lt;code&gt;ES6 JS&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A journey represents a list of requests for a user story, they might or might not belong to the team as it represents a whole interaction.&lt;/p&gt;</description></item><item><title>Monitoring certificates on Windows and Linux with Splunk</title><link>https://goncalopereira.com/archive/certificates/</link><pubDate>Fri, 17 Jan 2020 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/certificates/</guid><description>&lt;p&gt;Trying to monitor expiring certificates on production instances, couldn&amp;rsquo;t find a lot of info so I wrote scripts that might be useful.&lt;/p&gt;
&lt;p&gt;Latest versions on &lt;a href="https://github.com/goncalopereira/CheckCertificates"&gt;https://github.com/goncalopereira/CheckCertificates&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="linux"&gt;Linux&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Linux
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6639ba"&gt;set&lt;/span&gt; -e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;LOG_FILE&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;/var/log/ExpiringCertificates-Monitoring.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;TMP_FILE&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;/tmp/tmpcert.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo touch &lt;span style="color:#953800"&gt;$LOG_FILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo truncate -s &lt;span style="color:#0550ae"&gt;0&lt;/span&gt; &lt;span style="color:#953800"&gt;$LOG_FILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;for&lt;/span&gt; i in &lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;sudo find /etc/pki/tls/private -type f -name &lt;span style="color:#0a3069"&gt;&amp;#34;*.pem&amp;#34;&lt;/span&gt;&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; &lt;span style="color:#cf222e"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;if&lt;/span&gt; &lt;span style="color:#0550ae"&gt;[[&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt; &lt;span style="color:#0550ae"&gt;==&lt;/span&gt; *.pem &lt;span style="color:#0550ae"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6639ba"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;Processing &lt;/span&gt;&lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo openssl x509 -enddate -startdate -issuer -subject -noout -in &lt;span style="color:#953800"&gt;$i&lt;/span&gt; &amp;gt; &lt;span style="color:#953800"&gt;$TMP_FILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;notAfter&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;grep notAfter &lt;span style="color:#953800"&gt;$TMP_FILE&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; cut -d &lt;span style="color:#0a3069"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f2-&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;validTo&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;date -d &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#953800"&gt;$notAfter&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt; +%d/%m/%Y&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;notBefore&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;grep notBefore &lt;span style="color:#953800"&gt;$TMP_FILE&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; cut -d &lt;span style="color:#0a3069"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f2-&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;validFrom&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;date -d &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#953800"&gt;$notBefore&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt; +%d/%m/%Y&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;issuer&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;grep issuer &lt;span style="color:#953800"&gt;$TMP_FILE&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; sed -e s/.*CN&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;//&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;subject&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;grep subject &lt;span style="color:#953800"&gt;$TMP_FILE&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; sed -e s/.*CN&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;//&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;hostname&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#cf222e"&gt;$(&lt;/span&gt;hostname&lt;span style="color:#cf222e"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6639ba"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#953800"&gt;$hostname&lt;/span&gt;&lt;span style="color:#0a3069"&gt;|&lt;/span&gt;&lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0a3069"&gt;|&lt;/span&gt;&lt;span style="color:#953800"&gt;$validTo&lt;/span&gt;&lt;span style="color:#0a3069"&gt;|&lt;/span&gt;&lt;span style="color:#953800"&gt;$validFrom&lt;/span&gt;&lt;span style="color:#0a3069"&gt;|&lt;/span&gt;&lt;span style="color:#953800"&gt;$issuer&lt;/span&gt;&lt;span style="color:#0a3069"&gt;|&lt;/span&gt;&lt;span style="color:#953800"&gt;$subject&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; sudo tee --append &lt;span style="color:#953800"&gt;$LOG_FILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;done&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windows"&gt;Windows&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$Path&lt;/span&gt; &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;D:\ExpiringCertificates-Monitoring.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$certs&lt;/span&gt; &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#6639ba"&gt;Get-ChildItem&lt;/span&gt; CERT&lt;span style="color:#f6f8fa;background-color:#82071e"&gt;:&lt;/span&gt;LocalMachine -Recurse &lt;span style="color:#1f2328"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6639ba"&gt;Where-Object&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#953800"&gt;$null&lt;/span&gt; &lt;span style="color:#0550ae"&gt;-ne&lt;/span&gt; &lt;span style="color:#953800"&gt;$_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;NotAfter &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6639ba"&gt;Where-Object&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#953800"&gt;$null&lt;/span&gt; &lt;span style="color:#0550ae"&gt;-ne&lt;/span&gt; &lt;span style="color:#953800"&gt;$_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;DnsNameList &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$list&lt;/span&gt; &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#953800"&gt;$certs&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; &lt;span style="color:#6639ba"&gt;Sort-Object&lt;/span&gt; NotAfter &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6639ba"&gt;Select-Object&lt;/span&gt; &lt;span style="color:#953800"&gt;@&lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;Name &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;ComputerName&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; Expression &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#953800"&gt;$_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;PSComputerName &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;@&lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;Name &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;FileName&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; Expression &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;@&lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;Name &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;ValidTo&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; Expression &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#953800"&gt;$_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;NotAfter&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;ToShortDateString&lt;span style="color:#1f2328"&gt;()&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;},&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;@&lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;Name &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;ValidFrom&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; Expression &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#953800"&gt;$_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;NotBefore&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;ToShortDateString&lt;span style="color:#1f2328"&gt;()&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Issuer&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;@&lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;Name &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;DnsName&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; Expression &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#953800"&gt;$_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;DnsNameList&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;Unicode &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$list&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; &lt;span style="color:#6639ba"&gt;Export-Csv&lt;/span&gt; -Delimiter &lt;span style="color:#0a3069"&gt;&amp;#39;|&amp;#39;&lt;/span&gt; -NoTypeInformation -Path &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#953800"&gt;$Path&lt;/span&gt;&lt;span style="color:#0a3069"&gt;+header&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#6639ba"&gt;Get-Content&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#953800"&gt;$Path&lt;/span&gt;&lt;span style="color:#0a3069"&gt;+header&amp;#34;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; &lt;span style="color:#6639ba"&gt;Select-Object&lt;/span&gt; -Skip &lt;span style="color:#0550ae"&gt;1&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; &lt;span style="color:#6639ba"&gt;Set-Content&lt;/span&gt; &lt;span style="color:#953800"&gt;$Path&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="splunk"&gt;Splunk&lt;/h2&gt;
&lt;h3 id="propsconf"&gt;props.conf&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-editorconfig" data-lang="editorconfig"&gt;[ExpiringCertificates-Monitoring]
FIELD_DELIMITER=|
FIELD_NAMES=ComputerName,FileName,ValidTo,ValidFrom,Issuer,DnsName
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="inputsconf"&gt;inputs.conf&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-editorconfig" data-lang="editorconfig"&gt;[monitor:///var/log/ExpiringCertificates-Monitoring.log]
sourcetype = ExpiringCertificates-Monitoring
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Good luck!&lt;/p&gt;</description></item><item><title>Leaving Medium.com</title><link>https://goncalopereira.com/archive/2019-06-18-sunsetting-medium/</link><pubDate>Tue, 18 Jun 2019 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/2019-06-18-sunsetting-medium/</guid><description>&lt;p&gt;Leaving Medium.com - Moving my content which gave it clicks over the years into my private blog.&lt;/p&gt;
&lt;p&gt;I made the move to Hugo a while back but now I&amp;rsquo;m moving the previous content.&lt;/p&gt;
&lt;p&gt;Leaving the Medium site up for backwards compatibility with other sites.&lt;/p&gt;
&lt;p&gt;&lt;img src="../../images/medium2019.png" alt="Medium Stats June 2019"&gt;&lt;/p&gt;
&lt;p&gt;I used this &lt;a href="https://github.com/bgadrian/medium-to-hugo"&gt;tool&lt;/a&gt; to help me write the Hugo posts.&lt;/p&gt;</description></item><item><title>Long overdue update</title><link>https://goncalopereira.com/archive/update-netlify/</link><pubDate>Wed, 21 Nov 2018 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/update-netlify/</guid><description>&lt;p&gt;Took a while but I finally got some back to updating the website.&lt;/p&gt;
&lt;p&gt;Updating to the latest version of &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; and the &lt;a href="https://themes.gohugo.io/minimo/"&gt;Minimo theme&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also moved from AWS onto &lt;a href="https://www.netlify.com"&gt;Netflify&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Static code now building on the platform, instead of committing the /public folder. And using a staging branch.&lt;/p&gt;
&lt;p&gt;Edit 22/11/2018: Contact Form&lt;/p&gt;</description></item><item><title>Mention on Advanced Docker image build patterns by Gareth Rushgrove</title><link>https://goncalopereira.com/archive/docker-presentation/</link><pubDate>Sat, 03 Nov 2018 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/docker-presentation/</guid><description>&lt;p&gt;We&amp;rsquo;ve been using Docker for our CI for the last year at &lt;a href="https://www.palaceskateboards.com/"&gt;Palace Skateboards&lt;/a&gt; and one of the most useful features is &lt;a href="https://docs.docker.com/develop/develop-images/multistage-build/"&gt;multi-stage build&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I mentioned it on Twitter and Gareth Rushgrove (Devops Weekly) ended up including it on his &lt;a href="https://conferences.oreilly.com/velocity/vl-eu"&gt;Velocify Conference&lt;/a&gt; presentation.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/garethr/advanced-docker-image-build-patterns"&gt;https://speakerdeck.com/garethr/advanced-docker-image-build-patterns&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PS. We&amp;rsquo;re hiring :)&lt;/p&gt;</description></item><item><title>Shopify Syncing with Webhooks and logging with AWS Athena and S3</title><link>https://goncalopereira.com/archive/2017-07-06_shopify-syncing-with-webhooks-and-logging-with-aws-athena-and-s3/</link><pubDate>Thu, 06 Jul 2017 09:05:30 +0000</pubDate><guid>https://goncalopereira.com/archive/2017-07-06_shopify-syncing-with-webhooks-and-logging-with-aws-athena-and-s3/</guid><description>&lt;p&gt;original posted on &lt;a href="https://medium.com/@pereiragoncalo/shopify-syncing-with-webhooks-and-logging-with-aws-athena-and-s3-3296a348277"&gt;medium&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;At my current project I’m developing an application that uses data from &lt;a href="https://developers.shopify.com/"&gt;Shopify&lt;/a&gt; for reporting, logistics, and others.&lt;/p&gt;
&lt;p&gt;To keep the application and Shopify in sync we trust Shopify’s Product and Order &lt;a href="https://help.shopify.com/api/reference/webhook"&gt;webhooks&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="syncing"&gt;Syncing&lt;/h3&gt;
&lt;p&gt;We trust Shopify is our &lt;a href="https://en.wikipedia.org/wiki/Single_source_of_truth"&gt;single source of truth&lt;/a&gt; and our application data will be &lt;a href="https://en.wikipedia.org/wiki/Eventual_consistency"&gt;eventually consistent&lt;/a&gt; by transferring those webhooks onto a queue ( &lt;a href="https://redis.io/"&gt;Redis&lt;/a&gt;) where the webhooks’ data will transfer to workers that will process it into our production database.&lt;/p&gt;</description></item><item><title>Development Quality for Ruby and Chef (DevOps Weekly #298)</title><link>https://goncalopereira.com/archive/2016-09-06_development-quality-for-ruby-and-chef/</link><pubDate>Tue, 06 Sep 2016 11:30:19 +0000</pubDate><guid>https://goncalopereira.com/archive/2016-09-06_development-quality-for-ruby-and-chef/</guid><description>&lt;p&gt;originally posted &lt;a href="https://medium.com/blog-goncalopereira-com/development-quality-for-ruby-and-chef-59ed7a3e94dc"&gt;medium&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A few years ago I wrote a small blog post about how to setup a local development environment for Chef using Vagrant and Test-Kitchen (you can see it &lt;a href="https://medium.com/@pereiragoncalo/setting-up-for-infrastructure-development-1ab67b721ff9#.3wc9qvfvs"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Lately I’ve been questioned about how to maintain a codebase through the years and how to work on/find quality metrics.&lt;/p&gt;
&lt;p&gt;A lot of people come from previous background where just vi/nano is required to lash out some code and moving to Ruby/Chef it seems only the language changed but there wasn’t much investment on better software development practices.&lt;/p&gt;</description></item><item><title>Icecast in Production (Devops Weekly #248)</title><link>https://goncalopereira.com/archive/2015-09-28_icecast-in-production/</link><pubDate>Mon, 28 Sep 2015 17:26:33 +0000</pubDate><guid>https://goncalopereira.com/archive/2015-09-28_icecast-in-production/</guid><description>&lt;p&gt;A few months ago I was asked to help out with an independent online radio — The radio had reached the limit of their current infrastructure and had lost their previous contractors.&lt;/p&gt;
&lt;h3 id="history"&gt;History&lt;/h3&gt;
&lt;p&gt;The radio started organically as a project between friends from their flat in London. From there they rented a local studio and set up a business broadband.&lt;/p&gt;
&lt;p&gt;They expanded to a few hundred listeners until the traffic was too much for their studio connection. Everything was done at the same place — Streaming through &lt;a href="http://www.icecast.org/"&gt;Icecast&lt;/a&gt; and play-listing through &lt;a href="https://www.sourcefabric.org/en/airtime/"&gt;Airtime&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>DigitasLBi Case Study on ComputerWeekly</title><link>https://goncalopereira.com/archive/digitaslbi-business-case-interview/</link><pubDate>Wed, 01 Apr 2015 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/digitaslbi-business-case-interview/</guid><description>&lt;p&gt;&lt;a href="http://www.computerweekly.com/feature/DevOps-spreads-into-mainstream-corporate-IT"&gt;Case Study on ComputerWeekly&lt;/a&gt;&lt;/p&gt;</description></item><item><title>CI and CD with Packer, Chef, AWS (Devops Weekly #187)</title><link>https://goncalopereira.com/archive/2014-07-30_continuos-integration-and-delivery-with-packerchefaws/</link><pubDate>Wed, 30 Jul 2014 20:20:28 +0000</pubDate><guid>https://goncalopereira.com/archive/2014-07-30_continuos-integration-and-delivery-with-packerchefaws/</guid><description>&lt;p&gt;originally posted on &lt;a href="https://medium.com/@pereiragoncalo/continuos-integration-and-delivery-with-packer-chef-aws-d29453d93382"&gt;medium&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://goncalopereira.com/archive/2014-07-30_continuos-integration-and-delivery-with-packerchefaws/images/1.jpeg" alt="image"&gt;&lt;/p&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;A few weeks ago I wrote an article about our current local setup with Chef and &lt;a href="http://kitchen.ci/"&gt;Test Kitchen&lt;/a&gt;. In there I introduced the workflow and stages of the process. Here I intend to explain in detail the different steps and a few of the reasons behind it.&lt;/p&gt;
&lt;h3 id="base-images"&gt;Base images&lt;/h3&gt;
&lt;p&gt;The first stage is around &lt;a href="http://www.packer.io/"&gt;Packer&lt;/a&gt;, which we use with Chef Solo to build different versions of RHEL with the same setup.&lt;/p&gt;</description></item><item><title>Setting Up for Infrastructure Development (Devops Weekly #179)</title><link>https://goncalopereira.com/archive/setting-up-for-infrastructure-development/</link><pubDate>Mon, 02 Jun 2014 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/setting-up-for-infrastructure-development/</guid><description>&lt;p&gt;&lt;a href="https://medium.com/@pereiragoncalo/setting-up-for-infrastructure-development-1ab67b721ff9"&gt;https://medium.com/@pereiragoncalo/setting-up-for-infrastructure-development-1ab67b721ff9&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Feedback loop from Logging and Monitoring to User Stories</title><link>https://goncalopereira.com/archive/2014-01-13_feedback-loop-from-logging-and-monitoring-to-user-stories/</link><pubDate>Mon, 13 Jan 2014 15:12:22 +0000</pubDate><guid>https://goncalopereira.com/archive/2014-01-13_feedback-loop-from-logging-and-monitoring-to-user-stories/</guid><description>&lt;h2 id="feedback-loop-from-logging-and-monitoring-to-user-stories"&gt;Feedback loop from Logging and Monitoring to User Stories&lt;/h2&gt;
&lt;h4 id="using-the-dashing-app-to-tie-our-current-monitoring-and-logging-data-back-to-original-user-stories-and-close-the-loop-intro"&gt;Using the Dashing app to tie our current monitoring and logging data back to original user stories and close the loop### Intro&lt;/h4&gt;
&lt;p&gt;During my &lt;a href="https://speakerdeck.com/goncalopereira/how-we-use-metrics-at-7digital"&gt;presentation last month&lt;/a&gt; I went through how we find issues in the services using our monitoring and logging platforms to track down specific cases.&lt;/p&gt;
&lt;p&gt;This information is useful when we have problems. How about when we want to better understand our users and fulfil their stories?&lt;/p&gt;</description></item><item><title>How we use Metrics at 7digital</title><link>https://goncalopereira.com/archive/how-we-use-metrics-at-7digital/</link><pubDate>Tue, 10 Dec 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/how-we-use-metrics-at-7digital/</guid><description>&lt;p&gt;Cross-Post &lt;a href="https://medium.com/@pereiragoncalo/how-we-use-metrics-at-7digital-8b1fa8062d4"&gt;https://medium.com/@pereiragoncalo/how-we-use-metrics-at-7digital-8b1fa8062d4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/goncalopereira/how-we-use-metrics-at-7digital"&gt;https://speakerdeck.com/goncalopereira/how-we-use-metrics-at-7digital&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="reading-list"&gt;Reading List&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Metrics, Metrics, Everywhere — Coda Hale&lt;/li&gt;
&lt;li&gt;The Art of Capacity Planning — John Allspaw&lt;/li&gt;
&lt;li&gt;Building Scalable Web Sites — Cal Henderson&lt;/li&gt;
&lt;li&gt;Thinking in Systems — Donella Meadows&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Installing Kale Skyline</title><link>https://goncalopereira.com/archive/2013-09-14_installing-kale-skyline/</link><pubDate>Sat, 14 Sep 2013 13:22:30 +0000</pubDate><guid>https://goncalopereira.com/archive/2013-09-14_installing-kale-skyline/</guid><description>&lt;p&gt;&lt;img src="https://goncalopereira.com/archive/2013-09-14_installing-kale-skyline/images/1.png" alt="image"&gt;&lt;/p&gt;
&lt;p&gt;London skyline / loveoflondon.tumblr.com&lt;/p&gt;
&lt;h2 id="installing-kale-skyline"&gt;Installing Kale Skyline&lt;/h2&gt;
&lt;h4 id="a-more-thorough-installation"&gt;A more thorough installation&lt;/h4&gt;
&lt;p&gt;At my current job we’re discussing using &lt;a href="http://codeascraft.com/2013/06/11/introducing-kale/"&gt;Skyline&lt;/a&gt; to track down anomalies. It’s something that came up frequently in talks as the amount of metrics being collected and the amount of knowledge around each of them is increasing.&lt;/p&gt;
&lt;p&gt;After checking the &lt;a href="https://github.com/etsy/skyline"&gt;project’s github account&lt;/a&gt; I felt the installation instruction were not clear enough and there were a few particular occasions that I got stuck for a while, browsing other forums I noticed more people struggling with its installation so here is a detailed step by step reproducible description that anyone can follow to try out Skyline!&lt;/p&gt;</description></item><item><title>My musings with Golang, Part 1</title><link>https://goncalopereira.com/archive/2013-09-13_my-musings-with-golang-part-1/</link><pubDate>Fri, 13 Sep 2013 10:23:30 +0000</pubDate><guid>https://goncalopereira.com/archive/2013-09-13_my-musings-with-golang-part-1/</guid><description>&lt;p&gt;originally posted on
&lt;a href="https://medium.com/@pereiragoncalo/my-musings-with-golang-part-1-c636e172beaf"&gt;medium&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://goncalopereira.com/archive/2013-09-13_my-musings-with-golang-part-1/images/1.png" alt="image"&gt;&lt;/p&gt;
&lt;p&gt;Renée French / Creative Commons Attribution 3.0&lt;/p&gt;
&lt;h2 id="my-musings-with-golang-part-1"&gt;My musings with Golang, Part 1&lt;/h2&gt;
&lt;h4 id="what-makes-life-easier"&gt;What makes life easier&lt;/h4&gt;
&lt;p&gt;As a lot of people in the industry I’ve been hearing about Golang since Google launched it a few years ago but it wasn’t until I saw this &lt;a href="http://blog.golang.org/concurrency-is-not-parallelism"&gt;video&lt;/a&gt; about concurrency and parallelism that I actually wanted to try it out.&lt;/p&gt;
&lt;p&gt;Although it looks very &lt;em&gt;low level&lt;/em&gt; from a first look (no classes and explicit pointers do remind me of C) it soon shows its benefits: Large number of libraries available, helpful user base, great performance, easy testing and for such a low level looking language it actually brings a lot of &lt;em&gt;high level&lt;/em&gt; features.&lt;/p&gt;</description></item><item><title>Installing Kale/Skyline</title><link>https://goncalopereira.com/archive/installing-kale-skyline/</link><pubDate>Fri, 13 Sep 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/installing-kale-skyline/</guid><description>&lt;p&gt;&lt;a href="https://medium.com/@pereiragoncalo/installing-kale-skyline-ca611f12be5b"&gt;https://medium.com/@pereiragoncalo/installing-kale-skyline-ca611f12be5b&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Logging with Logstash, ElasticSearch, Kibana and Redis</title><link>https://goncalopereira.com/archive/2013-08-06_logging-with-logstash-elasticsearch-kibana-and-redis/</link><pubDate>Tue, 06 Aug 2013 15:46:07 +0000</pubDate><guid>https://goncalopereira.com/archive/2013-08-06_logging-with-logstash-elasticsearch-kibana-and-redis/</guid><description>&lt;p&gt;&lt;img src="https://goncalopereira.com/archive/2013-08-06_logging-with-logstash-elasticsearch-kibana-and-redis/images/1.jpeg" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="logging-with-logstash-elasticsearch-kibana-and-redis"&gt;Logging with Logstash, ElasticSearch, Kibana and Redis&lt;/h2&gt;
&lt;h4 id="from-a-vagrant-image-to-a-working-application"&gt;From a vagrant image to a working application&lt;/h4&gt;
&lt;h4 id="introduction"&gt;Introduction&lt;/h4&gt;
&lt;p&gt;As a fan of metrics and of acquiring as much useful information as possible my go-to tool is Statsd and Graphite but when I need to drill down for more information either to provide business information or just to track down a bug I need to get quick access to all the logs related with a specific query. I need these logs to be parsed, centralised, filtered and ready to go.&lt;/p&gt;</description></item><item><title>Sentiment Analysis</title><link>https://goncalopereira.com/archive/sentiment-analysis/</link><pubDate>Mon, 01 Jul 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/sentiment-analysis/</guid><description>&lt;p&gt;&lt;a href="https://medium.com/@pereiragoncalo/sentiment-analysis-4b337cf493df"&gt;https://medium.com/@pereiragoncalo/sentiment-analysis-4b337cf493df&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Housekeeping</title><link>https://goncalopereira.com/archive/housekeeping/</link><pubDate>Wed, 12 Jun 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/housekeeping/</guid><description>&lt;p&gt;&lt;a href="https://medium.com/@pereiragoncalo/housekeeping-2af044fbc36d"&gt;https://medium.com/@pereiragoncalo/housekeeping-2af044fbc36d&lt;/a&gt;&lt;/p&gt;</description></item><item><title>a more pragmatic approach is to estimate the</title><link>https://goncalopereira.com/archive/a-more-pragmatic-approach-is-to-estimate-the/</link><pubDate>Mon, 13 May 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/a-more-pragmatic-approach-is-to-estimate-the/</guid><description>&lt;blockquote&gt;
&lt;p&gt;A more pragmatic approach is to estimate the potential impact that
stress can have on the outcome of an outage. To enable this, I’m in‐
troducing the concept of “stress surface,” which measures the percep‐
tion of the four relative stressors during an outage: the novelty of the
situation, its unpredictability, lack of control, and social evaluative
threat. These four stressors are selected because they are present dur‐
ing most outages, are known to cause a stress response by the body,
and therefore have the potential to impact performance.&lt;/p&gt;</description></item><item><title>consensus is an inaccurate measure of the</title><link>https://goncalopereira.com/archive/consensus-is-an-inaccurate-measure-of-the/</link><pubDate>Thu, 09 May 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/consensus-is-an-inaccurate-measure-of-the/</guid><description>&lt;p&gt;&lt;a href="https://engineering.indeed.com/blog/2013/05/indeedeng-data-driven-product-design-slides-video/"&gt;https://engineering.indeed.com/blog/2013/05/indeedeng-data-driven-product-design-slides-video/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>a complex devops solution understood only by an</title><link>https://goncalopereira.com/archive/a-complex-devops-solution-understood-only-by-an/</link><pubDate>Wed, 08 May 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/a-complex-devops-solution-understood-only-by-an/</guid><description>&lt;p&gt;&lt;a href="http://vimeo.com/album/2373722/video/65545084"&gt;http://vimeo.com/album/2373722/video/65545084&lt;/a&gt;&lt;/p&gt;</description></item><item><title>what i want is for it to keep the lights on it</title><link>https://goncalopereira.com/archive/what-i-want-is-for-it-to-keep-the-lights-on-it/</link><pubDate>Sun, 28 Apr 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/what-i-want-is-for-it-to-keep-the-lights-on-it/</guid><description>&lt;blockquote&gt;
&lt;p&gt;What I want is for IT to keep the lights on. It should be like using the toilet. I use the toilet and, hell, I don’t ever worry about it not working. What I don’t want is to have the toilets back up and flood the entire building.” He smiles broadly at his own joke. Great. In his mind, I’m a glorified janitor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/the-phoenix-project-business-ebook/B00AY2WIOK/B00AZRBLHO"&gt;The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win&lt;/a&gt; Gene Kim, Kevin Behr, George Spafford&lt;/p&gt;</description></item><item><title>how hacks affect software but the intervention</title><link>https://goncalopereira.com/archive/how-hacks-affect-software-but-the-intervention/</link><pubDate>Tue, 16 Apr 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/how-hacks-affect-software-but-the-intervention/</guid><description>&lt;blockquote&gt;
&lt;p&gt;How hacks affect software: “but the intervention can become a system trap. A corrective feedback process within the system is doing a poor (or even so-so) job of maintaining the state of the system. A well-meaning and efficient intervenor watches the struggle and steps in to take some of the load. The intervenor quickly brings the system to the state everybody wants it to be in. Congratulations are in order, usually self-congratulations by the intervenor to the intervenor&lt;/p&gt;</description></item><item><title>there are two antidotes to eroding goals one is</title><link>https://goncalopereira.com/archive/there-are-two-antidotes-to-eroding-goals-one-is/</link><pubDate>Thu, 11 Apr 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/there-are-two-antidotes-to-eroding-goals-one-is/</guid><description>&lt;blockquote&gt;
&lt;p&gt;There are two antidotes to eroding goals. One is to keep standards absolute, regardless of performance. Another is to make goals sensitive to the best performances of the past, instead of the worst&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/thinking-systems-a-primer-ebook/B001FEELKU/B005VSRFEA"&gt;Thinking in Systems: A Primer&lt;/a&gt; Meadows. Donella&lt;/p&gt;</description></item><item><title>Monitoring Manifesto</title><link>https://goncalopereira.com/archive/monitoring-manifesto/</link><pubDate>Tue, 26 Mar 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/monitoring-manifesto/</guid><description>&lt;p&gt;Software development keeps on being pushed everyday – Agile, DevOps, Kanban, TDD, BDD and so many other practices keep on evolving to let us create applications faster and better than previously – could you really imagine the current scale in the 1990s? No one did and when we compare it with established engineering professions like architecture or mechanical it is just a baby.&lt;/p&gt;
&lt;p&gt;So we keep on improving on how we establish our models in this emerging class of engineering, we create applications and we make them in an incremental and sustainable way – or do we?&lt;/p&gt;</description></item><item><title>if the land mechanism as a whole is good then</title><link>https://goncalopereira.com/archive/if-the-land-mechanism-as-a-whole-is-good-then/</link><pubDate>Fri, 22 Mar 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/if-the-land-mechanism-as-a-whole-is-good-then/</guid><description>&lt;blockquote&gt;
&lt;p&gt;If the land mechanism as a whole is good, then every part is good, whether we understand it or not. If the biota, in the course of aeons, has built something we like but do not understand, then who but a fool would discard seemingly useless parts? To keep every cog and wheel is the first precaution of intelligent&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/thinking-systems-a-primer-ebook/B001FEELKU/B005VSRFEA"&gt;Thinking in Systems: A Primer&lt;/a&gt; Meadows. Donella&lt;/p&gt;</description></item><item><title>systems thinkers use graphs of system behavior to</title><link>https://goncalopereira.com/archive/systems-thinkers-use-graphs-of-system-behavior-to/</link><pubDate>Thu, 28 Feb 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/systems-thinkers-use-graphs-of-system-behavior-to/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Systems thinkers use graphs of system behavior to understand trends over time, rather than focusing attention on individual events. We also use behavior-over-time graphs to learn whether the system is approaching a goal or a limit&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/thinking-systems-a-primer-ebook/B001FEELKU/B005VSRFEA"&gt;Thinking in Systems: A Primer&lt;/a&gt; Meadows. Donella&lt;/p&gt;</description></item><item><title>we have a mantra that we share with our clients</title><link>https://goncalopereira.com/archive/we-have-a-mantra-that-we-share-with-our-clients/</link><pubDate>Wed, 27 Feb 2013 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/we-have-a-mantra-that-we-share-with-our-clients/</guid><description>&lt;blockquote&gt;
&lt;p&gt;We have a mantra that we share with our clients, and it is simply “everything fails.” This goes for servers, storage systems, network devices, and datacenters. If you can name it, it can fail, and we’ve probably seen it&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Scalability Rules: 50 Principles for Scaling Web Sites Martin L. Abbott, Michael T. Fisher&lt;/p&gt;</description></item><item><title>make it easy to deploy and distribute new checks</title><link>https://goncalopereira.com/archive/make-it-easy-to-deploy-and-distribute-new-checks/</link><pubDate>Mon, 31 Dec 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/make-it-easy-to-deploy-and-distribute-new-checks/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Make it easy to deploy and distribute new checks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Back up your monitoring data and understand how you need to restore it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Monitor your own monitoring system. As the Romans once said: “Quis custodiet ipsos custodes?” (Who will guard the guards?)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/web-operations-keeping-data-ebook/B0039WVRNK/B0043M4Z34"&gt;Web Operations: Keeping the Data On Time&lt;/a&gt; John Allspaw Jesse Robbins&lt;/p&gt;</description></item><item><title>Software as Design</title><link>https://goncalopereira.com/archive/software-as-design/</link><pubDate>Fri, 19 Oct 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/software-as-design/</guid><description>&lt;p&gt;As craftsmanship&lt;/p&gt;
&lt;p&gt;Lately there has been a push of software into craftsmanship, nurturing the skill and giving value to building software for the sake of it.&lt;/p&gt;
&lt;p&gt;Not a long time ago the main trend was design patterns, inspired by real life architecture the Gang Of Four tried to look for common problems and summarize it into common solutions but these tend to be taught too early and developers lack the knowledge to know how to use them.&lt;/p&gt;</description></item><item><title>Everything is Continuous</title><link>https://goncalopereira.com/archive/everything-is-continuous/</link><pubDate>Wed, 03 Oct 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/everything-is-continuous/</guid><description>&lt;p&gt;# The pain&lt;/p&gt;
&lt;p&gt;As the Ops team grew and Devs teams grew, it became a recurrent task to be asked by the Ops team to test infrastructural changes.&lt;/p&gt;
&lt;p&gt;This didn’t use to be a problem, the teams were smaller, we had less features and the infrastructure was much simpler but they became a blocker for both teams as they have to be working simultaneously on the same task.&lt;/p&gt;
&lt;p&gt;Even though we have Unit Tests, Integration Tests, Acceptance Tests and Smoke Tests and they run every time there is a new build (Continuous Integration) we feel the pain of infrastructural changes as these tests are not run for every change done by the Ops team.&lt;/p&gt;</description></item><item><title>theres never a problem getting a posse together</title><link>https://goncalopereira.com/archive/theres-never-a-problem-getting-a-posse-together/</link><pubDate>Fri, 07 Sep 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/theres-never-a-problem-getting-a-posse-together/</guid><description>&lt;blockquote&gt;
&lt;p&gt;There’s never a problem getting a posse together to fix the broken. The upside for you (and the challenge) is to find the energy and the will to challenge the mediocre.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/poke-the-box-ebook/B004KS3CGW/B004J4XG0O"&gt;Poke the Box&lt;/a&gt; Seth Godin&lt;/p&gt;</description></item><item><title>Statsd C# Client</title><link>https://goncalopereira.com/archive/statsd-c-client/</link><pubDate>Thu, 02 Aug 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/statsd-c-client/</guid><description>&lt;p&gt;I’ve been working lately on an Open Source C# client for Statsd, this is currently in use at 7digital for our streaming infrastructure giving us real time information on errors, authorisations, response times and several more issues. The timer delegate easily lets you wrap methods and give you times for it without needing to set-up any clocks.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Pereingo/statsd-csharp-client"&gt;https://github.com/Pereingo/statsd-csharp-client&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Evolution of Deployment at 7digital</title><link>https://goncalopereira.com/archive/evolution-of-deployment-at-7digital/</link><pubDate>Wed, 20 Jun 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/evolution-of-deployment-at-7digital/</guid><description>&lt;p&gt;# Why&lt;/p&gt;
&lt;p&gt;If there is something that gets me worried, it’s The Big Rewrite. Someone will think that it’s easier to develop a solution for a problem from scratch than by refactoring (or implementing) over the current available solution. My main fear is about the knowledge lost since the previous implementation.&lt;/p&gt;
&lt;p&gt;The developers involved have left;
The reason something was done is forgotten;
There will be time for it and even to add the new requirements that are driving the work! (I do hope this is being driven by requirements and not someone’s personal preference).
XKCD 844&lt;/p&gt;</description></item><item><title>capturing the upper limit of your web servers</title><link>https://goncalopereira.com/archive/capturing-the-upper-limit-of-your-web-servers/</link><pubDate>Tue, 19 Jun 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/capturing-the-upper-limit-of-your-web-servers/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Capturing the upper limit of your web server’s resources can be simplified by at least one design decision that you’ve probably already made: using a load balancer. In order to confirm your ceiling estimates with live traffic, increase the production load carefully on some web servers and measure the effects it has on resources. Increase the load by pulling machines from the live pool of balanced servers, which increases the load on the remaining servers commensurately. I want to emphasize the importance of using real traffic instead of running a simulation or attempting to model your web server’s resources in a benchmark-like setting.&lt;/p&gt;</description></item><item><title>real world observations are worth more than any</title><link>https://goncalopereira.com/archive/real-world-observations-are-worth-more-than-any/</link><pubDate>Tue, 12 Jun 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/real-world-observations-are-worth-more-than-any/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Real-world observations are worth more than any theoretical measurement. Capacity planning—and the predictions that drive it—should come from the empirical observation of your site’s usage, not benchmarks made in artificial environments. Benchmarking and performance research have value, but shouldn’t be used as the sole indicators of capacity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/the-art-capacity-planning-ebook/B00279DG6C/B0026OR2Y0"&gt;The Art of Capacity Planning: Scaling Web Resources&lt;/a&gt; John Allspaw&lt;/p&gt;</description></item><item><title>Metric-Driven fueled by Statsd and Graphite</title><link>https://goncalopereira.com/archive/metric-driven-fueled-by-statsd-and-graphite/</link><pubDate>Wed, 18 Apr 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/metric-driven-fueled-by-statsd-and-graphite/</guid><description>&lt;h1 id="why-metrics"&gt;Why metrics?&lt;/h1&gt;
&lt;p&gt;Since I joined 7digital I’ve seen the API grow from a brand new feature side by side with the (then abundant) websites to be the main focus of the company. The traffic grew and grew and keeps on growing in an accelerated pace and that brings us new challenges. We’ve brought the agile perspective into play which has made us adapt faster and make fewer errors but:&lt;/p&gt;
&lt;p&gt;We can do unit tests but they don’t bring out the behaviour.
We can do integration tests but they won’t show the whole flow.
We can do smoke tests but they won’t show us realistic usage.
We can do load test but they won’t have realistic weighting.
Even when we do acceptance criteria we are actually being driven by assumptions, even with an experienced developer he is really just sampling all his previous work and as we move to a larger number of servers and applications it’s not humanly possible to take all variables into consideration.&lt;/p&gt;</description></item><item><title>before rushing to any conclusion about the speed</title><link>https://goncalopereira.com/archive/before-rushing-to-any-conclusion-about-the-speed/</link><pubDate>Fri, 30 Mar 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/before-rushing-to-any-conclusion-about-the-speed/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Before rushing to any conclusion about the speed of any services you’re using, it’s worth a sanity check to make sure they’re really the problem. It’s tempting to blame somebody else’s service, but in the long run it’s nearly always easier to address our own problems. Before looking at scaling the external service, we need to check that the way we’re communicating with the service isn’t causing the bottleneck.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/building-scalable-web-sites-ebook/B001IGI78M/B0026OR2UO"&gt;Building Scalable Web Sites&lt;/a&gt; Cal Henderson&lt;/p&gt;</description></item><item><title>7digital Tomahawk Resolvers</title><link>https://goncalopereira.com/archive/7digital-tomahawk-resolvers/</link><pubDate>Tue, 27 Mar 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/7digital-tomahawk-resolvers/</guid><description>&lt;p&gt;Went to Amsterdam Music Hack Day and left with a working Tomahawk Resolver for 7digital previews, a spiked locker integration and some cool ideas on how to promote 7digital with Open Source&lt;/p&gt;
&lt;p&gt;This will allow Tomahawk to use 7digital’s track search and listen to previews, in the future it will integrate buy buttons and help out Tomahawk to work with 7digital :-)&lt;/p&gt;
&lt;p&gt;The locker integration is spiked using a local service which would be provided/maintained by either 7digital or a third party so it won’t be available immediately after the demo as there are feature, performance and security concerns.&lt;/p&gt;</description></item><item><title>the first rule of remote service club is that you</title><link>https://goncalopereira.com/archive/the-first-rule-of-remote-service-club-is-that-you/</link><pubDate>Tue, 20 Mar 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/the-first-rule-of-remote-service-club-is-that-you/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The first rule of remote service club is that you can’t rely on remote services. I’m sure you can guess what the second rule is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://kindle.amazon.com/work/building-scalable-web-sites-ebook/B001IGI78M/B0026OR2UO"&gt;Building Scalable Web Sites&lt;/a&gt; Cal Henderson&lt;/p&gt;</description></item><item><title>Karate Chop Kata and coding practices in Clojure 2</title><link>https://goncalopereira.com/archive/karate-chop-kata-and-coding-practices-in-clojure-2/</link><pubDate>Mon, 06 Feb 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/karate-chop-kata-and-coding-practices-in-clojure-2/</guid><description>&lt;p&gt;Following my last post I was left with a solution of the Kata that can be translated to a non-functional language.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn number-is-out-of-bounds [number array]
	(or (empty? array) (&amp;lt; number (first array)) (&amp;gt; number (last array)))
)
(defn chop [number array]
	(loop [position 0 sub-array array]
		(if (number-is-out-of-bounds number sub-array)
			-1
			(if (= number (first sub-array))
				position
				(recur (+ position 1) (rest sub-array))
			)
		)
	)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This solution allowed me to prevent side effects and dependencies between the order on which the calls of loop are ordered so that recurcould re-bind the function.&lt;/p&gt;</description></item><item><title>Karate Chop Kata and coding practices in Clojure</title><link>https://goncalopereira.com/archive/karate-chop-kata-and-coding-practices-in-clojure/</link><pubDate>Mon, 30 Jan 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/karate-chop-kata-and-coding-practices-in-clojure/</guid><description>&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Having used Scheme and LISP in university as well as Java I recently became interested in Clojure – Functional languages are an interesting paradigm which is not used as often as it should on the day to day development.&lt;/p&gt;
&lt;p&gt;It’s also seen as a great work horse for big data and distributed environments so I wanted to know what could I learn from it.&lt;/p&gt;
&lt;p&gt;This is my first contact with Clojure and I admit I haven’t looked back into LISP in years so you can consider this as starting from scratch.&lt;/p&gt;</description></item><item><title>a distributed application makes forward progress</title><link>https://goncalopereira.com/archive/a-distributed-application-makes-forward-progress/</link><pubDate>Sat, 28 Jan 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/a-distributed-application-makes-forward-progress/</guid><description>&lt;blockquote&gt;
&lt;p&gt;A distributed application makes forward progress by transitioning from one state to another, just like a state machine. The difference from traditional state machines, however, is that the possible states and the transitions between them are not known in advance. Instead, as the application reaches a new state, the next possible transitions are discovered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://restinpractice.com/"&gt;Rest In Practice&lt;/a&gt;&lt;/p&gt;</description></item><item><title>jim jarmusch</title><link>https://goncalopereira.com/archive/jim-jarmusch/</link><pubDate>Sat, 28 Jan 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/jim-jarmusch/</guid><description>&lt;p&gt;&lt;img src="https://goncalopereira.com/jim-jarmusch.jpg" alt="picture alt"&gt;&lt;/p&gt;</description></item><item><title>to be able to grasp something of value sometimes</title><link>https://goncalopereira.com/archive/to-be-able-to-grasp-something-of-value-sometimes/</link><pubDate>Sun, 22 Jan 2012 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/to-be-able-to-grasp-something-of-value-sometimes/</guid><description>&lt;blockquote&gt;
&lt;p&gt;To be able to grasp something of value, sometimes you have to perform seemingly inefficient acts.”
What I Talk About When I Talk About Running&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Haruki Murakami&lt;/p&gt;</description></item><item><title>Visibility of Status Endpoints</title><link>https://goncalopereira.com/archive/visibility-of-status-endpoints/</link><pubDate>Mon, 19 Dec 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/visibility-of-status-endpoints/</guid><description>&lt;p&gt;Following last month’s work to introduce more standard status endpoints on the services I ended up working on a way to make it more visible.&lt;/p&gt;
&lt;p&gt;Initially I looked into existing open source dashboards to have an idea of possible cases and requirements, the best one in my opinion was stashboard (working example here).&lt;/p&gt;
&lt;p&gt;It reveals a REST based solution of the status endpoints and to me it brings the following advantages:&lt;/p&gt;</description></item><item><title>Status Endpoints</title><link>https://goncalopereira.com/archive/status-endpoints/</link><pubDate>Fri, 16 Dec 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/status-endpoints/</guid><description>&lt;p&gt;Currently our API has a status endpoint which consists of:&lt;/p&gt;
&lt;p&gt;Database read.
Get current time.
This is useful to see if the API is active: it needs the Web Server to be correctly configured, time configured and be able to use the database.
Unfortunately the same wasn’t true to other services like our Content Provider (AS) and File Transcoder (HFP). During this time I standardised the response of the endpoints so all these projects return the same response if HTTP OK.&lt;/p&gt;</description></item><item><title>Transfer of Spotify Users</title><link>https://goncalopereira.com/archive/transfer-of-spotify-users/</link><pubDate>Wed, 25 May 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/transfer-of-spotify-users/</guid><description>&lt;p&gt;&lt;img src="https://goncalopereira.com/7dig-spotify.png" alt="picture alt"&gt;&lt;/p&gt;
&lt;p&gt;So here we go, after a partnership of a few years to provide Spotify with a purchase service they decided to go with their own service.&lt;/p&gt;
&lt;p&gt;This was an interesting project as it was completely separate from the usual team workflow and with no determined set of owners/champions.&lt;/p&gt;
&lt;p&gt;It was suppose to be fast but it felt more lost and without direction than the other projects. It did remind me a lot of the time before the teams adopted &lt;a href="http://en.wikipedia.org/wiki/Product_manager"&gt;product managers&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Team_leader"&gt;leads&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Kanban_(development)"&gt;kaban&lt;/a&gt; (and other things). There was a lot of pulling around from different people interested in the project from Support to Marketing to Development and random timelines and feature ideas were decided.&lt;/p&gt;</description></item><item><title>Tomahawk and 7digital</title><link>https://goncalopereira.com/archive/tomahawk-and-7digital/</link><pubDate>Mon, 23 May 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/tomahawk-and-7digital/</guid><description>&lt;p&gt;### Introduction&lt;/p&gt;
&lt;p&gt;Tomahawk is a very interesting project - it defends that just because you have a music download or streaming service you should not be required to use the same service’s player - it’s the do one thing right principle or single responsibly applied to business.&lt;/p&gt;
&lt;p&gt;It has multi source content resolution which means you might have several sources to your music, local hard drive, stream service, your cloud drive and many more.&lt;/p&gt;</description></item><item><title>More updates to ruby store</title><link>https://goncalopereira.com/archive/more-updates-to-ruby-store-and-deploy-of-demo-to/</link><pubDate>Tue, 12 Apr 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/more-updates-to-ruby-store-and-deploy-of-demo-to/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;moved credentials and hostname to ENV to work with Heroku config&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;moved login from internal api methods to api handshake (get access token from login done in 7digital)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;added some links to show other stores&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fixed issue with refresh when changing store country&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bundler with gems added for Heroku&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Config.ru added&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Various small fixes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://github.com/goncalopereira/7DIGITAL-Ruby-Store"&gt;https://github.com/goncalopereira/7DIGITAL-Ruby-Store&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Heroku demo at &lt;a href="http://sevendigital-ruby-store.heroku.com"&gt;http://sevendigital-ruby-store.heroku.com&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Some more updates for the store</title><link>https://goncalopereira.com/archive/some-more-updates-for-the-store/</link><pubDate>Sun, 10 Apr 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/some-more-updates-for-the-store/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;add tracks to basket&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;formatted prices for track and release&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;split routes.rb into routes folder ‘controllers’&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;locker page (no paging)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;track download in locker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;track stream in locker (player not working, link works)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requests parse IDs with regex, ignore non ints&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;created user page to include details, e-mail so far&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;added similar artists to artist page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;added top tracks to artist page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;added release chart to index page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;required ssl for logged in users and if logging in/out - not enforced if in development environment&lt;/p&gt;</description></item><item><title>7digital Ruby Frontend</title><link>https://goncalopereira.com/archive/7digital-ruby-frontend/</link><pubDate>Wed, 06 Apr 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/7digital-ruby-frontend/</guid><description>&lt;p&gt;Continuing to implement API for a demo store front (source available on GitHub)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated to ruby 1.9.2&lt;/li&gt;
&lt;li&gt;Removed local copy of 7digital wrapper, now using gem Sevendigital 0.0.6&lt;/li&gt;
&lt;li&gt;Removed redundant call for tracks to get rid of redirect - this was fixed in 0.0.6&lt;/li&gt;
&lt;li&gt;Added label, release date info to release&lt;/li&gt;
&lt;li&gt;Added track and artist search results to main page&lt;/li&gt;
&lt;li&gt;Added user session login from email/password&lt;/li&gt;
&lt;li&gt;Added basket for add/remove of releases&lt;/li&gt;
&lt;li&gt;Added partials module&lt;/li&gt;
&lt;li&gt;Moved information to partials to be reused: release, player, basket, login&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still not happy with the way global vars are used in partials, need to understand how locals get generated for partials.&lt;/p&gt;</description></item><item><title>My experience with Bitly API</title><link>https://goncalopereira.com/archive/my-experience-with-bitly-api/</link><pubDate>Tue, 05 Apr 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/my-experience-with-bitly-api/</guid><description>&lt;p&gt;## Introduction&lt;/p&gt;
&lt;p&gt;Bit.ly is an URL shortener service available on &lt;a href="http://bit.ly/"&gt;http://bit.ly/&lt;/a&gt;, it also provides a public API for existing (free or not) accounts.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/bitly-api/%20"&gt;API Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There was the idea of using Bit.ly for our internal URL shortening service. I decided to use an existing ruby wrapper for their API and test what options were available.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/philnash/bitly"&gt;Ruby Wrapper&lt;/a&gt;, also available on rubygems for ruby &amp;gt;= 1.8.7&lt;/p&gt;
&lt;p&gt;This wrapper allows for most if not all the API version 3 endpoints and features needing only the username and API key which is available in the website for all existing users.&lt;/p&gt;</description></item><item><title>7digital Ruby store</title><link>https://goncalopereira.com/archive/7digital-ruby-store/</link><pubDate>Wed, 09 Mar 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/7digital-ruby-store/</guid><description>&lt;p&gt;Started a new project on Git Hub to exemplify the use of the API Wrapper in Ruby.&lt;/p&gt;
&lt;p&gt;This is a good starting point for any projects using the Ruby Wrapper to see a working example.&lt;/p&gt;
&lt;p&gt;At the moment you only need your consumer key and can see Release Search and a Release page containing a preview player.&lt;/p&gt;
&lt;p&gt;The store is at &lt;a href="https://github.com/goncalopereira/7DIGITAL-Ruby-Store"&gt;https://github.com/goncalopereira/7DIGITAL-Ruby-Store&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It uses &lt;a href="http://sinatrarb.com"&gt;Sinatra&lt;/a&gt; (RESTful) with &lt;a href="http://haml-lang.com/"&gt;Haml&lt;/a&gt; for templates.&lt;/p&gt;
&lt;p&gt;The Ruby wrapper is at &lt;a href="https://github.com/filip7d/7digital"&gt;https://github.com/filip7d/7digital&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Gr1d Multiplayer Online Programming</title><link>https://goncalopereira.com/archive/gr1d-a-persistent-multiplayer-online-programming/</link><pubDate>Wed, 09 Feb 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/gr1d-a-persistent-multiplayer-online-programming/</guid><description>&lt;p&gt;During the last few months I played an AI oriented RPG called &lt;a href="http://www.gr1d.org"&gt;Gr1d&lt;/a&gt; - this is the code that made me get to number one for most of the game until I got disapointed with the excessive human interaction of the game.&lt;/p&gt;
&lt;p&gt;The latest version is a bit hacked as I wanted to try some algorithms on the search for new agents using width first search but the server was failing a lot and I stopped playing before cleaning up&lt;/p&gt;</description></item><item><title>Amazon SES and my .Net port for scripts</title><link>https://goncalopereira.com/archive/amazon-ses-and-my-net-port-for-scripts/</link><pubDate>Wed, 02 Feb 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/amazon-ses-and-my-net-port-for-scripts/</guid><description>&lt;h3 id="intro"&gt;Intro&lt;/h3&gt;
&lt;p&gt;Amazon SES is not about third party tools to manage e-mail, they use their centralized system which has to authorize your sender e-mail and keeps all lists to keep a centralized filtering and send system much larger than any local tools could do (&lt;a href="http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/Intro.ArchOverview.html"&gt;http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/Intro.ArchOverview.html&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;It also strips the e-mail options to a minimum to focus on the deliverable of the messages and only has an API to work it - it is not a front-end tool.&lt;/p&gt;</description></item><item><title>starting a cs library at work</title><link>https://goncalopereira.com/archive/starting-a-cs-library-at-work/</link><pubDate>Tue, 01 Feb 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/starting-a-cs-library-at-work/</guid><description>&lt;p&gt;We have a lot of development, methodology, languages, etc books but we were missing a section dedicated to CS - I’ll remember some of the theory from college which I probably never thought I’d use again.&lt;/p&gt;
&lt;p&gt;The books are both classic in each’s areas:&lt;/p&gt;
&lt;p&gt;“The Art of Computer Programming: v. 1-3: Bd. 1: Fundamental Algorithms / Bd. 2: Seminumerical Algorithms / Bd. 3: Sorting and Searching: Vol 1-3 (Series in Computer Science &amp;amp; Information Processing)”
Donald E. Knuth&lt;/p&gt;</description></item><item><title>microsoftwebmvc vs systemwebmvc</title><link>https://goncalopereira.com/archive/microsoftwebmvc-vs-systemwebmvc/</link><pubDate>Thu, 27 Jan 2011 00:00:00 +0000</pubDate><guid>https://goncalopereira.com/archive/microsoftwebmvc-vs-systemwebmvc/</guid><description>&lt;p&gt;Today I got a failed build due with an ambiguous call to extensions between Microsoft MVC and System MVC this is due to ongoing work moving references between the two.&lt;/p&gt;
&lt;p&gt;The easiest way I saw to fix this in pages was to wrap it into another class so I can only include one of them.&lt;/p&gt;
&lt;p&gt;What was, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;%= Html.HiddenFor(x=&amp;gt;x.Field) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Became:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;%= NewClass.HiddenField(Html) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the code:&lt;/p&gt;</description></item></channel></rss>