Put your message here! Contact me for more information
 
 







 

Archive for April, 2008


 

Based on an article on detection connection speed using JavaScript, I implemented a more completed speed detection solution which you can drop into your project with minimal fuss. An example would be to detect the user’s connection speed to show either high or low bandwidth version of the website. All the ingredients you need are an image, a small JavaScript snippet, and some imagination. There is no dependency and no other 3rd party library needed.

The main idea is that we load an image programmatically and measure the time it takes the browser to load such an file. Once an image is done loading, the browser will fire the onLoad event and we can capture the end time. I included two different versions of the code. The first one is quite simple with the image being loaded only once. The second one is more sophisticated, loading the image multiple times and taking the average loading time to arrive at a more accurate answer.

The key technique being used here are closure and passing functions as arguments. These two techniques are very commonly used in modern JavaScript frameworks such as Prototype, Scriptaculous, jQuery, Ext, YUI, etc.

In order for this technique to work, we need to have an image with an average size. Too small of an image won’t give us a very good result while too big of an image will cause more lags and affect the user’s experience. For your convenience, I included the a JPG image around 58.5KB in size as our testing image. We will need the exact size of the image in Bytes in order to calculate the bitrates or byte-rates.

Simple Javascript Speed Detection
Insert this code snippet into the page where you want to conduct the speed test

var SpeedTest = function() {
  /*
  From:  http://techallica.com/kilo-bytes-per-second-vs-kilo-bits-per-second-kbps-vs-kbps/
  256 kbps            31.3 KBps
  384 kbps            46.9 KBps
  512 kbps            62.5 KBps
  768 kbps            93.8 KBps
  1 mbps ~ 1000kbps   122.1 KBps
  */
};
SpeedTest.prototype = {
  imgUrl: "speedtest.jpg"    // Where the image is located at
  ,size: 59917                // bytes
  ,run: function( options ) {

    if( options && options.onStart )
      options.onStart();

    var imgUrl = this.imgUrl + "?r=" + Math.random();
    this.startTime = (new Date()).getTime() ;

    var testImage = new Image();
    var me = this;
    testImage.onload = function() {
      me.endTime = (new Date()).getTime();
      me.runTime = me.endTime - me.startTime;

      if( options && options.onEnd )
        options.onEnd( me.getResults() );
    };
    testImage.src = imgUrl;
  }

  ,getResults: function() {
    if( !this.runTime )
      return null;

    return {
      runTime: this.runTime
      ,Kbps: ( this.size * 8 / 1024 / ( this.runTime / 1000 ) )
      ,KBps: ( this.size / 1024 / ( this.runTime / 1000 ) )
    };
  }
}

First, we need to specify where we would load the image from (in this case, the relative path to the page) and the exact size of that image in Kilobytes. Since we don’t want the browser to cache the image, which short-circuits our test, we append a random number to the original image’s url (line 19). Before we run the test, we check to see if we need to run the onStart() functions being passed in. The idea is that you can show on the page with some messages or pop-up to notify about the test is about to run, simply by passing in an inline function.

The crux of the detection is from line 23 to line 30. If you are new to JavaScript or you are not comfortable with Closure, you should investigate a bit more since Closure is a critical and extremely powerful part of Object-Oriented JavaScript. In its simplest form of explanation, Closure means an anonymous function from a different execution context can gain access to another function’s internal properties.

In this case, after downloading the image, the browser fires the image’s onLoad event at a later time in a different execution context (the context of the current browser) other than context of our SpeedTest object. Without a closure reference via the variable “me” (line 23), which holds the reference to the SpeedTest object, we can no longer access to the startTime and endTime properties of the current SpeedTest object.

Now to run the test and obtain the results, all you have to do is to initialize a new SpeedTest object, execute the run() method, and pass in your custom actions. Currently 2 custom events onStart() and onEnd() are supported:

var st = new SpeedTest();
st.run({
  onStart: function() {
    alert('Before Running Speed Test');
  }

  ,onEnd: function(speed) {
    alert( 'Speed test complete:  ' + speed.Kbps + ' Kbps');
    // put your logic here
    if( speed.Kbps < 200 )
    {
      alert('Your connection is too slow');
    }
  }
});

The Multi-trial speed test

As with any kind of measurements, one single measure is subjected to certain errors and inaccuracy. In our case, the degree of inaccuracy is much higher since connection speed fluctuates constantly. Other factors would affect the single-pass test is the initial DNS look-up speed and overhead, temporal network latency, slow browser, etc. Hence we can further improve our answers by taking multiple tests and average the results to get a more accurate number.

Below is a more sophisticated speed-detection code, which we can specify how many times the test is run. Typically 3 runs is good enough and it will not impact on the user’s experience.

var SpeedTest = function() {
  /*
  From:  http://techallica.com/kilo-bytes-per-second-vs-kilo-bits-per-second-kbps-vs-kbps/
  256 kbps            31.3 KBps
  384 kbps            46.9 KBps
  512 kbps            62.5 KBps
  768 kbps            93.8 KBps
  1 mbps ~ 1000kbps   122.1 KBps
  */
};
SpeedTest.prototype = {
  runCount: 3                 // how many times we want to run the test for
  ,imgUrl: "speedtest.jpg"    // Where the image is located at
  ,size: 59917                // bytes
  ,run: function( options ) {
    this.results = []; // reset the results
    this.callback = ( options && options.onEnd ) ? options.onEnd : null;
    this.runTrial(0, options);
  }

  ,runTrial: function(i, options ) {
    var imgUrl = this.imgUrl + "?r=" + Math.random();
    var me = this;
    var testImage = new Image();
    testImage.onload = function() {
      me.results[i].endTime = ( new Date() ).getTime();
      me.results[i].runTime = me.results[i].endTime - me.results[i].startTime;

      if ( i < me.runCount - 1 )
        me.runTrial( i + 1 ); // run the next trial
      else
      {
        // Execute the callback
        if( me.callback )
          me.callback( me.getResults() );
      }
    };
    this.results[i] = { startTime: ( new Date() ).getTime() };
    testImage.src = imgUrl;
  }

  ,getResults: function() {
    var totalRunTime = 0;
    for( var i = 0; i < this.runCount; i++ )
    {
      if( !this.results || !this.results[i].endTime )
        return null; // exit if we found no endTime.  --> test’s not done yet
      else
        totalRunTime += this.results[i].runTime;
    }

    var avgRunTime = totalRunTime / this.runCount;

    return {
      avgRunTime: avgRunTime
      ,Kbps: ( this.size * 8 / 1024 / ( avgRunTime / 1000 ) )
      ,KBps: ( this.size / 1024 / ( avgRunTime / 1000 ) )
    };
  }
}

Even though our test method has changed, you can still use the same exact code as above to run the speed-test. The answer will be much more accurate this time. Basically we run multiple trials back-to-back, each time measuring the runtime and store it into an array, then average and get the final result.

Another small difference is that we have to store the reference to the user’s custom onEnd() method as a property of the SpeedTest object so that at the end of the test, we can execute it and return the answer to the user.

Final words

I hope you enjoy this article and make good use of the code. I packaged the 2 versions and the image into a zip file so just go ahead and have some fun. Go speed-racer!

Download

view comments
 

This year, Startup School 2008 again had some excellent speakers. I enjoyed it as much as I did for last year. I came in late for about an hour but I hope I did not miss much. I also bumped to a few old faces from last year as well.

Paul Graham is charismatic and funny with his advices as always. He gave a revised speech (a bit different from the one from last year) about the usual topic: “how to start a start up”. A good analogy for his advices is the relationship between the founders and the investors (VC) is similar to a relationship between girls and boys. If you show that you can live without money (or love) and generally be okay on your own financially (or emotionally) then more people would be interested in you (either fund you the money, or trying to get a date with you). A strong start-up with an action plan and a profitable potential will more likely to spark more interests from the VC than one needs the cash infusion to struggle along.

Paul paused, then brought up the next slide:

“A startup needs to be like a roach”

This clicked me. Personally I’m not afraid of any insects or reptiles, but I disgust roaches. Can’t stand them and just imagine how they would crawl up my legs makes me want to find a shotgun and smoke their tiny brown ass. Nonetheless, a startup should have a roach as a hero to look up to for its survivability, adaptation, and persistence. For millions of years, the cockroaches still survive just fine while the almighty dinosaurs went belly up, fossilized, and became the crude oil we got addicted to more than cracks. A startup needs to change when the weather changes, needs to survive from the fierce competitions or the VC’s liquidation, and be persevered to keep going when the odds are all against you.

In his book, “How to get Rich“, Felix Dennis (SOLE owner of Maxim and tons of other magazine) wrote about the idea of acting small and think big (not the other way around). A startup must keep coming even when facing failures is not even an option but a reality and knows how to act small and determined to come back to take a piece of that pie and steal more of the market-share. Personally, after watching a roach running for its life so many times, fleeing away from my smoking shotgun, I should know better how a roach would zig when I’m about to zag it. It would predict my next blow, running as fast as it could on all its got (6 tiny legs and a pair of paper-wings). No matter how much I tried to kill them, they still get away, and come back with more roach-warriors the next day. Acting like a cockroach will definitely help in dire situations when one is starting a startup. We usually learn the best lesson and experience from Mother Nature. Well-done, Paul, and it is hilarious too.

Another old speaker from last year, Greg McAdoo from Sequoia talked about the VC industry and how Sequoia love to work with Startups. Since I am not much interested in getting funded from VC (more of this later), I only listened to him with half the attention. Nonetheless, he is a really good speaker with lots of advices. His observation: the successful entrepreneur needs to have the skills to identify the trend and ride it to where it is heading to. Don’t fight the trend but leverage it to supercharge ahead. Isn’t that what people call “chances” and “luck”? Greg ended his speech with an impressive video, showing this one guy rode the biggest wave I have ever seen:

As much as Greg McAdoo pushes how the VCs are interested in working with little startups, my most favorite speaker of the entire program, (drum rolls…) David Heinemeier Hansson (DHH) dissed the whole general startup mentality, i.e. build something, raise VC’s money , go big, and hope for an exit (or just die in flames). DHH is truely a business man in how he approaches the subject of startup. He knows his goal (making ENOUGH money to enjoy life) and hits the bullseye with his skills (RoR is just amazing - I’m so thankful for his release of RoR to the open-source community and how he has helped me get to my dream).

DHH:

  • Focus on the customers
  • Build something good that you can have the customers hand over their card numbers
  • Going through VC is NOT the only way to make a profit for startups
  • Everybody is a winner in the market if they can grab the customers. The internet is HUGE
  • Instead of technology makes the business profitable, it is the well executed business with the correct technology which will be the cash-cow.
  • Work less hours: 12 hours of work is not necessarily as productive as a good solid 3 or 4 hours of focused, zoned-in development.
  • Shift the mentality of building a tech startup to building a self-sustainable and profitable business
  • Customers can either consumers (harder to get money from) to the Fortune:5,000,000 (easier to get money from, provided that the application is solving a business problem)

As I just wrote, the idea of raising money for my startup never stuck in my mind for long. I’m in this game to build businesses that MAKE money. What DHH said did truly touch me. I want my business card to say “Alex Le - Owner”, not just “Alex Le - so and so of this business”. I want to trade my sweat equity for ownership. With RoR and a little imagination, the road to success has never been as accessible. The real question is that do I really have the guts and perseverance walk down that path. in the future, I may change my mind about raising money from the VC, but it’s only when I know that I can use this money to rocket the business, and only when I am financially independent through my own businesses. More specifically, when I don’t need VC’s money then that is when I want to raise more from them. Why? I can run the business my way if I have the choice to say NO anytime I want to.

I can’t help but post this photo:

Yup, DHH and me. I got a chance to talk to him when the lunch break started. A group of other people gathered around DHH and asked him questions about running an online business. DHH really shines as a extremely smart guy (he is!) and business-savvy. I took a video with my camera for almost of the DHH-group interview but the file is rather big (1.04GB!) so I’ll post it on YouTube later. You’ll probably get a lot of kicks and nuggets of wisdoms from the side-walk talk with DHH. The end result: no more pizza when I came out and I was starving for the rest of the day. But between pizza and the opportunity to talk to DHH? You tell me.

DHH is simply awesome and to see him shot down what Greg McAdoo had just said is equally interesting. DHH has the most credibility and right to say what he said because he has singlehandedly changed the startup/IT industry and happens to get rich along the way. The most important thing is: he is totally right.

However, I am a bit disappointed with Paul Buchheit’s speech this year. He delivered an un-energetic, monotonous talk with a somewhat sparse slide. The big theme for his presentation was to listen to people’s needs, build what they want, but don’t “obey” (the hello-kitty slide was rather cute) all their requests. The talk was stretched into 15 minutes and occasionally got some laughs from the audience. Probably the people already know Paul so they laughed to show him some support. Maybe I set my bar too high after hearing DHH’s speech, but seriously, Paul’s last year speech was a lot more inspirational and energetic than this.

Don’t get me wrong, I enjoyed the contents and message of his talk, but have criticism over the way he delivered it. Don’t shoot the messenger, that’s what people say. However, in this case I think the messenger a bit sloppy in the preparation. Probably Paul had been up late working on FriendFeed the night before.

After the lunch break was Jeff Bezos, CEO of Amazon. From his talk and the way he responded to the questions from the audience, I believe that he is genuinely a nice and humble person. From his vision and actions, he is a man of conviction and strong beliefs in what he does. Amazon Web Service reflects that and I did write a post praising him back in 2006, even before Amazon ’s stock rallied up when people realized the true potentials of the company.

Jeff was promoting and evangelizing AWS, EC2 in particular. He did so rightly because he is more than happy to see more startups using AWS as the underlining infrastructure. As I mentioned in my 2006 post,

Amazon is building the new web economy and they are collecting tax already.

I totally agree with Jeff’s response to a question regarding the competition about Google Engine: the market is huge and everybody wins, i.e. it is not a zero-sum game but everybody benefits as the adoption grows and more and more values are being created everyday.

For the technical questions, Jeff handed to an engineer from Amazon (just wished the engineer was given a microphone so the poor guy did not have to scream his heart out in a 600+ person hall). Nonetheless, I’m so glad to see Mr. Bezos took the time to give a speech at Startup School this year. And I can’t help but to post this …

Hey … he’s the man, I don’t think I can allow myself to miss the chance to take a picture with him. Are you kidding me?

Next was Marc Andreessen. It was a QA session with the host lady and was informative. Marc is a passionate person and I could really see his passion for the web when he talked. I will definitely check out his blog more often.

Last but not least, Peter Norvig, the Director of Research from Google, a guy with intimidating white hair that makes me feel so young, little, and reckless, gave his speech on some data mining techniques. He showed some interesting clustering results from algorithms that Google is employing to enhance the Image Search quality. The example he used was a search for Mona Lisa (with safe search on, he stressed). To come back with good and relevant results, Google look at the contexts of the images (surrounding words, image tags, DOM structures, etc.), then from this result set, they establish the common features of the pictures (main structures, shapes, etc.) and establish clusters of “connected” images by comparing each photos with one another. The end results are clusters of images, with the center images being the most relevant to the search query and the outer ones are still related but with a much lesser degree. Another interesting example was a search for Abraham Lincoln: the algorithms generated 3 clusters for the results: 2 for the indoor statue, and one for the outside building. Seeing the Director of Research from Google giving a presentation on his work is pretty inspiring, considering that Google is spending only(!) $2.1bn in 2007.

A guy , self-proclaimed as the “evangelist” for semantic web (now that was arrogant), asked about Google’s interest in pushing for semantic web. Norvig responded (indirectly) that with the vast amount of text data from the web (50% more spam than ham?), it is already possible to run data mining techniques and algorithms to achieve good results. I think this is true. Analyzing the DOM trees, structures, and other aspects of the vast number of websites out there, one can establish a good working knowledge for relationship between the words and can potentially solve interesting problems already. Semantic web will be helpful, but it won’t be a make-or-break feature of the web, as Norvig answered wittily “Semantic Web is the future of the web, and always will be.”

This is my mini-coverage for the 2008 Startup School. I think I’ll wrap up some other stuff before heading to bed (Note to self: It’s been a long but awesome day already and I’m flying back to Chicago tomorrow afternoon so getting some rest now would be useful :).

A quick photo of me taken with Justin (from Justin TV), Trip (CEO of Scribd), and Wu (I bumped into her at last year Startup School while finding my way to the Kresge Hall)

Other web-coverages:

view comments
 

I was implementing an Ajax feature for a project and felt the need to display messages (progressing, savings prompt, etc.) to the users visibly and unobtrusively. Usually, to indicate a background activity, I tend to hide the link/button/checkbox and show a spinning indicator when the Ajax request was created, then return the link when the request has completed. In this case, there is no user-controllable submit button. It is a photo album page which allows users to rearrange their photos by simply dragging-and-dropping the photos into the correct positions. The positions are saved automatically on the fly. If I am to implement a typical spinning indicator, I have to make sure that it is visible enough for the user to know that the positions are being saved. However, if the user is at mid-page, any indicator at the top section of the page won’t be visible. If I place the indicator at the bottom of the page, I still run into the same situation. My solution is to implement a smart “Prompt” bar that stays affixed to the screen. With Prototype and Scriptaculous, implementation is a breeze.

Show, don’t just tell
Here is a demo which you can try out.

Details
This is made possible by using the “position:fixed” feature of CSS. According to W3Schools,

position: fixed
An element with position: fixed is positioned at the specified coordinates relative to the browser window. The element’s position is specified with the “left”, “top”, “right”, and “bottom” properties. The element remains at that position regardless of scrolling. Works in IE7 (strict mode)

The markup
Here is the HTML for the prompt bar. You can place this HTML anywhere in the page. Ideally it should be outside any container.

Some Prompt Here
Cross

CSS

#prompt
{ position: fixed; width: 400px; height: 20px; border: 1px solid #7F7F7F;z-index: 9999; background-color: #F3FF8F; }

#prompt_message
{ float: left; text-align: center; width: 380px; font-weight: bold;}
#prompt_close
{ float: right; width:16px;}

We have to set the prompt bar’s position to be fixed so that it will stay in place when we scroll the browser window.

The script
The javascript code is fairly simple, since Prototype and Scriptaculous already do the all the heavy lifting (e.g. positioning, animation). The only catch with position:fixed div is that we cannot center the prompt div using CSS. We have to explicitly set the left coordinate before we display the bar (line 16, _center() method). This is to also useful when the user resizes the browser window, we recalculate the position and center the div accordingly.

    var Prompt = {
      autoHideTime: 5000

      ,display: function( msg, options ) {
        $('prompt_message').innerHTML = msg;
        Prompt.show();
        if( options && options.autoHide )
          setTimeout('Prompt.hide()', options.autoHideTime || Prompt.autoHideTime );
      }

      ,working: function(msg, options) {
        msg = '  ’ + msg;
        Prompt.display( msg, options );
      }

      , _center: function(){
        $(’prompt’).style.left = ( ( document.viewport.getWidth() - parseInt( $(’prompt’).offsetWidth ) ) / 2 ) + ‘px’ ;
      }

      ,show: function(){
        Prompt._center();
        new Effect.Move ($(’prompt’),{ x: parseInt( $(’prompt’).style.left ), y: 0, mode: ‘absolute’, duration: 0.2 });
      }
      ,hide: function( msg) {
        new Effect.Move ($(’prompt’),{ x: parseInt( $(’prompt’).style.left ), y: -30, mode: ‘absolute’, duration: 0.1 });
      }
    }

Since the code is simple enough, I’d like to leave the details to you to work out.

Enjoy!

Download

I packaged the demo as a zip file so you can grab it and have some fun. Cheers!

view comments
 

Websites As Businesses

Running a website should be considered as running a business, albeit a unique kind of business that everything is virtual. The designs and implementation is no longer the most important part. Managing contents, marketing, SEO-ing, and monetizing become a lot more critical, especially if the site is within a niche and crowded markets. Google is now rising to be the big G of the web: getting “Google-slapped” means dropping number of ads clicks and losing revenues from advertisements.

How profitable is a website?

Very and varied. When a site reaches a certain “critical mass” in terms of visitors, page views, Google page rank, it can pull in at least a couple hundred dollars a month. Smaller content-based sites (such as my website) can pull in a couple bucks to $10, $20 a month. On the other hand, there is a few blogs that pull in $1,500 to $2,000 dollars on average a month from advertisements. Other more successful blogs pull in $20,000 to $30,000 a month. John Chow’s personal blog is a notable one as the mastermind behind it publicly posts the monthly income on his website (that is also one of his marketing/PR techniques too).  Mega site MySpace’s revenue is up in the hundred of millions and a writer from Forbes estimated the 1B number.

True story:  a friend of mine is running a non-for-profit search page (www.searchkindly.org) that collects advertisement money and donate to charities.  He was able to raise $817.25 for March alone.  It is quite amazing to look at his “proof of giving” page.

With that kind of revenue, running a website as a business is much more profitable than any other kinds of investing, including real estates. The downside is that it takes a certain kind of people to run such a virtual business since there is no schools, no classes, no books to teach you about making a living off the internet. There are e-books being sold all the time with the promise of teaching you how to “make $5,000 a month from home in your pajamas using your laptop “, but I highly doubt the contents and techniques from such sources. There are certain things you can pick up and learn as you go. Making a money off the web is certainly one of them.

If you talk to people around you about making money online, most people will look at you with puzzled eyes. They probably won’t be able to grasp the concept of how a banner and some text links can generate such money. Alchemy they think. But as the internet become more and more crowded, the site that can generate leads and capture visitors attention will certainly win the breads.

Where should one start?

The easiest way is to start a blog and start writing about your favorite hobbies and ideas.  I love web technologies, I love coding, I love making money so this is the theme of my blog.  Your interests is different than mine, but it is something unique and better yet, you can start making money off it right away.  John Chow’s advice is to write not about money but what you love. He is making money doing exactly just that.

If you can program a web application then it is even better way to make money through both advertising and subscriptions.  However, the efforts will be significant higher.  Trust me.  It still hurts me every time I think about all the failed ideas, postponed projects that I worked on over the years.  Motivation and PERSEVERANCE is the biggest key to success.

The risks associated with such an endeavor is also mountain-high if you financially invest in it.  The risks get even worse if you don’t have the technical background and hire developers to implement your ideas.  The cost of developing an application is not cheap, at all.  You will get conned, get ripped, get sold on compromises, and delayed deadlines.  Your dream idea can become a nightmare, both emotionally and financially.  If you are not tech-savvy, then don’t start a web project until you find the right team and the right technical person to relate to.  Otherwise your loss is guaranteed. Speaking from my own personal experience, the best way to start a small web application is to have a team of 3 people:  1 designer, 1 lead developer/ thinker, and 1 co-programmer.  At an average rate of $50/hour per person, the numbers adds up quickly.

Can anyone make money off the web?

Yes.  You have to pick a point where you want to start.  Visiting lots of other sites with proven revenues to get ideas.  Experimenting with your site to generate more ideas and use that as the launch pad for other stream of revenues.

In the coming months, I will share more of my experience of making money online so definitely it will be more interesting.

view comments
 

I’ve been doing quite a bit of reading lately.  I read a lot of blogs and somehow I get clicked with a few personal finance blogs which I discovered from the personal finance section in alltop.  My favorite ones are 7Million7Years, MillionaireMommyNextDoor, Brip Blap (funny name, try to say it fast), IWillTeachYouToBeRich.  There are lots of gems from these sites and I’m glad that I can learn from their mistakes and how they work their way to be “rich”.

In terms of monetary gain, how much have I earned from these blogs?  A lot.  AJC from 7M7Y talks about the “magic number” and how to balance life and money.  This alone worths at least 2 million dollars to find out (that’s my magic number).  Millionaire Mommy blogs about how to take advantage of the market and investing in real estates.  This can worth at least a couple thousand dollars.  Meanwhile, Brip Blap wrote about his journey of losing 100lbs and building wealth, at the same times giving out free tips to increase salary to 6-figures.  Ramit from IWTU2BRich wrote an excellent post on the barriers, or the thoughts/actions inertia.  Suddenly I remember the wise words of Professor Orogun:  “People always find ways to fail, while I find ways to succeed.”

Success or failure, It is all in the mind.

The lowest level of success is money,  but it is usually the hardest one to achieve (you’ll find a lot more poor poets than rich poets, a lot more musicians than rich musicians, hence a far more many people than “rich” people).  The common theme running across the personal finance blogosphere is living frugal below your means, not getting into bad debts, investing smartly, and finally starting a business to generate passive income.  Get busy and get rich.  If you are not busy producing, then you are busy spending.  Brip Blap hit the nail on this one regarding saving more or earning more (ideally both should be done at the same time).

Instead of spending time to experiment with different investing tools, I can read directly from these excellent individuals’ experience.  Maybe I won’t start or get into the same business, but the ideas and the thoughts being provoked are equally important.  Instead of working for money, I am working towards my own number so that one day, I can have money worked for me.  Instead of sitting on my butt and think about what I should be doing, I am busy working ideas and projects.  It is like I am having a new mentality.  The transformation is great.

I am excited to see where I would head to in the future.  I cannot foretell, but I know what I have to do.  In the mean time, I’ll be a regular reader at the PF section at Alltop.  See you there.

view comments