Off-work robot fun

February 26, 2009 by · 4 Comments
Filed under: Communications, Robots 

As of late, I’ve been having loads of fun with an old robot of mine, Robby RP5. My biggest complaint at all times has been the fact that it has a horrible 8-bit processor with “some kind of” Basic interpreter/compiler that I never quite figured out because it is so boring and … well, let’s face it, you will never be able to do anything “wow” in a language that is more or less assembler having 4k flash and 256bytes ram where only some 60 bytes are actually available.

As of late, we’ve been having some fun with zigbee modules at work, and I figured out a way to have fun with my old Robby again. Robby has a serial port, and I’m connecting one zigbee module to that one, and on the other end I’ve got a zigbee module connected to my computer via USB. On the Robby processor, I got a very simple program that simply talks a protocol sent over the zigbee connection and “implementing” the commands sent in packets. There are 3 packets that can be sent, TrackData, SensorData and RequestData. TrackData packet sent from computer sets speed of both tracks individually, RequestData is sent from computer to Robby and contains a request for a packet back. The Request can either be TrackData or SensorData. SensorData contains data from all sensors supported (currently only IR range sensors).

My first demonstration program on the computer is connected to a joystick and simply transforms the joystick input and sends it to the robot. Pushing button 0 requests sensordata and 1 trackdata.

Right now, I’m looking at porting my robot drivers into the Player/Stage project which I’ve been looking heavily at as of late, and seems damn cool. I’ve been testing some of the example robots in the Stage simulator, and if I would port my setup into that project, I should be able to use the available robot “behavioural modules” straight on my robot, and/or test my new modules in a simulator before actually running in the real world. In all honesty, I think player/stage is the best thing I’ve ever found since sliced bread, it simply opens up for sooo much fun 🙂 . Connect this with a couple of zigbee modules, you can build very simple and cheap robots that are extremely powerful. 60ÜSD robot chassis, 5USD processor, 10USD junk, 30USD for 2 zigbee modules, add some sensors, and you’ve got as much as you can ask for. Robby for example is around 110USD, probably much lower, a pair of zigbee modules are 30USD.

And yes, I will open this once I feel that I’m closer to finished :-).

Work? What work?

January 27, 2009 by · 1 Comment
Filed under: Configuration Management, Linux 

So, just a brief update. I’ve recently (a few months back *cough*) taken over our Linux “education” group at work, and it’s interesting. The sad part is, we mostly only see people who already knows what Linux is as we’re working internally in a world where most people are rather Computer savvy as it is. It’s given me a few new viewing angles though, and I’ll get back to that at a later point.

Currently working on some Trac guidelines for our Change Management process as well. Working from home today to actually get something done with it, as most of the days I wind up getting too many disturbing calls, talks and discussions to be very efficient. Our first two tries at making a decent workflow winded up a bit messy, and I think we really must get this down properly this time.

There are some other things I react on, and want to fix, for example, as it looks now, every single project sets up their own bugtracking/ticketsystem, and every project uses a different system (trac, mantis, clearcase, dimensions, etc). Preferably, this should be centralized in some fashion, and if possible I’d love to get a bit more homogenized environment. As it is, I try to tell people “look, here’s a system for handling your day to day tasks, use it!”. First time, the workflow got overly complex, second shot was also overly complex, and people where put off by all the choices and steps to take. This problem mainly stems from project/change management criterion.

My latest and greatest (yeah yeah) workflow should alleviate some of these problems by making some of the choices less visible to normal users. Ie, we have one task management system and a problem and change management system baked into one, but normal users (programmers) only use the task management system, while the project manager, tech project manager and CM also have the ability to handle problems and changes in separate workflows.

We’re also adding the ability to have supertickets, where a single problem report can contain several tasks. This is a pseudo development so far, as we’re not actually adding the whole deal right now, we’re just adding the idea of it, not bounds checking or views/reports of it. Basically, every ticket can have a superticket (we add a numeric field to the ticket), which can point to another ticket, which is the “parent” ticket. This makes it possible to handle a large and complex bug in several smaller tickets. Anyways, the idea is there, but it’s not fully implemented. If our management likes it, and the others like it, we could implement it for future usage. I’m worried it’s too complex however. At the same time, one complex system might be better than 6 alltogether different systems as it allows for longer time to learn? Kind of like… well, unix for example. Once you find ls, its a darn good bit faster than having to click your way through a whole heap of paths to find the specified file list.

At the same time, both me and PM are a bit tired of Trac’s shortcomings, maybe change to Mantis for example? My general thought to this however is, we need to stick it out i’m afraid… one more system will just make the normal user less interested in the new tool and hence taking even longer to learn. As it is, people use it at a bare minimum cause they dont know it, give them time to learn it properly, and they might come to like it. Comments on this line of thinking?

For now, tata. Back to writing.

Christmas ending

January 4, 2009 by · Leave a Comment
Filed under: Hardware, Linux 

So, christmas and new years holidays is coming to an end. A long and arduous autumn/winter at work has ended, and an equally joyful christmas holiday is ending. This has been the year of working for my part, and the experience has been incredible. In all honesty, I’ve never had the opportunity to work in such a stimulating environment as I have the last few months, and I’m very happy for it.

Me and the girlfriend had the bad habit of buying an Xbox 360 for ourselfs this christmas, which made us realize we have a really small tv, so within 5 days we bought a new one. Then, we realized how bad speakers we have, so we winded up buying a set of bose speakers and new spdif cables within 2-3 days as well. This in turn, and the fact that I finally had some spare time, lead to me spending a lot of time finally getting the HTPC configured and working.

The entire HTPC is worth mentioning since I’ve put it together from parts, and installed/configured everything on my own. My opinion is that mythtv and ubuntu (mythbuntu) has come a long way as a platform for end users, but they still have a long way to go I’m afraid. My biggest annoyance is still the same it was 12 years ago unfortunately, and I think it’s to some extent become even worse over time. Graphics and Sound drivers…

I personally have fairly new nvidia card which I want 3d graphics on, and all the hardware accelerations etc, in other words I’m stuck with the nvidia drivers. You would think it would be easy with the proprietary hardware drivers stuff in Ubuntu, but it’s not. It’s actually worse than some years ago when I last handled these setups, then all you had to do was compile and install drivers in the correct kernel modules directory. Now you have to fight with umpteenth other installers which crashes and overwrites eachothers and so forth, and then when you do an update, all of a sudden you overwrite your working drivers with nonworking versions and you’re stuck trying to figure out just what happened. Also, the choice of good graphics cards has become smaller imho. If you want something powerful, you’re stuck with nvidia or ati. Both drivers are completely horrible to get working. I’m hoping the rumours I’ve heard lately will turn true here, and we’ll finally see better support for open source software from both companies, at least if they could make a single decent installer for the proprietary drivers in the common Linux distributions.

And my final gripe, which isn’t so large as the other ones, the sound drivers. Sound was absolutely horrible back in the days with OSS, whatever soundcard I tried to install, I winded up with either having to run the trial OSS drivers, or choosing between no sound and buying the OSS drivers. This has become much better happily. It’s still not working flawlessly as I just found out (SPDIF took a few hours to get working, and I still haven’t gotten 5.1 output to work correctly over SPDIF).

These are critical areas of an OS (you expect sound and graphics to “work out of the box” these days, not having to screw around with settings/drivers/installers as soon as you deviate by a single micron from the specifications.

On top of this, I had some more serious issues with my iMON PAD remote, once again after reinstalling the system. That I can live with, but it’s a serious annoyance. For some reason, the configurations shipped with mythbuntu had a bunch of codes that where off by a few numbers every here and there, and then there was a lot of buttons not connected between lirc to mplayer and mythtv.

Apart from this, I’m very happy with the setup by now. The basic functionality is there, but it’s made for tweaking and having fun, so there’s still a lot of things I’m interested in doing on it :-).

By now, I’m mainly waiting for work to start again, I feel rested, I’ve gotten to fiddle with some hardware and software, and I got new energy for the new year. I just need to try and get working on my webpage and stuff like that a little bit more so I can finally finish it. Like all IT projects, it’s running very late ;-).

Build components

November 23, 2008 by · Leave a Comment
Filed under: Configuration Management, Development 

After a weekend of work, I finally got myself a build component that I’m semi-pleased with, for C and C++ projects, using Subversion. Most likely works for any other lower level programming language as well.

First off, structure. Each component is it’s own BTT(Branches, Tags, Trunk)-root, residing in a Project_Modules directory in subversion. Each component contains an inc, src, test and a stubs directory. Rationale for the BTT-root is that, with a separate BTT-root for each component we can raise the version of each separate component without having to raise it for the entire project.

The Project directory resides on the same level as Project_Modules, and is empty, only containing the subversion property externals pointing to the trunks of the Components in Project_Modules. Rationale for this is to have a simple place to checkout the entire project. It’s a bit dangerous when working with branches, and requires a little bit extra care so one doesnt write into the trunk out of mistake. Possibly block everyone but a specific user to write in the trunks and have that CM person do all the branching/merging. It is time consuming however.

It looks something like this:

  • Project_Modules
    • Component1
      • inc
      • src
      • test
      • stubs
    • Component2
      • inc
      • src
      • test
      • stubs
  • Project

Inc directory is the public interface of the component towards the other components. Src directory contains the actual code of the component. Test contains unit tests (personally, i create a new directory for each new unit test file). Stubs contains the stubs of my own component. Ie, Component1/stubs will contain stubs for the functions in Component1. Rationale being that 95% of the time, we want to stub another component in the same way, instead of keeping stubs of a component in 10 different components, we keep it in one place.

Criminalized generation

November 22, 2008 by · Leave a Comment
Filed under: General, Personal 

So, IPRED is coming to this country, Swedens government is forcing it into effect. Even though there has been quite heavy resistance and a lot of people don’t like it. I agree. It’s a complete nutjob of a law. Before moving on, let me state that I am here discussing the Swedish implementation of the law. This is even further going than the original EU directive COM(2006)0168. The best part is, they just “softened it”. Ie, it was even worse from the beginning.

As has already been said by thousands of others, but it can’t be said enough times. The law moves the burden of the police work from the (almost) objective police to the absolutely partial owners themself. Let’s consider this: We have for centuries had a police force because they are objective. They deal with criminals and they should hopefully not take sides for either part in a case, it’s left to the court to do this.

With IPRED, the entire burden of investigating a crime is moved to the plaintiff. The plaintiff (in this case, the intellectual property owner) or someone working for the plaintiff, finds someone downloading a piece that they “own”. They then move on to demanding the name and contact information of that person from the Internet Service Provider (ISP) of the Internet address of that specific downloader. Current law does not tell the ISP that it has to comply with the demand. IPRED does. The plaintiff can now move on to the next step below.

The plaintiff are then free to send monetary demands to the “defender”, who will find out about the problem with the monetary demand. The monetary demand is formed as “pay us money or we draw you in front of a court and you will loose a lot more”. Basically, you will have a gigantic mass of people just paying out of freight “who knows, maybe my kids/spouse/visitor did download that song on my computer?”. Or how about framing someone you don’t like, it’s not gonna be hard, trust me. Don’t like your neighbour, go download a free program and hack him, then set up a bittorrent client to keep downloading/uploading from their computer.

Now, this is the basic argument people have against this new law. Unfortunately, it has been cobbled together by retards and rather IQ-free people and been compromised by to such a degree that it’s no longer coherent. One of the sideeffects of this law is that it will become illegal to buy an application or download a open source application and then run on your own computer. The same plaintiff above could sue every single owner of a Microsoft Windows Vista license (for example) if they can find a instance where Vista steps on their patent.

This comes to mind, when one reads IPRED:

When the Nazis came for the communists,
I remained silent;
I was not a communist.
When they locked up the social democrats,
I remained silent;
I was not a social democrat.
When they came for the trade unionists,
I did not speak out;
I was not a trade unionist.
When they came for the Jews,
I remained silent;
I was not a Jew.
When they came for me,
there was no one left to speak out.

“New” subversion structure using svn:externals

Me and the boss deviced a new structure for the project during the last few weeks, and it’s been slowly refining in our heads until yesterday when we finally implemented it. I think we made a rather refined and complex structure, but once we got it into place physically and once we get the general idea into the developers heads (including me), I think it will prove very powerful.

That being said, I don’t think this is a new structure, I just think people are very quiet about how they use subversion, and it’s a problem. Newcomers do the same old errors over and over again. So, let’s get on to try and explain it all.

Most projects uses a single BTT root, where BTT stands for Branches, Tags and Trunk. Ie, they start a project, and then straight in the root put the BTT, and then inside that, they create the project structure. For example:

  • project-root/
    • Branches
    • Tags
    • Trunk
      • admin
      • src
      • out
      • test

This is a good basic structure for very small projects, containing perhaps 10’ish files, or where the actual implementation is perfectly homogenous and has no need for separated versioning. Every time we want to make a release, we cheap copy the content to Tags as a new tag (called perhaps /Tags/Milestone1-RC1). We now have a release that we can provide to people.

The problem comes if it isn’t so homogenous. For example, let’s say you are developing a calculator. It has two objects, a numpad and a display. What if you want to make a new version just of the display? You need to make a completely new version, including for the numpad.
Or how about wanting to branch just a small part of the project? Ie, I want to use a branch for the numpad, and then use the trunk for the display. You’d then have to make a cheap copy for the entire tree. Admittedly, it isn’t costing too much.

Our “new” structure deals with this on a different level. Basically, the idea is to have multiple BTT roots, and then use svn:externals to connect the correct tags to create
1) a complete releasable project and
2) a complete workarea project.

For the calculator example, you get the following structure:

  • calculator/
    • Calculator_Modules/
      • Display/
        • Branches/
        • Tags/
        • Trunk/
      • Numpad/
        • Branches/
        • Tags/
        • Trunk/
    • Calculator/
      • Branches/
      • Tags/
      • Trunk/

As you can see, it looks much more complex, and it is, but the possibilities are infinitely much better.

The Calculator/Trunk/ directory contains a svn:externals property linking in the Calculator_Modules/Display/Trunk as Display and Calculator_Modules/Numpad/Trunk as Numpad. This works by linking external resources into the current directory structure, so basically I would get the trunks into my Calculator trunk, but properly renamed, without them actually being there in the repository. This also works on “real externals” by the way, such as linking in a specific version of a library from some repository on the Internet.

To create a Calculator/Tags/MS1 we could either just set a -rXX to the correct subversion revision, or we would create svn:externals to the correct Display and Numpad Tags, not their trunk. This way, we can say that “Calculator 1.0 contains Display 2.0 and Numpad 2.1”, not “Calculator 1.0 contains Display revision 439 and Numpad revision 587”, or even worse “Calculator 1.0 is revision 587” which completely lacks granularity.

I’m not completely sure it’s perfect, and others have probably already tested it, but I think it will be pretty sweet :-).

Mednafen configuration for Logitech Precision

October 29, 2008 by · Leave a Comment
Filed under: Linux, Ubuntu 

As I’ve already stated partially, I got an HTPC at home running MythTV on ubuntu. One of the things I’ve wanted to do for a long time was to get some games running on it. Supertuxkart was simple and was installed in less than 3-4 minutes once I understood the basics of the MythGames plugin (typing with a on-screen keyboard and a remote control is slow).

Anyways, I did have some problems getting a NES emulator, or any emulator at all as a matter of fact, running on it, and I also had some problems getting input from the right devices to them properly. I finally decided on mednafen as it seemed the easiest to understand.

Let’s understand the structure. NES and other games are usually downloaded in some image file. Mednafen is installed as a binary. MythGames needs to know about the binary used to launch a NES image, and where the NES images are located. I downloaded mednafen using apt-get install mednafen. Secondly, MythGames needs to know where you will put the images, personally I put them in /var/games/nes/. This is entered into the mythtv configuration using the Setup -> Game Settings -> Game Players. Choose New Game Player and enter

Player name: mednafen (for example)
Type: Other
command: mednafen -nes.stretch 1 -fs 1 -vdriver 0 %s
Rom Path: /var/games/nes

Having a keyboard around when doing this is prefered, using the on-screen keyboard takes ages.

Once this is done, go to Setup -> Game Settings -> Scan for games. This will scan the /var/games/nes directory for all images and add them to the list. To start a game, go to Games. Then get into the “All Games” -> “mednafen” and you should find all the games from /var/games/nes there.

Click one, and the game should hopefully start. The first time mednafen is run, it creates a directory ~/.mednafen/ containing a basic configuration. The following is an example to get my Logitech Precision gamepad running with it:

nes.input.port1.gamepad.a joystick 42190af389429475 00000002
nes.input.port1.gamepad.rapid_a joystick 42190af389429475 00000003
nes.input.port1.gamepad.b joystick 42190af389429475 00000000
nes.input.port1.gamepad.rapid_b joystick 42190af389429475 00000001
nes.input.port1.gamepad.select joystick 42190af389429475 00000008
nes.input.port1.gamepad.start joystick 42190af389429475 00000009
nes.input.port1.gamepad.up joystick 42190af389429475 0000c001
nes.input.port1.gamepad.down joystick 42190af389429475 00008001
nes.input.port1.gamepad.left joystick 42190af389429475 0000c000
nes.input.port1.gamepad.right joystick 42190af389429475 00008000

nes.input.port2.gamepad.a joystick 42190af389429476 00000002
nes.input.port2.gamepad.rapid_a joystick 42190af389429476 00000003
nes.input.port2.gamepad.b joystick 42190af389429476 00000000
nes.input.port2.gamepad.rapid_b joystick 42190af389429476 00000001
nes.input.port2.gamepad.select joystick 42190af389429476 00000008
nes.input.port2.gamepad.start joystick 42190af389429476 00000009
nes.input.port2.gamepad.up joystick 42190af389429476 0000c001
nes.input.port2.gamepad.down joystick 42190af389429476 00008001
nes.input.port2.gamepad.left joystick 42190af389429476 0000c000
nes.input.port2.gamepad.right joystick 42190af389429476 00008000

command.exit joystick 42190af389429475 00000006&joystick 42190af389429475 00000007
command.exit joystick 42190af389429476 00000006&joystick 42190af389429476 00000007

Unfortunately, the above changes around a bit from device to device and atm i’m not even sure the i’d will survive from disconnect/connect of the gamepads.

The proper way of doing this is to:

1. Start a game.
2. Press Alt+Shift+1
3. Push the correct buttons asked for on screen to do specified command. (First time you push a button adds it to the command, second time you push the same button marks it “final” for the command sequence. Peculiar, I know. So, to make the game use button 2 and 3 in conjunction to be button A, you’d first press button 2 once, then button 3 twice.
4. hit esc on the keyboard to leave mednafen. The config should now be saved.

I haven’t found a way to create the “command.exit” commands yet. I’ll have to work some more on that.

Stoneage efficiency measurements

October 20, 2008 by · Leave a Comment
Filed under: Management 

Once again I react to the inefficiency of corporate bureaucracy. A very common way of measuring efficiency is to use statistics. How do you use statistics to measure efficiency, and especially in cases such as helpdesk and support functions in a corporation?

A common way of doing this is to just measure closed tickets, and how long time is spent per ticket. I’m not sure how many companies still do this, but I’ve run into it more than once (actually, more times than I can count on my own hands) in the last year.

The problem is that any given person with the sole efficiency measurement being quantitative applied knowingly on him will react by trying to increase his efficiency, and how better to do that than to just cut and paste answers and close any tickets as soon as that’s done.

My response to this, is it quality or quantity that is most interesting? I believe the answer is quite simple in this case, I’m all for quality. Unfortunately, the entire economic system seems to be leaning towards quantity rather than quality these days. I think a half decent compromise however is how CCP in eve-online is handling user support, and it’s the same way I’ve done it when I did user support.

Once you get a problem report (aka ticket), skim through the message, see if you can find a common denominator with some of the most known 6-7 problems (or more if you’re unlucky). Send a cut and paste response (with either an explanation, or a detailed step by step fix), but keep the ticket alive until the person responds. If no response has been received in a given time, say a week, try to contact them again and see if the problem was solved before closing it. If the problem hasn’t been solved by this simple round, it’s either time to send it to 2nd line support, or if there is no 2nd line support start asking for information that can be used to debug the problem, and delve deeper into the problem.

I’m not claiming this is a holy grail of any kind, but it does hopefully keep more customers happy. It requires happy and motivated support personel, and that can at least try to keep face up for a while with customers. To do that, it requires proper motivators, and definitely not some stoneage efficiency measures. Get customer satisfaction index into the game, even if it’s an internal function in your company, or an external function fronting towards your customers.

Switching GNU toolchains in eclipse — the easy way

October 13, 2008 by · Leave a Comment
Filed under: Development 

This is a method of switching to a different toolchain that I found in eclipse. Basically, my goal was to get eclipse to use a secondary toolchain. Primarily in my first step, I tried making eclipse use a crosscompiling gnu toolchain.

Doing this the “right” way seems to entail writing plugins eclipse, and to write lots of XML configurations and so forth. Not having the luxury of infinite time and money (yet wanting a managed build), but rather being result driven, I finally managed to solve it partially with a hack.

My secondary goal now is to make the build work with a completely “non-gnu toolchain” (renesas sh compiler), I will try to hack together this in the upcoming days. I’ll get back to this topic again, once I know if it works or not. In the meantime, this is how I got it to compile with “non-standard” toolchain, and “standard” cygwin toolchain at the same time.

  1. Install the toolchain somewhere.
  2. Setup your PATH with the /bin/ directory in it.
    1. Start -> Control Panel -> System.
    2. Enter the Advanced tab.
    3. Click Environment Variables.
    4. Find the PATH variable in System variables.
    5. Edit and add ;c:pathtoyourtoolchain at the end of it.
    6. OK
    7. OK
  3. Create a new Build Configuration (Target for example).
    1. Right click the project in the Project Explorer.
    2. Build Configurations -> Manage…
    3. New…
    4. Write name “Target” and a description.
    5. Copy settings from another target that might contain decent default values.
    6. Ok
    7. Ok
  4. Edit the Settings for the “Target” Build Configuration.
    1. Right click the project in the Project Explorer.
    2. Choose Properties.
    3. Go to C/C++ Build -> Settings.
    4. Choose the right Configuration at the top (Target in our case).
    5. For each heading in Tool Settings (GCC Assembler, Cygwin C Compiler, Cygwin C Linker)
      1. Click the heading.
      2. Edit the Command field (for example, instead of using gcc, you might be using arm-elf-gcc or m68k-uclinux-gcc).
      3. Apply.
    6. OK.
  5. Try to build the new “Target” Build.

Hint: A problem I ran into was that my new toolchain couldnt understand/interpret unix style paths properly and not hinting very openly about it. Ie, I got “missing header files” all over the build. Turning on verbose (-v flag) in the C/C++ Builds -> Settings, and then under Cygwin C Compiler -> Miscellaneous gave me an error like “ignoring nonexistent directory”, which turned out that instead of using “../inc/” I had to use “..inc”.

Removing U3 from a SanDisk cruzer micro 1gb memory

October 9, 2008 by · Leave a Comment
Filed under: Hardware, Windows 

Girlfriend has had a USB memory stick for a long long time now, and every time I plugged it into the computer, I’ve gotten completely raving mad at how retarded it is. The story is this, it has 2 separate partitions. 1 partition where you save files etc, and a “system” partition containing something called U3. U3 is closest described as a virus imho.

The system partition is read only and I found no way of easily making it read/write/formattable. Every time you plug in the USB stick, it will autorun a junk program called U3 launchpad with a lot of popups showing up to let you know about it, and it has a bad notion of trying to be a second “start” menu or something.

Anyways, I decided for the 3rd time to try and remove this crap from the USB stick, both times before I got about 10 minutes into the process, at which time the computer had locked up hard on me 2-3 times, and almost had me stomping on the memory stick out of sheer annoyance. Same thing happened this time. But, I had some more perseverance, and actually access to the internet this time, and started searching for others with the same kind of problem.

I found this: http://www.u3.com/uninstall/ . The sheer idiocy of this amazes me. Let’s assume that here I am buying a memory stick to help me “when I have no access to the internet”, and I get some junk with me on the usb drive. The only way of getting rid of the junk, is to download an application off of the “thing I will likely not have access to”.

So, I download the application, and run it. It asked me if I wanted to backup the data on the memory stick. I did, so I choose to backup data on it, and continued. It downloaded the data properly to the harddrive it looked like, and continued to reformat the drive. At this point, it crashed, trying to replug the USB drive didn’t work — apparently the driver for the drive was already installed. So, reboot the computer, and it finally recognizes the drive again. It’s empty, no more U3, but the application never got around to actually formatting the new drive and reinsert the backed up data. No worries I think, I format the drive, and manage to search down the backup to C:Documents and SettingsApplication DataU3tempU3BkUpDir. Guess what, the application only copied the directory structure, no data is actually in the directories.

And they have the audacity to _really really_ try to talk me into “nooo, you want to keep this application, it will save your life” more or less. It’s a freaking virus. It’s actually harder to get rid of than quite a lot of viruses, and caused more of a havoc imho. Anyways, check out the above link to get rid of U3. And be prepared to backup data on your own

« Previous PageNext Page »