Subscribe to my full feed.

I recently blogged on how to convert Salesforce.com IDs using Apex and Visualforce, but as it turns out, many readers are more interested in actually converting IDs, and less interested in understanding how it works. ;)

So by popular demand, I've made a converter in Excel that takes your 15-character Salesforce.com IDs and converts them to the 18-character IDs.

Download the file, paste up to 25 15-character IDs at a time, and the sheet will give you the 18-character version using Salesforce's conversation algorithm.

It's protected (to avoid unintentionally overwriting a formula), but no password, so if you're Excel-savvy, feel free to pick it apart and modify it (for instance, if you want to do 5000 IDs at a time).

Enjoy - and click here to download.

My in-laws are Bosnian, and have been living in Mexico for the past 15 years. They don't speak English, and no, I don't speak Bosnian or Spanish. For a long time, this meant infrequent conversations with translation provided by my wife or her brother.

More recently, Google Translate has been doing the heavy lifting for me. My in-laws write to me in Bosnian, I put it through the Croatian (very similar language) translator on Google translate, and it gets most of the meaning across.

I then compose in English, put it through Google Translate into Spanish (according to my wife, the Spanish translation is much more accurate, which makes sense), and send back. It can be tricky, but it gets the job done, and has done a great job and breaking the language barrier.

So I'm intrigued by recent speculation that GMail will offer one-click translation as part of its 5th anniversary celebration. Although it wouldn't translate better than than my current process, it would save me quite a bit of copy/paste time. Here's hoping!

I'm a big Skype fan - I use it to videoconference with my brother in S. Korea (teaching english for 2 years), my parents use it as free long distance (instead of their cell phones, I guess), and it's also one of my two instant messaging apps (the other being Google Talk, of course).

But up until now, it's been the only method of communication in my life that wasn't iPhone-compatible. Take a look:

1. Call me on my cell? iPhone rings or has your voicemail.
2. Email me at work? iPhone links to Exchange.
3. Leave me a voicemail on my WORK number? Cisco VOIP phone puts it in my inbox - on my iPhone.
4. Write me a personal email? Gmail has it - on my iPhone.
5. IM me on Google talk? iPhone does that too.

(And no, I don't have a land line).

But what to do with Skype? No matter - tomorrow, Skype will be releasing Skype for iPhone on the App Store - I'm not holding my breath for video calls, but the chat and voice features would be great - and I'll be first in line for the download.

If you want to sing out, sing out, and if you want to be free, be free, cause there's a million ways to be, you know that there are...
- Cat Stevens
And now there's one more way to be free...

I use GMail to manage all of my email addresses. For example, if you send an email to my old college email address, it will show up in my GMail inbox, and when I hit reply, it will appear to have come FROM my school account - seamlessly. I love it.

But there is one catch - your alternate email provider MUST support the POP3 protocol - something that Microsoft Hotmail did not, at least until now.

With Hotmail now supporting POP3, you can now have your hotmail emails go TO your GMail inbox, and when you hit reply, it will reply using your HOTMAIL address.

So if you've been clinging desperately to your Hotmail account - it's time to be free!

Instructions here. Lolcat of happiness below.

The Unofficial GoogleSystem blog has posted a list of content that Google does NOT allow other search engines to index, through the use of robots.txt files. Although some of the items are common sense (indexing search result pages would clutter results), or privacy issues (indexing Google Docs content would make those docs public), there are a few items listed as "unfortunate" exclusions:

* the LIFE photo archive, which is only available in Google Image Search. "It's disappointing that Google gets exclusive access to index these images and every other search engine is out of luck. Exclusivity like this doesn't seem in line with Google's philosophy," says Andy Baio.
Is Google being Evil? Andy seems to think so. I disagree.

Google has made more unique content available to the public in an organized, searchable format than (I suspect) all the other search engines combined. I appreciate that, as well as Google's openness in almost all cases. But I'd like to remind Andy of three realities to consider:
  1. The restrictions on sharing content such as the LIFE photo archive MAY be contractual. Google may have had to choose between an exclusive bank of images, or no images at all. Much as iTunes had to start out with 100% DRM-protected songs from a small group of major labels, Google may have to start with more restrictions, to "ease" these companies into the 21st century. But I'm glad they chose to at least go this far!
  2. Google has the goal of indexing the world's information. It can't do this if it does 100% of the heavy lifting, but shares the benefit with other competing search engines. Google has a proprietary search algorithm, it has some proprietary content. This impacts its competitors - not the public it is serving. That works for me.
  3. And yes, Google IS a public corporation. Although it successfully (I think) has balanced the ideals of profit and "not being evil", it just can't be completely altruistic without going out of business - and thus failing in it's task (of indexing the world's information).
Let's cut Google some slack on this one - I can access it, you can access it, and Yahoo can't. That gives Google a competitive advantage, enhancing performance, enhancing it's ability to bring me and you more great content in the future. Definitely NOT Evil.

I've always appreciated Google's candor when releasing new features - the endless betas, and the flat out admissions of "this is new - and might not work right - but you can try it out!" are a great way to show the value constantly coming out of the Google R&D team, without the long waits for "major releases". That's the great thing about Cloud Computing - incremental, continuous, unobtrusive upgrades. If you don't need it, you don't even need to notice it!



I laughed out loud the first time I clicked the "Find and Replace" option in Google docs, and saw the following caveat:


I love it - "Find and Replace...but really just Find at the moment"! I appreciated simply knowing that better things were coming. And as of yesterday, they have!


Google Docs now has a Find and Replace toolbar that also takes regular expressions as search criteria - all accessible with keyboard shortcuts.

It's finally HERE!

I'd never been a fan of the "classic" version, and it's "Click a button, get a huge list" approach to browsing applications. Ever since the early days of EBay, I find myself quite irritated by any site that doesn't provide convenient filters to help me narrow my search, or brings me to product pages that feel like (informational) dead ends. As soon as the preview site was up for the new AppExchange, I was waiting with baited breath!

The new site is great - more categories, endless filters, and a much more immersive and interactive experience on the product pages. And of course, it's been built using Force.com Sites - I love a company that drinks its own Kool-Aid!

Check it out - I found a number of great apps that I never knew existed, with just a few mouse clicks (and testing one of them today). Highly recommended.

Executive Sponsorship is critical to any CRM implementation. We all know this. Yet, for executives new to CRM initiatives, system initiatives, or all of the above, there may be very little understanding of what their exact role in sponsorship must be to ensure success.

Model Metrics has provided a great whitepaper called "CRM for CEOs" that provides an excellent overview for executives. It's a strategic "How To" guide that lays out areas of focus, best practices, and (most importantly for executives) the business drivers and benefits of each.

It's also a great read for other members of your CRM implementation team and impacted business unit managers - a great reminder of the big picture your business is trying to achieve, and how each piece of the puzzle contributes.

PS - For anyone not familiar with Model Metrics, these guys are one of Salesforce.com's most diverse and innovative implementation partners, making this well worth the read. Enjoy!

This one is for the true database geeks out there - a 60 minute webinar on the guts of Salesforce.com's multitenant architecture.

Indexes, table partitioning, query optimizing, the application stack - it's all here.

I'll be honest - I only stayed on top of about half of the material - but that's the beauty of the Force.com platform - customers are shielded from all of the sophisticated, complicated, miraculously innovative hardware, database, and software kernel details, so there's really no need.

But for those of you who do this professionally, have a great time geeking out on this - fascinating stuff. Here is the link to the webinar, the FAQ, and the whitepaper - enjoy!

Ever wondered what the big deal is with Cloud Computing? Or just wondering what this catchy phrase actually MEANS to your business?

I came across an excellent clip on YouTube (below) that does a great job of breaking it down in a fun and effective way - it's well worth the 3 minutes, no matter what you level of expertise - enjoy!


This is Part 5 of 5 in my series on converting 15-character Salesforce IDs seen in the Salesforce UI into the 18-character IDs seen in results from the Data Loader and API calls. You can start at Part 1 here.

Wrapping this up - we have the problem, the solution, the solution code, and the visualforce. Let's display it on the homepage.

You have two options:

Option 1: Put in on the main section of the home page.
Pros: Can HIDE the "Developer mode" section that gets in the way
Cons: Have to go to the home tab to use the widget.

Option 2: Put it in the Sidebar
Pros: It's there for you throughout the application (if your sidebar settings allow)
Cons: have Developer mode turned on? Then this won't work.


Either way, here's the process:
1. Create a custom home page component. (Setup->Customize->Home->Home Page Components->New->HTML Area)

2. Select which part of the page you'd like it on - Wide (main), or Narrow (sidebar).

3. Click "Show HTML", and enter the code below:

<iframe src="/apex/IDconverter" height="150" width="100%"></iframe>

Note that you should replace the src="" with whatever the address for your Visualforce page is.

Scott Hemmeter from ArrowPointe shared a great trick on his blog to disable developer mode on this page so your homepage component displays correctly. As he mentions, this is "unofficial" functionality, so could stop working at any time.

It's simple - just add "?core.apexpages.devmode.url=1" to the address above, resulting in "/apex/IDconverter?core.apexpages.devmode.url=1".

As I mention in the pros/cons above, this worked for me on my main homepage - but NOT in my sidebar (although others have had better luck). Best of luck to you!

And that's that. Now, my admins have a little widget to let them quickly answer the dreaded "What's the 18-char ID of the record" question we get when working with IT. Here it is:



And that's the end of that - hope you found it helpful - we'll have to do this again some time.


This is Part 4 of 5 in my series on converting 15-character Salesforce IDs seen in the Salesforce UI into the 18-character IDs seen in results from the Data Loader and API calls. You can start at Part 1 here.

Part 2 covered the Apex code snippets necessary to convert an ID. In this section, we'll cover the Visualforce markup and remaining Apex code to make it all work.

Ironically, even though the entire purpose of this project is to create a Visualforce page to convert IDs, the actual "Visualforce page" was almost no work.

Here is the basic interface:



And the equally simple markup:


It's all Visualforce 101:
1. Enter a value in an inputText field (our 15-char ID)
2. Click the commandButton to call the custom controller code
3. The controller returns the 18-char ID in an outputLabel
4. The outputPanel re-renders so the result is seen by the user

So in addition to the code covered in Part 3, I added getter and setter methods to pass the ID values back and forth, and a pageReference method that responds to the button click. You can check out the final controller code here.

The last step will be to embed the Visualforce page somewhere useful, where my administrators will always have quick and immediate access to it - say, as a custom sidebar component. That - along with a hack to disable developer mode - will be the wrap-up in Part 5.

This is Part 3 of 5 in my series on converting 15-character Salesforce IDs seen in the Salesforce UI into the 18-character IDs seen in results from the Data Loader and API calls. You can start at Part 1 here.

In Part 2, we walked through the algorithm for converting the ID. Now Part 3 will cover the basic pieces of doing it in Apex. (code improvement suggestions welcome!)

Block 1: Convert to Binary
1. Take each letter in a 15-character string
2. Convert it to binary (1 for capital letter, 0 for anything else)
3. And put it back into a 15-character string (backwards, as required)



Block 2: Function for converting 5-character binary strings
1. Create a big ugly map (binary chunks to a letter)
2. Use the chunk you passed in to get a letter from the map
3. Return the letter



Block 3: Build the result string
1. Start with the original 15-character string
2. Convert the binary string 5 characters at a time (with the above function)
3. Append the resulting letter to your final string

And that's it! Following the algorithm published by Salesforce (see Part 2 for details), we converted a Salesforce ID into binary, reversed it, and used 5-character chunks against a map to get the final 3 letters of the new, 18 character ID.

In Part 4 we will put this Apex into a Visualforce controller, along with a simple page.

All I ever wanted from Apple was a powerful Mac Mini, so I could buy a 30" Apple monitor to go with it. Instead, I've been buying a string of powerful iMacs, and waiting for the eventual upgrade that would give the Mac Mini the same guts as an iMac.

Good News: I got my wish!
Bad News: The pricing is outrageous!

While Dell thinks that the hardware in a (maxed out) Mac Mini should cost under $500, Apple has priced that same configuration at $1147 - a 130% premium.

I've never had a problem paying a premium for Apple products. But this is insane.

Final verdict on the new Mac Mini:

This is Part 2 of 5 in my series on converting 15-character Salesforce IDs seen in the Salesforce UI into the 18-character IDs seen in results from the Data Loader and API calls. You can start at Part 1 here.

It turns out that learning the "secret formula" for converting a 15-character ID into an 18-character ID is as easy as searching for "how do I convert an ID" in the Salesforce help screen. The resulting solution accurately describes the process, although it isn't exactly written in a way that makes it immediately clear how the process works (no "ah ha!" moments here...).

Luckily, they include an example, which I will share (in a simple form) below.

Side Note: If anyone is reading this, and needs to convert the 18-character ID BACK to the 15-character ID, there is no algorithm required - just chop off the last 3 characters! There - I just saved someone the pain of trying to do the steps below in reverse... ;)

Step 1: Get the 15-character version of the ID, in this case "500x000000003TR"

Step 2: Convert to 1's and 0's. Rule: Capital letter get's a 1, anything else gets a 0.
500x000000003TR becomes
000000000000011

Step 3: Split into 3 chunks of 5 characters, and REVERSE the order of the characters in each group:
00000 becomes Chunk 1: 00000
00000 becomes Chunk 2: 00000
00011 becomes Chunk 3: 11000

Step 4: Use the key below to convert each chunk to a Letter (you can use the chunk, or convert the chunk from binary into decimal - whatever you prefer)
Binary Decimal Matching
Chunk Chunk Letter
00000 0 A
00001 1 B
00010 2 C
00011 3 D
00100 4 E
00101 5 F
00110 6 G
00111 7 H
01000 8 I
01001 9 J
01010 10 K
01011 11 L
01100 12 M
01101 13 N
01110 14 O
01111 15 P
10000 16 Q
10001 17 R
10010 18 S
10011 19 T
10100 20 U
10101 21 V
10110 22 W
10111 23 X
11000 24 Y
11001 25 Z
11010 26 0
11011 27 1
11100 28 2
11101 29 3
11110 30 4
11111 31 5

In our case:
Chunk 1(00000) becomes "A"
Chunk 2(00000) becomes "A"
Chunk 3(11000) becomes "Y"

Step 5: Add the converted chunks, in order, to the end of the original 15-character ID:
500x000000003TR becomes 500x000000003TRAAY

And there it is. The non-case-sensitive version of 500x000000003TR is 500x000000003TRAAY.

Salesforce is very friendly about using either version of the ID - you can use the 15-char or the 18-char version anywhere - in the URL, in the Data Loader, via the API, etc.

But for my IT group, who stores SFDC IDs in a non-case-sensitive table (try getting them to change that!), it's the 18 character version or nothing.

And that's where babies 18-character IDs come from.

Stay tuned - in Part 3, we'll turn the process above into Apex Code!

Salesforce.com record IDs come in two flavors. The flavor you see in the browser is a 15-character, case-sensitive version. The flavor you see when using the data loader or other API-based tools is an 18-character non-case-sensitive version.

So when troubleshooting integrations, and our IT department says "Can you provide some sample IDs?", we needed a way to quickly take the 15-character ID we were staring at in the browser, and convert it to an 18-character version that our (non-case-sensitive) IT department could reference in their data warehouse.

Initially, we used the Data Loader to get this info. As in:

SELECT
Id
FROM
Contact
WHERE
Id = 'Insert 15-char ID here'

That would return the 18-character version, and all was well. But to open the data loader, grab my security token, select an object and an export file, type the code, etc was just too much work.

Luckily, Salesforce publishes the algorithm used to convert from the 15-character version to the 18-character version (which is really just the 15 character version with 3 additional characters appended).

This week, I'll be exploring the published algorithm, creating an Apex Class to do the conversion for me, with a Visualforce front end. Stay tuned!

(Disclaimer: As always, I'm sure there is an easier way to do this - at least I'd imagine so. Even if there was, I'd still do it this way, just for fun!)

;;