YooStar – the next Wii?

8 01 2009

[UPDATE] Somebody just posted the CES opening video clip on Youtube. I have embedded it at the end of this post for your convenience.

This is absolutely amazing. YooStar just made its debut @ CES today. Personally, I think YooStar could be the next Wii and many families will soon have the YS systems in their living rooms and/or bedrooms and grandparents will buy these for their grandchildren as birthday gifts.

What is YooStar? If you are familiar with the concept of “Karaoke”, you can think of YooStar as “movie-oke”.

With Yoostar, you can insert yourself into famous movie clips with minimal efforts, right in your living-room. From what I have read on the site, the package comes with a (video) camera, a green screen, and software which you can install on your PC or MAC. You can pick which role you want to perform in which movie, the camera will record your performance against the green screen, then the software will insert you into the movie clip and even upload it to a website for you to share with your friends. Check out the keynote speech video (starring the CEO of CES) here. More about the price and details here.

The concept is simple and fascinating, isn’t it? I think so. But does it mean the product will be a guaranteed success? Hard to say before we look at it more closely. Similar products had come and gone before. The video creation station got lots of attention at first but you just don’t hear about it any more. I think whether Yoostar will be a success depends on the following:

[+] If the system actually works. We haven’t seen the real product yet, so we don’t know if the hardware and the software works yet. In my opinion, it doesn’t need to be as sleek as iPhone, but it needs to be (close to) as easy as AIM. Compatibility with different OS-es and platforms is also key.

[+] PR and advertising efforts. Since they are already out @ CES, I have no worries here.

[+] Selection of movie clips. Users need to have easy access to almost all the movies just like how iTunes is offering all the songs. This will assure the system is actually interesting to everybody, at all ages.

[+] Social media aspect. The site where the users can share their performances needs to be a YouTube plus some features of Facebook. I imagine users will continue using the product only when they start acting competition among family and friends. Again, this is still unknown to me.

As I am writing, YooStar is getting a lot of attention from the press. If everything works out, we’ll be seeing the system for sale in BestBuy in 3 to 4 months. I cannot wait.





What I was working on – My Magic Circle

5 01 2009

Happy New Year. (better late than never.)

I had been working on http://my-magic-circle.com during the last weeks of 2008. It is a funny video generator. User can join the Magic Circle by uploading their own pictures. The target audience is Harlem Globetrotters’ fans and non-fans really. Below is a sample Magic Circle video. We have been seeing pretty good conversion rates on Google Analytics since the launch of the site. 🙂 Check it out and create your own if you like.





How to use Flash component (SWC) in Flex (3)

10 11 2008

It is fairly easy to import Flash components into Flex projects. The trick is to include the SWC in the Flex project library path. Step-by-step instructions are as following and also illustrated in the screenshot.

[+] In Flex (3), just select the Actionscript project you need to use the Flash SWC in and edit its properties.

[+] Select ActionScript Build Path and then the Library path tab.

[+] Click on the button that says Add SWC.

Refer to the screenshot here. (I am on a MAC, the path to your SWC might be a little different.)

Enjoy.





source – Countdown display including year and month information(AS2)

7 11 2008

Per requested, below is a screenshot of the sample .fla file showing how to use the CountDown class. (I wish we could attach zip files to wordpress blogs. Oh well.)

sample fla file of CountDown class

sample fla file of CountDown class

Basically I have only one MovieClip on the stage, with an instance name “display”. Make sure this MovieClip’s linkage links to the Class “CountDownDisplay”, which can be found in my previous post. In the actionscript layer, I have a line of code as the following:

display.init( 2012,2,28,0,0,0,0,0, 100);

You are welcome to attach the MovieClip with code instead of placing it on stage directly. Actually that is recommended b/c you can get rid of it later by using the following line of code then the removeMovieClip method:

display.kill();

For the complete class files, see the previous post.





Comparison of online marketing methods

31 07 2008

We are trying to start a campaign to generate lead for a particular client. The goal is to either get new users to download their application or to get existing users to use their application more. After some discussions, I made a diagram to compare 5 key factors of 4 online marketing methods: social media widget, AIR application, banners, and text alert.

comparison online marketing methods

comparison online marketing methods





example: Countdown display including year and month information(AS2)

17 07 2008

[UPDATE] I have uploaded a screenshot of a sample source file for your reference. Please check it out. 🙂 Thanks for the comments.

Very few code examples I could find online have included the number of years and months in them. So I thought I’d come up with my own. It is currently in AS2, leave a comment if you need an AS3 version.

[+] DateUtils class. The function getCountDown takes 2 Date objects and returns a generic object which includes the number of years, months, days, hours, minutes, seconds and milliseconds of the time that is spent to get to the end Date from the start Date. See below.

class DateUtils {
	private static var NUM_MSEC_IN_SECOND:Number = 1000;
	private static var NUM_SEC_IN_MINUTE:Number = 60;
	private static var NUM_MIN_IN_HOUR:Number = 60;
	private static var NUM_HOUR_IN_DAY:Number = 24;
	private static var NUM_MON_IN_YEAR:Number = 12;
	private static var NUM_OF_UNITS:Number = 7; // year, month, day, hours, minutes, seconds, millisesconds

	public static function getCountDown(start:Date,end:Date):Object {
		//trace ("DateUtils, getCountDown of start date:" + start+", end date:"+end);
		if (start == undefined || start == null) start = new Date();
		if (end == undefined || end == null) end = new Date();

		//if the end date is no later than start date, return 0s as results.
		if (end.getTime() - start.getTime()<=0)  return {year:0,month:0,day:0,hour:0,minute:0,second:0,millisecond:0};

		//if the end date is later than start date, continue to do the calculation
		var eY:Number = end.getFullYear();
		var eMon:Number = end.getMonth();
		//
		var start_ary:Array = &#91;start.getMilliseconds(),start.getSeconds(),start.getMinutes(),start.getHours(),start.getDate(),start.getMonth(),start.getFullYear()&#93;;
		var end_ary:Array = &#91;end.getMilliseconds(),end.getSeconds(),end.getMinutes(),end.getHours(),end.getDate(),end.getMonth(),end.getFullYear()&#93;;
		var period_ary:Array = new Array();
		var convsRate_ary:Array = &#91;NUM_MSEC_IN_SECOND,NUM_SEC_IN_MINUTE,NUM_MIN_IN_HOUR,NUM_HOUR_IN_DAY,NaN,NUM_MON_IN_YEAR,0&#93;

		for (var i:Number=0; i<NUM_OF_UNITS; i++)
		{
			period_ary&#91;i&#93;=end_ary&#91;i&#93;-start_ary&#91;i&#93;;
		}
		for (var i:Number=0; i<NUM_OF_UNITS; i++)
		{
			if (period_ary&#91;i&#93;<0)
			{
				period_ary&#91;i+1&#93; -= 1;
				if (convsRate_ary&#91;i&#93; == NaN) convsRate_ary&#91;i&#93; = (eMon>0)?getNumDaysInMonth(eY,eMon-1):getNumDaysInMonth(eY-1,eMon-1+NUM_MON_IN_YEAR);
				period_ary[i] += convsRate_ary[i];
			}
		}
		return {year:period_ary[6],month:period_ary[5],day:period_ary[4],hour:period_ary[3],minute:period_ary[2],second:period_ary[1],millisecond:period_ary[0]}
	}

	public static function getNumDaysInMonth(year:Number,month:Number):Number
	{
		if (month<0 || month>=NUM_MON_IN_YEAR) return 0;
		var firstDayInThisMonth:Date = new Date(year,month,1);
		var firstDayInNextMonth:Date = (month<NUM_MON_IN_YEAR-1) ? new Date(year,month+1,1) : new Date(year+1,month+1-NUM_MON_IN_YEAR,1);
		var numDays:Number = (firstDayInNextMonth.getTime() - firstDayInThisMonth.getTime()) / NUM_MSEC_IN_SECOND / NUM_SEC_IN_MINUTE / NUM_MIN_IN_HOUR / NUM_HOUR_IN_DAY;
		return Math.floor(numDays);
	}
}
&#91;/sourcecode&#93;

&#91;+&#93; CountDownDisplay class. It extends MovieClip and has a TextField on its timeline, with the instance name "txt". The function <em>init</em> takes a target <strong>Date</strong> object to count down (from today) to, and the frequency (in milliseconds) to update the display. The function <em>kill</em> clears the interval.

import mx.utils.Delegate;

class CountDownDisplay extends MovieClip {
	public var txt:TextField;
	private var _intvl:Number;
	private var _frqc:Number;
	private var _tDate:Date;
	private static var DIVIDING_SYMBOL:String = ":";

	private function CountDownDisplay() {}
	public function init(targetDate:Date, frequency:Number):Void
	{
		_tDate = targetDate;
		_frqc = (frequency==0 || frequency==undefined)?100:frequency;
		//this.onEnterFrame = Delegate.create(this,update);
		_intvl = setInterval(Delegate.create(this,update),frequency);
	}
	public function kill():Void
	{
		if (_intvl != undefined) 		clearInterval(_intvl);
	}
	private function update():Void
	{
		clearInterval(_intvl);
		_intvl = undefined;
		var obj:Object = DateUtils.getCountDown(new Date(),_tDate);
		var y:String = obj.year.toString();
		var mon:String = obj.month.toString();
		var d:String = obj.day.toString();
		var h:String = obj.hour.toString();
		var m:String = obj.minute.toString();
		var s:String = obj.second.toString();
		var ms:String = (Math.floor((obj.millisecond) / 10)).toString();

		y = toTwoDigit(y);
		mon = toTwoDigit(mon);
		d = toTwoDigit(d);
		h = toTwoDigit(h);
		m = toTwoDigit(m);
		s = toTwoDigit(s);
		ms = toTwoDigit(ms);

		txt.text = y+DIVIDING_SYMBOL+mon+DIVIDING_SYMBOL+d+DIVIDING_SYMBOL+h+DIVIDING_SYMBOL+m+DIVIDING_SYMBOL+s+DIVIDING_SYMBOL+ms;
		updateAfterEvent();
		_intvl = setInterval(Delegate.create(this,update),_frqc);
	}

	private function toTwoDigit ( str:String ) : String
	{
		var new_str:String = str;
		switch (true)
		{
			case Boolean(str.length==0):
				new_str = "00";
				break;
			case Boolean(str.length==1):
				new_str = "0"+str;
				break;
			case Boolean(str.length>2):
				new_str = "**";
				break;
		}
		return new_str;
	}
}

There you go. I’d be happy to send you a .fla file as an example. Let me know please.





amazing art

10 07 2008

I hardly blinked during the seven minutes while the video was playing. Enjoy it.