<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Seastone</title><link>https://www.seastone.io/</link><description>Recent content on Seastone</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 05 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.seastone.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Advisory &amp; Consulting</title><link>https://www.seastone.io/services/advisory-consulting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.seastone.io/services/advisory-consulting/</guid><description>&lt;h2 id="what-is-advisory--consulting"&gt;What is Advisory &amp;amp; Consulting?&lt;/h2&gt;
&lt;p&gt;Advisory and consulting engagements provide you with strategic guidance on complex technical and organizational challenges. I work alongside you to diagnose problems, develop solutions, and navigate implementation.&lt;/p&gt;
&lt;p&gt;Unlike traditional consulting, I don&amp;rsquo;t disappear after delivering a report. I stay engaged to help you execute, adjust course as needed, and ensure real outcomes.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;Engagements typically begin with a discovery phase where I immerse myself in your organization—understanding your team dynamics, technical landscape, business context, and specific challenges.&lt;/p&gt;</description></item><item><title>Coaching &amp; Mentoring</title><link>https://www.seastone.io/services/coaching-mentoring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.seastone.io/services/coaching-mentoring/</guid><description>&lt;h2 id="what-is-coaching--mentoring"&gt;What is Coaching &amp;amp; Mentoring?&lt;/h2&gt;
&lt;p&gt;Coaching and mentoring provides dedicated, one-on-one support for your growth as a tech leader. Through regular conversations and ongoing support, I help you develop your skills, navigate challenges, and achieve your goals.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t generic leadership training. It&amp;rsquo;s personalized guidance based on your specific context, challenges, and aspirations.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;We start with a discovery conversation to understand your current situation, goals, and the specific areas where you want to grow. From there, we develop a personalized plan that guides our work together.&lt;/p&gt;</description></item><item><title>Workshops &amp; Training</title><link>https://www.seastone.io/services/workshops-training/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.seastone.io/services/workshops-training/</guid><description>&lt;h2 id="what-are-workshops--training"&gt;What are Workshops &amp;amp; Training?&lt;/h2&gt;
&lt;p&gt;Workshops and training sessions provide intensive, interactive learning experiences for teams and organizations. Unlike passive presentations, these sessions engage participants in exercises, discussions, and practical application.&lt;/p&gt;
&lt;p&gt;Each workshop is custom-designed for your specific context and goals. I don&amp;rsquo;t deliver canned content—I create experiences that address your real challenges.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;We begin with a planning conversation to understand your goals, context, and constraints. I then design a workshop tailored to your needs, including the content, exercises, and materials.&lt;/p&gt;</description></item><item><title>Seastone is live</title><link>https://www.seastone.io/announcements/seastone-is-live/</link><pubDate>Sat, 05 Sep 2026 00:00:00 +0000</pubDate><guid>https://www.seastone.io/announcements/seastone-is-live/</guid><description>&lt;p&gt;The new Seastone site is up. This is where I&amp;rsquo;ll post the occasional launch,
talk, or milestone worth marking — nothing more, nothing scheduled.&lt;/p&gt;</description></item><item><title>Speaking on AI-assisted development this autumn</title><link>https://www.seastone.io/announcements/speaking-on-ai-assisted-development-this-autumn/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://www.seastone.io/announcements/speaking-on-ai-assisted-development-this-autumn/</guid><description>&lt;p&gt;I&amp;rsquo;ll be giving a talk on how engineering teams actually adopt AI in their
day-to-day work, without the hype and without pretending it&amp;rsquo;s free. Details
to follow closer to the date.&lt;/p&gt;</description></item><item><title>New workshop: from AI zero to AI hero</title><link>https://www.seastone.io/announcements/new-workshop-from-ai-zero-to-ai-hero/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://www.seastone.io/announcements/new-workshop-from-ai-zero-to-ai-hero/</guid><description>&lt;p&gt;A hands-on workshop for teams that want real leverage from AI in how they
build software, starting from wherever they are today. Now open for booking.&lt;/p&gt;</description></item><item><title>Assign by reference with PHP's ternary operator</title><link>https://www.seastone.io/tech-notes/assign-by-reference-with-phps-ternary-operator/</link><pubDate>Sat, 09 Aug 2014 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/assign-by-reference-with-phps-ternary-operator/</guid><description>If you want to assign a variable with a reference in a ternary operator you run into problems. Syntax errors to be precise.</description></item><item><title>Detaching processes</title><link>https://www.seastone.io/tech-notes/detaching-processes/</link><pubDate>Sat, 19 Oct 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/detaching-processes/</guid><description>What about when you forget to start up your terminal multiplexer before starting that long running process?</description></item><item><title>Refactoring a user test function</title><link>https://www.seastone.io/tech-notes/refactoring-a-user-test-function/</link><pubDate>Thu, 05 Sep 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/refactoring-a-user-test-function/</guid><description>Follow along as I pull out a function from a legacy system and, step by step, refactor it to meet higher quality standards.</description></item><item><title>Compass LoadError in Assetic and Symfony2</title><link>https://www.seastone.io/tech-notes/compass-loaderror-in-assetic-and-symfony2/</link><pubDate>Mon, 26 Aug 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/compass-loaderror-in-assetic-and-symfony2/</guid><description>I love using Sass to manage my stylesheets. What I do not love, however, is how the frail Ruby stack can mess with your flow.</description></item><item><title>PHP REPL for Symfony and Drupal</title><link>https://www.seastone.io/tech-notes/php-repl-for-symfony-and-drupal/</link><pubDate>Fri, 16 Aug 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/php-repl-for-symfony-and-drupal/</guid><description>One thing I have always missed in PHP is a useful and robust REPL. There is the built-in interactive mode (&lt;code&gt;php -a&lt;/code&gt;) but it does not qualify as neither very useful nor robust.</description></item><item><title>Booting Jekyll with Teamocil</title><link>https://www.seastone.io/tech-notes/booting-jekyll-with-teamocil/</link><pubDate>Wed, 14 Aug 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/booting-jekyll-with-teamocil/</guid><description>Teamocil is a cool utility for us tmux users. It helps manage your sessions, windows and panes in a way that makes it really easy to boot up preconfigured environments.</description></item><item><title>Automatic MySQL backups</title><link>https://www.seastone.io/tech-notes/automatic-mysql-backups/</link><pubDate>Sat, 15 Jun 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/automatic-mysql-backups/</guid><description>Automate rolling MySQL backups to keep the data in you production databases safe and sound.</description></item><item><title>Symfony Icu requires lib-icu</title><link>https://www.seastone.io/tech-notes/symfony-icu-requires-lib-icu/</link><pubDate>Fri, 17 May 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/symfony-icu-requires-lib-icu/</guid><description>Are you getting errors about missing icu libs when installing Symfony 2.3? It is easily fixed.</description></item><item><title>Jekyll tag cloud</title><link>https://www.seastone.io/tech-notes/jekyll-tag-cloud/</link><pubDate>Tue, 14 May 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/jekyll-tag-cloud/</guid><description>Tag clouds was all the fuss some years ago and they can still be useful for content heavy sites. But how do you create a tag cloud in Jekyll?</description></item><item><title>Responsible Silex controllers</title><link>https://www.seastone.io/tech-notes/responsible-silex-controllers/</link><pubDate>Tue, 07 May 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/responsible-silex-controllers/</guid><description>&lt;p&gt;Micro-framework &lt;a href="https://www.seastone.io/silex/"&gt;Silex&lt;/a&gt; is an excellent wrapper around the &lt;a href="https://www.seastone.io/symfony/"&gt;Symfony components&lt;/a&gt;. It abstracts away a lot of the complexities, so you can get right to the nitty gritty details.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$app = new Application();
$app-&amp;gt;get('/foo', function() {
 return new Response('Bar');
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also pull in &lt;code&gt;TwigServiceProvider&lt;/code&gt; for an excellent rendering engine to craft your beautiful websites. However, what happens if what you want to show is not a website but formatted data? What if you are building an API?&lt;/p&gt;</description></item><item><title>Readline in Ruby with rbenv</title><link>https://www.seastone.io/tech-notes/readline-in-ruby-with-rbenv/</link><pubDate>Sun, 05 May 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/readline-in-ruby-with-rbenv/</guid><description>Ruby with rbenv does not come with readline support out of the box, so you will need to recompile your version for it to work. Here is how.</description></item><item><title>Scrutinize your PHP</title><link>https://www.seastone.io/tech-notes/scrutinize-your-php/</link><pubDate>Wed, 20 Mar 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/scrutinize-your-php/</guid><description>Scritinizer is a service for automated code reviews. PHP Analyzer, Code Sniffer, Mess Detector and more will make sure your PHP code is thoroughly scrutinized for sure.</description></item><item><title>Symfony with an F</title><link>https://www.seastone.io/tech-notes/symfony-with-an-f/</link><pubDate>Tue, 12 Mar 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/symfony-with-an-f/</guid><description>A symphony is an extended musical composition in Western classical music, according to Wikipedia. I say that&amp;rsquo;s a grievous typo for one of the world&amp;rsquo;s most powerful web frameworks.</description></item><item><title>Going Zsh</title><link>https://www.seastone.io/tech-notes/going-zsh/</link><pubDate>Thu, 07 Mar 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/going-zsh/</guid><description>It is my honest opinion that a proficient use of CLI will beat its GUI counterpart by orders of magnitude. Which is why I recently switched to Zsh.</description></item><item><title>Partial Doctrine entities</title><link>https://www.seastone.io/tech-notes/partial-doctrine-entities/</link><pubDate>Wed, 06 Mar 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/partial-doctrine-entities/</guid><description>The way to have Doctrine fetch only parts of your entities, and still have them properly hydrated, is to use the partial keyword.</description></item><item><title>Functional primitives for PHP</title><link>https://www.seastone.io/tech-notes/functional-primitives-for-php/</link><pubDate>Sat, 16 Feb 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/functional-primitives-for-php/</guid><description>I believe your imperative code can benefit from a more functional approach and to help with this; there is Functional primitives for PHP.</description></item><item><title>Trim and remove Twig whitespace</title><link>https://www.seastone.io/tech-notes/trim-and-remove-twig-whitespace/</link><pubDate>Tue, 12 Feb 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/trim-and-remove-twig-whitespace/</guid><description>&lt;p&gt;We seldom see the HTML produced by our backends, at least in their pristine state, still unprettified by our web inspectors. Yet I am not alone in taking pride in clean markup.&lt;/p&gt;
&lt;p&gt;The template engine I use a lot nowadays is &lt;a href="https://www.seastone.io/twig/"&gt;Twig&lt;/a&gt; and it has two ways of controlling whitespace, to make our HTML the envy of our peers. One is &lt;em&gt;the &lt;code&gt;spaceless&lt;/code&gt; tag&lt;/em&gt; and the other is &lt;em&gt;the whitespace control modifier&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>RESTify your API</title><link>https://www.seastone.io/tech-notes/restify-your-api/</link><pubDate>Mon, 11 Feb 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/restify-your-api/</guid><description>If you are interested in reading up on RESTful architecture; here are some really good resources.</description></item><item><title>Programming With Anthony</title><link>https://www.seastone.io/tech-notes/programming-with-anthony/</link><pubDate>Sun, 27 Jan 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/programming-with-anthony/</guid><description>If you are into programming and have a couple of minutes to spare, I would really recommend checking out Programming With Anthony.</description></item><item><title>Redirection for mobile sites</title><link>https://www.seastone.io/tech-notes/redirection-for-mobile-sites/</link><pubDate>Fri, 25 Jan 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/redirection-for-mobile-sites/</guid><description>If you did not go mobile first when building your site, you will need to create a whole separate, mobile one. Here are some pitfalls to think about before doing so.</description></item><item><title>Gardening your code</title><link>https://www.seastone.io/tech-notes/gardening-your-code/</link><pubDate>Tue, 22 Jan 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/gardening-your-code/</guid><description>I recently found a passage in The Pragmatic Programmer that reminded me how my former colleague and mentor used to say that &amp;ldquo;software development is like gardening&amp;rdquo;.</description></item><item><title>Have Composer use development branches</title><link>https://www.seastone.io/tech-notes/have-composer-use-development-branches/</link><pubDate>Fri, 18 Jan 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/have-composer-use-development-branches/</guid><description>Using Composer for our PHP projects is a given. But what about when you stumble over a bug in one of those libraries?</description></item><item><title>PX to EM with Sass</title><link>https://www.seastone.io/tech-notes/px-to-em-with-sass/</link><pubDate>Wed, 16 Jan 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/px-to-em-with-sass/</guid><description>I used to manually calculate px-to-em but with Sass and Compass, this is a thing of the past.</description></item><item><title>RSS/Atom feed to Facebook page and Twitter</title><link>https://www.seastone.io/tech-notes/rss-atom-feed-to-facebook-page-and-twitter/</link><pubDate>Wed, 09 Jan 2013 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/rss-atom-feed-to-facebook-page-and-twitter/</guid><description>Here is how I automatically post content from my Atom feed, to my Facebook page and to Twitter.</description></item><item><title>Reproduce Jekyll on GitHub Pages</title><link>https://www.seastone.io/tech-notes/reproduce-jekyll-on-github-pages/</link><pubDate>Thu, 27 Dec 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/reproduce-jekyll-on-github-pages/</guid><description>Hosting your Jekyll site on GitHub Pages can certainly save a lot of headache. However, being able to reproduce the GitHub environment can sometimes be the only way to solve a bug.</description></item><item><title>Jekyll sitemap without plugins</title><link>https://www.seastone.io/tech-notes/jekyll-sitemap-without-plugins/</link><pubDate>Fri, 21 Dec 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/jekyll-sitemap-without-plugins/</guid><description>There are plenty of Jekyll plugins available if you want to generate a sitemap for your blog. The only problem is that GitHub Pages, where a lot of us are hosting our Jekyll sites, does not allow plugins.</description></item><item><title>Keep Symfony2 sessions through cache:clear</title><link>https://www.seastone.io/tech-notes/keep-symfony2-sessions-through-cache-clear/</link><pubDate>Mon, 03 Dec 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/keep-symfony2-sessions-through-cache-clear/</guid><description>Per default Symfony2 will store session information in its cache directory. Clearing the cache thus logs everyone out. A simple solution to this is moving where Symfony saves its sessions.</description></item><item><title>tree - structured files and directories listing</title><link>https://www.seastone.io/tech-notes/tree-structured-files-and-directories-listing/</link><pubDate>Mon, 26 Nov 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/tree-structured-files-and-directories-listing/</guid><description>The tree command is one of those tools that makes our CLI supreme to its GUI interface. Its use is to list files and directories in a structured manner. I find it gives me an excellent overview of the directory structure and I use it a lot to familiarize myself with new projects.</description></item><item><title>Cross domain tracking with Google Analytics</title><link>https://www.seastone.io/tech-notes/cross-domain-tracking-with-google-analytics/</link><pubDate>Fri, 23 Nov 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/cross-domain-tracking-with-google-analytics/</guid><description>Yesterday when I was mentoring at Hyper Island I got a lot of questions on cross domain tracking with Google Analytics. Since I have not implemented this myself and because I dislike not knowing, I took some time reading up on the subject today.</description></item><item><title>Increase SERP conversion with dynamic copy</title><link>https://www.seastone.io/tech-notes/increase-serp-conversion-with-dynamic-copy/</link><pubDate>Fri, 23 Nov 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/increase-serp-conversion-with-dynamic-copy/</guid><description>I just searched for &amp;ldquo;Some Service coupon code&amp;rdquo;, to see if I could get a discount before proceeding to my purchase. Most of the results were from aggregator sites but what stood out to me what how three of them triggered me to click them instinctively.</description></item><item><title>Get naked with Drupal</title><link>https://www.seastone.io/tech-notes/get-naked-with-drupal/</link><pubDate>Tue, 20 Nov 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/get-naked-with-drupal/</guid><description>I am a big fan of CSS Naked Day and have been participating myself the last two occasions. Earlier this year I open sourced a JavaScript project that on April 9th strips away your CSS entirely from the browser.</description></item><item><title>Update associated entities in Doctrine</title><link>https://www.seastone.io/tech-notes/update-associated-entities-in-doctrine/</link><pubDate>Wed, 07 Nov 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/update-associated-entities-in-doctrine/</guid><description>I am building a website for tv-series (Swedish) using Symfony2. Recently I ran into a problem in how to manage my data with Doctrine, which solution took some reading up on the Unit of Work part of the ORM.</description></item><item><title>Jekyll blog on Amazon S3 and CloudFront</title><link>https://www.seastone.io/tech-notes/jekyll-blog-on-amazon-s3-and-cloudfront/</link><pubDate>Tue, 16 Oct 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/jekyll-blog-on-amazon-s3-and-cloudfront/</guid><description>Last weekend I decided to migrate this blog away from my VPS and while doing so I wanted to see how much performance I could squeeze out of it.</description></item><item><title>Logging Doctrine SQL queries in Symfony2</title><link>https://www.seastone.io/tech-notes/logging-doctrine-queries-in-symfony2/</link><pubDate>Sun, 30 Sep 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/logging-doctrine-queries-in-symfony2/</guid><description>Doctrine is a great ORM and DBAL library to use with your Symfony2 application. But occasionally it can feel like a black box, where magic just happens. In those cases it would be good to have a look at what actually happens.</description></item><item><title>Continuous integration for your Symfony2 app</title><link>https://www.seastone.io/tech-notes/continuous-integration-for-your-symfony2-app/</link><pubDate>Wed, 26 Sep 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/continuous-integration-for-your-symfony2-app/</guid><description>The hosted continuous integration service Travis CI has been around for a while now, amplifying the testing ambitions of our open source communities. It is really a great service and I encourage you to familiarize yourself with it if you have not already.</description></item><item><title>Introducing CSSNakedDay.js</title><link>https://www.seastone.io/tech-notes/introducing-cssnakedday-js/</link><pubDate>Wed, 19 Sep 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/introducing-cssnakedday-js/</guid><description>I have participated in a proud web tradition for two years straight now; CSS Naked Day 2011 and 2012. As I have recently moved from Symfony to Jekyll as my website engine, that means I can not do any server-side processing and so I had to rethink the solution.</description></item><item><title>Apache .htaccess and vhost rewrite inheritance</title><link>https://www.seastone.io/tech-notes/apache-htaccess-vhost-rewrite-inheritance/</link><pubDate>Sun, 26 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/apache-htaccess-vhost-rewrite-inheritance/</guid><description>Currently when you want to affect the way requests are routed into Drupal, you have two choices; either you hack the core &lt;code&gt;.htaccess&lt;/code&gt; or you move all its content into your virtual host. We all know hacking core is bad but code duplication is also irky and we do not want to miss future updates to &lt;code&gt;.htaccess&lt;/code&gt; when upgrading.</description></item><item><title>Haskell ASCII order</title><link>https://www.seastone.io/tech-notes/haskell-ascii-order/</link><pubDate>Wed, 22 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/haskell-ascii-order/</guid><description>This weekend I will be running a 5x5 km relay race and in preparation our team must decide on the order of when each runner will have their turn. Being a geek I naturally turned to computer science to help solve the problem.</description></item><item><title>jQuery Deferreds promises asynchronous bliss</title><link>https://www.seastone.io/tech-notes/jquery-deferreds-promises-asynchronous-bliss/</link><pubDate>Thu, 16 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/jquery-deferreds-promises-asynchronous-bliss/</guid><description>When running an asynchronous function, only the function itself knows when it is done. Thus if we want to continue after the function has completed we need to pass it a callback.</description></item><item><title>Your API is not RESTful</title><link>https://www.seastone.io/tech-notes/your-api-is-not-restful/</link><pubDate>Wed, 08 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/your-api-is-not-restful/</guid><description>In software development it is always good to take a look at existing &lt;em&gt;design patterns&lt;/em&gt; and &lt;em&gt;standards&lt;/em&gt; before deciding on a path. Two such leading standards for API design used to be &lt;em&gt;XML-RPC&lt;/em&gt; and &lt;em&gt;SOAP&lt;/em&gt; but nowadays &lt;em&gt;RESTful API&lt;/em&gt; is all the hype. It is clean, powerful and easily maintainable. But also completely misunderstood.</description></item><item><title>Automated, continuous testing with Guard</title><link>https://www.seastone.io/tech-notes/automated-continuous-testing-with-guard/</link><pubDate>Mon, 06 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/automated-continuous-testing-with-guard/</guid><description>Everything you are interacting with has an interface; whether it is a laptop touchpad, buttons on a touchscreen or even the handle of a hammer. The quality of this interface determines the pleasure of the interaction, and that it why I believe the most immersive way of gaming is on a MUD.</description></item><item><title>memcpy with Haskell and Vim</title><link>https://www.seastone.io/tech-notes/memcpy-with-haskell-and-vim/</link><pubDate>Mon, 18 Jun 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/memcpy-with-haskell-and-vim/</guid><description>I just got home from a very nice memcpy meetup, organized by Gianfranco Alongi and hosted by Patrik Stenmark of Valtech. Thanks a lot for making this happen!</description></item><item><title>Changing your MAC address</title><link>https://www.seastone.io/tech-notes/changing-your-mac-address/</link><pubDate>Wed, 13 Jun 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/changing-your-mac-address/</guid><description>Say that you are, purely theoretically, sitting at an airport in France after a great Symfony Live 2012 Paris. This hypothetical airport would give you 15 min free WiFi and then require you to pay to keep using the Internet connection. If we wanted to continue this thought experiment we could try and hack the airport network security.</description></item><item><title>Factorials in Haskell</title><link>https://www.seastone.io/tech-notes/factorials-in-haskell/</link><pubDate>Tue, 29 May 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/factorials-in-haskell/</guid><description>Lorna Jane posted an example of recursive programming earlier today, using factorials as her example of it. Because factorials is a good example for beginner progammers and since I have just begun programming Haskell myself, I thought it might be fitting to give an example of how to do the same thing she does in PHP, in Haskell.</description></item><item><title>Haskell list comprehension to color states</title><link>https://www.seastone.io/tech-notes/haskell-list-comprehension-to-color-states/</link><pubDate>Tue, 15 May 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/haskell-list-comprehension-to-color-states/</guid><description>I am reading the book Seven Languages in Seven Weeks, by Bruce A. Tate, and my current chapter is on Haskell. This language is very different from what I am used to but I am definitely seeing its allure, with clean design and powerful expression.</description></item><item><title>Expected identifier error in Internet Explorer</title><link>https://www.seastone.io/tech-notes/expected-identifier-error-in-internet-explorer/</link><pubDate>Thu, 19 Apr 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/expected-identifier-error-in-internet-explorer/</guid><description>I recently bumped into the enigmatic error message Expected identifier in Internet Explorer. For the umpteenth time, I should say, and so I figured I might as well share and document it for future reference.</description></item><item><title>I look good naked</title><link>https://www.seastone.io/tech-notes/i-look-good-naked/</link><pubDate>Mon, 09 Apr 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/i-look-good-naked/</guid><description>It is the yearly CSS naked day! This is when we strip off our style sheets and expose the bare truth of our HTML.</description></item><item><title>RSS accessibility - no excuses</title><link>https://www.seastone.io/tech-notes/rss-accessibility-no-excuses/</link><pubDate>Wed, 21 Mar 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/rss-accessibility-no-excuses/</guid><description>Modern time web development is often approached with device agnosticistic mindset. Whether your visitor is on a laptop, a tablet or even a TV, your presentation should adopt and work for them. Great progress is being made all the time in this area but I feel there is one old timer we keep forgetting about - the RSS feed.</description></item><item><title>Three tenets of pair programming</title><link>https://www.seastone.io/tech-notes/three-tenets-of-pair-programming/</link><pubDate>Sun, 18 Mar 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/three-tenets-of-pair-programming/</guid><description>I was just reading some articles on TechCrunch about pair programming and its pros and cons. This is the kind of subject it seems you have either tested and love it or think it sounds weird and will never even try.</description></item><item><title>Facebook PHP SDK with Composer</title><link>https://www.seastone.io/tech-notes/facebook-php-sdk-with-composer/</link><pubDate>Fri, 16 Mar 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/facebook-php-sdk-with-composer/</guid><description>Just a little while ago, Facebook merged a pull request which enables developers to use Composer to handle their dependencies to the Facebook PHP SDK. Since I wrote about this earlier, I thought it would be fitting to follow up with a howto now that it is in. Let us dive right into it.</description></item><item><title>Rally for PHP</title><link>https://www.seastone.io/tech-notes/rally-for-php/</link><pubDate>Fri, 16 Mar 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/rally-for-php/</guid><description>The PHP community has a reputation for being fragmented and unable to pool together. It is often seen as the language where wheel reinventing is a recognized sport. While this might have been true 5+ years ago, there is now a strong movement to improve.</description></item><item><title>Settle your technical debt</title><link>https://www.seastone.io/tech-notes/settle-your-technical-debt/</link><pubDate>Tue, 03 Jan 2012 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/settle-your-technical-debt/</guid><description>If you have worked with a system of any significant age I am certain you have heard the term &lt;em&gt;technical debt&lt;/em&gt;. It is what you owe the system from your accumulated shortcuts and hacks. And any further effort not focused on repaying this debt will lead to increased interest.</description></item><item><title>jQuery ID selector performance</title><link>https://www.seastone.io/tech-notes/jquery-id-selector-performance/</link><pubDate>Mon, 12 Dec 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/jquery-id-selector-performance/</guid><description>I recently stumbled over a piece of JavaScript code looking something like this.</description></item><item><title>Order condition's expected and actual value</title><link>https://www.seastone.io/tech-notes/order-condition-s-expected-and-actual-value/</link><pubDate>Fri, 09 Dec 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/order-condition-s-expected-and-actual-value/</guid><description>Following Symfony&amp;rsquo;s Coding Standards you should place the expected value before the actual value in an if statement.</description></item><item><title>Sensio Connect for the Symfony community</title><link>https://www.seastone.io/tech-notes/sensio-connect-for-the-symfony-community/</link><pubDate>Wed, 09 Nov 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/sensio-connect-for-the-symfony-community/</guid><description>Yesterday Fabien introduced a service called Sensio Connect. It is a community platform unlike any I have seen before.</description></item><item><title>Skip THOSE comments in your code</title><link>https://www.seastone.io/tech-notes/skip-those-comments-in-your-code/</link><pubDate>Fri, 04 Nov 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/skip-those-comments-in-your-code/</guid><description>You know the kind. Let us break free of them.</description></item><item><title>Generate htpasswd for Nginx</title><link>https://www.seastone.io/tech-notes/generate-htpasswd-for-nginx/</link><pubDate>Sat, 29 Oct 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/generate-htpasswd-for-nginx/</guid><description>When I configure a new site on Nginx I always have to look up how to generate those htpasswd files. So here is a quick note for future reference.</description></item><item><title>Installing Redis on Ubuntu with APT</title><link>https://www.seastone.io/tech-notes/installing-redis-on-ubuntu-with-apt/</link><pubDate>Mon, 19 Sep 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/installing-redis-on-ubuntu-with-apt/</guid><description>Deciding to use APT to maintain your software is really a no-brainer if you are Debian based. I prefer Ubuntu myself and its repositories has a lot of toys in them but for stability reasons they often do not hold the very latest versions.</description></item><item><title>There is a bundle for that!</title><link>https://www.seastone.io/tech-notes/there-is-a-bundle-for-that/</link><pubDate>Mon, 05 Sep 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/there-is-a-bundle-for-that/</guid><description>Being a Drupal developer (among other things) there is one phrase I am guilty of having used more than a dozen times; &amp;ldquo;there is a module for that&amp;rdquo;. I believe the sheer number of third party modules is in large what has made Drupal the big player it is.</description></item><item><title>Symfony2 file permissions in Ubuntu</title><link>https://www.seastone.io/tech-notes/symfony2-file-permissions-in-ubuntu/</link><pubDate>Fri, 02 Sep 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/symfony2-file-permissions-in-ubuntu/</guid><description>The Book has a section on setting up permissions for your project. It says to first try and use chmod because that is, it claims, how most systems controls their ACLs. This is only true for Mac OSX however. For Unix and Linux based ones, ACL is actually controlled using setfacl.</description></item><item><title>Debugging Google Analytics</title><link>https://www.seastone.io/tech-notes/debugging-google-analytics/</link><pubDate>Sun, 28 Aug 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/debugging-google-analytics/</guid><description>As much as I love working with Google Analytics, developing for it can sometimes be quite a hassle. Basically it consists of defining your data, calling the ga.js script and then hoping it takes care of business. But does it really and how can you tell?</description></item><item><title>Language prefix and Google Analytics</title><link>https://www.seastone.io/tech-notes/language-prefix-and-google-analytics/</link><pubDate>Sun, 14 Aug 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/language-prefix-and-google-analytics/</guid><description>With an out-of-the-box tracking script for Google Analytics you will record every page on your site as is. This means that the English version of your &amp;ldquo;About&amp;rdquo; page could be reported as /en/about and the Swedish one as /sv/about. That setup makes it difficult to analyze your traffic.</description></item><item><title>Symfony2 validation in XML</title><link>https://www.seastone.io/tech-notes/symfony2-validation-in-xml/</link><pubDate>Thu, 28 Jul 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/symfony2-validation-in-xml/</guid><description>I have made it through half of the Symfony2 bible and am now reading up on validation. I am using XML for my bundle configuration, so I switched to that format in the examples and used the following to constraint my Log entity.</description></item><item><title>Communities comparison for PHP frameworks</title><link>https://www.seastone.io/tech-notes/communities-comparison-for-php-frameworks/</link><pubDate>Mon, 25 Jul 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/communities-comparison-for-php-frameworks/</guid><description>The landscape of PHP is changing. We are witnessing a rapid evolution in framework architecture and there are a great many exceptional ones out there. Putting your time into learning one will doubtlessly pay off for many years ahead. But which should you pick?</description></item><item><title>PHP session garbage collection</title><link>https://www.seastone.io/tech-notes/php-session-garbage-collection/</link><pubDate>Sun, 17 Jul 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/php-session-garbage-collection/</guid><description>I just bumped into a notice from PHP about a failed session_start(). Here is how I solved it.</description></item><item><title>Monitor and debug with Charles proxy</title><link>https://www.seastone.io/tech-notes/monitor-and-debug-with-charles-proxy/</link><pubDate>Sun, 10 Jul 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/monitor-and-debug-with-charles-proxy/</guid><description>A while ago I was introduced to Charles - a web debugging proxy application. It acts as a middle man between your browser and your web application, where it can do a multitude of helpful services.</description></item><item><title>Different titles in Google SERP</title><link>https://www.seastone.io/tech-notes/different-titles-in-google-serp/</link><pubDate>Thu, 07 Jul 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/different-titles-in-google-serp/</guid><description>Today at work we discovered a very odd issue with the Dutch SERP. It was how the page at mariabingo.com/en/casino was represented.</description></item><item><title>Installing Phrozn PHP on Ubuntu</title><link>https://www.seastone.io/tech-notes/installing-phrozn-php-on-ubuntu/</link><pubDate>Sun, 03 Jul 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/installing-phrozn-php-on-ubuntu/</guid><description>I was recently inspired by an article written by Christian Schaefer, on the Phrozn project. A very impressive PHP based static site generator!</description></item><item><title>Fixing readline for the Ruby on Rails console</title><link>https://www.seastone.io/tech-notes/fixing-readline-for-the-ruby-on-rails-console/</link><pubDate>Sun, 19 Jun 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/fixing-readline-for-the-ruby-on-rails-console/</guid><description>I have begun trying out the Ruby on Rails framework. While doing so I got stuck at a very early stage in the documentation.</description></item><item><title>Hosting Silex apps on PHP PaaS Pagoda Box</title><link>https://www.seastone.io/tech-notes/hosting-silex-apps-on-php-paas-pagoda-box/</link><pubDate>Sat, 28 May 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/hosting-silex-apps-on-php-paas-pagoda-box/</guid><description>The PHP microframework Silex is an outstanding piece of software and Pagoda is a PHP PaaS I have grown quite fond of. Obviously marrying these two would be ideal.</description></item><item><title>The new era of PaaS to host and deploy PHP</title><link>https://www.seastone.io/tech-notes/the-new-era-of-paas-to-host-and-deploy-php/</link><pubDate>Mon, 23 May 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/the-new-era-of-paas-to-host-and-deploy-php/</guid><description>As a PHP developer I am expected to lament my fate of inconsistent naming and envy the slick hipster world of Ruby (on Rails). Be that as it may, I must honestly say I have missed something like the excellent Heroku platform for hosting and deploying my applications.</description></item><item><title>DOM traversing with XPath in PHP</title><link>https://www.seastone.io/tech-notes/dom-traversing-with-xpath-in-php/</link><pubDate>Tue, 10 May 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/dom-traversing-with-xpath-in-php/</guid><description>You can extract data from an XML or (X)HTML document by using regexp. However as in many cases with techniques and systems – just because you can does not mean you should.</description></item><item><title>Configuring Unicode domains with Punycode</title><link>https://www.seastone.io/tech-notes/configuring-unicode-domains-with-punycode/</link><pubDate>Fri, 06 May 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/configuring-unicode-domains-with-punycode/</guid><description>If you have a domain with Unicode characters, like tobiassjösten.se, there are some gotchas to consider.</description></item><item><title>Symfony2 CLI bash script</title><link>https://www.seastone.io/tech-notes/symfony2-cli-bash-script/</link><pubDate>Wed, 13 Apr 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/symfony2-cli-bash-script/</guid><description>Since I have been trying out Symfony2 lately, I felt it was time to revise my old bash script for Symfony CLI and have it work with the new version of this lovely framework.</description></item><item><title>CSS Naked Day 2011</title><link>https://www.seastone.io/tech-notes/css-naked-day-2011/</link><pubDate>Sat, 09 Apr 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/css-naked-day-2011/</guid><description>Today is CSS Naked Day! This is when we rid our sites of styling to celebrate the open web standards and proper, semantic markup.</description></item><item><title>Centralized user authentication/management</title><link>https://www.seastone.io/tech-notes/centralized-user-authentication-management/</link><pubDate>Sat, 02 Apr 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/centralized-user-authentication-management/</guid><description>I am looking into how you could offer authentication and user management in a centralized manner, to a multitude of satellite sites. The most common way of doing this nowadays, especially for third party satellites, is using &lt;em&gt;the OAuth protocol&lt;/em&gt; and while it is a very sturdy mechanism it does not fit exactly with my requirements.</description></item><item><title>Stopping spam with Symfony forms</title><link>https://www.seastone.io/tech-notes/stopping-spam-with-symfony-forms/</link><pubDate>Mon, 28 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/stopping-spam-with-symfony-forms/</guid><description>I have previously been writing about my efforts to stop spam by resolving MX records for email addresses and by using a honeypot to trick spammer bots into revealing themselves. But still spammers are bypassing my simple protections, so I needed to add another layer and test out one more idea.</description></item><item><title>Facebook canvas with HTTP problems</title><link>https://www.seastone.io/tech-notes/facebook-canvas-with-http-problems/</link><pubDate>Sun, 27 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/facebook-canvas-with-http-problems/</guid><description>A few weeks ago I built a simple Facebook app that, among other things, would provide a canvas page. It worked perfectly when prototyping but a few coding hours later it suddenly stopped working.</description></item><item><title>Stopping spam with a tasty honeypot</title><link>https://www.seastone.io/tech-notes/stopping-spam-with-a-tasty-honeypot/</link><pubDate>Tue, 22 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/stopping-spam-with-a-tasty-honeypot/</guid><description>Yesterday I implemented spam protection that would resolve MX records in order to validate the comment. It seems to be working but some spammers still got through. So I needed to up my game and head for round two.</description></item><item><title>Resolving MX pointers to fight spam</title><link>https://www.seastone.io/tech-notes/resolving-mx-pointers-to-fight-spam/</link><pubDate>Mon, 21 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/resolving-mx-pointers-to-fight-spam/</guid><description>As some of you might have noticed (and some even pointed out) I have had some trouble with spam lately. After dismissing the notion to disable comments altogether, I set out to find a solution to fight the spam.</description></item><item><title>PHP to 1000 without conditionals and loops</title><link>https://www.seastone.io/tech-notes/php-to-1000-without-conditionals-and-loops/</link><pubDate>Mon, 14 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/php-to-1000-without-conditionals-and-loops/</guid><description>Earlier today I stumbled on a Stackoverflow challenge where the poster asked for C/C++ code that would count from 1 to 1000 without using conditionals or loops. Then just now I noticed how Justin Vincent at Pluggio had done the same in PHP, my interest sparked. A moment later I now have my own code to meet the challenge.</description></item><item><title>Configure xterm title from your Bash prompt</title><link>https://www.seastone.io/tech-notes/configure-xterm-title-from-your-bash-prompt/</link><pubDate>Thu, 03 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/configure-xterm-title-from-your-bash-prompt/</guid><description>Many developers, me included, live out most of their lives in the terminal. But what about the rest of the time? Most likely your terminal stays minimized or otherwised hidden in an activity bar. If you are anything like me you will have lots and lots of such tabs in the activity bar. So how do we find our way back to the right terminal?</description></item><item><title>Separating your theme's preprocess functions</title><link>https://www.seastone.io/tech-notes/separating-your-theme-s-preprocess-functions/</link><pubDate>Tue, 01 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/separating-your-theme-s-preprocess-functions/</guid><description>Preprocess functions are often a major part of any Drupal theme. It is a vital part of themes but more than often it leads to very big &lt;code&gt;template.php&lt;/code&gt; files. Today I stumbled upon a simple but brilliant way to reduce its size by separating its logic into nicely shaped and separated files.</description></item><item><title>Automating the Interwebs with IFTTT</title><link>https://www.seastone.io/tech-notes/automating-the-interwebs-with-ifttt/</link><pubDate>Fri, 25 Feb 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/automating-the-interwebs-with-ifttt/</guid><description>February 17th I was enrolled in the beta preview of IFTTT, short for &lt;em&gt;If This Then That&lt;/em&gt;. Now that I have been trying it out some I want to share my experiences.</description></item><item><title>Dynamic prompt with Git and ANSI colors</title><link>https://www.seastone.io/tech-notes/dynamic-prompt-with-git-and-ansi-colors/</link><pubDate>Tue, 15 Feb 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/dynamic-prompt-with-git-and-ansi-colors/</guid><description>I recently tinkered (again) to put my current Git working branch in my prompt. It resulted in very useful addition to the tool I use a lot in my everyday work. However it turned out my implementation had a bug.</description></item><item><title>Add current Git branch to your Bash prompt</title><link>https://www.seastone.io/tech-notes/add-current-git-branch-to-your-bash-prompt/</link><pubDate>Sat, 12 Feb 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/add-current-git-branch-to-your-bash-prompt/</guid><description>Following up on my post about Git aliases, I want to share another convenience tool for using Git. This time we will talk prompt enhancement – the terminal alternative to plastic surgery.</description></item><item><title>Configure Git aliases to save the day</title><link>https://www.seastone.io/tech-notes/configure-git-aliases-to-save-the-day/</link><pubDate>Thu, 10 Feb 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/configure-git-aliases-to-save-the-day/</guid><description>My morning started out great today. The sun came out solely to greet me, birds were chirping my praise and the coffee tasted especially well. You know the scenario. And then this&amp;hellip;</description></item><item><title>jQuery Mobile alpha 3 released</title><link>https://www.seastone.io/tech-notes/jquery-mobile-alpha-3-released/</link><pubDate>Fri, 04 Feb 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/jquery-mobile-alpha-3-released/</guid><description>jQuery Mobile, an excellent framework for mobile site development, has just released its alpha 3 version. There has been many improvements, with focus on snappier experience and more flexible usage.</description></item><item><title>Doctrine migrations gotchas in Symfony</title><link>https://www.seastone.io/tech-notes/doctrine-migrations-gotchas-in-symfony/</link><pubDate>Thu, 03 Feb 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/doctrine-migrations-gotchas-in-symfony/</guid><description>After having wrestled with Doctrine migrations I now have working code and my data is safe. But before I go on with my life I wanted to take a minute and post my findings, with hopes of helping future migraters.</description></item><item><title>Static class variable for all instances</title><link>https://www.seastone.io/tech-notes/static-class-variable-for-all-instances/</link><pubDate>Thu, 03 Feb 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/static-class-variable-for-all-instances/</guid><description>I just got a question on Aardvark asking if you could somehow share a variable value between multiple instances of the same class. Since the value is an array you could not do this with a class constant.</description></item><item><title>The missing Facebook trio</title><link>https://www.seastone.io/tech-notes/the-missing-facebook-trio/</link><pubDate>Sun, 30 Jan 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/the-missing-facebook-trio/</guid><description>I am building an app that, among other things, lists your Facebook friends. All of a sudden I noticed my images were mismatched. That is not my Facebook friends! So I scanned the list from the top and noticed a face that was familiar – The Zuck, founder of Facebook. Obviously I had ran into a bug.</description></item><item><title>Keeping Google juice with HTTP 503</title><link>https://www.seastone.io/tech-notes/keeping-google-juice-with-http-503/</link><pubDate>Wed, 19 Jan 2011 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/keeping-google-juice-with-http-503/</guid><description>My Drupal consultance firm recently re-launched our website. Our time schedule was pressed, to say the least, so we decided to not migrate the blog just yet. In order to not lose out on our &amp;ldquo;Google juice&amp;rdquo; we decided to set up some HTTP magic to keep the crawlers at bay.</description></item><item><title>Correct IP with reverse proxy and Drupal</title><link>https://www.seastone.io/tech-notes/correct-ip-with-reverse-proxy-and-drupal/</link><pubDate>Fri, 17 Dec 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/correct-ip-with-reverse-proxy-and-drupal/</guid><description>If you are running a reverse proxy, like Varnish or Squid, in front of your webserver, then it will report the proxy&amp;rsquo;s IP address instead of the visitors&amp;rsquo;. This is a problem if you, for example, allow anonymous users to vote with VotingAPI.</description></item><item><title>Cross-site request forgery example</title><link>https://www.seastone.io/tech-notes/cross-site-request-forgery-example/</link><pubDate>Fri, 03 Dec 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/cross-site-request-forgery-example/</guid><description>First let me thank you! Your contribution is very much welcome and I really appreciate you taking the time to help me promote my favourite open source projects.</description></item><item><title>Add Drupal nodes to the front of nodequeues</title><link>https://www.seastone.io/tech-notes/add-drupal-nodes-to-the-front-of-nodequeues/</link><pubDate>Mon, 29 Nov 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/add-drupal-nodes-to-the-front-of-nodequeues/</guid><description>The default behaviour of Nodequeues is to append new nodes last in its queues. Recently for a client we needed to change this and it turned out to be easy, using Nodequeue&amp;rsquo;s rich API. Still, someone else mightalso have this need so I wanted to share the recipe.</description></item><item><title>Dispatching Drupal hooks</title><link>https://www.seastone.io/tech-notes/dispatching-drupal-hooks/</link><pubDate>Wed, 10 Nov 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/dispatching-drupal-hooks/</guid><description>The word &lt;em&gt;function&lt;/em&gt; implies its intended scope. A function should strive to leverage exactly one functionality. If you are cramming more than that into your function, then you probably need to do some refactoring. One situation where you are often forced to go against this is when implementing hook_block() in Drupal.</description></item><item><title>Rel nofollow is killing the Internet</title><link>https://www.seastone.io/tech-notes/rel-nofollow-is-killing-the-internet/</link><pubDate>Sun, 07 Nov 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/rel-nofollow-is-killing-the-internet/</guid><description>Linking between pages and websites is what makes up our World Wide Web. To protect our sites from spammers we have lately been given the tool to mark certain links with the nofollow attribute. But now that we are going overboard with them, what does that actually do to the web?</description></item><item><title>A* algorithm for the shortest/cheapest path</title><link>https://www.seastone.io/tech-notes/a-algorithm-for-the-shortest-cheapest-path/</link><pubDate>Sat, 06 Nov 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/a-algorithm-for-the-shortest-cheapest-path/</guid><description>Yesterday I submitted my contribution to that PHP contest I have been writing about. I think this kind of event is a great opportunity to improve ones programming skills and since the deadline is over I thought I would share my code and thoughts on it.</description></item><item><title>Performance of PHP functions</title><link>https://www.seastone.io/tech-notes/performance-of-php-functions/</link><pubDate>Wed, 03 Nov 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/performance-of-php-functions/</guid><description>I was recently watching a JSConf.eu session by Thomas Fuchs, in which he goes through some known and some not so known techniques to speed up your JavaScript code. One of the speed impediments was function calls and because it had such a major impact on the performance, I decided to benchmark how it performed in PHP.</description></item><item><title>Benchmarking PHP array concatenation</title><link>https://www.seastone.io/tech-notes/benchmarking-php-array-concatenation/</link><pubDate>Sun, 31 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/benchmarking-php-array-concatenation/</guid><description>I recently began working on a contribution to a small programming contest, where the challenge is to optimize ones code to run as fast as possible. One of the parts in my code that caught my interest was some implode() calls. My gut feeling told me that it might be slower than a straight string concatenation.</description></item><item><title>Symfony plugin for Flattr</title><link>https://www.seastone.io/tech-notes/symfony-plugin-for-flattr/</link><pubDate>Thu, 21 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/symfony-plugin-for-flattr/</guid><description>I just finished writing some documentation for my first Symfony plugin – sfFlattrPlugin! I encourage you to try it out and let me know what you think. Everything is up at GitHub, which means that you can easily share whatever improvements you conjure up.</description></item><item><title>Symfony CLI helper script</title><link>https://www.seastone.io/tech-notes/symfony-cli-helper-script/</link><pubDate>Mon, 11 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/symfony-cli-helper-script/</guid><description>I move around a lot when developing with Symfony. This is usually not a problem but with the Symfony CLI tool stuck in the root of projects, I felt it was a hassle. To solve this problem I wrote a little bash script which will give you a convenient way to access the CLI script from anywhere in your Symfony project.</description></item><item><title>Tracking Google Analytics events with Symfony</title><link>https://www.seastone.io/tech-notes/tracking-google-analytics-events-with-symfony/</link><pubDate>Sat, 09 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/tracking-google-analytics-events-with-symfony/</guid><description>I just finished implementing a first whack at tracking events with Google Analytics. For this experiment I picked the &amp;ldquo;elsewhere links&amp;rdquo; in the footer. Now when you click one these, you will trigger an event which will be tracked by Google Analytics. The idea is that I can then easily see which one is more popular, how their popularity changes over time, how nationality affects popularity, etc.</description></item><item><title>Using www for your domain</title><link>https://www.seastone.io/tech-notes/using-www-for-your-domain/</link><pubDate>Wed, 06 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.seastone.io/tech-notes/using-www-for-your-domain/</guid><description>One of the questions I was trying to sort out while creating tobiassjosten.net was whether to use the www subdomain or not. There are pros and cons both for using it and not using it and deciding on it is not always easy. In this article I will be trying to break it down and hopefully you and me both will be the wiser towards the end.</description></item><item><title>About</title><link>https://www.seastone.io/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.seastone.io/about/</guid><description>&lt;p&gt;Software engineer and entrepreneur; founder, author, and practitioner. I explore how better system design leads to better outcomes across software, organizations, businesses, and everyday practice.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent over 15 years in the trenches of software engineering, from writing code to leading teams to advising executives. I started as a developer, fascinated by the craft of building software. But as my career progressed, I discovered that the hardest problems weren&amp;rsquo;t technical — they were human. How do you build a team that collaborates effectively? How do you scale an organization without losing what made it great? How do you bridge the gap between technical execution and business strategy?&lt;/p&gt;</description></item><item><title>AI-led software development program</title><link>https://www.seastone.io/ai-development-program/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.seastone.io/ai-development-program/</guid><description/></item><item><title>Let's make your software organization work better.</title><link>https://www.seastone.io/work-with-me/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.seastone.io/work-with-me/</guid><description/></item></channel></rss>