<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Robert Basic, software developer making web applications better</title>
    <link>https://robertbasic.com/</link>
    <description>Recent content on Robert Basic, software developer making web applications better</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 21 Dec 2020 07:55:36 +0100</lastBuildDate>
    
	<atom:link href="https://robertbasic.com/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Why I didn&#39;t launch a year ago?</title>
      <link>https://robertbasic.com/blog/why-i-didnt-launch-a-year-ago/</link>
      <pubDate>Mon, 21 Dec 2020 07:55:36 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/why-i-didnt-launch-a-year-ago/</guid>
      <description>Two years ago I started working on a side project. It&amp;rsquo;s a glorified to-do application, so a fully working version shouldn&amp;rsquo;t have taken me more than 3 days of focused work. Yet, 2 years, and more than 350 commits later, I still didn&amp;rsquo;t &amp;ldquo;finish&amp;rdquo; it. I was close to launching a year ago. I could&amp;rsquo;ve launched a week ago.
Yet, I still didn&amp;rsquo;t do it.
As someone who specializes in working with legacy applications, it kinda always bothered me that I never had one of my own ideas developed from start to finish.</description>
    </item>
    
    <item>
      <title>Dealing with bit rot in a side project</title>
      <link>https://robertbasic.com/blog/dealing-with-bit-rot-in-a-side-project/</link>
      <pubDate>Mon, 14 Dec 2020 21:27:26 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/dealing-with-bit-rot-in-a-side-project/</guid>
      <description>As I wrote earlier, I&amp;rsquo;m &amp;ldquo;reviving&amp;rdquo; a personal project that I didn&amp;rsquo;t touch for a year. The development environment is dockerized, so the first task I need to do is to run the application it see what happens. As it turns out not much happens, as a mild case of &amp;ldquo;bit rot&amp;rdquo; set in.
Bringing up the docker environment works just fine, but when I run composer install to install the project dependencies, the process ends with an error:</description>
    </item>
    
    <item>
      <title>Reviving the ForThisWeek project</title>
      <link>https://robertbasic.com/blog/reviving-the-for-this-week-project/</link>
      <pubDate>Sat, 12 Dec 2020 12:50:04 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/reviving-the-for-this-week-project/</guid>
      <description>Way back in the summer of 2018 I&amp;rsquo;ve started a project called &amp;ldquo;ForThisWeek&amp;rdquo;. It&amp;rsquo;s nothing more than a glorified to-do application. I&amp;rsquo;ve used it mainly to learn more about some of the Domain-Driven Design concepts. Looking at the commit history, I&amp;rsquo;ve worked on it in the summer of 2018, then from November 2018 till May 2019, and then again from November 2019 till mid December 2019. Apparently I&amp;rsquo;ve put a decent amount of work in it, so if I want to have a side project live, this one&amp;rsquo;s a good candidate.</description>
    </item>
    
    <item>
      <title>Setting up a custom 404 page</title>
      <link>https://robertbasic.com/blog/setting-up-a-custom-404-page/</link>
      <pubDate>Sat, 12 Dec 2020 06:28:40 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/setting-up-a-custom-404-page/</guid>
      <description>The other day I realized that I don&amp;rsquo;t have a custom 404 page up. Whenever someone requests a page that does not exist, nginx serves its custom 404 page. It&amp;rsquo;s functional, tells the user what happened, but apart from that it&amp;rsquo;s not really helpful.
Looking at the Hugo theme for my blog, there is a 404.html template there, but it&amp;rsquo;s not used. When running the development server for Hugo and navigating to a non-existent page, it serves Hugo&amp;rsquo;s deafult 404 page, not the one I have in the template.</description>
    </item>
    
    <item>
      <title>Turn a new leaf on a legacy project</title>
      <link>https://robertbasic.com/blog/turn-a-new-leaf-on-a-legacy-project/</link>
      <pubDate>Thu, 12 Nov 2020 06:33:39 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/turn-a-new-leaf-on-a-legacy-project/</guid>
      <description>Working on a legacy project can be a chore. Fighting the same old problems over and over again, adding new features takes ages, seems like every time we fix one bug, we uncover three others. Sounds like wishful thinking, but I know it can be better.
It takes time though. If we neglect a codebase for years, we can’t make it into a spotless example of computer science in two sprints.</description>
    </item>
    
    <item>
      <title>Discovery notes</title>
      <link>https://robertbasic.com/blog/discovery-notes/</link>
      <pubDate>Mon, 19 Oct 2020 06:04:44 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/discovery-notes/</guid>
      <description>Starting to work on an existing application, on a code base that exists since the beginning of the times, can be daunting. Complicated and complex features, new terms, most likely non-existing documentation, or documentation that is out of date. All that can seem too much. One thing that has always helped me is keeping notes of what I discover over time working with a legacy codebase. &amp;ldquo;Discovery notes&amp;rdquo; if you will.</description>
    </item>
    
    <item>
      <title>Toggle a VPN connection</title>
      <link>https://robertbasic.com/blog/toggle-a-vpn-connection/</link>
      <pubDate>Fri, 06 Mar 2020 17:14:59 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/toggle-a-vpn-connection/</guid>
      <description>At work I often have to turn a VPN connection on and off. Clicking through the network manager, finding the right VPN connection, connect to it&amp;hellip; Feels like a waste of time, no? There has to be a better way. And there is :)
It uses the nmcli command line tool that comes with the Network Manager on Ubuntu:
toggle-vpn.sh #! /bin/bash  VPN=$1 if [ -z &amp;#34;$VPN&amp;#34; ] then exit 1 fi ACTIVE=`nmcli con show --active | grep &amp;#34;$VPN&amp;#34;` if [ -z &amp;#34;$ACTIVE&amp;#34; ] then nmcli con up id &amp;#34;$VPN&amp;#34; else nmcli con down id &amp;#34;$VPN&amp;#34; fi exit 0 We pass it one argument, the name (ID) of the VPN connection.</description>
    </item>
    
    <item>
      <title>Compare files across branches</title>
      <link>https://robertbasic.com/blog/compare-files-across-branches/</link>
      <pubDate>Tue, 21 Jan 2020 11:20:37 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/compare-files-across-branches/</guid>
      <description>After some bigger rebases in git, I have to compare a file between two branches, most often master and the current branch.
git diff master my-branch -- file/to/diff The diff will show what was added to the file in my-branch, as well what was removed. Helps a lot with fixing conflicts during rebases gone bad.
Happy hackin&amp;rsquo;!</description>
    </item>
    
    <item>
      <title>Split screen panes</title>
      <link>https://robertbasic.com/blog/split-screen-panes/</link>
      <pubDate>Fri, 17 Jan 2020 14:18:05 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/split-screen-panes/</guid>
      <description>I&amp;rsquo;ve been using screen a lot more recently, but not enough to have all the commands in muscle memory. Writing down a quick cheat-sheet for working with split panes/windows.
To split a screen pane horizontally: Ctrl+a Shift+s.
To split a screen pane vertically: Ctrl+a Shift+\.
To move between panes: Ctrl+a Ctrl+Tab.
To start a new command line in a pane: Ctrl+a Ctrl+c.
To close the focused pane: Ctrl+a Shift+x.
Save the layout of the panes with: Ctrl+a : and then type layout save name-of-your-layout.</description>
    </item>
    
    <item>
      <title>A refactoring example</title>
      <link>https://robertbasic.com/blog/a-refactoring-example/</link>
      <pubDate>Mon, 13 Jan 2020 09:38:18 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/a-refactoring-example/</guid>
      <description>I&amp;rsquo;m working on a small side project to gather stats about my blog. Posts published, words written, number of code examples. Good for practicing TDD. I want to share how I made one part of it better.
This part is a post collector that goes through a folder and collects post files. The first version of the PostCollector iterates over a path with DirectoryIterator. It finds all markdown files and creates a Post from them:</description>
    </item>
    
    <item>
      <title>Attach to an already attached screen</title>
      <link>https://robertbasic.com/blog/attach-to-an-already-attached-screen/</link>
      <pubDate>Thu, 09 Jan 2020 12:46:28 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/attach-to-an-already-attached-screen/</guid>
      <description>Today I ran into a strange error with screen. I was working on a remote server, executing commands in screen when my connection got dropped. I reconnected, wanted to reattach to my screen session with the usual -r option:
screen -r foo But this greeted me with an error of:
There is a screen on: 7608.foo	(Attached) There is no screen to be resumed matching foo. screen -ls confirms there is a screen session for &amp;ldquo;foo&amp;rdquo;.</description>
    </item>
    
    <item>
      <title>Delete lines containing a pattern in vim</title>
      <link>https://robertbasic.com/blog/delete-lines-containing-a-pattern-in-vim/</link>
      <pubDate>Wed, 08 Jan 2020 12:46:23 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/delete-lines-containing-a-pattern-in-vim/</guid>
      <description>Today I had to delete all lines from a CSV file where the last column has a 1:
:g/1$/dWhile short, I can&amp;rsquo;t remember this syntax as I have to search for it every time. I&amp;rsquo;ll try to remember this as &amp;ldquo;grep for a pattern, and delete&amp;rdquo; for next time.
Happy hackin&amp;rsquo;!</description>
    </item>
    
    <item>
      <title>Don&#39;t use the class under test to create the expected result</title>
      <link>https://robertbasic.com/blog/do-not-use-the-class-under-test-to-create-the-expected-result/</link>
      <pubDate>Wed, 08 Jan 2020 09:52:44 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/do-not-use-the-class-under-test-to-create-the-expected-result/</guid>
      <description>From time to time I come across a mistake in unit tests that makes them useless. The mistake is that we use the class and method that we are testing to create the expected result of the test:
BadTest.php &amp;lt;?php declare(strict_types=1); class BadTest extends TestCase { public function testThatPasswordIsHashed(): void { $hasher = new PasswordHasher(); $actualResult = $hasher-&amp;gt;hash(&amp;#39;super secret&amp;#39;); $expectedResult = $hasher-&amp;gt;hash(&amp;#39;super secret&amp;#39;); $this-&amp;gt;assertSame($expectedResult, $actualResult); } } If we were to break the behavior of the hash method, the test would pass.</description>
    </item>
    
    <item>
      <title>Making it easier to blog</title>
      <link>https://robertbasic.com/blog/making-it-easier-to-blog/</link>
      <pubDate>Fri, 03 Jan 2020 09:40:58 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/making-it-easier-to-blog/</guid>
      <description>2019 was a not so great year for my blogging. 7 posts in total. There are multiple reasons for that, all the regular stuff like &amp;ldquo;I didn&amp;rsquo;t find the time&amp;rdquo; and &amp;ldquo;Nothing to blog about&amp;rdquo;.
Currently I&amp;rsquo;m reading Atomic habits (great book by the way, do read it if you haven&amp;rsquo;t!), and one of the suggestions for starting a new habit is to make it easy to do it. So, here we are.</description>
    </item>
    
    <item>
      <title>Filter git diff by type of change</title>
      <link>https://robertbasic.com/blog/filter-git-diff-by-type-of-change/</link>
      <pubDate>Thu, 02 Jan 2020 14:23:03 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/filter-git-diff-by-type-of-change/</guid>
      <description>Yesterday I was looking at a rather large diff, but for the type of change I was after, I wanted to look only at the newly added files. Turns out, git diff has a filtering option with --diff-filter.
The possible values for the --diff-filter are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), type changed (T), Unmerged (U), Unknown (X), and some kind of a Broken (B) file(?).</description>
    </item>
    
    <item>
      <title>Unit tests in legacy code</title>
      <link>https://robertbasic.com/blog/unit-tests-in-legacy-code/</link>
      <pubDate>Fri, 22 Nov 2019 09:31:42 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/unit-tests-in-legacy-code/</guid>
      <description>Legacy code has many definitions. It is code without tests. It is code written by someone else. It is code written X time ago. It is obsolete code that is difficult to replace with newer code. It is code that has no documentation. It is all of these things.
Besides that, I like to think of legacy code as code that is actively used by clients and brings in value. If it&amp;rsquo;s not used by others then it can&amp;rsquo;t bring in value, and if it does not bring in value then working on that code is just a waste of time and money.</description>
    </item>
    
    <item>
      <title>PhpStorm previous version settings not imported</title>
      <link>https://robertbasic.com/blog/phpstorm-previous-version-settings-not-imported/</link>
      <pubDate>Fri, 29 Mar 2019 06:06:04 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/phpstorm-previous-version-settings-not-imported/</guid>
      <description>PhpStorm 2019.1 was released yesterday. During the first run after the upgrade PhpStorm usually asks from what previous version would I like to import the settings from, but this time it didn&amp;rsquo;t ask that. It rather imported some of my old settings, but not the latest ones I had for 2018.3.
I&amp;rsquo;ve tried to import old settings from the &amp;ldquo;Import settings&amp;rdquo; menu, but whatever version I chose, it said something about &amp;ldquo;can&amp;rsquo;t find settings.</description>
    </item>
    
    <item>
      <title>Use git reflog to split two squashed commits</title>
      <link>https://robertbasic.com/blog/use-git-reflog-to-split-two-squashed-commits/</link>
      <pubDate>Fri, 08 Feb 2019 18:20:25 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/use-git-reflog-to-split-two-squashed-commits/</guid>
      <description>Today I was using interactive git rebase to squash some commits together to clean up the commit history of a git branch. At one point I went a bit overboard with it and squashed together two commits by mistake.
I&amp;rsquo;ve heard somewhere from someone that in git you pretty much can&amp;rsquo;t lose code because everything is in the git reflog. Today I decided to put that to the test.
Spoiler alert: git reflog saved the day.</description>
    </item>
    
    <item>
      <title>Vue.js reusable components</title>
      <link>https://robertbasic.com/blog/vue-js-reusable-components/</link>
      <pubDate>Mon, 04 Feb 2019 08:19:11 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/vue-js-reusable-components/</guid>
      <description>A while ago I started learning bits and pieces about Vue.js by creating a single page application for one of my pet projects that I use to explore Domain-Driven Design. In general I know my way around a Javascript file, but wouldn&amp;rsquo;t call myself an expert with it. In the past I mostly used jquery, some mootools, and even Dojo. Ah, good old Zend Framework 1 times.
While reading up on Vue.</description>
    </item>
    
    <item>
      <title>Accessing Symfony private services in Behat</title>
      <link>https://robertbasic.com/blog/accessing-symfony-private-services-in-behat/</link>
      <pubDate>Fri, 01 Feb 2019 08:26:15 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/accessing-symfony-private-services-in-behat/</guid>
      <description>Since Symfony 3.4 the services in the service container are private by default. While this decision made us write better production code by making us use Dependency Injection more and rely on the service container less, using these services in a test environment proved to be a challenge.
Since Symfony 4.1 there&amp;rsquo;s a special service container in the test environment which allows fetching private services in tests.
In a Behat test this test service container is not available through the static::$container property as it is in a WebTestCase or a KernelTestCase, but it is available under the test.</description>
    </item>
    
    <item>
      <title>Testing Symfony commands with Behat</title>
      <link>https://robertbasic.com/blog/testing-symfony-commands-with-behat/</link>
      <pubDate>Fri, 18 Jan 2019 09:50:22 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/testing-symfony-commands-with-behat/</guid>
      <description>The other day I was creating a Symfony command that will be periodically executed by a cronjob. I decided to write a Behat test for it, to see what a test like that would look like. Plus, just because it is executed by the system from a command line, doesn&amp;rsquo;t mean we can skimp on the business requirements.
We need Symfony, Behat, and Behat Symfony2 extension. In the behat.yml file we configure the Behat extension to boot up the Kernel for us and pass it in is a constructor argument to our Behat Context:</description>
    </item>
    
    <item>
      <title>A lookback on 2018</title>
      <link>https://robertbasic.com/blog/a-lookback-on-2018/</link>
      <pubDate>Tue, 01 Jan 2019 11:17:43 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/a-lookback-on-2018/</guid>
      <description>2018 was a good year. A year of changes.
My wife and I are expecting a baby in March 2019. We bought a house. We traveled. We drank some lovely tea. We read books. We ate great food in good company. We made new friends in a new city.
I changed jobs. I spoke at four conferences, one uncon, and two meetups. I wrote a two part article on Mockery for phparch.</description>
    </item>
    
    <item>
      <title>Ignore Errors in Makefile</title>
      <link>https://robertbasic.com/blog/ignore-errors-in-makefile/</link>
      <pubDate>Mon, 24 Dec 2018 11:27:04 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/ignore-errors-in-makefile/</guid>
      <description>I&amp;rsquo;ve been using Make and Makefiles quite extensively over the past few months in my personal projects. One of the make targets I have is to run Behat tests:
 run Doctrine migrations to create the database, run the Behat tests, run Doctrine migrations to tear down the database.  .PHONY: e2e-tests e2e-tests: docker-compose exec php-fpm /application/bin/console doctrine:migrations:migrate -n -q --env=test docker-compose exec php-fpm /application/vendor/bin/behat --verbose docker-compose exec php-fpm /application/bin/console doctrine:migrations:migrate first -n -q --env=test This works great, but today I ended up chasing a weird data related bug which at first I didn&amp;rsquo;t tie to the Makefile.</description>
    </item>
    
    <item>
      <title>Legacy code is 3rd party code</title>
      <link>https://robertbasic.com/blog/legacy-code-is-3rd-party-code/</link>
      <pubDate>Thu, 19 Jul 2018 06:17:30 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/legacy-code-is-3rd-party-code/</guid>
      <description>Within the TDD community there&amp;rsquo;s an advice saying that we shouldn&amp;rsquo;t mock types we don&amp;rsquo;t own. I believe it is good advice and do my best to follow it. Of course, there are people who say that we shouldn&amp;rsquo;t mock in the first place. Whichever TDD camp you&amp;rsquo;re in I think this &amp;ldquo;don&amp;rsquo;t mock what you don&amp;rsquo;t own&amp;rdquo; advice has an even better advice hidden in it. An advice that people often overlook because they see the word &amp;ldquo;mock&amp;rdquo; in it and go full berserk.</description>
    </item>
    
    <item>
      <title>Easier Mocking With Mockery in php[architect]</title>
      <link>https://robertbasic.com/blog/easier-mocking-with-mockery-in-phparchitect/</link>
      <pubDate>Fri, 20 Apr 2018 10:40:13 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/easier-mocking-with-mockery-in-phparchitect/</guid>
      <description>In early February I got an email from Oscar would I be willing to write an article for php[architect], based on my “Easier mocking with Mockery” talk. It took me maybe 2 seconds to think about it and say “Yes!”. The first part of the article was published in the April’s edition of the magazine. Lots of useful content in there, not just my article!
Initially I was supposed to write a 3000 word article on the subject, but in the end I wrote somewhere around 8000 words.</description>
    </item>
    
    <item>
      <title>Docker containers for PHP with PHPDocker.io</title>
      <link>https://robertbasic.com/blog/docker-containers-for-php-with-phpdocker-io/</link>
      <pubDate>Tue, 27 Mar 2018 10:47:19 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/docker-containers-for-php-with-phpdocker-io/</guid>
      <description>This past weekend I was playing around on some pet projects and wanted to get up and running quickly. My initial reaction was to reach for a Vagrant box provisioned with Ansible. After all, that&amp;rsquo;s what I&amp;rsquo;ve been using for a really long time now.
Recently I&amp;rsquo;ve been also learning a bit more about Docker, so I figured maybe this pet project would be a good project to replace the standard Vagrant set up and go with Docker instead.</description>
    </item>
    
    <item>
      <title>Connecting to MySQL 8</title>
      <link>https://robertbasic.com/blog/connecting-to-mysql-8/</link>
      <pubDate>Sat, 24 Mar 2018 10:45:22 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/connecting-to-mysql-8/</guid>
      <description>I&amp;rsquo;ve used recently PHPDocker.io to generate a set of Docker files for a pet project and it had the option to use MySQL 8 and of course I went with that. The problem was when I wanted to connect to the database that was on this MySQL 8 server.
I had locally installed the MySQL 5.7 client version and when trying to connect to the MySQL 8 server it complained about a missing authentication plugin:</description>
    </item>
    
    <item>
      <title>Bounded contexts and subdomains</title>
      <link>https://robertbasic.com/blog/bounded-contexts-and-subdomains/</link>
      <pubDate>Tue, 20 Mar 2018 08:27:37 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/bounded-contexts-and-subdomains/</guid>
      <description>Back in October last year I wrote that I thought I understood bounded contexts, what they are and why we need them. Ever since realizing that a bounded context is a boundary of how a business sees a specific subject within a section of that business, learning anything and everything DDD became a lot easier.
I see bounded contexts as a big building block without which learning other parts of DDD is pretty much pointless.</description>
    </item>
    
    <item>
      <title>A weekly to-do</title>
      <link>https://robertbasic.com/blog/a-weekly-to-do/</link>
      <pubDate>Thu, 08 Mar 2018 09:30:48 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/a-weekly-to-do/</guid>
      <description>About a year ago I listened to a ThatPodcast episode where Dave and Beau talked about bullet journalling. I found the idea of it appealing, but over the next few months I just couldn&amp;rsquo;t find a bullet journal in any of the (book)stores I went to. As time passed so did my interest in this. After all, I was getting along without such a system just fine. My life isn&amp;rsquo;t that crazy busy, 7-8 hours of sleep, 7-10 hours of work work, and the rest is up for grabs — hanging out with my wife Senka (her name translates to Shadow, how cool is that?</description>
    </item>
    
    <item>
      <title>My OBS setup for recording screencasts</title>
      <link>https://robertbasic.com/blog/my-obs-setup-for-recording-screencasts/</link>
      <pubDate>Wed, 21 Feb 2018 20:56:03 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/my-obs-setup-for-recording-screencasts/</guid>
      <description>Last year I started recording my contributions to open source. I wasn&amp;rsquo;t really regular, so today I published only the 9th episode: OSS Contribution 9.
Anyway, now I&amp;rsquo;m at the point where I am happy with the overall quality of the recording, both with the video and the audio and I want to write down the current setup so that I can recreate it in the future if I need to.</description>
    </item>
    
    <item>
      <title>Details matter</title>
      <link>https://robertbasic.com/blog/details-matter/</link>
      <pubDate>Mon, 19 Feb 2018 15:48:41 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/details-matter/</guid>
      <description>Last week on Thursday the lovely people from Zagreb PHP had me over for a talk. I presented my new talk called &amp;ldquo;All aboard the Service Bus&amp;rdquo;. I gave this talk once before at the PHP Srbija meetup in January. I&amp;rsquo;ve reused the slides, made some minor adjustments based on the feedback I received in Belgrade, and of course updated the footer.
The version from Belgrade had &amp;ldquo;Robert Basic - PHP Srbija #29&amp;rdquo; and the version from Zagreb had &amp;ldquo;Robert Basic - ZGPHP #78&amp;rdquo; in the footer.</description>
    </item>
    
    <item>
      <title>Docker nginx host not found in upstream error</title>
      <link>https://robertbasic.com/blog/docker-nginx-host-not-found-in-upstream-error/</link>
      <pubDate>Tue, 30 Jan 2018 21:30:30 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/docker-nginx-host-not-found-in-upstream-error/</guid>
      <description>I&amp;rsquo;ve been toying around with Docker for the past couple of days, mostly to learn more about it, to understand it better. I just didn&amp;rsquo;t bother with it until now.
I started from scratch. Installing Docker, configuring it (I really don&amp;rsquo;t appreciate it filling my root partition with images), and, well, using it. I sort of figured out the docker command line interface, I get the difference between images and containers, I know how to write a Dockerfile, and when all the commands and options and flags start get confusing I know where to look in the help for help.</description>
    </item>
    
    <item>
      <title>Mockery partial mocks</title>
      <link>https://robertbasic.com/blog/mockery-partial-mocks/</link>
      <pubDate>Sun, 28 Jan 2018 10:22:54 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/mockery-partial-mocks/</guid>
      <description>In dealing with legacy code I often come across some class that extends a big base abstract class, and the methods of that class call methods on that big base abstract class that do an awful lot of things. I myself have written such classes and methods in the past. Live and learn.
One of the biggest problems with this kind of code is that it is pretty hard to test.</description>
    </item>
    
    <item>
      <title>Build and run Golang projects in VS Code</title>
      <link>https://robertbasic.com/blog/build-and-run-golang-projects-in-vs-code/</link>
      <pubDate>Wed, 24 Jan 2018 22:49:03 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/build-and-run-golang-projects-in-vs-code/</guid>
      <description>I&amp;rsquo;ve been using VS Code for my Golang development needs for a few months now. Minor kinks here and there, nothing serious, and the development experience gets better with every update. I have also tried out IntelliJ Idea as the editor, and one feature that I&amp;rsquo;m missing in Code from Idea is the build-run-reload process. I thought to myself, that&amp;rsquo;s such a basic feature, it should be possible to have that.</description>
    </item>
    
    <item>
      <title>Static web pages in Hugo</title>
      <link>https://robertbasic.com/blog/static-web-pages-in-hugo/</link>
      <pubDate>Wed, 24 Jan 2018 13:25:08 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/static-web-pages-in-hugo/</guid>
      <description>Last week I created a page on this site that holds all the talks I have prepared for meetups and conferences. As this site is powered by Hugo, the process wasn&amp;rsquo;t that straightforward. I want to write down the steps I did to make it easier in the future.
Oh, and when I say &amp;ldquo;static&amp;rdquo; in the title of this post, I mean pages whose content is not completely powered by a markdown content file.</description>
    </item>
    
    <item>
      <title>Free the Geek interview</title>
      <link>https://robertbasic.com/blog/free-the-geek-interview/</link>
      <pubDate>Fri, 12 Jan 2018 10:01:49 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/free-the-geek-interview/</guid>
      <description>Last year (feels weird to say &amp;ldquo;last year&amp;rdquo;, when it was less than a month ago) Matthew asked me if I&amp;rsquo;d be willing to appear as a guest on his Free the Geek podcast. To have a short chat about running my own software consultancy, freelancing, public speaking, and whatever else pops up.
Matthew is a great host, I have no idea why I was so nervous while chatting. Maybe because he also interviewed people like Matthew, and Matthew, and Chris, and Chris, all programmers that I learned and keep learning a lot from?</description>
    </item>
    
    <item>
      <title>Buffered vs. unbuffered channels in Golang</title>
      <link>https://robertbasic.com/blog/buffered-vs-unbuffered-channels-in-golang/</link>
      <pubDate>Mon, 25 Dec 2017 10:32:34 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/buffered-vs-unbuffered-channels-in-golang/</guid>
      <description>As any newcomer to Golang and it&amp;rsquo;s ecosystem, I was eager to find out what is this hubbub about these things called goroutines and channels. I read the documentation and blog posts, watched videos, tried out some of the &amp;ldquo;hello world&amp;rdquo; examples and even wasted a couple of days trying to solve the puzzles for day 18 from Advent of Code 2017 using goroutines and failed spectacularly.
All this was just&amp;hellip; doing stuff without actually understanding of when, how, and why use goroutines and channels.</description>
    </item>
    
    <item>
      <title>Mockery return values based on arguments</title>
      <link>https://robertbasic.com/blog/mockery-return-values-based-on-arguments/</link>
      <pubDate>Tue, 12 Dec 2017 10:10:21 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/mockery-return-values-based-on-arguments/</guid>
      <description>Sometimes when working with Mockery mock objects, we want to tell a mocked method to return different values for different arguments. It is a rare occasion when I need this feature, but every time I need it, I&amp;rsquo;m happy it&amp;rsquo;s there.
The feature that allows us to return different values based on arguments is the andReturnUsing Mockery method, which takes a closure as an argument:
example.php $dependencyMock = \Mockery::mock(&amp;#39;SomeDependency&amp;#39;); $dependencyMock-&amp;gt;shouldReceive(&amp;#39;callDependency&amp;#39;) -&amp;gt;andReturnUsing(function ($argument) { if ($argument &amp;lt;= 10) { return &amp;#39;low&amp;#39;; } return &amp;#39;high&amp;#39;; }); $dependencyMock-&amp;gt;callDependency(10); // &amp;#39;low&amp;#39; $dependencyMock-&amp;gt;callDependency(11); // &amp;#39;high&amp;#39; Any number of times we call our callDependency method on our mock object with a number 10 or less, it will return &#39;low&#39;, otherwise it will return &#39;high&#39;.</description>
    </item>
    
    <item>
      <title>Five days of Advent of Gode</title>
      <link>https://robertbasic.com/blog/five-days-of-advent-of-gode/</link>
      <pubDate>Wed, 06 Dec 2017 08:34:20 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/five-days-of-advent-of-gode/</guid>
      <description>A week or so ago, Luka mentioned this Advent of Code thing. I&amp;rsquo;ve been doing coding challenges and examples before, but never have I tried the AoC (this is the third year it&amp;rsquo;s running).
Advent of Code is a series of programming puzzles, where you get 2 puzzles a day for 25 days.
Given that I have started to learn golang again, I figured might as well learn more about it by joining this years challenge.</description>
    </item>
    
    <item>
      <title>CLI command to whitelist Composer packages</title>
      <link>https://robertbasic.com/blog/cli-command-to-whitelist-composer-packages/</link>
      <pubDate>Mon, 04 Dec 2017 08:13:00 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/cli-command-to-whitelist-composer-packages/</guid>
      <description>James asked this question the other day on Twitter:
 #LazyWeb is there a way to do a composer update of everything except a specific package or two? like `composer update --exclude doctrine/orm --exclude doctrine/dbal` or something? I don&#39;t want to have to whitelist everything all the time (there&#39;s bigger problems ofc)  Given that Composer has no --exclude flag or similar, the only other option is to create a list of packages we allow to be updated, excluding the ones we don&amp;rsquo;t want to be updated.</description>
    </item>
    
    <item>
      <title>Reacting to promises</title>
      <link>https://robertbasic.com/blog/reacting-to-promises/</link>
      <pubDate>Wed, 29 Nov 2017 09:51:49 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/reacting-to-promises/</guid>
      <description>I was working on something that includes the usage of ReactPHP promises. Given that I haven&amp;rsquo;t had the chance to take a closer look at it yet, I decided that this is the right time for it.
ReactPHP has several different components, with the end goal of providing a low-level library for event-driven programming in PHP. The one component I want to talk about today is the promise component, which is a Promises/A implementation for PHP.</description>
    </item>
    
    <item>
      <title>PHP FPM slow log</title>
      <link>https://robertbasic.com/blog/php-fpm-slow-log/</link>
      <pubDate>Thu, 23 Nov 2017 16:12:18 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/php-fpm-slow-log/</guid>
      <description>The other day I was going through the configuration file for php-fpm, when I noticed a configuration directive I haven&amp;rsquo;t before: slowlog. I guess it&amp;rsquo;s been around for a while, I just never noticed it.
The php-fpm slow log is a pool configuration, meaning that we configure it in www.conf, and has two directives for it:
 the slowlog, which is a path to a file where the slow requests will be logged, and request_slowlog_timeout is a time unit after which PHP will dump a backtrace for that request in to the slow log file.</description>
    </item>
    
    <item>
      <title>Visual sudo for shell scripts</title>
      <link>https://robertbasic.com/blog/visual-sudo-for-shell-scripts/</link>
      <pubDate>Mon, 06 Nov 2017 08:27:14 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/visual-sudo-for-shell-scripts/</guid>
      <description>The other day I was putting together a small shell script to do some administrative tasks on my Fedora workstation.
Even though I spend most of my time in a terminal, I wanted to have this script available from &amp;ldquo;everywhere&amp;rdquo;, that is to have it available to run it as a keyboard shortcut.
The script requires sudo privileges, and up until now, I thought that the only way to get sudo was from the terminal.</description>
    </item>
    
    <item>
      <title>What implements an interface</title>
      <link>https://robertbasic.com/blog/what-implements-an-interface/</link>
      <pubDate>Thu, 02 Nov 2017 07:43:21 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/what-implements-an-interface/</guid>
      <description>Creating and implementing interfaces in our code is important. It helps with swapping out components, eases testing, separates the what from the how.
But, it&amp;rsquo;s not enough just to slap an interface on a class and be done with it.
We also need to consider on what are we putting that interface on.
An example Say, we&amp;rsquo;re creating a queuing system for an RSS feed reader. We can tell the queue to queue the feed URLs.</description>
    </item>
    
    <item>
      <title>Smarter tag search in Vim</title>
      <link>https://robertbasic.com/blog/smarter-tag-search-in-vim/</link>
      <pubDate>Wed, 01 Nov 2017 08:55:14 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/smarter-tag-search-in-vim/</guid>
      <description>As part of my Vim setup for PHP development, I use the vim-php-namespace plugin to add use statements in my PHP code.
vim-php-namespace uses the tags file to find the class and the namespace it belongs to, and then adds it to the rest of the use statements.
It all works great, but there are times when it shows too much possibilities.
For example, when I want to import the namespace for the Transaction class, it finds the correct Transaction class, but it also finds functions called transaction in my codebase, and then gives me a choice what I want to import:</description>
    </item>
    
    <item>
      <title>Reading from standard input with Go</title>
      <link>https://robertbasic.com/blog/reading-from-standard-input-with-go/</link>
      <pubDate>Mon, 30 Oct 2017 07:15:19 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/reading-from-standard-input-with-go/</guid>
      <description>Last year I started learning Go, then I stopped, and now I don&amp;rsquo;t remember anything what I learned.
Going to try it a bit different this time, by writing down what I do, learn, experiment.
As I don&amp;rsquo;t have a specific thing I want to build with Go, I&amp;rsquo;m just going to do simple scripts and examples, to get to know Go&amp;rsquo;s language specification and built-ins as much as possible.</description>
    </item>
    
    <item>
      <title>I think I understand bounded contexts</title>
      <link>https://robertbasic.com/blog/i-think-i-understand-bounded-contexts/</link>
      <pubDate>Tue, 24 Oct 2017 07:58:37 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/i-think-i-understand-bounded-contexts/</guid>
      <description>Earlier this year I started reading the DDD book by Eric Evans. Together with the Eventsourcery videos from Shawn McCool, the first three chapters of the book were&amp;hellip; easy to understand, even. Lots of &amp;ldquo;A-ha!&amp;rdquo; and &amp;ldquo;Oh!&amp;rdquo; moments, followed by &amp;ldquo;That makes perfect sense.&amp;rdquo; statements, and a couple of excited &amp;ldquo;I knew that!&amp;quot;-ones. Then I got to the chapter with the bounded contexts. I read the first few pages, thought about them&amp;hellip; Then read them again, and thought some more.</description>
    </item>
    
    <item>
      <title>Creating datetimes from a format with a timezone</title>
      <link>https://robertbasic.com/blog/creating-datetimes-from-a-format-with-a-timezone/</link>
      <pubDate>Mon, 16 Oct 2017 07:39:57 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/creating-datetimes-from-a-format-with-a-timezone/</guid>
      <description>I wouldn&amp;rsquo;t be writing this blog post, if I&amp;rsquo;d read all the &amp;ldquo;fineprints&amp;rdquo; in the PHP manual. Alas, here we are.
The DateTime and DateTimeImmutable classes have a createFromFormat method. As you can probably guess from it&amp;rsquo;s name, it creates a datetime object from a datetime string formatted in the specified format. Something like this:
&amp;lt;?php $dtString = &amp;#39;2017-10-16 07:50:00&amp;#39;; $format = &amp;#39;Y-m-d H:i:s&amp;#39;; $dt = \DateTimeImmutable::createFromFormat($format, $dtString); print_r($dt); gives an immutable datetime object:</description>
    </item>
    
    <item>
      <title>Bug triage, the paperwork of open source</title>
      <link>https://robertbasic.com/blog/bug-triage-the-paperwork-of-open-source/</link>
      <pubDate>Wed, 24 May 2017 12:39:01 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/bug-triage-the-paperwork-of-open-source/</guid>
      <description>Everyone loves contributing patches to open source projects, adding new features. Some even like to write documentation.
Probably the least talked about way of contributing to open source is triaging issues (I have no data to back this statement, so I might be wrong!).
I do believe however that it can be the biggest help to project maintainers, because with issue triage out of the way, they are left dealing with the &amp;ldquo;bigger&amp;rdquo; problems of the project, such as fixing difficult bugs and implementing new features.</description>
    </item>
    
    <item>
      <title>Everybody knows that</title>
      <link>https://robertbasic.com/blog/everybody-knows-that/</link>
      <pubDate>Mon, 08 May 2017 17:32:52 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/everybody-knows-that/</guid>
      <description>Back in December last year, Matthew Turland published a blog post asking &amp;ldquo;Why aren&amp;rsquo;t you speaking?&amp;rdquo;
It made me think.
What I realised is that I always havehad this feeling that everybody already knows what I know.
Is that part of an impostor syndrome?
I don&amp;rsquo;t know. I really don&amp;rsquo;t feel like an impostor. I know what I know, I&amp;rsquo;m perfectly fine accepting that I don&amp;rsquo;t know everything&amp;hellip; but then there&amp;rsquo;s this feeling that everybody else knows what I know.</description>
    </item>
    
    <item>
      <title>Complex argument matching in Mockery</title>
      <link>https://robertbasic.com/blog/complex-argument-matching-in-mockery/</link>
      <pubDate>Mon, 08 May 2017 08:54:26 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/complex-argument-matching-in-mockery/</guid>
      <description>This past weekend I did some issue maintenance and bug triage on Mockery. One thing I noticed going through all these issues, is that people were surprised when learning about the \Mockery::on() argument matcher. I know Mockery&amp;rsquo;s documentation isn&amp;rsquo;t the best documentation out there, but this still is a documented feature.
First of all, Mockery supports validating arguments we pass when calling methods on a mock object. This helps us expect a method call with one (set of) argument, but not with an other.</description>
    </item>
    
    <item>
      <title>Open source taught me how to work with legacy code</title>
      <link>https://robertbasic.com/blog/open-source-taught-me-how-to-work-with-legacy-code/</link>
      <pubDate>Fri, 28 Apr 2017 07:32:30 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/open-source-taught-me-how-to-work-with-legacy-code/</guid>
      <description>Contributing to open source projects has many benefits — you learn and you teach, you can make friends or find business partners, you might get a chance to travel. Even have a keynote at a conference, like Gary did.
Contributing to open source projects was the best decision I made in my professional career. Just because I contributed to, and blogged about Zend Framework, I ended up working and consulting for a company for four and a half years.</description>
    </item>
    
    <item>
      <title>Recording screencasts of OSS contributions</title>
      <link>https://robertbasic.com/blog/recording-screencasts-of-oss-contributions/</link>
      <pubDate>Wed, 19 Apr 2017 16:32:09 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/recording-screencasts-of-oss-contributions/</guid>
      <description>I enjoy contributing to open source projects, and I learn a lot while doing it. When someone asks me for advice on how to improve as a programmer, I usually tell them to find an open source project that interests them, and start contributing.
Easier said than done.
I&amp;rsquo;ve been contributing since&amp;hellip; early 2009 I think, when I joined the Zend Framework mailing list.
To try and bring closer contributing to beginners, I decided to start recording screencasts of me doing open source contributions.</description>
    </item>
    
    <item>
      <title>Read-only Symfony form field</title>
      <link>https://robertbasic.com/blog/readonly-symfony-form-field/</link>
      <pubDate>Mon, 10 Apr 2017 15:38:48 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/readonly-symfony-form-field/</guid>
      <description>The future me will be grateful for this post. I always get it wrong the first time.
To set a Symfony form field as a read-only, we can&amp;rsquo;t set the readonly attribute as an option on that field:
src/AppBundle/Form/FooType.php &amp;lt;?php declare(strict_types=1); namespace AppBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; class FooType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder-&amp;gt;add(&amp;#39;title&amp;#39;, TextType::class, [ &amp;#39;readonly&amp;#39; =&amp;gt; true, ]); } } This won&amp;rsquo;t work, and will give the The option &amp;quot;readonly&amp;quot; does not exist.</description>
    </item>
    
    <item>
      <title>Waste an hour on a stupid mistake</title>
      <link>https://robertbasic.com/blog/waste-an-hour-on-a-stupid-mistake/</link>
      <pubDate>Fri, 07 Apr 2017 17:06:35 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/waste-an-hour-on-a-stupid-mistake/</guid>
      <description>I made such a stupid mistake today and lost an hour of my time trying to figure out what the hell is wrong, that I just have to blog it.
I was working on embedding a Symfony form into another form, following the documentation to the letter&amp;hellip; Yet there I was staring at this stupid error message:
The options &amp;#34;0&amp;#34;, &amp;#34;1&amp;#34; do not exist. Defined options are: &amp;#34;action&amp;#34;, &amp;#34;allow_add&amp;#34;, &amp;#34;allow_delete&amp;#34;, &amp;#34;allow_extra_fields&amp;#34;, &amp;#34;attr&amp;#34;, &amp;#34;auto_initialize&amp;#34;, &amp;#34;block_name&amp;#34;, &amp;#34;by_reference&amp;#34;, &amp;#34;compound&amp;#34;, &amp;#34;constraints&amp;#34;, &amp;#34;csrf_field_name&amp;#34;, &amp;#34;csrf_message&amp;#34;, &amp;#34;csrf_protection&amp;#34;, &amp;#34;csrf_token_id&amp;#34;, &amp;#34;csrf_token_manager&amp;#34;, &amp;#34;data&amp;#34;, &amp;#34;data_class&amp;#34;, &amp;#34;delete_empty&amp;#34;, &amp;#34;disabled&amp;#34;, &amp;#34;empty_data&amp;#34;, &amp;#34;entry_options&amp;#34;, &amp;#34;entry_type&amp;#34;, &amp;#34;error_bubbling&amp;#34;, &amp;#34;error_mapping&amp;#34;, &amp;#34;extra_fields_message&amp;#34;, &amp;#34;help&amp;#34;, &amp;#34;inherit_data&amp;#34;, &amp;#34;invalid_message&amp;#34;, &amp;#34;invalid_message_parameters&amp;#34;, &amp;#34;label&amp;#34;, &amp;#34;label_attr&amp;#34;, &amp;#34;label_format&amp;#34;, &amp;#34;mapped&amp;#34;, &amp;#34;method&amp;#34;, &amp;#34;post_max_size_message&amp;#34;, &amp;#34;property_path&amp;#34;, &amp;#34;prototype&amp;#34;, &amp;#34;prototype_data&amp;#34;, &amp;#34;prototype_name&amp;#34;, &amp;#34;required&amp;#34;, &amp;#34;translation_domain&amp;#34;, &amp;#34;trim&amp;#34;, &amp;#34;upload_max_size_message&amp;#34;, &amp;#34;validation_groups&amp;#34;.</description>
    </item>
    
    <item>
      <title>PHP traits to create test doubles</title>
      <link>https://robertbasic.com/blog/php-traits-to-create-test-doubles/</link>
      <pubDate>Tue, 04 Apr 2017 10:21:30 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/php-traits-to-create-test-doubles/</guid>
      <description>Keeping your application or library code well organized, easy to follow, and read is important. Your test code should not be exempt from those rules, you should follow good testing conventions.
One part of my tests that I feel like that are out of control are the test doubles. Dummies, fakes, mocks&amp;hellip; Seems like they are everywhere and that I keep writing the same ones over and over again.
I do follow some good practices on how to reduce code duplication in my tests, but these mocks&amp;hellip;</description>
    </item>
    
    <item>
      <title>Loading fixtures for a Symfony app in Behat tests</title>
      <link>https://robertbasic.com/blog/loading-fixtures-for-a-symfony-app-in-behat-tests/</link>
      <pubDate>Tue, 21 Mar 2017 16:15:27 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/loading-fixtures-for-a-symfony-app-in-behat-tests/</guid>
      <description>Performing end to end testing of any application requires from us to have a set of reliable test data in the database.
If we write a Symfony application and use Behat to do the end to end testing, the we can use the Doctrine fixtures bundle to create the required fixture loaders and load them in our Behat scenarios when required, using the BeforeScenario hook.
Install Doctrine fixtures bundle Using composer we can install the Doctrine fixtures bundle:</description>
    </item>
    
    <item>
      <title>Current Vim setup for PHP development</title>
      <link>https://robertbasic.com/blog/current-vim-setup-for-php-development/</link>
      <pubDate>Fri, 10 Feb 2017 09:01:31 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/current-vim-setup-for-php-development/</guid>
      <description>I made some changes to my Vim setup for PHP development recently, so it&amp;rsquo;s time to write it all down. I&amp;rsquo;m more than sure that I&amp;rsquo;ll break it soon and won&amp;rsquo;t be able to remember all the things I did to have the current setup.
Some new plugins popped up on my radar, I tweaked some older plugins and I even wrote one for PHPStan!
Last year I wrote how I got really good tag support in Vim, so I&amp;rsquo;ll first expand on that.</description>
    </item>
    
    <item>
      <title>PHP-FPM security limit extensions issue</title>
      <link>https://robertbasic.com/blog/php-fpm-security-limit-extensions-issue/</link>
      <pubDate>Fri, 03 Feb 2017 11:47:11 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/php-fpm-security-limit-extensions-issue/</guid>
      <description>For the first time ever I saw this error:
2017/02/03 11:45:04 [error] 14656#0: *1 FastCGI sent in stderr: &amp;#34;Access to the script &amp;#39;/var/www/web&amp;#39; has been denied (see security.limit_extensions)&amp;#34; while reading response header from upstream, client: 127.0.0.1, server: proj.loc, request: &amp;#34;GET / HTTP/1.1&amp;#34;, upstream: &amp;#34;fastcgi://unix:/var/run/php-fpm/www.sock:&amp;#34;, host: &amp;#34;proj.loc&amp;#34; I mean&amp;hellip; what? security.limit_extensions? I honestly never heard of this before.
The PHP manual describes it as:
 Limits the extensions of the main script FPM will allow to parse.</description>
    </item>
    
    <item>
      <title>Search and replace in visual selection in Vim</title>
      <link>https://robertbasic.com/blog/search-and-replace-in-visual-selection-in-vim/</link>
      <pubDate>Mon, 23 Jan 2017 20:46:41 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/search-and-replace-in-visual-selection-in-vim/</guid>
      <description>The search and replace feature is very powerful in Vim. Just do a :help :s to see all the things it can do.
One thing that always bothered me though, is that when I select something with visual, try to do a search and replace on it, Vim actually does it on the entire line, not just on the selection.
What the&amp;hellip;? There must be a way to this, right?</description>
    </item>
    
    <item>
      <title>XFCE4 desktop zooming with the keyboard</title>
      <link>https://robertbasic.com/blog/xfce4-desktop-zooming-with-the-keyboard/</link>
      <pubDate>Thu, 19 Jan 2017 14:25:24 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/xfce4-desktop-zooming-with-the-keyboard/</guid>
      <description>XFCE4 has a zoom feature available when the desktop composition is turned on. By default, holding the Alt key and scrolling up or down the mouse wheel,
I can zoom in or out the entire desktop. Once zoomed in, it follows the mouse pointer as to which part of the desktop to show.
I prefer doing as much as possible from my keyboard, and to use the mouse only when necessary.</description>
    </item>
    
    <item>
      <title>Force Python version in Vim</title>
      <link>https://robertbasic.com/blog/force-python-version-in-vim/</link>
      <pubDate>Thu, 12 Jan 2017 08:07:37 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/force-python-version-in-vim/</guid>
      <description>Vim can be compiled with Python support. Vim can be compiled with both Python 2 and Python 3 support.
At the same time.
But not really.
Vim can have both of them, but use only one at a time. If you start using one version, there is no way to switch to the other one.
The silly thing is that if you simply ask Vim which version does it support, the first one asked and supported is going to be the one loaded and used.</description>
    </item>
    
    <item>
      <title>Things I learned in the past four years</title>
      <link>https://robertbasic.com/blog/things-i-learned-in-the-past-four-years/</link>
      <pubDate>Fri, 30 Dec 2016 20:27:45 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/things-i-learned-in-the-past-four-years/</guid>
      <description>Since yesterday was my last day on a project after four years and two months, I decided to take a look back on those four years and write down some of the things I learned.
Things I learned about being a better listener, a better communicator, a better team mate, a better programmer.
Leave your ego at the door This is probably one of the hardest and most important lessons I learned.</description>
    </item>
    
    <item>
      <title>Issues with Vagrant after upgrading to Fedora 25</title>
      <link>https://robertbasic.com/blog/issues-with-vagrant-after-upgrading-to-fedora-25/</link>
      <pubDate>Sat, 24 Dec 2016 12:00:44 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/issues-with-vagrant-after-upgrading-to-fedora-25/</guid>
      <description>Fedora 25 was released over a month ago, so I decided it was time to upgrade from 24.
Using the dnf plugin system-upgrade the entire process went smooth. The Fedora Magazine, as always, has a nice post on how to upgrade.
So far I ran into only a couple of minor issues with Vagrant.
The first one, which isn&amp;rsquo;t really a problem, is that Vagrant got downgroaded to version 1.8.x from 1.</description>
    </item>
    
    <item>
      <title>Using Doctrine DBAL with Zend Expressive</title>
      <link>https://robertbasic.com/blog/using-doctrine-dbal-with-zend-expressive/</link>
      <pubDate>Thu, 22 Dec 2016 16:46:29 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/using-doctrine-dbal-with-zend-expressive/</guid>
      <description>The Doctrine project comes with a database abstraction and access layer — Doctrine DBAL — which I prefer over other abstraction layers like Zend DB.
My good friend James, aka Asgrim, has written already how to integrate Zend
Expressive and Doctrine ORM.
But what if want to use only the DBAL with Zend Expressive, and not the entire ORM?
It&amp;rsquo;s pretty easy as all we need to do is write one short factory that will create the database connection using the connection parameters we provide to it:</description>
    </item>
    
    <item>
      <title>Anatomy of a git diff</title>
      <link>https://robertbasic.com/blog/anatomy-of-a-git-diff/</link>
      <pubDate>Tue, 20 Dec 2016 12:58:34 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/anatomy-of-a-git-diff/</guid>
      <description>I&amp;rsquo;m looking at git diffs every day, all day. Diffs hold a lot of information that can be valuable, and I think it&amp;rsquo;s a good thing to know how to fully read a git diff.
A simple diff looks something like this:
diff --git a/example.php b/example.php index a5174a9..11aeb84 100644 --- a/example.php +++ b/example.php @@ -11,7 +11,10 @@ class Greeter  $this-&amp;gt;name = $name; } - public function greet() + /** + * Return the greeting message.</description>
    </item>
    
    <item>
      <title>Editing Vim macros</title>
      <link>https://robertbasic.com/blog/editing-vim-macros/</link>
      <pubDate>Thu, 15 Dec 2016 20:23:50 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/editing-vim-macros/</guid>
      <description>Vim macros are a powerful thing — they let us record keystrokes and play them back later. These macros are recorded to named registers.
One thing I realised about them, is that they can be edited after they have been recorded. This is possible because macros &amp;ldquo;lives&amp;rdquo; in the register.
Say, for example, you record a macro of 20+ keystrokes, play it back, only to realize that there&amp;rsquo;s a single error in the steps.</description>
    </item>
    
    <item>
      <title>Renewing Let&#39;s Encrypt certificates</title>
      <link>https://robertbasic.com/blog/renewing-lets-encrypt-certificates/</link>
      <pubDate>Tue, 13 Dec 2016 16:12:49 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/renewing-lets-encrypt-certificates/</guid>
      <description>Back in July I wrote how to set up SSL certificates with Let&amp;rsquo;s Encrypt. One of my certificates was due to a renewal, and
anticipating some work to renew it, I decided to blog how to renew a Let&amp;rsquo;s Encrypt certificate.
It was quite anticlimactic:
sudo certbot renew That&amp;rsquo;s it. All that was required to renew a certificate. certbot even figures out which of the certificates is due to a renewal and renews only those.</description>
    </item>
    
    <item>
      <title>Verbose commiting</title>
      <link>https://robertbasic.com/blog/verbose-commiting/</link>
      <pubDate>Mon, 12 Dec 2016 12:07:56 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/verbose-commiting/</guid>
      <description>One thing I recently learned about git, is the -v or --verbose flag for the git commit command. It shows the diff of what is being commited in $EDITOR below the commit message
template. Taken directly from man git commit:

 Show unified diff between the HEAD commit and what would be committed at the bottom of the commit message template to help the user describe the commit by reminding what</description>
    </item>
    
    <item>
      <title>Configure Fedora&#39;s firewall for Vagrant</title>
      <link>https://robertbasic.com/blog/configure-fedoras-firewall-for-vagrant/</link>
      <pubDate>Fri, 09 Dec 2016 08:54:33 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/configure-fedoras-firewall-for-vagrant/</guid>
      <description>This one&amp;rsquo;s been in my drafts for a long time, might as well publish it.
FirewallD, Fedora&amp;rsquo;s firewall, has a set of zones, which basically enables to configure trusted network connections inside these zones. You can read more about FirewallD on it&amp;rsquo;s wiki page.
Whenever I bring up a Vagrant box for the first time, Fedora&amp;rsquo;s firewall blocks the NFS shares, because the new Vagrant network interface does not belong to any zone.</description>
    </item>
    
    <item>
      <title>Events in a Zend Expressive application</title>
      <link>https://robertbasic.com/blog/events-in-a-zend-expressive-application/</link>
      <pubDate>Thu, 04 Aug 2016 16:50:48 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/events-in-a-zend-expressive-application/</guid>
      <description>Three weeks ago I wrote a post on how to utilize Tactician in a Zend Expressive application. Today I want to expand on that post a little by adding the possibility to trigger and listen to events using the Zend EventManager component.
Using events allows our application to respond to different events that occur during a request. For example, when a user registers a new account, our application can trigger an event, UserRegistered, that can let the rest of our application know when a new registration happens.</description>
    </item>
    
    <item>
      <title>Hiking the Uvac special nature reserve</title>
      <link>https://robertbasic.com/blog/hiking-the-uvac-special-nature-reserve/</link>
      <pubDate>Wed, 27 Jul 2016 14:51:39 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/hiking-the-uvac-special-nature-reserve/</guid>
      <description>In 2014 my wife Senka and I went on a camping vacation in Greece, on the Lefkas island. It was the first time camping for her, while I did some camping the year before. We quickly realised that we both enjoy camping very much and agreed to go on as many camping trips as possible.
The following year we went on a 12 day long camping and hiking vacation in Italy.</description>
    </item>
    
    <item>
      <title>Missing colors for PHPUnit</title>
      <link>https://robertbasic.com/blog/missing-colors-for-phpunit/</link>
      <pubDate>Wed, 20 Jul 2016 16:55:55 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/missing-colors-for-phpunit/</guid>
      <description>I ran accross a minor issue today that I never experienced before. The colors for the PHPUnit&amp;rsquo;s output were missing. I had the colors=true directive set in the phpunit.xml configuration file, but the output was just black and white.
Turns out I was missing the posix extension, which is provided by the php-process package on Fedora. After installing it:
$ sudo dnf install php-process all was good again in the world of unit testing.</description>
    </item>
    
    <item>
      <title>Using Tactician in a Zend Expressive application</title>
      <link>https://robertbasic.com/blog/using-tactician-in-a-zend-expressive-application/</link>
      <pubDate>Wed, 13 Jul 2016 21:59:21 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/using-tactician-in-a-zend-expressive-application/</guid>
      <description>I spent some time connecting the dots last week, so I decided to put together an example on how to get started with using Tactician in a Zend Expressive application. The example itself is not really useful, but it does show how to setup the dependencies and get started with these two libraries.
Zend Expressive is a PSR7 compatible microframework that provides interfaces for routing, DI containers, templating and error handling.</description>
    </item>
    
    <item>
      <title>Setting up SSL certificates with Let&#39;s Encrypt</title>
      <link>https://robertbasic.com/blog/setting-up-ssl-certificates-with-lets-encrypt/</link>
      <pubDate>Wed, 06 Jul 2016 06:30:22 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/setting-up-ssl-certificates-with-lets-encrypt/</guid>
      <description>This past week I finally got around to setting up SSL certificates using Let&amp;rsquo;s Encrypt. Let&amp;rsquo;s Encrypt is an open certificate authority that provides free SSL/TLS certificates. It&amp;rsquo;s goal is to make creating, renewing and using SSL certs painless.
And it most certainly is. I was expecting a lot more hassle to set up all this, but it was really easy to do.
Install certbot Certbot is a Let&amp;rsquo;s Encrypt client that helps setting up a certificate by obtaining and installing it on your servers.</description>
    </item>
    
    <item>
      <title>Installing Python2 with Ansible</title>
      <link>https://robertbasic.com/blog/installing-python2-with-ansible/</link>
      <pubDate>Wed, 29 Jun 2016 07:45:15 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/installing-python2-with-ansible/</guid>
      <description>Ansible uses Python2 to run the provisioning commands on the host machines. At this time it does not support Python3, which is the default python version in Fedora releases for quite some time now.
So to be able to manage Fedora machines with Ansible, I need to install Python2, but how to install it when all the Ansible modules depend on Python2 being installed? Turns out it&amp;rsquo;s quite simple, by turning of the gathering of facts in Ansible and using the raw module to install the required packages:</description>
    </item>
    
    <item>
      <title>Creating a PostgreSQL user in Vagrant with Ansible</title>
      <link>https://robertbasic.com/blog/creating-a-postgresql-user-in-vagrant-with-ansible/</link>
      <pubDate>Tue, 28 Jun 2016 17:18:22 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/creating-a-postgresql-user-in-vagrant-with-ansible/</guid>
      <description>Lately I&amp;rsquo;ve been playing around with provisioning a PostgreSQL server with Ansible in a local Vagrant machine that runs a Fedora 23 image.
The first task after installing and starting the PostgreSQL server is to create a database user and a database. So far I have found an ugly way, a really ugly way and a nice way to do this.
How it should be done The proper way to do this would be to use the postgresql_user Ansible module and the become, become_user and become_method directives, like so:</description>
    </item>
    
    <item>
      <title>Helping juniors debug</title>
      <link>https://robertbasic.com/blog/helping-juniors-debug/</link>
      <pubDate>Thu, 23 Jun 2016 08:20:14 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/helping-juniors-debug/</guid>
      <description>These days I spend most of my time reviewing code. Lots and lots of code. It&amp;rsquo;s mostly written by juniors and some of it is good, some of it is bad. I try to be patient, to be a good mentor, to hopefully teach (and be taught), while not letting out of sight that the most important thing is that the code does the right thing in the right way. The business and the users come first, after all.</description>
    </item>
    
    <item>
      <title>Import custom Python modules in Vim plugins</title>
      <link>https://robertbasic.com/blog/import-custom-python-modules-in-vim-plugins/</link>
      <pubDate>Thu, 16 Jun 2016 19:37:48 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/import-custom-python-modules-in-vim-plugins/</guid>
      <description>This took me a while to figure out so I&amp;rsquo;m writing it down for future self and anyone else who needs it.
I started writing a new Vim plugin that will use the Python interface as most of the work will be done there, mostly to keep my sanity.
Having a plugin layout such as:
. ├── lib │ └── mypymodule │ └── ham.py └── plugin └── my-vim-plugin.vim I want to be able to do a</description>
    </item>
    
    <item>
      <title>GitHub flavoured code fences in Hugo</title>
      <link>https://robertbasic.com/blog/github-flavoured-code-fences-in-hugo/</link>
      <pubDate>Mon, 28 Mar 2016 19:33:43 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/github-flavoured-code-fences-in-hugo/</guid>
      <description>This was an undocumented feature until today, so I missed it when I was converting my site to Hugo last week. It is also possible to highlight code examples with GitHub flavoured code fences, or, in other words, with triple backticks ```.
I like this a lot because it makes highlighting code in posts easier. Typing the {{&amp;lt; highlight &amp;gt;}} shortcode is just awkward and I always end up forgetting either the angle brackets or add too much or too little currly brackets.</description>
    </item>
    
    <item>
      <title>Vim Hugo helper</title>
      <link>https://robertbasic.com/blog/vim-hugo-helper/</link>
      <pubDate>Fri, 25 Mar 2016 10:28:43 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/vim-hugo-helper/</guid>
      <description>I think I just wrote my first Vim plugin. OK, it&amp;rsquo;s more a bunch of Vim functions slapped together than an actual plugin, but gotta start somewhere, right?
Last week I converted this blog to a static web site and I&amp;rsquo;m using Hugo as the static website engine. Writing posts is a lot easier now, plus it&amp;rsquo;s written in Go, which I started learning a few weeks ago.
Vim Hugo helper is a plugin, collection of Vim functions that help me while writing posts.</description>
    </item>
    
    <item>
      <title>Find duplicate lines from a CSV</title>
      <link>https://robertbasic.com/blog/find-duplicate-lines-from-a-csv/</link>
      <pubDate>Mon, 21 Mar 2016 13:35:16 +0100</pubDate>
      
      <guid>https://robertbasic.com/blog/find-duplicate-lines-from-a-csv/</guid>
      <description>Finding duplicate lines from a CSV file is something I have to do from time to time, yet not on a regular enough basis to remember it all. Plus, I&amp;rsquo;m trying to blog more often.
cut -d, -f1 file.csv | tr -d &amp;#39;&amp;#34;&amp;#39; | sort | uniq -dc cut to split the lines at the commas and select the first field, then tr to delete any double quotes that encloses the field, then sort and finally with uniq to show only the duplicated lines and to prefix every line with the count of occurrences.</description>
    </item>
    
    <item>
      <title>Tags for PHP in Vim</title>
      <link>https://robertbasic.com/blog/tags-for-php-in-vim/</link>
      <pubDate>Wed, 09 Mar 2016 22:07:46 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/tags-for-php-in-vim/</guid>
      <description>One thing I was missing for a long time in Vim is to be able to &amp;ldquo;jump to definition&amp;rdquo; in an easy and painless way.
The other thing I wanted to improve is to be able to tell easily where am I actually in the code base; to see the current class and method name of wherever the cursor was.
With a bit of googling and poking around, I finally came up with a perfect combo of 5 plugins (yep, five!</description>
    </item>
    
    <item>
      <title>pugdebug 1.0.0.</title>
      <link>https://robertbasic.com/blog/pugdebug-1-0-0/</link>
      <pubDate>Wed, 01 Jul 2015 15:04:34 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/pugdebug-1-0-0/</guid>
      <description>After 3 months since announcing that I&amp;rsquo;m working on pugdebug, and some 5 months since I actually started working on it, it is finally time to let version 1.0.0 out in the wild.
It&amp;rsquo;s been a busy 3 months: 82 pull requests got merged, 67 issues resolved, more than 350 commits pushed. A lot of changes, fixes and improvements found their way into this first version.
First of all, a big thanks goes out to Ivan Habunek and Srdjan Vranac for helping.</description>
    </item>
    
    <item>
      <title>Introducing pugdebug</title>
      <link>https://robertbasic.com/blog/introducing-pugdebug/</link>
      <pubDate>Wed, 01 Apr 2015 08:35:18 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/introducing-pugdebug/</guid>
      <description>In my spare time in the past few months I was working on a tool that would help
me in my every day job as a PHP programmer. As you may, or may not, know, I&amp;rsquo;m
using vim as my editor/almost IDE, but one thing that is missing from it is the
ability to debug PHP files remotely. Yes, there are a bunch of plugins out
there that add debugging to vim, but none of them felt usable for me.</description>
    </item>
    
    <item>
      <title>Vimprovements</title>
      <link>https://robertbasic.com/blog/vimprovements/</link>
      <pubDate>Thu, 26 Mar 2015 07:38:03 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/vimprovements/</guid>
      <description>One part where I always felt (and still feel) that I could improve on my Vim usage, is when moving around. I don&amp;rsquo;t use the mouse, I don&amp;rsquo;t use the arrow keys, but for a while now I felt that spamming hjkl to get from one place to another is not really efficient. To be honest, it is kind of easy to just press down jjjjjjj &amp;hellip; to move down lines.</description>
    </item>
    
    <item>
      <title>Install PyQt5 in Python 3 virtual environment</title>
      <link>https://robertbasic.com/blog/install-pyqt5-in-python-3-virtual-environment/</link>
      <pubDate>Wed, 04 Feb 2015 07:52:34 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/install-pyqt5-in-python-3-virtual-environment/</guid>
      <description>It&amp;rsquo;s been a while since I last made something with PyQt, so I decided to check out what&amp;rsquo;s it like nowadays. I&amp;rsquo;m curious to see what&amp;rsquo;s new in Qt5 and how does it differ from Qt4. Qt5 also can run under python 3 so I figured to give it a try.
Fedora 21 comes with both python 2.7 and python 3.4, but the default version is 2.7, which means if PyQt5 is installed through the package manager, it will be installed against 2.</description>
    </item>
    
    <item>
      <title>Configuring read-only and read-write access to bitbucket repos</title>
      <link>https://robertbasic.com/blog/configuring-read-only-and-read-write-access-to-bitbucket-repos/</link>
      <pubDate>Fri, 30 Jan 2015 11:17:13 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/configuring-read-only-and-read-write-access-to-bitbucket-repos/</guid>
      <description>Trying to automate things on my server, I ended up needing read-only for one group of my bitbucket repos and read-write access to another group.
On bitbucket, if read-only access is required for a repository, a deployment key can be added for that repository.
Create one ssh key that will be a deployment, read-only key:
user@server$ ssh-keygen -f ~/.ssh/id_rsa_ro -t rsa -C &amp;#34;email@domain.com&amp;#34; and add it to repositories needing read-only access.</description>
    </item>
    
    <item>
      <title>Mocking hard dependencies with Mockery</title>
      <link>https://robertbasic.com/blog/mocking-hard-dependencies-with-mockery/</link>
      <pubDate>Tue, 23 Dec 2014 21:44:32 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/mocking-hard-dependencies-with-mockery/</guid>
      <description>One problem with unit testing legacy applications is that the code has new statements all over the place, instantiating new objects in a way that doesn&amp;rsquo;t really makes it easier to test the code.
Of course, the easy answer to this is &amp;ldquo;Just refactor your application!&amp;quot;, but that&amp;rsquo;s almost always easier said than done.
If refactoring is an option, do it. If not, one option is to use Mockery to mock the hard dependencies.</description>
    </item>
    
    <item>
      <title>Configuring the trackpad and touchpad behaviour for Thinkpad T540p on Fedora 21</title>
      <link>https://robertbasic.com/blog/configuring-the-trackpad-and-touchpad-behaviour-for-thinkpad-t540p-on-fedora-21/</link>
      <pubDate>Mon, 22 Dec 2014 09:26:39 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/configuring-the-trackpad-and-touchpad-behaviour-for-thinkpad-t540p-on-fedora-21/</guid>
      <description>This is the last post about the Thinkpad and Fedora. At least for a while. Promise.
With the new generation of Thinkpads, Lenovo decided to change the touchpad. They removed the 5 physical buttons from the touchpad area and left us with one bigger touchpad. To click anything it&amp;rsquo;s now either touch click (two-finger click for right clicks) or one can push the entire touchpad down, the clickpad. The touchpad has different regions for getting left/middle/right clicks.</description>
    </item>
    
    <item>
      <title>Battery charge thresholds for Thinkpad T540p on Fedora 21</title>
      <link>https://robertbasic.com/blog/battery-charge-thresholds-for-thinkpad-t540p-on-fedora-21/</link>
      <pubDate>Fri, 19 Dec 2014 20:54:40 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/battery-charge-thresholds-for-thinkpad-t540p-on-fedora-21/</guid>
      <description>This week I got myself a new laptop, a Thinkpad T540p. One of the features it has is that the battery&amp;rsquo;s life can be prolonged by setting custom charging thresholds.
The start charge threshold tells the battery to start charging only when the charge drops bellow that limit, and the stop charge threshold tells the battery to stop the charging when the upper limit is reached. I set the start threshold to 40% and the stop threshold to 70%.</description>
    </item>
    
    <item>
      <title>Xdebug and private /tmp on Fedora</title>
      <link>https://robertbasic.com/blog/xdebug-and-private-tmp-on-fedora/</link>
      <pubDate>Tue, 16 Dec 2014 12:10:18 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/xdebug-and-private-tmp-on-fedora/</guid>
      <description>This one was a bit weird and needed some figuring out. Xdebug profiler output files were not being generated in the /tmp directory.
I wanted to do some profiling with xdebug. I set all the necessary configuration settings in my php.ini, restarted apache, confirmed xdebug is present and configured correctly with php -i | grep xdebug, appended ?XDEBUG_PROFILE=1 aaaand! Nothing. Nothing in /tmp, the default profiler output directory. Double checked paths, permissions, nope, nothing.</description>
    </item>
    
    <item>
      <title>Ack in vim</title>
      <link>https://robertbasic.com/blog/ack-in-vim/</link>
      <pubDate>Tue, 09 Dec 2014 20:54:32 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ack-in-vim/</guid>
      <description>I started using vim 3, 4 years ago. The way I use it is that I started out with no plugins and with a handful of lines in .vimrc. It is far too easy to cram all kind of stuff into it and then get lost in the myriads of key combinations. To prevent that, I decided to slowly add in bits and pieces I find lacking in my day to day usage of vim.</description>
    </item>
    
    <item>
      <title>Developer conferences in Croatia</title>
      <link>https://robertbasic.com/blog/developer-conferences-in-croatia/</link>
      <pubDate>Mon, 28 Oct 2013 21:34:04 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/developer-conferences-in-croatia/</guid>
      <description>In the past month and a half I had the pleasure of attending not one, but two developer conferences in Croatia&amp;rsquo;s capital Zagreb. Both conferences are community organized, by people who apparently know what they are doing, as I only have words of praise for them.
ZgPHP ZgPHP was the first conference, held on September 14th. It started out as a regular meetup of the PHP community in Zagreb, but it soon grew out into something bigger.</description>
    </item>
    
    <item>
      <title>Eight years of PHP</title>
      <link>https://robertbasic.com/blog/eight-years-of-php/</link>
      <pubDate>Thu, 04 Apr 2013 23:17:04 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/eight-years-of-php/</guid>
      <description>This time around eight years ago I was introduced to this thing called PHP: Hypertext Preprocessor. I studied it in college as a part of classes on &amp;ldquo;Internet Technologies&amp;rdquo;. It consisted of HTML, CSS, some Javascript and XML, and PHP.
Maybe a half a year earlier my parents finally gave in and agreed to hook up to the Internet via our local ISP. At that time I was mostly hanging out on IRC channels, bulletin boards and the like.</description>
    </item>
    
    <item>
      <title>Learning English</title>
      <link>https://robertbasic.com/blog/learning-english/</link>
      <pubDate>Fri, 29 Mar 2013 18:45:35 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/learning-english/</guid>
      <description>Most of my knowledge of the English language is self-taught. I had English classes in elementary school, but that was more or less singing &#34;London bridge is falling down&#34; and reciting a list of irregular verbs. I also had a semester of English in college, but that again consisted of reciting a list of irregular verbs (true, this time the list was longer) and reading and translating engineering texts. Good for learning how to read a technical manual, but not so much when it comes to having a conversation with other people.</description>
    </item>
    
    <item>
      <title>Saturday night hack - coords</title>
      <link>https://robertbasic.com/blog/saturday-night-hack-coords/</link>
      <pubDate>Sun, 24 Mar 2013 18:31:41 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/saturday-night-hack-coords/</guid>
      <description>When I was just starting out learning programming, everything was so simple. I did not care about design patterns and best practices and unit tests and how will users use that piece of code. Hell, I did not even know those things exist. I was having fun, I was learning, I was free to do whatever I wanted to do, I was playing, I was like a child. Not that there is something wrong caring about those things now, but then I was able to put out a piece of code that was fixing a core of one problem I had and that was it.</description>
    </item>
    
    <item>
      <title>When a package update goes wrong</title>
      <link>https://robertbasic.com/blog/when-a-package-update-goes-wrong/</link>
      <pubDate>Wed, 06 Feb 2013 13:30:36 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/when-a-package-update-goes-wrong/</guid>
      <description>I am running Fedora 17 on my laptop, and yesterday there were some packages to update. Nothing unusual, updates on Fedora are quite frequent and, up until yesterday, there was not a single problem I remember with any update. And it was a small update, four packages in total. What could possibly go wrong, right?
After a reboot an odd thing happened. My laptop did not automatically connect to the wifi.</description>
    </item>
    
    <item>
      <title>Frontend testing with phantomjs and casperjs</title>
      <link>https://robertbasic.com/blog/frontend-testing-with-phantomjs-and-casperjs/</link>
      <pubDate>Tue, 29 Jan 2013 23:22:44 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/frontend-testing-with-phantomjs-and-casperjs/</guid>
      <description>I am not usually fond of doing much frontend stuff, but I do like to dable in some javascript from time to time. Nothing fancy, no node.js, coffeescript and the likes for me. I still feel like making applications on the server side, and have the client just show things to the user. If needed some 3rd party javascript library or framework to make my life easier, and that&amp;rsquo;s about it.</description>
    </item>
    
    <item>
      <title>Gnucash 4.2 with SQLite3 on GNU/Linux</title>
      <link>https://robertbasic.com/blog/gnucash-4-2-with-sqlite3-on-gnu-linux/</link>
      <pubDate>Tue, 22 Jan 2013 16:00:34 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/gnucash-4-2-with-sqlite3-on-gnu-linux/</guid>
      <description>For a while I was trying to figure out how to convert the Gnucash XML file to an SQLite3 database. From version 4.2, Gnucash supports PostrgreSQL, MySQL and SQLite3. Since then, the conversion is apparently simple as choosing File -&amp;gt; Save As &amp;hellip; and picking a different data format. Thing is, my Gnucash instance didn&amp;rsquo;t have that! After some google-fu, turns out I was missing a library called libdbi-dbd-sqlite. After installing the missing library, suddenly the save works as it should.</description>
    </item>
    
    <item>
      <title>A monkey with a banana</title>
      <link>https://robertbasic.com/blog/a-monkey-with-a-banana/</link>
      <pubDate>Tue, 08 Jan 2013 22:12:29 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/a-monkey-with-a-banana/</guid>
      <description>From time to time I browse through the local board shop&amp;rsquo;s website, especially the &amp;ldquo;Longboard&amp;rdquo; section, because, well, I have recently developed this passion for longboarding. Few weeks back, just sometimes before Christmas, I was doing the same. Just casually browsing around, nothing that would catch my interest. And then, there it was, at the bottom of the page. A banana board. &amp;ldquo;Oh my, a real beauty&amp;rdquo;, I thought to myself.</description>
    </item>
    
    <item>
      <title>2012 - &#39;twas a fine year!</title>
      <link>https://robertbasic.com/blog/2012-twas-a-fine-year/</link>
      <pubDate>Tue, 01 Jan 2013 11:19:04 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/2012-twas-a-fine-year/</guid>
      <description>2012 was a real fine year, filled with travel, friends, work, longboards, books. A couple of beers found their way in my belly, too. The best part is that I honestly can&amp;rsquo;t remember that a single bad thing happened this year. Most likely because it didn&amp;rsquo;t. Pure awesomeness.
Can&amp;rsquo;t really remember what I did from January till March, besides working. Odd. I should probably blog more often (HA!) on the things that happen.</description>
    </item>
    
    <item>
      <title>Let&#39;s learn Astronomy!</title>
      <link>https://robertbasic.com/blog/let-s-learn-astronomy/</link>
      <pubDate>Sat, 29 Sep 2012 12:59:28 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/let-s-learn-astronomy/</guid>
      <description>I&#39;ve graduated from Subotica Tech back in 2009., and earned a BsC in electrical engineering, or some such. Even though I had the opportunity to continue my academic studies, I decided that I had enough of schools for a while, and that I should start working. Turns out, that was a pretty smart move from my side, as I ended up working for two years with an awesome team, and later on started my own company, which is now over a year old!</description>
    </item>
    
    <item>
      <title>Unit testing Zend Framework 2 modules</title>
      <link>https://robertbasic.com/blog/unit-testing-zend-framework-2-modules/</link>
      <pubDate>Sat, 15 Sep 2012 15:13:07 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/unit-testing-zend-framework-2-modules/</guid>
      <description>Porting this blog to Zend Framework 2, I decided to write some unit tests as well, while I&amp;rsquo;m at it. Not that the current code base doesn&amp;rsquo;t have unit tests, just it doesn&amp;rsquo;t have much of it&amp;hellip; Anyway, I&amp;rsquo;d like to show how to get unit tests for modules up and running, as well how to throw in Mockery in the mix, as it can help us greatly with mocking out objects.</description>
    </item>
    
    <item>
      <title>Working with custom view helpers in Zend Framework 2</title>
      <link>https://robertbasic.com/blog/working-with-custom-view-helpers-in-zend-framework-2/</link>
      <pubDate>Tue, 11 Sep 2012 21:49:31 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/working-with-custom-view-helpers-in-zend-framework-2/</guid>
      <description>Zend Framework hit a big milestone as version 2 was released last week. Sadly, I didn&amp;rsquo;t have time to contribute to it, or even to poke around it much. I decided to slowly, as time permits, port this blog to ZF2; it should be a good enough learning playground.
I took the skeleton application, made it even skinnier by throwing out some (for me) unneeded parts and just put it all besides my old ZF1 code.</description>
    </item>
    
    <item>
      <title>One hundred kilometers</title>
      <link>https://robertbasic.com/blog/one-hundred-kilometers/</link>
      <pubDate>Thu, 06 Sep 2012 20:06:50 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/one-hundred-kilometers/</guid>
      <description>One hundred and two kilometers, and three hundred-ish meters, to be precise. I just got home from my latest &amp;ldquo;run&amp;quot;, and that is the total number of kilometers I made (and tracked) on my longboard since I got it back in July. Maybe it doesn&amp;rsquo;t sound like much, but if someone would have told me 2-3 months ago, that I would do this much physical activity and actually like it and enjoy it, I would probably tell it&amp;rsquo;s just crazy talk.</description>
    </item>
    
    <item>
      <title>A weekend hack</title>
      <link>https://robertbasic.com/blog/a-weekend-hack/</link>
      <pubDate>Wed, 15 Aug 2012 20:40:05 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/a-weekend-hack/</guid>
      <description>For a while now I couldn&amp;rsquo;t really make myself sit down in my spare time and do some programming just for the sake of programming. I&amp;rsquo;d rather read a book, cruise around on my longboard, or whatever. So, this past weekend I decided to try and &amp;ldquo;hack&amp;rdquo; together something in a weekend. To see can I still just sit down and write a piece of software, just because I like love doing it, and not because it&amp;rsquo;s my job.</description>
    </item>
    
    <item>
      <title>Ljubljana, Slovenia</title>
      <link>https://robertbasic.com/blog/ljubljana-slovenia/</link>
      <pubDate>Mon, 23 Jul 2012 21:36:54 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ljubljana-slovenia/</guid>
      <description>Last week I was on a vacation for a couple of weeks, and decided to spend a couple of days in Slovenia&amp;rsquo;s capital, Ljubljana. The fact that Swizec was on his way home with a car then (he&amp;rsquo;s from Ljubljana, mind you), made the decision easy. Thus, on the 18th of July, I woke up early in the morning, and by 7AM was off on the road for the trip.</description>
    </item>
    
    <item>
      <title>Happy birthday Hex!</title>
      <link>https://robertbasic.com/blog/happy-birthday-hex/</link>
      <pubDate>Wed, 27 Jun 2012 21:24:58 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/happy-birthday-hex/</guid>
      <description>I can&amp;rsquo;t really believe this - but my little company Hex is one year old! I know it sounds cliche, but it really feels like it was last week when I started this&amp;hellip; adventure. It&amp;rsquo;s been one crazy year, that&amp;rsquo;s for sure.
Worked on some interesting and some very interesting projects. Learned a lot, but there&amp;rsquo;s still things to learn and skills to improve.
It was a fun ride so far and will continue to work hard as I really do enjoy all of this - with all of it&amp;rsquo;s ups and downs.</description>
    </item>
    
    <item>
      <title>Using the new autoloaders from Zend Framework 1.12</title>
      <link>https://robertbasic.com/blog/using-the-new-autoloaders-from-zend-framework-1-12/</link>
      <pubDate>Fri, 22 Jun 2012 11:10:02 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/using-the-new-autoloaders-from-zend-framework-1-12/</guid>
      <description>The latest, and last, release of the Zend Framework 1.x series is just around the corner as ZF 1.12.0RC1 was announced this week. As I still have projects running ZF1 I thought about giving the most interesting new feature (for me) a spin - the new autoloaders which are backported from ZF2.
Note: the code below was updated to work with ZF 1.12.0RC2. Should still work with RC1, too.
I decided using the classmap autoloader as the main autoloader, and the good ol&amp;rsquo; standard autoloader as the fallback autoloader.</description>
    </item>
    
    <item>
      <title>Automatically upload screenshots in XFCE4</title>
      <link>https://robertbasic.com/blog/automatically-upload-screenshots-in-xfce4/</link>
      <pubDate>Mon, 13 Feb 2012 21:58:16 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/automatically-upload-screenshots-in-xfce4/</guid>
      <description>XFCE4 has a nice little tool for making screenshots - xfce4-screenshooter. My only gripe with it is that it can&amp;rsquo;t automatically upload the images to a server and give me the URL to the image (to be honest, it can, but it uploads the images to a shady looking website, and I don&amp;rsquo;t like that). And then one day I saw Evan Coury&amp;rsquo;s GtkGrab - a set of scripts which does exactly what I want!</description>
    </item>
    
    <item>
      <title>Zend Framework full page cache tips</title>
      <link>https://robertbasic.com/blog/zend-framework-full-page-cache-tips/</link>
      <pubDate>Sat, 11 Feb 2012 10:06:14 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/zend-framework-full-page-cache-tips/</guid>
      <description>When I started rewriting this blog, I knew from start that I want to use Zend Framework&amp;rsquo;s full page caching,
as, I think, that&amp;rsquo;s the best cache for this purpose. Not much going on on the front end, much more reads than writes, no ajax or any other &amp;quot;dynamic&amp;quot; content. While implementing the cache, I ran into two issues.
The
first problem was that the cache files were created, but they were never valid - on each request a new cache file was created.</description>
    </item>
    
    <item>
      <title>Xdebug is full of awesome</title>
      <link>https://robertbasic.com/blog/xdebug-is-full-of-awesome/</link>
      <pubDate>Mon, 30 Jan 2012 13:13:22 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/xdebug-is-full-of-awesome/</guid>
      <description>I&amp;rsquo;m currently trying to fix a Mockery bug and, while deep in the code, I came across a piece of code which gets eval&amp;rsquo;d. Mainly to understand better what&amp;rsquo;s going on, I wanted to step debug it. I first set a breakpoint before the eval call and then tried to step into the eval&amp;rsquo;d code, but that didn&amp;rsquo;t work out, Netbeans just moves along to the next line.
What did work, is setting a xdebug_break() call inside of the code that will be eval&amp;rsquo;d - and BAM!</description>
    </item>
    
    <item>
      <title>Creating a chat bot with PHP and Dbus</title>
      <link>https://robertbasic.com/blog/creating-a-chat-bot-with-php-and-dbus/</link>
      <pubDate>Sun, 08 Jan 2012 19:22:52 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/creating-a-chat-bot-with-php-and-dbus/</guid>
      <description>Now that we know how to use DBus to communicate with Pidgin from PHP and how to listen to DBus signals, it&amp;rsquo;s time to put it all together by creating a simple chat bot! Nothing fancy, just a simple script that runs somewhere on some server and, by using a Pidgin account, can respond to some basic queries we send it.
What did we get? As we want our script to receive messages from an other account, first we need to listen to the ReceivedImMsg event on the im.</description>
    </item>
    
    <item>
      <title>A year in review: 2011</title>
      <link>https://robertbasic.com/blog/a-year-in-review-2011/</link>
      <pubDate>Sun, 01 Jan 2012 11:13:48 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/a-year-in-review-2011/</guid>
      <description>2011 has been and gone, all in all an excellent year for me; much better than the few clusterfuck years before. Going into 2012 with tons of positive energy and going to make it even better!
Sadly, not everything was perfect. In October my grandmother and one of my uncles passed away. Around the same time my Dad&amp;rsquo;s shop was robbed, twice. That was a tough period for my parents and the entire family, still not over it completely, but not giving up either!</description>
    </item>
    
    <item>
      <title>Notes on shell scripting</title>
      <link>https://robertbasic.com/blog/notes-on-shell-scripting/</link>
      <pubDate>Thu, 29 Dec 2011 09:02:12 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/notes-on-shell-scripting/</guid>
      <description>Yesterday I did some shell scripting and thought about writing down the few things learned along the way. Amazing how little needs to be done to learn a lot :)
Result of a command to a variable First thing I learned is how to &amp;ldquo;save&amp;rdquo; the result of a shell command to a local variable:
PHP_BINPATH=$(which php) By enclosing the command in parenthesis and putting a dollar sign in front of it, will put the result of that command in the variable.</description>
    </item>
    
    <item>
      <title>Listening to Dbus signals with PHP</title>
      <link>https://robertbasic.com/blog/listening-to-dbus-signals-with-php/</link>
      <pubDate>Mon, 26 Dec 2011 13:50:17 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/listening-to-dbus-signals-with-php/</guid>
      <description>In my previous post I described (tried, at least) how to communicate with Pidgin from PHP, by using the Dbus PHP extension.
The good part is that not can we only call different methods against Pidgin&amp;rsquo;s libpurple API, we can also listen to different signals on different events, that are sent via Dbus. Some of the events that are signalled are when a chat message is recieved, a friend comes online, a file is sent, or any other from a list of some 110 different events.</description>
    </item>
    
    <item>
      <title>Configuring 2 monitors with xrandr</title>
      <link>https://robertbasic.com/blog/configuring-2-monitors-with-xrandr/</link>
      <pubDate>Sun, 25 Dec 2011 16:47:11 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/configuring-2-monitors-with-xrandr/</guid>
      <description>My current, most used set up, includes a laptop and a second screen attached to it. The laptop is always to the left of the second monitor and together they give one big screen with a total resolution of 3046x1050. From time to time, X11 gets confused and shows the same image, with the same resolution, on both monitors.
The tool which can help fix this is xrandr.
First, query X11 to find out what monitors there are:</description>
    </item>
    
    <item>
      <title>A quick note on Dojo&#39;s data grids and dojox.data.HtmlStore</title>
      <link>https://robertbasic.com/blog/a-quick-note-on-dojos-data-grids-and-dojox-data-htmlstore/</link>
      <pubDate>Fri, 23 Dec 2011 21:52:10 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/a-quick-note-on-dojos-data-grids-and-dojox-data-htmlstore/</guid>
      <description>I&amp;rsquo;m spending this day trying to create an &amp;ldquo;universal&amp;rdquo; administration dashboard with which I&amp;rsquo;ll finally be happy with. I&amp;rsquo;m using Dojo to spice up the UI, because I think it&amp;rsquo;s awesome and it has a lot of stuff in it and plays well with Zend Framework. This post is dedicated to the future stupid me.
Anyway, when using dojox.data.HtmlStore as a store for a dojox.data.DataGrid (or any other grid, really), pay attention to the definition of the columns structure which is passed to the grid.</description>
    </item>
    
    <item>
      <title>Communicating with Pidgin from PHP via D-Bus</title>
      <link>https://robertbasic.com/blog/communicating-with-pidgin-from-php-via-d-bus/</link>
      <pubDate>Sun, 18 Dec 2011 21:10:43 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/communicating-with-pidgin-from-php-via-d-bus/</guid>
      <description>Earlier this week I got an idea of trying to communicate with Pidgin, a chat client, via the terminal. Sounded like a fun thing to hack on, plus, could be made useful (in my head, at least), for things like logging from a web application directly to IM, or, heck, even creating something like Github&amp;rsquo;s Hubot, commanding a server or an application just via chat. Surely I wasn&amp;rsquo;t the first one to come up with this idea and after a bit of a googling found out that Pidgin&amp;rsquo;s libpurple has a nice API for that, exposed via D-Bus.</description>
    </item>
    
    <item>
      <title>Upgrading to Fedora 16</title>
      <link>https://robertbasic.com/blog/upgrading-to-fedora-16/</link>
      <pubDate>Sat, 12 Nov 2011 20:39:49 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/upgrading-to-fedora-16/</guid>
      <description>Decided today to upgrade my laptop to Fedora 16, which was released a few days ago. I first switched to Fedora (with XFCE as the desktop environment) from Ubuntu in August, I think. An excellent decision as it is working really great for me. XFCE is also great, really happy that I made this switch.
Anyway, the upgrade from Fedora 15 to 16 went smoothly (although a bit slow, thanks to my shitty internet connection), using the PreUpgrade script/process.</description>
    </item>
    
    <item>
      <title>Contributing to Zend Framework 2</title>
      <link>https://robertbasic.com/blog/contributing-to-zend-framework-2/</link>
      <pubDate>Thu, 10 Nov 2011 19:51:16 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/contributing-to-zend-framework-2/</guid>
      <description>Today a pretty big news hit the interwebs: as of today, the CLA is not required any more to contribute to Zend Framework 2! This means anyone can issue pull requests and submit patches to the new version. Note that if you want to contribute to Zend Framework 1, you still need a signed CLA. I&amp;rsquo;ve decided to write a quick post with additional information and links, to make it easier getting started with the contributions!</description>
    </item>
    
    <item>
      <title>Benchmarking pages behind a login with ab</title>
      <link>https://robertbasic.com/blog/benchmarking-pages-behind-a-login-with-ab/</link>
      <pubDate>Wed, 09 Nov 2011 21:27:50 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/benchmarking-pages-behind-a-login-with-ab/</guid>
      <description>Tonight I decided to relax a bit and what better way of relaxing is there for a geek then to do some bash scripting?! So for fun and no profit I decided to try and benchmark pages with ab, Apache HTTP server benchmarking tool, which are behind a login. Turns out, it&amp;rsquo;s pretty easy after reading some man pages ;)
ab&#39;s help pages gives a few possible leads. We can POST data with the -p option, which would be great if we would like to benchmark the login process itself.</description>
    </item>
    
    <item>
      <title>A Zend Framework 2 EventManager use case</title>
      <link>https://robertbasic.com/blog/azend-framework-2-eventmanager-use-case/</link>
      <pubDate>Wed, 19 Oct 2011 22:31:31 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/azend-framework-2-eventmanager-use-case/</guid>
      <description>With Zend Framework 2 beta 1 released yesterday and some free time to spare, I decided to finally try and tackle one of the &amp;ldquo;scariest&amp;rdquo; additions to the Zend Framework - the EventManager component. Now, I won&amp;rsquo;t go into details about this whole event voodoo, Matthew already did that. Twice.
Basically, this allows us to have one piece of code to trigger an event and to have one or more listeners listening to this event.</description>
    </item>
    
    <item>
      <title>Webkonf 2011 recap</title>
      <link>https://robertbasic.com/blog/webkonf-2011-recap/</link>
      <pubDate>Mon, 10 Oct 2011 08:38:41 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/webkonf-2011-recap/</guid>
      <description>This past weekend the Hungarian web conference was held in the amazing Buda Castle, in Budapest. It was a one day conference, with talks being held on 3 tracks, all in all 21 talk. This was my first time here and I attended as a speaker with a talk on Zend Framework 2 (more on that later).
The conference was great, and, as per the organizers, attended by more than 700 people!</description>
    </item>
    
    <item>
      <title>Speaking at Webkonf 2011</title>
      <link>https://robertbasic.com/blog/speaking-at-webkonf-2011/</link>
      <pubDate>Mon, 12 Sep 2011 07:30:39 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/speaking-at-webkonf-2011/</guid>
      <description>I&amp;rsquo;ll be giving a talk at this year&amp;rsquo;s Hungarian Web Conference, Webkonf, which will be held on October 8th in Budapest. The topic of the talk is Zend Framework 2 and with the recent happenings in the framework world and in the community (thanks Paddy!), it will be both interesting and challenging to create a talk worth listening :) Oh, and I&amp;rsquo;ll be presenting in Hungarian :)
If you&amp;rsquo;ll be there, I&amp;rsquo;d like to meet you :) I&amp;rsquo;ll be in Budapest from Friday the 7th, till Sunday the 9th.</description>
    </item>
    
    <item>
      <title>Defining multiple security rules in XML format for Symfony2</title>
      <link>https://robertbasic.com/blog/defining-multiple-security-rules-in-xml-format-for-symfony2/</link>
      <pubDate>Thu, 25 Aug 2011 10:55:34 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/defining-multiple-security-rules-in-xml-format-for-symfony2/</guid>
      <description>This one falls into a category of bogus Symfony2 documentation. Or inconsistent behavior. Or whatever. It&amp;rsquo;s a bit frustrating.
I&amp;rsquo;ve chosen to use XML to define different settings across my sf2 apps: routing, ORM, services and of course security.
Symfony2&amp;rsquo;s security stuff let&amp;rsquo;s you define rules based on URL matching witch is, to some extent, explained in the documentation. The examples for YAML works fine, but for XML it&amp;rsquo;s kinda bogus.</description>
    </item>
    
    <item>
      <title>Importing Symfony2 security settings from a bundle</title>
      <link>https://robertbasic.com/blog/importing-symfony2-security-settings-from-a-bundle/</link>
      <pubDate>Thu, 25 Aug 2011 09:00:39 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/importing-symfony2-security-settings-from-a-bundle/</guid>
      <description>I started to work on/figuring out the security part in Symfony2 and one part where the docs fail so far is to explain how to import security settings from a bundle.
Once I put some thinking into it, it&amp;rsquo;s pretty easy actually. Simply import the needed security file in your main config file. Something like this will work:
# app/config/config.yml imports: - { resource: parameters.ini } - { resource: &amp;#39;@AcmeDemoBundle/Resources/config/security.xml&amp;#39; } where the security.</description>
    </item>
    
    <item>
      <title>Debugging two PHP projects in Netbeans at the same time</title>
      <link>https://robertbasic.com/blog/debugging-two-php-projects-in-netbeans-at-the-same-time/</link>
      <pubDate>Fri, 19 Aug 2011 08:48:54 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/debugging-two-php-projects-in-netbeans-at-the-same-time/</guid>
      <description>I&amp;rsquo;m currently working on some Symfony2 bundles and I have one Netbeans project for the main Symfony2 app and one project for the bundle. The bundle files are completely separated from the app and they are just linked (ln -s) together. It works great, except for the case when I need to debug some part of the bundle&amp;rsquo;s code with Netbeans + xdebug. The debugger starts for the &amp;ldquo;main&amp;rdquo; project, which is the Symfony2 app, but setting breakpoints with Netbeans (y&amp;rsquo;know, by clicking the line number) for the bundle doesn&amp;rsquo;t really work, as those are in the other project and not in the debugged one, rendering the whole debugging useless.</description>
    </item>
    
    <item>
      <title>Haircut</title>
      <link>https://robertbasic.com/blog/haircut/</link>
      <pubDate>Thu, 11 Aug 2011 11:52:53 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/haircut/</guid>
      <description>So, I got a haircut after 8 years.
This is the result. If you want, have a look at the whole album here: There, I fix&amp;rsquo;d it
I think it turned out pretty damn good.</description>
    </item>
    
    <item>
      <title>Changing Jenkins&#39; home directory on Ubuntu</title>
      <link>https://robertbasic.com/blog/changing-jenkins-home-directory-on-ubuntu/</link>
      <pubDate>Thu, 04 Aug 2011 08:19:25 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/changing-jenkins-home-directory-on-ubuntu/</guid>
      <description>I&amp;rsquo;ve started to play around with Jenkins yesterday and I kinda don&amp;rsquo;t like that it&amp;rsquo;s default home directory is /var/lib/jenkins so I changed it to /home/jenkins, so I&amp;rsquo;m throwing the steps needed out here for future reference.
First, stop jenkins:
robert@odin:~$ sudo /etc/init.d/jenkins stop Create the new home directory and move existing stuff from the old home to the new one:
robert@odin:~$ sudo usermod -m -d /home/jenkins jenkins Now, I didn&amp;rsquo;t manage to set the ENV JENKINS_HOME to the new home, it was always using the old one, so I edited the init.</description>
    </item>
    
    <item>
      <title>Helping out with Zend Framework 2</title>
      <link>https://robertbasic.com/blog/helping-out-with-zend-framework-2/</link>
      <pubDate>Wed, 27 Jul 2011 19:45:24 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/helping-out-with-zend-framework-2/</guid>
      <description>OK, here are some tips and resources so you can start helping out and contributing to Zend Framework 2.0 :)
First, here&amp;rsquo;s a nice wiki page with some links on how to start with Zend Framework 2. Be sure to check out the Zend Framework 2.0 patterns tutorial slides and the webinar on the same topic (you need to log in to watch it, but the registration is free, so no excuses).</description>
    </item>
    
    <item>
      <title>Debugging Zend Framework unit tests with Xdebug and NetBeans</title>
      <link>https://robertbasic.com/blog/debugging-zend-framework-unit-tests-with-xdebug-and-netbeans/</link>
      <pubDate>Sun, 24 Jul 2011 13:38:20 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/debugging-zend-framework-unit-tests-with-xdebug-and-netbeans/</guid>
      <description>I&amp;rsquo;ve spent this weekend hacking on some unit tests for Zend\Dojo and I ran into an issue where I need Xdebug to, well, debug. Note, that this is not for debugging a Zend Framework application, but for debugging Zend Framework itself. I am using Netbeans + Xdebug to debug regular code, but debugging unit tests was something completely new for me. Turns out, it&amp;rsquo;s not entirely different from &amp;ldquo;regular&amp;rdquo; debugging.</description>
    </item>
    
    <item>
      <title>Announcing Hex</title>
      <link>https://robertbasic.com/blog/announcing-hex/</link>
      <pubDate>Mon, 04 Jul 2011 07:22:31 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/announcing-hex/</guid>
      <description>Well, guess it&amp;rsquo;s time to announce it officially here, too. Since last month I&amp;rsquo;m running my own little web development company called Hex. After 2 years with the online_team, it was time to move on and turn to new adventures.
The plan is simple and that&amp;rsquo;s to continue to work on things I love: work with PHP and contribute to open source. The rest will be figured out along the way.</description>
    </item>
    
    <item>
      <title>Book review - Guide to Web Scraping with PHP</title>
      <link>https://robertbasic.com/blog/book-review-guide-to-web-scraping-with-php/</link>
      <pubDate>Wed, 25 May 2011 19:38:12 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/book-review-guide-to-web-scraping-with-php/</guid>
      <description>It took me a while to grab myself a copy of Matthew Turland&amp;rsquo;s &amp;ldquo;Guide to Web Scraping with PHP&amp;rdquo;, but a few weeks ago a copy finally arrived and I had the pleasure of reading it. I planned to buy it right as the print copy was announced, but then realised that php|arch accepts only PayPal as the payment method, which doesn&amp;rsquo;t work from Serbia, so I had to postpone the shopping for some better times.</description>
    </item>
    
    <item>
      <title>New adventures ahead!</title>
      <link>https://robertbasic.com/blog/new-adventures-ahead/</link>
      <pubDate>Mon, 23 May 2011 18:54:47 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/new-adventures-ahead/</guid>
      <description>After a month or two of pondering and thinking and planning and thinking and some more thinking, today I finally told the management at work that I&amp;rsquo;ll be leaving in a month from today. Actually, I won&amp;rsquo;t be extending my contract with them which will end on June 24th.
Why? I don&amp;rsquo;t like the road the leadership of the company has taken (if this can be called a road at all&amp;hellip;), the amount of energy the whole team is wasting on some small and silly things, the fact that extra effort is not recognised, thanked or paid and that there&amp;rsquo;s currently 8 of us in a roughly 25 m^2 room.</description>
    </item>
    
    <item>
      <title>DORS/CLUC 2011 recap</title>
      <link>https://robertbasic.com/blog/dorscluc-2011-recap/</link>
      <pubDate>Wed, 18 May 2011 08:59:37 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/dorscluc-2011-recap/</guid>
      <description>This year&amp;rsquo;s DORS/CLUC has been and gone, 18th in the row for the organisers, first one (but not the last!) for me. For those of you who not know, DORS/CLUC is a conference about GNU/Linux and open source, which took place in the nice town of Zagreb, Croatia, in one of the auditoriums of FER (Faculty of electronics and computer science). I attended the conference as a speaker with a lightning talk on PHPPlaneta.</description>
    </item>
    
    <item>
      <title>Grouping Zend Framework controllers in subdirectories</title>
      <link>https://robertbasic.com/blog/grouping-zend-framework-controllers-in-subdirectories/</link>
      <pubDate>Sat, 16 Apr 2011 07:29:57 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/grouping-zend-framework-controllers-in-subdirectories/</guid>
      <description>Thanks to a discussion on the Zend Framework mailing list I learned about a new feature, a feature that allows for grouping action controllers in subdirectories! Well, this is more of an unknown and undocumented feature than new, as it is the part of the framework for at least 3 years.
Why am I so hyped about this? Because it allows for better code organisation on larger projects. Heck, it might be useful on smaller ones too.</description>
    </item>
    
    <item>
      <title>A hack for Zend Framework&#39;s translated route segments</title>
      <link>https://robertbasic.com/blog/zend-frameworks-translated-route-segments-hack/</link>
      <pubDate>Thu, 14 Apr 2011 16:47:31 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/zend-frameworks-translated-route-segments-hack/</guid>
      <description>Today I came across on a little &amp;ldquo;gotcha&amp;rdquo; when using the translated route segments in a multilanguage web site and thought about sharing the dirty little hack I used to get around it.
Note: I&amp;quot;ve changed the title on this post. The first one sounded a bit like that ZF code itself contains a hack and not that I wrote a hack to solve a particular problem of mine. Sorry about that.</description>
    </item>
    
    <item>
      <title>Speaking at DORS/CLUC 2011</title>
      <link>https://robertbasic.com/blog/speaking-at-dorscluc-2011/</link>
      <pubDate>Tue, 12 Apr 2011 05:39:30 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/speaking-at-dorscluc-2011/</guid>
      <description>DORS/CLUC is a conference about GNU/Linux and everything open source which takes place in Zagreb, Croatia, on May 16-18. I sent two talk proposals and both got accepted! Yey! The first talk will about PHPPlaneta.net, the story behind it, the ideas, the plans&amp;hellip; The second talk will be an introduction to Zend Framework. I know, zf2 is right behind the corner with all it&amp;rsquo;s PHP5.3 goodness, but we are still, and unfortunately will be for a while, stuck with hosting providers running php5.</description>
    </item>
    
    <item>
      <title>pecl install apc fails on Ubuntu</title>
      <link>https://robertbasic.com/blog/pecl-install-apc-fails-on-ubuntu/</link>
      <pubDate>Sun, 10 Apr 2011 10:29:58 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/pecl-install-apc-fails-on-ubuntu/</guid>
      <description>I was just installing APC on an Ubuntu server (what else to do on a Sunday morning?) with the standard set of commands:
sudo apt-get install php-pear php5-dev sudo pecl install apc but the pecl install apc died with a bunch of &amp;ldquo;/tmp/pear/temp/APC/apc.c:430: error: &amp;ldquo;apc_regex&amp;rdquo; has no member named &amp;ldquo;preg&amp;rdquo;&amp;rdquo; and similar messages. Luckily, I can use google which led me to this serverfault answer: I was missing the &amp;ldquo;libpcre3-dev&amp;rdquo; package.</description>
    </item>
    
    <item>
      <title>Installing FreeBSD 8.2</title>
      <link>https://robertbasic.com/blog/installing-freebsd-8-2/</link>
      <pubDate>Sun, 27 Mar 2011 18:18:38 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/installing-freebsd-8-2/</guid>
      <description>As I&amp;rsquo;m currently in the progress of installing FreeBSD on my first machine (out of 4), writing the process down for future reference sounds like a pretty good idea :)
I&amp;rsquo;ve installed it from the CD image. The installation process was straightforward, altho either the boot loader or freebsd was getting confused in the first few attempts because I was installing it on the slave HDD. After installing it on the master, everything went fine.</description>
    </item>
    
    <item>
      <title>PHP User Group, Novi Sad, Serbia</title>
      <link>https://robertbasic.com/blog/php-user-group-novi-sad-serbia/</link>
      <pubDate>Thu, 24 Mar 2011 09:55:27 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/php-user-group-novi-sad-serbia/</guid>
      <description>For almost a year now, whenever time allows it, I&amp;rsquo;m working on a side project of creating a community of PHP programmers from around here. One of the first steps was, is, a website called PHPPlaneta about which I wrote back in October. After bringing this website to a relatively steady position, time has come to take another step: creating a PHP User Group! I&amp;rsquo;m really good at naming things so it is called &amp;ldquo;PHP User Group Novi Sad&amp;rdquo;, or pugns for short.</description>
    </item>
    
    <item>
      <title>Contributing to open source</title>
      <link>https://robertbasic.com/blog/contributing-to-open-source/</link>
      <pubDate>Thu, 17 Mar 2011 19:49:37 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/contributing-to-open-source/</guid>
      <description>Often times people ask me why do I contribute to open source, why do I &amp;ldquo;waste money and time&amp;rdquo; on free stuff when I could easily do the same thing for money? Don&amp;rsquo;t have I enough of staring at the computer at work where, well, I do the same thing - hack on code? Ummm. No.
Honestly, I don&amp;rsquo;t earn much. Enough for the rent, bills, food, but giving the fact that I don&amp;rsquo;t have a family, it&amp;rsquo;s enough for me, for now.</description>
    </item>
    
    <item>
      <title>Multiple Dojo tooltips on page load</title>
      <link>https://robertbasic.com/blog/multiple-dojo-tooltips-on-page-load/</link>
      <pubDate>Tue, 15 Mar 2011 20:41:42 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/multiple-dojo-tooltips-on-page-load/</guid>
      <description>As I said a few days (weeks?) ago, I&amp;rsquo;ve decided to learn dojo and not by just doing random examples, but by changing the whole administration panel for phpplaneta.net to use dojo and the Zend_Dojo_* components. Maybe it&amp;rsquo;ll become a bit more usable and prettier :)
Fast forward a few hours into this journey of dojos and dijits and I found myself hacking and extending it just to make it work and behave like I want it to.</description>
    </item>
    
    <item>
      <title>Ideas of March</title>
      <link>https://robertbasic.com/blog/ideas-of-march/</link>
      <pubDate>Tue, 15 Mar 2011 18:20:23 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ideas-of-march/</guid>
      <description>Apparently there&amp;rsquo;s this new movement in the PHP community, &amp;quot;Ideas of March&amp;quot;, where we all pledge that we will blog more about PHP and web dev and the community in general. So here I am, doing the same :)
This will be a real test for me because for the 2 and a half years of this blog I&amp;rsquo;ve published merely 60 posts. Why? Mostly because I was (am?) scared to just write more about things I&amp;rsquo;m interested in.</description>
    </item>
    
    <item>
      <title>Playing with Zend Framework and Dojo</title>
      <link>https://robertbasic.com/blog/playing-with-zend-framework-and-dojo/</link>
      <pubDate>Wed, 02 Mar 2011 07:14:18 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/playing-with-zend-framework-and-dojo/</guid>
      <description>Yesterday there was some talk on Twitter including Zend Framework and Dojo. I didn&amp;rsquo;t quite follow it through, something about why Dojo and not jQuery, it&amp;rsquo;s not that popular blablabla. Anyway, who cares? We have Zend_Dojo, we have ZendX_Jquery. I&amp;rsquo;m using ZendX_Jquery, but only as far as setting it up and loading jquery and jqueryui via the view helpers. Tried to use it on forms, to use tabs and whatnot, but in the end it was easier to write up a separate javascript file and do the jquery stuff there.</description>
    </item>
    
    <item>
      <title>Change permissions on folders/files only</title>
      <link>https://robertbasic.com/blog/change-permissions-on-folders-files-only/</link>
      <pubDate>Tue, 11 Jan 2011 21:45:52 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/change-permissions-on-folders-files-only/</guid>
      <description>This is just a quick reminder for myself. Should really remember this one. Changes permissions on folders|files only.
$ find /path/to -type d -exec chmod 775 {} \; $ find /path/to -type f -exec chmod 664 {} \; </description>
    </item>
    
    <item>
      <title>A real gem - PHP_CompatInfo</title>
      <link>https://robertbasic.com/blog/a-real-gem-php_compatinfo/</link>
      <pubDate>Mon, 27 Dec 2010 20:25:06 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/a-real-gem-php_compatinfo/</guid>
      <description>Last night I was pondering how nice would it be to have a tool of some sort, that would simply spit out what version of PHP does my app require. Something like: here are my .php files, what PHP version and/or extensions do I need for it? First I thought about jumping right in and writing it myself, but hey, this kind of a tool sounds way to useful not to be written already!</description>
    </item>
    
    <item>
      <title>Passing arguments to custom slots in PyQt</title>
      <link>https://robertbasic.com/blog/passing-arguments-to-custom-slots-in-pyqt/</link>
      <pubDate>Tue, 30 Nov 2010 21:52:06 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/passing-arguments-to-custom-slots-in-pyqt/</guid>
      <description>While hacking on ape, I came to a situation where I need to pass some arguments to a custom defined slot. The slot is being called from different signals, one where the argument is passed by PyQt itself and a second one where I need to programmatically pass the argument to the slot.
First I tried with something like:
action = QAction(&amp;#34;My action&amp;#34;, parent) action.triggered.connect(my_slot(my_argument)) which ended in an error: TypeError: connect() slot argument should be a callable or a signal, not &amp;lsquo;NoneType&#39;</description>
    </item>
    
    <item>
      <title>Connecting signals and slots with PyQt - the new style</title>
      <link>https://robertbasic.com/blog/connecting-signals-and-slots-with-pyqt-the-new-style/</link>
      <pubDate>Tue, 09 Nov 2010 17:53:35 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/connecting-signals-and-slots-with-pyqt-the-new-style/</guid>
      <description>While working on ape I had a problem with figuring out how to properly connect a signal to a slot, where the signal is emitted by a QTreeView widget. As this is not my first app with python and pyqt, I was doing something like (this is, btw, the &amp;ldquo;old style&amp;rdquo;):
self.connect(widget, SIGNAL(&amp;#34;emitted_signal()&amp;#34;), self.my_slot) but it simply didn&amp;rsquo;t work. Nothing happened. I was trying all different of connect/signal/slot combinations but everything was just dead silent.</description>
    </item>
    
    <item>
      <title>ape is a PHP editor</title>
      <link>https://robertbasic.com/blog/ape-is-a-php-editor/</link>
      <pubDate>Sat, 06 Nov 2010 21:42:58 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ape-is-a-php-editor/</guid>
      <description>A week ago I started working on a simple editor/IDE for PHP called ape. That&amp;rsquo;s my weak try on creating a reverse acronym as ape stands for - ape is a PHP editor. This is kind of an introductory post into the whole developing process of it, as my intention is to blog about it a bit more :)
Why? First, to answer the question everyone is giving me when I mention I&amp;rsquo;m writing ape:</description>
    </item>
    
    <item>
      <title>Backup script for mysql</title>
      <link>https://robertbasic.com/blog/backup-script-for-mysql/</link>
      <pubDate>Fri, 05 Nov 2010 12:21:56 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/backup-script-for-mysql/</guid>
      <description>This post is more of a reminder for myself. Anywayz, a little bash script that backups a database, gzipit and deletes all backups older than 3 days.
#!/bin/bash  DBUSER=&amp;#34;user&amp;#34; DBPASS=&amp;#34;pass&amp;#34; DBDB=&amp;#34;dbname&amp;#34; NOW=$(date +&amp;#34;%Y-%m-%d-%H-%M-%S&amp;#34;) BACKUPROOTDIR=&amp;#34;/tmp&amp;#34; BACKUPSQL=&amp;#34;$BACKUPROOTDIR/mysqlbackup-$NOW.sql&amp;#34; BACKUPGZIP=&amp;#34;$BACKUPSQL.gz&amp;#34; mysqldump -u$DBUSER -p$DBPASS $DBDB &amp;gt; &amp;#34;$BACKUPSQL&amp;#34; gzip -c $BACKUPSQL &amp;gt; $BACKUPGZIP rm $BACKUPSQL find $BACKUPROOTDIR -type f -name &amp;#34;mysqlbackup\*&amp;#34; -mtime +3 | xargs rm Kudos to @zsteva for looking at it to spot any errors I might have made.</description>
    </item>
    
    <item>
      <title>A regional PHP community website</title>
      <link>https://robertbasic.com/blog/a-regional-php-community-website/</link>
      <pubDate>Sat, 16 Oct 2010 20:29:35 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/a-regional-php-community-website/</guid>
      <description>This week on Wednesday, finally one of my pet projects has hit the Internets! PHPPlaneta.net is alive!
It&amp;rsquo;s idea is to be a community website for PHP programmers from Serbia and other countries from the region. The idea for this website &amp;ldquo;hit&amp;rdquo; me somewhere in April or May I think, while I was lurking the interwebs for some, any PHP communities in the region, user groups, anything really, where local PHP programmers could share ideas, news, interests, etc.</description>
    </item>
    
    <item>
      <title>Loading custom module plugins</title>
      <link>https://robertbasic.com/blog/loading-custom-module-plugins/</link>
      <pubDate>Tue, 20 Jul 2010 12:24:28 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/loading-custom-module-plugins/</guid>
      <description>OK, here&amp;rsquo;s a quicky one from the office :P
I was trying to load a Front Controller plugin which resides in app/modules/my_module/controllers/plugins/ and not in the &amp;ldquo;usual&amp;rdquo; lib/My_App/Plugin/. I want this plugin to be called in every request and I want the plugin file to be under it&amp;rsquo;s &amp;ldquo;parent&amp;rdquo; module.
Here&amp;rsquo;s what I did: added the path to the plugin and it&amp;rsquo;s namespace to the Zend_Application_Module_Autoloader as a new resource type and then just register the plugin in the front controller in an other _init method.</description>
    </item>
    
    <item>
      <title>Moved</title>
      <link>https://robertbasic.com/blog/moved/</link>
      <pubDate>Sun, 11 Jul 2010 11:58:18 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/moved/</guid>
      <description>As I said 2 weeks earlier, I decided to move my stuff over to linode. Well, I did it. Kinda.
First step was to change the nameservers of the domain. I thought it&amp;rsquo;s gonna take a while, so I took my time with moving the files and the database, but (at least on my end) the dns changes were alive and kickin&amp;rsquo; under an hour.
My original idea was to run everything on nginx, but that soon turned out to be a bad idea cause there was no way I could setup properly the rewriting - if PHP was working right, CSS was broken.</description>
    </item>
    
    <item>
      <title>I&#39;ll be moving soon...</title>
      <link>https://robertbasic.com/blog/ill-be-moving-soon/</link>
      <pubDate>Sun, 27 Jun 2010 17:11:45 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ill-be-moving-soon/</guid>
      <description>Just a little heads up to all of you who stumble upon this place: I&amp;rsquo;ll be moving servers and stuff in the coming month to linode and most likely there&amp;rsquo;ll be some downtimes and fuckups so just thought to let you all know (this sounds like there&amp;rsquo;s someone reading this blog at all, heh).
Hope I won&amp;rsquo;t forget to make backups.</description>
    </item>
    
    <item>
      <title>Quick Netbeans tip - task filters</title>
      <link>https://robertbasic.com/blog/quick-netbeans-tip-task-filters/</link>
      <pubDate>Tue, 27 Apr 2010 19:45:48 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/quick-netbeans-tip-task-filters/</guid>
      <description>I&amp;rsquo;m using Netbeans as my main IDE for PHP and Python projects for over a year now, yet only now I have stumbled upon this feature - creating filters for tasks that show up in the &amp;ldquo;Tasks&amp;rdquo; window (Ctrl+6 shortcut to show/hide the window).
To be honest, I wasn&amp;rsquo;t even using it (until now), cause, by default it shows all the todo-s and issues from all the files from the current project.</description>
    </item>
    
    <item>
      <title>Honeypot for Zend Framework</title>
      <link>https://robertbasic.com/blog/honeypot-for-zend-framework/</link>
      <pubDate>Wed, 21 Apr 2010 10:43:14 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/honeypot-for-zend-framework/</guid>
      <description>I just hacked up a little code snippet based on Matthew&amp;rsquo;s Honeypot Wordpress plugin. It&amp;rsquo;s basically just a Validator for a Zend Form element which is hidden from the user via CSS. Cause it&amp;rsquo;s hidden, users won&amp;rsquo;t see it, but spambots will, well, cause they are bots.
If the element is left empty, it&amp;rsquo;s valid, otherwise it&amp;rsquo;s not.
So, here&amp;rsquo;s the code:
&amp;lt;?php class App_Validate_Honeypot extends Zend_Validate_Abstract { const SPAM = &amp;#39;spam&amp;#39;; protected $_messageTemplates = array( self::SPAM =&amp;gt; &amp;#34;I think you&amp;#39;re a spambot.</description>
    </item>
    
    <item>
      <title>Toggler</title>
      <link>https://robertbasic.com/blog/toggler/</link>
      <pubDate>Thu, 04 Feb 2010 21:39:58 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/toggler/</guid>
      <description>At the office we&amp;rsquo;re starting out on a new project, which will require (thanks to our designer) a lot off divs and images and whatnot to slide up and down. All these elements will of course have it&amp;rsquo;s own ID&amp;rsquo;s and classes, so writing one function to slide/toggle them all is impossible, plus the design of these elements is so weird that the built-in animation effects are of no use. So I hacked together my first!</description>
    </item>
    
    <item>
      <title>Book review - jQuery 1.3 with PHP</title>
      <link>https://robertbasic.com/blog/book-review-jquery-13-with-php/</link>
      <pubDate>Wed, 06 Jan 2010 07:08:07 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/book-review-jquery-13-with-php/</guid>
      <description>Although I never wrote about jQuery here, I use it quite often and can pull of nice tricks with it. Also, bending any jQuery plugin to my will, was never a problem. But enough about me, you&amp;rsquo;re here cause of the book.
jQuery 1.3 with PHP is written by Kae Verens, a JavaScript and PHP developer. This book is aimed at PHP developers who have met only a few times with JavaScript and jQuery, but I believe even a novice programmer can gain knowledge from it â€“ just be warned, the PHP examples are here for the sake of the examples only; about which the author warns throughout the book.</description>
    </item>
    
    <item>
      <title>2009 in a few words</title>
      <link>https://robertbasic.com/blog/2009-in-a-few-words/</link>
      <pubDate>Sat, 02 Jan 2010 11:24:10 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/2009-in-a-few-words/</guid>
      <description>In 2009 some good stuff happened and some bad stuff happened. All in all, a crappy year. Hopefully, this year will be a lot better&amp;hellip;
I graduated on June 26th, the topic was a Python desktop application that communicates with a web service; both sending and receiving data is possible. Started working on July 1st at Online Solutions as a PHP dev and started to &amp;ldquo;officially&amp;rdquo; give back to the Open Source community by joining the ZF Bug Hunt Days - so far few minor patches submitted and applied.</description>
    </item>
    
    <item>
      <title>Bad Firebug!</title>
      <link>https://robertbasic.com/blog/bad-firebug/</link>
      <pubDate>Mon, 21 Dec 2009 21:21:30 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/bad-firebug/</guid>
      <description>We all know about Firebug, probably the best developer add-on out there, and how awesome it is and how many times it helped us debug some nasty Javascript code, mess around with CSS and HTML on-the-fly, to track the time load of every external page element our app loads&amp;hellip; It&amp;rsquo;s so cool that it even has it&amp;rsquo;s own add-ons! (FirePHP, YSlow and FireCookie). Really, it helps our developer lives to suck a bit less.</description>
    </item>
    
    <item>
      <title>Chaining routes in Zend Framework</title>
      <link>https://robertbasic.com/blog/chaining-routes-in-zend-framework/</link>
      <pubDate>Fri, 27 Nov 2009 19:23:23 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/chaining-routes-in-zend-framework/</guid>
      <description>On a forum, there was a question today, about adding language &amp;ldquo;support&amp;rdquo; to the routes using Zend Framework. The guy wanted routes like /en/foo/bar or /de/baz. I wrote there an example for that using Zend_Router_Routes_Chain, so just posting that example here, too :)
For what chains are for, is described in the manual, so I won&amp;rsquo;t be covering that :P
Basically, we&amp;rsquo;re prepending the language route to the other routes. This way, we have defined the route for the languages in one place only, plus, the other routes don&amp;rsquo;t have to worry about the language, too.</description>
    </item>
    
    <item>
      <title>Zend Framework bug hunt days</title>
      <link>https://robertbasic.com/blog/zend-framework-bug-hunt-days/</link>
      <pubDate>Sun, 22 Nov 2009 21:37:03 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/zend-framework-bug-hunt-days/</guid>
      <description>On the 19th and 20th of this month, the third Zend Framework Bug Hunt days were held. I joined the party for the first time and I say, it was a jolly good one!
It was announced on Zend DevZone after which PÃ¡draic wrote a nice and detailed Guide To Zend Framework Bug Hunt Days (I think I read on IRC that there&amp;rsquo;ll be a Bug Hunt Day FAQ, too). I decided to try and give back to the community as much as I can.</description>
    </item>
    
    <item>
      <title>Zend Framework 1.8 Web Application Development book review</title>
      <link>https://robertbasic.com/blog/zend-framework-18-web-application-development-book-review/</link>
      <pubDate>Tue, 17 Nov 2009 21:14:44 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/zend-framework-18-web-application-development-book-review/</guid>
      <description>A few days ago I finished reading Keith Pope&#39;s book titled &amp;ldquo;Zend Framework 1.8 Web Application Development&amp;rdquo;, so, after letting it &amp;ldquo;rest&amp;rdquo; in my mind for a while, here are my thoughts on it&amp;hellip;
First, I must point out the &amp;ldquo;language&amp;rdquo; of the book - I was expecting a text that&amp;rsquo;s hard to follow, that&amp;rsquo;s full of words and sentences requiring at least two dictionaries by my side to help me out (hey, English is not my first language!</description>
    </item>
    
    <item>
      <title>Playing with Zend_Navigation and routes</title>
      <link>https://robertbasic.com/blog/playing-with-zend_navigation-and-routes/</link>
      <pubDate>Sun, 09 Aug 2009 17:05:20 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/playing-with-zend_navigation-and-routes/</guid>
      <description>O hai. First things first - someone should slap me for being such a lazy blogger. Somehow I lost all the motivation I had in the beginning, but looks like it&amp;rsquo;s back now :) I finally had the time to play around with the latest Zend Framework version (v 1.9 now). I managed to skip the whole 1.8.x version, so this whole Zend_Application stuff is quite new to me. I spent a few days poking around the manual and the code to make it work.</description>
    </item>
    
    <item>
      <title>Ze Balkanic Tweetup</title>
      <link>https://robertbasic.com/blog/ze-balkanic-tweetup/</link>
      <pubDate>Sun, 31 May 2009 15:37:17 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ze-balkanic-tweetup/</guid>
      <description>It all started with this. Just another bored tweet from yours truly after the Sunday lunch. Followed by tweets like this and this and this and this and this. I&amp;rsquo;ll just blame the fact that it&amp;rsquo;s Sunday afternoon for the low response and that we geeks do have a life! (well, most of us&amp;hellip; some of us&amp;hellip;)
What&#39;s the point? To meet. To really get to know those people behind the avatars and tweets and funny names like &amp;ldquo;Swizec&amp;rdquo;.</description>
    </item>
    
    <item>
      <title>Moblin, Linux for netbooks</title>
      <link>https://robertbasic.com/blog/moblin-linux-for-netbooks/</link>
      <pubDate>Thu, 21 May 2009 10:57:24 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/moblin-linux-for-netbooks/</guid>
      <description>Moblin got me curios and I wanted to test it out:
 Moblin is an open source project focused on building a Linux-based platform optimized for the next generation of mobile devices including Netbooks, Mobile Internet Devices, and In-vehicle infotainment systems.  Cause I don&amp;rsquo;t own (yet!) a netbook, I installed it under VirtualBox (VB from now on). The image is 666 MB big and it comes not in an .</description>
    </item>
    
    <item>
      <title>Back</title>
      <link>https://robertbasic.com/blog/back/</link>
      <pubDate>Thu, 21 May 2009 03:42:40 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/back/</guid>
      <description>It&amp;rsquo;s been a while since I last wrote something; didn&amp;rsquo;t have anything smart or interesting to say. Not that I do have this time. It&amp;rsquo;s 4AM and I can&amp;rsquo;t sleep. Can&amp;rsquo;t really find the inspiration for work and writing (if you can consider these scribblings as writing). Lots of ssss&amp;hellip; stuff happened which had a great impact on my mood and my ability to do something useful. And I just didn&amp;rsquo;t felt like doing something about it.</description>
    </item>
    
    <item>
      <title>Wordpress as CMS tutorial</title>
      <link>https://robertbasic.com/blog/wordpress-as-cms-tutorial/</link>
      <pubDate>Sat, 14 Mar 2009 11:00:36 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/wordpress-as-cms-tutorial/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://wordpress.org/&#34;&gt;Wordpress&lt;/a&gt; is one of the best blogging platforms out there  if not the best. It&amp;rsquo;s very powerful, can be easily extended and modified. It&amp;rsquo;s &lt;a href=&#34;http://codex.wordpress.org/Main_Page&#34;&gt;documentation&lt;/a&gt; is very well written and, so far, had answer to all of my crazy questions :)&lt;/p&gt;
&lt;p&gt;You know what&amp;rsquo;s the best part of Wordpress? With some knowledge of PHP and MySql, you can turn it into much more than just a blogging platform. After doing some HTML to WP work for &lt;a href=&#34;http://twitter.com/styletime&#34;&gt;Roger&lt;/a&gt;, I thought of one way how could Wordpress be transformed into a CMS. Note the one way. This is not the only way for doing this, and, most likely, not the best way.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t look much, but I think that there are some nice plugins out there that can do this. But, where&amp;rsquo;s the fun in the download, upload, activate process? Nowhere!&lt;/p&gt;
&lt;p&gt;I will show you how to change your Wordpress into a CMS and it really doesn&amp;rsquo;t take much coding to achieve this! The example presented here is &lt;strong&gt;simple&lt;/strong&gt; and will have a static page for it&amp;rsquo;s home page, another static page for the Portfolio page and the blog. The home and portfolio page will have some of own content and both will include some content from other static pages. You all most likely know the blog part ;)&lt;/p&gt;
&lt;h2&gt;Static pages&lt;/h2&gt;
&lt;p&gt;Things you should know: each static page has it&amp;rsquo;s title, it&amp;rsquo;s slug or name (the thing that shows up in your browsers address bar: &lt;a href=&#34;http://example.com/portfolio/&#34;&gt;http://example.com/portfolio/&lt;/a&gt; - right there, the portfolio is the slug!), has the parent attribute and the template attribute. The parent attribute is used when it&amp;rsquo;s needed to make one page a child of another, i.e. to show Page2 as a subpage of Page1. The template attribute is used when we want to apply some different layout and styling to a static page. Read more about &lt;a href=&#34;http://codex.wordpress.org/Pages&#34;&gt;static pages&lt;/a&gt; and how to create your own &lt;a href=&#34;http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates&#34;&gt;page templates&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Online resources for Zend Framework</title>
      <link>https://robertbasic.com/blog/online-resources-for-zend-framework/</link>
      <pubDate>Tue, 03 Mar 2009 12:21:26 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/online-resources-for-zend-framework/</guid>
      <description>Besides the official documentation and the Quickstart, there are many useful resources for Zend Framework, like blogs and Twitter. I did my best to collect them. If you know something that&amp;rsquo;s not listed here, but should be, please leave a comment and I&amp;rsquo;ll update the post :)
Update #1 (seconds after publishing): Gotta love Twitter. Already got a message that I missed a blog. List is updated.
Update #2: Added more blogs to the list, thanks Jani for the recommendations!</description>
    </item>
    
    <item>
      <title>pywst - setting up web projects quickly</title>
      <link>https://robertbasic.com/blog/pywst-setting-up-web-projects-quickly/</link>
      <pubDate>Sun, 22 Feb 2009 18:22:15 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/pywst-setting-up-web-projects-quickly/</guid>
      <description>I wrote a Python script for automating the steps required to setup a web project environment on my local dev machine that runs on Ubuntu. Called it pywst: Python, Web, Svn, Trac. That&amp;rsquo;s the best I could do, sorry :P
The main steps for setting up a new project are:
 Create a virtual host Add it to /etc/hosts Enable the virtual host Import the new project to the SVN repository Checkout the project to /var/www Create a TRAC environment for the project Restart Apache  After these steps I have http://projectName.</description>
    </item>
    
    <item>
      <title>Trac on Ubuntu</title>
      <link>https://robertbasic.com/blog/trac-on-ubuntu/</link>
      <pubDate>Tue, 27 Jan 2009 13:26:32 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/trac-on-ubuntu/</guid>
      <description>&lt;p&gt;Today I was messing around with &lt;a href=&#34;http://trac.edgewall.org/&#34;&gt;Trac&lt;/a&gt;, installing it and doing some basic configuration. While my dev machine gets updated, I want to share my process of installing Trac.&lt;/p&gt;
&lt;h2&gt;What is Trac?&lt;/h2&gt;
&lt;p&gt;As said on the Trac homepage:&lt;/p&gt;
&lt;blockquote&gt;
Trac is an enhanced wiki and issue tracking system for software development projects.
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s free, it&amp;rsquo;s open source, it comes under the &lt;a href=&#34;http://trac.edgewall.org/wiki/TracLicense&#34;&gt;BSD license&lt;/a&gt; and it&amp;rsquo;s really awesome. You can write a wiki with it, have a ticket system, connect it with SVN, so you can browse the sources from the browser and see all the commit messages, when was something changed, added&amp;hellip; It can support one project, it can support multiple projects. It can be viewable/editable by anyone, or you can close it down for your little team&amp;hellip;&lt;/p&gt;
&lt;p&gt;Trac is big. It has lots of &lt;a href=&#34;http://trac.edgewall.org/wiki/TracPlugins&#34;&gt;plug-ins&lt;/a&gt;, so you can extend and customize your Trac. I haven&amp;rsquo;t played with them yet, but as soon as I will, you&amp;rsquo;ll get &lt;a href=&#34;http://feeds2.feedburner.com/robertbasic/blog/&#34;&gt;notified&lt;/a&gt; ;)&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s written in &lt;a href=&#34;http://python.org/&#34;&gt;Python&lt;/a&gt;. It can run on it&amp;rsquo;s own server, or it can run under Apache (where there are also &lt;a href=&#34;http://trac.edgewall.org/wiki/TracInstall#WebServer&#34;&gt;several options&lt;/a&gt;). It can use SQlite, PostrgeSQL or MySQL databases. Currently it can connect only to SVN.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll show you how to setup a basic Trac 0.11-dot-something-dot-something. It will run under Apache with &lt;a href=&#34;http://code.google.com/p/modwsgi/&#34;&gt;mod_wsgi&lt;/a&gt;, use a SQlite database, connect to the SVN repository and require user authentication.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Login example with Zend_Auth</title>
      <link>https://robertbasic.com/blog/login-example-with-zend_auth/</link>
      <pubDate>Mon, 05 Jan 2009 20:25:38 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/login-example-with-zend_auth/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Happy New Year!&lt;/strong&gt; Hope everyone had a blast for New Year&amp;rsquo;s Eve and managed to get some rest :) This is my first working day for this year. I&amp;rsquo;m still kinda lazy and sleepy. And I wanna eat something all the time. Damn you candies!!!&lt;/p&gt;
&lt;p&gt;So, here&amp;rsquo;s what I&amp;rsquo;m going to do: authenticate an user against a database table using Zend Framework&amp;rsquo;s Zend_Auth component. It&amp;rsquo;s really a piece of cake. You can see a working example here: &lt;a href=&#34;http://robertbasic.com/dev/login/&#34;&gt;&lt;a href=&#34;http://robertbasic.com/dev/login/&#34;&gt;http://robertbasic.com/dev/login/&lt;/a&gt;&lt;/a&gt;. Feel free to test it and report any misbehavior down in the &lt;a href=&#34;http://robertbasic.com/blog/login-example-with-zend_authlogin-example-with-zend_auth/#comments&#34;&gt;comments&lt;/a&gt;. In the codes below all paths, class names, actions, etc. will be as are in the example, so you probably will need to changed those according to your setup.&lt;/p&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;p&gt;Because I&amp;rsquo;m gonna use a database, be sure to have set the default database adapter in the bootstrap file, I have it setup like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?php&lt;/span&gt;
$config &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zend_Config_Ini&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;../application/dev/config/db_config.ini&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;offline&amp;#39;&lt;/span&gt;);
$registry &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zend_Registry&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getInstance&lt;/span&gt;();
$registry&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;db_config&amp;#39;&lt;/span&gt;,$config);
$db_config &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zend_Registry&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;db_config&amp;#39;&lt;/span&gt;);
$db &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zend_Db&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;($db_config&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;db&lt;/span&gt;);
&lt;span style=&#34;color:#a6e22e&#34;&gt;Zend_Db_Table&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;setDefaultAdapter&lt;/span&gt;($db);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ll need it later in the code. The table structure is as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;--
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;-- Table structure for table `zendLogin`
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;--
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;zendLogin&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; (
  &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; int(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; auto_increment,
  &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;username&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; varchar(&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;password&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; varchar(&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;name&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; varchar(&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;email&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; varchar(&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
  &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt;  (&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;id&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;)
) ENGINE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;InnoDB  &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; CHARSET&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;utf8 AUTO_INCREMENT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; ;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Styling the default Zend_Form layout</title>
      <link>https://robertbasic.com/blog/styling-the-default-zend_form-layout/</link>
      <pubDate>Mon, 22 Dec 2008 22:17:21 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/styling-the-default-zend_form-layout/</guid>
      <description>Here&amp;rsquo;s an example for styling Zend_Form&#39;s default layout. The default layout is using definition lists. While there&amp;rsquo;s an option for changing the default layout, the wrapper tags and stuff, I see no reason for it. Create the form, add some CSS and your good to go :)
Note: Be sure to provide a Document Type in your view scripts like this:
&amp;lt;?php &amp;lt;?= $this-&amp;gt;doctype(&amp;#39;XHTML1_STRICT&amp;#39;) ?&amp;gt; because when the form is generated, ZF is looking at the doctype to see how to create the form elements.</description>
    </item>
    
    <item>
      <title>Data filtering with PHP&#39;s Filter extension</title>
      <link>https://robertbasic.com/blog/data-filtering-with-php-filter-extension/</link>
      <pubDate>Mon, 15 Dec 2008 17:14:05 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/data-filtering-with-php-filter-extension/</guid>
      <description>Today I was catching up on feeds and one of the articles lead me to GoPHP5.org, where I spent some time lurking. In the FAQ section of that site one sentence made me curios:
 The Filter extension is a new security component in PHP.  Filter extension? Maybe it&amp;rsquo;s nothing new for some of you, but it is for me. I&amp;rsquo;ve never heard of it before. So I quickly hopped over to PHP.</description>
    </item>
    
    <item>
      <title>MyUrl view helper for Zend Framework</title>
      <link>https://robertbasic.com/blog/myurl-view-helper-for-zend-framework/</link>
      <pubDate>Tue, 02 Dec 2008 18:02:48 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/myurl-view-helper-for-zend-framework/</guid>
      <description>I started writing some boring introduction but I&amp;rsquo;ll just skip to the point.
The problem Zend Framework&amp;rsquo;s built in URL view helper  Zend_View_Helper_Url  is discarding the query string of the URL, thus breaking some links.
Example: If I&amp;rsquo;m on a page like:
http://project/foo/bar/?param1=value1
and in the bar.phtml I use the Url helper like this:
&amp;lt;?php &amp;lt;?= $this-&amp;gt;url(array(&amp;#39;param2&amp;#39; =&amp;gt; &amp;#39;value2&amp;#39;)); ?&amp;gt; I expect this:
http://project/foo/bar/param2/value2/?param1=value1
or something similar to this.</description>
    </item>
    
    <item>
      <title>LAMP and SVN on Ubuntu 8.10</title>
      <link>https://robertbasic.com/blog/lamp-and-svn-on-ubuntu-8-10/</link>
      <pubDate>Mon, 24 Nov 2008 20:00:33 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/lamp-and-svn-on-ubuntu-8-10/</guid>
      <description>This post is a rewrite of one of my older posts, Ubuntu as a dev machine, but this time I&amp;rsquo;ll explain also how to setup a basic SVN besides the LAMP.
Ubuntu 8.10 was released bout a month ago and today I wasn&amp;rsquo;t in the mood of doing any coding so I decided to try out the new Ubuntu. Once again, I&amp;rsquo;m installing it under VirtualBox (VB), cause it seems that they still haven&amp;rsquo;t fixed the bug related to the rtl8187 chipset.</description>
    </item>
    
    <item>
      <title>TickTweet WordPress plug-in</title>
      <link>https://robertbasic.com/blog/ticktweet-wordpress-plug-in/</link>
      <pubDate>Fri, 21 Nov 2008 01:12:26 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ticktweet-wordpress-plug-in/</guid>
      <description>Few weeks ago @imjustcreative mentioned on Twitter that he would like a WordPress plug-in that would scroll (tick) tweets where soultweet is mentioned. As I wanted to do a plug-in for some time, but never had any good ideas, I told him that I&amp;rsquo;ll take up the job. So I started to work on this in my free time.
Before I even started looking at anything, I decided that I want this plug-in to be fast, to work with smallest possible data to save bandwidth and to keep the number of calls towards Twitter low.</description>
    </item>
    
    <item>
      <title>School&#39;s out!</title>
      <link>https://robertbasic.com/blog/schools-out/</link>
      <pubDate>Thu, 13 Nov 2008 16:19:55 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/schools-out/</guid>
      <description>Today is one big day for me: I passed my last 2 exams at the College. 3 months of learning, a bit of luck and a professor in a good mood  the winning combination! This is a big relief for me, cause I now can fully concentrate on programming, no other stuff to think of, just me and the code.
At the College I have only one more obligation, the graduate work.</description>
    </item>
    
    <item>
      <title>Powered by WordPress 2.7 beta 1</title>
      <link>https://robertbasic.com/blog/powered-by-wordpress-27-beta-1/</link>
      <pubDate>Tue, 04 Nov 2008 17:41:45 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/powered-by-wordpress-27-beta-1/</guid>
      <description>I&amp;rsquo;ve decided to upgrade to WordPress 2.7 beta 1, just for fun. For now, no major problems occurred, just a few smaller ones, all which are caused by my hacking of the WordPress core  I wasn&amp;rsquo;t keeping track of all hacks I did, so there were some random errors, but everything should be fine now.
I don&amp;rsquo;t recommend to no one upgrading to this version, unless you are OK with possible problems caused by this beta version.</description>
    </item>
    
    <item>
      <title>Project Euler</title>
      <link>https://robertbasic.com/blog/project-euler/</link>
      <pubDate>Mon, 27 Oct 2008 11:08:56 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/project-euler/</guid>
      <description>A few days ago, I found a really great place, full of excellent math and programming problems: Project Euler.
 Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.  I was long looking for this kind of place, to get my brain do some serious thinking :) It&amp;rsquo;s a great way to improve logic and math/programming skills.</description>
    </item>
    
    <item>
      <title>A Zend_Captcha example</title>
      <link>https://robertbasic.com/blog/a-zend-captcha-example/</link>
      <pubDate>Wed, 22 Oct 2008 20:27:46 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/a-zend-captcha-example/</guid>
      <description>Update: I made an error in the example code, regarding the CAPTCHA image URL. I&amp;rsquo;m sorry for any troubles caused by this mistake.
Update #2: Here&amp;rsquo;s an example of using Zend_Captcha without the whole Zend Framework stuff.
Update #3: There was an unintentional error in the captchaAction() method, Adam warned me about it in the comments. The error is fixed now. Thanks Adam.
OK, this was a bit tricky and I found no examples about it, so I thought to blog it.</description>
    </item>
    
    <item>
      <title>Starting with Zend Framework - part 2</title>
      <link>https://robertbasic.com/blog/starting-with-zend-framework-part-2/</link>
      <pubDate>Mon, 20 Oct 2008 15:42:58 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/starting-with-zend-framework-part-2/</guid>
      <description>&lt;p&gt;This post is the second part of my introductory text on Zend Framework, &lt;a href=&#34;http://robertbasic.com/blog/2008/10/07/starting-with-zend-framework/&#34;&gt;Starting with Zend Framework&lt;/a&gt;. This time I cover the basics about controllers, actions, view scripts and view helpers. On request routing and the Front Controller I will write one (or more) big post(s), so this part won&amp;rsquo;t be explained now. I will also skip explaining the models; they deserve their own post :)&lt;/p&gt;
&lt;p&gt;If anyone is into writing a guest-post on models, &lt;a href=&#34;http://robertbasic.com/#form_contact&#34;&gt;let me know!&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The Controllers&lt;/h2&gt;
&lt;p&gt;The Controllers are the heart of every MVC based application. They control the execution of the application, what to do with the data, what to show the user, what to write to the database, etc. The Controllers that you will write all the time, are called &lt;a href=&#34;http://framework.zend.com/manual/en/zend.controller.action.html&#34; target=&#34;_blank&#34;&gt;Action Controllers&lt;/a&gt;. These Controllers subclass the Zend_Controller_Action &lt;a href=&#34;http://www.php.net/oop5.abstract&#34; target=&#34;_blank&#34;&gt;abstract class&lt;/a&gt;. Every application module must have a default Controller, which will be accessed if no specific Controller is requested. The default name for this default Controller is Index. Examples of the IndexController and FooController:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;// The IndexController class must be placed in the controllers folder
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// and saved as IndexController.php
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IndexController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zend_Controller_Action&lt;/span&gt;
{
    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;init&lt;/span&gt;()
    {
    }

    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;indexAction&lt;/span&gt;()
    {
    }
}

&lt;span style=&#34;color:#75715e&#34;&gt;// The FooController class must be placed in the controllers folder
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// and saved as FooController.php
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FooController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zend_Controller_Action&lt;/span&gt;
{
    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;init&lt;/span&gt;()
    {
    }

    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;indexAction&lt;/span&gt;()
    {
    }

    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;barAction&lt;/span&gt;()
    {
    }

    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;someRandomFunctionDoingSomeFunkyStuff&lt;/span&gt;()
    {
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Ubuntu as a dev machine</title>
      <link>https://robertbasic.com/blog/ubuntu-as-a-dev-machine/</link>
      <pubDate>Wed, 15 Oct 2008 07:04:15 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/ubuntu-as-a-dev-machine/</guid>
      <description>This post is more of a note to myself, &amp;lsquo;cause I keep forgetting all these Linux commands, and spend hours setting up stuff right&amp;hellip;
I&amp;rsquo;m installing Ubuntu 8.04 on VirtualBox, with windows xp as the host machine. I must do it this way, because my wireless card is having some problems with Linux, something with the drivers. The possible solution includes kernel compiling  thanks, but no thanks.
Anyway&amp;hellip; The installation itself is no trouble, so I&amp;rsquo;ll skip that.</description>
    </item>
    
    <item>
      <title>Optimizing MySQL and a Zend_Db_Profiler example</title>
      <link>https://robertbasic.com/blog/optimizing-mysql-and-a-zend_db_profiler-example/</link>
      <pubDate>Mon, 13 Oct 2008 19:31:45 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/optimizing-mysql-and-a-zend_db_profiler-example/</guid>
      <description>Last night I came across on a post on TechFounder, about using Zend_Db_Profiler and a good example with real data on optimizing MySQL queries. For geeks who SQL speak fluently this will probably be no new stuff, but for great number of web developers (me included!) this will probably come in handy.
Cheers!</description>
    </item>
    
    <item>
      <title>Starting with Zend Framework</title>
      <link>https://robertbasic.com/blog/starting-with-zend-framework/</link>
      <pubDate>Tue, 07 Oct 2008 13:13:02 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/starting-with-zend-framework/</guid>
      <description>Zend Framework is a big &amp;amp; heavy object-oriented framework for PHP. I started working with ZF a couple of months ago, I liked it&amp;rsquo;s documention (it&amp;rsquo;s very well documented) and decided to stick with this framework. Here is the latest version of the framework  at the time of writing v1.6.1.
It supports the MVC pattern, which helps separating business logic from viewing logic. It supports a great number of API&amp;rsquo;s, such as Delicious API, Flickr API, Yahoo API, Akismet API and many more.</description>
    </item>
    
    <item>
      <title>Wordpress paging navigation</title>
      <link>https://robertbasic.com/blog/wordpress-paging-navigation/</link>
      <pubDate>Mon, 06 Oct 2008 08:09:02 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/wordpress-paging-navigation/</guid>
      <description>As I&amp;rsquo;m not a big fan of Wordpress plugins, and I wanted to use a normal page navigation, not just the default Previous posts and Next posts, I decided to play around a bit and create my own paging navigation, or pagination.
Preparation First, I wrote on a piece of paper which links I need: first page, last page, next page, previous page and the links with the page numbers. Next, I needed to see what functions are already in Wordpress, to reuse as much as I can.</description>
    </item>
    
    <item>
      <title>Smush your images!</title>
      <link>https://robertbasic.com/blog/smush-your-images/</link>
      <pubDate>Tue, 30 Sep 2008 18:01:07 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/smush-your-images/</guid>
      <description>I just found a nice web site where you can smush your images  Smushit.com. SmushIt takes an image and removes all unnecessary information about it: when was it last edited, what image editor was used etc., but keeps the quality of the image! This is more than useful for sites where there are lots of images.
There are several ways to provide images to SmushIt:
 Upload an image Provide an URL to the image Use the Firefox SmushIt add-on  The first two ways are quite obvious; provide an image and it&amp;rsquo;ll process it in a few seconds.</description>
    </item>
    
    <item>
      <title>Regular expressions with PHP</title>
      <link>https://robertbasic.com/blog/regular-expressions-with-php/</link>
      <pubDate>Mon, 22 Sep 2008 19:06:16 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/regular-expressions-with-php/</guid>
      <description>I just want to write some real examples. These regexps are (and always will be, &amp;lsquo;cause I plan to write several posts on this topic) for the PHP&amp;rsquo;s PCRE library. Here&amp;rsquo;s a good PHP PCRE cheat sheet, it&amp;rsquo;s an excellent resource for regexps. If you know nothing about regexps, first read this Wiki page.
Regexps for anchor tags A common case is when you have a source of some web page and you want to parse out all the links from it.</description>
    </item>
    
    <item>
      <title>about:license</title>
      <link>https://robertbasic.com/blog/about-license/</link>
      <pubDate>Sat, 13 Sep 2008 10:08:21 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/about-license/</guid>
      <description>I don&amp;rsquo;t know about you, but I&amp;rsquo;m not really good with all the legal mumbojumbo. All these licenses and agreements, they sound to me like they are not written to be read by human beings. Not to mention a bunch of terms that sound similar, but are not at all. As a person who makes and uses all kind of software, I feel like I should know more about licenses; what can and what can not be done under a specific license.</description>
    </item>
    
    <item>
      <title>Look, Ma...</title>
      <link>https://robertbasic.com/blog/look-ma/</link>
      <pubDate>Thu, 04 Sep 2008 10:43:38 +0200</pubDate>
      
      <guid>https://robertbasic.com/blog/look-ma/</guid>
      <description>... I have a Blog too! Well, it was damn time to get yourself one of those.
Actually, this is my third blog. The first lasted about a day or two. The second went alright for a time, but then the hosting company started to play around with settings, so the whole thing fell apart. This time, I&#39;m serious. Kinda.
Until now I was foolin&#39; around a lot. Tried this and that, experimenting.</description>
    </item>
    
    <item>
      <title>Talks</title>
      <link>https://robertbasic.com/talks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://robertbasic.com/talks/</guid>
      <description>Another way I like to share knowledge is by giving talks. If you&amp;rsquo;d like to hear one of these talks at your local user group, conference, or company, please get in touch by sending an email to contactme@robertbasic.com!
 All aboard the Service Bus Build your career one contribution at a time introDDDuction Easier mocking with Mockery Code profiling with Xdebug and KCachegrind   All aboard the Service Bus  We deal with complicated and complex applications on a daily basis, codebases that are filled with classes that do too many things.</description>
    </item>
    
  </channel>
</rss>