Mikael's blog

A developers seventh time trying to maintain a blog

Tag #blog

The seventh blog | July 20, 2023 at 12:07

The seventh blog has gone live! I didn't dare to hope that this day would come, but a stint of bad (or not as great as usual) weather has left me with a lot of time for coding while my family wears out their phone batteries to the best of their abilities. ## The fixed and the missing While there was quite a lot of missing features a few days ago, there is now a working archive, tag cloud and even search(!). The latter was solved with [Orama](https://oramasearch.com/), formerly known as `Lyra`, and it does all the full-text searching client-side. It's all hooked up with a custom WebComponent and some clever index building with Astro. There will be a more complete writeup on it in the future, but for now you can check out the code over on GitHub. The link for that is at the [source page]

And just like that... | July 14, 2023 at 06:15

... I started on yet another rewrite. ## Stargazing I've had my eye on [Astro](https://astro.build) for a while now. One of the things that caught my eye was just how much it looked like [Svelte](https://svelte.dev). Consider the following examples: ````astro --- import BlogPost from "../components/BlogPost.astro"; const allBlogPosts = await fetch("https://blog.lofjard.se/api/blogposts/all", data => { return await data.json(); }); --- <div class="blog-list"> { allBlogPosts.map(item => ( <BlogPost item={item} /> ))} </div> <style> .blog-list { width: 600px; margin: 0 auto; } </style> ```` vs ````svelte <script> import BlogPost from "../components/BlogPost.svelte"; const allBlogPosts = await fetch("https://blog.lofjard.se/api/blogposts/all", data => { return await data.j

New blog on the way | April 15, 2022 at 19:57

I've spent the last week in the mountains, skiing, relaxing and eating well. I also took some time rewriting my blog. The old blog relies on client certificates to enter the admin area. This worked like a charm while I had the certificates on hand, but now, 8 years, 4 computers and a whole lot of reinstalls later, they are nowhere to be found. The new blog is written using Svelte (because why not?) and currently only lives on my laptop. I've written a new admin UI and established a proxy connection to my CouchDB instance through a SSH tunnel. All in all, I've gotten to the point where I can write new posts. (Yay!!) The new blog won't be online for a while though since I need to write a real proxy backend for the database and set up some proper authentication for the admin UI first.

2014 In Review | December 31, 2014 at 13:12

It has been a bad year for my blog. Early on I started working on a new blogging platform that would also support a number of other content types to better reflect my life. I wanted to host my own data from my running and mountain biking activities and I wanted to review at least a part of all the tech and sporting equipment I've bought over the year. None of this came to pass... ...and I'm quite ashamed... ...and consider it a personal failure. The new platform is still under construction and I'm thinking of breaking it into parts and doing a partial release as soon as possible, though that might still be closer to the end of Q1 2015. New hardware for my office has been ordered a few days ago and I hope I will get some time to do some serious bare knuckle programming done as soon a

Summer is Coming | May 23, 2014 at 20:58

And with summer, my almost year long blog hiatus ends. July 31st 2013 was the day my second daughter was born. Besides installing some long forgotten parts in the server machine, little has happened since then. Well, little has happened with regards to the blog, that is. September 25th marked my 31st birthday and the scale tipped at 90 kilograms. I strapped on my running shoes and started running. Once a week. Then twice a week. For a while I ran three times a week. I also cut all my intake of carbohydrates, except for one beer each weekend, and about two weeks after Christmas the blinking digits underneath my feet presented themselves as 75 kilograms. I've kept on running ever since. Then the year 2014 happened and boy did it happen fast. It's already May and I've yet to write a sing

The End of May | May 31, 2013 at 15:30

The blog has been silent lately but i certainly have not been sitting still. About a month ago I started to remake the administration area of the blog into something a bit more fashionable (today it consists of a few input boxes and a "publish" button). Halfway through I decided to rewrite it using AngularJS. Needles to say, I'm not quite done with it yet but it's a work in progress and it's going to be awesome. My great friend and fellow coder Mattias spent a long weekend here and we put together a little P2P file sharing site using Node.js, AngularJS and Web RTC data channels. It's really cool but like most things, it needs a little more work. It's [up on GitHub though](https://github.com/mlofjard/WebDrop) if anyone wants to take a peek at it. The day before yesterday I beefed up secur

Decreasing Load Time When Using Google Web Fonts | May 4, 2013 at 08:19

I've been using [Google Web Fonts](http://www.google.com/webfonts) ever since I started building this blog. It's an awesome service with a great user interface and it makes it really easy to add fonts to your web site. Of course I had to find something wrong with it. Earlier this week our company released our new web site. On our Yammer page, one of my colleagues posted a link to [a WebPageTest result](http://www.webpagetest.org/result/130503_CB_P7E/) for it and it fared reasonably well. It got an "F" on the "First Byte Time" test, but that test is really finicky and could just as well show an "A" if you retake the test (as I later became aware). This triggered my inner masochist and I just had to run the same test on this blog. The first result was this: Test | Score ----|:--: First B

Pictures! | April 30, 2013 at 09:03

I've been hacking away at the blog again and made a little nifty photo uploader for the admin area. It resizes the image on the client (browser) before uploading it with Ajax which is great because now I can upload directly from my phone without worrying about file size. The uploader really needs its own blog post but I'm heading out so in the meanwhile, here is a sneak preview of things to come! ![Robotics](/img/upload/c79b3b1d-1008-4be5-b56d-f6f7587e99f8.jpg "The Pi-bot") Oh, that's right; inline pictures are working as well. Remember to refresh your browser cache if stuff looks weird.

Search And You Shall Find | April 26, 2013 at 22:09

Every blog should have a search box. Not because it's necessary, but because it's fun to implement. A few weeks ago I ran across a small Javascript library called [Lunr.js](https://github.com/olivernn/lunr.js). It's basically a small text indexer that can rank search results and it's written entirely in Javascript, just the way I like it. Setting up an index is really easy: ```js var searchIndex = lunr(function () { this.field('title', { boost: 10 }) this.field('content') }); ``` Then you just add some documents to the index: ```js var doc = { id: "a-blog-post-title", title: "A Blog Post Title", content: "This is a crummy example blog post...", }; searchIndex.add(doc); ``` Then you can search for it by simply calling `searchIndex.search('crummy blog');` and that will return

New Drapes | April 22, 2013 at 21:32

I got tired of the old dark green design. It was too murky and spring is in the air, so I redesigned the site to be lighter and more "spring-y". ## Old friends ````js var awesome = "Inconsolata is back!"; ```` `Inconsolata` is back as the source code font and `Open Sans` makes up the majority of the text on the blog now with the exception of headers which are set in `Racing Sans One`. All-in-all, I'm happier. And hopefully this can trigger my implementation of multiple pictures per post since I need that to report on my robot project progress. Summer is coming and summer means sun, and sun means solar power which in turn means that I need to speed things up if I want this project done before the (OMG spoiler alert!) new baby in the end of July.

4 Hours of Markdown | March 29, 2013 at 13:17

Wow, that was kind of exhausting. I've completed my rewrite of all my blog posts into Markdown. Somewhere in the middle I found why my inline HTML didn't work and that made my old posts look almost acceptable, but the syntax highlighted source code didn't work anymore since I had moved the highlighting code into the `marked` configuration. So on I went into the abyss, continuing to rewrite (more like edit) all my older posts. While I was at it I re-indented all source code examples into using 2-space indentation. Man, some posts do have a lot of source code in them. =) I made good use of SSH for connecting to my server from my parents-in-laws' cabin (where I've spent the last week). `ssh -L 8080:localhost:5984 lofjard.se` made sure I could connect to the CouchDB instance on lofjard.se.

Marked Up With Markdown | March 28, 2013 at 14:59

Desperate, as always, for lowering my blogging threshold I implemented [Markdown](http://daringfireball.net/projects/markdown/) syntax for the blog. As I did this through use of the [marked](https://github.com/chjj/marked/) plugin I lost support for inline HTML (might be a setting though). For a few hours this means that my old blog posts will look ugly until I've gone through the backlog and converted it to Markdown.

OMG New Certificates | February 6, 2013 at 14:09

One might wonder where I've been or what I've been up to these last couple of months. One would be right to wonder why I, so close to the one year anniversary of this blog, suddenly stopped writing. The truth is kind of embarassing. ## What did you do? I created a bunch of SSL certificates that were set to expire in a year (by not changing the default value). So here I was, wanting to write to you about building a robot, going to FOSDEM, hacking away at my blog etc, but I just couldn't. Well not in any easy way anyway. ## But isn't that an easy fix? My first thought was to generate new client certificates but that was when I realised that my server certificates had expired as well and my CA certificate had been lost in the [maintenance](http://lofjard.se/post/maintenance-in-progres

The Fabulous Pi | October 4, 2012 at 19:08

In March this year I took a great leap forward in performance when I [built my in-memory cache](http://lofjard.se/post/cache-me-if-you-can). It took my blog from a paltry 5 requests per second to a whooping 62 requests per second. Well, since then I've made some changes... ## The Replacement Since you already know [The Plan](http://lofjard.se/post/maintenance-in-progress), let's go ahead and talk a little about what the temp agency sent over; The Raspberry Pi. The Raspberry Pi is a $35 computer the size of a credit card. It comes with 2 USB ports, HDMI, 100 Mbit ethernet, a SD card reader for storage and it's powered by a cellphone charger. It's also quite similiar to the budget smartphone innards of yesteryear. The Raspberry Pi packs a 700 MHz ARM 11 processor and 256 MBytes of RAM.

Maintenance In Progress | September 30, 2012 at 17:49

I've embarked upon my mission to upgrade my server installation. It's probably going to take the better part of this week but I hope to be done by this weekend when my parents-in-law are coming to stay with us. Here's my todo-list as of now. 1. Find a temporary server to host the blog on while installing new stuff on <abbr title="Itty Bitty Server">IBS</abbr>. 1. Grab nearest piece of unused computer tech capable of running Linux. (Yay, my RaspberryPi) 1. Install Raspbian.<br/>(Since it's just a temporary server I didn't bother playing with Arch Linux ARM. Raspbian is what most people are using on their RPis so I figured it would have a decent repository of pre-compiled software.) 1. Install nginx. (This was easy, it was in the repos.) 1. Install CouchDB. (Again, in

Old But Not Dying | September 20, 2012 at 07:35

Tuesday the 25th of September 2012 marks my 30th birthday. Even though I might not be fresh meat anymore, I haven't forgotten about my blog. I've just been busy (raise your hand if you've heard that one before). ## The Best Laid Plans of Mice and Me... * I've been planning an article about my success in getting my laptop installed with Arch Linux on UEFI, but I've yet to complete it. * I've also redesigned the blog and it now looks like crap in Firefox. * I then fixed the Firefox bugs but have'nt gotten around to uploading them because of my next bullet point. * My server operating system/software stack is ooooold. :-) ## Planned maintenance My pretty little server <abbr title="Itty Bitty Server">IBS</abbr> is running Ubuntu Server 10.4 LTS. My original plan was to update it to 12.04

LESS Is More, More Or Less | March 8, 2012 at 23:05

A while back I read a blog post somewhere about how the [LESS](http://lesscss.org/) parser/compiler had been remade in Javascript. "Well awesome", I thought to myself as I had been wanting some more flexibility in CSS but had been to stubborn/proud to install the SASS compiler since it's written in Ruby. Needles to say, I wanted to incorporate it in my blog as soon as possible but I've not had the time to actually do it until now. #### LESS you say? LESS (like SASS) is a CSS derived language that adds a whole lot of long needed features to CSS to ease maintenance of large style sheets. It compiles into regular CSS markup either in realtime (through their nifty Javascript implementation in the browser) or, as in my case, as a bootstrapping task when I start my blog. For now, it's tacked

Cache Me If You Can | March 6, 2012 at 22:30

Today at work was "do-anything-but-work-day". It's a bit like Googles 20%, but instead of 20% it's more like <del>.0001%</del> <ins>.8%</ins> or something like that. It's was our first time and not that many people had a clear idea about what to do at first. I on the other hand had a mission all planned out. #### The Performance Degradation When I put the blog on the new server back in January, I noticed a [small decrease](http://lofjard.se/post/say-welcome-to-ibs) in performance. After a few tests I've realized that the CPU is the culprit. The Atom D525, while dual-core, at 1.6 GHz has roughly half the computational power of the Pentium M at 1.5 GHz, which was what my old server had under the hood. Node.js can make use to multi-core processors by starting more instances of itself, wh

The Development Environment Enigma | March 3, 2012 at 10:22

As you might have noticed, there hasn't been much work done on the blog these last few months. It kind of boils down to complexity. ## The Old Setup When I started building this blog my main workstation was running Windows 7. Everything ran as well on Node.js on Windows as it did on my Linux server. It was a nice and simple setup; develop locally, test locally, deploy on server. ## Enter CouchDB Then I added a database. Specifically CouchDB that only worked on Linux. This meant a new, more complex development routine; develop locally, deploy on server, test on server, rince and repeat in case of error. This worked for a while but lately as the code has gotten more complex and it does a lot of pre-caching on startup, I've been longing for a locally deployed test version again. ## The

The Month of No Content | February 29, 2012 at 21:47

If not for this year being a leap year, there would have been no posts made this month. I plan on doing better. I also hope on getting ill a lot less in the months to come.

Content-Length - A HTTP Header/UTF-8 Story | January 27, 2012 at 14:01

The HTTP protocol has a lot of header fields that affects requests and responses. HTTP also have a couple of different request types (HEAD, GET, POST, PUT and DELETE). Unless you're building a <abbr title="Representational State Transfer">REST</abbr> service, you mostly have to deal with GET and POST on the web, and I don't even differentiate those as much as I should. A couple of weeks ago, a thought occurred to me; "What happens when I make a HEAD request to my blog?". Well the answer turned out to be pretty simple. Node.js ignores any calls made to the <code>write</code> method of the response object if the request was a HEAD request. That's all fine with me, but then I started thinking about what type of things should go into a HEAD response and if I could optimize anything. This lea

Say welcome to IBS! | January 10, 2012 at 22:23

The blog is now up and running on the new server (called <abbr title="Itty Bitty Server">IBS</abbr>). I'm not totally retiring the laptop yet as I might need it when the next Ubuntu LTS hits. And I have yet to try out if it's the Atom processor that makes CouchDB run a little slower on the new machine or if it's a 64-bit/SMP issue. Anywhooo, I'm going to let it run for a few days to see if it's up to the task so there might be some issues, resulting in unexpected downtime, popping up in the coming week. Do not be alarmed! =)

A New Home | January 6, 2012 at 11:51

I finally ordered a new server. It will probably take a few days to get it running (first I have to get the parts delivered), but at least I get to build a computer again. It was ages ago that I did my last build and I've never even touched an SSD or for that part anything using the SATA interface. That's how old I am; when I built my last computer, we all used IDE. The server computer is going to run my blog on a Linux OS somewhat similar to my current setup which means I don't need that much power. I think the most server load I've had on this blog so far is about 3 simultaneous requests, so I opted for small and quiet. ## The specs * ASUS AT5NM10T-I mainboard with an Intel Atom D525 CPU * Intel 320 Series 80 GB SSD * 2 sticks of 2 GB Kingston DDR3 RAM * Corsair TX V2 650W PSU * Lia

TODO 2012 | January 5, 2012 at 13:30

Between my trip to the west coast for Christmas and my office being jammed up with boxes, there hasn't been that much developing going on for me in the last few weeks. I have, however, not been able to stay away from it completely so a few nights ago I squeezed myself into my office chair and wrote some wierd scheduler/saga-mashup code that I'm going to need next week when I'm going back to work. But that is a topic for another day (or night). Today I'm just writing down some of the stuff I will, and would like to, do during 2012. ## My 2012 TODO list * Learn a few mobile web development frameworks. This will be my spring topic for my Tuesday workshops at work. * Scan all the codes from my IR remotes so that I can finally do something more that turn the TV on and off (although this was

The Gift of Source Code | December 21, 2011 at 16:00

I'm not sure if anyone is interested in my source code for this blog, but since I've already posted some bits and pieces of it from time to time, I thought, why not release it all? If your browser has a width of more than 720 pixels, you will see a new button in the menu labeled "Source code". Feel free to browse, and enjoy! DISCLAIMER: Not all of my code is that pretty and I've been meaning to refactor some of it. In other news, I'm leaving for the west coast tomorrow morning, so this might be my last post this year. It all really boils down to how tired I will be after playing with all my lovely nephews and nieces all weekend. Merry Christmas and Happy New Year!

Feeding the crowds | December 17, 2011 at 16:37

For a while now I've been trying to decide between ATOM and RSS for by blog feed, and yesterday one of our company's owners asked me for a feed to my blog so that he could consume it at our new company web site. I've finally decided to create an ATOM feed and if anyone has any problems consuming it, please contact me and I will try to fix it. For now it's not a full feed. Each entry contains the same amount of text as the archive listings since I've yet to figure out what to do about all the source code that's in my blog posts. The source code formatting relies heavily upon CSS and I'm not even sure that I want my full posts in the feed. Until I've made up my mind it will work mainly as a way of getting notified of new posts without having to visit the web site.

Client-side JavaScript Initialization | December 7, 2011 at 21:37

Yesterday I started using the [BundleController](http://lofjard.se/post/automatic-minification-and-bundling-with-nodejs) with my JavaScript files on the client-side. I also deployed my [ViewManager](http://lofjard.se/post/handling-views-in-nodejs) so that all my views now uses the bundled and minified JavaScript file produced when I start (or restart) my Node.js server. This meant that all my JavaScript was being run on every page in the blog, and while it isn't that much JavaScript yet I still wanted to improve on it. I decided to make use of some closure magic and built something like this: ````js if (typeof(BlogPageFunctions) == 'undefined') { BlogPageFunctions = {}; } BlogPageFunctions.admin = function () { // query some objects with jQuery here, // bind up some events etc.

Handling Views in node.js | December 3, 2011 at 21:46

This weekend, my wife and daughter have been away up north, visiting my in-laws. I thought this would be a great opportunity for me to buffer up on some blog posts, but it seems like my inspiration mostly left with them. Last Tuesday at my weekly tutorial at work we did a bit of work with jQuery and Mustache. On my blog I use Mustache, not only on the client side, but on the server side as well. As I enjoy using the MVC pattern, I have tried to implement it to the best of my extent. ## First things first Mustache is a light weight templating engine with emphasis on simplicity. It's been implemented for a lot of languages and one of them is JavaScript. In Mustache, a template looks like this: ````html Hello, my name is {{name}}! ```` In my case the templates involve a lot of HTML, bu

The Logarithmic Tag Cloud | November 27, 2011 at 08:21

A few days ago I sat down and tagged all my posts. Last night I decided to write a tag cloud. ## The first try I started out with a simple linear scale: ````js var countDiff = maxCount - minCount; var sizeDiff = maxSize - minSize; if (countDiff == 0) countDiff = 1; // no divide by zero for (var i in doc) { var weight = (doc[i].value - minCount) / countDiff; var size = minSize + Math.round(sizeDiff * weight); model.tags.push( { tag: doc[i].key, size: size , count: doc[i].value } ); } ```` * `maxCount` - The highest occurance of any tag. * `minCount` - The lowest occurance of any tag. * `maxSize` - The biggest allowed font size. * `minSize` - The smallest allowed font size. * `doc[i].key` - The name of the current tag. * `doc[i].value` - The occurance of the current tag. It rende

Cleaning up | November 26, 2011 at 17:22

I'm starting to have quite a few views in CouchDB and I've done my best to name them in a logical way so that I can easily see what they do by reading their names. Today I created a couple of new views and I decided that I needed to rename some old ones for clarity. Just when I was about to hit 'Save' on one of my design documents I felt a cold shiver going down my spine. I stopped and thought about it for a second and I realized that I don't have a separate database for my development environment, nor do I want to have one. This made me take a different strategy. At the moment I have a lot of views that does the same thing but are named differently. That's because I created new views, with better names, instead of removing the old ones. I will remove the old ones after I'm done making su

A Simple Routing Solution with Node.js | November 25, 2011 at 22:27

A few days ago I wrote about [not reinventing the wheel](http://lofjard.se/post/why-node-static-is-a-good-idea). Today I'm going to talk about the opposite. If you're building an 'enterprise' grade application, reinventing the wheel is almost always the wrong thing to do. This blog however is something I do just for fun, and reinventing the wheel can sometimes be the best way to learn how stuff works. It's one of the reasons [Ayende](http://ayende.com/blog) had for writing [yet another document database](http://ravendb.net/), and it's the reason why I decided to write my own routing engine. Sure enough I could have used the very popular [Express](http://expressjs.com/) framework, but where's the fun in that? ## What I wanted As you might know, I work almost exclusively with the .Net st

Overhaulin' | November 24, 2011 at 01:08

Tomorrow (actually today when I write this) my daughters day care is closed and I get to spend the day with her at home. That meant that I could stay up late tonight and do some work on the blog. The last few days I've felt that the file sizes were beginning to get out of hand. This easily happens when you're writing JavaScript since it's kind of a cowboy language. I love that I am able to twist and bend the language to my will, but the same thing that makes JavaScript so powerful can also be its worst enemy. It's way to easy to loose control of yourself and before you know it you end up with a 1000-lines-of-code monster file and your head starts spinning every time you want to make a change to it. So today I rewrote the blog. Not all of the logic, but basically all of the architectural

Double linked paging in CouchDB | November 14, 2011 at 23:56

Yesterday I said that I would look into paging, as my post count had reached 10+, so that's what I did today. Paging in CouchDB isn't all that straight forward for a bunch of reasons that I'll try to explain. Firstly, to be able to query anything in Couch you need a View. A Couch View is basically a really fast hash of your documents that is constructed with a little piece of javascript (like everything in Couch). In my case it looks like this: ````js function(doc) { if(doc.type === "blogpost" && doc.published) { emit(doc.dateTime, doc); } } ```` The execution of this code is what makes Couch so fast for reads. The magic can be read about [here](http://couchdb.apache.org/docs/overview.html) and if you're interested in how Couch maintains its indexes, then it's a good read. It

Somewhat backwards compatible | November 14, 2011 at 16:55

I got the chance to see my blog through the eyes of Internet Explorer 8 today, and boy was that something to behold. There was no styling what so ever. It looked like the internet pre 1995. This site uses HTML5 and CSS3 and that is fine for most modern web browsers. Even those that has no support for HTML5 renders ok, mostly due to the fact that they ignore the tags they dont recognize and just renders them as they would any `<div>`-tag. But not dear Internet Explorer. Internet Explorer < 9 just ignores the tags and doesn't style what it doesn't know. Awesome! Good thing then that a couple of guys realized that you could trick IE into rendering unknown tags by creating them with javascript. ````js document.createElement("mysuperspecialtag"); ```` The above piece of javascript is all th

The Archive | November 13, 2011 at 22:16

While looking at my [Google Analytics](http://www.google.com/analytics/) statistics I noticed that my empty archive page had almost as many hits as the front page. And so, with little to loose, I set out to create a dynamic [archive](http://lofjard.se/archive). Now I don't even have paging on my front page yet, but since this is my 10th post I really should make that my next priority.

Bring in the spammers! | November 12, 2011 at 22:47

And the blogger said; "Let there be comments!", and he saw that it was good. I just finished a first 'draft' of a commenting system. Please don't abuse it.

Running on Couch | November 12, 2011 at 14:21

I'm home from &Oslash;redev and I just couldn't resist using some of my new found inspiration to get some work done on the blog. Apache is no more! The blog now runs fully on node.js and I even got around to putting all my static blog posts into CouchDB and it is now read from disk (or cache most likely) and then templated with Mustache to form my blog. This means that I can finally have unique links for each blog post which should make it a bit easier for me to promote my updates. As I currently don't have any way of writing posts on the site, I use the CouchDB admin interface. This I feel will probably change some time in the future, but for now it works for me.

Experimental server is up | November 4, 2011 at 20:52

I've put up a node test server running on port 1337 (it was already forwarded to my server for reasons forgotten by me) and I configured [node-static](https://github.com/cloudhead/node-static) to take care of all my static files. If you want give it a go, head to http://www.lofjard.se:1337 (EDIT: not available anymore) and have a look at an exact copy of this site running on another web server. Setting up node-static turned out to be pretty simple. Example stolen from node-static's GitHub page: ````js var static = require('node-static'); // // Create a node-static server instance to serve the './public' folder // var file = new(static.Server)('./public'); require('http').createServer(function (request, response) { request.addListener('end', function () { // // Serve files!

Trying to fix SyntaxHighlighter on mobile browsers | November 4, 2011 at 10:44

I recently incorporated the [SyntaxHighlighter](http://alexgorbatchev.com/SyntaxHighlighter/) by Alex Gorbatchev so that I can easily show code examples in a nice way. The default configuration seems to have a few quirks when it comes to working on mobile devices. Not all of them are SyntaxHighlighters fault to be fair, but here's some of the things I've had to deel with. #### Broken font fallback stack The default font fallback stack in SyntaxHighlighter looks like this: ````css font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; ```` Consolas is the new pretty font used in Visual Studio 2010 and it is my personal favourite for displaying source code, but it only exists on Windows Vista+. Well that shouldn't be a problem since there is

Responsive Web Design | November 3, 2011 at 21:16

Responsive web design is the new rage in HTML. As much as I dislike buzzwords, this one is actually something worth thinking about. [Scott Hanselman](http://www.hanselman.com/blog/LearningAboutProgressiveEnhancementSupportingMobileBrowsersWithCSS3MediaQueries.aspx) wrote a blog post on the subject a while back and [James Fuller](http://www.jblotus.com/2011/06/21/protect-your-career-with-these-5-web-development-technologies/) has it at #5 on his top 5 list of things you need to learn right now. If you don't have a smartphone of your own to try your site out on you can make use of Google's [GoMo](http://www.howtogomo.com/en/#test-your-site) project which can render what your site will look like on an Android phone. As of this post I've done my share of responsive web design for this site

The magic that makes it all happen | November 3, 2011 at 16:44

If you're reading this blog I expect you to have a somewhat technical side to your personality and thus I assume you have a pretty up-to-date browser. This blog is made with HTML5 and CSS3 and at the moment I have not done any work at all to make it cross browser compatible. I have Chrome 15 (my current default browser), IE 9, Firefox 7 and Opera 11.52 installed on my machine and it works in all of them (except the "border-radius" attribute which doesn't work on images in Opera). Somewhere down the line I might incorporate some fixes for older browsers but unless you're stuck at work, in a government company running Windows XP and IE 8, please upgrade your browser. The rest of the world wide web is just out there waiting for you to experince it in a better way! So what kind of stuff a

That time of the year | November 2, 2011 at 21:21

I once again have come to realize that I've ignored my blog, yet again, for an extended amount of time. When this happens my usual response is to delete all my old posts, change the layout and start over. This time, however, I thought about, for a while, why all my previous blogging atempts have failed and came to the conclusion that I don't really like any of the blog engines that I have used in the past. Mostly I think because they've made it quite cumbersome to blog "on-the-go". So this time around I decided to do things differently. What you're looking at right now is (at the time of writing this) a static html page being server to you by an Apache web server running on an old laptop in my closet. This however is about to change. In the coming weeks I'm going to write a new blog

Sorry, sharing is not available as a feature in your browser.

You can share the link to the page if you want!