New tool: KML and Geo sitemap generator
Wednesday, December 2nd, 2009 | Tools | 3 Comments
Today I launched my very new tool: the KML and Geo sitemap generator. However it’s still in beta I think it’s pretty usable right now and it will be a lifesaver for all your local search activities.
When you want your office locations to be showed in Google Maps you’ll need a Geositemap with a KML file attached to that. The KML file contains all the location data, including the needed geocoding information. You have to upload it to your server and point to it from the geo sitemap (which also has to be on that server). This geo sitemap can be added in your Google Webmaster Tools, just like a normal XML sitemap.
So all I can say now: just try the tool, enjoy it and if you have any questions you can always contact me.
PS: I want to thank Mike Blumenthal, David Mihm and Martijn Beijk for all the testing and improvement suggestions. You rock, guys!
No download limit for Google Analytics export, part 2
Wednesday, September 9th, 2009 | Greasemonkey | 20 Comments
Yesterday I posted the Greasemonkey script for skipping the download limit of the Google Analytics export. Thanks to the tip of Yoon I updated the script a bit and I think it rocks now very well :-)
Go and see the Greasemonkey script!
Skip the download limit for Google Analytics exports
Tuesday, September 8th, 2009 | Greasemonkey | 4 Comments
It’s a well-known solution to have more rows in your Google Analytics reports export. Just add &limit=50000 to the URL and you will have 50000 rows (or change to the number of rows you want).
To skip this time consuming step I wrote a small Greasemonkey script. Have fun!
Extensions build script updated
Tuesday, January 20th, 2009 | Firefox extensions | No Comments
Yesterday I wrote a post about building Firefox extensions in Mac OS. Unfortunately the script didn’t work perfectly so I have updated it now.
The most important change is about the hidden file .DS_Store in Mac OS. When zipping a file (also via the Terminal) Mac OS includes this file and as a result of that you Firefox extensions is notworking anymore..
The second part that is changed is the last rule. This rule installs the extension automatically and restarts Firefox. Well, if that ain’t easy! ;-)
Build script for Firefox extensions in Mac OS X
Sunday, January 18th, 2009 | Firefox extensions | 2 Comments
Now and then I play some with Firefox extensions. While doing that I use a batch file that creates the XPI files easily. No problems this far.
But…. A few weeks ago I got my new Macbook and I love it. The only thing was that I couldn’t use the batch file anymore. So I adjusted the batch file and converted it to a shell script. Here’s the code:
: # @(#) --Builds Firefox extensions BASELOC=$PWD EXTENSION=$1 mkdir build mkdir ./build/chrome cd ./chrome rm .DS_Store zip -r $EXTENSION.jar ./ mv $EXTENSION.jar .././build/chrome cd $BASELOC cp ./install.* ./build cp ./update.* ./build cp ./*.manifest ./build mkdir ./build/defaults mkdir ./build/defaults/preferences cd ./defaults/preferences cp ./*.* ../../build/defaults/preferences cd ../../build rm .DS_Store zip -r $EXTENSION.xpi ./* mv $EXTENSION.xpi ../ cd ../ rm -r ./build ## Restart Firefox and install extension killall firefox-bin && /Applications/Firefox.app/Contents/MacOS/firefox -install-global-extension $PWD/$EXTENSION.xpi && open -a Firefox
Save this file as build.sh and place it in the directory where you are developing the extension. Now open the Terminal, browse to the right path and make this file executable:
chmod +x ./build.sh
To build your Firefox extension use the following code in the terminal:
./build.sh name_of_extensionEverything is working so far? Cool! Now you have something which makes the extension development in Mac OS X a lot easier! If not, please leave a comment or contact me.
Good luck with it!
Google notebook: the story continues
Friday, November 14th, 2008 | SEO | No Comments
Earlier this week I posted about the Google Notebooks that have been indexed by Google. Besides the effect of link juice there’s another amazing thing about these notebooks. The users…
Martijn Beijk wrote an article on this and this is really, really surprising how stupid people can be.
Google and URLs: very confusing
Thursday, November 13th, 2008 | SEO | 1 Comment
Yesterday google released their SEO Starter Guide. Quite cool and useful information for webmasters. Google says on the URL part of this document that it’s a good habit to rewrite your URLs so that they can crawl it more easy. Besides that it has many advantages for users and CTR in search results pages.
Well, I totally agree with that!
But what surprises me about this guide? Right, as you may know Google said something totally different a few weeks ago. So, Google, what should we do? Why did you publish this post about not rewriting the URLs?
Anyway, whatever Google may say about this: I think it will always be better to rewrite your URLs. As well as for users as for search engines. And Google, please don’t be so confusing in the future, because you aren’t helping webmasters this way.
Let Google.com help you with your link building
Tuesday, November 11th, 2008 | SEO | 29 Comments
A little while ago I did some searches on the internet and I saw something very surprising. In the Google result pages I saw some results of http://www.google.it/notebook. Well, how can this be? What’s the only way you can show up in the SERPs? Right, to get indexed. So, would it be for real that these pages on google.it were getting indexed by Google itself? It’s time for a test!
After a check on the robots.txt, robots meta tag and nofollows there seems nothing to be that exluded these public profiles. The next check was to see for how many pages it was about. This showed up that not only google.it/notebook was indexed, but all the Google Notebook pages were getting indexed. And if you do some research on these pages you’ll find some nasty/dark links…… Was this for real?
To test this I created a new page with some non-existing text on it: asdqwertyfgh. I put a link to it in my Google Notebook (click through to see the test page) and published it. Because I don’t think the notebook are indexed by themselves I added a link to it from my blog. And what happened? After a few days my new page was showing up in the SERPs and it still is right on top (including the notebook page itself)!

So, would Google Notebook help you with link building? To be honest I don’t think it will help in Google very much. When I put some tests on more difficult keywords the results weren’t very great. However, the results in Yahoo! and Live were totally different. A link to my friend Martijn with “local search optimization” as an anchor text moved his website (In Yahoo! and Live) from #7/#8 to #1. After removing this link he dropped again to #8/#10. So maybe Google filters his own websites in there own rankings algorithm, but it definitely seems to work in other search engines.
How long does it work? I don’t know. Does Google know about this? I think they do, but they can’t do very much about it for other search engines. So, don’t wait, get some Google accounts and boost your rankings in Yahoo and Live ;-)
Update: Google seems to watch these notbooks, because a lot of ‘dirty’ notebooks are removed and give 404′s now.
AJAX, an object oriented XML parser
Sunday, September 14th, 2008 | AJAX, JavaScript | 2 Comments
A lot of XML parsers that are used in AJAX scripts use a global variable to store the output. This works fine untill you want to want to do multiple requests at the same time. And that exactly should be one of the advantages of AJAX, the ‘a’ of Asynchronous.
So, what’s going wrong when you use a traditional parser? Let’s say you fire a request that takes two seconds to get the data you need. Now, within these 2 seconds you want to fire a new request. But the problem now is that for this request you need the same global variable as you used for the first request and the returned data of the first request will be be overwritten by the data of the second one. A solution would be to make a new global varainble for each request, but I don’t think that is quite a good and flexible solution. The best solution (in my opinion) is to make the parser object oriented. Now every request will get its own object and doesn’t interfere anymore with the other ones.
In this article I’ll give you the code and some explanation for this XML parser. I won’t give a full explanation of how object oriented programming works. You got to find it out yourself :-)
The code
The code itself is a little bit too much to display on this page, so you can download it. In the next paragraphs I’ll exaplain the most important parts.
Initilization
In line 9 to 16 a number of variables are declared which we will use later. After this declaration the init() function is called. This function is called every time a new object is created. You could use this to display a loading image or something like that. At the end of all, the _closeLoading is called where you can kill the loading image.
Settings
After the initialization there are a couple of functions which can be used to change the settings for the object. A short impression:
setResponseAsText(): default you will receive the data as XML. Calling this function will return the data as raw text.setDisabledASync(): This function will disable the asynchronous behaviour of the requests. By calling this function all request are handeld after each other.setFunction(): insetFunction()function you can mention all the functions (in comma separated format) that should be called when the data is ready.setURL(url): define the URL of the server side scriptaddParam(param, value): in this function you can define which parameters should be added to the URL of the server side script. Call this function for each paramter.
So this is what it look like to create a new request (getResults is a fictive function):
function getResults(query) { var xmlhttp = new HTTPDataConnection(); xmlhttp.setURL("results.php"); xmlhttp.addParam("query", query.value); xmlhttp.addParam("maxResults", 50); xmlhttp.setFunction(processData); xmlhttp.requestData(); }
The request
The most important function is requestData(). In this function the actual XmlHTTPRequest is done. handleData() will process the obtained data.
Data processing
The handleData() function gets the data after the request is finished (readystate == 4). The received (XML) data is stored in the this.receive variabele.
Here’s a little example of an XML document:
<!--[CDATA[Seth Godin]]--> <!--[CDATA[9789022994702]]--> <!--[CDATA[Portfolio]]--> <!--[CDATA[Malcolm Gladwell]]--> <!--[CDATA[9781586217457]]--> <!--[CDATA[Hachette Audio]]-->
After getting the data all the function from the setFunction() function are being called.At the end _closeLoading() is kicked wheere you can finalize your request a let your loading images disappear.
Displaying the data
If you to show the data on the screen you can do this in one of the functions that is been called after the request. In the example below this function is called processInput(). The comments are clear enough I think :-)
function processInput(xmlhttp) { // get data as an array, with XML element 'object' as root var dataArray = xmlhttp.getDataAsArray("object"); // get number of results from XML element 'count'. var count = xmlhttp.getDataValue("count"); if(count != 0) { if(count > 25) { output =" <em>There are more than 25 results. Please refine your search query.</em> "; } else { output =" <em>There are " + count + " results found</em> "; } for(var object in dataArray) { if(typeof(dataArray[object]) == "object") { var title = dataArray[object]["title"]; var author = dataArray[object]["author"]; var ean = dataArray[object]["ean"]; var publisher = dataArray[object]["publisher"]; output += " "; output += "<strong>" + title + "</strong>, " + author + ""; output += "EAN: " + ean + ""; output += "Published by: " + publisher; output += " "; } } document.getElementById('output').innerHTML = output; } }
The end
So this is the object oriented XML parser. I hope that this is usefull one for you. I you have questions or remarks just drop me a note.
Changing type attribute in IE
Tuesday, August 26th, 2008 | JavaScript | 5 Comments
I never had noticed this before, but a little while ago I found out that changing the type attribute on an input box doesn’t work in Internet Explorer. Not in IE6 and even not in IE7.
I tried element.type="text"; and element.setAttribute("type", "text"); but both methods didn’t work. Strange, because these methods won’t give any problems for setting any other attribute. Sigh.. that Microsoft again…
Fortunately there is a solution. It’s a little dirty and extensive, but hey, it works! The basic idea is that you have to create an new input element and replace it with the old one. The paradox here is that you can set the type attribute for newly created objects with no problems, but editing an existing one give problems. Why? I don’t know. But I’m happy that there’s a solution :-)
Anyway, here’s the code:
function changeInputType(oldObject, oType) { var newObject = document.createElement('input'); newObject.type = oType; // 'Copy' old types to new element if(oldObject.size) newObject.size = oldObject.size; if(oldObject.value) newObject.value = oldObject.value; if(oldObject.name) newObject.name = oldObject.name; if(oldObject.id) newObject.id = oldObject.id; if(oldObject.className) newObject.className = oldObject.className; // replace old object with new one oldObject.parentNode.replaceChild(newObject,oldObject); return newObject; }
About Arjan
Hi, I'm Arjan Snaterse and in my daily life I'm working as SEO and Frontend manager at Jaludo.
There I'm working on casual gaming sites like Funny games and Titter girl games.
In my spare time I'm developing websites in Wordpress or Typolight. HTML standards, semantics and CSS are words that make me happy. So if you need someone who converts your design (PSD) to HTML/Wordpress just contact me.
- Teun van der Hoek: Exactly what I was looking for! Thnx! ... Guia de Negocios: I´ll try it out!! Great tip!Arjan: @Willem Indeed, that's a cool idea and i...Willem: Geweldige tool! Wat ik er nog aan toe z...Arjan: Thanks ;-)
