Wednesday, 24 September 2008

Aptivate Web Design Guidelines for Low Bandwidth

The NGO Aptivate, Cambridge, UK, brought together some useful information about simple bandwidth optimisation techniques/issues.

You can access their Web Design Guidelines for Low Bandwidth at:
http://www.aptivate.org/webguidelines/Home.html


Don't worry about bandwidth!
Soon we will all have infinite bandwidth for no cost.


Heard that before?

In fact it is not true for the majority of the world's population. Many people in remote locations and the developing world do not have fast Internet connections and won't be getting them any time soon.

This is why Aptivate has written a set of Web Design Guidelines for Low Bandwidth, at a time when web site optimisation seems to be going out of fashion.


Very interesting to see the world statistics for bandwidth and Internet access costs. Just goes to show how lucky we are in Western Europe / North America!

Also, here are a couple of the "tips" which particularly caught my attention:

  • drop using HTML tables for layout, switch to CSS: this has been discussed over and over and over, again and again and again, and yet... well, you get my drift =);

  • make your site cacheable: basically, avoid getting too wild with dynamic content;

  • externalise your CSS stylesheets and JS scripts: load it (them) only once for the whole site or sets of pages and let the browser subsequently use the cached version;

  • minimize the use of HTTP requests: there are lots of ways to do this like client-side form validation using Javascript, making sure dynamic pages don't require looping back to the server for pulling in extra files (CSS, images, etc.), and so on and so forth.

  • file and image optimisation: shrink PDF and optimise images for use on the web;

  • provide some sort of support for 'old' browser versions which may have limited support for CSS, Javascript, etc.

  • ...



There is a lot more interesting information on the site covering a variety of topics: high-level design, CSS, caching, compression, multimedia, browser compatibility, search, PDF optimisation, and much more. Well worth the read!

Thoughts?

Wednesday, 17 September 2008

PHP 5.2.0 - installing PEAR

I tried to install PEAR a few days ago using my PHP 5.2.0 install by double-clicking the go-pear.bat file in the php5 folder.

It didn't quite go as planned however:

Initialized registry...
PHP Warning: Cannot use a scalar value as an array in phar://go-pear.phar/PEAR/Command.php on line 268
.
.
.
install failed


It seems there is a small bug in the .phar file (in the PEAR folder) which can be fixed by replacing it with the following file:
http://pear.php.net/go-pear.phar

And you can find more information about this issue here:
http://bugs.php.net/bug.php?id=39733

Thoughts?

Monday, 15 September 2008

Finding the value in LinkedIn

I have been quite surprised by the number of people who complain about LinkedIn being a) a complete waste of time and/or b) just a plain 'job search' application. Obviously you could make it just that but also alot more, it really depends on how much time and effort you are prepared to invest.

To make an analogy, you wouldn't create a mailbox and then instantly expect to receive 300 interesting emails overnight. In fact, if you get any interesting mail at all it's because you have taken the time to advertise your email address in one form or another.

So why do we expect socializing online to be any different from socializing offline? If you walk into a room full of people, grab a drink and then go and stand alone in a corner, what are your chances of engaging with people? Pretty meak; at least certainly much slimmer than for those who decide to actively engage in conversation.

That's why we 'use' (sorry, bad bad word) our network of friends and relations to get introduced to other people. The same goes for LinkedIn. You need to mimick your real social network, get introduced to others by people you know and trust and move on from there.

The greatest value of the network to me is being given the ability to contact hundreds of experts, people who would previously have remained unreachable, in mere seconds.

A few weeks ago, I was trying to find a comprehensive, cost-effective CRM 'solution'. Now, there are lots of applications out there: sugarCRM, XRMS, Microsoft Dynamics CRM, Zoho and many more.

One way to figure out which is the 'best' solution is to test each application and then try to weigh the pros and cons, and drop cost into the balance somewhere. Now, that can be pretty time-consuming and without being an expert yourself, you can't really guarantee end-result.

Another way to work out the 'ideal' course of action is simply to ask the question on LinkedIn using their Q&A feature. The beauty in this is you reach out to hundreds of experts who might spend let's say 1 to 10 minutes answering your question. Within 24-hours you are actually conversing with more people than you would have been able to get hold of by phone in a day.

And, there is no question that the 10-minutes they spent answering, were much more valuable than my searching for information that isn't in my field of expertise. And, to top it all off, it was great fun corresponding with all the people who replied. Much like in 'offline life' we can engage in a valuable exchange of ideas and knowledge.

So, IMHO, there really is much more to social (or business, as some would have it) networking than at first meets the eye.

What is your take?

Sunday, 14 September 2008

symfony sandbox project, tutorial updated

In a previous post, I discussed a couple of issues relating to the symfony project sandbox tutorial.

It looks like the tutorial has since been updated however and I haven't really had the chance to check out the latest version but the parts that were highlighted in my post have definitely disappeared! Good news... :-)

To tell you the truth, I would like to move on to creating a web application from scratch (i.e. without the sandbox) so I will be starting at square one: The Definitive Guide to symfony and hope to be sharing some of this with you in coming weeks.

Thoughts in the meantime?

Wednesday, 10 September 2008

Google Chrome EULA update

In an earlier post about the Google Chrome EULA I mentioned how the French version had yet to be amended.

Well, I checked yesterday and all's well that ends well :-).

In French...

11.1 Vous conservez les droits d'auteur et tous les autres droits en votre possession vis-à-vis du Contenu que vous fournissez, publiez ou affichez sur les Services ou par le biais de ces derniers.

... and Dutch

11.1 U behoudt de auteursrechten en enige andere rechten die u al bezit over de inhoud die u op of via de Services inzendt, plaatst of weergeeft.


Thoughts?

Saturday, 6 September 2008

PHP Fatal error: func_get_args(): Can't be used as a function parameter

Well, I was a little surprised about this message but then reading the documentation it all made sense.

The only way around this is to place the result of func_get_args() in a variable and then pass that variable to the function you were calling in the first place instead of func_get_args().

WON'T WORK:

my_func(func_get_args());


WILL WORK:

$func_args=func_get_args();
my_func($func_args);


This is because the func_get_args() function must get called in the right context to return the right values as explained in the PHP documentation (PHP.net func_get_args):

Note: Because this function depends on the current scope to determine parameter details, it cannot be used as a function parameter. If this value must be passed, the results should be assigned to a variable, and that variable should be passed.


Interesting.

Thoughts?

Friday, 5 September 2008

Google Chrome - user-agent (UA)

For anyone interested in browser detection, here is Google Chrome's "useragent" string:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

You can get it by simply typing "about:" in the omnibox ("address" bar)
or alternatively by adding the following to your <head> section.


<script language="javascript">
function showUA()
{
userAgent = navigator.userAgent;
alert("UserAgent: " + userAgent);
}

window.onload=showUA;
</script>



So something similar to the following could be used to detect which browser you are using:


<html>
<head>
<script language="javascript">
function setBrowser()
{
var browser="unknown";
var userAgent = navigator.userAgent.toLowerCase();
if (userAgent.indexOf("opera") > -1)
browser="Opera";
else if (userAgent.indexOf("konqueror") > -1)
browser="Konqueror";
else if (userAgent.indexOf("firefox") > -1)
browser="Firefox";
else if (userAgent.indexOf("netscape") > -1)
browser="Netscape";
else if (userAgent.indexOf("msie") > -1)
browser="Internet Explorer";
else if (userAgent.indexOf("chrome") > -1)
browser="Chrome";
else if (userAgent.indexOf("safari") > -1)
browser="Safari";

var brDiv=document.getElementById("browser");
brDiv.innerHTML="<b>" + browser + "</b>";
}

window.onload=setBrowser;
</script>
</head>
<body>
You are using:
<div id="browser"></div>
</body>
</html>


If you are using one of those popular browsers its name should show up in the empty "browser" div in the body section. Note that the order of the tests is critical. For instance, both Opera and Netscape useragent strings contain "msie" so it is necessary to test for those browsers before testing for Internet Explorer.

Of course the above script is certainly very basic and we could take things a step further and not only retrieve browser name but also browser version for instance, or test for other things like whether the browser is Java-enabled, which Javascript version is available, which Flash Player version is installed or which operating system is being used.

Let me just share a couple of links which cover this more comprehensive approach to Javascript browser sniffing:
Browser sniffing: takes an in-depth look at how to sniff all major and lots of minor browsers.
JavaScript Browser Sniffer: the "ultimate" mainstream browser detection script.

Have fun!

Thursday, 4 September 2008

Google Chrome EULA

As you have probably already heard, there has been huge concern that the Google Chrome EULA was too invasive with regard to intellectual property rights. Google has since changed the English version at: http://www.google.com/chrome/eula.html?hl=en

Google apparently blamed a hasty copy/paste for the mistake but it is a little worrying to think this may have been intentional, and how many people have actually already agreed to the EULA in question.

[EDIT: I take it the change will have retro-active effect.]

Here is the Ars Technica article describing the whole chain of events:
http://arstechnica.com/news.ars/post/20080903-google-on-chrome-eula-controversy-our-bad-well-change-it.html,
and how Google has promised to change its terms and conditions for the new browser.

The French version (http://www.google.com/chrome/eula.html?hl=fr) doesn't seem to have been amended at the time of writing:

En fournissant, publiant ou affichant le contenu, vous accordez à Google une licence permanente, irrévocable, mondiale, gratuite et non exclusive permettant de reproduire, adapter, modifier, traduire, publier, présenter en public et distribuer tout Contenu que vous avez fourni, publié ou affiché sur les Services ou par le biais de ces derniers.


Something to keep an eye on...

Thoughts?

[Update: Check out the follow-up post regarding the Google Chrome EULA]

Wednesday, 3 September 2008

Experimenting with Google Chrome

(Thank God for work and the XP box there!)

I have downloaded, installed and survived the Google Chrome experience.

As far as I can tell it really lives up to expectations: on first impression its user interface is very nice and crisp, the browser is fast and renders nicely.

It's definitely usable "as-is" and despite being beta could probably replace any browser for day-to-day browsing except perhaps in some rather specific cases which some have been reporting.

Feature-wise, you can seamlessly extract a tab to a new window or reassemble tabs located in separate windows into a single window.

The developer tools are another cool feature. It would be really nice if you could snap them into your current tab though (or have the "snap-in" appear in every tab once you open it). For the moment, the tools open in an new window which stays on top of everything you are doing in the browser and I found it was a major distraction (compared to using Firebug in Firefox for instance).

Last but not least, the "omnibox" in every tab is a really nice feature which I shall probably learn to miss in other browsers.

Well, that's it for now. As you can tell I didn't really have the chance to take it for an in-depth test run and look at security features for instance.

It will be interesting to see whether Google's new approach actually causes any disruption on the browser market.

What do you think?

Tuesday, 2 September 2008

Aaaaaaaaaargh

Just one simple question... (*sobs despairingly*)

When (if ever) will Google Chrome become available to Win2k users?

Google Chrome

So Google has been at it again with this new very engaging project: Google Chrome, an open source web-browser with lots of impressive ideas with regard to stability, speed, security, standards and much, much more.

I have heard the site to keep an eye on today for a fresh copy is:
http://www.google.com/chrome

If you are interested, there is an nifty explanatory comic book by Scott McCloud at:
http://blogoscoped.com/google-chrome/

In it, the Google Chrome project is detailed from several angles, plus you get to 'meet' lots of people who are working on the project. Their take was basically to create a browser which would be more in line with today's web applications (coming at it from a very different angle than when browsers were used to process plain web pages, with little or no: DOM manipulation, AJAX scripts, etc.).

  1. Stability, testing and multi-process architecture:
    Using processes instead of threads to improve stability and prevent memory bloat as well as building on other Google tools to improve test efficiency.

  2. Speed: Webkit and V8:
    Increasing speed and efficiency by using Webkit and a high-performance javascript virtual machine called V8.

  3. Search and user experience:
    Changing the tab controls and their uses; introducing the omnibox, elegant inline completion and improved popup handling; improving user experience with a compelling "new tab" page which holds the most visited pages and search sites.

  4. Security, sandboxing and safe browsing:
    Preventing attacks by sandboxing (jailing) each separate process and helping users to avoid phishing scams using up-to-date blacklists of harmful sites.

  5. Gears, standards and open source:
    Using gears to improve developer experience, complying with standards (and perhaps setting new ones?), and of course sharing.



All of this really sounds very impressive, it seems Google is simply always that one step ahead of everyone else!

More news about whether this was all too good to be true, once I actually get to try it out, which I hope will be very soon :-)

Thoughts for now?

Friday, 22 August 2008

Batch programming tip #17: Moving/Copying hidden/system folders and files

A recent question about renaming a folder (on computing.net) brought to my attention the fact that move (which I usually use to rename folders) and also rename won't work on hidden/system files.

To avoid this 'issue' you must change the folder's system attributes.
First we define our original and destination folders.

set oldp=[define original folder here]
set newp=[define destination folder here]

Then we set the h (hidden) and s (system) attributes off (-h -s), move the folder, and switch the attributes back on again (+h +s).

attrib -h -s %oldp%
move %oldp% %newp%
attrib +h +s %newp%

You can also change all the file attributes within the folder, by using the /S modifier. And all (sub-)directories by using /D.

For instance:

attrib -h -s %oldp% /S /D


Will switch off the hidden and system attributes for (sub)folders and files in the %oldp% folder.

The same sort of thing happens with xcopy.
If you want to use xcopy on hidden/system files you must add the correct modifiers like so:

set oldp=[define original path here]
set newp=[define destination here]
xcopy %oldp% %newp% /H /S

Or only "visible" files will get copied.

I would love any additional input you may have about this.

Thoughts?

Thursday, 21 August 2008

Symfony sandbox project

I recently heard of the Symfony project. It's an appealing free open-source PHP5 development framework licensed under the MIT license and I decided to give it a go.

For starters I downloaded the sandbox version from:
http://www.symfony-project.org/installation/1_1

I had an easy-PHP installation already up and running on my Windows 2000 system. So simply dropped the sandbox project under my www folder and followed the instructions on the Symfony website using mySQL as database manager:
http://www.symfony-project.org/tutorial/1_1/my-first-project

It was all pretty straight-forward except for a few "catches" detailed below.

#1 - the project uses php.exe on the command line to generate configuration files, PHP classes, etc. You really need to make sure to copy the php.ini file to the folder where the php.exe is located in order for the configuration to be taken into account. You can check which modules are available (and in effect, whether your latest php.ini is getting loaded properly) by typing
php -m
on the command line.

#2 - I also activated the xsl extension. This gets rid of some error messages that occur during database configuration and creation. I am not sure whether this makes an actual difference on the end result but was trying to clear any errors as I ran into them.

#3 - When I tried to access http://localhost/sf_sandbox/web/frontend_dev.php/comment or http://localhost/sf_sandbox/web/frontend_dev.php/post as specified in the tutorial, the pages wouldn't launch properly, I was getting database error messages.
To avoid this, I had to manually configure the www\sf_sandbox\config\database.yml configuration file:

all:
propel:
class: sfPropelDatabase
param:
phptype: mysql
database: symfony_project
dsn: 'mysql://root@localhost/symfony_project'

I changed all three parameters: phptype, database (use the database name you chose), and dsn (note that root is using an empty password to connect here).
For changes to take effect, make sure to clear the cache using:
php symfony cache:clear

#4 - In the middle of the tutorial, it tells you to start using your new website.
However, when you try to add a comment you get the following error:
Class "Post" must implement a "__toString" method to be rendered in a "sfWidgetFormPropelSelect" widget
To fix this, open the
sf_sandbox\lib\model\Post.php
and add a __toString method as follows:


class Post extends BasePost
{
function __toString()
{
return $this->getTitle();
}
}


To be 100% accurate, also change the sf_sandbox\apps\frontend\modules\comment\templates\editSuccess.php file so that the Post id label becomes Post title or simply Post since the post title is what we're actually seeing now we have added the __toString method in the Post class.

#5 - I couldn't get the following to work:

Next, open the modules/comment/templates/editSuccess.php and replace the following lines:

<tr>
<th>Post:
<td><?php echo object_select_tag($comment, 'getPostId', array (
'related_class' => 'Post',
)) ?></td>
</tr>


The original code is slightly different in the sandbox version and the replacement code wouldn't work. One way to avoid this issue is to set the default post id in your comment actions class.
Simply open your sf_sandbox\apps\frontend\modules\comment\actions\actions.class.php and add the following in the "executeCreate()" method:

$post=PostPeer::retrieveByPk(
$this->getRequestParameter('post_id'));
if ($post)
{
$this->form->setDefault('post_id',
$this->getRequestParameter('post_id'));
}

This simply pre-selects the post title in the form when you access the 'new comment' page from a given post's page by setting the default value of the drop-down choice list.

#6 - in the same file (sf_sandbox\apps\frontend\modules\comment\actions\actions.class.php). Instead of using the code from the tutorial, simply replace the redirect line with:
$this->redirect('post/show?id='.
$request->getParameter('comment[post_id]'));

This will redirect to the correct post rather than to the comment page.

Well, that's it for now. I haven't finished the tutorial yet. I have only made it to just before the Form Validation chapter. So still lots of fun to be had - stay tuned!

Thoughts in the meantime?

[EDIT: it looks like the Symfony Sandbox Project tutorial has been updated so some - if not all - of the above information may no longer be applicable.]

Wednesday, 20 August 2008

Me.dium - Power to the People

In a comment left on a previous post about Cuil not quite living up to previous expectations, Chris pointed me to the Me.dium search engine (built on Yahoo Search BOSS). This alpha-release search engine offers two search types: you can opt for traditional results but also decide to 'get social' and view the 'hottest' results according to what other people are viewing.


Me.dium.com has taken a different tack. We have a full web index, but we change the results based on the surfing activity of our user base (now over 2,000,000).


The searching activity data is gathered using the Me.dium search toolbar. Obviously, you don't have to install it yourself unless you actually want to become part of the crowd - but with this new "Power to the People" philosophy, it's being part of the crowd that empowers you as an individual surfer. Based on the tutorial, it seemed a little too invasive (teenager-ish?) for me: you can see which of your friends are online, what they are currently viewing, chat with them, etc. and, even if the feature can be disabled, I am not sure I want to share that amount of intimacy with my friends when at work or at home. But it's probably just one of those things I will change my mind about as more and more people choose to use it.

We all know Web 2.0 really is all about 'social': social networking, social bookmarking, social learning, you name it, it has social in front of it. Well, this new engine brings 'social' to the search industry.

When you use social search, you get extra information for every link in your result set:
- crowd rank: not sure how this works, perhaps there is a rank button on the toolbar, a bit like the Google page rank (?);
- velocity: whether site traffic from the crowd is stable, increasing or decreasing;
- recent activity: how 'hot' the site is (luke-warm, warm, hot);
- visitors present: whether anyone from the crowd is currently visiting;
- average visit duration: "short", "medium" or "long" (?);
- navigate from and to: how most of the crowd moves to or from the link.

So you actually get quite a lot of additional information about each search result.

It will be interesting to see in what way the search results are influenced by the crowd, I guess it could (hypothetically) lead to all sorts of biases, but also to a good way of measuring what most people are interested in or in fact (want to) believe.

I couldn't help but wonder whether the propagandists could get hold of this, but I get the feeling that's a typical Web-2.0 non-argument. A bit like the kind of argument you may have against corporate wikis/forums/blogs. The top 'guys' always have the gut feeling the system will be used and abused whereas in actual fact, the vast majority of people are pretty level-headed and once they get the hang of the system actually use it in constructive ways. It seems to me that the more people use this system, the better the results will be and the lesser the impact of small groups of people who may want to sway the search results one way or another.

And there is always the Yahoo-based standard search to fall back on if you are not getting what you want.

There were a couple of minor things I noted when using the search engine.
There was one feature I really missed: the word suggestions. For instance, I wasn't quite sure how to spell Musharraf so guessed at Musharaf, I was expecting the search engine to automatically suggest the correct spelling - it's a bad habit, but a great feature that most Google users have probably grown used to.

Another thing I found as an avid Googler who doesn't ever press the "I'm feeling lucky" button (shameful I know...), was that using the "I feel social" button really didn't come naturally. I think the location of the button and the use of the word 'feel' set the alarm bells a-ringing in a "don't-click-me" kind of way.

One last thing I felt was missing was the ability to sort the search results by crowd rank, recent activity, average visit duration, etc. as this could certainly increase search relevancy. But I guess there is only so much you can expect from an alpha release especially with this level of stability! :-)

So, Me.dium definitely looks promising, and it's really top-notch: if there were any glitches, I certainly didn't notice them. AND it's bringing something really new to the search market so it's worth staying tuned to see how this project will evolve and whether it can get hold of any significant share of the search market.

Thoughts?

Tuesday, 19 August 2008

Netbeans 6.5b released

The Netbeans 6.5b was released last week and can be downloaded here. The full installer weighs in at around 200Mb.

To my knowledge this is the first "release" to include the PHP module. The previous version, dubbed "Early Access For PHP" required a separate download and wasn't integrated into the usual Netbeans IDE which included the usual Java, Ruby, etc.

It's great to be able to seamlessly integrate PHP projects in this latest release!

Thoughts?

Monday, 18 August 2008

KeyCzar quickfix fixed

Some of you might recall my using a batch 'quickfix' in a previous post about Google KeyCzar: creating the RSA public and private keys using batch, to work around a small issue whereby filenames ended up being concatenated to the folder name (e.g. rsakeysmeta instead of rsakeys\meta).

A few hours after posting, I eureka-d that adding \ to the folder variables would probably fix it much more neatly - and now I have found the time to verify this, it does :-).

I fixed the previous post accordingly and here is the uninterrupted simplified version of the batch for anyone interested:

@echo off
setlocal enabledelayedexpansion

:init
set java=java
if exist "C:\Program Files\Java\jre1.6.0_05\bin\java.exe" set java="C:\Program Files\Java\jre1.6.0_05\bin\java.exe"
if exist "C:\Program Files\Java\jre1.6.0_07\bin\java.exe" set java="C:\Program Files\Java\jre1.6.0_07\bin\java.exe"
if not exist %java% goto java_nf

set parent=..
set keyczar=keyczar05b.jar
set gson=gson-1.1.1.jar
set log4j=log4j-1.2.15.jar

if not exist %parent%\%keyczar% goto keyczar_jar_nf
if not exist %parent%\%gson% goto gson_jar_nf
if not exist %parent%\%log4j% goto log4j_jar_nf

goto create_keys

:create_keys
set location=rsakeys\
set public=publickeys\

if not exist %location%%public% mkdir %location%%public%

echo Creating key set
%java% -classpath %parent%/%keyczar%;%parent%/%gson%;%parent%/%log4j% org.keyczar.KeyczarTool create --location=%location% --purpose=crypt --asymmetric=rsa
echo Creating private decryption key
%java% -classpath %parent%/%keyczar%;%parent%/%gson%;%parent%/%log4j% org.keyczar.KeyczarTool addkey --location=%location% --status=primary
echo Creating public encryption (primary) key
%java% -classpath %parent%/%keyczar%;%parent%/%gson%;%parent%/%log4j% org.keyczar.KeyczarTool pubkey --location=%location% --status=active --destination=%location%%public%
goto eof

:java_nf
echo Cannot find java
goto eof

:keyczar_jar_nf
echo Cannot find keyczar jar
goto eof

:gson_jar_nf
echo Cannot find gson jar
goto eof

:log4j_jar_nf
echo Cannot find log4j jar
goto eof

:eof
echo Press any key to quit
pause > NUL
goto blackhole

:blackhole

Well, that's it. Much neater and quite as functional!

Please refer to the previous post for more information on what is actually happening here.

You can also read the second part of the post which covers how to use the KeyCzar library in Java for asymmetric RSA encryption/decryption (using the keys we just created with the above batch file).

Thoughts?

Sunday, 17 August 2008

Cuil, not that cool

So perhaps Cuil isn't as cool as they had made out when it was launched.

I was really enthusiastic about the Cuil search engine when it was first publicized but have returned to my 100% Google searching as it comes up with the results I am expecting, and thus increases my productivity. The Cuil features like drill-down and its well thought-out philosophy are great but get completely overshadowed by the engine's poor search results.

So how do I measure how good the results are? Well, really the way I do this is by comparing the results from Cuil to those that Google would give me. Which is probably very bad practice, but I guess that just highlights the fact Google really has become the de facto "best" search engine for most people. How many times have you heard "Google it", and how many times have you heard "Yahoo it"? See, that's what I thought.

It does leave me wondering whether in some cases it's the search engine giving poor results or me using poor search words. Perhaps the way I pick search words has changed to accomodate the way Google references its pages and that's what makes it easier for me to use Google than Cuil, for instance.

Still, Cuil does on occasion undoubtedly return disastrous results.
For instance, if I search for the following three words:
e-learning technologies karrer
I expect the first link to be the eLearning Technology blog by Tony Karrer.
Well although Cuil actually will provide a link to the blog (and not the main page at that!), it does so with the wrong picture and in fact places the correct picture under someone else's name! Ouch.

So it seems Google really does just go that extra mile... :-)

Thoughts?

Saturday, 16 August 2008

Batch programming tip #16 (part 2): getting property values from an ini file

This is just a slight variation on the previous post on working with *.ini files.
Here we only retrieve property values but not sections or property names.

@echo off
setlocal enabledelayedexpansion

:init_vars
set ini_file=my.ini
goto show_values

:show_values
for /F "tokens=1,2 delims==" %%L in (%ini_file%) do (
if not [%%M]==[] (
echo Value: %%M
)
)
goto eof

:eof
echo Press any key to quit
pause > NUL


Simple :-).

Thoughts?

Friday, 15 August 2008

Splashtop

A colleague recently pointed me to the Splashtop website: http://www.splashtop.com/ and then days later a discussion with friends brought it back to mind.

So what is Splashtop? It's a small Linux distribution which launches in a matter of seconds at bootup allowing you to almost instantly access the internet using a fully-fledged browser. The website offers some nice demos which give you the "feel" for the way it works and naturally, its impressive startup speed.

The following movie shows the basic Splashtop environment. Note that later versions have already been improved on with new functionalities!



It looks like it might be time to give up on that two-minute bootup wait before you look up your favourite recipe, check your email or look up a new road itinerary.

Splashtop is currently bundled with ASUS motherboards and notebooks.

Thoughts?

Google Keyczar - now available for Java 1.5

This is a quick update regarding a sidenote in yesterday's post:
... if you get a message like "incorrect class version, 50 should be 49" or something along those lines, it means you are not running the correct version of java (i.e. the KeyCzar classes were compiled with a later version).


Steve Weis, who originally developed keyCzar, very kindly confirmed this information this morning.

The class version error is indeed due to the fact that we're using Java 1.6. Unfortunately, that's not supported by some (all?) Mac users, so we're going to post a Java 1.5 Jar soon.


Well, for anyone interested the 1.5 Jar is already available at the KeyCzar website: http://www.keyczar.org/.

Have fun!
Online Marketing
Add blog to our blog directory blog search directory Blog Directory Blogarama - The Blog Directory