Our thoughts in real time
January 27, 2011
vChatter Dials up Grio for Software Help
vChatter has selected Grio to help enhance its Internet audio-visual communication tools and platforms. These tools provide video-chat capabilities and other features to the public via Facebook and other social networks. vChatter is the largest video chat service on Facebook with over 2 Million users and over 25 Million calls established. It provides a fun, casual and comfortable environment to discover new people and develop meaningful relationships.
In this collaboration, Grio team will provide engineering expertise and support for custom software development, recommendations for software design and architecture improvement and optimization.
Posted at 05:22 PM in News | Permalink | Comments (0) | TrackBack (0)
December 20, 2010
Which is the best Enterprise CMS?
I'm am working on a project currently that is leveraging an Enterprise CMS. At the outset, I did an analysis of existing CMS systems to select the one that best fit our clients needs. That turned out to be Magnolia (www.magnolia-cms.com).
However, another one of our clients is using the Alfresco CMS for their business. I reviewed it over the weekend and was impressed by the slick and intuitive user interface. The creators of Alfresco come from Documentum and Interwoven.
Which is better? It's hard to tell at this point. While I am not terribly impressed with the way Magnolia handles the management of web content and content entry; defining content entry dialogs within the JCR repository, versus making this more code driven seems like a drawback for developers (however there are way to programmatically generate these items via the Magnolia Blossom Module).
Alfresco looks good on the surface, but I haven't actually tried to build out a system yet with this product. My initial evaluation indicates a good framework to build upon (Java/Spring/JSF) and a very clean user interface.
While I can't make a recommendation at the moment, I would suggest checking out these options if you are looking to implement an Enterprise CMS solution. MAgnolia is coming out with a 5.0 version soon, so perhaps that will push it over the top.
Posted at 03:30 PM in Java, Web/Tech | Permalink | Comments (0) | TrackBack (0)
August 17, 2010
Three OCR Software Vendors Compared
The vendors that I evaluated were as follows:
Pegasus Accusoft
Leadtools
ABBYY
All three of these vendors have huge software packages. I was impressed by the range of features their sales reps described. Demos worked like a charm. The sales teams were friendly and eager.
Unfortunately, problems arose as we delved down into the details. It seems that every vendor uses a set of cherry-picked forms to put on a good show, but if you commit to a format before picking a vendor, you could be in real trouble.
I started off with Leadtools. These guys have been in the business forever, so I expected great things from them. Unfortunately, I found that their software had serious problems when it came to page alignment with our forms. In addition, ICR barely worked (they use a third party engine which they do not control). In terms of client attention, support would take a couple days to get back to me on a regular basis, and in general it didn't seem like they had a thorough understanding of the software. It was always "I'll need to check with the engineers about that", which meant another two day delay. After a month (!) of back and forths it became apparent that we needed to look for a backup vendor.
In general, I was displeased with the Leadtools sample code, as well as with their API. The object structure was convoluted, the naming was incomprehensible, and the documentation was poor. The more I dug in, the more disappointed and frustrated I became.
While we were battling out the second month with Leadtools, we introduced two more vendors, Pegasus Accusoft and ABBYY. I didn't give Accusoft a lot of attention, to be honest. I found their API to be messy and ill-organized, probably even worse than the Leadtools code. ABBYY, by comparison, had great documentation, a clear, well-organized API, and a very responsive and helpful support staff.
The more I worked with ABBYY to get our problems ironed out, the more I was impressed with their company. I kid you not, these guys were basically writing code for me. Whenever their existing samples didn't cover a topic, they would prepare a special sample for my use (and for future customers with the same problem). Smart!
The ABBYY FineReader Engine 9.0 software fell short of in two places, but the support team was creative in coming up with solutions:
PROBLEM 1
Basically, page alignment was tricky for us because of the way our forms were built. To combat this, ABBYY asked us to anchor off some text in the upper left and lower right corners of the form. By comparing to our master form, we could determine X and Y shift and scale factors, and thereby know the coordinates of recognition zones on the page. This solution worked very well.
PROBLEM 2
The software had trouble picking up the filled bubble marks, because our forms had light gray letters ("A", "B", "C", etc) within the confines of each bubble. ABBYY helped us to try several solutions, but eventually they gave us some code which detected a filled bubble based on the black pixel count within the recognition zone. This solution worked very well and boosted our accuracy to well over 99%.
Overall, I would highly recommend ABBYY and will definitely go to them if I have a need in the future. The API was a dream to use - naming was clear and there was a lot of thought put into the object hierarchy.
Several months after the project was completed, I received an email from Leadtools indicating that they had just made some enhancements that could help with our "issue". Too little too late.
Posted at 12:54 PM | Permalink | Comments (3) | TrackBack (0)
August 08, 2010
The North Face Micro Sites Go Live
The North Face has recently released several micro-sites that celebrate top-notch athletes' accomplishments in their respective sports. Grio is proud to be part of the team that helped turning attractive and stunning graphical designs into live interactive sites. Check them out and enjoy!!!
http://www.thenorthface.com/en_US/brand/snowsports
http://www.thenorthface.com/en_US/brand/running
Posted at 11:32 PM in AIR/FLex, News | Permalink | Comments (0) | TrackBack (0)
July 19, 2010
Playing Video File from Limelight Secured URL
We worked on a project that utilized 360° panorama viewer, called PanoSalado, and ran into an issue with streaming video from Limelight, a popular CDN service.
PanoSalado renders one more more video sources by capturing the bitmaps and laying them "flat" allowing user to pan and zoom. For this project, our video source (encapsulated by a class called VideoSource) contains an instance of FLVPlayback. This is a standard Flash class for playing flv videos. To use it to play an flv file, one can simply call its load function.
var videoURL:String = "http://blabla.vo.llnwd.net/bla/bla/abc.flv";
_video.load(videoURL);
_video is an instance of FLVPlayback. And the core of FLVPlayback is a class called VideoPlayer.
Now, here's the issue. When we assign videoURL with Limelight secured url that has expiration time (ie., the flv is accessible for X minutes after it's first available), FLVPlayback stops working. For some reasons, it doesn't like the secured URL which has the following format:
http://blabla.vo.llnwd.net/bla/bla/cde.flv?e=...&h=...
The extra parameters after .flv are necessary for Limelight to recognize the validity of the request. Without them, cde.flv is not accessible.
To address this issue, we have to find out its root cause. When load function is called, FLVPlayback passes the call to VideoPlayer which then utilizes NCManager class to, among other things, validate the URL and determine its protocol (progressive vs. streaming/RTMP). What makes the request to secured URL break is the fact that NCManager only considers files with ".flv" postfix a valid non-streaming file. This check occurs in connectToURL function inside NSManager.as:
public function connectToURL(url:String):Boolean {
...
if (... parseResults.streamName.slice(-4).toLowerCase() == ".flv" ) {...
Okay, now that we know the cause, it's fairly straightforward to come up with the fix. What we need is a custom NCManager which will allow the limelight secured url format. We created a class call LimelightNCManager and it looks like this:
public class LimelightNCManager extends NCManager
{
public var LIMELIGHT_ID:String = "llnwd.net";
override public function connectToURL(url:String):Boolean {
var ret:Boolean;
// if this is limelight url, we assume it's an http...
if (url.indexOf(LIMELIGHT_ID)>0 &&
url.indexOf("http://")>=0 &&
url.indexOf("?")>0) {
// init
initOtherInfo();
_contentPath = url;
// parse URL to determine what to do with it
var parseResults:ParseResults = parseURL(_contentPath);
var name:String = parseResults.streamName;
var canReuse:Boolean = canReuseOldConnection(parseResults);
_isRTMP = false;
_streamName = name;
ret = (canReuse || connectHTTP());
}
else
ret = super.connectToURL(url);
return ret;
}
}
Once we have this class ready, we need to let VideoPlayer know and use it to manage network communications. Otherwise, VideoPlayer will continue to use NCManager. VideoPlayer exposes a static property called iNCManagerClass. To replace NCManager with our custom class, we simply assign the property to the definition of the custom class. We have to do that prior to calling the load function. Here's the code snippet:
fl.video.VideoPlayer.iNCManagerClass = LimelightNCManager;
_video.load(videoURL);
Now, the video will play just fine even when videoURL is in Limelight secured url format.
Posted at 11:07 PM in AIR/FLex, Video | Permalink | Comments (1) | TrackBack (0)
May 19, 2010
My First Facebook Development Journey: Extended Permissions, FB AS 3.0 Client Library, and Application Tabs
On a recent project, I had to create a Facebook Flash application where the application will live in a Facebook application tab on a fan page. The whole Facebook application development was very new to me. During that time, because it was a Flash application, it seemed the most sense was to use the Facebook and Adobe supported Facebook AS 3.0 client library which can be found here.
My first impression was that the AS library did a pretty good job integrating the Facebook Platform API. The Facebook API calls were pretty straightforward. However, one issue I ran into using the AS 3.0 library was the requesting extended permissions feature. From what I learned, certain Facebook calls requires “extended permissions” where the user will need to explicitly give permissions to the application to retrieve/set certain Facebook data (one example is publishing a post on a user’s stream). To ask the user to extend permissions through the AS library, the statement would be:
facebook.grantExtendedPermission(ExtendedPermissionValues.PUBLISH_STREAM);
In the example above, what the user should expect is a popup window containing a request asking the user to extend the application’s permissions to publish posts on the user’s wall. However, if a user’s browser’s popup blocker is turned on, he/she will not see this popup window. Taking a closer look, the grantExtendedPermission method executes a navigateToUrl statement. The navigateToUrl method is known to be unfriendly with many browsers’ popup blockers. This does pose a major problem because if the user never sees the popup window that asks for extended permissions, then the Facebook application won’t work.
My next step to avoid the navigateToUrl issue was to execute some type of modal window through Javascript. And for the Flash application to communicate with the page, it will need to go through Flash’s ExternalInterface. After coding up the ExternalInterface functionality, the application spitted out a Security sandbox violation error. Facebook, at that time, did not support ExternalInterface.
I was still hopeful that there is a way. After doing some research, I found that to get around the ExternalInterface issue, Facebook does provide a flash bridge where a Flash application can communicate to the Facebook page through this bridge. More information on the bridge can be found here.
During my research, I learned that Facebook restricts pretty much any native Javascript, but the good news is that Facebook does have its own Javascript library called FBJS. Using FBJS allows me to use specialized methods. There was a specialized method to prompt user for extended permissions with optional callback functions:
Facebook.showPermissionDialog('publish_stream, read_stream', ...)
Eureka! I see the light at the end of the tunnel. After spending a couple of hours, I finally got the bridge to work. On the application canvas page (main application page), I was able to see my Flash application communicate to the Facebook page, and through the FBJS, the dialog box requesting for extending permissions appeared. Woohoo!
Now it is time to put the Flash application into a new fan page’s application tab. I went through all the required setup to set up a new tab. I opened the new tab, and ran through the flash application to the part where the extended permission dialog box should appear. When I arrived, I saw…. nothing. No dialog box. I double and triple checked the code and everything looked correct. More research ensued, and to my frustration, I learned that there are many restrictions that a Facebook application can do on an application tab compared to the application canvas page. Scouring through the Facebook forums, I learned other developers had issues with application tabs dealing with FBJS, and how certain data is not available to a Facebook application that lived in an application tab.
In the end, my solution was notify any users that comes to the application tab that he/she will need to allow popups from Facebook in order for the application to function. I found the this solution user unfriendly.
Alas, I do feel that there must be a way, but unfortunately, I hit a brick wall. If anyone were able to solve my conundrum, then I would love to hear from you. Any constructive feedback is always greatly appreciated!
Posted at 03:52 PM in AIR/FLex | Permalink | Comments (0) | TrackBack (0)
Papervision Wish List
I’ve been using Papervision 2.0 for several months now, and while I’ve been able to get it to do most of what I want it to, it has been a tedious journey. If I were to do this project over again, I’m not sure I would choose Papervision, unless they make some improvements.
I’ve put together a short wish list of things I’d like to see done to Papervision:
1. Documentation, Documentation, Documentation!
The ASDocs for Papervision are some of the worst I’ve ever seen. There is virtually no useful information there. While there are many tutorials on the web for various functions, a responsive mailing list (papervision3d@osflash.org), and a good book (Papervision3D Essentials by Paul Tondeur and Jeff Winder), the ASDocs really need to be maintained for people that want to do anything complicated.
2. Fix Z-Sorting Performance and Functionality.
I’ve been working on a room planner application where users can dynamically add products to a room, and z-sorting has been a bugaboo. I’ve been forced to use the QuadrantRenderEngine, which is a CPU hog and also disables the use of filters (like a ‘glow’ around a selected object). I’ve had to optimize this by turning rendering off when not needed and selectively using the QuadrantRenderEngine (by setting testQuad=false on DisplayObject3Ds). This renderer needs some attention to improve performance.
3. How Do I Create a Collada Object?
Should I use DAE, SkecthupCollada or the Collada class for my Collada objects (answer: DAE)? Why are there 3 classes where there should only be one? Enough said.
4. Add Height, Width and Depth to All DisplayObject3D Classes.
This seems like a no-brainer, but sadly this info is missing, even for the Cube class. I added it myself for the project I am working on. Note you can dig out the axis aligned bounding box (aabb) in the geometry property of some DisplayObject3D classes, but unfortunately not all, and not DAE (Collada) objects.
5. Can We Have a Class to Create 3D Objects from a Vertex Array, Please?
Sometimes I would just like to create a 3D object from a set of vertices. I haven’t found an easy way to do that with Papervision. It would be nice if there was a class that supported the creation of a 3D object from a vertex array passed in the constructor.
Well, that’s my list for now. Hopefully some of the Papervision developers will read this and consider these enhancements and fixes. If you have any of your own, please feel free to tag them on in a comment.
Posted at 11:18 AM in AIR/FLex | Permalink | Comments (0) | TrackBack (0)
April 08, 2010
Kenmore Live Studio FaceBook Application Released
Posted at 08:49 AM in News | Permalink | Comments (0) | TrackBack (0)
February 02, 2010
Installing an ISO file from Mac OSX to a parallels Windows instance
Yesterday I attempted to install Visual Studio 2008 from a DVD onto my
mac parallels Windows 7 instance. After sitting back and admiring the
pictures of happy Microsoft programmers provided by the VS
installation software, I heard a ticking sound coming from my
computer. After several minutes, the install crashed. Some sleuthing
proved that the disk was scratched and worthless - a typical Monday.
And yet the job needed to be done. So I proceeded to download the
3.3Gb .iso file from Microsoft's website. Being without DVD, I
wondered if there were a quick way to get Visual Studio installed from
the iso without having to download and install additional software.
There was.
Now, I could have installed WinRar or Daemon Tools in Windows 7 to
open the .iso, but mac provides support for built-in .iso mounting.
Double clicking on the .iso in Finder mounted the .iso in OSX. After
this I attempted to open the VS setup.exe file using Windows Explorer.
No luck: the Mac mount was not visible to the Windows OS, so setup
failed immediately with missing .dll exceptions.
So, I had to take this one step further and copy the mac-mounted .iso
to a separate folder. After doing this, I was able to open the
setup.exe from within the new mounted folder without a problem.
Full list of steps:
- Download your .iso
- Double click in mac finder
- Recursively copy the mounted image to another folder
- Open the setup.exe file from within the copied folder using parallels Windows Explorer
Posted at 02:05 PM in Web/Tech | Permalink | Comments (3) | TrackBack (0)
January 26, 2010
Game Developers Conference 2010 in San Francisco
The Game Developers Conference® (GDC) is the world’s largest professionals-only game industry event. Presented every spring in San Francisco, it is the essential forum for learning, inspiration, and networking for the creators of computer, console, handheld, mobile, and online games.
The GDC attracts over 17,000 attendees, and is the primary forum where programmers, artists, producers, game designers, audio professionals, business decision-makers and others involved in the development of interactive games gather to exchange ideas and shape the future of the industry. The GDC is produced by the Think Services Game Group, a division of United Business Media.
This market-defining conference features over 400 lectures, panels, tutorials and round-table discussions on a comprehensive selection of game development topics taught by leading industry experts. In addition, the GDC expo showcases all of the most relevant game development tools, platforms and services helping to drive the industry forward. The conference also features the twelfth annual Independent Games Festival, where new, unpublished games compete for the attention of the publishing community, and the tenth annual Game Developers Choice Awards, the premier accolades for peer-recognition in the digital games industry.
This year, the conference will take place from March 9-13, 2010 in Moscone Center, San Francisco, CA. Grio has been selected to develop Schedule Builder and Vault for GDC.
Posted at 02:04 PM in News | Permalink | Comments (0) | TrackBack (0)