Wednesday, July 01, 2009
Flash Builder 4 Tutorial - writing data to a hard drive
Here is the source code. This code has been updated for Flex 4 (Download Flash Builder 4 beta) - AIR 1.5. Email me if you want to get code that you can cut and paste (dnickull at adobe dot com).

Sunday, June 28, 2009
Flash for Mobile Rocks! HTC Hero is the Future!
If I had to hedge my bet on a long term winner for the mobile space, I place my bet on Android. Sorry Apple - you are just pissing off too many developers. Many of the developers in the real world work their behinds off to make awesome apps then they get blacklisted with no explanation. Apple tries to kill open source frameworks like PhoneGap while Android embraces them.
Android now not only challenges iPhone, but blows it away. The newest HTC phone has Flash 9 capability with Flash 10 coming later this year. People can now experience Web content and applications that cannot run on the iPhone. Flash developers can make use of their talent for the Android Mobile O/S. Keeping in mind that about 80 percent of all videos online use Adobe
Flash.
When I get back to Canada I am going to ditch my 3G and get the HTC Hero.
Saturday, June 27, 2009
Outline for MAX: LiveCycle ES for Java Developers
CAVEAT: This is subject to change--but if so, we would like to change it based on your input here!!
We'd like to post the outline here to get comments back on how we can make this the best course ever for LC ES and Java Developers. Please append any comments or ideas below.
********************
SESSION OUTLINE: LiveCycle ES for Java Developers (3 HOUR MEGA LAB)
Marcel Boucher, Scott MacDonald (Contributor for content), Duane Nickull, Greg Wilson
Audience Assumptions
- This is a lab for Java developers who want to learn how to unlock the full potential of LiveCycle ES.
Note: This is a Bring Your Own Laptop (BYOL)lab. We will prepare a separate set of instructions to provide attendees with prerequisite and instructions to prepare for this lab. It will explain in detail how to install the following software:
Prerequisites:
o Experience with the Java programming language 1.6 or later.
o Familiarity with XML syntax rules
Software Requirements (needs to be installed - subject to change at last minute but we will tell you)
o Acrobat 9 Pro Extended
o Microsoft .NET 1.1 runtime
o Java JDK 1.6 or later installed with JAVA_HOME and PATH set
o LiveCycle WorkBench must be installed. If Linux/Mac OS X or Unix, VMWare must be installed to run workbench.
o LC ES Server will be addressable via the LAN on a specific IP address.
NOTE: A special virtual session will be scheduled at the MAX facility prior to this BYOL Mega Lab to help attendees ensure they have all the necessary software installed and configured correctly. An instruction video will also be made available a week before the lab.
Session Description
This crash course will enable developers to learn all about Adobe LiveCycle ES. The course is completely hands-on and provides solid insight into how to build, deploy, and aggregate services into automated business processes. At the heart of LiveCycle ES are powerful Java(tm) libraries for manipulating PDF(ISO 32000) documents. These services can also be called remotely from a J2EE environment via EJB or SOAP endpoints. This hands-on lab will show attendees how to consume services to perform operations on documents including how to create and manipulate PDF documents, converting documents, extract XMP metadata, explore PDF/XDP documents, working with forms, SAP system data, and digital signature tasks.
Topics
Lab 0: Forward:
Opening – survey audience – learn about them.
- How many have used LC ES before (any version)?
- How many are using current version?
- Find out how much Java experience they have (to adjust mega lab as required on the fly)
LiveCycle ES architecture for those who are not familiar with LC ES (optional – only present if there are those who do not know LC ES or are vague).
What’s new in LC ES (scope to what is relevant to know for this mega lab)
Any housekeeping – launching VMWare images, where to address an instance on network (LAN or WAN).
Lab set up
- location and configuration of *.jars
- Configuration of Eclipse (assuming we use it)
- Importing the Java project with the labs and samples.
- TAs to help anyone with Classpath difficulties or similar
Lab 1: Verifying LC ES is running and logging in.
Objective: Learn how to ensure your LC ES instance is up and running. Log file location, pinging the server, logging in to adminui or workspace.
- Expected duration: 10 minutes
Lab 2: Configuring users via the AdminUI
Objectives: Learn how to ensure a new user has access to programmatically use the LC ES PDFG services. This is done by making the user a PDFG user.
- Expected duration: 10 minutes
Lab 3: Using Java API to make a PDF Document
Objectives: Learn how to make a PDF Document from a Java programming environment by calling up the PDFG Service using SOAP. This is largely hands-on coding. The skeleton of the class will be finished with the connection properties and outline with TODOs. Attendees will code up the solution to this lab, run it, and convert a document to PDF via SOAP.
- Expected duration: 15 minutes
Lab 4: Building, Compiling and Deploying a Server-Side Component
Objectives: Learn how to build a custom server-side component and what it means to deploy it to the server. Attendees will build a new component, compile it, and deploy it to the server.
- Expected duration: 25 minutes
Lab 5: Making a Java Class to call your server side component over EJB
Objectives: Talk to the newly deployed custom component via EJB endpoint. Attendees will code up a new EJB service client class and call their newly deployed component.
- Expected duration: 15 minutes
Lab 6: Adding your custom component to a LiveCycle Process
Objectives: Learn how to include the newly created custom component into a LiveCycle Business Process using workbench. Attendees will also add another service or two to their endpoints and note how the properties dialog align with the Java method signatures (coding without writing code!)
- Expected duration: 15 minutes
Lab 7: Programmatically Starting and stopping your new process
Objectives: Learn how to programmatically start the newly created LC ES process from a Java environment and also query the running processes using the APIs (note – if supported via REST, otherwise, use SOAP).
- Expected duration: 15 minutes
Lab 8: Exporting and re-importing an *.lca Application
Objectives: Learn how to export and re-import a *.lca (note – this is possibly not aligned with the talk title so needs a good thinking).
- Expected duration: 15 minutes
Labs 9-12:
We should prepare 3 more labs that call the LC ES infrastructure in case all attendees get through the first bits before the 3 hour lab is up. Would like to suggest we add the most common calls based on the LC ES quick starts:
- converting a PDF to an XDP (explain what XDP is etc.)
- Importing/Exporting XMP metadata using the Java API
- More Process management (time permitting):
o Searching for/Suspending process instances using the Java API
o Starting suspended process instances using the Java API
o Terminating process instances using the Java API
o Purging process data using the Java API
Monday, June 22, 2009
Hamburg FlexUGHH und Mir!
While in Europe, Sebastian and Marta asked me to pop over to Hamburg to do a talk for their user group. The event took place at an IBM office and was totally packed. The group was awesome and I felt totally well received (Danke fur die Bier!). We spent most of the time trying out the new features of Flash Builder 4 and helping developers understand the changes prior to them getting their hands on it. As with Berlin, a lot of Flex 3 developers had issues trying Flash Builder 4. We found it very useful to work through the changes together starting with all the new namespaces (Spark, Halo, FXG et) plus the variants of MX NS values (2009, 2006, halo). The big hits were the new advanced package explorer for each class, highlighting other instances of a class where it appears in the program (something Java developers are used to in Eclipse), advanced code hinting, content assist, class wizards and more. The network monitor won lots of friends.

I thought I would have the record of being the speaker to come from furthest away, however someone else apparently came from New Zealand (perhaps Kai?). The ColdFusion demo was a highlight!
Saturday, June 20, 2009
Flash Summer Camp Berlin
"I love User Groups!!!"
Let me repeat that:
"I REALLY love User Groups!!!"
The fact they are all developers really makes me feel comfortable so we spent a lot of time concentrating on what will bite you when you go from working in Flex Builder 3 to Flash Builder 4 (the successor IDE, which still uses the Flex 4 framework). In general, a lot of Flex 3 developers had issues trying Flash Builder 4. I found it very useful to walk them through the changes starting with all the new namespaces (Spark, Halo, FXG et) plus the variants of MX NS values (2009, 2006, halo). Many of them were confused why we would do this and the complexity that was added. Once explained in terms they understood, they quickly became friendly with it and liked it. The big hits were the new advanced package explorer for each class, highlighting other instances of a class where it appears in the program (something Java developers are used to in Eclipse), advanced code hinting, content assist, class wizards and more. The network monitor won lots of friends, especially when demonstrating data paging.

The idea here is that alike when you request a map on your cell phone, you do not get all the data in one response to your original request, but it pages data as needed (on a cell phone tiles for your map). The server side PHP API takes two arguments, the start index and number of items to return. As the datagrid realizes it requires more data to fill more rows, it sends additional pages back to the server (MAMP in this case) to request the data and display it just in time.
Andre Michelle needed more time for his track so Sven Claar and I did a totally improvised joint session, taking queues from the audience as to what to see or do next. Sven covered the work flow with Catalyst and some other great stuff.
One theme that I found was an intense interest in BlazeDS and LiveCycle Data Services ES and more people wanting to understand them in more detail.
If you have not gone to a user group meeting lately - you better arrange to join and attend one soon. Some of the best times you can imagine (and free beer too!!!). Find one near you here:
http://groups.adobe.com/pages/home
Berlin-Brandenburger SAP Forum
The students were totally enthusiastic and the faculty has been very knowledgeable in how they view SaaS and especially the architectural model exploring how to use Adobe’s stack to quickly offer SAP systems data using the SaaS model. The SAP speakers also had some great talks on SaaS and it is clear to me that Adobe and SAP need to work more closely together to harness the great power of SAP's enterprise while delivering business intelligence with Adobe's RIA stack.
My white paper on SaaS architecture was published in the official SAP SaaS Wirtschaftsinformatik. The same white paper is also published on the SaaS architectural area of Adobe's website.
I would love to be able to follow this up by coming back to teach a full day (maybe 2 days?) Flex Boot Camp at the University. This would involve a course similar to the one in Vancouver, except updated to reflect the new FB4 and F4, Catalyst work-flows and frameworks.
As I was in Brandenburg, basically a beautiful place, I was reminded of the Dalai Lama's advice - go every year to a place you have never been before. What a great way to live!
The presentation is available at http://www.web2open.org/presentations/Core-SaaS-Patterns_2009_NICKULL.pdf
Labels: adobe, brandenburg, Flex, SaaS White Paper, soa, university
Berlin University Semantics and Ontology Keynote
The keynote was for the Berlin Semantic Meetup group, which was an excellent meetup. The group is very well run and Adrian Paschke. We got to meet inside a large atrium with plenty of refreshments and great people!
The combination of Event driven architecture, SOA, CEP models, and BPM could deliver great advancements in discovery, configuration, and composition of appropriate process components, information objects, and services. Given Adobe LiveCycle ES has already a lot of the BPM and SOA tenets baked into the product, it was interesting to see attendees validate the architectural decisions of LiveCycle ES. While I did not speak directly on LiveCycle, it was always on the back of the mind.
The field of Computational Intelligence is really starting to heat up. As a member of the IEEE Computational Intelligence Society I plan to contribute some ideas to the movement.
I have uploaded my presentation on the OASIS SOA Reference Model, Semantics, Ontology and Adobe work in the space. The slides are available online here.
Labels: adobe, Adobe LiveCycle ES, berlin, ontology, semantics
Friday, June 12, 2009
Adding Digital Signatures to a PDF Document with Java
For this exercise, you will need to make a call to a server running Adobe LiveCycle ES 8.2.1. You will have to have it set up with appropriate user names and permissions. To learn how to set up Eclipse with this project and your development environment, please see the previous article here in this video: http://www.adobe.com/devnet/livecycle/articles/invoke_services.html
Set your domain name:port and the username and password in the code below. To programmatically add a Signature Field to a PDF document, the LC ES SDK offers a service client method called addSignatureField(). Here is the method signature (click to expand):
During this exercise you will also learn how to invoke an Adobe LiveCycle ES service using the Java SDK to add a visible signature field to a PDF document. The expected duration is approximately 15 minutes.
Step 1: Set up a new Java class call AddSignatureField in Eclipse. Import the same jars as per the previous lesson and also add the jar that contains the packages com.adobe.livecycle.signatures.client and com.adobe.livecycle.signatures.client.types. Copy the following code into your class:
package org.duanesworldtv.livecycle.samples;
import java.util.*;
import java.io.File;
import java.io.FileInputStream;
import com.adobe.livecycle.signatures.client.*;
import com.adobe.livecycle.signatures.client.types.*;
import com.adobe.idp.Document;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactory;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactoryProperties;
public class AddSignatureField {
public static void main(String[] args) {
try
{
//Set connection properties required to invoke LiveCycle ES
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://<your_server>:<port>");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "p@ssw0rd");
//Create a ServiceClientFactory instance
ServiceClientFactory myFactory = ServiceClientFactory.createInstance(ConnectionProps);
//Create a SignatureServiceClient object
SignatureServiceClient signClient = new SignatureServiceClient(myFactory);
//Specify a PDF document to which a signature field is added
FileInputStream fileInputStream = new FileInputStream("/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/test.pdf");
Document inDoc = new Document (fileInputStream);
//TODO: Specify the name of the signature field
//TODO: Create a PositionRectangle object that specifies
//the signature fields location
//TODO: Specify the page number that will contain the signature field
//Add a signature field to the PDF document
Document sigFieldPDF = signClient.addSignatureField(
inDoc,
fieldName,
pageNum,
post,
null,
null);
//Save the PDF document that contains the signature field
File outFile = new File("/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/test-signed.pdf");
System.out.println("Signature added, file saved!");
sigFieldPDF.copyToFile(outFile);
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
Step 2: Make sure your code looks similar to the following. There should five TODOs, two of which are merely paths.
We need to add code to complete the parameters required to write the code where the "TODO" markers are. Study the method signature to understand what each required parameter is.
Parameters
inPDFDoc — A com.adobe.idp.Document object that represents the PDF document to which the signature field is added. This is a required parameter and cannot be null.
signatureFieldName — The name of the signature field. This is a required parameter and cannot be null.
pageNumber — The page number on which the signature field is added. Valid values are 1 to the number of pages contained within the document. This is a required parameter and cannot be null.
positionRectangle — A PositionRectangle object that specifies the position for the signature field. This is a required parameter and cannot be null. If the specified rectangle does not lie at least partially on the crop box of the specified page, an InvalidArgumentException is thrown. Also, neither the height nor width value of the specified rectangle can be 0 or negative. Lower left X or lower left Y coordinates can be 0 or greater but not negative, and are relative to the crop box of the page.
fieldMDPOptionsSpec — A FieldMDPOptionSpec object that specifies the PDF document fields that are locked after the signature field is signed. This is an optional parameter and can be null.
seedValueOptionsSpec — A PDFSeedValueOptionSpec object that specifies the various seed values for the field. This is an optional parameter and can be null.
TODO:
The first line of code you have to add will be the name of the signature field itself. This can be whatever you want. Signature fields in PDF documents are named uniquely so you can further manipulate them programmatically to do things like validate signatures, get signature values and more.
//TODO: Specify the name of the signature field
String fieldName = "SignatureField1";
Step 4: You now need to create a "PositionRectangle" object that specifies the signature fields location. This is done via 4 integers which correspond to the (int lowerLeftX, int lowerLeftY, int width, int height). These represent the position of a signature field located within a PDF document. A signature field's rectangle defines the location of the signature field on the PDF document page in default user space units. An object of this type can be programmatically added to a PDF document.
//TODO: Create a PositionRectangle object that specifies
//the signature fields location
PositionRectangle post = new PositionRectangle(193,47,133,12);
Step 5: The last thing you have to do is to specify the page number. This may be confusing but values start at 1 (not zero) and go up. This is a mandatory requirement and will throw an error if left null. HINT: The document we are using is only one page long.
//TODO: Specify the page number that will contain the signature field
java.lang.Integer pageNum = new java.lang.Integer(1);
Step 6: Your code should now be ready to compile and run. It should look like the code below:
package org.duanesworldtv.livecycle.samples;
/*
* This Java Quick Start uses the following JAR files
* 1. adobe-signatures-client.jar
* 2. adobe-livecycle-client.jar
* 3. adobe-usermanager-client.jar
* 4. adobe-utilities.jar
* 5. jbossall-client.jar (use a different JAR file if LiveCycle ES is not deployed
* on JBoss)
*
* These JAR files are located in the following path:
*/Adobe/LiveCycle9.0/LiveCycle_ES_SDK/client-libs/common
*
* For complete details about the location of these JAR files,
* see "Including LiveCycle ES library files" in Programming
* with LiveCycle ES
*/
import java.util.*;
import java.io.File;
import java.io.FileInputStream;
import com.adobe.livecycle.signatures.client.*;
import com.adobe.livecycle.signatures.client.types.*;
import com.adobe.idp.Document;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactory;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactoryProperties;
public class AddSignatureField {
public static void main(String[] args) {
try
{
//Set connection properties required to invoke LiveCycle ES
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://<your_server>:<port>");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "p@ssw0rd");
//Create a ServiceClientFactory instance
ServiceClientFactory myFactory = ServiceClientFactory.createInstance(ConnectionProps);
//Create a SignatureServiceClient object
SignatureServiceClient signClient = new SignatureServiceClient(myFactory);
//Specify a PDF document to which a signature field is added
FileInputStream fileInputStream = new FileInputStream("/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/test.pdf");
Document inDoc = new Document (fileInputStream);
//Specify the name of the signature field
String fieldName = "SignatureField1";
//Create a PositionRectangle object that specifies
//the signature fields location (int lowerLeftX, int lowerLeftY, int width, int height)
PositionRectangle post = new PositionRectangle(193,47,133,35);
//Specify the page number that will contain the signature field
java.lang.Integer pageNum = new java.lang.Integer(1);
//Add a signature field to the PDF document
Document sigFieldPDF = signClient.addSignatureField(
inDoc,
fieldName,
pageNum,
post,
null,
null);
//Save the PDF document that contains the signature field
File outFile = new File("/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/test-signed.pdf");
System.out.println("Signature added, file saved!");
sigFieldPDF.copyToFile(outFile);
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
Now run the code. Note that this lab will take about 15 seconds to completely run--probably longer if there are many people all logging in at the same time.
Navigate to the path you specified for the output file and see your document. You should see a PDF document with a signature!
Displaying HTML in Flash Builder 4

Demonstrates the WebKit engine including a discussion on how much is available from Webkit in AIR. We will write this project from scratch and learn how to
set the URL, how it handles international characters, CSS and AJAX.
Instructions:
Step 1: Build this from Scratch (new -> Project -> AIR…). This will not work as a Flex application as the HTML component is not part of the Flex framework. Use the settings as shown in the image below:

Step 2:
Add a vertical layout manager to your project by adding the following lines of code:

Solution

Tuesday, June 09, 2009
How To Video: Capturing Keyboard Events in Flex 3
Great write up on Web 2.0 Architecture book
Book: Web 2.0 Architectures from O'Reilly
O'Reilly Media has released a new book on Web 2.0. Called Web 2.0 Architectures, this book should help you understand better the inner workings of Web 2.0 from a technology perspective and how some online services today have been successful with this model.
If you are looking to understand Web 2.0 from a marketing perspective, this may not be the book for you. But if you are a web architect, business analyst or someone who wants to build your own Web 2.0 website or solution, there is bound to be some information in this book to get you started.
I'd personally also like to re-thank Mark Little, Simon St. Laurent and Matt MacKenzie for their work on this book too. While not reflected in the credits, these three had an immense impact on the thinking and research that led to this book. Last but certainly not least, Tim O'Reilly himself deserves a lot of credit for challenging us on how we think about patterns and interpret Web 2.0. Again, while not reflected in the book, all of these people were instrumental in shaping this work.

Labels: web 2.0 architecture
Monday, June 08, 2009
Force.com Toolkit for Adobe AIR and Flex
HB Mok pinged me internally and was really stoked to see that the Force.com toolkit for Adobe AIR and Flex has been updated. The toolkit enables developers to access data and business processes held within Force.com from a Flex or AIR programming environment. Needless to say, developers could quickly code up some rather sweet looking mashups using that data in no time at all.
Anyone got a project they need built? ;-p
Thursday, June 04, 2009
LiveCycle @ MAX bundle - new for 2009!
The main reason I wanted to make this post is to make sure that people know this is where they can go to get training on LC ES and also receive in depth product knowledge transfer. I also want to let you know that there are huge discounts available for registering early for this at MAX 2009. Register for this by August 10 and receive US$200 off the regular price of a full conference pass.
The program itself is for enterprise developers and combines 1.5 days of introductory preconference training on LiveCycle ES (Enterprise Suite) with a full conference pass to MAX 2009.
The preconference lab, "LiveCycle ES: Building Rich Engaging Applications," is an essential introduction to developing user-centric applications with Adobe LiveCycle ES. LiveCycle ES allows both business and IT professionals to visually assemble end-to-end processes, which when combined with rich interfaces, create engaging applications that unify systems and people quickly and flexibly. We'll present an end-to-end use case bringing a rich Internet application (RIA) and a LiveCycle application together. You will learn about the LiveCycle IDE, the Admin User Interface, and the LiveCycle ES solution components as we guide the participants through the development of this comprehensive use case.
We strongly recommend this training to those new to LiveCycle ES, or those who would like a refresher, in order to get the most value out of the more advanced LiveCycle topics that will be presented during the MAX event.
The LiveCycle ES: Building Rich Engaging Applications preconference lab will take place the following dates and times at the Los Angeles Convention Center, the same venue as MAX 2009.
| 11:00am–12:00pm | Registration |
| 12:00pm–1:00pm | Lunch |
| 1:00pm–5:00pm | LiveCycle ES: Building Rich Engaging Applications preconference lab |
| 8:00am–9:00am | Continental breakfast |
| 9:00am–12:00pm | LiveCycle ES: Building Rich Engaging Applications preconference lab |
| 12:00pm–1:00pm | Lunch |
| 1:00pm–5:00pm | LiveCycle ES: Building Rich Engaging Applications preconference lab |
Labels: Adobe LiveCycle ES, Adobe LiveCycle Training, certification
The Coolest Flex User Group Poster ever!
Thursday, May 28, 2009
Flex Video Tutorial - Handling Communication Faults
Tuesday, May 26, 2009
Tour de LiveCycle Launches!
To install, click on the badge below.
Labels: Tour de LiveCycle
Flash Summer Camp Berlin!
This will be a whole day of experts sharing hands-on coding, presentations, and their knowledge with you. Topics include Flash, Flex and AIR, ColdFusion, Frameworks, Designer Development Workflow, and many more. If you are in Berlin June 14, you might want to come and meet some of the Adobe team and community leaders, as well as network with fellow developers and designers.
Whether you’re just getting started with the Flash Platform, or consider
yourself an expert, there’s something for you!
Ich hoffe auch, dass zu viele Biere mit meinen Freunden in Berlin in einem Biergarten (mit Sonne!)
Bis denn!
Labels: adobe, Adobe training, berlin, Flex, I love germany
Monday, May 25, 2009
Duane's World Episode 20
Friday, May 22, 2009
Can Squirrels code RIAs in Adobe Flex?
Thursday, May 21, 2009
Web 2.0 Architecture - the book is here!

Here are my other thank yous in no particular order.
Kevin Lynch, Michele Turner, and Jeff Whatcott from Adobe for letting this
take precedence over filing status reports ;-); my wife, Bettina Rothe, and
my children for putting up with me during the process; Ted Patrick, James
Ward, Prayank Swaroop, Alex Choy, Kumar Vora, the entire Adobe Platform
Business Unit, Enrique Duvos, Ivan Koon, Mihai, Serge, Tom, Piotr,
Chet, Greg, Eugene Lee, Waldo Smeets, John Hogerland, The rest of Redmonk, Burton, Gartner, Ben Watson, Matt Mackenzie, Melonie Warfel, Ed Chase, Diane
Helander, David Mendels, and Ben Forta for challenging the intellect and
generally being great people to work with; Ensemble, Rom Portwood for the blue hair
idea and the Balvenie 21-year Portwood finish; Bobby Caudill (when is that
demo tape coming???); Andre Charland (Nitobi and constant blogger); my bands
22nd Century (http://ww.myspace.com/22ndcentury) and Stress
Factor 9 (http://www.myspace.com/stressfactor9); the guys and girls at
Weissach for keeping the Porsche tuned; Matt and Trey, the creators of
South Park, for inspiring me to reach for something lower, and Beavis and
Butthead for inspiring me to create things that truly do not suck; Dilbert
creator Scott Adams; Sim Simeonov, Mike Connor, Danny Kolke, Greg Ruff, Ajit Jaokar,
Jeremy Geelan, Tim Bray, Mark Little (for taking time out of his busy
schedule to help edit this book); Yefim Natis (Gartner); the entire staff at
OASIS and UN/CEFACT; Bruce D'Arcus (the guy who I like the most despite the
fact that we never agree J), Audrey Doyle; Gary Edwards; David RR Webber;
Colleen Nystedt (friend, movie producer, and creator of MovieSet.com); Bob
Sutor; Christian Huemer; Birgit Hofreiter (for teaching me about
modeling); Brian Eisenberg; Arofan Gregory (how was that Barcelona-ian
brandy?); all the people involved in the creation of this book and O'Reilly
Media for taking on the project; John Sowa for making sense of propositional
algebra; Adam Pease for SUMO and for being an upstanding, approachable
academic; David Luckham for sharing good Scotch over discussions on CEP;
Gary Dunn; Dick Hardt (my Porsche is almost as fast as yours); Guy Kawasaki;
Bob Glushko; Shantanu Narayen and Bruce Chizen, Adobe Systems CEO, for inspiring me
on a great humanitarian level and showing that corporate success and good
community go hand in hand; all of Adobe PR for putting up with my antics;
Johnny Rotten, Randy Rampage, Zippy Pinhead, Jim Morrison, and Kurt Cobain (for their immense wisdom and teaching me that speaking the truth is never wrong); Peter Brown (who gets stuck with the next wine bill); Pam Deziel (I'll invite you to wine if it's
Peter's turn to buy); Marc Straat; Marc Eaman for drinking beer to help
lower my wine bills and reminding me that old guys can play great ice
hockey; Chuck Meyers for not questioning my wine bills; and my friends and
colleagues who have helped me over the years in this high-tech life.
The book is available here (Click on Book)

Wednesday, May 20, 2009
Video tutorial - talking to BlazeDS from Flex
Labels: adobe, blazeDS, Flash Builder, Flex, REST
Tuesday, May 19, 2009
New Flex Course available for everyone
Preparation
To take this course, you will need to do the following:
1. Install and configure Adobe Flex Builder 3.0 or later
2. Set up an account with Yahoo Developer Network and get an API key
3. Download the Yahoo SWC file
4. Download the ESRI SWC file
5. Download and take the course from here - http://www.web2open.org/courses/Where2.0.zip
This lab preparation assumes you need to install everything from scratch. While these instructions cover installing a standalone Flex Builder, it is also possible to install Flex Builder as an Eclipse plugin. Please seek out and follow the instructions from the Adobe website if you wish to install the plugin version.
Where possible, notes are augmented for Mac OS X, Linux, and Windows.
A. Installing and configuring Adobe Flex Builder.
1. Go to http://www.adobe.com/cfusion/entitlement/index.cfm?e=flexbuilder3 and download the Flex Builder trial.
2. Open up the disk image and follow the on screen instructions.
3. Note where you set up your workspace. This is where you will place all the files you work on and various libraries needed for this course.
4. Mac OS X: By default, this will be under your ~home_directory/Documents/Flex Builder 3.
5. Windows: By default, this will be under your c:\Program Files\Adobe\Flex Builder 3.
LINUX ONLY
6. For the Linux version, download the plugin from http://labs.adobe.com/downloads/flexbuilder_linux.html.
7. Run the installer either marking it as executable (chmod +x) or by using a shell to execute it (sh flexbuilder_linux_install_a4_081408.bin).
8. When prompted, specify whether to install Flash Player 9 (note that this is an updated version of Flash Player 9 and that Flex Builder Linux will work with earlier versions of Flash Player 9 for Linux). This is the debug version of Flash Player 9, which is required for debugging support and exception display.
B. Set up and account with Yahoo and download the SWC file.
1. Use your browser and navigate to https://developer.yahoo.com/wsregapp/
2. Sign in if you already have an account or register for a new one. If you have already registered for an API key, you can see it via the hyperlink near the top of the page.
9. If you do not have an API key, fill in the form and agree to any license terms.
10. Click “Submit” and a key will be generated for you. Make sure you save it somewhere in a text file on your desktop.
C. Accessing the YahooMaps.swc file.
1. Next, you need to download and install the Yahoo Maps SWC file. Aim your browser at http://developer.yahoo.com/flash/maps/
2. Save the zip to your hard drive and open the archive. You will see a file called YahooMaps.swc inside the zip.
3. Remember the location of this file as you will need it for Labs 2,3,4.
d. Download the ESRI ArcGIS SWC library.
1. Navigate to http://resources.esri.com/arcgisserver/apis/flex/index.cfm?fa=downloadDisclaimer
2. Agree to the terms and conditions of the license and click “Download”.
3. Save the file to your hard drive as you will need it for labs 5,6,7.
4. Unzip the file and you will see a SWC file as shown in the course setup guide.
5. Remember the location of this file as you will need it for labs 4,5,6.
That is all for now – now you can start the labs.
Friday, May 15, 2009
Next Flex Builder product renamed to Flash Builder? What do you think?
Some points to consider being sending me flames or applause ;-)
- It's still the Flex framework, and you are still a Flex developer.
- People searching for developers to build Flash would probably get connected with Flex developers much earlier in the development cycle.
- Flash Builder is the development tool for the Flash platform,
supporting the use of the Flex framework or pure ActionScript.
- Flex is the open source framework at the core of the Flash Platform,
including Flash Builder and Flash Catalyst.
- The name of the current product, Flex Builder 3, would remain the same, and would not be renamed Flash Builder 3.
It sort of just makes sense and would probably result in a lot of new revenue when people realize all these "Flex Developers" can actually build them Flash applications rather than smaller development shops having to educate the public about Flash vs. Flex.
These are ideas. What do you think? After all - it's your community.
Thursday, May 14, 2009
City of Vancouver to be "Open Source/Open Standards" based!
• Open and Accessible Data - the City of Vancouver will freely share with
citizens, businesses and other jurisdictions the greatest amount of data
possible while respecting privacy and security concerns;
• Open Standards - the City of Vancouver will move as quickly as possible to
adopt prevailing open standards for data, documents, maps, and other formats
of media;
• Open Source Software - the City of Vancouver, when replacing existing
software or considering new applications, will place open source software on
an equal footing with commercial systems during procurement cycles;
Read the rest here! Vancouver council: Welcome to the future!!! Thank you!!
Wednesday, May 13, 2009
New Video Tutorial - Full Screen AIR Video
Enjoy!
Friday, May 08, 2009
Video: How to build chromeless AIR apps in 5 minutes (update)
Labels: AIR chromeless application, AIR tutorial, source code, video
Tuesday, May 05, 2009
Software as a Service: A pattern for modern computing
The white paper examines the core pattern of SaaS in pragmatic terms. It also outlines some of the strategic advantages SaaS can provide over distributed and shrink-wrapped software. The paper is not intended to be a singular authoritative source for defining SaaS so please do not interpret it as such.
Read it here:
http://www.adobe.com/devnet/articles/saas.html
Labels: MVC, SaaS White Paper, soa, Software as a Service
Friday, May 01, 2009
Book - Web 2.0 Architectures

Here is the copy review description:
This fascinating book puts substance behind Web 2.0. Using several high-profile Web 2.0 companies as examples, authors Duane Nickull, Dion Hinchcliffe, and James Governor have distilled the core patterns of Web 2.0 coupled with an abstract model and reference architecture. The result is a base of knowledge that developers, business people, futurists, and entrepreneurs can understand and use as a source of ideas and inspiration.
Full Description
In Web 2.0 Architectures, authors Duane Nickull, Dion Hinchcliffe, and James Governor -- who have 40 years of combined experience with technical specifications and industry trends -- examine what makes successful Web 2.0 services such as Google AdSense, Flickr, BitTorrent, MySpace, Facebook, and Wikipedia tick. The result is a base of knowledge that developers, business people, futurists, and entrepreneurs can understand and use as a source of ideas and inspiration. This book reveals:
We also present the reference architecture and patterns on their companion website so that people in the industry can augment it and continue the discussion.
Links:
Labels: architecture, web 2.0 design patterns
Wednesday, April 29, 2009
Duane's World Episode 19
Getting Familiar with Flex Builder
Tuesday, April 28, 2009
LiveCycle ES Hosted Beta is now Live!
What’s new?
A vast number of improvements have been made to LiveCycle ES. A sample of some of the new features includes:
· Improved development and authoring tools, including the introduction of Action Wizard in LiveCycle Designer and changes to Process Designer to make team development possible and process design more intuitive
· Improved end-user experience development including LiveCycle ES Service Discovery for Flex Builder and a re-engineered Form Guide Builder
· Improved support for document assembly of XDP-based documents as well as PDF Portfolios including a new Document Builder interface to generate DDX commands
· Improved administration and platform maturity with improved backup and recovery support (hot backup), Health Monitor, expanded platform, database, and full 64 bit JVM support
· Improved out of the box solutions for Review and Commenting workflows which include Content Services
How do I get involved?
The goal of this early preview of the next version of LiveCycle ES is to provide our preferred customers and partners with the opportunity to preview the next release of LiveCycle ES. By participating, you will have access to:
· “What’s new” presentation
· Feature Spotlights (short recording of LiveCycle ES engineers presenting the new features)
· Access to your own hosted system with LiveCycle ES Server and Workbench pre-configured
· Test cases that will guide you through the new product areas accompanied with a survey to collect your feedback
While we always strive to drive quality releases, the goal of this early preview is to collect your valuable feedback on the usability enhancements that we have added to this new release. We will also be running a public beta in early summer to solicit testing and quality feedback.
TO DO: Immediately register yourself in the pre-release program here <http://www.adobe.com/cfusion/mmform/index.cfm?name=prerelease_interest> to ensure you get access to this early preview of the next release of LiveCycle ES. Please note that it may take up to 24 hours to activate your account.
How to get started?
Once you have registered, you will receive an email confirmation with information on how to access the prerelease.adobe.com site. Adobe is taking another big step in cloud computing by offering you a completely hosted environment to test our early version of our next release. We have our prerelease.adobe.com site ready to go which will provide you with access to a hosted system, support forums, bug & enhancement logging and tracking, documentation, etc.
Access to the hosted server on the LiveCycle Express system is very easy. Log on to the prerelease.adobe.com site where you will find a short welcome note. Here you will find a link to our Getting Started page that contains all of the information you need to get started with your very own hosted system.
Some guidance:
The prerelease site supports online forums. Please use the forums when you have a general question or suggestion that you feel other testers can benefit from. We would also encourage you to look at the forum posts prior to submitting a question, as someone may have already found an answer.
If you have questions or need help, please contact me at dnickull at adobe dot com.
We look forward to your feedback and appreciate the time and energy that is invested to help improve the quality and usability of our product
Sunday, April 26, 2009
Search Engine Optimization Tricks and Tips condensed.
Before anyone uses these to "trick" Google, know that doing so will often result in helping nobody. After all, what is the use of having a website selling some medication come up in the top ten results for someone seeking to read about golfing or fishing? Yes, you might be able to do this, but it will not benefit you and it will not benefit the readers so don't bother. I have said this before and will say it again, Google's ranking system is very fair and if you want your sites to do better, use proper enhancements, not black magic tricks. I have never had to resort to anything underhanded to gain #1 spots and keep them. Some examples? Search for these terms in Google and click to either the sites that points at this blog or back to Adobe.com: SOA White Paper, Enterprise Developer Resources, Sombrio (goes to my friend's site), Search Engine Optimization Tricks, Adobe cloud computing, understanding REST, Adobe MAX 2009. Note that some of these will change over time (as they should) as new works become available. In the past, I have helped clients get #1 for bicycle, mountain bike, aromatherapy, yoga, skiing, mac and more.
Here is a list of some relevant posts on the subject made in the past.
http://technoracle.blogspot.com/2008/07/searchable-flash-some-early-tips.html
Some tips related to Flash SEO.
http://technoracle.blogspot.com/2007/06/seo-search-engine-optimization-tricks.html
8 quick tips anyone can implement.
http://technoracle.blogspot.com/2008/10/flash-search-engine-optimization-tricks.html
A recap of a talk I did on Flash SEO at the Web 2.0 conference in Berlin. Slides included.
http://technoracle.blogspot.com/2009/04/more-seo-tips-to-save-you-tons-of-work.html
Some general tips to save you work by really understanding some of what Google ignores.
http://technoracle.blogspot.com/2009/01/flash-search-engine-optimization.html
A video of how Ichabod indexes SWF content in different states. Note that as Beussery noted in the comments, this is now old and there are still major questions about how Google actually uses content it grabs.
http://technoracle.blogspot.com/2008/10/flash-seo-research-google-does-use.html
A report on Google's use of Ichabod (code name) for indexing SWF content.
http://technoracle.blogspot.com/2008/06/duanes-world-tv-episode-3-live.html
A pointer to a video tutorial of how Google tracks searching and click-through traffic.
If this still is not enough, try Google's site. They pretty much tell you exactly what you will need to do to help elevate your rankings.
http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=35291
There are also some other people who I consider of guru status (we don't always see eye-to-eye but generally they are very knowledgeable):
Danny Sullivan
Beu Blog
Anyways, this is enough information to get you higher than you are now in the rankings.
My next work is some trial studies to determine how well SWF content ranks against HTML content given the same context. This study is ongoing and has to be totally uncontaminated by people searching for or linking to it so I cannot divulge any secrets, but I will share all when ready.
I am also working on cracking the codes within the Google page results. If you search google.com for a term, you will find some cryptic strings within the source of the results page like this:
http://www.google.com/url?sa=t&source=web&ct=res&cd=2&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FArchitectural_pattern_(computer_science)&ei=Lv2lSYXeL8TMnQePtZWjBQ&usg=AFQjCNHZFyB7San73Hj6Lb0zkcUbGq_N0g&sig2=nNH5vIakDgirDg8dMpz7RQ
Now note that this is often different on most geographical, temporal, and browser/OS combinations, but you can generally find these strings:
ei=AOKlSaLSBMTMnQfhs5GjBQ
usg=AFQjCNHtxRnR1RWVZrM6TD0uYFmK8GWFTA
sig2=eFYPDz8WzdtLw9OB_y00qA
The middle one, starting with AFQjCN will be in most search results however the 7th letter often changes. If I search in Vancouver, I nearly always get an "H" but others have experienced differences.
I highly suspect that this is anti-spamdexing technology engineered by Google and returns a hash value based on an IP address and timestamp, making it impossible to gain click through success. It is probably impossible to get around or spoof but nevertheless presents an intriguing puzzle.
I recently posted a challenge to a few people such as Danny Sullivan, Tim O'Reilly, Dick Hardt, Matt MacKenzie, and others to see what they got as the 7th character. The results varied.
Google can track what you click on. This means that over time, search engine results can be tracked and dynamically adapted based on who clicks on what. The actual mechanism is far more complex than such a simple algorithm, however, as ontology classifications are mixed in along with other ways to determine how each result should be treated in future searches.
Using a different machine and browser combination from a different IP address, I also found this little snippet of code in the source:
a href="/url?q=http://www.answers.com/architecture&r=67&ei=EAGmSY7pO5DZnQfsxb3jDw&sa=X&oi=dict&ct=D&cd=1&usg=AFQjCNGEcgqgfjDs8O9JnDVraTEt07mqQQ"
in particular, compare the value of usg=AFQjCNHZFyB7San73Hj6Lb0zkcUbGq_N0g to this value
usg=AFQjCNHZFyB7San73Hj6Lb0zkcUbGq_N0g
usg=AFQjCNGEcgqgfjDs8O9JnDVraTEt07mqQQ"
Can it be a coincidence that the first 7 characters are the same? The odds against this are 52 to the power of 6 or better than 1 in one quadrillion +. This is based on only observing upper and lower case letters. If you include numeric values the number is much higher.
When I clear my cache and cookies, the value changes yet the first 6 characters remain the same:
usg=AFQjCNF6pTl1_OknMH4NN88IVnlugECBBQ
If these values do not change, it is possible that the first 6 characters are based on some unmutable part. At first I thought perhaps it was the search itself so I changed the search term yet got this response:
usg=AFQjCNF_5AxdU_kbNpKl21c1VcXmXRLnGA
This is an interesting and probably ultimately pointless exercise, but I am the type who does crosswords and picks up Rubik's Cubes when I see them (best time to solve ever was 5'30" flat).
Mental Masturbation? Perhaps. There is probably a document somewhere outlining exactly what it is but I prefer to figure it out on my own.
Thursday, April 23, 2009
Understanding REST
First and foremost, REST does not equate to HTTP and XML. REST is an architectural style. Encapsulated within the REST style are several key principles governing network architecture. While the HTTP/XML confusion reigns in most articles, it is in fact possible to write an HTTP and XML interface to a resource that does not comply with the principles of REST.
REST can be simplified down to the following:
1. REST begins with the notion of a null architectural style (imagine that there is only a "thing" with no discernible detail). From this emptiness, the first constraints of REST emerge. A client-server architecture is the first emergent principle; a separation of all into two concern groups. This allows each group to evolve separately and scale across multiple domains (similar to SOA).
2. REST then adds the principle of stateless binary relationships. In section 5.1.3 of his dissertation, Fielding writes "each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server". These types of requests are also termed "idempotent". Inference? Any site using cookies or stored contexts is not compliant with REST.
3. REST does make the possibility of caching available to improve efficiency. While not violating the principles of stateless invocations, client side caches can be used to allow reuse of information.
4. Uniform interfaces and uniquely identified resources are pivotal to being RESTful. Having a uniform interface between components (such as the use of certain methods like GET, POST, PUT and DELETE in protocols like HTTP), enables implementations to be decoupled from the service interfaces. This principle is also embodied in Service Oriented Architecture, which perplexes me why so many people compare SOA to REST.
Fielding writes more about the subject in section 5.1.5 "In order to obtain a uniform interface, multiple architectural constraints are needed to guide the behavior of components. REST is defined by four interface constraints: identification of resources; manipulation of resources through representations; self-descriptive messages; and, hypermedia as the engine of application state."
5. A resource is explicitly defined as "the intended conceptual target of a hypertext reference" and later in section 5.2.1.1 as "any information that can be named...". The first of these definitions seems to concretely link HTTP to REST yet there are arguments that hypertext is used here in a generic manner. In fact, later in section 5.2, it quite explicitly states "REST ignores the details of component implementation and protocol syntax in order to focus on the roles of components". Nevertheless, the way to interact with resources is via representations of the resources, as per 5.1.5. Note that Resource is defined in W3C terms as "any thing that can have an identifier".
6. Resources are identified with a URL or URN. Note that in this case, the URL should be constrained to be free of non-uniform interfaces (such as http://www.domain.com/someOperation?operation=manipulationByURL&moreOperations=notAllowed). This style of manipulation of data elements through invocation of non-standard operations is the anti-pattern or REST. REST therefore can be contrasted to Remote Procedure Calls (RPC) which generally encapsulate the notion of invoking a procedure on a remote server.
REST is an abstraction of all these architectural elements plus a few more within a distributed hypermedia system such as the Internet. Now here is the one sentence summary:
REST-based architectures communicate primarily through the exchange of representations of the state of resources through uniformly defined interfaces.
Try saying that 5 times fast.
So is it possible to define RESTful services for SOA? Absolutely. Do you have to use XML in REST? No.
There is a lot more about REST that you should look at in detail but I think this captures the gist.
Don't believe me though - read about it here yourself. http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
References:
(1) Fielding, Roy Thomas. Architectural Styles and the Design of Network-based Software Architectures. Doctoral dissertation, University of California, Irvine, 2000
Wednesday, April 22, 2009
Ontology advice needed for SEO playground.
I am right now placing First Order Logic (FOL) binary and n-ary relationships into the associations binding for labeled relations in a test metadata facility (Registry-Repository). I am doing this because I got sick of Computational Intelligence researchers just talking about this and not actually coding and doing something to solve the problem so the Canadian cowboy instinct to code first and see where problems arise has taken over. Search technologies on the web have kind of plateaued. With no real competition, are Google and Yahoo going to keep innovating search to the point where a 3-word search term can find a needle in a haystack? I do not think so but it is not outside the realm of possibility. While researching some advanced SEO topics, I started realizing that fuzzy logic and quantum computing patterns have not yet been optimized for NL programming heuristics.
I have run into a problem that I would appreciate input on. My goal is to bind something like this (From SUMO - thanks to Adam et al for doing the hard work).
(=>
(instance ?OBJ Object)
(exists
(?TIME1 ?TIME2)
(and
(instance ?TIME1 TimePoint)
(instance ?TIME2 TimePoint)
(before ?TIME1 ?TIME2)
(forall
(?TIME)
(=>
(and
(beforeOrEqual ?TIME1 ?TIME)
(beforeOrEqual ?TIME ?TIME2))
(time ?OBJ ?TIME))))))
..to a registry-repository node instance to allow folksonomy tags to reference the upper level ontology classes that the folksonomy tag owners believe they belong to. Additionally, each instance of a folksonomy tag may have * relationships to other ontology classes or even other folksonomy tags. The latter relationships can be defined in terms of constrained relationship tags like “synonym, disjoint, etc.”.
I want to represent all upper ontologies; however some of them contain subtle nuances between their terms. Dolce, SUMO and others have defined binary relationships like transitive, intransitive, reflexive, irreflexive, symmetrical as well as some partial ontologies. The problem is that there are no namespace qualifications for these so I want to introduce that into my work. I was planning on just using the root URLs for each work however there are versions possible in some of the work.
I would like this to be in the form of (upper_ontology_identifier)+(version_or_instance)+(uuid) as a classifier followed by the term label such as “transitive”. I will probably use URIs for the UUID.
Question:
Has anyone ever come across a similar problem and if so, how did they solve it?
Thoughts and comments welcome too.
Labels: adam pease, fun, ontology, sumo, what to do when you're bored
Wednesday, April 15, 2009
More SEO tips to save you tons of work
http://technoracle.blogspot.com/2007/06/seo-search-engine-optimization-tricks.html
I want to share a little secret to those who are still adding comments with links in hopes of building up link equity.
"Google does not follow links in blogger comments!"
Surprised? Don't believe me. Check it out for yourself. The first comment on the page above is from a company called Wavestech. They claim to be an SEO company but obviously do not understand the statement above. You can check out who links to you in Google buy going to http://www.google.com and doing a search in this format (note no space between 'link:' and domain name):
link:www.domainname.com/
Of course, replace "domainname.com" with the actual domain name. To verify whether or not wavestech has anyone linking to it, check out their results:

http://www.google.com/search?hl=en&safe=off&q=link%3Awww.wavestech.net%2F&btnG=Search
Dang!! One result. I wonder how much time they spent replying to comments in the last year and wondering why they are not elevated. Another company called 123seoservices.com tried it too but they have no results and no link equity.
http://www.google.com/search?hl=en&safe=off&q=link%3Awww.123seoservices.com%2F&btnG=Search
The rule of thumb here is simple. There are no easy and quick ways to get to #1 for any search term. You have to pay your dues. Let the natural path take you up there. If you make a good site, with good information, it will find its way to the top of the pile eventually. Take "SOA" as an example. Try a search for "SOA White Paper" on Google.
http://www.google.com/search?source=ig&hl=en&rlz=&=&q=soa+white+paper&btnG=Google+Search
The number one result for this is a white paper I co-wrote for Adobe.
www.adobe.com/enterprise/pdfs/Services_Oriented_Architecture_from_Adobe.pdf
We did not get #1 by spending hours making comments on others blogs. We spent the time writing a well researched paper that tries very hard to explain message exchange patterns in SOA without pitching products. This time was much better spent making a good paper and letting people search for it, find it and get it to #1 in Google by its reputation.
People linked to it because they liked it and thought it served a purpose. There are 137 links to that paper:
http://www.google.com/search?hl=en&safe=off&q=link%3Awww.adobe.com%2Fenterprise%2Fpdfs%2FServices_Oriented_Architecture_from_Adobe.pdf+&btnG=Search
Google engineers also monitor networks for patterns. It is easy for them to spot a pattern to catch cheaters. Even if you crack the hashcode algorithm (I think I am very close now) for the cryptic string you get back in search results to track what you click on, your spike in traffic would be caught if you used it. Better to spend the energy creating good work that people want to use.
Advice:
Spend time making quality sites; do not try to cheat your way up to the top. Cream rises naturally to the top. Put the energy into creating good content.
Tuesday, April 14, 2009
FLARToolKit - 3D Flash augmented Reality
At the booth, I demoed FLARToolKit. FLARToolKit (source code) is an AS3 version of ARToolKit. ARToolKit was a C library that enabled augmented reality; however the Adobe Flash/Flex/AIR compatible version, FLARToolKit, is not merely a port of the original C version. FLARToolKit is ported from a Java, version which is called NyARToolKit. (NyARToolKit seems to execute much faster than the original C version after the great effort of nyatla.)
FLARToolkit will detect the marker from an input image and calculate the camera position in three-dimension space. Something like Helper library are planned, but further processing (like synthesizing the 3D Graphics) needs to implemented by yourself. You can try a demo of it here at General Electric.
While at the booth, we got awarded the "Best in Show" award from Web Professional Minute, sponsored by Peachpit Press. This image links to the video.

My colleague Lee Brimelow took the concept one step further and has now produced an excellent tutorial on how to use the FLARTookKit for AS3 (Flash/Flex/AIR) developers.

If you haven't seen Lee Brimelow's GoToAndLearn website, it is a must see.
Thursday, April 09, 2009
New LiveCycle Video Tutorial
UPDATE: If you cannot see the video, I have now posted it to Google video here:
http://video.google.ca/videoplay?docid=2601122249633361252
Watch Adobe LiveCycle ES Java Service Invocation in Tech & Gaming | View More Free Videos Online at Veoh.com
Invoking the LiveCycle ES 8.2.1 Distiller API from Java
Before you start:
You will need to ensure you have the following on your local drive. I used a MacBook Pro laptop to conduct this lab.
- Java JDK 1.5 – ensure your environment variables are set as per the instructions from the LiveCycle ES documentation
- Eclipse 3.4 (Ganymede)
- The LiveCycle ES Client SDK JAR files. You will need the following JAR files to make this lab work:
/*
* This Java Quick Start uses the EJB mode and contains the following JAR files
* in the class path:
* 1. adobe-encryption-client.jar
* 2. adobe-livecycle-client.jar
* 3. adobe-usermanager-client.jar
* 4. adobe-utilities.jar
* 5. jbossall-client.jar (use a different JAR file if LiveCycle ES is not
* deployed on JBoss)
*
* These JAR files are located in the following path:
* {install directory}/Adobe/LiveCycle9.0/LiveCycle_ES_SDK/client-libs/common
*
* The adobe-utilities.jar file is located in the following path:
* {install directory}/Adobe/LiveCycle9.0/LiveCycle_ES_SDK/client-libs/jboss
*
* The jbossall-client.jar file is located in the following path:
* {install directory}/Adobe/LiveCycle9.0/jboss/client
*/
You will also need the third-party JAR files to use the SOAP stack rather than EJB endpoints. If you want to invoke a remote LiveCycle ES instance and there is a firewall between the client application and LiveCycle ES, then it is recommended that you use the SOAP mode. When using the SOAP mode, you have to include additional JAR files located in the following path:
/*
{install directory}/Adobe/LiveCycle9.0/LiveCycle_ES_SDK/client-
* libs/thirdparty
*/
For information about the SOAP and EJB mode, see "Setting connection properties" in Programming with LiveCycle ES.
For complete details about the location of the LiveCycle ES JAR files, see "Including LiveCycle ES library files" in Programming with LiveCycle ES.
1. Open up Eclipse and set up a new Java project by choosing File > New > Project.
2. Select Java Project.

3. Type a name for the project and click Finish.

4. When the new project opens in your workspace navigator, right-click (Windows) or Control-click (Mac) on the src folder under the project.
5. Choose New > Package.

6. Type a name for your package (I used “org.duanesworldtv.samples”) and click Finish. This step is important because it keeps your class files distinct from other class files with the same names under your workspace by namespace qualifying them.
7. Right-click on the package name you just created (under your project) and choose New > Class to create a new class file.

8. In the New Java Class dialog box, type the name for your class (I used “CreatePDF”) and click Finish.

9. You should see some skeleton code under your new project. Highlight all code below the package name and delete it.
10. Replace the deleted skeleton code with this source code:
package org.duanesworldtv.samples;
/*
* This Java Quick Start uses the following JAR files
* 1. adobe-distiller-client.jar
* 2. adobe-livecycle-client.jar
* 3. adobe-usermanager-client.jar
* 4. adobe-utilities.jar
* 5. jbossall-client.jar (use a different JAR file if LiveCycle ES is not deployed
* on JBoss)
*
* These JAR files are located in the following path:
*/Adobe/LiveCycle8/LiveCycle_ES_SDK/client-libs
*
* For complete details about the location of these JAR files,
* see "Including LiveCycle ES library files" in Programming
* with LiveCycle ES
*/
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import com.adobe.livecycle.generatepdf.client.CreatePDFResult;
import com.adobe.idp.Document;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactory;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactoryProperties;
import com.adobe.livecycle.distiller.client.DistillerServiceClient;
public class CreatePDF {
public static void main(String[] args)
{
try
{
//Set connection properties required to invoke LiveCycle ES
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://{your_server_IP}:{HTTP_PORT}");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "{username_of_privileged_user}");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "{password}");
// Create a ServiceClientFactory instance
ServiceClientFactory factory = ServiceClientFactory.createInstance(ConnectionProps);
DistillerServiceClient disClient = new DistillerServiceClient(factory );
// Get a PS file document to convert to a PDF document and populate a com.adobe.idp.Document object
String inputFileName = "/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/test.ps";
FileInputStream fileInputStream = new FileInputStream(inputFileName);
Document inDoc = new Document(fileInputStream);
//Set run-time options
String adobePDFSettings = "Standard";
String securitySettings = "No Security";
//Convert a PS file into a PDF file
CreatePDFResult result = new CreatePDFResult();
result = disClient.createPDF(
inDoc,
inputFileName,
adobePDFSettings,
securitySettings,
null,
null
);
//Get the newly created document
Document createdDocument = result.getCreatedDocument();
//Save the PDF file
createdDocument.copyToFile(new File("/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/DuanesWorldTest.pdf"));
}
catch (Exception e) {
e.printStackTrace();
}
}
}
11. When you paste this code into your project, you will notice several red Xs beside various lines. This is because you have not yet imported any of the LiveCycle ES JAR files.
There are a couple of gotchas you need to know about with respect to these JARs.
First, the JARs must be from the same release of LiveCycle as the instance you are going to connect to. JARs from 8.0, for example, might not always work with an 8.2.1 instance.
Second, the JARs are in various locations and not always easy to grab. (See above for the exact locations.)
We put our jars into a parallel directory that we created under our Eclipse workspace called “JavaOne2009_libs”. This allows us to easily use these JAR files for multiple projects.

12. To add the JARs to your project, highlight the project name in the navigator tab, then right-click and open the project Properties dialog box.

13. Select Java Build Path and then the Libraries tab. Click Add External Jars. Select all the JARs under the “thirdparty” folder (for SOAP only – these are not required for EJB endpoints invocation). You will also need to import the Adobe LiveCycle Client JARs. (Note: In the image below we have highlighted some extra jars because we plan to add more class files to this project later.)

14. Once your JAR files are added, your build path should look similar to this:

15. Click OK, check any warnings in Eclipse, and correct as needed.
16. Now locate the lines of code that set the connection properties. They are at around line 14 and look like this:
//Set connection properties required to invoke LiveCycle ES
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://{your_server_ip}:{http_port}");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "{username_of_privileged_user}");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "{password}");
17. You will have to change three values. The first is the server IP address and port. If the server is on the same machine, http://localhost:8080 should suffice. Change it as required to match your server's location.
18. Next, you will be required to supply a username and password of a user with the right privileges. We used the username "kvarsen" because it is installed by default when you install the LiveCycle ES samples. The matching password for kvarsen is “password”, all lowercase.
To run the code in this tutorial, however, you will need to update the roles assigned to kvarsen. To do this, you must have administrator access to the LiveCycle Server you wish to connect to. Log in to the adminui at http://{your_server_ip}:{http_port}/adminui. For example, ours was http://duanesworldtv.org:8080/adminui. Once inside, navigate to Home > Settings > User Management > Users and Groups.

19. Type the user's name in the Find text box (for Kel Varsen, type “varsen”) and click Find. The user's name will come up in the list with a hyperlink. Click on the name to show what permissions the user has.

20. Click the Role Assignments tab.

21. This will bring up a screen that shows all the roles and permissions that this particular user has. For this tutorial, you want to ensure that Kel Varsen is privileged with the PDFG (PDF Generation) service. (In the screenshot below the user is already assigned the PDFG User role; your setup will likely not show this yet.)

22. To find the appropriate roles, click Find Roles, which will bring up a list.

23. Locate and select the PDFG User role, and then click OK. You can then log out of the adminui console.

24. You are almost ready to run the code. Back in Eclipse, you will notice two lines of code that contain path references. One is a reference to a PostScript document. You need to change this to correspond to an absolute path to a PostScript document on your hard drive. The path we used is:
// Get a PS file document to convert to a PDF document and populate a com.adobe.idp.Document object
String inputFileName = "/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/test.ps";
25. Replace this path with a path to a valid Postscript file.
26. You also need to specify the path used to save the file when it comes back from LiveCycle ES. This is around line 72 and looks something like the code below. Change the path to a location on your system for which you have access.
//Save the PDF file
createdDocument.copyToFile(new File("/Users/duane/Desktop/eclipse/workspace/JavaOne2009-docs/DuanesWorldTest.pdf"));
27. Now run the application. You should see the console output working with no errors. Go to the location you referenced in the previous step and you should find a file there titled “DuanesWorldTest.pdf” or whatever you named your file.
Congratulations – you have just invoked your first remote SOAP endpoint using LiveCycle ES!
Labels: Adobe LiveCycle ES, distiller, java, SOAP







