Tuesday, January 20, 2009

Tizra Publisher Demo

This is why I have been so quiet...the Tizra Publisher platform has evolved immensely during the last couple of months...which of course means a pretty busy time...and fun for that matter...And we are now posting a video tour of Tizra Publisher...



For a higher resolution demo tour, try this.

Oh...and since we went self-service, you can try a free plan for Tizra Publisher by subscribing for your free site here.

Monday, July 21, 2008

My Essential Firefox Add-ons

Been too long since I last wrote here. Tizra has been pretty busy picking up a ton of enthusiasm from customers and prospects (see Tizra Blog). That means, of course, a pretty busy time... :-)

I recently had to do a complete reinstall of my development environment. My laptop went dead and I had to get a new one...so that leads to the typical "absolutely essential" lists...today I reinstalled all my Firefox Add-ons. The good thing about reinstalls is that you cut the fat accumulated throughout the years and the absolute musts get installed first. Here is my list of absolute musts (in no particular order):

  • Selenium IDE: if you're doing any kind of serious development, you want to have a good test coverage. Selenium is a really cool tool to allow you to build automated UI and system integration testing. Selenium IDE makes your life *a whole lot easier* (although not dead-simple). You still have to tweak a lot of the generated code but hey, it's a really great start. And if you have not seen Selenium yet, you have to go take a look. It is not necessarily simple to get into but well worth it!
  • User Agent Switcher: really nice for that kind of testing that involves user agent detection...you can even "roll your own" agent identification for test purposes.
  • Web Developer: a really essential set of tools for web development. CSS inspection, changing, DOM information, source viewing, browser resizing, you name it, it's probably here.
  • Live HTTP Headers: a nice tool to let you see the header flow from and into your browser. Sometimes essential for analysis of behavior.
  • Firebug: you can't say you do web development and not know about Firebug. Simply brilliant. If you have not seen it yet, tell no one about that and go check it out for yourself.
  • Delicious Bookmarks: currently addicted to del.icio.us. You can see my bookmarks here.
I'm always open to suggestions on new add-ons...

Tuesday, March 18, 2008

Google APIs, XML, Ajax and some pretty cool pictures!

This is what happens when you join in a single "package" an artist and a techie...Marcelino Martins had already assembled a pretty cool site filled with really impressive pictures (see here). With Brazil Pictures, Marcelino joins his photographic artistic talent to his techie talent...he has already developed some pretty cool packages like Treeview...Now he's been playing the Google APIs, XML, Ajax...the result is the really interesting Brazil Pictures. And take a look at his implementation notes for a very interesting read.

Very nice....

Tuesday, January 22, 2008

AgilePDF is live!

I am pretty excited to see the first set of AgilePDF sites go live...we (Tizra) are indeed live at this point. You can now see the results of this effort at the following sites.

Francisco Assis Rosa's Publications. Now, would I not be eating my own dog food ? I honestly find the system pretty cool and am publicly using it to store and offer my publications online. Privately I keep a copy of the system on an internal network where I keep all my favorite tech reading. It is really handy to be able to search through the full collection of my favorite texts and get relevant results *to the page*....nice.

eat.shop guides. Some pretty cool eating and shopping guides...smartly written, gorgeously presented.




Rate It Green. Live access digital edition to "Green Building 101".







Why do I feel so excited about this ?

  • These customers were able to hop on online without any significant investment. We are talking days instead of months between agreement and go live (and that with full design customization!), we're talking about revenue from online selling in the first couple of days. Yup, they did not have to wait six months to see a dollar, or even more to get their money back from the site building investment.
  • The technology set used in this system is a pretty exciting technology allowing us to take advantage of a lot that's good out there...
  • I could see a nice use for personal users like me that have some content that want to distribute online. Either free or for sale...you name it.
As far as system features go, these are some of the items that make me believe AgilePDF is cool:
  • End-user page-at-time PDF rendering, allowing for getting back web usability that was taken back by the placement of unwieldy PDFs online (50Mb PDF downloads to read *one* page anyone? Make that over slow connections ?).
  • Full text search over the content of the site/sub-site/single document with results returned at the page level (again, instead of result pointing at full PDF).
  • Full fledged configurable access control over your content.
  • Full ecommerce configurability. Whoever owns the site can create their own products (including products resulting from combinations of pages from different documents in the site), create their own selling offers and just put it out for the test. We allow hooking up to PayPal and Authorize.Net right now but as requests come in we will be expanding the list of payment fulfillers.
  • Full site design configurability. We offer some out-of-the-box designs you can use but you can change all the look of your site by dragging and dropping site blocks around your pages...and if you really want to go crazy on your design, just upload your CSS and you can do what you want (just compare Francisco Assis Rosa's Publications to Rate It Green to eat.shop guides!).
  • Full site structure configurability. Via the administration web interface you can create sub-sites based on filtering of meta data in your documents. When I said "full site design configurability" in the previous item I really meant it, you can even have these sub-sites look completely different from the main site and/or other sub-sites.
  • Google crawling, analytics and adsense integration...speaks for itself! ;-)
And...you can always drop me a line if you wish to use something like this...

This is just our first release...we are and will continue to work on this...

We are live! :-)

I'm still alive! ;-) ;-) ;-)

Tuesday, September 11, 2007

Unit Testing Struts 2.0 (Part 3)

Like Dan commented on the Unit Testing Struts 2.0 (Part 2) post, Struts 2.0 has changed it's API enough to make my previous code not work on latest version. So, in response to his comment, here is what I am using right now. Credit where it's due, the setup code is the one that The Arsenalist pointed out on his blog post Unit Testing Struts 2 Actions wired with Spring using JUnit. Again, credit where it's due...my thanks go to "The Arsenalist" for posting his solution.


/**
* Class for easier support of Struts related
* testing. Takes care of all the configuration details
* that allow test classes to create beans (Spring),
* actions (Struts), intercepted actions (Struts).
* Class is singleton to minimize hit of initializing
* Struts and related infrastructure (e.g. Hibernate).
*
* Adapted from code from "The Arsenalist" (http://arsenalist.com/),
* see http://arsenalist.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/
*/
public class StrutsTestCaseSupport {

/**
* Singleton variable
*/
public static StrutsTestCaseSupport _theInstance = null;

/**
* Servlet context
*/
private ServletContext servletContext = null;

/**
* Request dispatcher
*/
private Dispatcher dispatcher = null;

/**
* Singleton access
*/
public static synchronized StrutsTestCaseSupport getInstance()
throws Exception {
if ( _theInstance == null ) {
_theInstance = new StrutsTestCaseSupport();
}
return _theInstance;
}

/**
* Class constructor, take care of Struts initializations
*/
private StrutsTestCaseSupport ()
throws Exception {
String[] config = new String[] { "/WEB-INF/applicationContext.xml" };

// Link the servlet context and the Spring context
servletContext = new MockServletContext(new FileSystemResourceLoader());
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setServletContext(servletContext);
appContext.setConfigLocations(config);
appContext.refresh();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, appContext);

// Use spring as the object factory for Struts
StrutsSpringObjectFactory ssf = new StrutsSpringObjectFactory(null, null, servletContext);
ssf.setApplicationContext(appContext);
StrutsSpringObjectFactory.setObjectFactory(ssf);

// Dispatcher is the guy that actually handles all requests. Pass in
// an empty Map as the parameters but if you want to change stuff like
// what config files to read, you need to specify them here
// (see Dispatcher's source code)
dispatcher = new Dispatcher(servletContext, new HashMap());
dispatcher.init();
Dispatcher.setInstance(dispatcher);
}

/**
* create a bean from the object factory (all wired up from Spring)
*
* @param beanName the name of the bean to get from the object factory
* @param extraContent any extra content information to pass along to the bean building
* process
* @return the object factory created bean
* @throws Exception on processing, configuration errors, test failure
*/
public Object createBean ( String beanName, Map extraContext )
throws Exception {
ObjectFactory objectFactory = dispatcher.getContainer().getInstance(ObjectFactory.class);
return objectFactory.buildBean(beanName,extraContext);
}

/**
* create an action proxied by it's interceptor stack
*
* @param actionName the name/id for the action
* @param actionNameSpace the namespace for the action
* @return the proxyed action
* @throws Exception on processing, configuration errors, test failure
*/
public ActionProxy createActionProxy ( String actionName, String actionNamespace )
throws Exception {
// create a proxy class which is just a wrapper around the action call.
// The proxy is created by checking the namespace and name against the
// struts.xml configuration
ActionProxy proxy = dispatcher.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(actionNamespace, actionName, null, true, false);

// by default, don't pass in any request parameters
proxy.getInvocation().getInvocationContext().setParameters(new HashMap());

// by default, pass along an empty session map
proxy.getInvocation().getInvocationContext().setSession(new HashMap());

// set the actions context to the one which the proxy is using
ServletActionContext.setContext(proxy.getInvocation().getInvocationContext());
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
ServletActionContext.setRequest(request);
ServletActionContext.setResponse(response);
ServletActionContext.setServletContext(servletContext);

// set proper URI
request.setRequestURI(actionNamespace + "/" + actionName);

return proxy;
}

/**
* create an action proxied by it's interceptor stack
*
* @param actionName the name/id for the action
* @param actionNameSpace the namespace for the action
* @param sessionMap the request/invocation session map (for http session map mocking)
* @return the proxyed action
* @throws Exception on processing, configuration errors, test failure
*/
public ActionProxy createActionProxy ( String actionName, String actionNamespace, Map sessionMap )
throws Exception {

// create an action proxy as usual
ActionProxy actionProxy = createActionProxy(actionName,actionNamespace);

// set the session map in the action proxy's invocation
actionProxy.getInvocation().getInvocationContext().setSession(sessionMap);

return actionProxy;
}

/**
* create an action object, bypass all it's stacks. Have it properly injected
* according to configurations.
*
* @param actionName the name/id for the action
* @param actionNameSpace the namespace for the action
* @return the properly injected action
* @throws Exception on processing, configuration errors, test failure
*/
public Object createAction ( String actionName, String actionNamespace )
throws Exception {
ActionProxy actionProxy = createActionProxy(actionName,actionNamespace);
return actionProxy.getAction();
}

/**
* Access to the proxy's response content as a string
* @param proxy the proxy to get the string response for
* @return the proxy's response content as a string
*/
public static String getResponseContentAsString ( ActionProxy proxy )
throws java.io.UnsupportedEncodingException {
return ((MockHttpServletResponse)ServletActionContext.getResponse()).getContentAsString();
}

/**
* Set a hostname in proxy request
* @param proxy the proxy to set hostname to
* @param serverName the server name to set for this proxy's call
*/
public static void setRequestServerName ( ActionProxy proxy, String serverName ) {
((MockHttpServletRequest)ServletActionContext.getRequest()).setServerName(serverName);
}
}


Like mentioned in previous postings, using this class is pretty straightforward, within your test you just do for beans:


YourClass yourInstance = (YourClass)StrutsTestCaseSupport.getInstance().createBean("yourBeanId",new HashMap());


For Actions:

ActionProxy proxy = StrutsTestCaseSupport.getInstance().createActionProxy(yourActionId,yourContextPath);
MyActionClass myActionInstance = (MyActionClass)StrutsTestCaseSupport.getInstance().createAction(yourActionId,yourContextPath);


This code is currently being used with Struts 2.0.8.

Wednesday, August 29, 2007

Return of the Stuff!

Here we go again, it's that time of the year where good things are about to happen. September is marked by two major events: the release of Halo 3 ;-) and the return of the No Fluff Just Stuff conference (now called the New England Software Symposium). I have written about this even before but it does not hurt to repeat it...this is a really impressive conference and a must if you live around the Boston area. It takes place during a Friday afternoon and over the weekend. This is actually a great decision since it simplifies a lot the "need to be out of work" argument with your bosses. Sure it takes over your weekend but, if you're in this business you are most probably hooked enough to this stuff for this not to be a problem. The attendance to this event is capped at around 250 which is another great feature since it does allow you to be in those rooms listening to the presentations in a much close environment. You get to interact with the presenters both during the talks and during the breaks by mingling in lunch tables or just approaching them directly. The topics are amazing and, like I mentioned before (see here), the really annoying part of the even is choosing which sessions to go to. The price for the event is really a find...pretty affordable even if, like me, you do not get your company to sponsor you
and pay out of your own pocket.


This fall, the Boston even takes place on the 14th (PM), 15th and 16th of September in Framingham, Massachusetts. For all the details, check out the event site.


I got my place already booked, what are you waiting for ?

Friday, July 06, 2007

Problems with Keyboard Mapping when Running vncviewer on Ubuntu

In the hope that this adds to the list of solutions out there that can actually help people...
If you are having keyboard mapping issues when trying to connect via vncviewer to a machine running vncserver on Ubuntu Feisty (7.04) with gnome, try this:

Create a ~/.vncrc file and add to it:

        $vncStartup = "<your_home_dir_here>/.vnc/xstartup"; 

Create a ~/.vnc/xstartup file (or edit) and make sure it contains:
        xrdb $HOME/.Xresources
gnome-wm &
gnome-panel &
nautilus --no-default-window &
gnome-cups-icon &amp;
gnome-volume-manager &
cd ~
xterm &


Solved the problem for me. Credit where it belongs, found the solution here: http://ubuntuforums.org/showthread.php?t=382441

My take on it, posts do help find solutions, here is my contribution to try helping others find a solution quicker.