<?xml version="1.0"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>$blog++</title>
    <link>https://blog.marcomonteiro.net</link>
    <atom:link href="https://blog.marcomonteiro.net/rss" rel="self" type="application/rss+xml" />
    <description></description>
    <copyright>https://blog.marcomonteiro.net</copyright>
    <ttl>30</ttl>

          <item>
        <title>How to setup Codeigniter 4</title>
        <description>
          &lt;p&gt;I started a brand new &lt;a href=&quot;https://www.youtube.com/channel/UC9HQjernJPHN-RoKMwtYQ4w&quot;&gt;youtube channel&lt;/a&gt;. It's called &lt;a href=&quot;https://www.youtube.com/channel/UC9HQjernJPHN-RoKMwtYQ4w&quot;&gt;TIL Things&lt;/a&gt;. As in Today I Learned Things. The idea is to share kinda the same thing I normally do here but in a video format.&lt;/p&gt;

&lt;p&gt;To start things, I decided to do a video series about Codeigniter 4, from how to install it, how it works and building a small blog application with it.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Here's the first video. I hope you can enjoy it and if you do please consider liking and subscribing.&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;400&quot; src=&quot;https://www.youtube.com/embed/tSdbT0GMEqU&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;All the code that will exist in these series will live in the following github repository.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mpmont/ci4-screencasts&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-setup-codeigniter-4</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-setup-codeigniter-4</guid>
        <pubDate>Sat, 04 Jul 2020 17:22:00 +0000</pubDate>
      </item>
          <item>
        <title>My work setup - 2020 update</title>
        <description>
          &lt;p&gt;It's mid 2020, Ubuntu has a new LTS release and with it its time to try a few things and actually update. As you know I'm now using Pop!OS a distro based on Ubuntu. I already wrote an entire blog post about it. Now I'm going to show you the actual tools I use at the moment.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3&gt;&lt;strong&gt;OPERATING SYSTEM&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://pop.system76.com/&quot;&gt;Pop!OS&lt;/a&gt; is designed for fast navigation, easy workspace organization, and fluid, convenient workflow. Your operating system should encourage discovery, not obstruct it. It uses gnome by default and that's what I use.&lt;/p&gt;

&lt;p&gt;Here's the look of it when I load it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/mXV0OZx.png&quot; alt=&quot;Desktop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here's the theme and icons that I'm using.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/WDLwzXl.png&quot; alt=&quot;neofetch&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;TERMINAL EMULATOR&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;As you can see from that neofech print, I'm now using &lt;a href=&quot;https://github.com/alacritty/alacritty&quot;&gt;Alacritty&lt;/a&gt;, I've been a long term terminator user, but ever since I discovered Alacritty I never went back.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ABbhg8a.png&quot; alt=&quot;Alacritty&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Alacritty is a terminal emulator with a strong focus on simplicity and performance. With such a strong focus on performance, included features are carefully considered and you can always expect Alacritty to be blazingly fast. By making sane choices for defaults, Alacritty requires no additional setup. However, it does allow configuration of many aspects of the terminal.&lt;/p&gt;

&lt;p&gt;The software is considered to be at a beta level of readiness -- there are a few missing features and bugs to be fixed, but it is already used by many as a daily driver, Including me.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;TEXT EDITOR&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Yes I'm still using &lt;a href=&quot;https://www.sublimetext.com/&quot;&gt;Sublime Text 3&lt;/a&gt; and I don't plan on changing that. However, when I need to use a terminal based text editor I'm actually using Micro. &lt;a href=&quot;https://micro-editor.github.io&quot;&gt;Micro&lt;/a&gt; is easy to use ans it's number one feature is being easy to install (it's just a static binary with no dependencies) and easy to use.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/qDwzk0n.png&quot; alt=&quot;Sublime and micro&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uses a simple json format to configure your options and rebind keys to your liking. If you need more power, you can use Lua to configure the editor further.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;SHELL&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;I've been a ZSH user for so long, used it for probably 6 years. However at the start of this year and started to try something new. The one I ended up with was fish. And then I obviously installed oh-my-fish. &lt;a href=&quot;https://fishshell.com/&quot;&gt;Fish&lt;/a&gt; is a smart and user-friendly command line shell for Linux, macOS, and the rest of the family.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/VPaI1c1.png&quot; alt=&quot;A simple LS&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;.DOT FILES&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Want to take a look at my &lt;a href=&quot;https://github.com/mpmont/dotFiles&quot;&gt;dotfiles&lt;/a&gt;? Sure I have them all on my &lt;a href=&quot;https://github.com/mpmont/dotFiles&quot;&gt;github&lt;/a&gt;. Get on it.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/my-work-setup-2020-update</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/my-work-setup-2020-update</guid>
        <pubDate>Thu, 18 Jun 2020 19:30:00 +0000</pubDate>
      </item>
          <item>
        <title>Why I moved from Ubuntu to PopOS!</title>
        <description>
          &lt;p&gt;PopOS! really made a big splash with its new 20.04 release and many long terms Ubuntu users like myself are now considering the change or actually changing. And there's good reason why this is happening.&lt;/p&gt;

&lt;p&gt;For those who don't know PopOs! is actually based on Ubuntu, so you might be like: - If that's the case why don't you just stick with Ubuntu? - That's a good question. So here's why.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3&gt;&lt;strong&gt;IT'S MADE FROM THE GUYS AT SYSTEM76&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;If you don't know what &lt;a href=&quot;https://system76.com/&quot;&gt;system76&lt;/a&gt; is, they are a hardware company that is focussed on shipping their laptops and desktops with linux based systems. So much so, that they started their own distro to make the experience better. Why is this important? Because their distro is focussed on the hardware. Not that I ever had anything bad to say against Canonical, I just like system76 more.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;THEY DON'T CHANGE THE DEFAULT GNOME EXPERIENCE&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;One of the things that always bothered me in Ubuntu was the changes they make to gnome. Specially because they only do it for one reason, for the desktop environment to look more like the one that was created by them, &lt;a href=&quot;https://en.wikipedia.org/wiki/Unity_%28user_interface%29&quot;&gt;Unity&lt;/a&gt;. And we all hated Unity right?&lt;/p&gt;

&lt;p&gt;I hated this so much that my Ubuntu installs on both personal desktop, laptop and work computer always have the default &lt;a href=&quot;https://www.gnome.org/&quot;&gt;gnome&lt;/a&gt; desktop instaled instead of the one that comes with Ubuntu.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;FLATPAK&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;I never had anything against snaps. Canonical had a problem at the time and they solved it. However, now that we have &lt;a href=&quot;https://www.flatpak.org/&quot;&gt;flatpaks&lt;/a&gt; that have become more and more popular I really don't see the point of using &lt;a href=&quot;https://snapcraft.io/&quot;&gt;snaps&lt;/a&gt;. PopOs! has the same philosophy and they ship their system already supporting flatpaks and even the shop that comes with it supports it, giving me the choice if I want to install a .deb or a flatpak.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;DISK ENCRYPTION BY DEFAULT&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;PopOs! takes your privacy and files very seriously, that's why during the instalation proccess you actually have to opt out the disk encryption if that's something you don't want. But why wouldn't you want it right?&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;WINDOW TILING INSIDE GNOME&lt;/strong&gt;&lt;/h3&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;438&quot; src=&quot;https://www.youtube.com/embed/-fltwBKsMY0&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;One of the things that had me intrigged even when popOs! was still in beta was the option to tile windows inside gnome. I always had a passion about window managers like i3 and others. Just never made the change because there's a lot of stuff I want from a desktop environment like gnome that a window manager doesn't have. When they started showing the demos about this feature I was blown away. Sure you can even install it on ubuntu.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;STEAM AND LITRUS&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Not that I do any more gaming besides minecraft on Linux, but if you plan on doing so, popOs! comes with almost everything pre-configured for you so that your gaming experience can be as easy as possible.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/why-i-moved-from-ubuntu-to-popos!</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/why-i-moved-from-ubuntu-to-popos!</guid>
        <pubDate>Sat, 06 Jun 2020 14:02:00 +0000</pubDate>
      </item>
          <item>
        <title>$ exa A modern replacement for ls</title>
        <description>
          &lt;p&gt;You list files hundreds of times a day. Why spend your time squinting at black and white text?&lt;/p&gt;

&lt;p&gt;exa is an improved file lister with more features and better defaults. It uses colours to distinguish file types and metadata. It knows about symlinks, extended attributes, and Git. And it’s small, fast, and just one single binary.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;exa is written in Rust. So you'll need that first in case you don't already have it.&lt;/p&gt;

&lt;p&gt;Run the following command (assuming you have curl installedo on your system) to get started with the installation of Rust in your ubuntu based server/pc:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl https://sh.rustup.rs -sSf | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you need to download the lattest version of exa. Head on to &lt;a href=&quot;https://github.com/ogham/exa/releases&quot;&gt;their github page&lt;/a&gt; and download the lattest version.&lt;/p&gt;

&lt;p&gt;Just copy the download link and download the zip using wget, for example with the v0.9.0 you can download the binary with the following command (you can switch to a temporary directory and download the zip in there):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# You should check your own version of this.
$ wget -c https://github.com/ogham/exa/releases/download/v0.9.0/exa-linux-x86_64-0.8.0.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, unzip the binary:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ unzip exa-linux-x86_64-0.8.0.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The zip contains a single file, namely the binary exa-linux-x86_64. So the last step is to move it to the bin directory of the local user so it will be accesible later in the cli as exa with the following instruction:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo mv exa-linux-x86_64 /usr/local/bin/exa
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To use this all you need is to type exa on your terminal. However what you can do to make the change even more perminante is to alias ls to axa.&lt;/p&gt;

&lt;p&gt;To do that I went to my .zshrc file and added the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;alias ls='exa --long --header --git'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This way you can use your ls command like you always did and it will be translated into exa.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/VXTYKQl.png&quot; alt=&quot;exa&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Exa supports the following main features:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colours&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Different types of file and data will be coloured differently, and the user and group columns will be highlighted for the current user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All the information&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;exa can display a file’s extended attributes, as well as standard filesystem information such as the inode, the number of blocks, and a file’s various dates and times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's fast&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;exa queries files in parallel, giving you performance on par with ls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tree view&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not only is the standard tree tool built-in, but it’ll show you your files’ information alongside the hierarchy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;View the staged and unstaged status of every file, right there in the standard view. Also works in tree view for a high-level overview of your repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wide view&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How many columns can you display in your terminal at once? How many do you need?&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/meet-exa-a-modern-replacement-for-ls</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/meet-exa-a-modern-replacement-for-ls</guid>
        <pubDate>Fri, 17 Apr 2020 16:41:00 +0000</pubDate>
      </item>
          <item>
        <title>Covid-19 made us more productive</title>
        <description>
          &lt;p&gt;I manage a small team of 6 including myself. I mostly do quality control stuff at work and I've been programming less and less in the past few months, mainly because I'm more involved in the project management side of things. However, there were always a few things that I knew we could do better and wanted to change but it was really hard to find the right time.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Then COVID-19 came about and we had to change and adapt to this new reality. Specially with everyone now working from home. There were 3 things that I wanted to change but still didn't have the time to. Let's talk about them.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;&lt;strong&gt;PROJECT MANAGEMENT&lt;/strong&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;One of the things that I talked about with management many times was my difficult to do project management, specially because the tools we were using were not built to do project management for real.
We were basically using a mix of google docs spreadsheets, gitlab issues and boards to get us going. I know it makes no sense but it was perfect when it was just me. At the time Gitlab was the right choice since I could create kanban boards and use them to manage my project.
Problem is, when you do this with several projects you get sidetracked and just can't get the big picture on how things are going with all of your projects. This is something extremely important specially when everyone is working remotely.&lt;/p&gt;

&lt;p&gt;I decided to use Clickup. It has everything we need at the moment and more. You can create your own dashboards with project status and tasks per user. You can create boards per project and calendar view among other things. Most important of all it has gitlab integration.
Want to know more? I found this YouTube video about it:&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;370&quot; src=&quot;https://www.youtube.com/embed/LibP_KTUK8I&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;This was a big bost in our productivity, it makes my life way easier when I have to answer to management on how the projects are going. I can answer problems easily and the team feels more productive because they can look at all their tasks in one place, despite the project.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;&lt;strong&gt;COMMUNICATION&lt;/strong&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;The other problem we had was how we communicated at the office. We used to use fucking whatsapp and I always hated it. Now we finally changed to slack and my life is so much better now. I have channels like I used to have on IRC and I can create threads there. I really love threads. And better than that, I can have my work related chats all in one place. I don't need to have my family group chats mixed up with my work stuff.&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;370&quot; src=&quot;https://www.youtube.com/embed/276Sz-fcxck&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;h3&gt;&lt;strong&gt;&lt;strong&gt;CONTINUOUS INTEGRATION&lt;/strong&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;This is something that I still plan on getting better during this quarantine time. I think I'm able to make things work way better with gitlab, docker and our production servers. If you don't know what I'm talking about you can read more about it &lt;a href=&quot;https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://about.gitlab.com/images/ci/ci-cd-test-deploy-illustration_2x.png&quot; alt=&quot;CI — Gitlab&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Was everything great with this change into a completly remote work environment? No, far from it. The lack of personal relationships at the office, the solitude of being inside 24/7 and time management were a big problem at first. When it started I worked way more at home than I did at the office, mostly because I worked since I woke up until I went to bed.&lt;/p&gt;

&lt;p&gt;These days I try to do my normal schedule and work 9 to 5 even though I'm still in front of the computer most of the time.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/covid-19-made-us-more-productive</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/covid-19-made-us-more-productive</guid>
        <pubDate>Wed, 01 Apr 2020 19:26:00 +0000</pubDate>
      </item>
          <item>
        <title>Installing SQLsrv extension for PHP 7.2 on Ubuntu 18.04 LTS</title>
        <description>
          &lt;p&gt;One of our windows servers got updated to a more recent version of windows and SQLServer. Until then I was using the msSQL extension and was still on PHP 5.6 on our intranet at work.&lt;/p&gt;

&lt;p&gt;Since this update I decided to upgrade our servers too and move to PHP 7.2 and obviously to the SQLsrv extension.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Let's assume that you already have PHP install and apache, so after that you should just do the following to get your microsoft packages.&lt;/p&gt;

&lt;p&gt;On your server type the following commands:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -s https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo bash -c &quot;curl -s https://packages.microsoft.com/config/ubuntu/18.04/prod.list &amp;gt; /etc/apt/sources.list.d/mssql-release.list&quot;
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get -y install msodbcsql17 mssql-tools
sudo apt-get -y install unixodbc-dev    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After this, you most likelly don't have the  the pecl7.X-sp command working. To solve this I did the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get -y install gcc g++ make autoconf libc-dev pkg-config
sudo apt-get install php-pear php-dev
sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After this all you need to do is create the necessary .ini file so that PHP can do its magic.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo bash -c &quot;echo extension=sqlsrv.so &amp;gt; /etc/php/7.2/mods-available/sqlsrv.ini&quot;
sudo ln -s /etc/php/7.2/mods-available/sqlsrv.ini /etc/php/7.2/apache2/conf.d/sqlsrv.ini
sudo ln -s /etc/php/7.2/mods-available/sqlsrv.ini /etc/php/7.2/cli/conf.d/sqlsrv.ini
sudo bash -c &quot;echo extension=pdo_sqlsrv.so &amp;gt; /etc/php/7.2/mods-available/pdo_sqlsrv.ini&quot;
sudo ln -s /etc/php/7.2/mods-available/pdo_sqlsrv.ini /etc/php/7.2/apache2/conf.d/pdo_sqlsrv.ini
sudo ln -s /etc/php/7.2/mods-available/pdo_sqlsrv.ini /etc/php/7.2/cli/conf.d/pdo_sqlsrv.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After this all you need to do is restart your apache:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo service apache2 restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That's it!&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/installing-sqlsrv-extension-for-php-7.2-on-ubuntu-18.04-lts</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/installing-sqlsrv-extension-for-php-7.2-on-ubuntu-18.04-lts</guid>
        <pubDate>Wed, 18 Mar 2020 18:55:00 +0000</pubDate>
      </item>
          <item>
        <title>Codeigniter 4 snippets for sublime text is here</title>
        <description>
          &lt;p&gt;Codeigniter 4 has been in the works since 2015. It took almost 3 years to have a basic framework working and 2 more to document everything so we can use it in production. This is very exciting news, since codeigniter still holds a place in me. It was PHP framework that I use the most and I still use version 3 at work.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;With this new version up its time to make a new snippets package for Sublime Text 3. I've been maintaning the first version of that package for some years now. &lt;a href=&quot;https://blog.marcomonteiro.net/post/thank-you!&quot;&gt;Back then it had 6400+ installs&lt;/a&gt; and I thought that was big, now it has&lt;a href=&quot;https://packagecontrol.io/packages/CodeIgniter%20Snippets&quot;&gt; more than 126k&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's make the new one has big as the first one. I made a repo here, and I already have a &lt;a href=&quot;https://github.com/wbond/package_control_channel/pull/7845&quot;&gt;pull request&lt;/a&gt; to have it avaiable to everyone via package control. Until then you can just install it manually. To do that you just have to make a clone of this repository into your packages folder &lt;strong&gt;(Preferences &gt; Browse packages...)&lt;/strong&gt;, like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone https://github.com/mpmont/ci4-snippets ci4-snippets    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you feel like helping, you can just send me a pull request and we can sort something out.&lt;/p&gt;

&lt;p&gt;You can know more about Codeigniter 4 by &lt;a href=&quot;https://codeigniter4.github.io/userguide/&quot;&gt;checking the docs&lt;/a&gt;. And the &lt;a href=&quot;https://forum.codeigniter.com/thread-75581.html&quot;&gt;official release post&lt;/a&gt; in the forums.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mpmont/ci4-snippets&quot;&gt;Github repo&lt;/a&gt; with the ci4 snippets.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/codeigniter-4-snippets-for-sublime-text-is-here</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/codeigniter-4-snippets-for-sublime-text-is-here</guid>
        <pubDate>Sun, 15 Mar 2020 11:59:00 +0000</pubDate>
      </item>
          <item>
        <title>Dealing with technical debt</title>
        <description>
          &lt;p&gt;Technical debt is just a fancy way of saying that something will bite you in the ass in the long term. However, in every project this is something very real that every Lead Developer has to deal with almost in a daily basis.&lt;/p&gt;

&lt;p&gt;Here I'll try to describe on how to avoid it it, or at least identify it as soon as possible so you can plan ahead.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;First of all, if we're talking about technical debt, there's something that you can be sure, you'll have to pay it in the future, in one way or another. However I'm not here to say that this is something that should be avoided at all costs. It's not! There's some really good reasons  to accept some form of technical debt. Maybe there's a deadline, or the dreadfull marketing team made some promisses that you'll have to deal with. Or worst of all, management just made some crazy demands that you have to follow. These are just some examples. There's many more, but I think these everyone can relate to.&lt;/p&gt;

&lt;p&gt;With this in mind you should always accept some form of technical debt with a deadline in mind, but if you do so, make sure you have a backup plan to fix it in the future. This is how you balance business and your codebase. Never ever, accept technical debt without a backup plan on how to solve it in the future.&lt;/p&gt;

&lt;p&gt;I'm going to quote Martin Fowler here:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you have this kind of exponential relationship, then if you do it more frequently, you can drastically reduce the pain. And this is what happens with Continuous Integration - by integrating every day, the pain of integration almost vanishes. It did hurt, so you did it more often, and now it no longer hurts. - In &lt;a href=&quot;https://martinfowler.com/bliki/FrequencyReducesDifficulty.html&quot;&gt;Frequency Reduces Difficulty&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;center&gt;
&lt;img src=&quot;https://martinfowler.com/bliki/images/frequency-reduces-difficulty/graph.png&quot; alt=&quot;graph&quot; /&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;What I mean is, managing technical debt is something that you'll learn to do once you start acknowledge is that this is something that you do often. What normally tends to happen is that us, Lead Developers are quite good at identifying these technical debts, however we tend to slack on solve them. Sure this might be ok on smaller projects, where you just have to be sure to avoid them on the next project. But what about big projects? That is just something that you can't avoid, that will probably mean that somewhere in the future you'll have a very dificult conversation with management saying that your app needs a complet re-write. I know! I've been there and it's not pleasent.&lt;/p&gt;

&lt;p&gt;How to better understand your codebase so you can identify your technical debt easly?&lt;/p&gt;

&lt;p&gt;First you need to check your version control often. Try and see how your developers interact with your code. See what part of your code is being used most of the time. With this you can identify these key areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&gt; &lt;strong&gt;Hotspots&lt;/strong&gt; = where most developers are working &lt;/li&gt;
&lt;li&gt;&gt; &lt;strong&gt;Refactoring targets&lt;/strong&gt; = prioritize change &lt;/li&gt;
&lt;li&gt;&gt; &lt;strong&gt;Change coupling&lt;/strong&gt; = implicit change in patters &lt;/li&gt;
&lt;li&gt;&gt; &lt;strong&gt;Code biomarkers&lt;/strong&gt; = aim to indicate specific properties at very low code base &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you should ask yourself the following questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&gt; Where should we focus improvements? &lt;/li&gt;
&lt;li&gt;&gt; Where are the risk areas? &lt;/li&gt;
&lt;li&gt;&gt; Is team productivity a problem? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you answer those questions, then there's time for the walk of shame and start paying your debt.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;/p&gt;

&lt;iframe src=&quot;https://giphy.com/embed/vX9WcCiWwUF7G&quot; width=&quot;100%&quot; height=&quot;270&quot; frameBorder=&quot;0&quot; class=&quot;giphy-embed&quot; allowFullScreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;But how?&lt;/p&gt;

&lt;p&gt;You have many options here and you should pick the one that aplies to your case.&lt;/p&gt;

&lt;p&gt;You can allocate more time into the development of said feature and that might solve it because this were rushed. This can be done by making a that a team priority and thats what everyone will be doing until things are solved.&lt;/p&gt;

&lt;p&gt;Another way of paying it is actually making a rulle of having a technical debt day per week or month, were you pick days where everyone in the team will do it.&lt;/p&gt;

&lt;p&gt;You can just choose to educate your team about it, this can be an option with just small debts in small projects, otherwise education can only go so far.&lt;/p&gt;

&lt;p&gt;Should definetly have a talk with management and marketing about it so in the future deadlines wont afect the project as much.&lt;/p&gt;

&lt;p&gt;There's only one thing that you might be tempted to do, but maybe it's not really an answer. Hire more developers. This seems like a great idea at first, but sometimes you want to solve these issues with your team before bringing more people into the mix.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/dealing-with-technical-debt</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/dealing-with-technical-debt</guid>
        <pubDate>Thu, 05 Mar 2020 22:28:00 +0000</pubDate>
      </item>
          <item>
        <title>A better man page for your terminal, tldr</title>
        <description>
          &lt;p&gt;I always hated the man pages, I always have a hard time to understand stuff and mostly I have a really hard time finding the option I need.&lt;/p&gt;

&lt;p&gt;The TLDR pages are a community effort to simplify the beloved man pages with practical examples.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;iframe src=&quot;https://tldr.ostera.io/tar&quot; width=&quot;100%&quot; height=&quot;500px&quot; style=&quot;border: 1px solid&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As of now, our most mature client is the node.js one, which you can easily install from NPM:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ npm install -g tldr    
&lt;/code&gt;&lt;/pre&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/a-better-man-page-for-your-terminal,-tldr</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/a-better-man-page-for-your-terminal,-tldr</guid>
        <pubDate>Sat, 25 Jan 2020 10:57:14 +0000</pubDate>
      </item>
          <item>
        <title>Prime OS an android based system for your laptop needs</title>
        <description>
          &lt;p&gt;A few months back I got me a cheap chinese laptop mostly for email, browsing the web, some light reading and watching some videos.&lt;/p&gt;

&lt;p&gt;The laptop came with windows, so the first thing I did was remove it and install Ubuntu. However, performance wise it wasn't the best. So I tried Lubuntu, but then I found out about Prime OS.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;If you already use Android, you'll love what you can do with PrimeOS. PrimeOS operating system gives a complete desktop experience similar to Windows, MacOS or even Çinux with access to millions of Android apps. It is designed to bring you the best of both worlds - a complete fusion of Android and PC.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://primeos.in/assets/homepage/One.png&quot; alt=&quot;Prime OS&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You install it just like any other Linux distro, just create a bootable USB stick and you're good to go. Even has live option so you can try it before installing and check if it's going to perform well on your machine.&lt;/p&gt;

&lt;p&gt;For my everyday laptop use it's perfect, I already have all my documents on google docs. My main email account is a Google Apps account.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/prime-os-an-android-based-system-for-your-laptop-needs</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/prime-os-an-android-based-system-for-your-laptop-needs</guid>
        <pubDate>Sun, 17 Mar 2019 17:25:56 +0000</pubDate>
      </item>
          <item>
        <title>Gnome 3.32 is released and with it some new good things</title>
        <description>
          &lt;p&gt;One of the reasons that made me change from the ubuntu version of gnome to the default one was to actually be able to get the updates for it faster. As of yesterday the new version was out. Version 3.32 contains six months of work by the GNOME community and includes many improvements, performance improvements and new features.&lt;/p&gt;

&lt;p&gt;This release features a refreshed visual style ranging from an entirely new set of app icons to improvements to the user interface style. Many of the base style colors have been saturated, giving them a more vivid, vibrant appearance. Buttons are more rounded and have a softer “shadow” border. Switches no longer use the explicit ON and OFF text, instead using color to indicate state.&lt;/p&gt;

&lt;p&gt;Check the release notes &lt;a href=&quot;https://help.gnome.org/misc/release-notes/3.32/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I haven't really upgraded but I'm really excited about doing it.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/gnome-3.32-is-released-and-with-it-some-new-good-things</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/gnome-3.32-is-released-and-with-it-some-new-good-things</guid>
        <pubDate>Thu, 14 Mar 2019 20:47:09 +0000</pubDate>
      </item>
          <item>
        <title>git refusing to merge unrelated histories</title>
        <description>
          &lt;p&gt;One of the things that happens to me a lot is when I start a new project on my computer that someone else started on our main repo  is this error saying that I'm trying to merge unrelated histories.&lt;/p&gt;

&lt;p&gt;This happens mostly because someone on the other side already started the master and develop branch and made some commits to it.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;However what I normally do is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git init 
$ git flow init
$ git remote add origin [insert url here]
$ git pull origin develop
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is when everything turns to shit and I get the following output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ fatal: refusing to merge unrelated histories
$ Error redoing merge 1234deadbeef1234deadbeef
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However this is quite easy to solve. All you have to do is shove a &lt;em&gt;--allow-unrelated-histories&lt;/em&gt; into your pull command. Like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git pull origin develop --allow-unrelated-histories
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will also work if you're trying to merge or rebase code.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/git-refusing-to-merge-unrelated-histories</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/git-refusing-to-merge-unrelated-histories</guid>
        <pubDate>Tue, 12 Mar 2019 11:38:19 +0000</pubDate>
      </item>
          <item>
        <title>How to clean up your environment when using docker</title>
        <description>
          &lt;p&gt;After a few projects we all know that you can have a real mess on your rig. Specially when it comes to saving space. So how to do that?&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;For this purpose you can use following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker system prune -a
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will give you the following output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all images without at least one container associated to them
        - all build cache
Are you sure you want to continue? [y/N] 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can be even a bit more hardcore and shove a &lt;strong&gt;-a&lt;/strong&gt; command in there, that will remove everything, not just the images.&lt;/p&gt;

&lt;p&gt;If your purpose is just to force Docker to rebuild images without using cache then use following combination:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker system prune
$ docker-compose build --no-cache
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then run up command as usual:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Stay clean!&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-clean-up-your-environment-when-using-docker</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-clean-up-your-environment-when-using-docker</guid>
        <pubDate>Sun, 10 Mar 2019 14:12:56 +0000</pubDate>
      </item>
          <item>
        <title>Getting started with Docker part 3 - Create your own lamp stack</title>
        <description>
          &lt;p&gt;Let's work on the following scenario. You are a PHP developer and need a Lamp stack environment to work with.&lt;/p&gt;

&lt;p&gt;That means you need Linux, Apache, MariaDB or Mysql and PHP.&lt;/p&gt;

&lt;p&gt;So let's get this show on the road and create our own lamp stack.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;First lets create a project forlder, this can be in any place you want.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir -p lamp-stack/DocumentRoot
$ echo &quot;&amp;lt;?php phpinfo(); ?&amp;gt;&quot; &amp;gt; lamp-stack/DocumentRoot/index.php    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basically your DocumentRoot will be your working environment. Now we must create two files, those will be placed on your root project folder.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker-compose.yml&lt;/li&gt;
&lt;li&gt;./php-apache/Dockerfile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's start with the docker-compose.yml file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;version: '3'
services:
    php-apache:
        build:
            context: ./php-apache
        ports:
            - 80:80
        volumes:
            - ./DocumentRoot:/var/www/html
        links:
            - 'mysql'

    mysql:
        image: mysql
        volumes:
            - ./db:/var/lib/mysql
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        ports:
            - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: root
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;1st line we need to define the sintax version we're working with. 
2nd We have the list of our services. These are php-apache and mysql (you can name these however you want).&lt;/p&gt;

&lt;p&gt;For the &quot;php-apache&quot; we have 3 items, &lt;strong&gt;build&lt;/strong&gt; (where we reference the folder php-apache where the dockerfile is);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ports&lt;/strong&gt; basically telling it to map your port 80 to the exact same port inside the docker container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volumes&lt;/strong&gt;, this is where we map our own projecto folder to the docker container one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;, this basically tells it to run the second service as a dependent one from the php-apache.&lt;/p&gt;

&lt;p&gt;The mysql is basically a direct copy from the &lt;a href=&quot;https://hub.docker.com/_/mysql&quot;&gt;https://hub.docker.com&lt;/a&gt; you should really get familiar with this service.&lt;/p&gt;

&lt;p&gt;Finally our dockerfile. This has all the comands you want to run for your php environment.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;FROM php:7.2.1-apache
MAINTAINER egidio docile
RUN docker-php-ext-install pdo pdo_mysql mysqli
RUN a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Firs we define our php version (this can be whatever you want to work with). The maintainer of it and then the list of php extensions we need. You can add as many as you like.&lt;/p&gt;

&lt;p&gt;Here's your final folder structure:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/4MxbwGV.png&quot; alt=&quot;Folder structure&quot; /&gt;&lt;/p&gt;

&lt;p&gt;All you need to do now is start your docker container. You do this by going inside your project folder and running the following command.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first time you do it, this may take a while.&lt;/p&gt;

&lt;p&gt;Now to access your project just go to http://localhost. And to access your mysql server just connect as usual using your application of choice.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/getting-started-with-docker-part-3-create-your-own-lamp-stack</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/getting-started-with-docker-part-3-create-your-own-lamp-stack</guid>
        <pubDate>Sun, 10 Mar 2019 09:47:00 +0000</pubDate>
      </item>
          <item>
        <title>How to use vanilla gnome session in Ubuntu 18.04</title>
        <description>
          &lt;p&gt;Gnome if basically my favourite desktop environment, since I moved away from Mac OS and started using Linux full time I tried a lot of flavours. But always ended up back into gnome.&lt;/p&gt;

&lt;p&gt;However, I never really liked the Ubuntu implementation of it. I always preffer the vanilla version. But Ubuntu its still my favourite distribution so how to get both?&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;To get that vanilla gnome experience, open a terminal and enter the following line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo snap remove gnome-3-26-1604 gnome-calculator gnome-characters gnome-logs gnome-system-monitor
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You'll be asked for your password and after the process is complete you should run the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt install gnome-session
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After this step you want to reboot your system. Then at the login screen, click on the small gear icon and select &quot;Gnome on Xorg&quot; to get to the vanilla session.&lt;/p&gt;

&lt;p&gt;After that you need to run the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt install vanilla-gnome-desktop vanilla-gnome-default-settings
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This might take a while, but after all these packages are installed you need to reboot once more.&lt;/p&gt;

&lt;p&gt;Once you login you're now in the default gnome session.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-use-vanilla-gnome-session-in-ubuntu-18.04</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-use-vanilla-gnome-session-in-ubuntu-18.04</guid>
        <pubDate>Sat, 09 Mar 2019 18:58:12 +0000</pubDate>
      </item>
          <item>
        <title>Conky the light-weight system monitor for X</title>
        <description>
          &lt;p&gt;Conky can display more than 300 built-in objects, including support for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&gt; A plethora of OS stats (uname, uptime, CPU usage, mem usage, disk usage, &quot;top&quot; like process stats, and network monitoring, just to name a few).&lt;/li&gt;
&lt;li&gt;&gt; Built-in IMAP and POP3 support.&lt;/li&gt;
&lt;li&gt;&gt; Built-in support for many popular music players (MPD, XMMS2, Audacious).&lt;/li&gt;
&lt;li&gt;&gt; Can be extended using built-in Lua support, or any of your own scripts and programs (more).&lt;/li&gt;
&lt;li&gt;&gt; Built-in Imlib2 and Cairo bindings for arbitrary drawing with Lua (more).&lt;/li&gt;
&lt;li&gt;&gt; Runs on Linux, FreeBSD, OpenBSD, DragonFlyBSD, NetBSD, Solaris, Haiku OS, and macOS!&lt;/li&gt;
&lt;/ul&gt;

&lt;!--more--&gt;

&lt;p&gt;... and much much more.&lt;/p&gt;

&lt;p&gt;Conky can display information either as text, or using simple progress bars and graph widgets, with different fonts and colours.&lt;/p&gt;

&lt;p&gt;Having said this lets install the thing and get it going.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get update
$ sudo apt-get install conky-all    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You might want to install sensorr, curl and hddtemp.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install conky curl lm-sensors hddtemp    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create a config file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ touch ~/.conky
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All that is left is to just shove your config file in there. Here's mine!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;conky.config = {
    update_interval = 1,
    cpu_avg_samples = 2,
    net_avg_samples = 2,
    out_to_console = false,
    override_utf8_locale = true,
    double_buffer = true,
    no_buffers = true,
    text_buffer_size = 32768,
    imlib_cache_size = 0,
    own_window = true,
    own_window_type = 'normal',
    own_window_argb_visual = true,
    own_window_argb_value = 50,
    own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager',
    border_inner_margin = 5,
    border_outer_margin = 0,
    xinerama_head = 1,
    alignment = 'bottom_right',
    gap_x = -1920,
    gap_y = 0,
    draw_shades = false,
    draw_outline = false,
    draw_borders = false,
    draw_graph_borders = false,
    use_xft = true,
    font = 'Ubuntu Mono:size=12',
    xftalpha = 0.8,
    uppercase = false,
    default_color = 'white',
    own_window_colour = '#000000',
    minimum_width = 300, minimum_height = 1035,
    alignment = 'top_right',

};
conky.text = [[
${time %H:%M:%S}${alignr}${time %d-%m-%y}
${voffset -16}${font sans-serif:bold:size=18}${alignc}${time %H:%M}${font}
${voffset 4}${alignc}${time %A %B %d, %Y}
${font}${voffset -4}
${font sans-serif:bold:size=10}SYSTEM ${hr 2}
${font sans-serif:normal:size=8}$sysname $kernel $alignr $machine
Host:$alignr$nodename
Uptime:$alignr$uptime
File System: $alignr${fs_type}
Processes: $alignr ${execi 1000 ps aux | wc -l}

${font sans-serif:bold:size=10}CPU ${hr 2}
${font sans-serif:normal:size=8}${execi 1000 grep model /proc/cpuinfo | cut -d : -f2 | tail -1 | sed 's/\s//'}
${font sans-serif:normal:size=8}${cpugraph cpu1}
CPU: ${cpu cpu1}% ${cpubar cpu1}

${font sans-serif:bold:size=10}MEMORY ${hr 2}
${font sans-serif:normal:size=8}RAM $alignc $mem / $memmax $alignr $memperc%
$membar
SWAP $alignc ${swap} / ${swapmax} $alignr ${swapperc}%
${swapbar}

${font sans-serif:bold:size=10}DISK USAGE ${hr 2}
${font sans-serif:normal:size=8}/ $alignc ${fs_used /} / ${fs_size /} $alignr ${fs_used_perc /}%
${fs_bar /}

${font Ubuntu:bold:size=10}NETWORK ${hr 2}
${font sans-serif:normal:size=8}Local IPs:${alignr}External IP:
${execi 1000 ip a | grep inet | grep -vw lo | grep -v inet6 | cut -d \/ -f1 | sed 's/[^0-9\.]*//g'}  ${alignr}${execi 1000  wget -q -O- http://ipecho.net/plain; echo}
${font sans-serif:normal:size=8}Down: ${downspeed enp0s3}  ${alignr}Up: ${upspeed enp0s3}
${color lightgray}${downspeedgraph enp0s3 80,130 } ${alignr}${upspeedgraph enp0s3 80,130 }$color
${font sans-serif:bold:size=10}TOP PROCESSES ${hr 2}
${font sans-serif:normal:size=8}Name $alignr PID   CPU%   MEM%${font sans-serif:normal:size=8}
${top name 1} $alignr ${top pid 1} ${top cpu 1}% ${top mem 1}%
${top name 2} $alignr ${top pid 2} ${top cpu 2}% ${top mem 2}%
${top name 3} $alignr ${top pid 3} ${top cpu 3}% ${top mem 3}%
${top name 4} $alignr ${top pid 4} ${top cpu 4}% ${top mem 4}%
${top name 5} $alignr ${top pid 5} ${top cpu 5}% ${top mem 5}%
${top name 6} $alignr ${top pid 6} ${top cpu 6}% ${top mem 6}%
${top name 7} $alignr ${top pid 7} ${top cpu 7}% ${top mem 7}%
${top name 8} $alignr ${top pid 8} ${top cpu 8}% ${top mem 8}%
${top name 9} $alignr ${top pid 9} ${top cpu 9}% ${top mem 9}%
${top name 10} $alignr ${top pid 10} ${top cpu 10}% ${top mem 10}%
]];
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here's how that looks.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/AxPFRyI.jpg&quot; alt=&quot;Conky&quot; /&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/conky-the-light-weight-system-monitor-for-x</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/conky-the-light-weight-system-monitor-for-x</guid>
        <pubDate>Thu, 31 Jan 2019 14:07:00 +0000</pubDate>
      </item>
          <item>
        <title>What is Git LFS?</title>
        <description>
          &lt;p&gt;I rarely use a Git UI. I mostly use within my text editor or in terminal. However when I do, I use gitkraken. I actually used source tree for a long time but ever since I moved to Linux this is my number one choice. Anyhow, this week I got a newsletter from the guys a gitkraken talking about LFS and I decided to show you guys what it's used for.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Git LFS stands for Large File Storage and is a tool many developers use to save space when working with binary files.&lt;/p&gt;

&lt;p&gt;Here's a small video explaining the concept and how to use it in gitkraken.&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;320px&quot; src=&quot;https://www.youtube.com/embed/S03EEusFxoI&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;If you never used &lt;a href=&quot;https://www.gitkraken.com/&quot;&gt;gitkraken&lt;/a&gt; I really recomend you give it a go.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/what-is-git-lfs</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/what-is-git-lfs</guid>
        <pubDate>Sat, 19 Jan 2019 14:09:00 +0000</pubDate>
      </item>
          <item>
        <title>Tired of signatures that can't be verified when running apt-get update?</title>
        <description>
          &lt;p&gt;If everytime you run &lt;em&gt;sudo apt-get update&lt;/em&gt;   you get the following error &quot;Err:14 URL HERE The following signatures couldn't be verified because the public key is not available: NO_PUBKEY PUBLIC_KEY_HERE&quot; and like me you want to fix that. Don't worry, I got your back.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;I got this error with the ppa related to the vivaldi browser, so my error was like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Err:14 http://repo.vivaldi.com/stable/deb stable Release.gpg The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8D04CE49EFB20B23
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The fix&lt;/p&gt;

&lt;p&gt;By far the simplest way to handle this now is with Y-PPA-Manager (which now integrates the launchpad-getkeys script with a graphical interface).&lt;/p&gt;

&lt;p&gt;To install it, first add the webupd8 repository for this program:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository ppa:webupd8team/y-ppa-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Update your software list and install Y-PPA-Manager:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get update
$ sudo apt-get install y-ppa-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Run y-ppa-manager (i.e. type y-ppa-manager then press enter key).&lt;/p&gt;

&lt;p&gt;When the main y-ppa-manager window appears, click on &quot;Advanced.&quot;&lt;/p&gt;

&lt;p&gt;From the list of advanced tasks, select &quot;Try to import all missing GPG keys&quot; and click OK.&lt;/p&gt;

&lt;p&gt;You're done! As the warning dialog says when you start the operation, it may take quite a while (about 30 seconds for me) depending on how many PPA's you have and the speed of your connection.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/tired-of-signatures-that-cant-be-verified-when-running-apt-get-update</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/tired-of-signatures-that-cant-be-verified-when-running-apt-get-update</guid>
        <pubDate>Thu, 17 Jan 2019 15:25:00 +0000</pubDate>
      </item>
          <item>
        <title>Getting started with Docker part 2 - Install Docker Compose </title>
        <description>
          &lt;p&gt;You can run Compose on macOS, Windows, and 64-bit Linux.&lt;/p&gt;

&lt;p&gt;Docker Compose relies on Docker Engine for any meaningful work, so make sure you have Docker Engine installed either locally or remote, depending on your setup.&lt;/p&gt;

&lt;p&gt;On Linux systems, first install the Docker for your OS as described on the Get Docker page, then come back here for instructions on installing Compose on Linux systems.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;To run Compose as a non-root user, see &lt;a href=&quot;https://docs.docker.com/install/linux/linux-postinstall/&quot;&gt;Manage Docker as a non-root user&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On Linux, you can download the Docker Compose binary from the Compose repository release page on GitHub. Follow the instructions from the link, which involve running the curl command in your terminal to download the binaries. These step by step instructions are also included below.&lt;/p&gt;

&lt;p&gt;Run this command to download the latest version of Docker Compose:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo curl -L &quot;https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Apply executable permissions to the binary:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Optionally, install command completion for the bash and zsh shell.&lt;/p&gt;

&lt;p&gt;I use zsh so here's what to do:&lt;/p&gt;

&lt;p&gt;Place the completion script in your /path/to/zsh/completion (typically ~/.zsh/completion/):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir -p ~/.zsh/completion
$ curl -L https://raw.githubusercontent.com/docker/compose/1.23.2/contrib/completion/zsh/_docker-compose &amp;gt; ~/.zsh/completion/_docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Include the directory in your $fpath by adding in ~/.zshrc:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fpath=(~/.zsh/completion $fpath)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Make sure compinit is loaded or do it by adding in ~/.zshrc:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;autoload -Uz compinit &amp;amp;&amp;amp; compinit -i
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then reload your shell:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;exec $SHELL -l
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Available completions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depending on what you typed on the command line so far, it completes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available docker-compose commands&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Options that are available for a particular command&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Service names that make sense in a given context, such as services with running or stopped instances or services based on images vs. services based on Dockerfiles. For docker-compose scale, completed service names automatically have “=” appended.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Arguments for selected options. For example, docker-compose kill -s completes some signals like SIGHUP and SIGUSR1.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Enjoy working with Compose faster and with fewer typos! &lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Test the installation.&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/&quot;&gt;Docker documentation&lt;/a&gt; for reference.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/getting-started-with-docker-part-2-install-docker-compose</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/getting-started-with-docker-part-2-install-docker-compose</guid>
        <pubDate>Tue, 15 Jan 2019 22:34:00 +0000</pubDate>
      </item>
          <item>
        <title>How to get started with Docker part 1 - Installing Docker</title>
        <description>
          &lt;p&gt;Yes, I know! Everyone has been using docker for the last few years but I'm late on that hype train. At work we're still using vagrant like assholes, that's my own fault really. I decided to dip my dick into that docker pool and blog the entire process. Here's the first part.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;I'm using Ubuntu now. So the docs for it is right &lt;a href=&quot;https://docs.docker.com/install/linux/docker-ce/ubuntu/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Uninstall old versions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Older versions of Docker were called docker or docker-engine. If these are installed, uninstall them:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get remove docker docker-engine docker.io containerd runc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;2. Setup the repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Update the apt package index:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Install packages to allow apt to use a repository over HTTPS:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add Docker’s official GPG key:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) &amp;lt;docker@docker.com&amp;gt;
sub   4096R/F273FCD8 2017-02-22
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Use the following command to set up the stable repository. You always need the stable repository, even if you want to install builds from the edge or test repositories as well. To add the edge or test repository, add the word edge or test (or both) after the word stable in the commands below.&lt;/p&gt;

&lt;p&gt;Note: The lsb_release -cs sub-command below returns the name of your Ubuntu distribution, such as xenial. Sometimes, in a distribution like Linux Mint, you might need to change $(lsb_release -cs) to your parent Ubuntu distribution. For example, if you are using Linux Mint Rafaela, you could use trusty.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository \
   &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;3. Install Docker CE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Update the apt package index.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Install the latest version of Docker CE, or go to the next step to install a specific version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install docker-ce
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, let's just test if everything is working as it should.&lt;/p&gt;

&lt;p&gt;Verify that Docker CE is installed correctly by running the hello-world image.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo docker container run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This should be your output.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:

 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the &quot;hello-world&quot; image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On the next article we're going to look into installing Docker compose.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/&quot;&gt;Docker documentation&lt;/a&gt; for reference.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-get-started-with-docker</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-get-started-with-docker</guid>
        <pubDate>Sun, 13 Jan 2019 21:40:00 +0000</pubDate>
      </item>
          <item>
        <title>Problems pairing Mazda 3 2017 model with Xiaomi ma2 Lite</title>
        <description>
          &lt;p&gt;A few weeks ago I bought me a new phone, the Xiaomi Ma2 Lite. Crazy good phone for the price. More on that &lt;a href=&quot;https://www.youtube.com/watch?v=ZSUWV7yBK8Q&quot;&gt;here&lt;/a&gt;. However, I had a small problem with the phone that was actually driving me nuts. I couldn't get it to recognize my car.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Took me a week to solve this problem, tried almost everything. Soft reset on the phone, soft reset on the car. Hard reset on the phone. I even did a hard reset to the car infotaiment system. But still, my phone could see all my bluetooth devices at home without exeception. But my car? Nope!&lt;/p&gt;

&lt;p&gt;Then I came across &lt;a href=&quot;https://forum.xda-developers.com/mi-a2-lite/help/mi-a2-lite-bluetooth-wont-pair-car-t3828878&quot;&gt;this article&lt;/a&gt; on xda-developers. Basically what worked was this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enable developer options;&lt;/li&gt;
&lt;li&gt;Go to Settings &gt; System &gt; Developer Options &lt;/li&gt;
&lt;li&gt;Enble &quot;Show Bluetooth devices without name&quot;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This way wen you want to connecto to a device you'll be presented with the mac-address and not the device name. This worked like a charm.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/problems-paring-mazda-3-2017-model-with-xiaomi-ma2-lite</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/problems-paring-mazda-3-2017-model-with-xiaomi-ma2-lite</guid>
        <pubDate>Sat, 03 Nov 2018 11:35:00 +0000</pubDate>
      </item>
          <item>
        <title>Ulauncher the application luncher for Linux</title>
        <description>
          &lt;p&gt;Ever since I moved away from mac and started using Linux as my daily driver there's been a few minor things that I miss obviously. One of the things is that I never really liked the default application launcher for ubuntu. I always loved the default one mac os has that has a lot of built in functionality. Or if you wanted more on mac you could even install Alfred and that was awesome too.&lt;/p&gt;

&lt;p&gt;So I looked a bit more and found out that you can have the exact same thin on Linux and its called Ulauncher.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://ulauncher.io/assets/images/demo.gif&quot; alt=&quot;Uluncher demo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It was basic feature like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fuzzy search&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type in an application name without worrying about spelling. Ulauncher will figure out what you meant. It also remembers your previous choices and automatically selects the best option for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom color themes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ulauncher provides 4 themes built in. But if you need something different you can always &lt;a href=&quot;https://gist.github.com/gornostal/02a232e6e560da7946c053555ced6cce&quot;&gt;create a custom color theme&lt;/a&gt;. Docs are &lt;a href=&quot;http://docs.ulauncher.io/en/latest/themes/themes.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shortcuts &amp;amp; extensions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Improve your workflow with customizable shortcuts and extensions. Create a shortcut for web search or your scripts or install a 3rd party extension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast directory browser&lt;/strong&gt;
Browse files and directories with ease.  Type ~ or / to start. Press Alt+Enter to access an alt menu.&lt;/p&gt;

&lt;p&gt;Assuming you're using debian you can just download the .deb file and install the thing.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/ulauncher-the-application-luncher-for-linux</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/ulauncher-the-application-luncher-for-linux</guid>
        <pubDate>Sat, 03 Nov 2018 09:16:00 +0000</pubDate>
      </item>
          <item>
        <title>The way remastered, what a ride</title>
        <description>
          &lt;p&gt;Last week I noticed this indie game on Nintendo Switch at just 1.99 euros. After seeing just a few clips on youtube I bought it at started playing. Man, what a ride.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn02.nintendo-europe.com/media/images/10_share_images/games_15/nintendo_switch_download_software_1/H2x1_NSwitchDS_TheWayRemastered_image1600w.jpg&quot; alt=&quot;The way remastered&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This game has just about everything I love in a game. It's hard but not stupid hard, you just have to take your time learning patterns. The puzzles are just amazing and the artwork? The artwork it's just perfect. Oh and have I told you about the sound track? The sound track takes you into a deep depression that you know your character is in. Ah right, the story. It's pretty basic. Scientist loses wife aka love of his live and goes on a quest to revive her at all cost. That's it.&lt;/p&gt;

&lt;p&gt;Anyhow, if you have time and love this kind of game just give it a go.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/the-way-remastered,-what-a-ride</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/the-way-remastered,-what-a-ride</guid>
        <pubDate>Mon, 22 Oct 2018 20:33:00 +0000</pubDate>
      </item>
          <item>
        <title>Javascript is basically cancer!</title>
        <description>
          &lt;p&gt;Most of us these days have loads of RAM to spare on our laptops and desktops. But do you remember a time when you had a computer just to do some web browsing and just 2GB of ram was what you needed?&lt;/p&gt;

&lt;p&gt;These days you have just a few tabs open on your browser and you can see the ram just going up and up.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;A good example on this is reddit. Reddit was a lightweight website (client side) but these days if you have a thread open and looking at the contents of your RAM you can see that the page alone claims around 236MB of data. The majority of it is objects that the various JS scripts on the webpage created long after the page was actually downloaded.&lt;/p&gt;

&lt;p&gt;I normally never have more than 15 chrome tabs open and this is what that looks.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/M8mG9BN.png&quot; alt=&quot;htop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Websites are getting heavy and JS frameworks are a core problem of it. Turn off JavaScript in your browser and watch how quickly the RAM usage drops to near nothing, and that's the core issue here. JavaScript has become this massive beast that just gets worse each year that goes by as devs pile more and more &quot;features&quot;. Just as a test I turned JavaScript off, opened 38 tabs (different news sites, tech companies like Apple/Microsoft/Dell... and a few programming sites python, w3, etc...) Total weight of Chome in RAM, ~650MB.&lt;/p&gt;

&lt;p&gt;To say JavaScript is getting out of hand really undersales the issue. JavaScript has reached nightmarishly abusive levels. Heck a lot of sites (imgur) won't even do anything unless you turn on JavaScript and then when you do, the site by itself wrecks havoc with your RAM. To compound issues, some sites will load into memory eight different fuzzy fonts that's specific to just that site that you are on, and the worst are when that font is used for at most 400 bytes worth of text. You are left saying to yourself, &quot;Seriously website? You downloaded a 3.8MB font file and loaded into memory just so you could render 400 bytes in foo-foo font? You could have just made a 1.8KB jpeg for 100 different languages and loaded the one image or FFS all 100 images, and it would still be more lightweight than 3.8MB of font that I'll more than likely never notice!&quot;&lt;/p&gt;

&lt;p&gt;I'm not trying to make excuses for browsers, they ought to release resources a bit quicker or at least provide a slider that allows the user to make that call (because web browsers aren't exactly sure if you'll hit the back button or not, so it holds on to those resources for a good deal of time because reloading those resources could be a significant performance hit) and then sometimes folks get into the apologist stance and say, &quot;well unused RAM is bad RAM.&quot; But the bigger point folks should focus on is how absolutely insanely ginormous webpages have become, and the abusive JS frameworks that are massive and create 1000s of objects just to do a simple task is single handedly the biggest reason your web browser is eating RAM faster than Charlie Sheen can snort cocaine.&lt;/p&gt;

&lt;p&gt;Now I'm not saying that we should stick to website that are just plain text to cut on some ram. There's use cases where that heavy usage of javascript is just amazing. Take a look at websites like Twitch, Netflix or even something like Google Drive.&lt;/p&gt;

&lt;p&gt;Do me a big favor, next time you just npm install the latest framework and all associated dependencies if you don't understand the overhead and runtime consequences of implementing that code in an objectively shitty language you are basically ruining the web. It needs to be stripped back again. When your bundle.js ginormous you need to rethink your strategy.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/javascript-is-basically-cancer</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/javascript-is-basically-cancer</guid>
        <pubDate>Tue, 11 Sep 2018 20:26:00 +0000</pubDate>
      </item>
          <item>
        <title>Custumize your grub with Grub Customizer</title>
        <description>
          &lt;p&gt;For those who need to modify the default Grub boot-loader settings, &lt;a href=&quot;https://launchpad.net/grub-customizer&quot;&gt;Grub Customizer&lt;/a&gt; is a useful tool with a graphical user interface.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Main features:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Move, remove or rename menuentries (they stey updatable by update-grub)&lt;/p&gt;
  
  &lt;p&gt;Edit the contents of menuentries or create new ones (internally it edits the 40_custom)&lt;/p&gt;
  
  &lt;p&gt;Support for GRUB2 and BURG&lt;/p&gt;
  
  &lt;p&gt;Reinstallation of the bootloader to MBR&lt;/p&gt;
  
  &lt;p&gt;Settings like default operating system, kernel params, background image and text colors etc.&lt;/p&gt;
  
  &lt;p&gt;Changing the installed operating system by running on a live cd&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;To install Grub Customizer in Ubuntu:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The software has an official PPA repository contains the packages for all current Ubuntu releases.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open terminal either via Ctrl+Alt+T or by searching for ‘terminal’ from app launcher. When it opens, run command to add the PPA:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo add-apt-repository ppa:danielrichter2007/grub-customizer
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After added the PPA, run commands one by one to refresh package cache and install Grub Customizer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install grub-customizer
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once installed, launch the software from your application launcher and enjoy!&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/custumize-your-grub-with-grub-customizer</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/custumize-your-grub-with-grub-customizer</guid>
        <pubDate>Sat, 25 Aug 2018 08:35:00 +0000</pubDate>
      </item>
          <item>
        <title>I think I just found my favorite icon pack for gnome</title>
        <description>
          &lt;p&gt;Presenting &lt;a href=&quot;https://github.com/daniruiz/flat-remix&quot;&gt;Flat Remix&lt;/a&gt;. Flat remix is a pretty simple icon theme inspired on material design. It is mostly flat with some shadows, highlights and gradients for some depth and uses a colorful palette with nice contrasts.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/daniruiz/Flat-Remix/master/preview.png&quot; alt=&quot;Flat remix&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Flat Remix icon theme is available in three variants:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Flat Remix - main icon theme&lt;/li&gt;
&lt;li&gt;Flat Remix Dark - for dark interfaces&lt;/li&gt;
&lt;li&gt;Flat Remix Light - for light interfaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Terminal installation&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd /tmp &amp;amp;&amp;amp; rm -rf flat-remix &amp;amp;&amp;amp;
git clone https://github.com/daniruiz/flat-remix &amp;amp;&amp;amp;
mkdir -p ~/.icons &amp;amp;&amp;amp; cp -r flat-remix/Flat-Remix* ~/.icons/ &amp;amp;&amp;amp;
gsettings set org.gnome.desktop.interface icon-theme &quot;Flat-Remix&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Ubuntu based distributions&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository ppa:daniruiz/flat-remix
$ sudo apt-get update
$ sudo apt-get install flat-remix
&lt;/code&gt;&lt;/pre&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/i-think-i-just-found-my-favourite-icon-pack-for-gnome</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/i-think-i-just-found-my-favourite-icon-pack-for-gnome</guid>
        <pubDate>Wed, 08 Aug 2018 21:21:00 +0000</pubDate>
      </item>
          <item>
        <title>How to Create ‘System Restore’ Points in Ubuntu 18.04</title>
        <description>
          &lt;p&gt;Since I moved up all my work stuff into Linux (mostly Ubuntu 18.04) I've been exploring more and more on how to perfect my work environment. Last thing we all need is to not have backups in place. Specially if its a work environment. For that we have &lt;a href=&quot;https://github.com/teejee2008/timeshift/&quot;&gt;TimeShift&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Timeshift for Linux is an application that provides functionality similar to the System Restore feature in Windows and the Time Machine tool in Mac OS. Timeshift protects your system by taking incremental snapshots of the file system at regular intervals. These snapshots can be restored at a later date to undo all changes to the system.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/teejee2008/timeshift/master/images/main_window.png&quot; alt=&quot;Timeshift&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Basically you have two modes:&lt;/p&gt;

&lt;p&gt;In RSYNC mode, snapshots are taken using rsync and hard-links. Common files are shared between snapshots which saves disk space. Each snapshot is a full system backup that can be browsed with a file manager.&lt;/p&gt;

&lt;p&gt;In BTRFS mode, snapshots are taken using the in-built features of the BTRFS filesystem. BTRFS snapshots are supported only on BTRFS systems having an Ubuntu-type subvolume layout (with @ and @home subvolumes).&lt;/p&gt;

&lt;p&gt;Snapshots are saved by default on the system (root) partition in path /timeshift. Other linux partitions can also be selected. For best results the snapshots should be saved to an external (non-system) partition.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/teejee2008/timeshift/master/images/settings_location.png&quot; alt=&quot;timeshift&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Multiple levels of snapshots can be enabled - Hourly, Daily, Weekly, Monthly and Boot&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/teejee2008/timeshift/master/images/settings_schedule.png&quot; alt=&quot;timeshift&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;Installation&lt;/h3&gt;

&lt;p&gt;Ubuntu, Linux Mint, Elementary OS, etc.&lt;/p&gt;

&lt;p&gt;Packages are available in the Launchpad PPA for supported Ubuntu releases. Run the following commands in a terminal window:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository -y ppa:teejee2008/ppa
$ sudo apt-get update
$ sudo apt-get install timeshift    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That was easy right? :)&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-create-system-restore-points-in-ubuntu-18.04</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-create-system-restore-points-in-ubuntu-18.04</guid>
        <pubDate>Mon, 06 Aug 2018 16:53:00 +0000</pubDate>
      </item>
          <item>
        <title>Spotify snap broken with Nvidia driver 396.24.02? I got your back.</title>
        <description>
          &lt;p&gt;Upgraded my Nvidia driver just now from 396.24.0 to 396.24.02, rebooted, and Spotify no longer works. It opens a window but never draws anything but a black screen.&lt;/p&gt;

&lt;!--more--&gt;

&lt;pre&gt;&lt;code&gt;$ snap run spotify
Gtk-Message: Failed to load module &quot;gail&quot;
Gtk-Message: Failed to load module &quot;atk-bridge&quot;
Gtk-Message: Failed to load module &quot;canberra-gtk-module&quot;
ATTENTION: default value of option force_s3tc_enable overridden by environment.
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
[0604/185738.869585:ERROR:gl_context_glx.cc(227)] Couldn't make context current with X drawable.
[0604/185738.869619:ERROR:gpu_info_collector.cc(62)] gl::GLContext::MakeCurrent() failed
[0604/185746.603499:ERROR:browser_gpu_channel_host_factory.cc(120)] Failed to launch GPU process.    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/p0yeYFe.png&quot; alt=&quot;screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The solution is quite simple. Until fixed snaps are available, you can start spotify without GPU accelerated graphics.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ snap run spotify --disable-gpu
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;small&gt;&lt;strong&gt;Update:&lt;/strong&gt; Since 06/08/2018 spotify is working fine with the new drivers!&lt;/small&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/spotify-snap-broken-with-nvidia-driver-396.24.02-i-got-your-back</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/spotify-snap-broken-with-nvidia-driver-396.24.02-i-got-your-back</guid>
        <pubDate>Tue, 24 Jul 2018 19:59:00 +0000</pubDate>
      </item>
          <item>
        <title>git commander another great command line interface tool</title>
        <description>
          &lt;p&gt;This is a git tool that gives more friendly way to navigate your git logs, commit or even diff files. Personally I use git most times inside Sublime Text 3. However its always nice to have a tool like this at hand.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/golbin/git-commander/master/doc/git-commander@2x.gif&quot; alt=&quot;git commander&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git status&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git add [files]&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git reset -- [files]&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git commit [files]&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git log&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git reset&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git diff file&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; git branch&lt;/li&gt;
&lt;/ul&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/git-commander-another-great-command-line-interface</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/git-commander-another-great-command-line-interface</guid>
        <pubDate>Wed, 18 Jul 2018 20:54:00 +0000</pubDate>
      </item>
          <item>
        <title>Start using CLI more and more with mycli</title>
        <description>
          &lt;p&gt;Ever since I moved into Linux I started using the CLI even more. Don't get me wrong, I used it quite a lot on Mac. However if there was one thing that I normally didn't use it for was for mySQL. However a few days ago I discovered &lt;a href=&quot;http://www.mycli.net/&quot;&gt;mycli&lt;/a&gt;. Since then I gotta say. Love it!&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Here's a bit more about the tool.&lt;/p&gt;

&lt;p&gt;Install the thing first:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install mycli    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mycli --help
Usage: mycli [OPTIONS] [DATABASE]
A MySQL terminal client with auto-completion and syntax highlighting.

Examples:
    - mycli my_database
    - mycli -u my_user -h my_host.com my_database
    - mycli mysql://my_user@my_host.com:3306/my_database

Options:
    -h, --host TEXT               Host address of the database.
    -P, --port INTEGER            Port number to use for connection. Honors $MYSQL_TCP_PORT.
    -u, --user TEXT               User name to connect to the database.
    -S, --socket TEXT             The socket file to use for connection.
    -p, --password TEXT           Password to connect to the database.
    --pass TEXT                   Password to connect to the database.
    --ssl-ca PATH                 CA file in PEM format.
    --ssl-capath TEXT             CA directory.
    --ssl-cert PATH               X509 cert in PEM format.
    --ssl-key PATH                X509 key in PEM format.
    --ssl-cipher TEXT             SSL cipher to use.
    --ssl-verify-server-cert      Verify server's &quot;Common Name&quot; in its cert against hostname used when connecting. This option is disabled by default.
    -V, --version                 Output mycli's version.
    -v, --verbose                 Verbose output.
    -D, --database TEXT           Database to use.
    -d, --dsn TEXT                Use DSN configured into the [alias_dsn] section of myclirc file.
    --list-dsn                    list of DSN configured into the [alias_dsn] section of myclirc file.
    -R, --prompt TEXT             Prompt format (Default: &quot;\t \u@\h:\d&amp;gt; &quot;).
    -l, --logfile FILENAME        Log every query and its results to a file.
    --defaults-group-suffix TEXT  Read MySQL config groups with the specified suffix.
    --defaults-file PATH          Only read MySQL options from the given file.
    --myclirc PATH                Location of myclirc file.
    --auto-vertical-output        Automatically switch to vertical output mode if the result is wider than the terminal width.
    -t, --table                   Display batch output in table format.
    --csv                         Display batch output in CSV format.
    --warn / --no-warn            Warn before running a destructive query.
    --local-infile BOOLEAN        Enable/disable LOAD DATA LOCAL INFILE.
    --login-path TEXT             Read this path from the login file.
    -e, --execute TEXT            Execute command and quit.
    --help                        Show this message and exit.    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/dbcli/mycli/master/screenshots/tables.png&quot; alt=&quot;Example&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/dbcli/mycli/master/screenshots/main.gif&quot; alt=&quot;Example 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mycli.net/&quot;&gt;mycli&lt;/a&gt; is written using &lt;a href=&quot;https://github.com/jonathanslenders/python-prompt-toolkit/&quot;&gt;prompt_toolkit&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Auto-completion as you type for SQL keywords as well as tables, views and columns in the database.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Syntax highlighting using Pygments.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Smart-completion (enabled by default) will suggest context-sensitive completion.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; SELECT * FROM &lt;tab&gt; will only show table names.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; SELECT * FROM users WHERE &lt;tab&gt; will only show column names.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Support for multiline queries.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Favorite queries with optional positional parameters. Save a query using \fs alias query and execute it with \f alias whenever you need.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Timing of sql statments and table rendering.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Config file is automatically created at ~/.myclirc at first launch.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Log every query and its results to a file (disabled by default).&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Pretty prints tabular data (with colors!)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Support for SSL connections&lt;/li&gt;
&lt;/ul&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/start-using-cli-more-and-more</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/start-using-cli-more-and-more</guid>
        <pubDate>Wed, 18 Jul 2018 20:16:00 +0000</pubDate>
      </item>
          <item>
        <title>Using the MSSQL driver to connect to a old SQL server in PHP</title>
        <description>
          &lt;p&gt;One of reasons we had to use PHP 5.6 in one of our recent projets was related to the fact that we needed to get info from the clients ERP, that one only allowed a connection via MSSQL. So after we got the &lt;a href=&quot;https://blog.marcomonteiro.net/post/having-multiple-php-versions-on-your-dev-environment&quot;&gt;project running with PHP 5.6 instead of 7.2&lt;/a&gt; we had to install the MSSQL drivers.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Here's how.&lt;/p&gt;

&lt;p&gt;This was done on Ubuntu 16.04 but I tested it on 18.04 too.&lt;/p&gt;

&lt;p&gt;First, make sure you're up to date on all of your packages.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then we need to install all the FreeTDS &amp;amp; Dependencies.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install php5-sybase freetds-common libsybdb5
$ sudo apache2ctl restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Just restart apache and you should be good to go.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo service apache2 restart
&lt;/code&gt;&lt;/pre&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/using-the-mssql-driver-to-connect-to-a-old-sql-server-in-php</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/using-the-mssql-driver-to-connect-to-a-old-sql-server-in-php</guid>
        <pubDate>Fri, 13 Jul 2018 09:46:05 +0000</pubDate>
      </item>
          <item>
        <title>Having multiple PHP versions on your dev environment</title>
        <description>
          &lt;p&gt;There's one of our servers that we use to run small applications for a bunch of clients. At the time when we were configuring this server we ended up choosin PHP 7.2.x as the version that would be used for these clients. However, once we started the development process we needed to connect to the clients ERP. Guess what? That connection needed php version 5.6.x max to work.&lt;/p&gt;

&lt;p&gt;Here's the process to get everything up and running on Ubuntu 16.04, we also tested this on Ubuntu 18.04 and everything worked like a charm.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Install apache:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt update 
$ sudo apt install apache2 libapache2-mod-fastcgi     
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On some cases you'll get an error saying that you can't install libeapache2-mod-fastcgi.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Package libapache2-mod-fastcgi is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or is only available from another source
 E: Package 'libapache2-mod-fastcgi' has no installation candidate    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That can be resolved with the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /tmp &amp;amp;&amp;amp; wget http://mirrors.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
    sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb; sudo apt install -f    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The second step is to install PHP&lt;/p&gt;

&lt;p&gt;For the installation of PHP versions, we use the PPA maintained here. Use the below couple of commands to add the PPA to your system.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt install python-software-properties
$ sudo add-apt-repository ppa:ondrej/php    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We're almost there.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ apt update
$ sudo apt install php5.6 php5.6-fpm
$ sudo apt install php7.2 php7.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we want to make sure everything is up and running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo systemctl status php5.6-fpm
$ sudo systemctl status php7.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Everything that is left to do is configure our Apache.&lt;/p&gt;

&lt;p&gt;Enable few modules required for the configuration of multiple PHP versions with Apache. These modules are necessary to integrate PHP FPM and FastCGI with Apache server.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ sudo a2enmod actions fastcgi alias proxy_fcgi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In our www folder we create two projects. Lets say for the sake of this example its something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo mkdir /var/www/php5
$ sudo mkdir /var/www/php7
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, create and index.php containing the phpinfo() function on each one.&lt;/p&gt;

&lt;p&gt;Let’s start the creation of VirtualHost. Apache keeps all the VirtualHost configuration files under /etc/apache2/sites-available with the extension .conf. Create a file for the first virtual host and edit in your favorite text editor.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo vim /etc/apache2/sites-available/php5.local.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add the following content. Make sure to use correct ServerName and directory path according to your setup. This website is configured to work with PHP 5.6.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  &amp;lt;VirtualHost *:80&amp;gt;
  ServerName php5.local
  DocumentRoot /var/www/php5
  &amp;lt;Directory /var/www/php5&amp;gt;
      Options -Indexes +FollowSymLinks +MultiViews
      AllowOverride All
      Require all granted
  &amp;lt;/Directory&amp;gt;
  &amp;lt;FilesMatch \.php$&amp;gt;
      # Apache 2.4.10+ can proxy to unix socket
      SetHandler &quot;proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost/&quot;
  &amp;lt;/FilesMatch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/VirtualHost&gt;&lt;/p&gt;

&lt;p&gt;Same thing for the other one with a different path and different PHP version.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo vim /etc/apache2/sites-available/php7.local.conf


&amp;lt;VirtualHost *:80&amp;gt;
ServerName php7.local
DocumentRoot /var/www/php7
&amp;lt;Directory /var/www/php7&amp;gt;
    Options -Indexes +FollowSymLinks +MultiViews
    AllowOverride All
    Require all granted
&amp;lt;/Directory&amp;gt;
&amp;lt;FilesMatch \.php$&amp;gt;
    SetHandler &quot;proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/&quot;
&amp;lt;/FilesMatch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/VirtualHost&gt;&lt;/p&gt;

&lt;p&gt;Restart apache to get everything up and running.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ sudo service apache2 restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Job done. Now you have two applications running different PHP versions on the same machine.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/having-multiple-php-versions-on-your-dev-environment</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/having-multiple-php-versions-on-your-dev-environment</guid>
        <pubDate>Thu, 12 Jul 2018 18:04:00 +0000</pubDate>
      </item>
          <item>
        <title>GDPR madness, right?</title>
        <description>
          &lt;p&gt;First let me be clear, I'm not talking about other countries, I'm mainly talking about Portugal here, since its where I live and its obviously where I'm taking all the examples from.&lt;/p&gt;

&lt;p&gt;That said, here it goes.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Before the 25th of May, many were talking about everything that was going to happen, everyone was an expert. That's not really bad, at least people were talking about something that's important - user private data is no laughing matter.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;img src=&quot;https://imgs.xkcd.com/comics/personal_data.png&quot; alt=&quot;Alarm&quot; /&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Some companies started taking things into their own hands and got to work. Others hired &quot;experts&quot; from the outside to help them out. However, many did something different, they didn't do shit.&lt;/p&gt;

&lt;p&gt;The 25th of May finally came and nothing was the same! Or was it?&lt;/p&gt;

&lt;p&gt;Well basically, I see it this way, there's 3 scenarios right now.&lt;/p&gt;

&lt;p&gt;Companies that started implementing everything early are now living normal lives. Their day to day hasn't change and it's business as usual.
The ones that hired outside help on this, wasted loads of money are probably still wasting it, when they could probably could take care of everything indoors.&lt;/p&gt;

&lt;p&gt;Finally the ones that didn't do any of the above are watching the news. Waiting to see if anyone is fined. In case that happens sure, they will panic and will start doing something about it. Otherwise most of the companies will do nothing.&lt;/p&gt;

&lt;p&gt;Who's right in all this? In my opinion GDPR is nothing that problematic. My only advise in all this is just to take the data about your users seriously. Don't be the company that doesn't do anything about it and complains that's this is too much work. Sure it takes time, but the world will be a better lace if everyone does it.&lt;/p&gt;

&lt;p&gt;Another thing that bothers me to no end. Before the 25th the media wasn't talking about this at all. After the 25th there's a few articles here and there about it, but mostly there's lots of discussions on social media about it. Once again, people only think about this stuff when they really have to.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/gdpr-madness-right</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/gdpr-madness-right</guid>
        <pubDate>Tue, 05 Jun 2018 21:53:00 +0000</pubDate>
      </item>
          <item>
        <title>My linux setup</title>
        <description>
          &lt;p&gt;A few weeks ago I reported that I made the change from Mac to Linux. Since then I tested loads of stuff in Linux to the point where I choose my stuff. Later Ubuntu 18.04 came out and I decided to do a clean install with just the software I wanted.&lt;/p&gt;

&lt;p&gt;Here's the result.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Linux Distro: &lt;a href=&quot;http://releases.ubuntu.com/18.04/&quot;&gt;Ubuntu 18.04&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First thing I did was change the layout and to do that I started with Gnome Tweak Tool.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-terminal&quot;&gt;&lt;/i&gt; sudo apt install gnome-tweak-tool&lt;/p&gt;

&lt;p&gt;Here's my appearance settings:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src=&quot;https://i.imgur.com/s9ctXv6.png&quot; alt=&quot;Appearance&quot; /&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;On my desktop tab I have everything on (show icons, home, network servers, trash and mounted volumes).&lt;/p&gt;

&lt;p&gt;Then some extensions were installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Audio output switcher (I can change the output from headset to speakers)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Clipboard indicator (have a clipboard history)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Coverflow Alt-Tab (a fancy alt+tab menu)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Custom corner (custom corner shortcuts)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Dropdown Terminal (terminal opening on top of everything with shortcut)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Flippery Move Clock (move the clock to the right)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;OpenWeather (weather in the top menu)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Panel OSD (custom notifications)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Places Status Indicator (places menu)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Remove Dropdown Arrows (remove the dropdown arrows to have extra space)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Status area horizontal spacing (reduce horizontal space)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Ubuntu AppIndicators (always how indicators of the app you're using)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Ubuntu Dock (already came with the system)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Dash to Panel (save them pixels and use just one bar)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Suspend button (adds the suspend button to the gnome menu)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On my Top Bar I left only the applications Menu and Date. Everything else was removed. Layout wise was only a few more changes to do, those were made with the system wide settings menu.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/GFh5DG8.png&quot; alt=&quot;Settings Dock&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here's the final look.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/sDnUfjd.png&quot; alt=&quot;Desktop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, on to the apps I installed to help with my day to day use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Mailspring (email client)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Sublime Text 3&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Atom&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Discord&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Terminator&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Quassel IRC&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; VLC media player&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Caffeine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; GitKraken&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; FreeOffice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only thing I'm still testing is a database managing software like Sequel Pro. I really loved that app on Mac.&lt;/p&gt;

&lt;p&gt;Anything else I'm missing? Let me know!&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/my-linux-setup</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/my-linux-setup</guid>
        <pubDate>Sun, 27 May 2018 12:00:00 +0000</pubDate>
      </item>
          <item>
        <title>Yeah! I'm not using mac anymore</title>
        <description>
          &lt;p&gt;Let's be clear, I'm still using OSX at work, mostly because there's no need to change there these days. The computer is already there, so why change?&lt;/p&gt;

&lt;p&gt;For the past 8 or 9 years I've been using as my main computer a macbookpro. First gen I bought was awesome, lasted for years. Upgraded it with some more RAM, and then I even removed the DVD player (remember those?) and shoved a SSD and the computer was great.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Then I decided to sell it and bought one of the new ones. One of those that you can't really do anything to it (hardware wise). After some thought I decided it was time to make a decision, and believe it or not it all started with me selling my PS4. Sold it and decided to make a gamming rig. Then I also sold my new macbookpro and I was like  &quot;-Man, I could make a hackingtosh!&quot; So I made my gamming rig with all compatible parts and build it like that.&lt;/p&gt;

&lt;p&gt;Bought a second SSD so I could have really separate environments, windows and OSX. Problem was, when I started fidling with the hackingtosh I got bored with it very fast.&lt;/p&gt;

&lt;p&gt;Next logical step? I gave Ubuntu 17.10 a go and man was I impressed, everything is so fucking awesome with it. Works so well, they removed Unity that I always hated and got back to gnome 3.&lt;/p&gt;

&lt;p&gt;My environment now is basically one hardrive with Linux and one with Windows 10 (that I actually kinda like too).&lt;/p&gt;

&lt;p&gt;People, do you a favor if you're a developer start looking at other alternatives, because windows 10 and Linux really are these days.&lt;/p&gt;

&lt;p&gt;I'll be posting more details about my environment soon.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/yeah-i-i'm-using-mac-anymore</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/yeah-i-i'm-using-mac-anymore</guid>
        <pubDate>Wed, 04 Apr 2018 21:17:00 +0000</pubDate>
      </item>
          <item>
        <title>My Sublime text 3 config</title>
        <description>
          &lt;p&gt;For the last 4 years or so I've been using sublime text 2. I bought the license, therefore I saw no point in upgrading. Until today, when I found out that I could use my ST2 license on ST3 (beta). Today was configuration day and I re-configured editor or choice.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Packages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io&quot;&gt;Package Control&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Sublime Text package manager that makes it exceedingly simple to find, install and keep packages up-to-date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/BracketHighlighter&quot;&gt;BracketHighligher&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bracket Highlighter matches a variety of brackets such as: [], (), {}, &quot;&quot;, '', #!xml &lt;tag&gt;&lt;/tag&gt;, and even custom brackets.&lt;/p&gt;

&lt;p&gt;This was originally forked from pyparadigm's SublimeBrackets and SublimeTagmatcher (both are no longer available). I forked this to fix some issues I had and to add some features I had wanted. I also wanted to improve the efficiency of the matching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/CodeIgniter%20Snippets&quot;&gt;Codeigniter Snippets&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A list of codeigniter snippets for Sublime Text 2. If you use Codeigniter this is a must have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/DocBlockr&quot;&gt;DocBlockr&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DocBlockr is a package for Sublime Text 2 &amp;amp; 3 which makes writing documentation a breeze. DocBlockr supports JavaScript (including ES6), PHP, ActionScript, Haxe, CoffeeScript, TypeScript, Java, Apex, Groovy, Objective C, C, C++ and Rust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/Emmet&quot;&gt;Emmet&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Emmet is a plugin for many popular text editors which greatly improves HTML &amp;amp; CSS workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/Git&quot;&gt;Git&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;https://packagecontrol.io/packages/Git&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/GitGutter&quot;&gt;GitGutter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Sublime Text 2/3 plugin to see git diff in gutter&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/PhpDoc&quot;&gt;PhpDoc&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PhpDoc support package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/SideBarEnhancements&quot;&gt;SideBarEnhancements&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Provides enhancements to the operations on Sidebar of Files and Folders for Sublime Text. http://www.sublimetext.com/ Notably provides delete as “move to trash”, open with.. and a clipboard. Close, move, open and restore buffers affected by a rename/move command. (even on folders)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/SublimeLinter&quot;&gt;SublimeLinter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Interactive code linting framework for Sublime Text 3&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/SublimeLinter-php&quot;&gt;SublimeLinter-php&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SublimeLinter 3 plugin for PHP, using php -l.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/DocPHPManualer&quot;&gt;DocPHP&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Show the document of current function on Sublime Text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/Material%20Theme&quot;&gt;Material Theme&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Material Theme, the most epic theme for Sublime Text 3 by Mattia Astorino&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/Statusbar%20Path&quot;&gt;Statusbar Path&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since I use Sublime in fullscreen most of the time its really usefull to have the complete path of the file I'm working on on the status bar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://packagecontrol.io/packages/phpfmt&quot;&gt;PHPfmt&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one is essential so you dont have to worry about your indentation in php.&lt;/p&gt;

&lt;p&gt;Here's my config:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
&quot;enable_auto_align&quot;: false,
&quot;indent_with_space&quot;: true,
&quot;passes&quot;:
[
    &quot;ConvertOpenTagWithEcho&quot;,
    &quot;PrettyPrintDocBlocks&quot;,
    &quot;ReturnNull&quot;,
    &quot;OnlyOrderUseClauses&quot;
],
&quot;psr1&quot;: false,
&quot;psr2&quot;: true,
&quot;version&quot;: 2
}    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;And finally my config file:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &quot;auto_complete_commit_on_tab&quot;: false,
  &quot;bold_folder_labels&quot;: true,
  &quot;caret_style&quot;: &quot;phase&quot;,
  &quot;color_scheme&quot;: &quot;Packages/Material Theme/schemes/Material-Theme.tmTheme&quot;,
  &quot;detect_indentation&quot;: false,
  &quot;draw_white_space&quot;: &quot;all&quot;,
  &quot;fallback_encoding&quot;: &quot;UTF-8&quot;,
  &quot;file_exclude_patterns&quot;:
  [
      &quot;*.pyc&quot;,
      &quot;*.pyo&quot;,
      &quot;*.exe&quot;,
      &quot;*.dll&quot;,
      &quot;*.obj&quot;,
      &quot;*.o&quot;,
      &quot;*.a&quot;,
      &quot;*.lib&quot;,
      &quot;*.so&quot;,
      &quot;*.dylib&quot;,
      &quot;*.ncb&quot;,
      &quot;*.sdf&quot;,
      &quot;*.suo&quot;,
      &quot;*.pdb&quot;,
      &quot;*.idb&quot;,
      &quot;.DS_Store&quot;,
      &quot;*.class&quot;,
      &quot;*.psd&quot;,
      &quot;*.db&quot;
  ],
  &quot;folder_exclude_patterns&quot;:
  [
      &quot;.svn&quot;,
      &quot;.hg&quot;,
      &quot;CVS&quot;,
      &quot;.hgcheck&quot;
  ],
  &quot;font_face&quot;: &quot;M+ 1mn light&quot;,
  &quot;font_size&quot;: 14,
  &quot;highlight_line&quot;: true,
  &quot;highlight_modified_tabs&quot;: true,
  &quot;ignored_packages&quot;:
  [
      &quot;Vintage&quot;
  ],
  &quot;line_padding_bottom&quot;: 1,
  &quot;line_padding_top&quot;: 2,
  &quot;match_brackets&quot;: true,
  &quot;match_brackets_angle&quot;: true,
  &quot;match_brackets_braces&quot;: true,
  &quot;match_brackets_content&quot;: true,
  &quot;match_brackets_square&quot;: true,
  &quot;rulers&quot;:
  [
      80,
      120
  ],
  &quot;scroll_past_end&quot;: true,
  &quot;show_full_path&quot;: true,
  &quot;tab_size&quot;: 4,
  &quot;tabs_small&quot;: true,
  &quot;theme&quot;: &quot;Material-Theme.sublime-theme&quot;,
  &quot;translate_tabs_to_spaces&quot;: true,
  &quot;trim_trailing_white_space_on_save&quot;: true,
  &quot;vintage_ctrl_keys&quot;: true,
  &quot;vintage_start_in_command_mode&quot;: false,
  &quot;word_wrap&quot;: true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Keybindings&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[
    { &quot;keys&quot;: [&quot;ctrl+shift+left&quot;], &quot;command&quot;: &quot;next_view_in_stack&quot; },
    { &quot;keys&quot;: [&quot;ctrl+shift+right&quot;], &quot;command&quot;: &quot;prev_view_in_stack&quot; },
    { &quot;keys&quot;: [&quot;alt+d&quot;], &quot;command&quot;: &quot;goto_definition&quot; },
    { &quot;keys&quot;: [&quot;ctrl+7&quot;], &quot;command&quot;: &quot;toggle_comment&quot;, &quot;args&quot;: { &quot;block&quot;: false } },
    { &quot;keys&quot;: [&quot;ctrl+shift+7&quot;], &quot;command&quot;: &quot;toggle_comment&quot;, &quot;args&quot;: { &quot;block&quot;: true } }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This way if you don't need to click to use the goto definition functionality.&lt;/p&gt;

&lt;p&gt;If you want to use the same font I use you can find it &lt;a href=&quot;http://www.fontspace.com/m-fonts/m-1mn&quot;&gt;here&lt;/a&gt; on some ocasions I also use &lt;a href=&quot;http://www.fontspace.com/search/?q=M%2B+2m&quot;&gt;M+ 2m&lt;/a&gt;. One other thing I also like to change is the application icon. At home I use &lt;a href=&quot;https://dribbble.com/shots/2289001-Sublime-Text-Icon-Replacement&quot;&gt;this one&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you really want to go nuts about it you can also add a icon package thing so all your icon files are specific to the type of file you have open. Some themes have that, some don't. To solve that just use &lt;a href=&quot;https://github.com/mrmartineau/SetiUI-Icons-Sublime&quot;&gt;this repo here&lt;/a&gt; and follow all the instructions.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/my-sublime-text-3-config</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/my-sublime-text-3-config</guid>
        <pubDate>Thu, 02 Feb 2017 16:03:00 +0000</pubDate>
      </item>
          <item>
        <title>Are you still using NFS to sync your file over to your virtual box?</title>
        <description>
          &lt;p&gt;For quite a while I must admit I been using this method to sync my files. This has been problematic, files not really syncing in real time can be a pain in the ass, sepecially when you're making changes on front-end and want to see those changes on the fly.&lt;/p&gt;

&lt;p&gt;So, do yourself a favor and change to rsync. To do so, you just need to edit your vagrant file for something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;config.vm.synced_folder &quot;./&quot;, &quot;/vagrant&quot;, type: &quot;rsync&quot;,
    rsync__exclude: &quot;.git/&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This way you're using rsync and you're excluding your git folder. You can add other folder there. Now, when you start your vagrant box you have to do this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant up
$ vagrant rsync-auto
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And your files will be synced automatically.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/are-you-still-using-nfs-to-sync-your-file-over-to-your-virtual-box</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/are-you-still-using-nfs-to-sync-your-file-over-to-your-virtual-box</guid>
        <pubDate>Thu, 19 Jan 2017 21:45:00 +0000</pubDate>
      </item>
          <item>
        <title>Codeigniter version 4 needs your help</title>
        <description>
          &lt;p&gt;CodeIgniter 4 has its own Github repository. It deviates enough from CodeIgniter 3 that the British Columbia Institute of Technology wanted to keep them separate. The CodeIgniter 4 roadmap is explained in the &lt;a href=&quot;http://forum.codeigniter.com/forum-27.html&quot;&gt;forum&lt;/a&gt;, and work to be done is detailed in the &lt;a href=&quot;https://github.com/bcit-ci/CodeIgniter4/issues&quot;&gt;repository issues&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Until now, the repository was not accepting merge requests, or as github call them, pull requests. However, there's some bits that everyone can contribute it it. So if you have any spare time and want to help out, go to the &lt;a href=&quot;https://github.com/bcit-ci/CodeIgniter4/issues&quot;&gt;github page&lt;/a&gt; and start helping out with the issues marked as &lt;strong&gt;Help wanted&lt;/strong&gt;.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/codeigniter-version-4-needs-your-help</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/codeigniter-version-4-needs-your-help</guid>
        <pubDate>Tue, 09 Aug 2016 20:42:00 +0000</pubDate>
      </item>
          <item>
        <title>Need a legacy vagrant box?</title>
        <description>
          &lt;p&gt;Last week I was contacted by some really old client. You know, the kind of client that you think that they don't even have the app you made for them online anymore.&lt;/p&gt;

&lt;p&gt;Turns out, they do have such app online, and they wanted me to change some minor things in it. But obviously I couldn't do it directly in production. I needed to create a local environment that would mimic the one the client had.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;I havent developed anything in PHP 5.3 in a long time, and since I'm using vagrant mostly with &lt;a href=&quot;http://phansible.com/&quot;&gt;Phansible&lt;/a&gt; I couldnt create a machine with it. Because the oldest PHP version phansible supports is 5.4.&lt;/p&gt;

&lt;p&gt;So I made a small box that supports what I needed and here's what you need to do:&lt;/p&gt;

&lt;h3&gt;Download the box and init vagrant&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant box add legacy-box https://www.dropbox.com/s/ch0rq7ajonkzimp/lucid64-lamp.box?dl=1
$ vagrant init legacy-box
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Edit your vagrant file&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;config.vm.network &quot;private_network&quot;, ip: &quot;192.168.33.10&quot;
config.vm.synced_folder &quot;./&quot;, &quot;/vagrant&quot;, type: &quot;nfs&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Boot up the machine&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant up
$ vagrant ssh 
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;You can add this to your provision id you want&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install php5 // no futuro adicionar à provision
$ sudo apt-get install php5-cli // no futuro adicionar à provision
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;If you need mysql you might want yo edit your bindaddress so you can connect via ssh tunnel&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ sudo nano /etc/mysql/my.cnf   
bindaddress passa de 127.0.0.1 a 0.0.0.0 // no futuro adicionar à provision
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;With the lattest versions of vagrant using such a old version of ubuntu you might need to create this file with the following contents&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ cat /etc/os-release
NAME=&quot;Ubuntu&quot;
VERSION=&quot;12.04 LTS, Precise Pangolin&quot;
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME=&quot;Ubuntu precise (12.04 LTS)&quot;
VERSION_ID=&quot;12.04&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Exit and restart the machine&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ exit
$ vagrant reload
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Here's your default connection to mysql&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;host: 127.0.0.1
user: root
password: password

SSH host: 192.168.33.10
SSH user: vagrant
SSH pass: vagrant
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/do-you-need-a-legacy-vagrant-box</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/do-you-need-a-legacy-vagrant-box</guid>
        <pubDate>Sat, 06 Aug 2016 21:54:00 +0000</pubDate>
      </item>
          <item>
        <title>Using PuPHPet and then connecting to your mysql via SSH tunnel</title>
        <description>
          &lt;p&gt;I just did a fresh install of vagrant and built it using the online tool from PuPHPet. Had everything ready but I wasn't able to connect to my mysql server.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The problem was in my SSH password. I thought it was this one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;u. vagrant
p. vagrant
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But for some reason it wasn't (yes it was left it as the default one from PuPHPet). So for consistency now everytime I do a fresh install I  always do a few things; Access my machine via SSH.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ vagrant ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Changing the way your server deals with mysql connections.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ sudo nano /etc/mysql/my.cnf   
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here you want to find the bindaddress setting which will be set to 127.0.0.0 and change it to 0.0.0.0. Don't forget to restart the mysql server after this.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ sudo service mysql restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Anythins left to do is change your password to &quot;vagrant&quot; for consistency.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That's it, now you can connect without any problems via SSH tunnel to your mysql.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/using-puphpet-and-they-connecting-to-your-mysql-via-ssh-tunnel</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/using-puphpet-and-they-connecting-to-your-mysql-via-ssh-tunnel</guid>
        <pubDate>Sun, 21 Feb 2016 21:34:00 +0000</pubDate>
      </item>
          <item>
        <title>CodeIgniter Announces an Interim Council</title>
        <description>
          &lt;p&gt;Elislab wanted to focus their development into the product that actually made them money. Nothing wrong about that. They started to look for a someone to take care of Codeigniter. The community started to panic. Months have passed and finally codeigniter has a new home.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The British Columbia Institute of Technology (BCIT) in Vancouver, Canada is a highly regarded applied technology institute with 48,000 full and part-time students. Their impressive BCIT School of Computing and Academic Studies teaches CodeIgniter to 150 students a year. Now, they are its stewards.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!--more--&gt;

&lt;p&gt;This was a great announcement in my opinion. As soon as they started to move their stuff into the new repo, and even get a new website everyone got excited again. Things are starting to move again.&lt;/p&gt;

&lt;p&gt;The CodeIgniter project has an interim council, to oversee the release of CodeIgniter 3 and to steer the framework to the next level.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Andreas Pfotenhauer&lt;/strong&gt; - Although I never met him in real life I think of him as a wise friend from the #codeigniter freenode channel.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Andrey Andreev&lt;/strong&gt; - Our codeigniter hero, keep going buddy&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Ben Edmunds&lt;/strong&gt; - I've been using his code for years, he's a great addition to the project&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;David Wosnitza&lt;/strong&gt; - Long term Codeigniter user and abuser like myself&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Jim Parry&lt;/strong&gt; - He's the one in charge now, good luck to you&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Lonnie Ezell&lt;/strong&gt; - Another great addition to the project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m happy that Pfotenhauer, Andrey, David, and Ben are on this. All stand up guys that have done a lot for the framework over the years either helping with the development or just helping or advising others on IRC.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/codeigniter-announces-an-interim-council</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/codeigniter-announces-an-interim-council</guid>
        <pubDate>Wed, 05 Nov 2014 14:58:00 +0000</pubDate>
      </item>
          <item>
        <title>Mathias Verraes - Decoupling the Model from the Framework at Laracon EU 2014</title>
        <description>
          &lt;iframe width=&quot;100%&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/QaIGN_cTcc8?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/mathias-verraes-decoupling-the-model-from-the-framework-at-laracon-eu-2014</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/mathias-verraes-decoupling-the-model-from-the-framework-at-laracon-eu-2014</guid>
        <pubDate>Mon, 01 Sep 2014 19:41:55 +0000</pubDate>
      </item>
          <item>
        <title>Shawn McCool - Laravel.IO, A Use Case Architecture</title>
        <description>
          &lt;iframe width=&quot;100%&quot; height=&quot;350&quot; src=&quot;//www.youtube.com/embed/2_380DKU93U?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;A talk from my buddy Shawn MacCool about command oriented interfaces and domain-events from Laracon in New York City.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/shawn-mccool-laravel.io,-a-use-case-architecture</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/shawn-mccool-laravel.io,-a-use-case-architecture</guid>
        <pubDate>Fri, 27 Jun 2014 09:18:00 +0000</pubDate>
      </item>
          <item>
        <title>The intern feeling</title>
        <description>
          &lt;p&gt;Every now and again we come across someone that can easily give us the &lt;em&gt;&quot;Intern feeling&quot;&lt;/em&gt;. No, not the &lt;em&gt;&quot;Bring me my coffee&quot;&lt;/em&gt; feeling. But more of someone that know so much about something that you just want to be around him or her to absorb everything.&lt;/p&gt;

&lt;p&gt;This is probably one of the best things about working on the web development field. Nobody knows everything about the subject, but there's always someone that knows a bit more than you do, and if you're willing to learn and listen, you ca grow everyday.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/intern.png&quot; alt=&quot;Lerning something&quot; /&gt;&lt;/p&gt;

&lt;p&gt;He's the thing that I'll never understand, some people don't like to be around others that clearly know more than they do about the subject. They feel rejected or inferior. I tell you what, if someday I'll happen to take on a job where I'm the moron, and I'm the person that knows less about the stuff we're working on, man I'll be so happy (i'll be sad if after a year i'm still the moron). Imagine learning something new everyday without even having to look for it. Just in your normal day job, talking with your peers.&lt;/p&gt;

&lt;p&gt;Just be happy that you're learning or have someone to learn from everyday.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/the-intern-feeling</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/the-intern-feeling</guid>
        <pubDate>Sun, 22 Jun 2014 12:42:00 +0000</pubDate>
      </item>
          <item>
        <title>Form Submit == 403 Error?</title>
        <description>
          &lt;p&gt;From time to time, I have to work on a really crappy server. They have the weirdest rules of all, they're obssed with security. I don't have a right to see logs, they randomly block my IP from time to time. I can't even call &lt;a href=&quot;http://pt1.php.net/phpinfo&quot;&gt;phpinfo()&lt;/a&gt;. Yeah, that bad!&lt;/p&gt;

&lt;p&gt;Today I ran into a problem that made me go mad. I had a simple form with just a few fields. Locally the form was submiting via &lt;em&gt;&lt;a href=&quot;http://www.php.net/manual/en/reserved.variables.post.php&quot;&gt;$_POST&lt;/a&gt;&lt;/em&gt; and everything was great.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;But when I pushed my code to that server I couldn't submit anything. The server was not getting the &lt;em&gt;&lt;a href=&quot;http://www.php.net/manual/en/reserved.variables.post.php&quot;&gt;$_POST&lt;/a&gt;&lt;/em&gt; and it was interpreting everything as &lt;em&gt;&lt;a href=&quot;http://www.php.net/manual/en/reserved.variables.get.php&quot;&gt;$_GET&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Turns out they turned on &lt;a href=&quot;http://en.wikipedia.org/wiki/ModSecurity&quot;&gt;mod_security&lt;/a&gt; and one of my fields was supposed to be a url. But for some scurity reason if one of my input fields had &lt;em&gt;http://&lt;/em&gt; in it, they blocked the request.&lt;/p&gt;

&lt;p&gt;First thing that came to mind: remove the &lt;em&gt;http://&lt;/em&gt; with javascript before submit and then add it back when I need it.&lt;/p&gt;

&lt;p&gt;But that's just nonsense!&lt;/p&gt;

&lt;p&gt;Turns out if I have my input field called &lt;em&gt;something_url&lt;/em&gt; the &lt;a href=&quot;http://en.wikipedia.org/wiki/ModSecurity&quot;&gt;mod_security&lt;/a&gt; will be expecting the value to be one url and it will not block my request.&lt;/p&gt;

&lt;p&gt;So here's my tip, if you have a project that you're deploying to a server that you have no control of, everytime you have a input that will be used to insert a url, you should &quot;always&quot; shove the sufix _url.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/form-submit-403-error</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/form-submit-403-error</guid>
        <pubDate>Thu, 08 May 2014 13:18:00 +0000</pubDate>
      </item>
          <item>
        <title>We are not tools</title>
        <description>
          &lt;p&gt;Yes, this will be a rant. Yes, this will have a lot of cursing involved. If you have any problems with that you should remove yourself out of the premisses. Moving on.&lt;/p&gt;

&lt;p&gt;A lot of people have this preposterous idea that designers, developers, web-designers and everyone working in, or for the creative business, are just tools. They exist to make all demands no matter what they are. well, I'm a web-developer. Sometimes I do some web-design work too. But I don't even begin to imagine the crappy feeling my fellow designers must feel when they have to give up to the clients demands.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Let me tell you a little story, and you tell me what you think about it.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Patient:&lt;/strong&gt; Doctor, I have a pain in my back. I don't know what it is. Can you take a look?&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Doctor:&lt;/strong&gt; Sure I can. Let me see. Well, this looks like a real problem. Have you been lifting a lot of weights at work?&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Patient:&lt;/strong&gt; Yes, I'm a construction worker.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Doctor:&lt;/strong&gt; Well, you have to stop doing what your doing for a while. You should rest or you'll have some real problems in the future. Also I'm going to prescribe you this medicine and you'll be better in no time.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Patient:&lt;/strong&gt; Thank you so much. I'll do just that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This looks like a normal conversation between a doctor and a patient right? You're right. This is exactly what normally happens. Now let's imagine for a moment that the doctor was a designer and the conversation between them would be much different.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Patient:&lt;/strong&gt; Doctor, I have a pain in my back. I know what it is and I know exactly what medicine I need.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Doctor:&lt;/strong&gt; But, you don't need that medicine, you need this one instead.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Patient:&lt;/strong&gt; No! It's my back. It's my money and I want that medicine.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Doctor:&lt;/strong&gt; Are you sure? Because your back will get a lot worst with that.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Patient:&lt;/strong&gt; Yes, I'm sure.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Doctor:&lt;/strong&gt; Ok then. Don't came here complaining afterwards.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Can you spot any differences? I'm sure you can. The patient don't even care about the doctor opinion on his back pain. He thinks he knows what he has and what medicine he needs. But you know what? The doctor would never give up to the patient demands. He would tell me to take the correct medicine and that would be final. After all, he studied for years and years for that.&lt;/p&gt;

&lt;p&gt;See what I'm aiming here? Why don't we as designers, developers and web-designers do the same with our clients? Well because we are a bunch of fucking pussies. We think: &lt;em&gt;&quot;if I don't do it, someone will and I'm going to lose the client&quot;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But my experience (and I don't have more than a few years) the client will realise that they were wrong. Sure you'll lose a lot of clients on the way. But your portfolio will be better. Will attract more clients that will understand your vision. And sometimes, some of those clients that you lost will come back, because they realised how fucked up their decision was, and how it affected their product or company.&lt;/p&gt;

&lt;p&gt;Now you see the real problem. What if a doctor were to give the wrong medicine to the patient just because he asked for it? Who should we blame? The patient, because he was being a cunt and just wanted to feel superior towards the doctor? Or the doctor, because the didn't do his job?&lt;/p&gt;

&lt;p&gt;The law will blame the doctor. I blame the doctor. What about you?&lt;/p&gt;

&lt;p&gt;Next time you feel that you're being forced to do a bad job, just think about that. It's our job as professionals to teach our clients and most of all, earn some fucking respect.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;strong&gt;ps:&lt;/strong&gt; This article was directed to designers, developers and web-designers. But if you're none of them you may be a potential client. If you are. Please, start trusting the people you hire to help you. You are hiring them for a reason. The reason is that you're not qualified to do the job. So let us do our fucking job. &lt;/small&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/we-are-not-tools</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/we-are-not-tools</guid>
        <pubDate>Thu, 27 Feb 2014 19:59:00 +0000</pubDate>
      </item>
          <item>
        <title>I'm not a Ukrainian... but we should try to help</title>
        <description>
          &lt;p&gt;I am not a Ukrainian. But, the creator of this video is and it should make us all feel like we are. Watch it. Share it. Send it to your representatives. It’s not your problem. True. But all of our collective voices might be part of the solution.&lt;/p&gt;

&lt;p&gt;Sure this has nothing to do development, but it's my blog and I do what I want here.&lt;/p&gt;

&lt;!--more--&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/Hvds2AIiWLA&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/i'm-not-a-ukrainian...-but-we-should-try-to-help</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/i'm-not-a-ukrainian...-but-we-should-try-to-help</guid>
        <pubDate>Wed, 19 Feb 2014 14:42:00 +0000</pubDate>
      </item>
          <item>
        <title>Git extras</title>
        <description>
          &lt;p&gt;I'm a heavy git user, hence I'm always trying to improve my workflow while using it. I normally have 3 ways of using git. I could use a gui client (&lt;a href=&quot;http://www.sourcetreeapp.com/&quot;&gt;sourcetree&lt;/a&gt;), normally I do this when I'm preparing a new release.&lt;/p&gt;

&lt;p&gt;On my daily code day I would use git inside &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime Text 2&lt;/a&gt;. That way I don't need to constantly change between my text editor of choice and a git gui or the terminal. However, from time to time, I use just the terminal. That happens for two reasons, one I could be using git remotely, or I could be doing something more difficult that couldn't be resolved inside sourcetree or &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime Text&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Yesterday I tried this new tool and I'm getting quite found of it. It's called Git Extras. You have 3 ways of getting it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clone / Tarball:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;One-liner:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ (cd /tmp &amp;amp;&amp;amp; git clone --depth 1 https://github.com/visionmedia/git-extras.git &amp;amp;&amp;amp; cd git-extras &amp;amp;&amp;amp; sudo make install)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;MacPorts&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo port install git-extras
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Brew (buggy):&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ brew install git-extras
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here's a small screencast on how to use it.&lt;/p&gt;

&lt;iframe src=&quot;//player.vimeo.com/video/45506445?color=ffffff&quot; width=&quot;100%&quot; height=&quot;350&quot; frameborder=&quot;0&quot; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;This tool is specially useful when you're managing .gitignore files. Or when you want to know all the info about your repo. You just have to type git info and you'll get something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git info

## Remote URLs:

origin              git@github.com:sampleAuthor/git-extras.git (fetch)
origin              git@github.com:sampleAuthor/git-extras.git (push)

## Remote Branches:

origin/HEAD -&amp;gt; origin/master
origin/myBranch

## Local Branches:

myBranch
* master

## Most Recent Commit:

commit e3952df2c172c6f3eb533d8d0b1a6c77250769a7
Author: Sample Author &amp;lt;sampleAuthor@gmail.com&amp;gt;

Added git-info command.

Type 'git log' for more commits, or 'git show &amp;lt;commit id&amp;gt;' for full commit details.

## Configuration (.git/config):

color.diff=auto
color.status=auto
color.branch=auto
user.name=Sample Author
user.email=sampleAuthor@gmail.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=git@github.com:mub/git-extras.git
branch.master.remote=origin
branch.master.merge=refs/heads/master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Awesome right?&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/git-extras</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/git-extras</guid>
        <pubDate>Mon, 10 Feb 2014 13:34:00 +0000</pubDate>
      </item>
          <item>
        <title>Remove the admin bar on wordpress</title>
        <description>
          &lt;p&gt;Yes, lately I've been doing some Wordpress stuff. Before you start throwing stones, I'm not doing the kind of stuff to be ashamed about. I'm actually building some blogs.&lt;/p&gt;

&lt;p&gt;One thing that bothers me a lot is the admin bar on the front-end, always there, always present. Fucking up my css.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;I looked around a little bit and I found this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    add_filter('show_admin_bar', '__return_false');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Just shove that in your wp-config.php file and you'll be good to go.&lt;/p&gt;

&lt;p&gt;&amp;lt; sarcasm &gt;How awesome is wordpress right?&amp;lt;/ sarcasm &gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/remove-the-admin-bar-on-wordpress-front-end</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/remove-the-admin-bar-on-wordpress-front-end</guid>
        <pubDate>Fri, 07 Feb 2014 10:29:00 +0000</pubDate>
      </item>
          <item>
        <title>How to add another virtual host using Vagrant</title>
        <description>
          &lt;p&gt;There's a lot of ways to use Vagrant. Some people create a virtual machine per project. I don't like that idea. I think it's best to create a virtual machine for each different server you have to deploy. So if I have 2 projects that are going to be deployed to the same server why should I create two virtual machines? Makes no sense to me. Those two projects belong in the same virtual machine.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;In any case, I hope I'm not the only one trying to do that. If I am, then I must be wrong and you should stop reading this post. Anyway. If you want to do that, you have to create more than one virtual host so you can have something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;foobar.dev
nyancat.dev
blog.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Like when you're connecting to your database with sequelPro. You must treat your virtual machine like another computer. If you're using PHPupet it's quite easy. For this example my virtual machine has Ubuntu installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigate to your project(s) folder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;mypath/puppet/hieradata&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open common.yaml&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under Vhosts you'll have something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vhosts:
    VO6aT11EHJmL:
        servername: localhost
        docroot: /var/www/public
        port: '80'
        setenv:
            - 'APP_ENV dev'
        override:
            - All
    4yNJr1LpLJYA:
        servername: blog.dev
        docroot: /var/www/vhosts/blog
        port: '80'
        setenv:
            - 'APP_ENV dev'
        override:
            - all
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Each vhost is given a unique identification name and it can be anything. The options for servername, docroot seem simple, so we'll modify these.&lt;/p&gt;

&lt;p&gt;Next for the virtual machine to recognize your updates make sure your vagrant is stopped while making these changes. After you're done restart vagrant. Once vagrant is up go into your directories where your sites-available directory is. In my case i'm using apache under ubuntu.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/etc/apache2/sites-available
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The files that you will see there, their name will match the unique names that you have in the common.yaml file except there are numbers in them for example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#-unique_name.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So in the common.yaml file if you created or modified settings under 4yNJr1LpLJYA you would need to look for #-4yNJr1LpLJYA.conf in this directory and match the settings as you have in your common.yaml file. Once you are done restart your server.&lt;/p&gt;

&lt;p&gt;Also don't forget to add the virtual host into your local machines host file and match it with the same ip that puphet gave you (or that you configured).&lt;/p&gt;

&lt;p&gt;Do this for each one that you want to add.&lt;/p&gt;

&lt;p&gt;ps: if you know another way to manage vhosts quickly while using vagrant. Please, do comment and help a bother out.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-add-another-virtual-host-using-vagrant</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-add-another-virtual-host-using-vagrant</guid>
        <pubDate>Thu, 09 Jan 2014 22:48:00 +0000</pubDate>
      </item>
          <item>
        <title>How to connect to you database using Vagrant</title>
        <description>
          &lt;p&gt;As you may or may not know, I started to really use vagrant lately. The installation process to get a PHP development environment is quite easy. However, there was a few moment were I run into a small issues. Most of them happened just because my mind was still programmed to work with a simple Lamp stack.&lt;/p&gt;

&lt;p&gt;One of the issues that made me lose 20 minutes or so was connecting SequelPro to the database. Sure I installed PHPmyAdmin but I wanted to use my own database management app.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;All you need to do is create a SSH tunnel to your server. Todo so, you need to use the following settings.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Server name: &quot;YourServerName&quot; (doesn't really matter)
MySQL Host: 127.0.0.1
Username: root
Password: ******
Database: 
Port:
SSH Host: 192.168.56.101
SSH User: vagrant
SSH Password: vagrant (this is the default one)
SSD Port: 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Your first impulse might be to connect using the virtual machine IP as your normal host like I did, but that obviously will not work. Also, took me a while to find out the SSH password, but that happened mostly because I was reading the documentation while I was using it.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-connect-to-you-database-using-vagrant</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-connect-to-you-database-using-vagrant</guid>
        <pubDate>Sun, 05 Jan 2014 10:48:00 +0000</pubDate>
      </item>
          <item>
        <title>Getting started with vagrant</title>
        <description>
          &lt;p&gt;Recently I wrote a post about &lt;a href=&quot;http://blog.marcomonteiro.net/post/my-dev-setup-on-mac&quot;&gt;my dev setup on mac&lt;/a&gt;. However someone has been recommending me for a while to start using Vagrant. But I never did. Specially because my dev setup was working fine.&lt;/p&gt;

&lt;p&gt;A few days ago, I decided it was time to do a clean install on my mac, and start fresh. That means it's time for some experimenting.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;What is Vagrant?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Vagrant is a tool for building complete development environments. With an easy-to-use workflow and focus on automation, Vagrant lowers development environment setup time, increases development/production parity, and makes the &quot;works on my machine&quot; excuse a relic of the past.&lt;/p&gt;
  
  &lt;p&gt;Vagrant was started in January 2010 by Mitchell Hashimoto. For almost three years, Vagrant was a side-project for Mitchell, a project that he worked on in his free hours after his full time job. During this time, Vagrant grew to be trusted and used by a range of individuals to entire development teams in large companies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I look at this and I see two features that interest me. First I'll be developing on a virtual machine that is equal to the one I'll be deploying in the future. Then, since every configuration, dirty hack or whatever will be done on that virtual machine. My computer will stay clean of all the experimenting a the web developer life requires.&lt;/p&gt;

&lt;p&gt;I work mainly with PHP, so the best way to start with Vagrant is to use something like &lt;a href=&quot;https://puphpet.com/&quot;&gt;puphpet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Puphpet is a simple GUI to set up virtual machines for PHP Web development. In a few simple steps you'll have your Manifest ready to start working with Vagrant.&lt;/p&gt;

&lt;p&gt;First you setup the deploy target. In this case it will be local. You choose what kind of virtual machine you need and you give it a name and IP address. Then you setup what path will be synced with the VM.&lt;/p&gt;

&lt;p&gt;After that is pretty straight forward. You just have to configure some of the aspects of your VM that are specific to you dev environment. This includes: virtual hosts, php version, composer, PEAR modules, PECL Modules, XDebug. All your database preferences, database names, users and passwords. After that you're ready to go.&lt;/p&gt;

&lt;p&gt;Before you do anything with the files you just downloaded you need to download VirtualBox and install it. After that the process is quite simple.&lt;/p&gt;

&lt;p&gt;All you need to do is open your terminal. Navigate to your downloaded files from Puphpet and run the following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant up
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will install and start the virtual machine you ended up choosing. After that, you can access your server with the IP you used during the Puphpet setup process or you can configure the virtual host.&lt;/p&gt;

&lt;p&gt;Here's a list of the available commands to use Vagrant.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;box&lt;/strong&gt; - manages boxes: installation, removal, etc.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;destroy&lt;/strong&gt; -stops and deletes all traces of the vagrant machine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;halt&lt;/strong&gt; - stops the vagrant machine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;help&lt;/strong&gt; - shows the help for a subcommand &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;init&lt;/strong&gt; - initializes a new Vagrant environment by creating a Vagrantfile&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;package&lt;/strong&gt; - packages a running vagrant environment into a box&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;plugin&lt;/strong&gt; - manages plugins: install, uninstall, update, etc.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;provision&lt;/strong&gt; - provisions the vagrant machine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;reload&lt;/strong&gt; - restarts vagrant machine, loads new Vagrantfile configuration&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;resume&lt;/strong&gt; - resume a suspended vagrant machine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;ssh&lt;/strong&gt; - connects to machine via SSH&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;ssh-config&lt;/strong&gt; - outputs OpenSSH valid configuration to connect to the machine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;status&lt;/strong&gt; - outputs status of the vagrant machine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;suspend&lt;/strong&gt; - suspends the machine&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;up&lt;/strong&gt; - starts and provisions the vagrant environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Easy like that.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/getting-started-with-vagrant</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/getting-started-with-vagrant</guid>
        <pubDate>Sat, 04 Jan 2014 14:23:00 +0000</pubDate>
      </item>
          <item>
        <title>Is 2013 gone yet?</title>
        <description>
          &lt;p&gt;Not yet. We still have time to look back. Yeah, it's that time of the year. Time to think back on what happened this last year. What went wrong and what went well.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;January &lt;i class=&quot;icon-long-arrow-right&quot;&gt;&lt;/i&gt; April&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The year started out greatly. The company I was working for was going down so I found myself without a job. Not even a month gone by and I found myself a new workplace and I'm still living &lt;a href=&quot;http://blog.marcomonteiro.net/post/the-ch-experience&quot;&gt;The CH Experience&lt;/a&gt;. This made me move to another city, however not a strange city to me. A city that I do love with all my heart. After all, most of my friends are here and my best memories were created here.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/monstros.jpg&quot; alt=&quot;The team&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;The team&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Sure I wanted to go as a freelancer for a while. But that didn't work out so well so I'm glad that I am where I am now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;May &lt;i class=&quot;icon-long-arrow-right&quot;&gt;&lt;/i&gt; June&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Moved my blog from Tumblr to &lt;a href=&quot;http://wardrobecms.com/&quot;&gt;wardrobe&lt;/a&gt; hosted by a Internet friend of mine that goes by the name freshpixel. You might've seen him on IRC. I've been improving my blog ever since with minor tweaks, making the theme responsive and some other cool features.  If you ever wanted a minimal blog application the way to go is definitely wardrobe. Thank you &lt;a href=&quot;https://twitter.com/ericlbarnes&quot;&gt;Eric Barnes&lt;/a&gt; for making such a beautiful platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;July &lt;i class=&quot;icon-long-arrow-right&quot;&gt;&lt;/i&gt; August&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Stopped using Google Analytics for personal projects, instead I'm using &lt;a href=&quot;http://piwik.org/&quot;&gt;piwik&lt;/a&gt;. If you want something simple and that you have control over, this is the way to go. Even last week we got a new update with more awesome stuff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;August &lt;i class=&quot;icon-long-arrow-right&quot;&gt;&lt;/i&gt; September&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Just a bit after that, I won a ticket to &lt;a href=&quot;http://blog.marcomonteiro.net/archive?q=laracon&quot;&gt;LaraconEU&lt;/a&gt; and of I went: next stop Amsterdam. Stuff was learn on that conference. But most of all, connections were made. Faces were put on nicknames and avatars. I hope I can keep this tradition of attending to (at least) one (abroad) conference every year. During 2013 laravel released its new version 4. Changing the game again. Using composer with all the things and once again pushing the PHP community forward.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/laracon.png&quot; alt=&quot;Laracon EU&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;Laracon EU&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;October &lt;i class=&quot;icon-long-arrow-right&quot;&gt;&lt;/i&gt; November&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; I was internet famous for a couple of days. My post about the &lt;a href=&quot;http://blog.marcomonteiro.net/post/the-six-months-rule&quot;&gt;Six months rule&lt;/a&gt; went crazy on &lt;a href=&quot;http://www.reddit.com/r/programming/comments/1pmzli/the_six_months_rule/&quot;&gt;reddit&lt;/a&gt; and I had 35k+ visits in just 48 hours. Thank you reddit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;November &lt;i class=&quot;icon-long-arrow-right&quot;&gt;&lt;/i&gt; December&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; I &lt;a href=&quot;http://blog.marcomonteiro.net/post/people-won-awards-that-day&quot;&gt;won an award at work&lt;/a&gt; during our christmas party.&lt;/p&gt;

&lt;p&gt;It was definitely fast. All I can say is that this was a really good year. If the next one is has good as 2013 I think I'll be happy. I have a lot of different ideas for my blog for the upcoming months. Don't know if I'll be able to do them all. But I will definitely try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blog Review&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/analytics-2013.jpg&quot; alt=&quot;Analytics in 2013&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;Analytics between Jan 1 and Dec 31 2013&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most visited articles:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/the-six-months-rule&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; The six months rule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/git-vs-svn-is-it-really-a-battle&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Git vs Svn is it really a battle?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/php-magic-methods-the-complete-guide&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Php magic methods - The complete guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/glidejs-simple-lightweight-and-fast-jquery-slider&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Glide.js a simple, lightweight &amp;amp; fast jQuery slider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/mike-monteiro-how-designers-destroyed-the-world&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; How Designers Destroyed the World&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Special thanks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; freshpixel for hosting my blog;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Reddit and his community;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The codeigniter channel for always helping me get new ideas for articles;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;a href=&quot;https://twitter.com/_druu&quot;&gt;David Wosnitza&lt;/a&gt; for his &lt;a href=&quot;http://blog.marcomonteiro.net/post/normalizedsync-single-file-demo&quot;&gt;guest post&lt;/a&gt; (more to come I hope);&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; All the people that donated money via paypal on my website;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; All the people that clicked on the ads at the end of my posts;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading my blog, and I hope you all have an awesome 2014, mkay?&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/2013-gone-yet</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/2013-gone-yet</guid>
        <pubDate>Sun, 29 Dec 2013 16:41:00 +0000</pubDate>
      </item>
          <item>
        <title>Are you a part of Intranet project?</title>
        <description>
          &lt;p&gt;Are you? If you are, this might interest you. I've been doing some consultant work where I'm basically putting Intranets to the test. Basically I'm the troll telling people what are they doing right or wrong.&lt;/p&gt;

&lt;p&gt;So his is what I've found so far on things that you might want to avoid.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Unclear intranet ownership and governance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem here normally resides with the the people that define the user privilegies. Normally they either have more people than they should with &quot;&lt;em&gt;admin&lt;/em&gt;&quot; privileges, or they have just one person. Both are normally wrong. You should make clear choices on who takes care of what. But more importantly, the people using it should know who's in charge of what.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Designing by opinion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most common mistake. The people designing the Intranet, do it by what they think is right, but they don't do any background work to support those decisions. This will bit you in the ass sooner than later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Designing only half of the intranet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Again, a major design problem. The guys in charge of the design think:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It's a Intranet, only the company will see this and the world is not going to care about it. So I'm just going to design a couple of pages and define some guidelines and it will be ok.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's not! If people are using something you're designing then you should make an effort to do a good job. Not just because it's your job, but because people are going to care about your product. It doesn't matter if it's 3 or 1000 users. If your work affect just one person, you should do a good job. This is a fact for everything not just design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Taking the publisher’s perspective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The guys building the Intranet take the publisher perspective disregarding the users perspective completely. This happens not only on Intranet projects but on most big web projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Allowing technology to rule the design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a common one when it comes to Intranets. Normally Intranets aren't built from scratch. And that's ok. But the technology that you chose shouldn't dictate what can and cannot be done by your users or publishers.&lt;/p&gt;

&lt;p&gt;I've found many more throughout my consultant experience. But these one were the ones that I found more often. I hope this helps you in the future when you have to build or work on a Intranet project.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/are-you-a-part-of-intranet-project</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/are-you-a-part-of-intranet-project</guid>
        <pubDate>Fri, 20 Dec 2013 13:17:00 +0000</pubDate>
      </item>
          <item>
        <title>People won awards that day</title>
        <description>
          &lt;p&gt;Last weekend we had our anual christmas party at the office. Until now I was only used to those small Christmas parties. I only worked for small companies and even when I didn't, normally they did the parties by team and not has a whole company.&lt;/p&gt;

&lt;p&gt;I was really excited about the party, on one hand I would get to be with everyone in one place, which only happens twice a year (we also have a summer party). On the other hand there's always a open bar.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Since it was my first time at this, I was everything but ready for what was about to happen. Every year the company rewards a few people on different categories. You know, like the Oscars, but instead of getting a gold statue you get a Teddy Bear (from the movie Monsters, Inc.) and there's no nominees, hence you always have those unexpected winners.&lt;/p&gt;

&lt;p&gt;Well, guess what? I was one of those cases. Well at least I think I was. Some may think I wasn't. Some were actually expecting it. What matters is that I wasn't, at all.&lt;/p&gt;

&lt;p&gt;Apparently everyone on my team (or almost everyone) already knew that I was going to win (I know right? Bunch of assholes).&lt;/p&gt;

&lt;p&gt;The award I won was the &quot;revelation award&quot;. It means that I (allegedly) stood out somehow. It's good to know that the company is appreciating my work. But I wouldn't be doing my work if it wasn't for this people.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/team.jpg&quot; alt=&quot;Monsters and Company Team&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;From left to right: Xico; Tânia; Sílvia; Mena; Lili; Asshole; Inês; Joel&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;That's right, this is the team I work with, and since I work with them everyday, I think it's safe to say that this award was only a product of a team effort.&lt;/p&gt;

&lt;p&gt;I know my acceptance speech wasn't perfect, basically it went like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Thank you!
  00010 1001 10010101 10101010101 101010 11010101 10101 10101 100000101010 10101 101010 11001 10010101 10101010101 101010 11010101 10101 10101 100000101010 10101 101010 11001 10010101 10101010101 101010 11010101 10101 10101 100000101010 10101 101010 11001 10010101 10101010101 101010 11010101 10101 10101 100000101010 10101 101010 11001 10010101 10101010101 101010 11010101 10101 10101 100000101010 10101 101010&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don't even know what that means in binary, but I thought it was funny at the time. It wasn't, I was just drunk.&lt;/p&gt;

&lt;p&gt;Now that I put some thought into it (and I'm not drunk) I can say this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Thank you Grupo CH (the company). It's been a great year working with you. I want to thank my team, not just for their everyday work, but specially for being more than just co-workers. You're all friends of mine and I'm a better person because I had the pleasure to meet you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/award.jpg&quot; alt=&quot;the award&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;Errrrrr about that!&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/people-won-awards-that-day</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/people-won-awards-that-day</guid>
        <pubDate>Thu, 19 Dec 2013 14:38:00 +0000</pubDate>
      </item>
          <item>
        <title>Unsubscribe all the things</title>
        <description>
          &lt;p&gt;We all been at the place where we find a brand new project that is yet to come. We subscribe the newsletter to be up to date. The project dies, but somehow you keep getting those annoying emails, and doesn't matter how many times we try to unsubscribe, we just can't do it.&lt;/p&gt;

&lt;p&gt;Unsubscribing from malling lists is probably the most annoying thing on the web today. I can't count the times I tried to do so, and just can't. Well, not anymore. Now I use Unroll.me.&lt;/p&gt;

&lt;p&gt;With Unroll.me you can unsubscribe from most services in just a few clicks. Personally I unsubscribed from 105 malling lists. Most of them I wasn't even getting any emails but just to be sure.&lt;/p&gt;

&lt;p&gt;Do your self a favor and keep your inbox clean.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; &lt;a href=&quot;https://unroll.me/&quot;&gt;unroll.me&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/unsubscribe-all-the-things</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/unsubscribe-all-the-things</guid>
        <pubDate>Sat, 14 Dec 2013 14:16:00 +0000</pubDate>
      </item>
          <item>
        <title>Chrome DevTools for Mobile</title>
        <description>
          &lt;p&gt;Just a few weeks ago the chrome team release yet another awesome feature. You can now truly debug on your desktop as if you were working on your mobile phone or tablet.&lt;/p&gt;

&lt;p&gt;This will get your socks off: remote debugging and then we'll unveil proper mobile emulation.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Paul Irish describes the new feature in depth.&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/gZH1d2Co1X0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/chrome-devtools-for-mobile</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/chrome-devtools-for-mobile</guid>
        <pubDate>Mon, 09 Dec 2013 13:59:37 +0000</pubDate>
      </item>
          <item>
        <title>I would like to express complete and utter disappointment</title>
        <description>
          &lt;p&gt;Today we were at the #codeigniter channel on IRC (Freenode). We were discussing who would win the shit job award of the day. I tried to win with a single file website with CSS, JS, HTML and mySQL in one file. I thought I would win. Well I didn't.&lt;/p&gt;

&lt;p&gt;This was Thomas (aka slax0r) submission:&lt;/p&gt;

&lt;p&gt;This is an email that he wrote to VPN supplier that one of his clients were using.
&lt;!--more--&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hello,&lt;/p&gt;
  
  &lt;p&gt;I would like to express complete and utter disappointment with your company, and your stuff, that you call software.
  So, where do I begin, maybe at the start.&lt;/p&gt;
  
  &lt;p&gt;Today I was contacted by a client of ours, who uses your software, more specifically, the VPN server, which I now question my self, why on earth, do they use your software, since there is perfectly good and simple VPN software available, which just &lt;em&gt;works&lt;/em&gt;, and it's also free, as in beer, and as in speech by the way.&lt;/p&gt;
  
  &lt;p&gt;So to access our clients server, I need a special copy of your VPN client, for which I spent over an hour to even find it on your website. Not to mention how annoying it is to register with an email account, so you can send me all that nice spam, only because I need to download a VPN CLIENT! So after I finally find the correct version, and downloaded it, frustration grows. Might I add I am a Linux user for almost 15 years. So, first thing is first. RAR, for Linux? Seriously? Ever heard of good old GunZip? Or BunZip2? Readilly available on every and &lt;em&gt;each&lt;/em&gt; Linux distribution. As well as BSD and MacOSX. But ok, I download unrar for Linux, so I could just use your software. So, unrar, unpack the RPM, and install by hand, apply permissions etc. Run the software as a non-privileged user, and whats this. Needs SU permissions? No problem. But your suggestion to make setuid it is beyond idiocracy! Setuid to root? Are you serious? Why don't you just suggest opening up port 22 to the world and removing the root password? Ok then, I just run the app with sudo, and same message, need I say what happened next? Probably not. So ok, after I calmed down a little bit, go to interactive root login through sudo, and run the app. Eureka! It runs. So, insert the VPN data, save configuration, and try to open the connection. Oh snap! Can't read config file. Strange, I'm running as root. Inspect file permissions, hm, all are good, READ/WRITE for root on barracudavpn.conf, but since we already did setuid, what worse can it be if I just make it world readable/writable, right? So ok, make it like that, re-run the application, connect, insert password, and a nice little warning: &quot;Gateway not reachable&quot;. Are you kidding me? Inspect interfaces, nothing new, try to ping some VPN IP addresses, nothing, try to ping my own VPN IP address, nothing. Great peace of software, nothing works. But ok, maybe I'm just stupid, so, contact your support. After ALOT of waiting, your &quot;Natalia&quot; comes on, asks me if we own any of your software, well, the VPN client, and nothing else, and I just get blown off, like I am a lesser person, because I don't use your software. Thanks a lot! Mental note: I will never ever use ANY of your software, and anyone I find actually using your stuff, will do my best to convince them other wise.&lt;/p&gt;
  
  &lt;p&gt;Thank you, for making me download Windoze and running it in a VM(that's a Virtual Machine, in case you're wondering), just so I can help out my client. And thank you for making me spend the whole friday on a task that would take me 10-15 minutes.&lt;/p&gt;
  
  &lt;p&gt;Kind regards,
  Thomas&lt;/p&gt;
  
  &lt;p&gt;P.S.: fire your whole Linux dev team, because they CLEARLY have no clue what-so-ever to what they are doing on this system.
  P.S.2: change your website hosting, because your site is working insanely slowly, or optimize it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's just say that this email made my day.&lt;/p&gt;

&lt;p&gt;The company in question was this &lt;a href=&quot;https://www.barracuda.com/&quot;&gt;Barracuda Networks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;**ps: **Thank you slax0r for letting me share this.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/i-would-like-to-express-complete-and-utter-disappointment-with-your-company</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/i-would-like-to-express-complete-and-utter-disappointment-with-your-company</guid>
        <pubDate>Fri, 06 Dec 2013 11:48:00 +0000</pubDate>
      </item>
          <item>
        <title>The Google Geocoding API</title>
        <description>
          &lt;p&gt;Geocoding is the process of converting addresses (like &quot;1600 Amphitheatre Parkway, Mountain View, CA&quot;) into geographic coordinates (like latitude 37.423021 and longitude -122.083739), which you can use to place markers or position the map.&lt;/p&gt;

&lt;p&gt;Reverse geocoding is the process of converting geographic coordinates into a human-readable address.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Geocoding Requests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Geocoding API request must be of the following form:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://maps.googleapis.com/maps/api/geocode/output?parameters
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;where output may be either of the following values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;em&gt;json&lt;/em&gt; (recommended) indicates output in JavaScript Object Notation&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;em&gt;xml&lt;/em&gt; indicates output as XML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To access the Geocoding API over HTTPS, use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;https://maps.googleapis.com/maps/api/geocode/output?parameters
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Required parameters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;address&lt;/strong&gt; - The address that you want to geocode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;latlng&lt;/strong&gt; - The textual latitude/longitude value for which you wish to obtain the closest, human-readable address. See Reverse Geocoding for more information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;components&lt;/strong&gt; - A component filter for which you wish to obtain a geocode. See Component Filtering for more information. The components filter will also be accepted as an optional parameter if an address is provided.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;sensor&lt;/strong&gt; - Indicates whether or not the geocoding request comes from a device with a location sensor. This value must be either true or false.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional parameters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;bounds&lt;/strong&gt; - The bounding box of the viewport within which to bias geocode results more prominently. This parameter will only influence, not fully restrict, results from the geocoder. (For more information see Viewport Biasing below.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;language&lt;/strong&gt; - The language in which to return results. See the list of supported domain languages. Note that we often update supported languages so this list may not be exhaustive. If language is not supplied, the geocoder will attempt to use the native language of the domain from which the request is sent wherever possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;region&lt;/strong&gt; - The region code, specified as a ccTLD (&quot;top-level domain&quot;) two-character value. This parameter will only influence, not fully restrict, results from the geocoder. (For more information see Region Biasing below.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;components&lt;/strong&gt; - The component filters, separated by a pipe (|). Each component filter consists of a component:value pair and will fully restrict the results from the geocoder. For more information see Component Filtering, below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geocoding Responses&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Geocoding responses are returned in the format indicated by the output flag within the URL request's path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON Output Formats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this example, the Geocoding API requests a json response for a query on &quot;1600 Amphitheatre Parkway, Mountain View, CA&quot;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&amp;amp;sensor=true_or_false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We've left the sensor parameter in this example as a variable true_or_false to emphasize that you must set this value to either true or false explicitly.&lt;/p&gt;

&lt;p&gt;The JSON returned by this request is shown below. Note that actual JSON may contain less whitespace. You should not make assumptions about the amount or format of whitespace between requests.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    {
    &quot;results&quot; : [
    {
     &quot;address_components&quot; : [
        {
           &quot;long_name&quot; : &quot;1600&quot;,
           &quot;short_name&quot; : &quot;1600&quot;,
           &quot;types&quot; : [ &quot;street_number&quot; ]
        },
        {
           &quot;long_name&quot; : &quot;Amphitheatre Pkwy&quot;,
           &quot;short_name&quot; : &quot;Amphitheatre Pkwy&quot;,
           &quot;types&quot; : [ &quot;route&quot; ]
        },
        {
           &quot;long_name&quot; : &quot;Mountain View&quot;,
           &quot;short_name&quot; : &quot;Mountain View&quot;,
           &quot;types&quot; : [ &quot;locality&quot;, &quot;political&quot; ]
        },
        {
           &quot;long_name&quot; : &quot;Santa Clara&quot;,
           &quot;short_name&quot; : &quot;Santa Clara&quot;,
           &quot;types&quot; : [ &quot;administrative_area_level_2&quot;, &quot;political&quot; ]
        },
        {
           &quot;long_name&quot; : &quot;California&quot;,
           &quot;short_name&quot; : &quot;CA&quot;,
           &quot;types&quot; : [ &quot;administrative_area_level_1&quot;, &quot;political&quot; ]
        },
        {
           &quot;long_name&quot; : &quot;United States&quot;,
           &quot;short_name&quot; : &quot;US&quot;,
           &quot;types&quot; : [ &quot;country&quot;, &quot;political&quot; ]
        },
        {
           &quot;long_name&quot; : &quot;94043&quot;,
           &quot;short_name&quot; : &quot;94043&quot;,
           &quot;types&quot; : [ &quot;postal_code&quot; ]
        }
     ],
     &quot;formatted_address&quot; : &quot;1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA&quot;,
     &quot;geometry&quot; : {
        &quot;location&quot; : {
           &quot;lat&quot; : 37.42291810,
           &quot;lng&quot; : -122.08542120
        },
        &quot;location_type&quot; : &quot;ROOFTOP&quot;,
        &quot;viewport&quot; : {
           &quot;northeast&quot; : {
              &quot;lat&quot; : 37.42426708029149,
              &quot;lng&quot; : -122.0840722197085
           },
           &quot;southwest&quot; : {
              &quot;lat&quot; : 37.42156911970850,
              &quot;lng&quot; : -122.0867701802915
           }
        }
     },
     &quot;types&quot; : [ &quot;street_address&quot; ]
  }
],
&quot;status&quot; : &quot;OK&quot;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;XML Output Formats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this example, the Geocoding API requests an xml response for the identical query shown above for &quot;1600 Amphitheatre Parkway, Mountain View, CA&quot;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&amp;amp;sensor=true_or_false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The XML returned by this request is shown below.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;GeocodeResponse&amp;gt;
     &amp;lt;status&amp;gt;OK&amp;lt;/status&amp;gt;
     &amp;lt;result&amp;gt;
        &amp;lt;type&amp;gt;street_address&amp;lt;/type&amp;gt;
        &amp;lt;formatted_address&amp;gt;1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA&amp;lt;/formatted_address&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;1600&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;1600&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;street_number&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;Amphitheatre Pkwy&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;Amphitheatre Pkwy&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;route&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;Mountain View&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;Mountain View&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;locality&amp;lt;/type&amp;gt;
            &amp;lt;type&amp;gt;political&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;San Jose&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;San Jose&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;administrative_area_level_3&amp;lt;/type&amp;gt;
            &amp;lt;type&amp;gt;political&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;Santa Clara&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;Santa Clara&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;administrative_area_level_2&amp;lt;/type&amp;gt;
            &amp;lt;type&amp;gt;political&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;California&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;CA&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;administrative_area_level_1&amp;lt;/type&amp;gt;
            &amp;lt;type&amp;gt;political&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;United States&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;US&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;country&amp;lt;/type&amp;gt;
            &amp;lt;type&amp;gt;political&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;address_component&amp;gt;
            &amp;lt;long_name&amp;gt;94043&amp;lt;/long_name&amp;gt;
            &amp;lt;short_name&amp;gt;94043&amp;lt;/short_name&amp;gt;
            &amp;lt;type&amp;gt;postal_code&amp;lt;/type&amp;gt;
        &amp;lt;/address_component&amp;gt;
        &amp;lt;geometry&amp;gt;
            &amp;lt;location&amp;gt;
                &amp;lt;lat&amp;gt;37.4217550&amp;lt;/lat&amp;gt;
                &amp;lt;lng&amp;gt;-122.0846330&amp;lt;/lng&amp;gt;
            &amp;lt;/location&amp;gt;
            &amp;lt;location_type&amp;gt;ROOFTOP&amp;lt;/location_type&amp;gt;
            &amp;lt;viewport&amp;gt;
                &amp;lt;southwest&amp;gt;
                    &amp;lt;lat&amp;gt;37.4188514&amp;lt;/lat&amp;gt;
                    &amp;lt;lng&amp;gt;-122.0874526&amp;lt;/lng&amp;gt;
                &amp;lt;/southwest&amp;gt;
                &amp;lt;northeast&amp;gt;
                    &amp;lt;lat&amp;gt;37.4251466&amp;lt;/lat&amp;gt;
                    &amp;lt;lng&amp;gt;-122.0811574&amp;lt;/lng&amp;gt;
                &amp;lt;/northeast&amp;gt;
            &amp;lt;/viewport&amp;gt;
        &amp;lt;/geometry&amp;gt;
    &amp;lt;/result&amp;gt;
&amp;lt;/GeocodeResponse&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Reverse Geocoding (Address Lookup)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The term geocoding generally refers to translating a human-readable address into a location on a map. The process of doing the converse, translating a location on the map into a human-readable address, is known as reverse geocoding.&lt;/p&gt;

&lt;p&gt;The Geocoding API supports reverse geocoding directly using the latlng parameter. For example, the following query contains the latitude/longitude value for a location in Brooklyn:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&amp;amp;sensor=true_or_false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This query returns the following result:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    &quot;status&quot;: &quot;OK&quot;,
    &quot;results&quot;: [ {
        &quot;types&quot;: street_address,
        &quot;formatted_address&quot;: &quot;275-291 Bedford Ave, Brooklyn, NY 11211, USA&quot;,
        &quot;address_components&quot;: [ {
            &quot;long_name&quot;: &quot;275-291&quot;,
            &quot;short_name&quot;: &quot;275-291&quot;,
            &quot;types&quot;: street_number
        }, {
            &quot;long_name&quot;: &quot;Bedford Ave&quot;,
            &quot;short_name&quot;: &quot;Bedford Ave&quot;,
            &quot;types&quot;: route
        }, {
            &quot;long_name&quot;: &quot;New York&quot;,
            &quot;short_name&quot;: &quot;New York&quot;,
            &quot;types&quot;: [ &quot;locality&quot;, &quot;political&quot; ]
        }, {
            &quot;long_name&quot;: &quot;Brooklyn&quot;,
            &quot;short_name&quot;: &quot;Brooklyn&quot;,
            &quot;types&quot;: [ &quot;administrative_area_level_3&quot;, &quot;political&quot; ]
        }, {
            &quot;long_name&quot;: &quot;Kings&quot;,
            &quot;short_name&quot;: &quot;Kings&quot;,
            &quot;types&quot;: [ &quot;administrative_area_level_2&quot;, &quot;political&quot; ]
        }, {
            &quot;long_name&quot;: &quot;New York&quot;,
            &quot;short_name&quot;: &quot;NY&quot;,
            &quot;types&quot;: [ &quot;administrative_area_level_1&quot;, &quot;political&quot; ]
        }, {
            &quot;long_name&quot;: &quot;United States&quot;,
            &quot;short_name&quot;: &quot;US&quot;,
            &quot;types&quot;: [ &quot;country&quot;, &quot;political&quot; ]
        }, {
            &quot;long_name&quot;: &quot;11211&quot;,
            &quot;short_name&quot;: &quot;11211&quot;,
            &quot;types&quot;: postal_code
        } ],
            &quot;geometry&quot;: {
                &quot;location&quot;: {
                &quot;lat&quot;: 40.7142298,
                &quot;lng&quot;: -73.9614669
            },
            &quot;location_type&quot;: &quot;RANGE_INTERPOLATED&quot;,
            &quot;viewport&quot;: {
                &quot;southwest&quot;: {
                    &quot;lat&quot;: 40.7110822,
                    &quot;lng&quot;: -73.9646145
            },
            &quot;northeast&quot;: {
                &quot;lat&quot;: 40.7173774,
                &quot;lng&quot;: -73.9583193
            }
        }
    }
},
... Additional results[] ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that the reverse geocoder returned more than one result. The result's &quot;formatted_addresses&quot; are not just postal addresses, but any way to geographically name a location. For example, when geocoding a point in the city of Chicago, the geocoded point may be denoted as a street address, as the city (Chicago), as its state (Illinois) or as a country (The United States). All are &quot;addresses&quot; to the geocoder. The reverse geocoder returns any of these types as valid results.&lt;/p&gt;

&lt;p&gt;The reverse geocoder matches political entities (countries, provinces, cities and neighborhoods), street addresses, and postal codes.&lt;/p&gt;

&lt;p&gt;The full list of formatted_address values returned by the previous query are shown below.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;formatted_address&quot;: &quot;275-291 Bedford Ave, Brooklyn, NY 11211, USA&quot;,
&quot;formatted_address&quot;: &quot;Williamsburg, NY, USA&quot;,
&quot;formatted_address&quot;: &quot;New York 11211, USA&quot;,
&quot;formatted_address&quot;: &quot;Kings, New York, USA&quot;,
&quot;formatted_address&quot;: &quot;Brooklyn, NY, USA&quot;,
&quot;formatted_address&quot;: &quot;New York, NY, USA&quot;,
&quot;formatted_address&quot;: &quot;New York, USA&quot;,
&quot;formatted_address&quot;: &quot;United States&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Region Biasing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Google Geocoding API returns address results influenced by the region (typically the country) from which the request is sent. For example, searches for &quot;San Francisco&quot; may return different results if sent from a domain within the United States than one sent from Spain.&lt;/p&gt;

&lt;p&gt;You can set the Geocoding API to return results biased to a particular region using the region parameter. This parameter takes a ccTLD (country code top-level domain) argument specifying the region bias. Most ccTLD codes are identical to ISO 3166-1 codes, with some notable exceptions. For example, the United Kingdom's ccTLD is &quot;uk&quot; (.co.uk) while its ISO 3166-1 code is &quot;gb&quot; (technically for the entity of &quot;The United Kingdom of Great Britain and Northern Ireland&quot;).&lt;/p&gt;

&lt;p&gt;Geocoding results can be biased for every domain in which the main Google Maps application is officially launched. Note that biasing only prefers results for a specific domain; if more relevant results exist outside of this domain, they may be included.&lt;/p&gt;

&lt;p&gt;For example, a geocode for &quot;Toledo&quot; returns this result, as the default domain for the Geocoding API is set to the United States:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://maps.googleapis.com/maps/api/geocode/json?address=Toledo&amp;amp;sensor=false
# Returns:
#
{
  &quot;status&quot;: &quot;OK&quot;,
  &quot;results&quot;: [ {
    &quot;types&quot;: [ &quot;locality&quot;, &quot;political&quot; ],
    &quot;formatted_address&quot;: &quot;Toledo, OH, USA&quot;,
    &quot;address_components&quot;: [ {
      &quot;long_name&quot;: &quot;Toledo&quot;,
      &quot;short_name&quot;: &quot;Toledo&quot;,
      &quot;types&quot;: [ &quot;locality&quot;, &quot;political&quot; ]
    }, {
      &quot;long_name&quot;: &quot;Ohio&quot;,
      &quot;short_name&quot;: &quot;OH&quot;,
      &quot;types&quot;: [ &quot;administrative_area_level_1&quot;, &quot;political&quot; ]
    }, {
       &quot;long_name&quot;: &quot;United States&quot;,
       &quot;short_name&quot;: &quot;US&quot;,
       &quot;types&quot;: [ &quot;country&quot;, &quot;political&quot; ]
    } ],
        &quot;geometry&quot;: {
        &quot;location&quot;: {
        &quot;lat&quot;: 41.6529200,
        &quot;lng&quot;: -83.5777820
    },
    &quot;location_type&quot;: &quot;APPROXIMATE&quot;,
    &quot;viewport&quot;: {
        &quot;southwest&quot;: {
        &quot;lat&quot;: 41.5861889,
        &quot;lng&quot;: -83.7058414
    },
    &quot;northeast&quot;: {
        &quot;lat&quot;: 41.7195821,
        &quot;lng&quot;: -83.4497226
    }
  },
  &quot;bounds&quot;: {
        &quot;southwest&quot;: {
            &quot;lat&quot;: 41.5803170,
            &quot;lng&quot;: -83.6947540
        },
        &quot;northeast&quot;: {
            &quot;lat&quot;: 41.7326310,
            &quot;lng&quot;: -83.4545660
        }
    }
    }
} ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, a geocode for &quot;Toledo&quot; with region=es (Spain) will return the Spanish city.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component Filtering&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Google Geocoding API can return address results restricted to a specific area. The restriction is specified using the components filter. A filter consists of a list of component:value pairs separated by a pipe (|). Only the results that match all the filters will be returned. Filter values support the same methods of spelling correction and partial matching as other geocoding requests. If a geocoding result is a partial match for a component filter it will contain a partial_match field in the response.&lt;/p&gt;

&lt;p&gt;The components that can be filtered include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; route matches long or short name of a route.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; locality matches against both locality and sublocality types.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; administrative_area matches all the administrative_area levels.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; postal_code matches postal_code and postal_code_prefix.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; country matches a country name or a two letter ISO 3166-1 country code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A geocode for &quot;Santa Cruz&quot; with components=country:ES will return Santa Cruz de Tenerife in Canary Islands, Spain.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/the-google-geocoding-api</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/the-google-geocoding-api</guid>
        <pubDate>Wed, 27 Nov 2013 16:16:00 +0000</pubDate>
      </item>
          <item>
        <title>normalizedSync.php - Single file demo</title>
        <description>
          &lt;p&gt;Are you trying to sync de-normalized data from a remote source (e.g. webservice) and struggle importing it into your nicely normalized database? Maybe this little demo might give you an idea!&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Part 1:&lt;/strong&gt;  ( &lt;a href=&quot;http://sqlfiddle.com/#!2/aa28e/1&quot;&gt;Normalize existing DB-Data&lt;/a&gt; )&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; Keepin' it all in sync&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;run this from your CLI:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -Ls http://git.io/6VTovw | php
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;or download the &lt;a href=&quot;https://gist.github.com/druu/7541557#file-normalizedsync-php&quot;&gt;normalizedSync.php&lt;/a&gt; file and run it locally&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;So... just what exactly is going on here?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Picture this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  You're facing yourself with the task to frequently pull data from &lt;strong&gt;&lt;em&gt;theSERVICE&lt;/em&gt;&lt;/strong&gt; via their API and keep a synchronized copy on your DB cluster.  &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  You skim the docs, run some little test scripts and have soon found just the right combination of URL and request data to get exactly the data you need to have.  &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  You head happily and motivated into implementing and testing your little cron jobby.  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then you realize...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yeah, but what happened???&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well... Someone over at &lt;strong&gt;&lt;em&gt;theSERVICE&lt;/em&gt;&lt;/strong&gt; thought:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&quot;Nah, our users surely won't need the relational data from our systems... Let's give 'em the human friendly, easy readable, flat version.&quot;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Or maybe someone though:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&quot;3NF - WHAT? Ain't nobody got tyme fo' dat!&quot;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So basically, you're facing this situation:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/p&gt;

&lt;pre&gt;
   +----------------------+---------------------------+--------------------+-------------+
   |  vendor              | category                  | name               |    ....     |
   +----------------------|---------------------------|--------------------|-------------+
   |                      |                           |                    |             |
   |  Vendor 1            | Category 2                | Product 1          |             |
   +-------------------------------------------------------------------------------------+
   |                      |                           |                    |             |
   |  Vendor 1            | Category 2                | Product 2          |             |
   +-------------------------------------------------------------------------------------+
   |                      |                           |                    |             |
   |  Vendor 2            | Category 1                | Product 3          |             |
   +-------------------------------------------------------------------------------------+
   |                      |                           |                    |             |
   |  Vendor 3            | Catefory 3                | Product 4          |             |
   +----------------------+---------------------------+--------------------+-------------+
   \\===&gt; This is the structure of the data you received...
&lt;/pre&gt;

&lt;p&gt;&lt;/code&gt;
&lt;strong&gt;But:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your system looks like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/p&gt;

&lt;pre&gt;
   +-----+-----------------------+          +-----+--------------------------+
   | id  |  name                 |          | id  |  name                    |
   |-----|-----------------------|          |-----|--------------------------|
   |     |                       |          |     |                          |
   | 1   |  Vendor 1             |          | 1   |  Category 43             |
   +-----------------------------+          +--------------------------------+
   |     |                       |          |     |                          |
   | 2   |  Vendor 2             |          | 2   |  Category 1              |
   +-----------------------------+          +--------------------------------+
   |     |                       |          |     |                          |
   +-----+-----------------------+          +-----+--------------------------+
   \\==============&gt; vendors table          \\==============&gt; categories table
&lt;/pre&gt;

&lt;p&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/p&gt;

&lt;pre&gt;
   +-----+--------------+-----------------+----------------------+-----------+
   | id  | vendor_id    | category_id     | name                 |    ...    |
   |-----|--------------|-----------------|----------------------|-----------|
   |     |              |                 |                      |           |
   | 1   | 1            | 2               | Product 1            |           |
   +-------------------------------------------------------------------------+
   |     |              |                 |                      |           |
   | 2   | 1            | 3               | Product 2            |           |
   +-------------------------------------------------------------------------+
   |     |              |                 |                      |           |
   | 3   | 2            | 12              | Product OVER 9000    |           |
   +-------------------------------------------------------------------------+
   \\=========================================================&gt; products table
&lt;/pre&gt;

&lt;p&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your cron-script takes an hour to complete...&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dis no good.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Enter: This Demo Script!&lt;/strong&gt;
Again: just run &lt;em&gt;&quot;curl -Ls http://git.io/6VTovw | php&quot;&lt;/em&gt; from your CLI and see the data flowing in.&lt;/p&gt;

&lt;p&gt;Let me quickly describe what's going on there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; PHP parses the source file for any class declarations&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The script grabs Jeremy Dorn's (@jdorn) &lt;a href=&quot;https://github.com/jdorn/sql-formatter&quot;&gt;SqlFormatter&lt;/a&gt; to get some juice ;)&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The main loop is called. Just 3 iterations of a formloop, with constantly growing result sets&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Within the loop:

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Related data (vendors, categories) get extracted from the flat dataset&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Then 2 batch insert queries are fired &lt;em&gt;(ON DUPLICATE KEY UPDATE)&lt;/em&gt; and the results are instantly retrieved&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; And a lookup transformation is applied:&lt;br /&gt;
     &lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Before:&lt;/strong&gt; &lt;em&gt;vendors[] = {&quot;id&quot;: 1, &quot;name&quot;: &quot;Vendor 1&quot;}&lt;/em&gt;&lt;br /&gt;
     &lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;After:&lt;/strong&gt;  &lt;em&gt;vendors[&quot;Vendor 1&quot;] = {&quot;id&quot;: 1, &quot;name&quot;: &quot;Vendor 1&quot;}&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; So with that easy accessible array of meta-infos, for every row of the received data, the columns &lt;em&gt;vendor&lt;/em&gt; and &lt;em&gt;category&lt;/em&gt; will be replaced by &lt;em&gt;vendor_id&lt;/em&gt;, respectively &lt;em&gt;category_id&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Out of this &lt;em&gt;normalized&lt;/em&gt; result set, we can quickly create another batch insert&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; And be done.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But seriously, read the source, get a hang of what's happening.  This was more or less hastily done, and probably has loads of things to optimize.&lt;/p&gt;

&lt;p&gt;But you get the idea ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One more thing...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are a few things I'd like to point out and/or explain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do you use &lt;em&gt;array_map()&lt;/em&gt; that much? Why no loops?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; I easily could've used loops, but I wanted to keep it relatively short.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why the hell did you even write this?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;Well, I started answering a question about how that particular person could implement an efficient way to solve exactly this problem.  &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The thing got out of hand...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;So, is it efficient?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; To be fair, I just lab-tested it. I have no real-life benchmarks or anything.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; This particular thing uses 15 db queries in total, and the queries aren't super complex either. But again, I have not analyzed in regards of performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Okay, Lab-tested? You sure have run it against a DB, haven't ya?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;OK! Here's the interesting bit:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've got 3 classes (Sorry @jdorn ):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Helper&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Extractor&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is &lt;em&gt;Helper's&lt;/em&gt; job to simulate the API-call, perform the lookup transformations, generate the query string, and so on. Just a little collection of sort of generic methods.&lt;/p&gt;

&lt;p&gt;When you run the script you will see some output like&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/p&gt;

&lt;pre&gt;
*** SysStats: *******************************************************
    $&gt; Received 918 products!
    $&gt; DB Stats:
    $&gt; COUNT(vendors.*) : 100 rows
    $&gt; COUNT(categories.*) : 100 rows
    $&gt; COUNT(products.*) : 1867 rows
    $&gt; Current query count: 15
*** End of SysStats *************************************************
&lt;/pre&gt;

&lt;p&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When you take a look at &lt;em&gt;Helper::get_products()&lt;/em&gt; you will find that I've limited the number of unique vendors and categories to a hundred results each.  That's just for the sake of creating key-collision so the update part of the query is fired to, demonstrating the desired behaviour. (Albeit only accumulating data at this point)&lt;/p&gt;

&lt;p&gt;Then we've got the &lt;em&gt;Extractor&lt;/em&gt; &lt;em&gt;(cue dramatic music)&lt;/em&gt;&lt;br /&gt;
It's whole purpose is just to extract the meta-info from the API's data, induce the assembly of the query string, and initiate the lookup optimization.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;...sigh.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeah, and then there's the weird uncle at the family reunion, that no one is sure of his actual relation to your family. He also stinks, and doesn't like you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ladies and gentlemen, please welcome: the &lt;em&gt;Database&lt;/em&gt;-Emulator!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I can't quite explain what led my to produce this piece of... this thing. But hey! It does it's job!&lt;/p&gt;

&lt;p&gt;It emulates an &lt;strong&gt;extremely&lt;/strong&gt; reduced subset of a DBMS, taking an actual SQL-Query, extracting the wanted data from it, and storing it in a projection of what should've been some sort of Relational DBMS scheme.&lt;/p&gt;

&lt;p&gt;Also, not wanting to overcomplicate it too much, I just gave it a few quick'n'dirty shorthand methods, to make it obey. :)&lt;/p&gt;

&lt;p&gt;As I said, check the source! It's always fun to see, what the human brain comes up with, when you're actually drifting into insanity. :D&lt;/p&gt;

&lt;p&gt;Drop me a note, if I haven't scared you already :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And just btw:&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://i.imgur.com/JRWcbfC.png&quot;&gt;Here's a call graph.&lt;/a&gt;&lt;br /&gt;
And &lt;a href=&quot;https://gist.github.com/druu/7541557&quot;&gt;here's the Gist&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Have Fun!&lt;br /&gt;
  druu&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;P.S.:&lt;/strong&gt; Thanks to Jeremy Dorn (@jdorn) for that supreme SQL Formatter and to Marco Monteiro for editing and publishing this bit :) You rock! \o/&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/normalizedsync-single-file-demo</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/normalizedsync-single-file-demo</guid>
        <pubDate>Tue, 19 Nov 2013 12:23:00 +0000</pubDate>
      </item>
          <item>
        <title>Keep your sanity with office pranks</title>
        <description>
          &lt;p&gt;I've been part of what we call the work force for a few years now. Worked at a few places before my current &lt;a href=&quot;http://blog.marcomonteiro.net/post/the-ch-experience&quot;&gt;job&lt;/a&gt;. They were all different. The people was obviously hence the mood/vibe was always changing from place to place, but one thing was the same across the board: &lt;strong&gt;office pranks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They have always been a part of me since I started working. From the classic stapler wrapped in pudding (from the office tv show) to any other (but we'll get to that).&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Let's talk about some of the good office pranks that happened just in the last 9 to 10 months, and what they've done for everyone at work.&lt;/p&gt;

&lt;p&gt;When people start working at a new place, normally they don't know what to expect. They don't know anyone. People need some way to establish trust and most of all, companionship. that's when office pranks play one of the biggest roles of all (drinking can help too though).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The wrapper&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once upon a time, a colleague from work was on vacation. What's the best way to welcome someone when they were away for two weeks? — Prank obviously.&lt;/p&gt;

&lt;p&gt;That was exactly what I did. I wrapped everything in wrapping plastic paper. Dexter style. And I mean everything: chair, computer, table, keyboard, even the pens were individually wrapped. Took me about one hour to accomplish that.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/mac_mena.jpg&quot; alt=&quot;office prank&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;You tell me if it was worth it.&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;If you want to see how that was done here's a gif showing how: &lt;a href=&quot;https://dl.dropboxusercontent.com/u/404972/blog/macmena.gif&quot;&gt;the process&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You should be careful choosing the person you're doing this. You have to be sure that the person will take it as a good and hilarious thing. When they do take it that way, you now have a friend for life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The barbie setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Newton's Third Law of Motion says the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;For every action, there is an equal and opposite reaction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Like so, if you prank someone at the office you are now next in line to be pranked, awesome right? When I went on vacation earlier this year I knew something was going to happen. At least I was hoping for that. I would be disappointed if nothing happened.&lt;/p&gt;

&lt;p&gt;To give you some context about this one: one of my mates from work and me moved in together, you know, roommates. Living alone is just too damn expensive. The thing was, everyone at the office was always joking about me moving in with the guy. The typical gay jokes were in place.&lt;/p&gt;

&lt;p&gt;When I came from my vacation I found my new work environment. Everything was pink. There was even a framed picture of the guy that it was going to live with. Heart shaped framed pictures I might add.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/pink.jpg&quot; alt=&quot;Office pranks&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;The picture will do the &quot;talking&quot; for me here&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;I was really proud of everyone when I saw it. Actually I was so proud that I used my computer like that for almost a week. People from every department would come over and visit me just to see the work of art.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The loud one&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one was not made for me, I was not even a part of the team that accomplished the prank. But great minds think alike. The conversation went something like this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Person 1:&lt;/strong&gt; You know what would be amazing?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Person 2:&lt;/strong&gt; What?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Person 1:&lt;/strong&gt; Do the horn prank on a chair.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Person 2:&lt;/strong&gt; Oh man, that would be awesome.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Person 1:&lt;/strong&gt; Do it!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And he did. Unfortunately I was away when it happened so I didn't get to see the result. But I do know that everyone in the building heard it. I don't have the real picture with me but here's the prank I'm talking about.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/laud.jpg&quot; alt=&quot;office prank&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;Genius right?&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The little things&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then there's the little things that some of the guys at work do that just make your day better. Sure they're dumb, and some people wouldn't like them. For me, that just means they care, but most of all, they do make my day better.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/dick.jpg&quot; alt=&quot;Office prank dick&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;Yeah! I haven't grew up to the point were dick jokes aren't funny anymore. Sorry.&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Those small things can go from changing the volume on your computer to change keyboards or mice that are normally connected to the computers with bluetooth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best one of all&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, the one that actually made me write this post.&lt;/p&gt;

&lt;p&gt;I work for a very active company. They're always trying to do something for the people that work there. For instance, this year everyone is going skydiving. Every now and then you'll get a random text from the CEO telling you something like:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;How would you feel like skydiving this weekend?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We're more than 80 people, so it takes a while to get your turn. This week I finally go that message. I went nuts, this was always something that I wanted to do, so you can imagine my reaction. I felt like dancing. To the point that some of my coworkers were annoyed. Because you know, I wouldn't shut up about it.&lt;/p&gt;

&lt;p&gt;So they did something about it. They stole my phone. Changed one of their names to the name I had for our CEO and sent me a text that was something like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I'm sorry Marco, but you are not skydiving this weekend. I'm sure another opportunity will come up in the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I felt like someone just took candy from me. And they let that feeling sink in for more than two hours. I moaned and moaned. But then, they called me from that number and said: &lt;strong&gt;GOT YA!!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I couldn't believe it. I was impressed. Was it bad? No, it was the best thing ever. Knowing that it was all a lie, and that they thought about all that in less than an hour? I think my work is done. They can now prank on their own.&lt;/p&gt;

&lt;p&gt;One thing is for sure. We all had a really good laugh and most of all, we're now even closer than we were before. That's what office pranks do for you. It makes your 9 to 5 work day more fun than it normally would. If you do know any bad side to office pranks let me know. I haven't found one yet.&lt;/p&gt;

&lt;p&gt;One more thing, I did jump last weekend and it was amazing.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/skydiving.jpg&quot; alt=&quot;Skydiving&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;One of the best experiences so far.&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/keep-your-sanity-with-office-pranks</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/keep-your-sanity-with-office-pranks</guid>
        <pubDate>Thu, 14 Nov 2013 08:19:00 +0000</pubDate>
      </item>
          <item>
        <title>Ross Tuck - HTTP and Your Angry Dog</title>
        <description>
          &lt;p&gt;This was probably one of my favorite talks from &lt;a href=&quot;http://laracon.eu/2013/&quot;&gt;Laracon EU 2013&lt;/a&gt;. I loved almost everything about it. It was informative, sometimes funny and most of all everyone in the room was interested. What can I say, Ross Tuck is a natural speaker.&lt;/p&gt;

&lt;p&gt;Ross Tuck is an American developer, living in the Netherlands, working at Ibuildings, wearing a hat, and wishing he was reading a book.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Talk:&lt;/strong&gt; HTTP and Your Angry Dog&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is an etag, exactly? What's all that stuff in the Accept header? And what the heck does a Vary header do anyways?! Web developers use HTTP everyday but most of us don't know how to get the most out of it. This talk goes past memorizing status codes (although we'll see those too) and teaches how to get the most out of every request and response.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;350&quot; src=&quot;//www.youtube.com/embed/2qBaMsYXtJ4&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;i class=&quot;icon-stop&quot;&gt;&lt;/i&gt; &lt;a href=&quot;http://www.slideshare.net/rosstuck/http-and-your-angry-dog&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/ross-tuck-http-and-your-angry-dog</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/ross-tuck-http-and-your-angry-dog</guid>
        <pubDate>Mon, 11 Nov 2013 11:53:00 +0000</pubDate>
      </item>
          <item>
        <title>Atomic commits</title>
        <description>
          &lt;p&gt;I'm sure this happened to you before, more than one time actually. You have a big file, you changed lots of stuff in it, but those changes are not really related. One may be related to one class and the other to something completely different. Normally you should avoid that, your commits should &lt;em&gt;always&lt;/em&gt; be specific to one task, feature or bug. If you do a small search about how to commit better you'll see that even the commit messages should have this notion.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Your commit message should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Explain in one line what the commit is about (Issue number if possible)

Describe the problem the commit solves. 
Justify why you chose the particular solution. 
Reference the issue number if not addressed in the title.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So if you're solving a bunch of problems in the same commit, your commit messages will tend to go off-road.&lt;/p&gt;

&lt;p&gt;Ideally you want to separate those changes into different commits and there's only one way (that I know of) to do that.&lt;/p&gt;

&lt;p&gt;Let's look at the git add command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git add [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p] 
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] 
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing][--] [&amp;lt;pathspec&amp;gt;...]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The one we're looking for is &lt;strong&gt;&lt;em&gt;git add -p&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;-p
  --patch
  Interactively choose hunks of patch between the index and the work tree and add them to the index. This gives the user a chance to review the difference before adding modified contents to the index.
  This effectively runs add --interactive, but bypasses the initial command menu and directly jumps to the patch subcommand. See “Interactive mode” for details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;strong&gt;&lt;em&gt;-p&lt;/em&gt;&lt;/strong&gt; flag is not only available for &lt;strong&gt;&lt;em&gt;git add&lt;/em&gt;&lt;/strong&gt; but also for &lt;strong&gt;&lt;em&gt;git checkout&lt;/em&gt;&lt;/strong&gt; (I haven't used this one yet).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This means that you can use git checkout -p to selectively discard edits from your current working tree. See the “Interactive Mode” section of git-add(1) to learn how to operate the --patch mode.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Personally I have used the &lt;strong&gt;&lt;em&gt;git add -p&lt;/em&gt;&lt;/strong&gt; flag without even know about it when using a Git GUI. But sometimes you just need to go old school and use the terminal.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; &lt;a href=&quot;http://git-scm.com/docs/git-add&quot;&gt;Git add reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; &lt;a href=&quot;http://git-scm.com/docs/git-checkout&quot;&gt;Git checkout reference&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/atomic-commits</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/atomic-commits</guid>
        <pubDate>Mon, 04 Nov 2013 18:29:00 +0000</pubDate>
      </item>
          <item>
        <title>My Dev setup on Mac</title>
        <description>
          &lt;p&gt;I've been asked a couple of times about my dev environment: what apps I'm currently using, and how I do use them. I'm going to try and sum it all up, going from terminal to text editor of choice and some of the plugins I have on them.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Text editor&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Sublime Text 2 may be downloaded and evaluated for free, however a license must be purchased for continued use. There is currently no enforced time limit for the evaluation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I haven't updated to Sublime Text 3 yet. Actually, I still don't see the point of upgrading.&lt;/p&gt;

&lt;p&gt;Packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/BracketHighlighter&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; BracketHighlighter &lt;small&gt;&lt;em&gt;Bracket and tag highlighter for Sublime Text&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/CodeIgniter%20Snippets&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Codeigniter Snippets &lt;small&gt;&lt;em&gt;A list of codeigniter snippets for Sublime Text 2&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/DocBlockr&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Doc​Blockr &lt;small&gt;&lt;em&gt;DocBlock comments in Javascript, PHP, CoffeeScript, Actionscript, C &amp;amp; C++&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/Emmet&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Emmet &lt;small&gt;&lt;em&gt;(ex-Zen Coding) for Sublime Text&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/Git&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Git &lt;small&gt;&lt;em&gt;Plugin for some git integration into sublime text&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/GitGutter&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Git​Gutter &lt;small&gt;&lt;em&gt;A Sublime Text 2/3 plugin to see git diff in gutter&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/SideBarEnhancements&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Side​Bar​Enhancements &lt;small&gt;&lt;em&gt;Enhancements to Sublime Text sidebar. Files and folders.&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/Theme%20-%20Nexus&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Theme - Nexus &lt;small&gt;&lt;em&gt;Dark custom UI theme for Sublime Text 2 Theme&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/Tomorrow%20Color%20Schemes&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Tomorrow Color Schemes &lt;small&gt;&lt;em&gt;Tomorrow Color Schemes for SublimeText 2&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Settings:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    &quot;auto_complete_commit_on_tab&quot;: false,
    &quot;bold_folder_labels&quot;: true,
    &quot;caret_style&quot;: &quot;smooth&quot;,
    &quot;color_scheme&quot;: &quot;Packages/Tomorrow Color Schemes/Tomorrow-Night.tmTheme&quot;,
    &quot;detect_indentation&quot;: false,
    &quot;draw_white_space&quot;: &quot;all&quot;,
    &quot;fallback_encoding&quot;: &quot;UTF-8&quot;,
    &quot;file_exclude_patterns&quot;:
    [
        &quot;*.pyc&quot;,
        &quot;*.pyo&quot;,
        &quot;*.exe&quot;,
        &quot;*.dll&quot;,
        &quot;*.obj&quot;,
        &quot;*.o&quot;,
        &quot;*.a&quot;,
        &quot;*.lib&quot;,
        &quot;*.so&quot;,
        &quot;*.dylib&quot;,
        &quot;*.ncb&quot;,
        &quot;*.sdf&quot;,
        &quot;*.suo&quot;,
        &quot;*.pdb&quot;,
        &quot;*.idb&quot;,
        &quot;.DS_Store&quot;,
        &quot;*.class&quot;,
        &quot;*.psd&quot;,
        &quot;*.db&quot;
    ],
    &quot;folder_exclude_patterns&quot;:
    [
        &quot;.svn&quot;,
        &quot;.git&quot;,
        &quot;.hg&quot;,
        &quot;CVS&quot;,
        &quot;.hgcheck&quot;
    ],
    &quot;font_face&quot;: &quot;Inconsolata&quot;,
    &quot;font_options&quot;:
    [
        &quot;no_bold&quot;,
        &quot;subpixel_antialias&quot;
    ],
    &quot;font_size&quot;: 13.0,
    &quot;highlight_line&quot;: true,
    &quot;highlight_modified_tabs&quot;: true,
    &quot;ignored_packages&quot;:
    [
        &quot;Vintage&quot;
    ],
    &quot;line_padding_bottom&quot;: 3,
    &quot;line_padding_top&quot;: 3,
    &quot;match_brackets&quot;: true,
    &quot;match_brackets_angle&quot;: true,
    &quot;match_brackets_braces&quot;: true,
    &quot;match_brackets_content&quot;: true,
    &quot;match_brackets_square&quot;: true,
    &quot;rulers&quot;:
    [
        95
    ],
    &quot;scroll_past_end&quot;: true,
    &quot;show_full_path&quot;: true,
    &quot;tab_size&quot;: 4,
    &quot;theme&quot;: &quot;Nexus.sublime-theme&quot;,
    &quot;translate_tabs_to_spaces&quot;: true,
    &quot;trim_trailing_white_space_on_save&quot;: true,
    &quot;vintage_start_in_command_mode&quot;: true,
    &quot;word_wrap&quot;: true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Version Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For version control I use &lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt;. Along with that I normally use one git-GUI called &lt;a href=&quot;http://www.sourcetreeapp.com/&quot;&gt;SourceTree&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.sourcetreeapp.com/&quot;&gt;SourceTree&lt;/a&gt; is a free Git &amp;amp; Mercurial client for Windows or Mac. I specially like this one because it has Git-Flow already out of the box.&lt;/p&gt;

&lt;p&gt;Along with this I also use those two packages for Sublime. Specially when I want to do something quick like a diff or change branches. That way, I don't need to go into my Terminal or SourceTree so often.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Terminal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ZSH is a must have. And if you want to use it like me you'll need the &lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot;&gt;oh-my-zsh&lt;/a&gt; awesome sauce.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;oh-my-zsh is an open source, community-driven framework for managing your ZSH configuration. It comes bundled with a ton of helpful functions, helpers, plugins, themes, and few things that make you shout…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's my ZSH config:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Path to your oh-my-zsh configuration.
ZSH=$HOME/.oh-my-zsh

#Set name of the theme to load.
# Look in ~/.oh-my-zsh/themes/
# Optionally, if you set this to &quot;random&quot;, it'll load a random theme each
# time that oh-my-zsh is loaded.
ZSH_THEME=&quot;miloshadzic&quot;

# Aliases
alias zshconfig=&quot;st ~/.zshrc&quot;
alias ohmyzsh=&quot;st ~/.oh-my-zsh&quot;
alias vhosts=&quot;sudo nano /etc/apache2/extra/httpd-vhosts.conf&quot;
alias st='/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'
alias ll=&quot;ls -lG&quot;
alias la=&quot;ls -AG&quot;
alias l=&quot;ls -FG&quot;
alias ls=&quot;ls -G&quot;
alias restarta=&quot;sudo apachectl restart&quot;
alias update-php=&quot;sudo curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4&quot;
alias ctags=&quot;`brew --prefix`/bin/ctags&quot;
alias ctagsbuild=&quot;ctags -R -f .tags&quot;


# Set to this to use case-sensitive completion
# CASE_SENSITIVE=&quot;true&quot;

# Comment this out to disable weekly auto-update checks
# DISABLE_AUTO_UPDATE=&quot;true&quot;

# Uncomment following line if you want to disable colors in ls
# DISABLE_LS_COLORS=&quot;true&quot;

# Uncomment following line if you want to disable autosetting terminal title.
# DISABLE_AUTO_TITLE=&quot;true&quot;

# Uncomment following line if you want red dots to be displayed while waiting for completion
# COMPLETION_WAITING_DOTS=&quot;true&quot;

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
plugins=(git github git-flow brew django node perl rails rails3 mercurial)

source $ZSH/oh-my-zsh.sh
unsetopt correct_all

# Customize to your needs...
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/git/bin

PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Markdown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I write all my blog posts in Markdown. I could do it right on my blog, but I do most of my writing when I don't have a connection. So I need a Markdown app. &lt;a href=&quot;http://mouapp.com/&quot;&gt;Mou app&lt;/a&gt; is my favourite. One of the best features is that I can include my blog css and see exactly how my post is going to be like while I write it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; PHP Environment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most developers using PHP probably use &lt;a href=&quot;http://www.mamp.info/en/index.html&quot;&gt;MAMP&lt;/a&gt;, personally I don't like it. I use a simple binary package where you can install or update your php with just one terminal command using curl.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Database management&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of my projects are using mySQL. Installing mySQL is quite easy, but the best free tool for database management is probably &lt;a href=&quot;http://www.sequelpro.com/&quot;&gt;Sequel Pro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Office Apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These days I actually use the bundle from Apple, since it's free and it's a good alternative to the expensive Microsoft one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.apple.com/ios/numbers/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Numbers &lt;small&gt;&lt;em&gt;Spreadsheets&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.apple.com/ios/pages/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Pages &lt;small&gt;&lt;em&gt;Word processor&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.apple.com/ios/keynote/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Keynote &lt;small&gt;&lt;em&gt;Create and deliver presentations&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Browsers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.google.com/intl/en/chrome/browser/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Chrome &lt;small&gt;&lt;em&gt;Work browser&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mozilla.org/en-US/firefox/new/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Firefox &lt;small&gt;&lt;em&gt;Debug browser&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.apple.com/safari/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Safari &lt;small&gt;&lt;em&gt;Starting to like this one for daily browsing&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Email Client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://sparrowmailapp.com/&quot;&gt;Sparrow&lt;/a&gt; has been acquired by Google, hence the development stopped. However, this is still my favourite email client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Cloud Storage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.icloud.com/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; iCloud &lt;small&gt;&lt;em&gt;Document keeping&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;www.dropbox.com/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Dropbox &lt;small&gt;&lt;em&gt;Safe keeping&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Google Drive &lt;small&gt;&lt;em&gt;Shared documents&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Calendar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For calendar I use the calendar app for mac, synced with my Google account, since I use Android there's no need for the iCloud stuff here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Package manager&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; is the missing package manager for OS X, specially if like me, you had bad experiences with MacPorts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-caret-right&quot;&gt;&lt;/i&gt; Social apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We all need to socialize every now and again. For that I use the following.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://itunes.apple.com/en/app/twitter/id409789998&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Twitter app &lt;small&gt;&lt;em&gt;For twitter obviously&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.codeux.com/textual/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Textual &lt;small&gt;&lt;em&gt;IRC&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/hangouts/nckgahadagoaajjgafhacjanaoiihapd?utm_source=chrome-ntp-icon&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Hangouts chrome extension &lt;small&gt;&lt;em&gt;Google Hangouts&lt;/em&gt;&lt;/small&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know what alternatives you are using besides the ones I listed.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/my-dev-setup-on-mac</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/my-dev-setup-on-mac</guid>
        <pubDate>Mon, 04 Nov 2013 13:09:00 +0000</pubDate>
      </item>
          <item>
        <title>Useful tips if you're starting with Git</title>
        <description>
          &lt;p&gt;When I started using Git I wasn't doing any version control. I was just working on my projects and I just didn't see any use to it. I wasn't seeing the long run. Everything seemed like too much work — Branching, staging, stashing, committing — I was confused.  But then Git was kind forced on me, since I wanted to contribute to open source projects and almost all of them were (and still are thankfully) using Git I had to learn how to use it. This is what I learned from that process.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-arrow-right&quot;&gt;&lt;/i&gt; Commit yourself to using Git&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Really, don't give up. It's going to hurt. Your not going to like it at first. But believe me when I say that in a matter of days, you'll love it. You must avoid exceptions like &lt;em&gt;&quot;I'm just doing this static html thing, why do I need Git for?&quot;&lt;/em&gt;. That is the worst thing you can do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-arrow-right&quot;&gt;&lt;/i&gt; Do your homework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read a bit, prepared yourself. You're going to need a little know how before you start. You don't need to read a book on the subject, but it's good to know the basics.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; How to start a repository?&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; How to commit?&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; How to track new files?&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; How to push and pull from remotes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple things that you should take a look first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-arrow-right&quot;&gt;&lt;/i&gt; Don't overdo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with something simple, don't try to use concepts like Git-Flow at first. Find your own workflow. When you're comfortable with that, then you can do some research on how to do things from there on. I find this one the easiest one when you're starting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.teamtreehouse.com/git-for-designers-part-1&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Git workflow for designers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-arrow-right&quot;&gt;&lt;/i&gt; Branching is awesome&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your first impulse will be to stay on the same branch and just work there. Don't do that, learn the power of branching and you'll see that is worth it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pcottle.github.io/learnGitBranching/&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Learn Git Branching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-arrow-right&quot;&gt;&lt;/i&gt; To use a Git GUI or not to use a Git GUI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm not against it, if you're not comfortable using the terminal, you should use a good Git GUI. As long you're using Git and are versioning your code the world is a better place. Personally I use this one from time to time &lt;a href=&quot;http://www.sourcetreeapp.com/&quot;&gt;SourceTree&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's it, if you follow this small set of tips you'll be up and ready in no time.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/useful-tips-if-you're-starting-to-use-git</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/useful-tips-if-you're-starting-to-use-git</guid>
        <pubDate>Wed, 30 Oct 2013 13:31:00 +0000</pubDate>
      </item>
          <item>
        <title>The rubber duck</title>
        <description>
          &lt;p&gt;Once upon a time there was a rubber duck! No seriously. We are programmers, we solve problems, and every now and then, we come across problems that we never had to solve before. Once in a while we need help. Maybe we don't have the know how to solve it. Maybe we're just too close to the project to even see the real problem. Or maybe, just maybe, we just need someone to talk to, share some ideas and the problem will solve itself.&lt;/p&gt;

&lt;p&gt;So we use rubber ducks to solve problems.&lt;/p&gt;

&lt;!--more--&gt;

&lt;blockquote&gt;
  &lt;p&gt;Rubber duck debugging, rubber ducking, and the rubber duckie test are informal terms used in software engineering to refer to a method of debugging code. The name is a reference to a story in the book The Pragmatic Programmer in which a programmer would carry around a rubber duck and debug his code by forcing himself to explain it, line-by-line, to the duck.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We should all have rubber ducks to talk to. Problem is: when we try to skip the rubber duck experience and jump right to the &lt;em&gt;&quot;I'll just ask someone on the Internet&quot;&lt;/em&gt; we end up doing it wrong. We assume that everyone will know our project well, and we don't ask the right questions.&lt;/p&gt;

&lt;p&gt;That's why pages like &lt;a href=&quot;http://superuser.com/questions/how-to-ask&quot;&gt;this one&lt;/a&gt; on Stack Exchange exist. Or even &lt;a href=&quot;http://jeff.jones.be/technology/articles/how-to-ask-for-help-on-irc/&quot;&gt;this one&lt;/a&gt; for IRC.&lt;/p&gt;

&lt;p&gt;I know it's better to have a rubber duck that actually talks back at you, but you just have to make an effort to be helped and ask your questions the right way.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Rubber_duck_debugging&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; Wikipedia&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/the-rubber-duck</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/the-rubber-duck</guid>
        <pubDate>Tue, 29 Oct 2013 13:59:00 +0000</pubDate>
      </item>
          <item>
        <title>Glide.js a simple, lightweight & fast jQuery slider</title>
        <description>
          &lt;p&gt;Glide is responsive and touch-friendly jQuery slider. Based on CSS3 transitions with fallback to older broswers. It's simple, lightweight and fast. Designed to slide, no less, no more. A lot has been said this past few weeks about OOCSS markup, Jędrzej Chałubek (creator of Glide.js) needed simple and fast slider with fully customizable OOCSS markup. If you're into OOCSS this is the way to go.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;How to use&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;jQuery is the only dependency. Make sure to include it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;http://code.jquery.com/jquery-1.9.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Include Glide.js&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;jquery.glide.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Link to slider stylesheet inside document head.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/style.css&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Make necessary markup for slider.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;slider&quot;&amp;gt;
    &amp;lt;ul class=&quot;slides&quot;&amp;gt;
        &amp;lt;li class=&quot;slide&quot;&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;slide&quot;&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&quot;slide&quot;&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Init our slider on default options ...&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  &amp;lt;script&amp;gt;
      $('.slider').glide();
  &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Best features of Glide.js&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Lightweight ~4,5kB minifed&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Ultra fast CSS3 Transitions&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Responsive&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Touch &amp;amp; mobile friendly&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Public API with callbacks&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; OOCSS &amp;amp; BEM&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Swipe event&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Arrows and bullets navigation&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Keyboard navigation&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Autoplay&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Pause on hover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://jedrzejchalubek.com/glide/&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Glide.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jedrzejchalubek/Glide.js&quot;&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; Github&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/glidejs-simple-lightweight-and-fast-jquery-slider</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/glidejs-simple-lightweight-and-fast-jquery-slider</guid>
        <pubDate>Tue, 22 Oct 2013 12:20:00 +0000</pubDate>
      </item>
          <item>
        <title>How Designers Destroyed the World</title>
        <description>
          &lt;p&gt;Mike Monteiro is a Portuguese/American designer, one of the founders of &lt;a href=&quot;http://muledesign.com/&quot;&gt;Mule Design&lt;/a&gt;. He's probably my favorite speaker when it comes to the subject of Design. He wrote one book called &lt;a href=&quot;http://www.abookapart.com/products/design-is-a-job&quot;&gt;Design is a Job&lt;/a&gt; that I highly recommend.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;A few years back he also gave a talk called &lt;a href=&quot;https://vimeo.com/22053820&quot;&gt;Fuck you, pay me&lt;/a&gt;. But this year he gave one called &lt;strong&gt;How Designers Destroyed the World&lt;/strong&gt; and it's amazing. He talks about the responsibility of designers to do the right thing. That design is supposed to be about solving problems and not just about making beautiful things (or yet another camera app).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You are directly responsible for what you put into the world. Yet every day designers all over the world work on projects without giving any thought or consideration to the impact that work has on the world around them. This needs to change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So if you're a Designer of any kind, Graphic Designer, Web Designer, UI Designer, UX Designer and so on you &lt;strong&gt;must&lt;/strong&gt; watch this.&lt;/p&gt;

&lt;iframe src=&quot;//player.vimeo.com/video/68470326?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ffffff&quot; width=&quot;100%&quot; height=&quot;338&quot; frameborder=&quot;0&quot; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/mike-monteiro-how-designers-destroyed-the-world</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/mike-monteiro-how-designers-destroyed-the-world</guid>
        <pubDate>Sun, 20 Oct 2013 18:53:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon EU recordings</title>
        <description>
          &lt;p&gt;You may or may not know, but last month I went to Amsterdam for &lt;a href=&quot;http://laracon.eu/2013/&quot;&gt;Laracon EU&lt;/a&gt;. I wrote a few posts about it. At the time they promised that everything would be recorded so all the devs out there could see it. They promised and they're now delivering. For now we access to 5 videos, but soon there will be more. Just keep track of Laracon EU youtube channel.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-youtube&quot;&gt;&lt;/i&gt; Taylor Otwell - Building Artisan Commands&lt;/strong&gt;&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;350&quot; src=&quot;//www.youtube.com/embed/fGwnCWfzLRI&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-youtube&quot;&gt;&lt;/i&gt; Fabien Potencier - Standardization, the Symfony Way&lt;/strong&gt;&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;350&quot; src=&quot;//www.youtube.com/embed/0erGiEm07b8&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-youtube&quot;&gt;&lt;/i&gt; Phill Sparks - Software Design Patterns in L4&lt;/strong&gt;&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;350&quot; src=&quot;//www.youtube.com/embed/qkIsTtIcTBE&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-youtube&quot;&gt;&lt;/i&gt; Kapil Verma - Engineering Complex Applications with L4&lt;/strong&gt;&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;350&quot; src=&quot;//www.youtube.com/embed/DEj1Q0N9o0w&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-youtube&quot;&gt;&lt;/i&gt; Jeffrey Way - Laravel Testing Tips, Techniques and Pitfalls&lt;/strong&gt;&lt;/p&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;350&quot; src=&quot;//www.youtube.com/embed/vmeh8XgrC2U&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;&lt;i class=&quot;icon-youtube&quot;&gt;&lt;/i&gt; Other posts about laracon:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/can't-get-to-laracon-you're-in-luck!&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Can't get to Laracon? You're in luck!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laravel-amsterdam-conference&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laravel Amsterdam Conference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laracon-here-i-come!&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laracon here I come!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laracon,-are-you-excited&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laracon, are you excited?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laracon-eu-1&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laracon EU (I)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laracon-eu-(2)&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laracon EU (II)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laracon-eu-3&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laracon EU (III)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laracon-eu-(iv)&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laracon EU (IV)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.marcomonteiro.net/post/laracon-(v)&quot;&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Laracon EU (V)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/channel/UCb9XEo_1SDNR8Ucpbktrg5A?feature=c4-feed-u&quot;&gt;&lt;i class=&quot;icon-youtube&quot;&gt;&lt;/i&gt; Laracon EU Youtube channel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://laracon.eu/2013/&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; Laracon EU 2013&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon-eu-recordings</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon-eu-recordings</guid>
        <pubDate>Fri, 18 Oct 2013 12:26:00 +0000</pubDate>
      </item>
          <item>
        <title>How to add Previous and Next links on wardrobe</title>
        <description>
          &lt;p&gt;If you're a regular here you may have noticed that I'm always making some small improvements on my blog. The last one was quite simple, I just wanted to add some previous and next links when the user is reading an article. However, I wasn't aiming to just simple arrows. I wanted to user to see the title of those articles.&lt;/p&gt;

&lt;p&gt;Since my blog uses wardrobe and that is built on top of Laravel, doing that is pretty straight forward.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;First let's go to the PostController and get those articles.&lt;/p&gt;

&lt;p&gt;This is the function you're looking for:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Display the specified resource.
 *
 * @param string $slug
 *
 * @return Response
 */
public function getShow($slug)
{
    $post = $this-&amp;gt;posts-&amp;gt;findBySlug($slug);
    if ( ! $post)
    {
        return App::abort(404, 'Page not found');
    }

    return View::make('themes.'.$this-&amp;gt;theme.'.post', compact('post'));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So let's get the prev and next articles based on the Post object.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Display the specified resource.
 *
 * @param string $slug
 *
 * @return Response
 */
public function getShow($slug)
{
    $post = $this-&amp;gt;posts-&amp;gt;findBySlug($slug);
    if ( ! $post)
    {
        return App::abort(404, 'Page not found');
    }
    $prev = DB::table('posts')-&amp;gt;orderBy('id', 'asc')-&amp;gt;where('id', '&amp;gt;', $post-&amp;gt;id)-&amp;gt;where('active', '1')-&amp;gt;first();
    $next = DB::table('posts')-&amp;gt;orderBy('id', 'desc')-&amp;gt;where('id', '&amp;lt;', $post-&amp;gt;id)-&amp;gt;where('active', '1')-&amp;gt;first();

    return View::make('themes.'.$this-&amp;gt;theme.'.post', compact('post', 'next', 'prev'));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Quite easy right? Now you may want to do the same in your getPreview function.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Show a post preview.
 *
 * @param int $id
 *
 * @return Response
 */
public function getPreview($id)
{
    $post = $this-&amp;gt;posts-&amp;gt;find($id);
    if ( ! Auth::check() or ! $post)
    {
        return App::abort(404, 'Page not found');
    }
    $prev = DB::table('posts')-&amp;gt;orderBy('id', 'asc')-&amp;gt;where('id', '&amp;gt;', $post-&amp;gt;id)-&amp;gt;where('active', '1')-&amp;gt;first();
    $next = DB::table('posts')-&amp;gt;orderBy('id', 'desc')-&amp;gt;where('id', '&amp;lt;', $post-&amp;gt;id)-&amp;gt;where('active', '1')-&amp;gt;first();

    return View::make('themes.'.$this-&amp;gt;theme.'.post', compact('post', 'next', 'prev'));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you just need to add that navigation links to your layout. I added mine to my post.blade.php file, since our next and prev links will only be used there.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;nav class=&quot;other_posts&quot;&amp;gt;
    &amp;lt;ul&amp;gt;
        @if($next)
            &amp;lt;li id=&quot;next&quot;&amp;gt;&amp;lt;a href=&quot;{{ url('post/'.$next-&amp;gt;slug) }}&quot; rel=&quot;prev&quot;&amp;gt;{{ $next-&amp;gt;title }} &amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        @endif
        @if($prev)
            &amp;lt;li id=&quot;previous&quot;&amp;gt;&amp;lt;a href=&quot;{{ url('post/'.$prev-&amp;gt;slug) }}&quot; rel=&quot;next&quot;&amp;gt;{{ $prev-&amp;gt;title }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        @endif
    &amp;lt;/ul&amp;gt;
&amp;lt;/nav&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That's is, nice and easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ps:&lt;/strong&gt; Soon after I published this post I had &lt;a href=&quot;https://twitter.com/marcogmonteiro/status/390842895458369536&quot;&gt;this talk&lt;/a&gt; with &lt;a href=&quot;https://twitter.com/dhrrgn&quot;&gt;Dan Horrigan&lt;/a&gt;. Turns out there's a better way to do it.&lt;/p&gt;

&lt;p&gt;Basically he got the same result with just one query. Look at this beauty.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function getShow($slug)
{
    $post = $this-&amp;gt;posts-&amp;gt;findBySlug($slug);
    if ( ! $post)
    {
        return App::abort(404, 'Page not found');
    }

    $posts = DB::select('SELECT * FROM `posts` WHERE `active` = 1 AND (`id` = (SELECT MIN(`id`) FROM `posts` where `id` &amp;gt; ?) OR `id` = (SELECT MAX(`id`) FROM `posts` where `id` &amp;lt; ?))', array($post-&amp;gt;id, $post-&amp;gt;id));

    $prev = null;
    $next = null;
    $count = count($posts);
    if ($count == 2) {
        list($prev, $next) = $posts;
    } elseif ($count == 1) {
        if ($posts[0]-&amp;gt;id &amp;gt; $post-&amp;gt;id) {
            $next = $posts[0];
        } else {
            $prev = $posts[0];    
        }
    }

  return View::make('themes.'.$this-&amp;gt;theme.'.post', compact('post', 'next', 'prev'));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Keep in mind that this is really only useful if it is a high traffic site. Thank you &lt;a href=&quot;https://twitter.com/dhrrgn&quot;&gt;Dan&lt;/a&gt;.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/how-to-add-previous-and-next-links-on-wardrobe</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/how-to-add-previous-and-next-links-on-wardrobe</guid>
        <pubDate>Thu, 17 Oct 2013 12:34:00 +0000</pubDate>
      </item>
          <item>
        <title>Bye bye Google Analytics, hello Piwik</title>
        <description>
          &lt;p&gt;I used to love Google Analytics, I've been using it for all my personal or client projects. However, the &quot;new&quot; version has been pissing me off more than usual. First I never got used to the new layout. Then the non integration with the google account that you normally have active it's insane. If I have multiple accounts it always makes me logout from all of them and login with just one. If I'm using just one, it always make me hit the login button.&lt;/p&gt;

&lt;p&gt;Anyway, long story short I started looking for an alternative. I had two requirements: I wanted to control the updates of the service; and I wanted to be able to use it like the old analytics. Nice and clean.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;So I found Piwik Analytics. The first thing I heard while talking to people about this matter was: &lt;em&gt;&quot;why would you bother with Piwik, when you have Google Analytics working fine?&quot;&lt;/em&gt; — Like I said, Google Analytics doesn't work fine.&lt;/p&gt;

&lt;p&gt;When you start really looking around you'll find some stuff that Piwik has that Google Analytics doesn't.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Tracking file downloads &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Tracking outbound links &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Tracks cart abandonment &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Handy summaries in the conversion report to quickly figure out what is going on&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Officially supported Mobile App&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; They publish a clear and open road map of where the application is going &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Piwik’s team offers Professional Services to help customize your site for a fee. (You need Google Premium at a $100,000/year to get that)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this is not enough for you, consider this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; What if you do not wish to be limited by Google Analytics or their API&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Is it important to own/control your data? &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Do you need a tool to collect data so you can create custom dashboards. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personally, having control over my data, and the fact that Google is not using my data for something else it's more than enough for me to choose Piwik.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://piwik.org/&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; Piwik&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/bye-bye-google-analytics-hello-piwik</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/bye-bye-google-analytics-hello-piwik</guid>
        <pubDate>Wed, 16 Oct 2013 09:24:00 +0000</pubDate>
      </item>
          <item>
        <title>Optimize your content for flipboard</title>
        <description>
          &lt;p&gt;Ever since &lt;a href=&quot;http://blog.marcomonteiro.net/post/a-message-from-the-future&quot;&gt;I stopped using normal RSS clients&lt;/a&gt; I started using apps like &lt;a href=&quot;https://flipboard.com/&quot;&gt;Flipboard&lt;/a&gt; to read my content. Since then, I notice that some content coming from some sources would look amazing, and some would look awful. So I've done some research and noticed that you can improve how your content looks on flipboard.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Here's a list of classes that you can add to your markup to make it happen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-remove&lt;/strong&gt; — will ignore any element with this class&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-keep&lt;/strong&gt; — will use this element in the article e.g tagging a paragraph with this will insure it remains part of the excerpt&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-image&lt;/strong&gt; — will use the element as an image&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-title&lt;/strong&gt; — will use as title&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-subtitle&lt;/strong&gt; — will use subtitle&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-author&lt;/strong&gt; — use as author&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-copyright&lt;/strong&gt; – set copyright&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-date&lt;/strong&gt; — set the date of the article&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-caption&lt;/strong&gt; — set as caption for an image; must be immediately after the image&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;flipboard-startArticle and flipboard-endArticle&lt;/strong&gt; — only consider the markup between flipboard-startArticle and flipboard-endArticle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple example for date using wardrobe:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;date flipboard-date&quot;&amp;gt;{{ date(&quot;M/d/Y&quot;, strtotime($post-&amp;gt;publish_date)) }}&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This way you can control a bit more on what content should be displayed on Flipboard.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/optimize-your-content-for-flipboard</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/optimize-your-content-for-flipboard</guid>
        <pubDate>Mon, 14 Oct 2013 12:01:00 +0000</pubDate>
      </item>
          <item>
        <title>The awesomeness of git hooks</title>
        <description>
          &lt;p&gt;Automation is probably the word we developers love the most. We're lazy, that's why there's so many Wordpress and Joomla websites. Oh wait I was talking about developers. Those are something different (let's leave it at that).&lt;/p&gt;

&lt;p&gt;So we version our code, and we obviously use git. BUt what if you wanted something to happen every-time we do make an action.&lt;/p&gt;

&lt;p&gt;Well git-hooks got you covered.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The current definition of git hooks:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hooks are little scripts you can place in $GIT_DIR/hooks directory to trigger action at certain points. When git init is run, a handful of example hooks are copied into the hooks directory of the new repository, but by default they are all disabled. To enable a hook, rename it by removing its .sample suffix.&lt;/p&gt;
  
  &lt;p&gt;&lt;small&gt;&lt;strong&gt;Note:&lt;/strong&gt; It is also a requirement for a given hook to be executable. However - in a freshly initialized repository - the .sample files are executable by default.&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm not going to mention all the &quot;actions&quot; you can use with git-hooks. You can RTFM for that.&lt;/p&gt;

&lt;p&gt;However, I can give you a real life example.&lt;/p&gt;

&lt;p&gt;Imagine you're using less with javascript:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet/less&quot; type=&quot;text/css&quot; href=&quot;css/styles.less&quot; /&amp;gt;
&amp;lt;script src=&quot;js/lib/less-1.1.3.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But now you want that to compiled every time you done editing and commit/push to your development server and the git post-recieve hook runs your build.sh and builds your css adn all that malarkey.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Post-receive&lt;/strong&gt;&lt;/p&gt;
  
  &lt;p&gt;This hook is invoked by git-receive-pack on the remote repository, which happens when a git push is done on a local repository. It executes on the remote repository once after all the refs have been updated.&lt;/p&gt;
  
  &lt;p&gt;This hook executes once for the receive operation. It takes no arguments, but gets the same information as the pre-receive hook does on its standard input.&lt;/p&gt;
  
  &lt;p&gt;This hook does not affect the outcome of git-receive-pack, as it is called after the real work is done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://git-scm.com/docs/githooks&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; RTFM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-automation-with-git-hooks/&quot;&gt;&lt;i class=&quot;icon-youtube-play&quot;&gt;&lt;/i&gt; Net-Tuts tutorial on git-hooks&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/the-awesomeness-of-git-hooks</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/the-awesomeness-of-git-hooks</guid>
        <pubDate>Thu, 10 Oct 2013 09:07:00 +0000</pubDate>
      </item>
          <item>
        <title>Taking over a big job</title>
        <description>
          &lt;p&gt;Every now and again I see people coming up on IRC asking for help. That's normal, we're there to help (and share lol cat pictures). However, it always amazes me when someone is asking for something like this:&lt;/p&gt;

&lt;p&gt;Is mysql a good option for a database that has 500.000.000.000 records?&lt;/p&gt;

&lt;p&gt;Sure if you're insane! But that's not even the point here. My question is: why is someone so inexperienced taking over a job like that? Clearly that person don't have the know how.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;For me, if for some reason I come across a project like that I only see two options.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; I have a team of really good developers having my back.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Don't take the job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't see any other way. So the next time you're about to take a new job, you need to ask yourself:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Am I capable of doing this? Do I have the human resources to manage such project?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you don't, you have to go with the last option and abandon the project. You will certainly going to screw it up. The client will not like to work with you, and you will end up losing money.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/no-work.jpg&quot; alt=&quot;No work&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;There's always stuff to do when you don't have enough work&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Always remember, even if you're having problems getting work there's always better stuff to do than losing money. Losing money is never an option, and that's what you're doing when you try to take over a project that you can't manage.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/taking-over-a-big-job</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/taking-over-a-big-job</guid>
        <pubDate>Mon, 07 Oct 2013 13:01:00 +0000</pubDate>
      </item>
          <item>
        <title>Animations using CSS3</title>
        <description>
          &lt;p&gt;I'm not a big fan of big animations on websites. I like to get in, get the thing I was looking for and get out. I hate it if I have to look at your awesome loading animation if the thing I just want is to look at your contacts page.&lt;/p&gt;

&lt;p&gt;However, from time to time, we need to animate some small elements. These days you can do most of it with just CSS3. People are using less and less javascript for this.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;But, once again, we're (lazy) developers, so we don't want to make our animations from scratch.&lt;/p&gt;

&lt;p&gt;Well Justin Aguilar got you covered, he compiled CSS3 Animation Cheat Sheet that is a set of preset, plug-and-play animations for your web projects. All you need to do is add the stylesheet to your website and apply the pre-made CSS classes to the elements you want animated.&lt;/p&gt;

&lt;p&gt;The CSS3 Animation Cheat Sheet uses CSS3 @keyframes and works on all the latest browsers (that's IE 10). Using CSS3 @keyframes, you don't have to worry about positioning the element to accommodate the animations - it will animate into place. Also for users with older browsers, the animated element will be visible and in place, even if the animation doesn't trigger. Below are instructions on how to get started.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.justinaguilar.com/animations/index.html&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; The project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.justinaguilar.com/animations/index.html#download&quot;&gt;&lt;i class=&quot;icon-css3&quot;&gt;&lt;/i&gt; The css file&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, there's another project that you might want to take a look when it comes to animations done with CSS3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's called animo.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one is a small javascript library that is used to trigger CSS3 animations. The documentation is near perfect but this one I haven't tested it yet.&lt;/p&gt;

&lt;p&gt;This library solves the main problem with CSS3 animations. The problem with CSS alone is that they're usually fired on page load or a hover event, and you can't stack animations or trigger another when one has completed. That's where JavaScript and animo come in. You can easily stack animations to fire one after another, specify callbacks for the completion of an animation, or simply fire animations on any event or at any moment you please.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://labs.bigroomstudios.com/libraries/animo-js&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; Animo.js website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ThrivingKings/animo.js&quot;&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; Animo.js repository&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/animations.css</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/animations.css</guid>
        <pubDate>Wed, 02 Oct 2013 05:00:00 +0000</pubDate>
      </item>
          <item>
        <title>PHP the right way</title>
        <description>
          &lt;p&gt;Personally I use PHP everyday. It has a lot of things that I don't like. It's not the best language in the world, it not perfect. However, it's flexible and easy to start with.&lt;/p&gt;

&lt;p&gt;The thing I hate more about using PHP is the amount of people that have the following hobby:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I shall hate PHP and every PHP developer for a living.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We find these assholes everyday: on forums, twitter and anywhere you can think of.&lt;/p&gt;

&lt;p&gt;Problem is, these guys don't really know how PHP works these days. They've been using the same arguments for years and years. But PHP evolved, so much so, that there's a whole project about it.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;a href=&quot;http://www.phptherightway.com/&quot;&gt;PHP the right way&lt;/a&gt; is the one you should be looking at.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;There’s a lot of outdated information on the Web that leads new PHP users astray, propagating bad practices and insecure code. PHP: The Right Way is an easy-to-read, quick reference for PHP popular coding standards, links to authoritative tutorials around the Web and what the contributors consider to be best practices at the present time.&lt;/p&gt;
  
  &lt;p&gt;There is no canonical way to use PHP. This website aims to introduce new PHP developers to some topics which they may not discover until it is too late, and aims to give seasoned pros some fresh ideas on those topics they’ve been doing for years without ever reconsidering. This website will also not tell you which tools to use, but instead offer suggestions for multiple options, when possible explaining the differences in approach and use-case.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;PHP the Right way&lt;/strong&gt; is a living document and will continue to be updated with more helpful information and examples as they become available.&lt;/p&gt;

&lt;p&gt;If you're a PHP developer, you can be a better one by taking a look at this project. If you're one of those annoying assholes, you can now be an informed one.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.phptherightway.com/&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; PHP the right way&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/php-the-right-way</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/php-the-right-way</guid>
        <pubDate>Tue, 01 Oct 2013 10:41:00 +0000</pubDate>
      </item>
          <item>
        <title>Flash is dead... or is it?</title>
        <description>
          &lt;p&gt;A few years back almost every developer made something in Flash. We all hated it, but we had to do it. The client would come into the office and say something like:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I want my website made in flash. I want an awesome intro and a lot of animations and videos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We all hated those clients, but then we gained some balls and started making the clients see the other side of things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The google bot doesn't like flash.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The end user don't like flashy designs with lot's of animations.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Flash requires a 3rd party plugin installed on your browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The thing is, we're now seeing a whole different breed of clients. Now they come to you with random words they hear from their friends or colleges at work.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Now they want:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  Responsive websites; &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The application has to work well on all the devices;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  Has to be fast; &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  Has to run on IE6/7;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  Animate all the things;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt;  I don't want any page loads (everything must be in ajax);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think you already see the problem here, the client don't really know what they want. They know these words and they just want what they think everyone has.&lt;/p&gt;

&lt;p&gt;Problem is that we as developers, need to make money. Sometimes, our bosses are consultants that don't really know what that means and just want to sell something.&lt;/p&gt;

&lt;p&gt;So we have to do these things. We have to animate all the elements and we're seeing these websites everyday.&lt;/p&gt;

&lt;p&gt;Just look at those trends on &lt;a href=&quot;http://www.awwwards.com/&quot;&gt;Awwwards&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/awwwards.png&quot; alt=&quot;awwwards&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;center&gt;September 30, 2013&lt;/center&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Now look at the first website on the that list &lt;a href=&quot;http://hellomonday.com/&quot;&gt;Hello Monday&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It has everything a flash website used to have.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Annoying loading when the website first loads;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; It has to explain to the user how to navigate the website;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Animations everywhere;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Everything needs a small loading while opening;&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; You navigate on the website and nothing happens on the url;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think the only thing missing is the music playing on the background.&lt;/p&gt;

&lt;p&gt;I guess something has gone terrible wrong. When flash died we had a good couple of years. People were making websites where &lt;strong&gt;content&lt;/strong&gt; was the thing that matter.&lt;/p&gt;

&lt;p&gt;Now with HTML5, CSS3 and how javascript is evolving &lt;strong&gt;we're again overdoing things&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ps:&lt;/strong&gt; Aparently I commited a brain fart and the example I showed is actually a flash website. Anyways, the website that won the &lt;em&gt;Site of the Day&lt;/em&gt; that day was the &quot;&lt;a href=&quot;https://www.justareflektor.com/&quot;&gt;Just a reflektor&lt;/a&gt;&quot;. On this one you can see the same exact problems. Sorry about that.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/flash-is-dead...-or-is-it</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/flash-is-dead...-or-is-it</guid>
        <pubDate>Mon, 30 Sep 2013 09:23:00 +0000</pubDate>
      </item>
          <item>
        <title>Repo.js</title>
        <description>
          &lt;p&gt;We are developers, we have personal websites, blogs and all that. So from time to time, we want to embed in a blog post or any other type of content a bit of code. There's a lot of ways to do so. For instance on my blog I use &lt;a href=&quot;http://softwaremaniacs.org/soft/highlight/en/&quot;&gt;highlight.js&lt;/a&gt;. It works fine I don't have a single complaint about it.&lt;/p&gt;

&lt;p&gt;However, what if I had a bunch of files I needed to show inside a blog post or even more, imagine I want to show a hole github repository inside a blog post?&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Well repo.js is here to save the day.&lt;/p&gt;

&lt;p&gt;All you need to do is add the javascript library into your website. Then you can just do:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$('#repo').repo({ user: 'mpmont', name: 'ci-snippets' });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That should be all.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/darcyclarke/Repo.js&quot;&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; Repo.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://darcyclarke.me/dev/repojs/&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Demo&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/repo.js</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/repo.js</guid>
        <pubDate>Fri, 27 Sep 2013 05:23:00 +0000</pubDate>
      </item>
          <item>
        <title>Top 100 with 18k installs</title>
        <description>
          &lt;p&gt;That's right, I'm talking about the Codeigniter snippets package for sublime text. The package is now one of the top 100 most installed packages and it has 18k installs.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/ci-snippets.png&quot; alt=&quot;ci-snippets-stats&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;The current status&lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;The package is compatible with both Sublime Text 2 and 3. So feel free to use it and add more awesomeness to it. The package has already most of the stuff that you'll need while using Codeigniter and Sublime Text. But I'm sure you have something to add.&lt;/p&gt;

&lt;p&gt;Also, thank you!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mpmont/ci-snippets&quot;&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; CI-Snippets&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://sublime.wbond.net/packages/CodeIgniter%20Snippets&quot;&gt;&lt;i class=&quot;icon-bar-chart&quot;&gt;&lt;/i&gt; Status Page&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/top-100-with-18k-installs</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/top-100-with-18k-installs</guid>
        <pubDate>Tue, 24 Sep 2013 14:34:00 +0000</pubDate>
      </item>
          <item>
        <title>Bootstrap Magic</title>
        <description>
          &lt;p&gt;We all know and love &lt;a href=&quot;http://getbootstrap.com/&quot;&gt;Twitter Bootstrap&lt;/a&gt;.  Or maybe you don't (in that case here's a small description: &lt;em&gt;&quot;Sleek, intuitive, and powerful mobile first front-end framework for faster and easier web development.&quot;&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;There's many ways of using it, some developers just download the massive css file(s) and start hacking into it. Some configure the available variables and then hack into it. Others do it the right way and download the &lt;a href=&quot;https://github.com/twbs/bootstrap/&quot;&gt;less version&lt;/a&gt; and then make their changes.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;However, now there's a tool that can help you customize all those variables and even more in a more intuitive way. It's called Bootstrap Magic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this one better?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, this way you change the variables and see the result at the same time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some of the main features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Bootstrap 3&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Importing your own variables&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Contextual and live preview&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Colorpicker&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Google Webfonts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://getbootstrap.com/&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Twitter Bootstrap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pikock.github.io/bootstrap-magic/&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Bootstrap Magic&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/bootstrap-magic</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/bootstrap-magic</guid>
        <pubDate>Mon, 23 Sep 2013 11:47:00 +0000</pubDate>
      </item>
          <item>
        <title>Go social</title>
        <description>
          &lt;p&gt;Nowadays everything is about social networks. My question is, do you have your website prepared for all of that malarkey? Facebook released their open-graph. But is Facebook the only one with it? 
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;For Facebook all you need to do it add all these meta tags into your header. That way, every time someone shares your links on facebook they will have a lot more info with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;image&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta property=&quot;og:image&quot; content=&quot;http://blog.marcomonteiro.net/themes/default/img/facebooklogo.jpg&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It's best to use a square image, as Facebook displays them in that matter. That image should be at least 50x50 in any of the usually supported image forms (JPG, PNG, etc.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;title&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta property=&quot;og:title&quot; content=&quot;Go social&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In most cases, this should be the article or page title.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;url&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;meta property=&quot;og:url&quot; content=&quot;http://blog.marcomonteiro.net&quot;/&gt;&lt;/p&gt;

&lt;p&gt;Familiarize yourself with the canonical LINK type if you aren't aware of its purpose -- it could help your SEO out greatly!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;site_name&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta property=&quot;og:site_name&quot; content=&quot;$blog++&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is very useful as Facebook may have no way of knowing outside of this META tag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Provides Facebook the type of website that you would like your website to be categorized by:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta property=&quot;og:type&quot; content=&quot;blog&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Read the &lt;a href=&quot;http://developers.facebook.com/docs/opengraph/#types&quot;&gt;complete list of website types&lt;/a&gt; to best categorize your website.&lt;/p&gt;

&lt;p&gt;These are not the complete list of open-graph tags.&lt;/p&gt;

&lt;p&gt;If you use twitter a lot, on the web or on a mobile app you have noticed that some of the links people share now have a description with it, or an image, sometimes even a video. Well that's because twitter has it's own tags for content. The main difference is that you have to apply for it. I guess that's because twitter want's to filter adult content.&lt;/p&gt;

&lt;p&gt;You can test and create your tags &lt;a href=&quot;https://dev.twitter.com/docs/cards/validation/validator&quot;&gt;here&lt;/a&gt;. And when you do so, you can add them to your website and request approval from them. It may take a couple of weeks to be approved (I'm still waiting actually).&lt;/p&gt;

&lt;p&gt;Here's a example list of twitter tags:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;&amp;gt;
&amp;lt;meta name=&quot;twitter:site&quot; content=&quot;@marcogmonteiro&quot;&amp;gt;
&amp;lt;meta name=&quot;twitter:title&quot; content=&quot;Pixel density of 538ppi?&quot;&amp;gt;
&amp;lt;meta name=&quot;twitter:description&quot; content=&quot;Full HD displays? Eat your heart out, handset manufacturers. LG Display has just laid claim to the world's first Quad HD (2,560 x 1,440) smartphone display, which also boasts the highest pixel density of a mobile device, clocking in at 538ppi.&quot;&amp;gt;
&amp;lt;meta name=&quot;twitter:creator&quot; content=&quot;@marcogmonteiro&quot;&amp;gt;
&amp;lt;meta name=&quot;twitter:domain&quot; content=&quot;blog.marcomonteiro.net&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So next time you think about going social on your website just remember: the Internet is more than just Facebook.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/go-social</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/go-social</guid>
        <pubDate>Tue, 17 Sep 2013 08:53:00 +0000</pubDate>
      </item>
          <item>
        <title>Happy Programmers' Day</title>
        <description>
          &lt;p&gt;That's right, today (Friday the 13th) is Programmers Day.&lt;/p&gt;

&lt;p&gt;Programmers' Day is an international professional day recognized in many technology companies and programming firms, that is celebrated on the 256th (hexadecimal 100th, or the 28th) day of each year (September 13 during common years and on September 12 in leap years).&lt;/p&gt;

&lt;p&gt;The number 256 (28) was chosen because it is the number of distinct values that can be represented with an eight-bit byte, a value well-known to programmers. 256 is the highest power of two that is less than 365, the number of days in a common year.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/comic.jpg&quot; alt=&quot;GoTo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;To all the programmers outthere. Have fun!&lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;This particular day was proposed by Valentin Balt and Michael Cherviakov, employees of Parallel Technologies (a web design company). As early as 2002, they tried to gather signatures for a petition to the government of Russia to recognize the day as the official programmers' day.&lt;/p&gt;

&lt;p&gt;On July 24, 2009, the Ministry of Communications and Mass Media (Russia) issued a draft of an executive order on a new professional holiday, Programmers' Day.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;All info based on wikipedia article about the day.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/happy-programmers'-day</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/happy-programmers'-day</guid>
        <pubDate>Fri, 13 Sep 2013 12:26:00 +0000</pubDate>
      </item>
          <item>
        <title>HTML5 App Manifest</title>
        <description>
          &lt;p&gt;We all have our applications and we all want then to be always using the best tools, but most of all, we all want our content to get to everyone.&lt;/p&gt;

&lt;p&gt;That's why we add social sharing functionality, or iox capability so our application can turn into a web app in our phone. However, there are now more and more platforms to deal with, and many more to come. So today I'm going to give you a little snippet so you can turn your website into a HTML5 app. This way your website will run as a &quot;native app&quot; on the new Firefox OS.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Mozilla's awesome new HTML5-based mobile operating system, Firefox OS, is going to be a game-changer in the mobile app space. No more needing to write &quot;native&quot; code for each device, no more reliance on PhoneGap to be a first-class device language. Better yet, essentially all you need to do to make your existing website or web app a Firefox OS app is add a manifest.webapp file to your domain which looks similar to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; {
    &quot;version&quot;: &quot;1.0&quot;,
    &quot;name&quot;: &quot;Your App Name&quot;,
    &quot;description&quot;: &quot;Your new awesome HTML5-based mobile web app!&quot;,
    &quot;launch_path&quot;: &quot;/index.html&quot;,
    &quot;icons&quot;: {
        &quot;16&quot;: &quot;/img/mylogo-16.png&quot;,
        &quot;48&quot;: &quot;/img/mylogo-48.png&quot;,
        &quot;128&quot;: &quot;/img/mylogo-128.png&quot;
    },
    &quot;developer&quot;: {
        &quot;name&quot;: &quot;Developer Name&quot;,
        &quot;url&quot;: &quot;http://yourawesomeapp.com&quot;
    },
    &quot;installs_allowed_from&quot;: [&quot;*&quot;],
    &quot;locales&quot;: {
        &quot;pt&quot;: {
            &quot;description&quot;: &quot;A minha nova app&quot;,
            &quot;developer&quot;: {
                &quot;url&quot;: &quot;http://yourawesomeapp.com&quot;
            }
        },
        &quot;en&quot;: {
            &quot;description&quot;: &quot;My new web app&quot;,
            &quot;developer&quot;: {
                &quot;url&quot;: &quot;http://yourawesomeapp.com&quot;
            }
        }
    },
    &quot;default_locale&quot;: &quot;en&quot;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It really can't get any easier! To guard yourself against problem when your app is used offline, be sure to include the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/HTML/Using_the_application_cache&quot;&gt;HTML standard appcache&lt;/a&gt; too!&lt;/p&gt;

&lt;p&gt;This article it's a part of a series of small articles showing how to make your website more mobile compatible.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/html5-app-manifest</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/html5-app-manifest</guid>
        <pubDate>Tue, 10 Sep 2013 07:53:00 +0000</pubDate>
      </item>
          <item>
        <title>A sad day for PHP</title>
        <description>
          &lt;p&gt;Last week I read one of those articles that you never want to read. Anthony Ferrara also known as &lt;a href=&quot;http://twitter.com/ircmaxell&quot;&gt;@ircmaxell&lt;/a&gt; on twitter left the Internals project.&lt;/p&gt;

&lt;p&gt;I got to say, I never participated on the Internals discussions, I actually don't think I have the know-how to. So I preffer to leave that to the experts and not be the annoying noob in the room.&lt;/p&gt;

&lt;p&gt;Anthony wrote a complete blog post explaining why he did what he did, and I got to say: after reading the post, I'm amazed by the time he did stay there.&lt;/p&gt;

&lt;p&gt;So, if you're a PHP developer go read his article and give him your support on twitter.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.ircmaxell.com/2013/09/rambling-on-internals.html&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/ircmaxell&quot;&gt;&lt;i class=&quot;icon-twitter&quot;&gt;&lt;/i&gt; @ircmaxell&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/a-sad-day-for-php</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/a-sad-day-for-php</guid>
        <pubDate>Sun, 08 Sep 2013 10:02:00 +0000</pubDate>
      </item>
          <item>
        <title>Le.git</title>
        <description>
          &lt;p&gt;I'm a big git flow fan, no doubt about that. I use it every day and I still think that it is the perfect way to work with a team of people. But, from time to time, you find yourself working on a small project. One that you're just going to hack during the weekend and you want something simpler.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.git-legit.org/&quot;&gt;Legit&lt;/a&gt; (Git workflow for humans) got you covered.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Basically it works like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git sync
# Synchronizes current branch. Auto-merge/rebase, un/stash.

$ git switch &amp;lt;branch&amp;gt;
# Switches to branch. Stashes and restores unstaged changes.

$ git publish &amp;lt;branch&amp;gt;
# Publishes branch to remote server.

$ git unpublish &amp;lt;branch&amp;gt;
# Removes branch from remote server.

$ git branches
# Nice &amp;amp; pretty list of branches + publication status.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See how easy it to work with a feature branch?&lt;/p&gt;

&lt;p&gt;Now let's say you want to install it and start using it, if you use &lt;a href=&quot;http://brew.sh/&quot;&gt;homebrew&lt;/a&gt; like myself then once again I got you covered.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ brew install legit
To enable the git aliases:

$ legit install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nice and simple — the way it should be.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/le.git</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/le.git</guid>
        <pubDate>Sat, 07 Sep 2013 15:33:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon EU (V)</title>
        <description>
          &lt;p&gt;The last day of Laracon was amazing. I must say, I learned a lot. The talks were amazing. All of them, but there was one that I need to reference in particular. Kapil Verma's talk.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Kapil is a software engineer that specializes in application architecture design. He has significant experience in designing software that is able to quickly react to vague and constantly evolving business requirements. He is currently involved as a project-manager, consultant and developer at multiple startups in Delhi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Engineering Complex Applications with Laravel 4&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;One of Laravel's core strengths is that it grows with the developer. In this talk we focus on what exactly that means. How can we improve our application architectures past what developers have come to expect from MVC frameworks? We'll explore strategies for code organization, modeling your domain and creating code that is loosely coupled and easy to maintain, all done with examples based on real-world experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was so confused during this talk and I think I was not alone on this wagon. A lot of people seemed confused at the time. The talk had one main problem: Kapil didn't had much time to explain is point.&lt;/p&gt;

&lt;p&gt;Hence, he didn't had much time to explain the problem, and jumped right to the solution. So when he was doing so, many people at the audience were struggling with it.&lt;/p&gt;

&lt;p&gt;In conclusion I just think Kapil is miles away from my skill set, and many other developers at the audience.&lt;/p&gt;

&lt;p&gt;However we had some other interesting talks during that day, like the one from &lt;strong&gt;Ross Tuck&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ross Tuck is an American developer, living in the Netherlands, working at Ibuildings, wearing a hat, and wishing he was reading a book.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;HTTP and Your Angry Dog&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is an etag, exactly? What's all that stuff in the Accept header? And what the heck does a Vary header do anyways?! Web developers use HTTP everyday but most of us don't know how to get the most out of it. This talk goes past memorizing status codes (although we'll see those too) and teaches how to get the most out of every request and response.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He was probably the speaker that did more homework there, because his talk was really well prepared. Everything about it was thought before hand. He always knew what to say and when to say it, not a single - hummm, errrrr.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon-(v)</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon-(v)</guid>
        <pubDate>Thu, 05 Sep 2013 12:37:00 +0000</pubDate>
      </item>
          <item>
        <title>Internet.org is awesome, but...</title>
        <description>
          &lt;p&gt;Apparently Facebook has a new pet. It's called &lt;em&gt;The Internet&lt;/em&gt;. The project has actually some good points.&lt;/p&gt;

&lt;p&gt;Internet.org is a global partnership between technology leaders, nonprofits, local communities and experts who are working together to bring the internet to the two thirds of the world’s population that doesn’t have it.&lt;/p&gt;

&lt;p&gt;It all sounds really good. Until...&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/interenet.org.png&quot; alt=&quot;Internet.org&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;You can see the video &lt;strong&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=NdWaZkvAJfM&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;I saw their video campaign, and that got me a bit mad. Call me closed minded or even lunatic, I don't care. But that video showed the armpits of the world. I know they're trying to do a good thing. But shouldn't we be more worried about getting food or... I don't know: electricity and drinkable water instead of lolcats?&lt;/p&gt;

&lt;p&gt;I know the Internet is way more than lolcats, there's also porn.&lt;/p&gt;

&lt;p&gt;We know for a fact that this is true:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&quot;The internet boosts economic, social and political development, and contributes to the progress of humankind as a whole.”&lt;/p&gt;
  
  &lt;p&gt;&lt;span style=&quot;text-align: right;&quot;&gt;&lt;small&gt;—United Nations Human Rights Council report&lt;/small&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All I'm saying is that this is a good thing, but maybe we ought focus on more important things.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&quot;Making the internet available to every person on earth is a goal too large and too important for any one company, group, or government to solve alone. Internet.org’s partners have come together to meet this challenge because they believe in the power of a connected world.&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another great point, but I think I can see who's going to benefit from this first. Let's just take a look at the partners.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Ericsson&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Mediatek&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Opera Software&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Samsung&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; facebook&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Nokia&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Qualcomm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyway, don't take this the wrong way. Again, I think this is a good thing, but… priorities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ps:&lt;/strong&gt; I found this &lt;a href=&quot;https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash3/q71/574517_364119343690702_1948436063_n.jpg&quot;&gt;image&lt;/a&gt; while I was browsing stuff for this article that can sum everything I'm trying to say.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://internet.org/&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; internet.org&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/internet.org</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/internet.org</guid>
        <pubDate>Mon, 02 Sep 2013 12:47:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon EU (IV)</title>
        <description>
          &lt;p&gt;The second day had some really good talks. However there's one that want to talk for a bit.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ben Corlett is the lead engineer at Cartalyst, Director of Webcomm and developer for Kapture. His days typically involve a mix of developing the hottest Composer-based PHP packages and applying the theoretical use of the newest technologies, frameworks and code in real-world scenarios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!--more--&gt;

&lt;p&gt;Once again the subject was all about composer. But this time it was more about how to build new packages, good practices and whatnot.&lt;/p&gt;

&lt;p&gt;One of the things that composer tries to achieve is cross framework code. To achive this you have to follow on simple rule:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your code &lt;strong&gt;must&lt;/strong&gt; be framework agnostic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is quite easy to understand. Makes no sense to build Laravel libraries, or Codeigniter libraries. We should be all building packages that can be used by any framework.&lt;/p&gt;

&lt;p&gt;One other point that Ben talked a lot was how do you go about making a decision to make a new package. He even made a graph and all.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/marcogmonteiro/status/373756031899549697&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt;  The Graph&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/ben_corlett&quot;&gt;&lt;i class=&quot;icon-twitter&quot;&gt;&lt;/i&gt; Ben's Twitter&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon-eu-(iv)</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon-eu-(iv)</guid>
        <pubDate>Sat, 31 Aug 2013 14:45:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon EU (III)</title>
        <description>
          &lt;p&gt;At the end of the first day the legend Fabien Potencier took the stage. If you don't know who he is, he's a developer by passion, he started to build websites with PHP5 in 2004 and created the Symfony framework to help SensioLabs, his company, leverage the power of PHP for its customers.&lt;/p&gt;

&lt;p&gt;As expected his talk was all about Symfony.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Symfony is all about standardization and interoperability. The Symfony foundation is largely based on existing standards like HTTP, but it also leverages existing best-practices and design patterns like dependency injection. Learn more about the fundamental philosophy of Symfony and why embracing these core concepts is good for PHP as a whole.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After all the talk about standardization there was a really interesting Q&amp;amp;A. Mostly about general PHP stuff and some decisions and the Symfony roadmap.&lt;/p&gt;

&lt;p&gt;This is how great Laracon EU is, we're here not just to talk about Laravel. Mostly we're were to talk about PHP in general. Actually I talked to a lot of people and most don't even use Laravel that much. But we all love it and learn from it.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon-eu-3</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon-eu-3</guid>
        <pubDate>Sat, 31 Aug 2013 09:39:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon EU (II)</title>
        <description>
          &lt;p&gt;On the second part of the first day, Jordi Boggiano took the stage. Jordi is a lead developer of Composer, the PHP dependency manager that has taken the PHP world by storm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In-Depth with Composer&lt;/strong&gt; was the name of his talk.&lt;/p&gt;

&lt;p&gt;So as expected his talk was all about composer. As you can see in his talk &lt;a href=&quot;http://joind.in/9028&quot;&gt;here&lt;/a&gt; it was mostly about tricks and tips about it.&lt;/p&gt;

&lt;p&gt;One of the best quotes so far from his talk was probably this one:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It's cool to be bleeding edge, but it's bleeding for a reason.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I couldn't agree more. People should be careful while using beeding edge tecnology. Specially with composer packages.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://slides.seld.be/?file=2013-08-30+In-Depth+with+Composer.html#1&quot;&gt;&lt;i class=&quot;icon-paper-clip&quot;&gt;&lt;/i&gt; icon Jordi's Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/seldaek&quot;&gt;&lt;i class=&quot;icon-twitter&quot;&gt;&lt;/i&gt; Jordi's Twitter&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon-eu-(2)</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon-eu-(2)</guid>
        <pubDate>Fri, 30 Aug 2013 14:40:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon EU (I)</title>
        <description>
          &lt;p&gt;We gathered at the beautiful Bimhuis. After we all got our credentials and whatnot ready it was time to start.&lt;/p&gt;

&lt;p&gt;Phill Sparks Opened the conference with a really good talk about Software Design Patterns in Laravel 4. He's a member of the Laravel Core Team with shared responsibility for community engagement and support. Throughout the talk the showed many examples on those Patterns and how they are used inside Laravel. That was pretty cool.&lt;/p&gt;

&lt;p&gt;Then Jeffrey Way took the stage with his talk about Laravel Testing Tips, Techniques and Pitfalls. The talk wasn't that much about Laravel, but more about testing in general and how to use it in the real world. But most of all he talked on how to get into it and get started. He had loads of examples.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Right now, Taylor Otwell is doing a small Q&amp;amp;A about Laravel and general development actually.&lt;/p&gt;

&lt;p&gt;I'm pretty sure all the talks will be avaiable soon.&lt;/p&gt;

&lt;p&gt;If want to know in real time what's happenng you can use this twitter feed.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/search?q=%23laraconeu&amp;amp;src=savs&quot;&gt;Twitter Feed&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon-eu-1</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon-eu-1</guid>
        <pubDate>Fri, 30 Aug 2013 13:29:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon, are you excited?</title>
        <description>
          &lt;p&gt;Oh my, did you noticed that Laracon is right around the corner? That's right, next week I'll be traveling to Amsterdam for a small geek gathering.&lt;/p&gt;

&lt;p&gt;I look forward to check out the city, that's why I'm going to stay there for a couple extra days. Also I'll be with some of the people that went with me to Ciconf last year. But, most of all I can't wait to met new people. People that I talk almost every week on twitter or IRC and the ones that I don't even know about.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/laracon.png&quot; alt=&quot;The venue&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;Bimhuis is one of the most beautiful and intimate venues in Amsterdam. &lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;There's always that awkward feeling when you put a face on a avatar. But you know what the best part is? Going to conferences like this one, even if you're a guru that wrongly thinks that has nothing to learn, you always do.&lt;/p&gt;

&lt;p&gt;I look forward to learn with you.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon,-are-you-excited</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon,-are-you-excited</guid>
        <pubDate>Sun, 25 Aug 2013 00:00:00 +0000</pubDate>
      </item>
          <item>
        <title>Pixel density of 538ppi?</title>
        <description>
          &lt;p&gt;Full HD displays? Eat your heart out, handset manufacturers. LG Display has just laid claim to the world's first Quad HD (2,560 x 1,440) smartphone display, which also boasts the highest pixel density of a mobile device, clocking in at 538ppi.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/lgd-qhd-panel.jpg&quot; alt=&quot;LG QHD panel&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;world's first with 2,560 x 1,440 LCD for smartphones&lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Do you even know what this means for developers, specially front-end developers that do a lot of responsive webdesign? This means that a little device like that has more pixels than most 27&quot; displays! So we're heading towards huge images for phones and normal ones for desktops... This. Is. Insane.&lt;/p&gt;

&lt;p&gt;Apple's retina displays is 326ppi and we already have enough trouble with it. This is almost double the size. The web will look awful using this LG screen.&lt;/p&gt;

&lt;p&gt;Just saying.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/pixel-density-of-538ppi</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/pixel-density-of-538ppi</guid>
        <pubDate>Wed, 21 Aug 2013 18:07:00 +0000</pubDate>
      </item>
          <item>
        <title>The CH experience</title>
        <description>
          &lt;p&gt;Earlier this year I got out of the previous company I was working for. My plan was simple. Earn enough money to live on my own as a freelancer.&lt;/p&gt;

&lt;p&gt;However things didn't go exactly as expected. Mainly because living as a freelancer in Portugal sucks. Almost all the companies are in the toilet hence you only get paid when they can and not when you should.&lt;/p&gt;

&lt;p&gt;So I decided to try the market again and go after another full time job. I only had two requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Work for a small company&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Don't have to move to another city&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;!--more--&gt;
I got my resume ready (as in export my profile from linkedin) and sent it to Grupo CH because one of the companies there was hiring. Did the whole interview thing. Twice. One with human resources, and the second with the CEO.&lt;/p&gt;

&lt;p&gt;Got the job. Moved to another city and within a week I was working for a company with 75-100 people.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Well I guess my two requirements went out the window then.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was afraid at the time. My main concerns were that the group was just &quot;too corporate&quot; for me and I wouldn't like it. Because you know, I like to wear shorts and ironic t-shirts to work.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/grupo-ch.jpg&quot; alt=&quot;Grupo CH&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;This is CH in all its glory&lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;All of that disappeared when I started working inside that little corner of the building they call &lt;em&gt;Monstros e companhia&lt;/em&gt; (monsters &amp;amp; cia - The company I'm working for in the group). I love it there. We work hard, but we still find a way to have a good time.&lt;/p&gt;

&lt;p&gt;We live in our own world there. That's the best description I find for my work environment. We are a young and small team of 7-10 people that work mostly for small clients and for the other companies inside our group.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/monstros.jpg&quot; alt=&quot;Monstros &amp;amp; CIA&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;The team&lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;The work stuff is going great. I like what, and how I'm doing things. I live close to the office so I don't spend much time in commutes. I even have time to work on side projects like my blog and freelance stuff. But most of all, I have time to enjoy my new home.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropboxusercontent.com/u/404972/blog/home-view.jpg&quot; alt=&quot;My home view&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;small&gt;The view from the balcony of my new place&lt;/small&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;I get to experiment a lot since I mainly work on my projects alone. So I can choose what tools I'll be using for a specific task, which is great!&lt;/p&gt;

&lt;p&gt;What can I say? The past 6 months have been great. Lots of new friends and experiences.&lt;/p&gt;

&lt;p&gt;And yes, I'm going to start blogging more about &quot;work related stuff&quot;.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/the-ch-experience</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/the-ch-experience</guid>
        <pubDate>Mon, 19 Aug 2013 18:56:00 +0000</pubDate>
      </item>
          <item>
        <title>Wardrobe a minimal blogging application</title>
        <description>
          &lt;p&gt;As you may or may not know last week I migrated all my content from tumblr into this new cms called Wardrobe. For now I'm really happy with it. It gives me total control over my content and it doesn't have all those features that most blogging platforms have. Features that I never needed in the first place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Wardrobe anyway?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wardrobe is a minimalistic blogging application. Wardrobe attempts to make blogging simple and enjoyable by utilizing the latest technologies and keeping the administration as simple as possible with the primary focus on writing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;What are the main features of this minimalistic blogging application?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Markdown&lt;/strong&gt; - All content is stored as markdown so its portable and easy to move in and out.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Schedule Posts&lt;/strong&gt; - Write posts and schedule the time and date you want them to appear.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Post Tagging&lt;/strong&gt; - Wardrobe allows you to tag posts for categorization and for grouping.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Drag &amp;amp; Drop&lt;/strong&gt; - Prefer to write in a native app? With Wardrobe you can drag and drop markdown files into the admin to create posts&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Simple Theming&lt;/strong&gt; - Wardrobe utilizes a simple but powerful theming system so almost any design can be integrated.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;Powerful Routing&lt;/strong&gt; - Themes have the power to over ride routes and also create completely new custom ones.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ericbarnes/wardrobe&quot;&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://wardrobecms.com/&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; Wardrobecms&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/wardrobe-a-minimal-blogging-application.</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/wardrobe-a-minimal-blogging-application.</guid>
        <pubDate>Thu, 15 Aug 2013 12:00:00 +0000</pubDate>
      </item>
          <item>
        <title>PuPHPet</title>
        <description>
          &lt;p&gt;PuPHPet is a simple GUI to set up virtual machines for PHP development.&lt;/p&gt;

&lt;p&gt;This is a gui configurator for the &lt;a href=&quot;http://vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt; automation tool. It uses &lt;a href=&quot;http://puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt; as the provisioning backend.
This is similar to another tool that recently came out, &lt;a href=&quot;http://rove.io/&quot;&gt;Rove.io&lt;/a&gt;, although that one is more focused on using Vagrant with Chef, and has different configuration options.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/puphpet/puphpet/&quot;&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://puphpet.com/&quot;&gt;&lt;i class=&quot;icon-external-link&quot;&gt;&lt;/i&gt; PuPHPet&lt;/a&gt;&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/puphpet</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/puphpet</guid>
        <pubDate>Tue, 13 Aug 2013 14:40:00 +0000</pubDate>
      </item>
          <item>
        <title>A new face</title>
        <description>
          &lt;p&gt;My tumblr experience ended. It was good while it lasted but we had to part ways. You changed the way people manage and write their posts and I didn't like that one bit.&lt;/p&gt;

&lt;p&gt;Then I found this &quot;little&quot; project called &lt;a href=&quot;http://wardrobecms.com/&quot;&gt;Wardrobe&lt;/a&gt; built in Laravel 4 and I was in-love. Editor in markdown and a base templates focussed on the reading experience. 
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Took me one literally one days work to migrate all my articles and comments. First I used the &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;jekyllrb&lt;/a&gt; plugin to export all my articles from tumblr. Then I imported everything into wardrobe in no time. The comments was the worst part, I had to change all the slugs to match them. After that I was good to go.&lt;/p&gt;

&lt;p&gt;Couple of changes to the template and BAM I got myself a blog platform.&lt;/p&gt;

&lt;p&gt;Best part is that since it's built in Laravel 4 I can now play around with it and add more functionality to it.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/a-new-face</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/a-new-face</guid>
        <pubDate>Fri, 09 Aug 2013 17:07:00 +0000</pubDate>
      </item>
          <item>
        <title>The creative badge</title>
        <description>
          &lt;p&gt;I’ve been working in the creative business for a while now, and being around people that need to be creative for a living can have it’s advantages, and disadvantages.&lt;/p&gt;

&lt;p&gt;In one hand if you work with really good creatives you tend to be blown away by their ideas. On the other hand, you have to deal with the creative badges that they so proudly use. The “I’m so damn busy badge”.
&lt;!--more--&gt;
Or, the other good one called, “I have so much stuff to do!” badge.&lt;/p&gt;

&lt;p&gt;It’s a fact. Creative people - like designers and such - always like to brag about having so much stuff to do, and most of all saying that they don’t even have time to sleep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So here’s my view on these so called badges.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creative folks, get your shit together, if you have too much stuff to do, or don’t even have time to sleep that can only mean one of three things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; You’re not productive.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; You don’t know how to manage your own time. &lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; You don’t know how to say the word no.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work alone and suffer from one of these, I would say that’s ok. It’s your problem after all. However, when you work as a team, working with people that suffer from these diseases can be frustrating.&lt;/p&gt;

&lt;p&gt;I think the second and the third are the main problems. The first one is actually more of an effect from those two. So let’s review those.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don’t know how to manage your own time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My guess is that you normally don’t divide your time in tasks. You don’t know how much time you’ll need to deliver a product, and the worst problem of it all, you don’t respect deadlines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don’t know how to say no&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s the thing, everyone has to say no some time. If you don’t have time to do something get some help. Don’t say that you’ll going to deliver everything by yourself when you know you can’t. You’ll end up making a lazy job or even worst not delivering at all.&lt;/p&gt;

&lt;p&gt;People! Stop using these badges proudly. You should be ashamed if you use them.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/the-creative-badge</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/the-creative-badge</guid>
        <pubDate>Wed, 31 Jul 2013 00:00:00 +0000</pubDate>
      </item>
          <item>
        <title>Laracon here I come!</title>
        <description>
          &lt;p&gt;That’s right, I just won a VIP ticket to Laracon. I’m not going to lie - it would be hard for me to go without this. Being a portuguese developer is not that easy these days.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;I have almost everything sorted, just need to finish some final arrangements with hostel and I’m on my way.&lt;/p&gt;

&lt;p&gt;Its going to be amazing I tell you. I’m going to be with a lot of the people I met during CIConf last year, and a lot of new people.&lt;/p&gt;

&lt;p&gt;The line up for the event is awesome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Couple of things that I can tell you now about this trip.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Expect drunk tweets&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Expect some blogging during the events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re going to be in the conference or are just in Amsterdam during that time and want to say hello, just let me know, both here or twitter, whatever works for you.&lt;/p&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/laracon-here-i-come!</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/laracon-here-i-come!</guid>
        <pubDate>Tue, 16 Jul 2013 00:00:00 +0000</pubDate>
      </item>
          <item>
        <title>Hands-on Testing with PHPUnit - review</title>
        <description>
          &lt;p&gt;One of the things that is actually starting to matter in our PHP world is testing. THe PHP community disregarded this for far too long. However, more modern frameworks took this issue seriously and the community responded well.&lt;/p&gt;

&lt;p&gt;PHPUnit is a testing framework that is supported, integrated and suggested by the majority of PHP frameworks. Test Driven Development (TDD), and Continuous Integration are here to stay and PHPUnit is an industry standard that caters for both.
&lt;!--more--&gt;
&lt;strong&gt;Things I liked about the book:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The book is short, but it takes the reader from easy examples to something that is far more complex than the normal tests you may find on the interwebs.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; The amount of real life examples and not just theoretical ones.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; Great book if you’re just starting with testing in PHP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thinks you may want to consider before buying this book&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; This is not a manual on how to use PHPUnit.&lt;/li&gt;
&lt;li&gt;&lt;i class=&quot;icon-angle-right&quot;&gt;&lt;/i&gt; If you already have an intermediate experience with testing this book might not be the best one for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall the book is great and it accomplishes quite well it’s purpose - getting people started with phpUnit. So if that’s your case you should definitely give it a go.&lt;/p&gt;

&lt;p&gt;You can find the book at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.packtpub.com/how-to-hands-on-testing-with-phpunit/book&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Packt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/dp/178216958X/?tag=packtpubli-20&quot;&gt;&lt;i class=&quot;icon-link&quot;&gt;&lt;/i&gt; Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
        </description>
        <link>https://blog.marcomonteiro.net/post/hands-on-testing-with-phpunit-review</link>
        <guid isPermaLink="true">https://blog.marcomonteiro.net/post/hands-on-testing-with-phpunit-review</guid>
        <pubDate>Wed, 26 Jun 2013 00:00:00 +0000</pubDate>
      </item>
      </channel>
</rss>