We Do Ruby
We are happy to announce that with the acquisition of Heroku and impending integration of Database.com we are now accepting projects in Ruby.
We are happy to announce that with the acquisition of Heroku and impending integration of Database.com we are now accepting projects in Ruby.
Our technical blog at fractastical.com is the best place to find more current information on on-going projects, etc.
Shortly after the announcement of Google Wave I flew out to the Bay Area for the introductory hackathon. I was intrigued, in fact fascinated by the idea of a federated protocol layer to replace email, something that could empower collaboration and community building by distributing power across multiple nodes, instead of the overly centralized and unsecure model of Facebook or the defunct mode of email. A new form of communication was desperately needed and Wave seemed to bring together all the missing pieces for what could be a new era in computing and collaboration.
While most people talk about the product when they speak of Google Wave (as at the Harvard Business Review ), they show their lack of appreciation for what Google Wave was below the surface. Fundamentally, ultimately, Google Wave was a new way of looking at the world. It was in many ways a protocol with no particularly good interfaces, largely because it was so ambitious and because efforts were made to popularize Wave rather than finish promised work on core functionality.
This is unfortunate. While I was upset when I first read of the decision to “kill” Google Wave, I now feel that there is, in fact, even more potential. Approximately a month ago the Google Wave Developers blog promoted a new independent attempt to create a Google Wave powered online forum. Despite the recent announcement of Google Wave’s death, it seems that many people were inspired by Google Wave and will keep development moving forward.
What will they create? I’m afraid I must disagree with this posting on the Salesforce Developer Blog. Surely, some concepts (like online facebooks) require time to be appreciated and understood, but this is all the more reason for persistence, not giving up when there is no immediate response to an unfinished product. Sadly, it seems Google’s CEO never understood Wave. It was not a clever product, it was a vision in search of a product. And this unmaterialized vision that required more than a keynote speech, bit of marketing, and hope for rapid mass adoption.
The wider developer community waits and hopes that Google remains true to its original promise to open source the “lion’s share” of its code, including a working server and client. It is understandable that Google would take the great innovation started with Wave and roll it into its own products, but how can they say the problem is “user adoption” if they never delivered the tools originally promised?
Joel Dietz, Founder and CEO of Titania, Inc. has contributed to the Wave Protocol, edited articles on Operational Transformation, and developed multiple Google Wave Robots and Gadgets in his spare time.
Cross posted at Joel’s Developer Blog.
We are Titania, bringing the best of open source to the enterprise. We are happy to launch a new website and announce partnerships with Salesforce and AppendTo, the jQuery company. Please check our pro support package and new products available on the App Exchange.
As noted on twitter, the release of Formation was delayed somewhat due to client request. I’ve been using the extra time to add in some more sugar and spice.
In this case, enhanced JQuery powered labels with tooltip icons:
<c:enhancedLabel label="Style:" tooltip="Please visit http://ui-enhancements-developer-edition.na7.force.com/ to see what form elements will look like" for="Style" renderIcon="true"/>
Looks like this:
I will include a couple additional stylesheets. Credits famfam for the icon.
Tags: famfam icon enhanced label salesforce visualforce component
Titania maintains an open source library of jQuery powered user interface components which provide enhancements to the Salesforce native elements as well as integration with the Salesforce native elements. We also provide a professional support package for each of these elements.
Standard functionality works like so:
<c:enhancedText pageController="{!this}" fieldName="Text__c" validateAs="name" />
Why would you want to use this library? Please take a look at this video:
To use this on a standard controller all you need is an extensions class that extends PageControllerBase, which includes all of the extra goodies.
public class myController extends PageControllerBase {
Default functionality includes automatic client side validation. All you need to do is add an action function to run the included save method:
<apex:actionFunction action="{!pageController.ecSave}" name="saveMe"></apex:actionFunction>
Then include the validation code:
<apex:outputText escape="false" value="{!pageController.completeJavascript}"/>
Yep, that’s all you need. Everything else is added automatically (see this article for an explanation of the architecture).
Please read the full instructions here.
A live demo is available here. Please use and contribute!
Complete source is available on Google Code (along with the soon to be launched Formation).
Tags: salesforce enhanced components datepicker lookup autocomplete jquery
If you are like me you may have come across some of these terms, “Salesforce Sites user,” “Customer Portal User,” “Authenticated Website User,” “High Volume Portal user” and been rather confused. Actually, as far as I can tell, the evolution of these terms is fairly straightforward and revolves around access and pricing.
First, you have the Customer portal user used for support related login information. Then, when Salesforce released Sites they used the Customer portal account system to provision accounts for Sites. This led to some overlap in names. For example, in order to get Salesforce Sites working you need to first enable accounts with the Customer Portal. With the Winter ’10 release Salesforce formally released a high volume portal user in order to allow different pricing models for high volume customers (including a per-login pricing model). Because this was confusing, in Spring ’10 released another “Authenticated Website User” which was exactly the same as the high volume portal user but had a name that wasn’t obviously connected to the customer portal.
Make sense?
Perhaps not, but what you need to know is that, for all practical purposes:
Salesforce Sites user = Authenticated website user = High volume portal user
Each is also a portal user with more limited capabilities than your standard portal user. You can read about those limitations here.
That said, authenticated website users and high volume portal user exist as separate profiles so they can be customized to have different levels of access. The intended usage relates to the aforementioned history, with portal users most likely requiring more access than your average authenticated user (although this depends entirely on your application). As for pricing, this does not appear to be standardized.
Keep in mind that you also can have a Sites guest and there is also a guest profile for every non-user that accesses your site. So at least in my lexicon Sites User != Sites Guest, since the guest does not have a unique account.
Tags: authenticated sites user, authenticated user, authenticated website user, customer portal, high volume portal user, portal user, sites
Because I have standard naming conventions and often reuse static resources in different projects, I occasionally have the problem of finding that static resources which are automatically attached to an unmanaged package give me a nasty error when I try to install the managed package because of the existing static resources.
Here’s the easiest way I’ve found to deal with the problem:
(1) Right click on your project in the Force.com IDE -> Refresh from Server. Now you have the latest version of everything
(2) In the web interface go to Develop -> Static Resources -> Edit -> Rename all of the conflicting Static Resources to myStaticResourceB. Note: Unlike classes, this searches pages and components and automatically updates references to the Static Resources to the new name.
(3) Install your unmanaged package
(4) Right click on your pages and staticresources folders and Force.com -> Save to Server.

(5) When you get this message click “Yes” (that’s the whole point, you want to override the automatic changes made by Force.com to point to myStaticResourceB)
(6) Delete all of your old Static Resources (either through the web interface or Force.com IDE, whichever is faster for you).
While I realize lots of people love to upload their Static Resources one at a time from the web based interface, this can be a bit time consuming. Here’s how you pop them up into Salesforce from Eclipse.

First, if this is a static resource you already have in another project, it is super easy:
(1) Copy myStaticResource.resource file and myStaticResource.resource-meta.xml from yourWorkspace/project1/staticresources to yourWorkspace/project2/staticresources
(2) Open up Eclipse, right click on the project and click refresh, and you should see myStaticResource in your staticresources folder.
(3) Right click on myStaticResource -> Force.com -> Save to Server.
Oila! (Note: you can also do this with massive numbers of files at once, my preferred method)
Dealing with a new file is a little bit more tricky but not all that tricky.
(1) Find the items you want to go into a zip file.
(2) Compress them (see note at the end for my preferred method).
(3) Change the extension from .zip to .resource (on a mac this is achieved by pressing Command-I then changing the name).
(4) Move to yourWorkspace/myProject/staticresources folder
(5) Copy existing ‘resource-meta.xml’ file for another zipped static resource from any project. (if you don’t know find the file in Eclipse, open it and check that the contentType is ‘application/x-zip-compressed’)
(6) Rename this file ‘myStaticResource.resource-meta.xml’
(7) Open up Eclipse, right click on the project and click refresh, and you should see myStaticResource in your staticresources folder.
(8) Right click on myStaticResource -> Force.com -> Save to Server.
Random note: These days on OS X I go into the folder, select the files, and choose compress rather than right clicking on the folder so you don’t have to put the folder name in the path when you are referring to a static resource via URLFOR. You can easily find the path to any file in your archive by running ‘unzip -l myStaticResource.zip’ on the command line.
Additional note: my desktop background is from this site.
Tags: eclipse, force.com ide, static resource, upload, zip
My informal querying of Force.com developers reveals that with VMForce there are currently more questions than answers. While Salesforce sought immediately to dispel some of the questions that Visualforce/APEX would be left behind, in the fast paced sink or swim world of internet technology, a couple people on a dingy with paddles will soon be overtaken by those with the first available on-board motor.
Which raises the question of just who Salesforce is competing with. Is Salesforce, as the Appirians suggest, simply providing a gilded road into their cloud by allowing greater compatibility with legacy JAVA apps and providing “even hesitant enterprise CIOs” with a place to start? Or is it, as suggested on Javaworld, “an audacious jump to get Salesforce.com away from its ERP roots and into the general-interest cloud territory being staked out by Google and Amazon” ? Perhaps ZDNet has the best discussion of the issues: if Salesforce is truly “embracing the cloud” here, then they “pragmatically trades scalability of a unitary architecture for scalability through a virtualized one,” it also “morphs into a different creature.”
But even here it is not clear what new creature this is (see image). Salesforce can no longer simply compete with Oracle business applications, can it realistically think to match Amazon or Google to be a leader in a PaaS (Platform as Service) race? While it is one thing to take potshots at Microsoft’s failures in this regard (something I’d be all to happy to do myself), it seems clear that Microsoft will not be leading this pack.
While Mike Leach may be right to say that taking a step back may not be such a bad thing, Wes Nolte correctly summarizes the relative strengths of Google’s Web Toolkit in what one might consider Salesforce’s core area of strength and Force201 questions whether or not the 5x statistic regarding development speed holds for more than very short projects. Moreover, it’s been bandied about in various places that the primary venues for soliciting input about changes to Force.com, such as the Salesforce Idea Exchange, respond more closely to the needs of users and admins (who outnumber developers).
How can Salesforce emerge the heavyweight champion in the battle for the Enterprise cloud? I’d recommend the following:
(1) Articulate more clearly the gameplan to the developer community
Mike Leach has a great set of questions which I look forward to seeing the answers to.
(2) Develop a clear resource based pricing model to accompany VMForce, with decreased costs as bandwidth increases
As Wes Nolte also notes, the obvious answer for developers working off of PaaS is resource based pricing, which is clear and transparent in the case of Google and Amazon, but a bit murkier in the case of Salesforce.
(3) Improve developer tools
I’m 110% behind everything articulated by Wes in this article. Number 1 bugaboo: things are slow.
(4) Work off of existing Salesforce strengths
Tight integration between the code/platform and security are musts for many use cases.
(5) Leverage Chatter
Chatter is great, but could be better if, as I articulated at Cloudforce NYC last month, the benefits of social media technology for the enterprise were better articulated. Just how exactly do these technologies improve productivity? While we’re at it, why not extend the Chatter Dev Zone to include formal processes for developer feedback and/or bug tracking?
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
| « Jun | ||||||
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | |||