Showing posts with label Miscelaneous. Show all posts
Showing posts with label Miscelaneous. Show all posts

Wednesday, June 03, 2009

RUN 09: TAKE A BREATH

After being very busy last month I can finally "take a breath" and write some posts again. Things are not back to normal yet to be honest, but I guess it's time to resume my usual blogging activities.

What is "run 09"? It's a one-day IT event to be held tomorrow in Uruguay, where three topics will be covered during the whole day in different talks and keynotes, focusing mainly on what awaits on 2010 and beyond.

The topics are:

  • Cloud Computing,
  • Model-Driven Dev, and
  • User eXperience.

To get a detail view of the event, the speakers and or register, click here.

See ya,
~Pete

> Link to Spanish version.

Monday, April 27, 2009

INVARIANCE, COVARIANCE & CONTRAVARIANCE

Lately, the world of C# developers is wondering about the the meaning of two unusual words: covariance and contravariance.

There is a bunch of articles out there right now attempting to explain the concepts behind those words mainly by example, and why they matter more for the upcoming version 4.0 of C#.

To mention just a few articles on this topic:

Since this subject is new for many, plus, and let’s be honest here, it is NOT THAT easy to understand at first sight, I have decided to add my two cents by writing yet another article -explaining the way I understand it- with the hope it will eventually help others to also dig it once and for all.

Ok, enough introduction! Let’s jut begin …

From a design point of view, whenever we want to refer to inheritance, we would have to use words like “generalizations” and “specifications”. But in practice or in terms of implementation, we do use the word “inheritance” itself, plus the following two words: “based types” and “derived types”.

In what follows, I'll use the latter group of terms for the sake of easier understanding. So let’s start with some basic concepts, shall we?

(I) Basic Grounds

In theory, when talking about reference types, it is stated that a base type is bigger than a derived type because it can hold either an instance of its own type or an instance of all its derived types.

Therefore, a derived type is smaller than its base type because the former cannot hold an instance of the latter.

This is usually referred as T >= S, being T the base type and S its derived type. For instance,

Object >= String

Now, we are dealing with covariance when the reference to an object is declared as its real type or to one of its base types (and by “real” I mean the type used to create an instance of it, for example: “new Foo()”).

In other words, a derived type is covariant with its based type since the direction of attribution –and in what follows I will refer to this as “movement”, going from a derived type to a base type is thus allowed to happen.

Following this rationale, we are therefore dealing with contravariance when the “movement” goes along the opposite way.

And this is probably the most difficult concept to picture. Let’s hope this example clarifies it: if you have a delegate that, say, takes a string as an input parameter and returns a bool, then you can pass a method that takes an object as an input parameter and returns the same type, in this example: a bool. Why? Because if you can deal with a derived type within the expected method then you can also deal specifically with one of its base types (we will see an example of this later).

Finally, there’s a third concept: if “no movement” is allowed to happen, then we are dealing with invariance.

For instance, to prevent conflicting variance, mutable arrays “should” be always invariant on the base type. If you are creating an array of objects then you shouldn’t be able to insert, say, a string in that array (covariance). And thus, contrary, if you’re creating an array of strings you shouldn’t be able to remove an instance of an object from it (contravariance).

Thus, from object >= string, we could then infer that object[] >= string[], ONLY IF both arrays were immutable.

All the above-mentioned explanation is in line with Liskov’s Substitution Principle, specially in the sense that the way an object is referenced in a program must never alter any of its (“desirable”) properties.

(II) The Problem

In a static language like C#, “type-safety” implies that the compiler is capable of catching “casting” errors in the code at compile time.

As explained above, mutable arrays should be invariant to enforce type-safety. But this is not the case for arrays in C#, which are covariant on the base type. Puzzled? Then read the next paragraphs.

This means that “an error” in the source code that should be always caught by the C# compiler has been turned into an exception that can only be detected at runtime by the CLR!

Why? To answer this question and from now on let’s define three classes, which many seems to like to use in code samples on the subject, lately: Animal, Cat and Dog, being Cat and Dog both derived types of the same base class: Animal.

Well? You can always allow to store a Cat in an array of Animals, but with array covariance the real type to store could be an array of Dogs.

Take for instance the following code:

   1: Animal[] animals = new Dog[10];
   2: animal[1] = new Cat();

What do you expect it will happen in the above code? Possibly the compiler will detect an error here, right? Right?!

Wrong! Believe it or not, this code only throws a runtime exception instead of an error at compile time, on any version of C#!

If this is wrong, why is it allowed, then? Because the compiler knows that both derived-types are Animals, and therefore implicit casting is allowed for an array declared to expect Animals, even though the actual instance of the array is declared to contain a whole different derived type with a common base type (in the above code: Dog[10]).

Remember that in C# there is implicit casting from a derived type to its base type because it’s a type-safe operation, but the same does not apply the other way around. And thus, you must always use an explicit cast to convert a based type back to a derived type.

Unfortunately, this problem exists in C# since version 1 and will remain for version 4 (shhhhh! … don’t say it loud, but it’s a Java-related thing).

But let’s move further to what will do change …

In the previous section I talked about delegates. Well, in C#, delegates are covariant for return reference types and also contravariant for reference-type parameters. Puzzled again? Just read on …

Continuing with this animal thing, let’s take a look at the following example for covariance:

   1: public delegate Animal MyDelegate(int i);
   2:  
   3: MyDelegate myDelegate = new MyDelegate(MyMethod);
   4:  
   5: public Cat MyMethod(int i) { … }

If the declared delegate prompts for a method waiting for an Animal as a return type, the compiler knows that a Cat is an Animal and due to implicit casting from a derived type to its base class, you can pass a method that receives an Animal.

However, the opposite is not true. If the return type is a Cat, you cannot pass an Animal instead without an explicit cast to a Cat type. Why? Due to the fact that an Animal object could have really been created as a Dog!

Now, let’s move onto an example for delegate’s contravariance for parameters:

   1: public delegate int MyDelegate(Cat myCat);
   2:  
   3: MyDelegate myDelegate = new MyDelegate(MyMethod);
   4:  
   5: public int MyMethod(Animal myAnimal) { … }

If a declared delegate prompts for a method that expects a Cat as a parameter, then you can deal with its base class. Why? Because a Cat is an Animal and by inheritance you know how to deal with it as an Animal. So anything that can be assigned like a Cat can be passed and treated specifically as an Animal with type-safety, as long as the declared delegate and the passed method, both return the same type (in the example above, an integer).

Understood. But why is this contravariance? We are in fact reversing the direction of attribution since we are passing a method that takes an Animal as a parameter to a function pointer (or delegate) that expects a Cat as an argument.

Remember the definition for contravariance? We are passing a bigger type to a smaller type, here. So we are reversing the direction of attribution.

As with the example for covariance, the opposite is not true. If the delegate expects an Animal as a parameter, you cannot treat it as a Cat in the passed method, since again there is no guarantee at all that the passed Animal parameter is a Cat. It could be a Dog, instead.

A great example to fully understand this is related to two delegates expecting methods with the MouseEventArgs and KeyEventArgs parameters; they could refer instead to one method expecting a parameter of the type EventArgs. Meaning? In that situation, in both cases the same behavior is expected. So, as you wouldn’t care about the added functionality on the two “derived” classes, you could just deal with both arguments equally using the base type in common.

Ok, if this does work for delegates in current versions of C#, where’s the problem to solve then? Well, the above-mentioned rule is not applicable when storing generic delegates, which are always invariant in C# 3.0, for both the parameter and return types (and the same applies to interfaces).

Two examples:

  • You cannot return a IEnumerable<string> if the method returns IEnumerable<object> (that would be covariance), and
  • You cannot use an Action<object> delegate to replace an Action<string> delegate (that would be contravariance). Please bear in mind that I’m referring here to assigning, say:
   1: Action<Cat> myDelegate = new Action<Animal>
   2: ( myAnimal => myAnimal.DoSomethingWithTheAnimal() );

And not to something like- which of course does work just fine:

   1: Action<Cat> myDelegate = MyMethod;
   2:  
   3: public void MyMethod(Animal myAnimal) { … }

And yes, please! Try it with C# 3.0 if you are in doubt of my words.

(III) The Solution

So, what's all this fuzz with the new added use to the existing reserved words "in" and "out" in the upcoming C# 4.0?

For reference types:

  • in = contravariance (only passing arguments),
  • out = covariance (only returning types).

From the examples above:

  • Covariance: IEnumerable<T> will become IEnumerable<out T>, so a delegate declared to return a IEnumerable<object> will in fact be able to return an IEnumerable<string>, and
  • Contravariance: with Action<in T>, you will be able to assign an Action<object> delegate whenever you expect an Action<string> one.

I advice you to check the articles listed at the very beginning of this post for complete code samples on the subject.

Phew, this is it! As you can see, the theory behind these concepts is not that easy to understand but it’s neither that difficult, so I really hope you have found this explanation useful to finally accomplish that task.

‘till next time,
~Pete

> Link to Spanish version.

Wednesday, March 25, 2009

IE8 & ADOBE FLASH PLAYER FIX

[ If you deem this article as helpful, please consider downloading my game "Just Survive XP" on the Appstore (free for a limited time):

=> http://itunes.apple.com/app/just-survive-xp/id461876025 ]

Yesterday, I wanted to watch a video on Youtube when suddenly, to my surprise, I just found the following message, instead:

Hello, you either have JavaScript turned off or an old version of Adobe's Flash Player. Get the latest Flash player.

Since Javascript was enabled, in order to check whether this was a problem of Youtube's site only, I browse to other sites that I know use flash tech to find that I was really unable to watch any Flash content. They all prompted me to download and install the latest version of Adobe Flash Player.

So I visited Adobe's site and tried to get the latest Flash Player online. The key thing is that after installing the add-on, the movie clip that always appear on the site saying that your installation was successful didn't appear at all. Strangely, by refreshing the page -by hitting the F5 key- it did appear. Weird.

So I said, maybe this was just a minor glitch, and opened the video page on Youtube. Unluckily, that nasty message appeared again.

This time, I opened the "Tools" menu of IE8, and selected the "Manage Add-Ons" section. There, I found that the "Shockwave Flash Object" add-on was in fact installed and the version was correct, so I tried to "reset" it by disabling the component, closing the browser, re-open it and finally enable the add-on. No luck!

One final desperate move: just in case, I just opened the following menu on my browser:

"Tools -> Internet Options -> General -> Delete"

and deleted everything. Then, I downloaded the offline installer of Adobe Flash Player from the following link:

http://www.adobe.com/support/flashplayer/ts/documents/tn_19166/Install_Flash_Player_10_ActiveX.zip

And finally, I closed the browser and executed the installer (btw, since the offline installer does the task of uninstalling any previous version of the add-on, I skipped that part and let it do it for me).

When the process ended, I just reopened IE8, visited Youtube again to find this time that everything simply worked just fine!

I don't know if this workaround will work for you, but if you happen to experience a similar situation then just give it a try.

Well, that's it for today. I hope you find this post useful.

Stay tuned,
~Pete

> Link to Spanish version.

Monday, March 23, 2009

WIN OS REBOOT FAILS AFTER INSTALLING IE8

Yesterday I was installing the final version of Internet Explorer 8 on my Windows Vista Business machine and everything went fine until the OS prompted me to reboot.

As this is generally a usual request for new installations of IE, I just pressed the "Reboot" button with confidence.

Here was the inflexion point of my installation experience: after the machine rebooted, and the POST checks succeeded, the monitor's screen got completely blank and the main hard drive just stopped working!!! Not sound, no flashing lead, nothing.

Meaning, the OS was unable to boot; and trust me on this: turning the machine off and on after a while, didn't help at all.

If this happens to you, just don't panic. For some unknown reason -at least, for us mere mortals- the "Master Boot Record" (MBR) of your HDD may have been somehow overwritten during IE8's installation.

Maybe using the installation disks of your OS could work, by selecting the "Repair" option and then let the tool do its magic. But in my case, I used a shorter path.

I cannot assure the method I will describe will work for you; I can only state that it did work for me, therefore USE THE METHOD AT YOUR OWN RISK!

You have been warned now, so read on:

To solve this situation you don't have to reinstall your windows OS (since it's still there on the hard drive); the only thing that you have to do is find a way to write the proper MBR again to your HDD.

To accomplish this task, I searched for an old tool called Max Blast, which I used to execute when I wanted to prepare a HDD (Maxtor or Seagate) for a new Win OS installation or "sort of" repair a faulty disk. In this particular case, my main HDD was a Samsung one but I tried my luck, anyway.

I found on my archives an old Floppy Disk with version 4 of Max Blast, so I used this disk to try to reboot the system.

Then, when Max Blast executed I entered the section named "Maintenance Tools" of the main menu and then selected the option "Update MBR". After choosing the target HDD and waiting for the process to end, I finally rebooted my machine to witness that it fully worked!!!

Windows Vista was booting up again and IE8 was completely installed. Everything just got back to normal. And it only took me like 3 minutes or so to fix.

Well, this is it. I hope you find this post useful ... if you ever happen to find your-self in a situation like this :(

'till next time!
~Pete

> Link to Spanish version.

Friday, March 13, 2009

YES! I'M BACK

Well, after almost two weeks I've finally returned to Montevideo (Uruguay).

I've spent the last few days catching up to get back on track a.s.a.p. So I guess next Monday will be the new beginning of normal working days.

My first MVP Summit was really something and visiting Vancouver is always great. Thus, I hope to repeat the experience next year.

Cheers!
~Pete

-> Link to Spanish version.

Wednesday, February 25, 2009

SLEEPLESS IN SEATTLE

I'm really excited: I'm going to the MVP Summit for the first time. It's great to meet with both, other MVPs plus the members of the XNA Team.

Again, as I did last year after the Gamefest, I'll be visiting my sister and brother-in-law in Vancouver for a few days after the Summit. So, don't expect technical articles until I return :)

Best,
~Pete

-> Link to Spanish version.

Saturday, January 03, 2009

MVP AWARD FOR XNA/DIRECTX

Checking my inbox I was extremely happy to find an email from Microsoft notifying me that I have been honored with the "Most Valuable Professional" award for XNA/DirectX.

It's really motivating to know that all my technical contributions to, and support for, the XNA Community is recognized, welcome and appreciated.

Thanks to those of you who nominated me for the award, to those of you who read this blog, to those of you who ask me technical questions via email, to those of you who invite me to participate in XNA-related events, and last but not least to Microsoft for granting me this great honour. [... background music starts to play indicating that my speech must end ...]

This year I'll continue to post articles, submit recommendations for XNA through MS Connect (nope, you're not getting rid of me!), participate in technical/community forums, and help other members of the Community to spread the word that XNA rules!

Cheers!
~Pete

[I'm still out of office until January, 15th.]

Saturday, August 09, 2008

BACK HOME

Yeap, after two weeks abroad, my wife and I got finally back home.

Visiting Vancouver for the first time has been a great experience for us. The city is great and people seem not to know the word "stress". The only minus, at least for us: everything is expensive there. But, what the heck, we were on vacation ...

Seattle's gamefest: as I said in my previous post, a great experience. The talks were very instructive. Sometimes it was hard to pick the ones to attend, but I'm not omnipresent, right? In this sense, I hardly walked around the city, but at least "I've been in the Space Needle".

Overall, some quality time. I hope to repeat it next year.

Cheers!

Wednesday, July 23, 2008

THE GAMEFEST HAS BEEN GREAT SO FAR

Oh man, I'm really excited of having travelled this far to get to Seattle's Gamefest.

I've been talking with many different people (peers, MSFties, MS partners, exhibitors, etc.), giving and collecting cards like crazy, and played a lot of games. In short, having a really quality time.

In this sense, meeting the guys behind XNA GS have been really nice: Shawn, Eli, Michael, and the rest of the guys. Also cool Xna'ers like Chad Carter, Bill Reiss, and of course, "old" XNA'ers (and ex-MSFTies) like TheZMan (Andy).

Also it has been a great opportunity to discuss some crazy ideas and techniques that I have and of course want to implement in the near future, and believe me when I say that the feedback has been encouraging (thanks Shawn).

The talks have been quite handy. Lots of techniques, upcoming features, relevant information, and of course: the yummy 70% that we "indies" could get if we reach the next phase with our games.

So, guys, tomorrow I'll be returning to Vancouver with my wife and sister, so maybe I can post more comments about the conference.

Opps. Have to go. The next talk is starting.

See ya.

Tuesday, April 01, 2008

HAVING DRIVER PROBLEMS WITH 64-BIT VISTA?

I have received today a newsletter from CNET.com with a list of programs to watch during this year 2008.

To my surprise one of the programs -called "Magic 64-Bit Vista Wonderland"- claims to solve all driver-incompatibility issues with 64-Bit Vista OS.

My version of Vista is 32-bit, however, I decided to post a link to the program for those of you who need to resolve driver issues. The file is free to download and only 11k! C'mon ...

... Btw, use it at your own risk!

[!ekoj s'loof lirpA na si siht :gninraW]

Wednesday, February 27, 2008

MEET ME AT THE SAVOY

Hi guys!

As you may know the pictures of each of the three winners of The Code Project's VS 2008 Compo (sponsored by Microsoft - Defy All Challenges) are being cyclically shown on the "Defy All Challenges" site.

I guess now it's my turn to appear on the site (finally!): http://www.visualstudio2008.defyallchallenges.com/.

Cheers!

Saturday, February 23, 2008

WHAT'S THE MEANING OF "XNA"?

Interesting question ... if you are taking a long brake with a cup of coffe or a beer on your hand as well as allowing your eyesight to go out the window into deep space (I mean both "windows", your computer's OS and your office/home's one).

A couple of days ago I watched "The Da Vinci Code" on DVD and some "late nights" ago -given that I was sleepless- a rerun of "2001: Space Odyssey" on Cable, so as you can guess I soon remembered the meaning behind "HAL" -the computer of the ship- that some guys used to argue. What is worse and sad, I suddenly started to look for patterns in almost everything: "23, 23, ...".

With the recent announcements that we can create games for Zune, and being mainly influenced by the first-mentioned film above, I started to think over the meaning of the word "XNA", if any.

I know it has been officially claimed that there is no real meaning behind the 3 letters, but WHAT IF those letters resulted from other 3 letters ... (?)

Following this crazy idea I played around a few minutes "shifting" the letters a couple of places back and forward and hereunder you will find what I got:

V W X Y Z
L M N O P
Y Z A B C

I don't have a clue what "VLY" and "YOB" could stand for, but let's take a look at the remaining two arrangements:

  1. WMZ : "Windows Mobile Zune", and my favorite
  2. ZPC : "Zune PC Console".
Now, which platforms will XNA be officially supporting on this mid-to-yearend 2008? ... wait ... processing ... wait ... got it! ... Yeap ... Windows (PC), XBox360 (Console) and Zune (errr ... Zune?) ... XNA sounds way better than WMZ and or ZPC.

Coincidence? Maybe ... :)

Watch this space!

[I know I have lost my mind but you still have a way out ... just avoid the combo of films: "The Da Vinci Code" and "2001". Don't worry, better posts are coming soon. I promise!]

Thursday, December 13, 2007

PROBLEMS INSTALLING "NET RUMBLE" STARTER KIT

Well, having installed XNA GS 2.0, I then downloaded and install the Net Rumble Starter Kit. The process ended without problems so everything looked ok so far.

For my surprise, when I opened VS 2005 Express and attempted to create a new project based on that kit, I found the kit wasn't shown in the IDE's projects browser.

The template was installed under this folder:

(myOSDriveLetter)/Users/(myUserName)/Documents/Visual Studio 2005/Templates/ProjectTemplates/Visual C#

... but still the IDE didn't notice it at all.

At first I thought it had something to do with the fact that I'm using a non-english version of the IDE and a non-english version of Vista 32-Bit (something similar to what it's commented here: see section 1.2.2), but I cannot set the "International Settings" to "English" since, in my case, everything is in Spanish.

So, what to do? After locating the "SpaceWar" Stater Kit template file, I found that both, PC and 360 versions, where installed under a folder named "XNA Game Studio 2.0".

So, I created a new folder under ".../ProjectsTemplates/Visual C#", then renamed it to "XNA Game Studio 2.0", finally moved the "Net Rumble" template file to that folder, and presto!

Cheers!

GOT IT!

I've finally downloaded and properly installed XNA GS 2.0. Yeah!

Having done that, I've decided to redesign my XNA-based engine from scratch, and in turn, my "never-ending" entry for the first DBP contest.

Meaning? Things are going to change a lot around here.

Thus, from this year-end and on I'll be posting comments regarding the development of my engine and games, showing pictures and so on (of course, eventually, I'll be also commenting on news -published by other sources- as well as doing some off-topic posts ... not on a regular basis but as exceptions).

My goal: to finish an entry for the main DBP compo.

Therefore, for news regarding XNA, pay a visit -as usual- to Ziggyware (you know it: an excellent site to get news, articles, tutorials, code snippets, watch videos and such).

Well, guys, I'll be blogging again soon.

Cheers!
Pete

[Now, if only I could find my old code ... ;) ]

Thursday, July 19, 2007

HELLO WORLD!

After many weeks of being unplugged I have "almost" returned to the XNA community. As you can imagine from my previous post, I have been very busy lately.

Having moved to my new home now -which has been and still is experiencing an extreme make over (I mean it, all over)- getting my new DSL connection from the local ISP (finally) and fighting with my main desktop computer -meaning, my 64bit processor has passed away, sigh!-, I have managed to get online once again and join you guys in the excitement of knowing in the following weeks who will be chosen for the final round to win the DBP contest.

By now, I'm using my wife's computer to check the news, so don't expect too many posts until I get a new processor.

Anyway, so much to read, new content, v2 coming out these holidays, so let's start.

BTW, thanks to all of you who congratulated me for getting married either by posting a comment on this blog a/o sending me a private message to my email address ... ;)

Now, back to my ultracave ... Pete's out ...

Monday, May 21, 2007

I'M GETTING MARRIED IN THE MORNING ...

... as the song goes ... well, actually, not tomorrow but this Friday 25th.

Yeap! After many years of being the last man standing, the ultraplayer, the ultrabachelor, ... or at least in my dreams ... my fiancee Andrea and I have decided to say "yes, I do". The big step ...

Thus, as you may suppose I -in fact we both- have been (and still are) dealing with all the details of the wedding day, party, honey moon these days -plus a "extreme make over" of my near future home- so that's why I may have seemed a bit "distant" to the self-proclaimed task of reporting XNA-related news. Sorry about that, but you know, I've been really busy ... real life ... responsibilities ...

So what does this mean for my blog? Only that I'll be out for the next 4 or 5 weeks, so in the meantime, until I come back, don't worry 'cause you can count on Mykres and Ziggy.

Thanks guys for supporting this site and see you all when I get back. I need some vacation ...

BTW, I cannot go without giving some breaking news: we're all aware of the already released (Benny's) and 3 upcoming books on XNA (check Ziggy's site), but there are two new books to add to that latter list:

Ok, guys, see ya.

Pete's out!

Wednesday, May 16, 2007

XNB-VIEWER ... WHAT IS IT?

Shane Lynch has released the first version of XNB-Viewer, a handy application that lets you preview an XNB model with a double-click of your mouse.

From the post: "... You can either drag and drop your XNB model files onto the exe or associate your XNB files with this EXE. Later version of this viewer will support for textures, shaders and other content types ...".

Enjoy!

Tuesday, May 15, 2007

"DAVE WELLER FROM MICROSOFT"

Want to listen to what Dave has to say? Then listen to this podcast.

From the podcast: "... um ..."

Cheers!

SOME PROBLEMS WITH MY DESKTOP

Yes, my desktop went no-no last weekend, ... again. Since I have no yet found a restoring system that works well on a WinXP Pro x64 OS -I mean a complete one, not the application that comes packed with the OS, I'm manually reinstalling almost everything, or at least the things that I need most.

Well, other than that, sorry for being late with the news post.

One good note: along with other books, I've receive Benny's. So I will start reading it as soon as I can and maybe post a full review (why not?).

Cheers!

Friday, May 11, 2007

BEWARE WHERE YOU INVEST YOUR MONEY

This has nothing to do with XNA, game programming, comic books, nor animation, so its miscellaneous stuff. However, I believe is an interesting read for those who plan to invest their money on capital markets, in particular, in penny stocks.

Kiplinger.com has published an article called "The Truth Behind Penny Stock Spam". What's relevant about the article? That it shows the awful truth behind easy money.

In short, I guess you already knew it but if you want to invest money in capital markets, don't let yourself being attracted by spammers, or companies which you barely know or don't know at all.

Always try to analyze the fundamentals of the prospect companies by yourself (in case the proper info is available), read serious analysts' assessments, study the track record of the company, what it offers, if its a known company or not, who are its directors/owners, where it is located, since when, and so on. Otherwise, you face the risk of losing your money in the split of a second!

I'm not saying that you must play always safe, because as you may know the greater the risk the greater the potential reward ... or losses ... but if you want/need to get some "quick" profit just play smartly and the safest as possible, as I assume you do with any other type of investment, in order to avoid the risk of hugh losses because you actually invested in a "ghost" company.

Take the company mentioned in Kiplinger's article, for instance, if you analyze the quote charts, you'll see that it opened in more than USD 7.oo/share when it was first traded in the penny market and then it just followed a slow downward and almost steady path to the current value of USD 0.04 a share. And yes, you're reading right. From riches to rigs ...

Spooky!