Pages

Monday, 27 February 2012

Linden Lab announce drastic changes to Third Party Viewer policy

Photo taken using the third party viewer Firestorm with shadows and depth of field enabled.

Linden Labs, the creators of Secondlife have announced policy changes to developers of third party viewers (TPV's).
The open source viewer code has been modified by numerous programmers who have introduced innovations that enhance the user experience.
The history of TPV's is a chequered one.
Maliciously scripted viewers have been able to copy other peoples creations and crash other users.
These security issues are usually shut down soon after they appear.
What these new policies mean to the average user of a TPV will be minor cosmetic changes like not being able to see viewer tags that identify other users viewers or true online status.
Linden Lab plan to remove the ability to see online status server side.
For power users or those using RLV and other interactive multi-user options, these policy changes could be a disaster.
RLV is used for role playing within Secondlife.
Not being able to know the online status of another RLV player will destroy parts of that RP.
Thousands of shopkeepers have message boards for customers to communicate with them.
These boards show the owners online status no matter where they are on the grid.
These too could break although Owner Only code changes may retain this option.
Beyond the actual changes that Linden Lab is making, the bigger story here is the ultimate demise of the volunteer development and innovation followed in swift order of the demise of Third Party Viewers altogether.
The Lab are basically saying, if we didn't invent it, you can't.
This is certainly a backward step for Linden Lab and Secondlife.
It indicates the Lab's corporate mentality that has deemed that innovation and the raw enthusiasm of it's own user base that has led to some incredible developments like Advanced Shadows/Lighting/Depth of Field, Parcel Windlight Settings, client-side Animation Override, Area Search, Double-Click Teleport and many more features is cutting too close to their own bottom line.
And TPV's make them look bad.
Because the official LL Secondlife Viewer is nowhere near as good as most TPV's.
Several years ago LL decided to change their old viewer and create V2.0.
V2.0 stunk.
Several iterations later and it still does although it's getting slightly less offensive.
But by comparison to any number of TPV's, V2.0 is unintuitive, clunky, search NEVER works... I could go on but there isn't enough room on this endless blog!
Suffice to say I avoid the official viewer like botulism.
TPV's became a viable option for many users including myself at this juncture because many of them were built on the old version one code.
The look and feel was the same as the old LL viewer so it was more comfortable and underneath the bonnet, they had some cool features.
Now it looks like these good times are over.
The sun has set on these wild west days when a viewer update brings a slew of new toys to play with and a wide-eyed amazement at the creativity and dedication of their developers.
The Lab have effectively signed the death warrant of Third Party Viewers and that is a very bad thing.
Already forum chatter is urging these developers to concentrate on OpenSim and other metaverses where such restrictions are not stifling progress.

Here's a link to TPV Phoenix/Firestorm blog where they report they have been contacted by LL who insist they and all other TPV developers implement their latest policy without delay.
http://phoenixviewer.blogspot.com/2012/02/new-additions-to-third-party-viewer.html

Here's a link to a Secondlife users blog with a link to an audio recording of Oz Linden explaining the Lab's changes.
The author has helpfully noted time stamps for some of the important bits.
http://yournymph.blogspot.com/2012/02/policy-on-third-party-viewers-changed.html

Friday, 24 February 2012

Live Music in Secondlife

One of the greatest things about the 3D virtual world Secondlife is the amazing live music available 24/7.
Bands and solo artists from all around the globe stream live from their locations.
An ever changing, long list of events is available in search.
There is everything from karaoke singers warbling away to backing tracks, jazz virtuosos, rap artists, rock bands and even 'tribute' bands that perform to pre-recorded 'live' shows created by the original band.
Teleport to the virtual venue and interact with other avatars and the band.
Being able to sit in my lounge watching, listening and dancing along to a Japanese Hip-Hop group or rocking out with one of my favourite virtual bands "The Follow" from the USA is a blast.
Via chat, I can communicate with the often bizarre collection of avatars in the audience, request a song from the band or hold private conversations in Instant Message.
Most venues and musicians rely on tips to continue to be able to do what they do.
It can cost a lot of money to run and operate a venue in Secondlife so it's only fair to offer a small tip for the privilege of being able to enjoy live music at their establishment.
The diversity of acts and time zones means there is generally always something happening in-world however the New Zealand time zone isn't that great because most of the US and European acts perform during their evening being my morning.
Check out Secondlife and the amazing range of live music available.

Monday, 20 February 2012

Secondlife Camera Control Script

A script to control your avatar's camera.
Relatively easy to follow. You could add your own camera presets to the menu.


<CODE>
integer CHANNEL; // dialog channel
list MENU_MAIN = ["Butt Cam", "God Cam", "Back Cam", "Trip Cam", "Ghost Cam", "Worm Cam", "Me Cam", "Fly Cam", "More...", "Cam ON", "Cam OFF"]; // the main menu
list MENU_2 = ["More...", "...Back"]; // menu 2

integer on = FALSE;
integer flying;
integer falling;
integer spaz = 0;
integer trap = 0;

take_camera_control(key agent)
{
    llOwnerSay("take_camera_control"); // say function name for debugging
    llOwnerSay( (string)agent);
    llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
    llSetCameraParams([CAMERA_ACTIVE, 1]); // 1 is active, 0 is inactive
    on = TRUE;
}

release_camera_control(key agent)
{
    llOwnerSay("release_camera_control"); // say function name for debugging
    llSetCameraParams([CAMERA_ACTIVE, 0]); // 1 is active, 0 is inactive
    llReleaseCamera(agent);
    on = FALSE;
}

focus_on_me()
{
    llOwnerSay("focus_on_me"); // say function name for debugging
//    llClearCameraParams(); // reset camera to default
    vector here = llGetPos();
    llSetCameraParams([
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
        CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees
        CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds
        CAMERA_DISTANCE, 0.0, // ( 0.5 to 10) meters
        CAMERA_FOCUS, here, // region relative position
        CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds
        CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
//        CAMERA_PITCH, 80.0, // (-45 to 80) degrees
        CAMERA_POSITION, here + <4,4,4>, // region relative position
        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds
        CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_FOCUS_OFFSET, ZERO_VECTOR // <-10,-10,-10> to <10,10,10> meters
    ]);
}

butt_cam()
{
//    llOwnerSay("butt_cam"); // say function name for debugging
    llClearCameraParams(); // reset camera to default
    llSetCameraParams([CAMERA_ACTIVE, 1]);
}


fly_cam()
{
    llOwnerSay("fly_cam"); // say function name for debugging
    butt_cam();
    llSetCameraParams([
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
        CAMERA_BEHINDNESS_ANGLE, 45.0, // (0 to 180) degrees
        CAMERA_BEHINDNESS_LAG, 0.5, // (0 to 3) seconds
        CAMERA_DISTANCE, 8.0, // ( 0.5 to 10) meters
        //CAMERA_FOCUS, <0,0,5>, // region relative position
        CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_PITCH, 30.0, // (-45 to 80) degrees
        //CAMERA_POSITION, <0,0,0>, // region relative position
        CAMERA_POSITION_LAG, 0.1, // (0 to 3) seconds
        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters
    ]);
}


me_cam()
{
    llOwnerSay("me_cam"); // say function name for debugging
    llClearCameraParams(); // reset camera to default
    llSetCameraParams([
                CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
                CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees
                CAMERA_BEHINDNESS_LAG, 0.2, // (0 to 3) seconds
                CAMERA_DISTANCE, 3.0, // ( 0.5 to 10) meters
                //CAMERA_FOCUS, <0,0,5>, // region relative position
                CAMERA_FOCUS_LAG, 0.02 , // (0 to 3) seconds
                CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
                CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
                CAMERA_PITCH, 10.0, // (-45 to 80) degrees
                //CAMERA_POSITION, <0,0,0>, // region relative position
                CAMERA_POSITION_LAG, 0.15, // (0 to 3) seconds
                CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)
                CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
                CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters
            ]);
        }

trip_cam()
{
    llOwnerSay("trip_cam"); // say function name for debugging
    llSetCameraParams([
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
        CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees
        CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds
//        CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters
        //CAMERA_FOCUS, <0,0,5>, // region relative position
        CAMERA_FOCUS_LAG, 3.0 , // (0 to 3) seconds
//        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
//        CAMERA_PITCH, 80.0, // (-45 to 80) degrees
        //CAMERA_POSITION, <0,0,0>, // region relative position
//        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds
//        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_FOCUS_OFFSET, <5,2,-2> // <-10,-10,-10> to <10,10,10> meters
    ]);
}
god_cam()
{
    llOwnerSay("god_cam"); // say function name for debugging
    butt_cam();
    llSetCameraParams([
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
        CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees
        CAMERA_BEHINDNESS_LAG, 0.5, // (0 to 3) seconds
        CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters
        //CAMERA_FOCUS, <0,0,5>, // region relative position
        CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_PITCH, 80.0, // (-45 to 80) degrees
        //CAMERA_POSITION, <0,0,0>, // region relative position
        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds
        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters
    ]);
}

ghost_cam()
{
    llOwnerSay("ghost_cam"); // say function name for debugging
    llSetCameraParams([
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
        CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees
        CAMERA_BEHINDNESS_LAG, 0.5, // (0 to 3) seconds
        CAMERA_DISTANCE, 3.0, // ( 0.5 to 10) meters
        //CAMERA_FOCUS, <0,0,5>, // region relative position
        CAMERA_FOCUS_LAG, 2.0, // (0 to 3) seconds
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_PITCH, 0.0, // (-45 to 80) degrees
        //CAMERA_POSITION, <0,0,0>, // region relative position
        CAMERA_POSITION_LAG, 0.05, // (0 to 3) seconds
        CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
        CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters
    ]);
    llSleep(5);
    butt_cam();
}



worm_cam()
{
    llOwnerSay("worm_cam"); // say function name for debugging
    llSetCameraParams([
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
        CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees
        CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds
        CAMERA_DISTANCE, 8.0, // ( 0.5 to 10) meters
        //CAMERA_FOCUS, <0,0,5>, // region relative position
        CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_FOCUS_THRESHOLD, 4.0, // (0 to 4) meters
        CAMERA_PITCH, -45.0, // (-45 to 80) degrees
        //CAMERA_POSITION, <0,0,0>, // region relative position
        CAMERA_POSITION_LAG, 1.0, // (0 to 3) seconds
        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)
        CAMERA_POSITION_THRESHOLD, 1.0, // (0 to 4) meters
        CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters
    ]);
}

spaz_cam()
{
    llOwnerSay("spaz_cam for 5 seconds"); // say function name for debugging
    float i;
    for (i=0; i< 50; i+=1)
    {
        vector xyz = llGetPos() + <llFrand(80) - 40, llFrand(80) - 40, llFrand(10)>;
//        llOwnerSay((string)xyz);
        vector xyz2 = llGetPos() + <llFrand(80) - 40, llFrand(80) - 40, llFrand(10)>;
        llSetCameraParams([
            CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
            CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees
            CAMERA_BEHINDNESS_LAG, llFrand(3), // (0 to 3) seconds
            CAMERA_DISTANCE, llFrand(10), // ( 0.5 to 10) meters
            //CAMERA_FOCUS, xyz, // region relative position
            CAMERA_FOCUS_LAG, llFrand(3), // (0 to 3) seconds
            CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)
            CAMERA_FOCUS_THRESHOLD, llFrand(4), // (0 to 4) meters
            CAMERA_PITCH, llFrand(125) - 45, // (-45 to 80) degrees
            CAMERA_POSITION, xyz2, // region relative position
            CAMERA_POSITION_LAG, llFrand(3), // (0 to 3) seconds
            CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)
            CAMERA_POSITION_THRESHOLD, llFrand(4), // (0 to 4) meters
            CAMERA_FOCUS_OFFSET, <llFrand(20) - 10, llFrand(20) - 10, llFrand(20) - 10> // <-10,-10,-10> to <10,10,10> meters
            ]);
            llSleep(0.1);
    }
    butt_cam();
}

back_cam()
{
    llSetCameraParams([

            CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
            CAMERA_DISTANCE, 5.0, // ( 0.5 to 10) meters
            CAMERA_PITCH, 10.0, // (-45 to 80) degrees
            CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees
            CAMERA_BEHINDNESS_LAG, 0.1, // (0 to 3) seconds
            CAMERA_FOCUS_OFFSET, <0.0,0.0,1.5>, // <-10,-10,-10> to <10,10,10> meters
            CAMERA_FOCUS, llGetPos(), // region-relative position
            CAMERA_FOCUS_LAG, 0.1, // (0 to 3) seconds
            CAMERA_FOCUS_THRESHOLD, 0.1, // (0 to 4) meters
            CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
            CAMERA_POSITION, llGetPos(), // region-relative position
            CAMERA_POSITION_LAG, 0.5, // (0 to 3) seconds
            CAMERA_POSITION_THRESHOLD, 0.5, // (0 to 4) meters
            CAMERA_POSITION_LOCKED, FALSE // (TRUE or FALSE)
            ]);
        }
setup_listen()
{
    llListenRemove(1);
    CHANNEL = llRound(llFrand(1) * 100000);
    integer x = llListen(CHANNEL, "", "", ""); // listen for dialog answers
}

default
{
    state_entry()
    {
        setup_listen();
        llSetTimerEvent(2);
    }
   
    touch_start(integer total_number)
    {
integer perm = llGetPermissions();
if (perm & PERMISSION_DEBIT)
{ llOwnerSay(llGetScriptName() + " has PERMISSION_DEBIT perms for "+(string)llGetPermissionsKey()); }
if (perm & PERMISSION_TAKE_CONTROLS)
{ llOwnerSay(llGetScriptName() + " has PERMISSION_TAKE_CONTROLS perms for "+(string)llGetPermissionsKey()); }
if (perm & PERMISSION_TRIGGER_ANIMATION)
{ llOwnerSay(llGetScriptName() + " has PERMISSION_TRIGGER_ANIMATION perms for "+(string)llGetPermissionsKey()); }
if (perm & PERMISSION_ATTACH)
{ llOwnerSay(llGetScriptName() + " has PERMISSION_ATTACH perms for "+(string)llGetPermissionsKey()); }
if (perm & PERMISSION_CHANGE_LINKS)
{ llOwnerSay(llGetScriptName() + " has PERMISSION_CHANGE_LINKS perms for "+(string)llGetPermissionsKey()); }
if (perm & PERMISSION_TRACK_CAMERA)
{ llOwnerSay(llGetScriptName() + " has PERMISSION_TRACK_CAMERA perms for "+(string)llGetPermissionsKey()); }
if (perm & PERMISSION_CONTROL_CAMERA)
{ llOwnerSay(llGetScriptName() + " has PERMISSION_CONTROL_CAMERA perms for "+(string)llGetPermissionsKey()); }
if (perm == 0)
{ llOwnerSay(llGetScriptName() + " has NO perms for "+(string)llGetPermissionsKey()); }

        llDialog(llDetectedKey(0), "What do you want to do?", MENU_MAIN, CHANNEL); // present dialog on click
    }
   
    listen(integer channel, string name, key id, string message)
    {
        if (llListFindList(MENU_MAIN + MENU_2, [message]) != -1)  // verify dialog choice
//        if (llListFindList(MENU_MAIN, [message]) != -1)  // verify dialog choice
        {
//            llOwnerSay(name + " picked the option '" + message + "'."); // output the answer
            if (message == "More...")
                llDialog(id, "Pick an option!", MENU_2, CHANNEL); // present submenu on request
            else if (message == "...Back")
                llDialog(id, "What do you want to do?", MENU_MAIN, CHANNEL); // present main menu on request to go back

           
    else if (message == "Cam ON")
    {
        take_camera_control(id);
    }

    else if (message == "Cam OFF")
    {
        release_camera_control(id);
    }

    else if (message == "Butt Cam")
    {
        butt_cam();
    }

    else if (message == "Fly Cam")
    {
        fly_cam();
    }

    else if (message == "Worm Cam")
    {
        worm_cam();
    }

    else if (message == "God Cam")
    {
        god_cam();
    }

    else if (message == "Trip Cam")
    {
        trip_cam();
    }

    else if (message == "Me Cam")
    {
        me_cam();
    }

    else if (message == "Ghost Cam")
    {
        ghost_cam();
    }

    else if (message == "Trap Toggle")
    {
        trap = !trap;
        if (trap == 1) {
            llOwnerSay("trap is on");
        }
        else {
            llOwnerSay("trap is off");
        }       
    }

    else if (message == "Back Cam")
    {
        back_cam();
    }

        } else
            llOwnerSay(name + " picked invalid option '" + llToLower(message) + "'."); // not a valid dialog choice
    }

    run_time_permissions(integer perm) {
        if ((perm & PERMISSION_CONTROL_CAMERA) == PERMISSION_CONTROL_CAMERA) {
            llSetCameraParams([CAMERA_ACTIVE, 1]); // 1 is active, 0 is inactive
            llOwnerSay("Camera permissions have been taken");
        }
    }
   
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            key agent = llAvatarOnSitTarget();
            if (agent)
            {
                setup_listen();
                llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
            }
        }
    }
   
    attach(key agent)
    {
        if (agent != NULL_KEY)
        {
            setup_listen();
            llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
        }
    }
   
    timer()
    {
        if (trap == 1)
        {
            focus_on_me();
        }       
    }
   
}

</CODE>

Safety Pin - Attachment Tool for Secondlife Creators

Here's a nice little freebie called Safety Pin that could save you hours of time realigning objects on new attachment points.
Also useful for building a 'mannequin' of the attachments on the supplied pose stand that will remember your exact size and placement.

Information is money and you're giving it away!

Internet security is back in the news as ad tracking companies apparently circumvented Safari's privacy settings and uploaded users contact lists to their servers without their permission.
This affects all Safari users on all platforms including Apples iOS devices.
I run a fairly tight ship when it comes to internet security so here are my recommendations for safe web browsing.
I run Mozilla Firefox as my primary browser believing it to be more secure than IE and very stable.
I've played around with Chrome and I use Safari on my iPhone.
Firefox has a great selection of 'add-ons' so you start with the basic setup and add the things you want from their website.
The first add-on you want to grab off the Firefox website is "No Script".
This little baby allows websites on a page by page basis.
In fact element by element. You can choose to allow only certain parts of a website to run.
Often a web page will be made up from all different sources combined into one cohesive page.
No Script allows you to see all the various sources and allow or disallow them by 'friendly name' IP.
So if the content I want to view on CNN.com is the news part but I don't care about seeing their ads which come from their ad server, I can block them and just see the news part. Brilliant!
If you come across a malicious web page that runs scripts as soon as you land on it, chances are you'll get infected immediately.
No Script has all scripts off by default and then it's up to your judgement whether you should allow a page to run its scripts. So it's not entirely foolproof!
Another plus is I can open several youtube tabs at a time and by disallowing youtube.com in the No Script options, the videos won't all simultaneously start playing. I can go to each tab and allow just that video to play then move to the next one and do the same. This works on any website with streaming content.
I've been using No Script for a couple of years now and I wouldn't not use it.
It requires you to be more aware of what various parts of a web page are doing but that's a good thing and as it's all off by default, you have maximum protection from 'drive-by' hijackings!

The BBC's tech program Click featured another add-on for Firefox recently called "Do Not Track Plus" from security company abine.com.
The ad tracking story had just broken and so I checked out what this thing does.
Besides 'third party cookies' that track your web browsing and target advertising towards your apparent demographic, there are other ways of data scraping most people aren't aware of.
"Social Buttons" like Facebook, Twitter, Digg, etc allow the website you are visiting to share that information with these companies. So if you're logged in to facebook and decide to look at other websites, that is being tracked. The friendly facebook icon on that page is coded in such a way, no cookie is required.
Then there's the inevitable ad farming companies that show up all the time like doubleclick, and google analytics. The more popular a website, the more likely it is 'affiliated' with other data sharers.
Besides all this happening without you even realising it. Despite companies growing rich by selling on your information while you blissfully enter personal data into web forms on a redirected site in Latvia, there are serious privacy issues involved.
A lot of this information collected is apparently 'anonymous' but not all of it.
And break-ins are to be expected.
Hackers are getting more sophisticated and backed by huge money.
If we can encrypt it, someone will work out how to unencrypt it.
In the meantime, Do Not Track Plus stops all data sharing on every page you visit.
None of these are important to the viewing of the page.
In fact for each IP that has to be contacted it costs a few miliseconds.
These data trackers are slowing you down!

I also run Avira anti-virus and Comodo firewall on my computer and have automatic updates set for each.
Both are great free products that will save you a lot of angst from a virus, trojan or worm.
You should never connect to a network without anti-virus and a good firewall already set up.
The threats are real and in a test I read recently, it took as little as 17 seconds for an unprotected machine to be infected by automated port sniffing bots.