Thursday, December 08, 2011

Using Google Translate from VFP

Stonefield Query is a localizable application: all strings displayed to the user are stored in a resource file and we provide a resource editor that allows a developer to translate the strings into other languages. This means that someone has to do the translation into a particular language and keep it update to date when we release a new version, which as you can guess is a lot of work.

Inspired by Christof Wollenhaupt’s Googlefy Your Apps session at Southwest Fox 2011, I looked at using the Google Translate API to automate the translation process and allow us to translate into more languages than have currently been done. It actually turned out to be pretty easy.

First, you have to sign up for a Google account. The Translate API isn’t free but it isn’t very expensive: $20 for 1 million characters. After you’ve enabled the API, you’re assigned a key that has to be passed to the API on every call.

The API uses REST, which is a fancy of way of saying that the parameters are passed as part of a URL. Here’s an example:

https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&q=hello%20world&source=en&target=de

This tells the API to translate “hello world” (the encoded text in the “q” parameter) from English (“en” in the source parameter) to German (“de” in the target parameter). It returns the result as JSON:

{ "data": { "translations": [ { "translatedText": "Hallo Welt" } ] } }

To access the API from VFP code, use Craig Boyd’s VFPConnection library. Below is a function that does all the work. Pass it the text to translate and the source and target languages (spelled out, such as “English” and “German”) and it returns either the translated text if it succeeded, null if the language is invalid, or blank if the translation failed. This function supports all of the languages the Translate API supports. Note: replace the assignment to lcKey with your Google API key.

Automatic translation may not be quite as good as manual translation because it doesn’t necessarily use the same colloquialisms a native speaker would. However, it’s an excellent starting point; someone can use the Resource Editor to tweak any strings to the proper translation.

lparameters tcPhrase, ;
    tcFromLanguage, ;
    tcToLanguage
local lcKey, ;
    lcPhrase, ;
    lcFromLanguage, ;
    lcToLanguage, ;
    lcURL, ;
    lcResult, ;
    lcTranslate

* Specify the Google API key.

lcKey = 'PUT YOUR KEY HERE'

* HTML encode the phrase to translate.

lcPhrase = Encode(tcPhrase)

* Get the language codes.

lcFromLanguage = GetLanguage(tcFromLanguage)
if empty(lcFromLanguage)
    return .NULL.
endif empty(lcFromLanguage)
lcToLanguage = GetLanguage(tcToLanguage)
if empty(lcToLanguage)
    return .NULL.
endif empty(lcToLanguage)

* Set up VFPConnection.

set library to VFPConnection.FLL

* Call Google Translate and return the result.

lcURL       = 'https://www.googleapis.com/language/translate/v2' + ;
    '?key=' + lcKey + ;
    '&q=' + lcPhrase + ;
    '&source=' + lcFromLanguage + ;
    '&target=' + lcToLanguage
lcResult    = HTTPSToStr(lcURL)
lcTranslate = ''
if not empty(lcResult)
    lcTranslate = strconv(strextract(lcResult, '"translatedText": "', '"'), 11)
endif not empty(lcResult)
return lcTranslate


function Encode(tcString)
local lcString
lcString = strtran(tcString, '<', '&lt;')
lcString = strtran(lcString, '>', '&gt;')
lcString = strtran(lcString, '"', '&quot;')
lcString = strtran(lcString, '&', '&amp;')
lcString = strtran(lcString, ' ', '%20')
lcString = strtran(lcString, '?', '%3F')
return lcString


procedure GetLanguage(tcLanguage)
local laLanguages[52, 2], ;
    lnLanguage, ;
    lcLanguage
laLanguages[ 1, 1] = 'Afrikaans'
laLanguages[ 1, 2] = 'af'

laLanguages[ 2, 1] = 'Albanian'
laLanguages[ 2, 2] = 'sq'

laLanguages[ 3, 1] = 'Arabic'
laLanguages[ 3, 2] = 'ar'

laLanguages[ 4, 1] = 'Belarusian'
laLanguages[ 4, 2] = 'be'

laLanguages[ 5, 1] = 'Bulgarian'
laLanguages[ 5, 2] = 'bg'

laLanguages[ 6, 1] = 'Catalan'
laLanguages[ 6, 2] = 'ca'

laLanguages[ 7, 1] = 'Chinese Simplified'
laLanguages[ 7, 2] = 'zh-CN'

laLanguages[ 8, 1] = 'Chinese Traditional'
laLanguages[ 8, 2] = 'zh-TW'

laLanguages[ 9, 1] = 'Croatian'
laLanguages[ 9, 2] = 'hr'

laLanguages[10, 1] = 'Czech'
laLanguages[10, 2] = 'cs'

laLanguages[11, 1] = 'Danish'
laLanguages[11, 2] = 'da'

laLanguages[12, 1] = 'Dutch'
laLanguages[12, 2] = 'nl'

laLanguages[13, 1] = 'English'
laLanguages[13, 2] = 'en'

laLanguages[14, 1] = 'Estonian'
laLanguages[14, 2] = 'et'

laLanguages[15, 1] = 'Filipino'
laLanguages[15, 2] = 'tl'

laLanguages[16, 1] = 'Finnish'
laLanguages[16, 2] = 'fi'

laLanguages[17, 1] = 'French'
laLanguages[17, 2] = 'fr'

laLanguages[18, 1] = 'Galician'
laLanguages[18, 2] = 'gl'

laLanguages[19, 1] = 'German'
laLanguages[19, 2] = 'de'

laLanguages[20, 1] = 'Greek'
laLanguages[20, 2] = 'el'

laLanguages[21, 1] = 'Hebrew'
laLanguages[21, 2] = 'iw'

laLanguages[22, 1] = 'Hindi'
laLanguages[22, 2] = 'hi'

laLanguages[23, 1] = 'Hungarian'
laLanguages[23, 2] = 'hu'

laLanguages[24, 1] = 'Icelandic'
laLanguages[24, 2] = 'is'

laLanguages[25, 1] = 'Indonesian'
laLanguages[25, 2] = 'id'

laLanguages[26, 1] = 'Irish'
laLanguages[26, 2] = 'ga'

laLanguages[27, 1] = 'Italian'
laLanguages[27, 2] = 'it'

laLanguages[28, 1] = 'Japanese'
laLanguages[28, 2] = 'ja'

laLanguages[29, 1] = 'Korean'
laLanguages[29, 2] = 'ko'

laLanguages[30, 1] = 'Latvian'
laLanguages[30, 2] = 'lv'

laLanguages[31, 1] = 'Lithuanian'
laLanguages[31, 2] = 'lt'

laLanguages[32, 1] = 'Macedonian'
laLanguages[32, 2] = 'mk'

laLanguages[33, 1] = 'Malay'
laLanguages[33, 2] = 'ms'

laLanguages[34, 1] = 'Maltese'
laLanguages[34, 2] = 'mt'

laLanguages[35, 1] = 'Norwegian'
laLanguages[35, 2] = 'no'

laLanguages[36, 1] = 'Persian'
laLanguages[36, 2] = 'fa'

laLanguages[37, 1] = 'Polish'
laLanguages[37, 2] = 'pl'

laLanguages[38, 1] = 'Portuguese'
laLanguages[38, 2] = 'pt'

laLanguages[39, 1] = 'Romanian'
laLanguages[39, 2] = 'ro'

laLanguages[40, 1] = 'Russian'
laLanguages[40, 2] = 'ru'

laLanguages[41, 1] = 'Serbian'
laLanguages[41, 2] = 'sr'

laLanguages[42, 1] = 'Slovak'
laLanguages[42, 2] = 'sk'

laLanguages[43, 1] = 'Slovenian'
laLanguages[43, 2] = 'sl'

laLanguages[44, 1] = 'Spanish'
laLanguages[44, 2] = 'es'

laLanguages[45, 1] = 'Swahili'
laLanguages[45, 2] = 'sw'

laLanguages[46, 1] = 'Swedish'
laLanguages[46, 2] = 'sv'

laLanguages[47, 1] = 'Thai'
laLanguages[47, 2] = 'th'

laLanguages[48, 1] = 'Turkish'
laLanguages[48, 2] = 'tr'

laLanguages[49, 1] = 'Ukrainian'
laLanguages[49, 2] = 'uk'

laLanguages[50, 1] = 'Vietnamese'
laLanguages[50, 2] = 'vi'

laLanguages[51, 1] = 'Welsh'
laLanguages[51, 2] = 'cy'

laLanguages[52, 1] = 'Yiddish'
laLanguages[52, 2] = 'yi'

lnLanguage = ascan(laLanguages, tcLanguage, -1, -1, 1, 15)
if lnLanguage > 0
    lcLanguage = laLanguages[lnLanguage, 2]
else
    lcLanguage = ''
endif lnLanguage > 0
return lcLanguage

Monday, December 05, 2011

Southwest Fox 2012

Southwest Fox 2011 was a great success. Now we’re trying to figure out what form next year’s event will take. You can help us by answering a few questions about your preferences. Please take the survey at https://www.surveymonkey.com/s/VCCKNDG, so we can include your input.

Whether you attended Southwest Fox this year, or it’s been a few years, or you never attended Southwest Fox, your input will really help us figure out what direction to take next year and in the years to come.

Tuesday, November 08, 2011

Southwest Fox 2011, Day 4

I planned on attending a couple of sessions Saturday morning, but ended up having a long chat with Toni Feltman and Steve Bodnar about .Net development, unit testing, version control, and other stuff. Again, this is one of the special things about conferences in general—discussions with other developers to help get a fresh perspective on things, solve problems, and spark new ideas—but especially SWFox: since we require all speakers to provide detailed white papers for their sessions, you still get the full benefit of all sessions whether you attend them or not. That makes the networking opportunities at SWFox even more valuable.

The one session I couldn’t miss, of course, was my own: the repeat of my ActiveX controls session. This time, I took special care to not miss any steps in my demo, so the attendees were cheated out of the opportunity to see a speaker squirm and learn from their mistakes. Sorry, guys!

The closing session was short but sweet. One of the things we discussed was 2012.

image

As many people suspected, this was a tough, scary year for us. By mid-August, we were in full panic mode, as we were so far below breakeven that it looked like a five-figure loss for us. Fortunately, a larger-than-usual number of people signed up after September 1; that combined with an increase in sponsorship this year took us over the top. However, we’re really concerned about next year: if the trend of decreasing attendance continues, 2012 could be a disaster.

So, one of the questions on our conference evaluation form was what type of format would attendees like for a future event: the traditional SWFox format, a less expensive “Code Camp” style (volunteer speakers, no food provided or perhaps sponsored food), an even less expensive one-track format (all sessions in a single room), etc. The reason for asking this question is to try to find out what we can do to minimize our risk. If we get the same number of people registered for 2012 as 2011 but they all register in June or July, there’s no panic and we can have the same format we’ve always had. But if the attendance goes down or people defer registration until fall like happened this year, we have to make adjustments so we don’t face an enormous loss. We don’t know what the answer to this is yet, but the takeaway from the closing session is that we did make a commitment to host an event in 2012.

Of course, asking people who paid a premium price to attend a premium conference doesn’t necessarily mean you’ll get the same answers as you do from those who didn’t attend for whatever reason. So, in the next month or so, we’re going to ask the community what kind of conference they’d like us to put on. When it comes time, please respond to the survey so we can get an accurate feel for what folks want us to do.

One other thing I’d ask: if you love SWFox like we do, and want to see it continue, do us a favor and register early next year. That would take out the panic for us and allow us to plan for the type of conference we really want to host.

I really felt that this was the best SWFox ever. The mood was upbeat, the sessions were amazing, the food was great, the conference center was wonderful … It wasn’t just me: I heard from lots of other people that they felt the same way.

The closing session ended with us giving away thousands of dollars in prizes provided by our sponsors, including some goodies like T-shirts that we threw into the audience (Tamar wisely counseled us against throwing the pins!).

After cleaning up the session rooms, we had lunch with Sharon, our main contact at the hotel and conference center, to do a post-mortem on the conference. We discussed the few things that didn’t work (Internet access and temperature control in the rooms) and the great number of things that did (dedication and hard work of the staff, the food, and the other things that make this a great venue). We also discussed some potential dates for next year.

After that meeting, Rick, Therese, Tamar, Marshal and I had our own meeting to talk a little about 2012, then met a few others (Bo Burban and his son and Steve Bodnar) for dinner. We went to Kona Grill, where Rick and I had some of the best sushi I’ve ever had.

Then it was time for the main event: the long-standing tradition of indoor go-kart racing. About 20 of us showed up at Octane Racing (formerly F1 Race Factory) to compete for the title of fastest racer. With Rick Strahl not driving this year, first place was up for grabs. I thought I did really well, but both Paul Mrozowski and my former employee Rob Eisler (just kidding, Rob!) beat me. In the second race, I finished behind Bo but ahead of Paul. See the Geeks & Gurus Facebook page for photos.

We got back to the hotel by about 11:30, too jazzed up to call it a night yet. Besides, there was still two jumbo bottles of champagne to drink. Which we, of course, did, sitting around the pool. I finally called it a night at about 1:30.

Sunday was kind of anti-climatic, as usual: a nice breakfast with the Schummers and Granors followed by a long day of travel home. I slept almost the entire flight from Phoenix to Minneapolis, something I rarely do.

Thanks to everyone who came to SWFox and made it the best one ever. We’ll see you next year for sure!

Southwest Fox 2011, Day 3

After breakfast, I presented my session on creating ActiveX controls for VFP using .Net. This was a fun session to do because it shows some cool techniques for greatly expanding the list of controls available to VFP applications. This session is pretty complex, so I started by suggesting folks not worry about the details (the white paper has cookbook-like instructions) but focus more on the overview. The session has a lot of complex steps, and sure enough, I missed a step a couple of times and got myself into a little demo trouble. I figured out the first one myself but thank goodness Paul Mrozowski was there to point out the problem with the second one. The audience was very gracious with my gaffes, and someone even pointed out later that they were glad I’d done that so they could see what to do if they missed a step. Of course, I planned that!

I next went to see Kevin Ragsdale’s UI session. I was a little late because, as usual, I was chatting with folks between sessions. Wow, another great session by Kevin. He showed some UI problems common to VFP applications and then showed how to fix them, resulting in a more comprehensible and easier-to-use application. I have a strong feeling I’ll be handing the Best Speaker trophy to Kevin at next year’s conference.

I then went to see Jim Nelson’s session on Thor. If you haven’t seen Thor, a new VFPX project, you’re missing a huge productivity boost in your development efforts. Thor provides a framework for IDE tools, but even more importantly, provides a huge set of such tools to do things such as rename objects, change base classes, and go to the definition of a class, method, procedure, or constant. Jim did a nice job of showing how to install Thor, how the UI works, how some of the included tools work, and how to add your own tools to Thor.

After a nice lunch of hamburgers and hotdogs with all the fixings, I went to Rick Borup’s session on Mercurial. I don’t think Rick knows this, but we call him “The Professor” because his sessions are incredibly well-researched, prepared, and presented. I was thinking later on about how I would’ve done this session and I wouldn’t have done half as well as he did. I’ve been using Mercurial for about six months so I went to this session hoping to have some gaps filled and wasn’t disappointed. Afterward, Toni Feltman expressed amazement that I was finally using a version control system, because she’s been after me for years about it. I think Rick also inspired Tamar to give Mercurial a shot.

Next up was the repeat of my Windows 7 session. Like the first session, I spent some time going over why virtualization (a misnamed term: it refers to redirecting reads and writes to protected locations to “virtual stores” rather than virtual machines as the term is commonly known today) is bad for your health. This led to one of the most gratifying parts of the conference: helping someone resolve a problem. Steve Bodnar mentioned to me after the session that he had a huge problem with a customer system crashing whenever they tried to output to PDF. He suspected the FFC Report Listener class library had somehow become corrupted but replacing it with a fresh version didn’t resolve the problem. During my discussion of virtualization, he realized that it wasn’t the FFC version of the library that was corrupted but the virtualized copy. Sure enough, as soon as he deleted the copy, the application worked as expected. Steve was so happy he Tweeted that he was going to kiss me full on the lips, so I ducked him the rest of the day and evening (just kidding, Steve).

I was beat, so rather than attending a session during the last timeslot of the day, I hung out at the Servoy booth drinking wine with Yvo Boom and Jon Madden of Servoy, Ken Levy, Chick Bornheim of MicroMega, and Chick’s friend Gary, who was attending his first SWFox.

Next it was time for the conference dinner party. Last year, we’d planned on holding the party out on the veranda but a sudden dust storm forced us to quickly move indoors. Fortunately, the weather was in our favor this year, and the dinner was magnificent: superb food and a really nice dark atmosphere. (I would’ve called it “romantic” except my wife wasn’t there and I don’t think Walt Krzystek and the guys from Matrix would’ve appreciated my expressing that point of view.)

At 8:30, the bonus sessions started. I attended the Show Us Your Apps session, which featured six VFP developers showing the crowd an application they’ve developed that they’re proud of. And proud they should be—there were some very cool apps and techniques on display! I was especially impressed by the fact that for several of the presenters, English was not their native language. It takes a lot of courage to get up and speak before a group of technical people, but even more so in a foreign language! Kudos to all those who took the time to show us what VFP is capable of.

The other bonus session was for independent developers, an idea that Rick Borup came up with a few months ago. I heard a lot of great comments about this session, so we may have to do it again next year.

We once again ended up at the hotel bar, this time enjoying some of the leftover cake and champagne from last night’s celebration.

Southwest Fox 2011, Day 2

Thursday started at my usual time of 5 am. After setting out sign boards for the session rooms and registering a few newly-arrived attendees, I had breakfast and went to the first session, Eric Selje’s Lightswitch for VFP Developers. Eric did a great job explaining what Lightswitch is (a tool for rapidly developing Silverlight applications) and showing the basics of developing a Lightswitch application.

I was going to go to Steve Bodnar’s jQueryUI session next but ended up chatting with a couple of the new exhibitors, Basis and Alpha Five, about their products. Fortunately, I’d seen Steve present this session in January. In fact, his presentation inspired me to add new features to the SWFox web site, including the menu and the accordion control on the session pages.

My Developing VFP Applications for Windows 7 session was next. The first half of the session was similar to the Windows Vista session I presented four years earlier, but updated for Windows 7 and with more things I’ve learned about Windows security and virtualization since then. The second half focused on how to implement Windows 7 features in your VFP application, especially related to the Windows 7 Taskbar. I showed how I’ve implemented these features in a real-world application (Stonefield Query) using Steve Ellenoff’s Win7TLib VFPX project, including the actual code to implement those features.

After a very tasty lunch (the food at the Legado is so good, several people commented on Twitter recently about how much weight they gained!), I went to Steve Black’s Looking Back session. Although I don’t work on the type of applications Steve does, it was still interesting hearing his perspective on software development and process management techniques.

At every conference, a common phrase you’ll hear is “that session (or tip) paid for my conference”. Last year, it was Steve Ellenoff’s Win7TLib session for me. This year, it was Kevin Ragsdale’s Easy Multi-Threading session. Kevin is a great speaker: funny, great examples, and well-paced. He showed how to use a DLL created by Christof Wollenhaupt to add multi-threading to VFP applications. Like Steve’s session last year, my mind was abuzz with ideas about where in my applications I can make use of this technique. I know others felt the same way because that was a major point of discussion at every meal I had for the rest of the conference, and even on the taxi ride back to the airport on Sunday. You know you struck a chord when someone as advanced as Rick Strahl is inspired!

By a very happy coincidence, Jody Meyer’s session on ParallelFox immediately followed Kevin’s session. ParallelFox uses a different technique—out-of-process EXE servers rather than in-process COM objects—but has a similar purpose: allowing multiple tasks to be performed simultaneously to take advantage of multi-core processors common in today’s computers. The combination of these two techniques was on everyone’s mind and I saw a lot of very excited people after seeing these two sessions.

The speaker dinner was Thursday night. It’s our small way of thanking the speakers for the enormous amount of time and effort they put into preparing sessions and white papers. As Tamar pointed out at both the keynote and closing sessions, without them, there would be no conference. I had the pleasure of sitting with Rick Borup and his wife, Eric Selje, Menachem Bazian, Steve Ellenoff, and Kevin Ragsdale. Kevin was uncharacteristically quiet; I think he was still in a daze after the dynamite presentation he did in the afternoon. Menachem and Steve were like a tag-team comedy duo; rumor has it they’ll be playing Vegas soon. The food at the Gordon Biersch Brewery at the San Tan Mall was outstanding, as was the hand-crafted beer I tried. Good company, good food, good times.

As usual, we headed back to the hotel bar. Toni Feltman had planned an informal party to celebrate Cathy Pountney marrying Jim Knight this summer. However, she also found out that Alan Griver had recently married Allie (hope that’s the correct spelling) so she quickly picked up a second cake. There was tons of champagne and apple cider to celebrate with. I had an 8:30 session to present in the morning so I headed up just before midnight.

Southwest Fox 2011, Days 0 and 1

I was up early on Tuesday, October 25, to catch a 7:00 am flight to Phoenix. Rick Schummer’s wife Therese picked up Rob Eisler, a co-worker, and me at the airport and we met Rick at the hotel to start assembling conference bags. Normally we arrive on Tuesday when the conference starts on Thursday, but with it starting on Wednesday this year, we’re actually a day later because, in our fifth year of hosting this conference, we’ve got the preparation down to a science. Tamar and Marshal Granor arrived a little later, and we all met with the conference center staff late in the afternoon to finalize preparations. After setting up projectors and power strips in the session rooms, we went out for dinner at Brio, a nice Italian restaurant at the nearby San Tan Mall, then came back to the hotel and hung out in the bar for a while with some friends.

Wednesday morning, I was up at my usual 6 am, only I was in Phoenix, so that made it 5 am. That way pretty much the way the conference went: up really early and to bed late. Definitely in full conference mode. After getting the registration room set up, we were open for business at 8:00. Registration is always a fun time, because it’s a chance to see old friends again and put faces to the names of new attendees. Pre-conference sessions started at 9:00 so we were fairly busy until then. During quiet periods, I chatted with Rick, Tamar, and people coming to register, and catch up on email. During lunch, I had a chance to meet Dimiter from Bulgaria and talk about software development and the economy in his country. To me, that’s one of the best things about going to a conference: meeting new people and finding out what they do and where they’re from, as well as renewing and strengthening friendships.

The afternoon was similar to the morning: greeting attendees as they came to register and chatting with folks. I had a long chat with Ken Levy about a variety of things, including the fact that he and Randy Brown thought it was a surprise than Randy was coming to SWFox, but in fact Rick had already made up a badge for Randy because he saw his name on the hotel room list. Rick, Tamar, and I also finalized who was going to do what in the keynote that evening.

After the pre-con sessions ended, we held a short speaker meeting to go over logistics with everyone. This also gave us a chance to meet the new guy, Tuvia Vinitsky, and for everyone to say hi to Steven Black, who hasn’t been a SWFox for several years. (Sorry we didn’t give you a chance to say hi to everyone before we started, Steve, but we were on a tight schedule.)

Tamar, Marshal, Therese, and I went to Paradise CafĂ© at the San Tan Mall for a quick dinner because we had to be back before 7:00 for the keynote. Rick, as usual, did not accompany us because he can’t eat before the conference starts.

We had a few surprises at the keynote this year. First, we awarded the VFPX Administrators’ Award to Joel Leach for his work with FoxTabs and ParallelFox. This turned out to be fortuitous, because ParallelFox ended up being a huge part of SWFox this year. The second surprise was the announcements of the 2011 FoxPro Lifetime Achievement Award recipients. I almost blew the surprise for this: during the setup, while there were fortunately a small number of people in the room, I connected my laptop to the projector and navigated to the folder where the keynote PowerPoint presentation was located. In that same folder were photos of Drew Speedie, Steven Black, and Toni Feltman, and it wouldn’t take a rocket scientist to figure out why. I was horrified when I realized that (shades of the infamous “Babe of the Day” incident from years past) and quickly pulled the plug before anyone else saw the evidence on the big screen.

Our part of the keynote went smoothly and quickly. We then introduce Steve to do the keynote presentation on Niche Marketing. What a bang-up job did! I suspect many attendees had never heard Steve speak before and were blown away by his session. That’s OK: the rest of us were too. I heard attendees talk about his session for the rest of the conference.

After the keynote, we held a reception in the trade show area. It looked like the exhibitors had their hands full with all of the attendees coming to find out about their products. I had a great chat with Frank Perez and Paul Mrozowski over a few Coronas.

After the reception closed, many people headed to the hotel bar. I had a fun time catching up with Phil Feltman and reliving the good times of past conferences. Joel Leach said his face hurt from laughing so much.

I hit the bed about midnight and took all of 4 seconds to fall asleep.

Tuesday, November 01, 2011

Stonefield 20th Anniversary

On November 1, 1991, Glen Crook started Stonefield Systems Group Inc. Over the next several months, I and three others left the company we had all worked for and joined Glen. In 1995, my current business partner Mickey Kupchyk and I bought the other three out and drastically changed the direction of the company. In 2000, we spun the software development side of the company off into Stonefield Software Inc. As I blogged earlier this year, Mickey and I sold Stonefield Systems Group to three employees in July, but still retain ownership of Stonefield Software.

It’s been a great 20 years. Like most things in life, it had a few lows but mostly highs, lots of fun, a little frustration, meeting new people and losing touch with (or sadly losing) a few. I think I’m having as much fun going to work right now as I’ve ever had; learning new techniques and working on new things will do that to you. I’m pretty sure I’ll be retired by the time the next 20 years has gone by, but I may be around for the 30th anniversary.

Thanks to all of our employees, customers, and business partner for making this ride fun and memorable.

Monday, October 31, 2011

2011 Lifetime Achievement Award Recipients

At the keynote for Southwest Fox 2011, Rick Schummer, Tamar Granor, and I had the pleasure of announcing this year’s recipients of the FoxPro Lifetime Achievement Award.

First, Tamar announced the award was being given in memoriam to Drew Speedie. Drew spoke at just about every VFP conference and user group, was the first editor of FoxPro Advisor’s Tips column, wrote numerous articles in Advisor, was Technical Editor of the first Hacker’s Guide to Visual FoxPro, and coined the famous “LISA G” mnemonic (Load, Init, Show, Activate, and GotFocus) for the order of events when forms instantiate. Tamar also told a story about how one year Drew, known as a fast speaker, wore out two signers for a hearing-impaired attendee at DevCon. Sadly, we lost Drew and his son Brent in 2005. There were more than a few people with tears in their eyes during Tamar’s presentation.

image

I was up next to announce the second recipient, Steven Black. Steve is the creator and host of one of the most important VFP sites, the FoxWiki. Like Drew, he’s a well-known author and speaker. Steve is one of the world’s leading experts on localization; his famous INTL Toolkit has helped many VFP developers adapt their applications to other languages and cultures. Steve is one of my favorite speakers—his sessions on design patterns introduced that important topic to VFP developers—and it’s been a long time since I’d seen Steve speak, so I was very glad we convinced him to present at this year’s conference. Special thanks to Alan Griver (yag) for roping Steve into what he thought was just a reunion of Fox friends but turned into much more.

image

Rick then announced the final recipient, Toni Feltman. Toni was a Senior Support Tech and Sysop of FoxForum on CompuServe back in the Fox Software days. She is also a well-known speaker and author, co-creator of Visual FoxExpress, co-creator of DBCX (a data dictionary extension for VFP used in many products, including Visual FoxExpress and Stonefield Query), and creator of ProjectHookX. Toni was doubly-surprised when she came up to the front to receive her award and saw her husband Mike and his brother Phil at the back of the room, as she had no idea that either was coming to the conference. It wasn’t easy keeping them hidden from her until that moment!

image

Congratulations to Steve, Toni, and Drew, where ever you are, for this well-deserved award.

2011 VFPX Administrators’ Award

The VFPX Administrators’ Award is an annual award given by the VFPX Administrators (Craig Boyd, Rick Schummer, and Doug Hennig) to recognize those people who made outstanding contributions to the VFP community through their projects on VFPX. The nominees this year were:

  • Matt Slay for GoFish
  • Joel Leach for ParallelFox and FoxTabs
  • Jim Nelson for Thor, PEM Editor 7
  • Alexander Golovlev for FoxBarCode  Update: we had the wrong project manager. Sorry about the mix-up.

At the keynote for Southwest Fox 2011, the award was given to Joel Leach. In hindsight, the award was prescient, because Jody Meyer’s session on ParallelFox and Kevin Ragsdale’s session on multi-threading were the buzz of the conference: at every meal, most discussions were about ways to incorporate parallel processing or multi-threading in VFP apps.

Congratulations to Joel and thanks for all your efforts in making VFPX the future of VFP.

Thursday, October 20, 2011

Axialis Offers Icon Libraries

Axialis, makers of my favorite icon editor IconWorkshop, is releasing several libraries of stock icons for developers. The first set contains 1108 unique icons for ribbon and toolbar controls. They come in a variety of sizes, states (such as normal and disabled), and color depths. Other sets planned for release include database, multimedia, management, and financials.

Until Nov. 20, 2011, this set is available for $34.30, a savings of 30% off the regular $49.00.

(Full disclosure: Marc of Axialis was kind enough to provide me a free copy of IconWorkshop as a Microsoft MVP and has been a sponsor of Southwest Fox for years. However, that’s not the reason I like the product. I like the fact that it’s powerful yet easy to use for those graphically-challenged like me. It also comes with a ton of images that are easy to combine into the exact icon you want.)

Thursday, September 29, 2011

Southwest Fox 2011 Session Schedule Posted

The session schedule for Southwest Fox 2011 is now available. Exhibitor sessions don’t appear but will be added soon. One change you may like this year is the ability to add a session to your calendar on your laptop or smartphone: simply click the calendar icon that appears beside each session.

Dave Aring’s popular Kokopelli session scheduler application will be available soon; watch for an announcement when it’s ready.

Wednesday, September 21, 2011

Steven Black Speaking at Southwest Fox 2011

I’m thrilled to announce that Steven Black is speaking at Southwest Fox this year. Rick, Tamar, and I have been trying to get him as a speaker for years, as we felt that with only Steve Bodnar and Steve Ellenoff, we just didn’t have enough Steves. Seriously, Steve Black is one of my favorite speakers of all time. His sessions are lively, thought-provoking, and entertaining, a killer combination. Steve hasn’t been to SWFox since 2005 due to other commitments, so he’s been sorely missed.

Steve's sessions are Looking Back: Techniques I'm Glad we Used and Niche Marketing for VFP Developers, Revisited. Both are going to be great sessions, but the Niche Marketing session is particularly timely given the state of VFP development today. Of course, this just makes the problem of deciding which sessions to attend, since I can’t possibly see them all, all the harder.

Monday, September 19, 2011

On the Catwalk Again

Last week, my wife Peggy and I both modeled in a fashion show fundraiser for Sofia House, a second stage shelter for women and children escaping domestic violence that Peggy used to be the Executive Director of (she now works for the United Way as Director of Community Investment). It was her first time, so she was a little nervous. Fortunately, I’d done it before.

We were both in four sets, although only one together, showing casual, business casual, and business outfits from local shops. Most of the models this year were inexperienced, so we had several practices in the weeks before the show. Things were a little rough even in the dress rehearsal the night before the show, but everyone magically pulled together on the actual night and it went without a hitch. It was likely the beer and wine we had backstage that settled the nerves.

This year’s theme was “Mamma Mia”, so all of the sets were done to ABBA tunes (I still have several running through my head). We could tell the 500 women (and a few men) in attendance were having fun because of all the smiles and singing along to the familiar songs.

Here’s the first set Peggy and I were in; she’s on the left. Everyone had to wear glasses for this set (which I normally do, so I didn’t need a fake pair like she did); I guess it made us look more business-like. I also have a wad of (fake) $50 bills in my coat pocket because the ABBA song playing was “It’s a Rich Man’s World”.

Sofia House Fashion Show 2011 010

I had to do another set where I wasn’t actually modeling clothes. In case you can’t tell, we’re all wearing flippers. If you’ve seen the movie, you’ll know why. In addition to doing muscle poses, we also had to do the can-can together. I think this skit got the loudest reaction from the audience.

Sofia House Fashion Show 2011 018

I’m not sure how much money the fashion show raised this year, but it’s was likely as least $15,000. Since Sofia House gets no government funding, everything they make comes from private donations, organizations like the United Way, and fundraising efforts from the dedicated board, making this a very worthy cause. Plus it was a ton of fun to be involved in.

Wednesday, September 14, 2011

Griver and Black Coming to Southwest Fox

I have some great news: VFP luminaries Alan Griver (aka yag) and Steven Black are coming to Southwest Fox this year! It’s been a couple of years since Alan last came and 2005 since Steve was last at the conference. This is your chance to hang out with them and find out what they’re up to today. Who knows, maybe with enough beers, Steve will re-tell the infamous Brewster McRooster tale.

Monday, September 12, 2011

New Offer for Southwest Fox 2011

Alpha Software is offering a free full copy of Alpha Five Developer to every attendee of Southwest Fox 2011, a $349 value. Alpha Five allows you to rapidly develop both web and desktop database applications. Alpha Software is exhibiting at this year’s Southwest Fox, so you’ll have a chance to meet and talk with them about their product. For more information on Alpha Five, please see their web site: http://www.alphasoftware.com/.

Tuesday, August 23, 2011

Cool PowerPoint Transitions

PowerPoint MVP Glenna Shaw created a cool presentation showing how transitions work in Microsoft PowerPoint 2010. They may not necessarily be suitable for technical presentations but for general presentations add some excitement to what otherwise might be boring slides.

Monday, August 22, 2011

Southwest Fox 2011 News

Anyone who is registered before midnight EDT on September 1st (including those who are already registered) is eligible for one of three drawings for a DBi Technologies Studio Controls for COM license (which sells for $749). Thanks to DBi for their ongoing support of Southwest Fox!

We're trying to get a better handle both on how many people to expect and the factors in people's decision to attend or not. Please help us by taking a brief anonymous survey.

Wednesday, August 17, 2011

2011 FoxPro Lifetime Achievement Award Nominations

The FoxPro Lifetime Achievement Award honors those individuals who have contributed a great deal to the FoxPro community over the years: http://fox.wikis.com/wc.dll?Wiki~FoxProCommunityLifetimeAchievementAward~VFP. The previous recipients have created a committee to select one or more recipients for 2011. The committee consists of Whil Hentzen, Rick Strahl, Doug Hennig, Tamar Granor, Rainer Becker, Rick Schummer, Lisa Slater Nicholls, wOOdy Wondzinski, and Christof Wollenhaupt, as well as Alan Griver (yag) of Microsoft and Naomi Nosonovsky representing the FoxPro community.

To submit your nominations for the 2011 recipients, please email me by August 31, 2011.

Wednesday, July 27, 2011

2011 Ceil Silver Ambassador Announced

Geek Gathering is pleased to announce that the 2011 Ceil Silver Ambassador is Borislav Borissov. Thanks to the many contributors to the Ambassador Fund for once again showing your generosity!

Thursday, July 21, 2011

Southwest Fox 2011 Deadline Approaching

Just a reminder that anyone registering for Southwest Fox by Monday, July 25, is eligible for the Super Saver discount rate of $645. Registering includes entrance to all conference sessions, two lunches, one dinner, access to whitepapers for all regular conference sessions, and much more.

Check out the list of speakers and sessions at http://www.swfox.net/speakers.aspx. Full registration information and access to our registration application at http://www.swfox.net/register.aspx.

Friday, July 08, 2011

Mixed Feelings

Later today, my business partner Mickey and I are signing the papers to complete the sale of Stonefield Systems Group Inc. to a group of employees.

In case you weren’t aware, there are actually two Stonefields: Stonefield Systems Group Inc. (SSG) and Stonefield Software Inc. (SSI). (Actually, there are three: Stonefield Software USA is our U.S. operation.) SSG was created in 1991 (yes, that means the 20th anniversary is this year) by another business partner, and Mickey and I joined a few months later. SSG did all kinds of stuff: custom software development, Accpac (a popular accounting system now owned by Sage) sales and consulting, pharmacy software development and sales, IT stuff … basically, anything for a buck. Over the years, the business structure changed: Mickey and I bought out the other partners in 1995 and we refocused the business to just Accpac and software development. In 2000, we split off the software development side to Stonefield Software so SSG could focus exclusively on Accpac.

As a result, I’ve had very little to do with the day-to-day operations of SSG for over a decade. Several years ago, Mickey also decided to focus almost entirely on SSI so we handed the management reins to a general manager. So while we owned SSG and oversaw its general operation, neither of us was closely involved for quite some time.

A few years ago, a couple of long-time employees approached us with the idea of buying SSG from us. It took a while to make it happen, but later today it becomes a reality. Note that we are NOT selling SSI; it’s the business we’ve been focused on for a long time and will continue to do so. I’ve been working on Stonefield Query for more than a decade and will do so for (hopefully) another decade. I still write code every day and get grumpy when I don’t.

I have mixed feelings about selling SSG. Although it wasn’t my first company (I had a one-man company in the late 80s), it certainly was the one I was associated with the longest. So, there’s a bit of nostalgia at leaving something I spent so much time and effort building. However, I’m also very excited for the new owners, Connie, Bernie, and Rene. They’re young, have a lot of talent, and tons of new ideas about directions to take SSG in. The company is in great hands and the future is very bright. I’ll be watching happily to see how they make my old baby and their new one grow.

Southwest Fox 2011 Pricing

We tried something new for pricing Southwest Fox this year. Instead of using calendar deadlines, we divided the number of attendees we expect into a set of "buckets," with an increased price for each bucket. We even put the number of seats left in each bucket on the conference home page.

The reason for the change was to get people to register sooner, which helps us in many different areas of planning. We put 20 seats in the first bucket and they all sold in the first few days after we opened registration. We were thrilled.

After that, we blew it. We put 60 seats into the second bucket, which failed to create any kind of urgency; as we write this, only 21 of those seats have sold. Even the July 1 deadline for getting a pre-conference session for free didn't light a fire under many people. The result is that registrations are running considerably behind last year's; we're pretty sure it's the pricing mechanism causing the slow registrations, not a lack of interest.

Since we really do need to know how many people are coming, we're going to adjust the bucket sizes. But before we do, we want to give everyone a chance to get in on the current price of $645 (a discount of $125 off the regular price).

After Monday, July 25, we're going to reduce the size of the second bucket to a total of 30 seats (or the number of people who've already received the Super Saver price by that date, if that's more than 30), and add a new bucket called just "Saver," with a price of $690, which is still $80 less than full price, for the other 30. However, anyone who registers on or before July 25 will get the Super Saver price, even if that means we have more than 60 Super Savers.

So, if you've been waiting for the Super Saver bucket to get close to empty before registering, that time is now. (If company bureaucracy or other factors make this deadline a problem for you, please contact us at register@swfox.net.)

Thanks for understanding our need to tweak this new approach. We look forward to seeing you in Gilbert in October.

Friday, June 24, 2011

Southwest Fox Deadline Coming Up

There are only 8 days left to get a free pre-conference session and chance for scholarships for Southwest Fox 2011. We’re already ahead of the pace from this time last year so be sure to register before July 1 so you don’t miss out.

Thursday, June 23, 2011

Better Online Help Links

I’ve been using Rick Strahl’s West Wind HTML Help Builder for more than a decade and still think it’s the best tool for creating help files. One of the many things I like about it is that in addition to creating a CHM file, it also generates files you can upload to a web site. For example, http://www.stonefieldquery.com/OnlineHelp/EndUser/index.htm is the online version of the Stonefield Query end-user help. I didn’t have to do anything after generating my CHM other than uploading the files HTML Help Builder creates.

There are several reasons why we like having help available online:

  • Potential customers can review the complete help file before downloading the demo if they wish.
  • It’s fully indexed by Google, Bing, etc. so shows up in searches.
  • When someone asks a support question, rather than telling them to bring up the help file, open the “How To” heading, and find the “Configuring Stonefield Query” topic, we can send them a link directly to the online version: Configuring Stonefield Query.

However, one issue with the latter item is that a link like http://www.stonefieldquery.com/OnlineHelp/EndUser/_04a0xwfxe.htm displays the help topic without the rest of the help system: no table of contents or search mechanism. I discovered today that if instead of specifying the page directly, you use it as a parameter for the index page, like http://www.stonefieldquery.com/OnlineHelp/EndUser/index.htm?page=_04a0xwfxe.htm, it displays the full help system with the desired page selected. Learn something new every day!

Thanks again, Rick, for a great tool that makes documentation almost fun to create! (I did say ALMOST; I’m not crazy!)

Wednesday, June 01, 2011

Pinning the Southwest Fox Web Site

If you’re using Windows 7 and Internet Explorer 9, try this:

  • Navigate to the Southwest Fox web site: www.swfox.net
  • Drag the icon that appears to the left of the address bar to your Windows Task Bar:

DragSite

  • Notice you now have a Southwest Fox icon in your Task Bar. Click it as a fast way to bring up the Southwest Fox web site.
  • Right-click the icon to display the following jump list. The items in the Tasks section take you to the specific page on the web site:

JumpList

Now it’s a single mouse click to get to the most popular pages on the web site.

If your interested in adding this capability to your own web site, it’s really easy: go to http://buildmypinnedsite.com/ and follow the steps.

Friday, May 27, 2011

Web Connection User Conference

Are you a Web Connection Developer looking for an opportunity to expand your skill set and hobnob with other Web Connection experts? Then look no further than this year's Web Connection User Conference at the SanTan Elegante Conference & Reception Center and Legado Hotel, just prior to the Southwest Fox conference there.

Silverswitch Post-Conference Workshop

The German FoxPro User Group, Visual Extend, and FoxRockX are sponsoring a free Silverswitch (Silverlight to VFP) workshop on Saturday and Sunday after Southwest Fox.

Southwest Fox 2011 Speakers and Sessions Announced

Speakers and sessions for Southwest Fox 2011 have been announced. Continuing our tradition of trying to invite new speakers every year, this year we are pleased to have Steve Bodnar, Kevin Ragsdale, and Tuvia Vinitsky present at SWFox. I’ve had the pleasure of knowing and speaking with both Steve and Kevin for a long time, and look forward to their sessions. We are even supplying Kevin with a set of Depends so he can continue his presentation regardless of any emergency that should arise.

Once again, the organizers had a very tough time selecting from the excellent submissions. Some sessions I’m personally looking forward to are:

  • Steve Bodnar’s jQuery session. Although I saw Steve present a similar session earlier this year, his infectious enthusiasm for jQuery makes it well worth seeing again.
  • Rick Borup’s Mercurial session. We just started using Mercurial here at Stonefield after seeing a session Alan Stevens did on it earlier this year, so we have a lot to learn and Rick is a master at sessions like this.
  • Steve Ellenoff’s smartphone pre-con session. Steve presented what was for me the coolest session at SWFox last year, and this session sounds like a killer topic.
  • Eric Selje’s mobile device session. Not only does this session sound cool, its title is one of my favorite Sweet songs, so you gotta like that.
  • Kevin Ragsdale’s user interface session. If you’ve seen my sessions at SWFox the past few years, you know that UI is very important topic to me, so I’m really looking forward to Kevin’s take on this. Plus Kevin is a really fun guy so his session is sure to entertain.
  • Christof Wollenhaupt’s Googlefy session. Christof is a speaker’s speaker: he’s the one all speakers attend because his sessions are always so thought-provoking.

I’m very excited by this year’s lineup and think you will be too. Registration opens June 1. See you in October!

Friday, April 15, 2011

Lost in Translation

Here is a recent press release we sent out about the latest version of Stonefield Query.This one is the same press release that was obviously translated to another language and then back to English, I suspect by an automated rather than human translator. The translated version is hilarious. Here are some of my favorite quotes:

“Stonefield Software today declared the stylish promulgation of its database news code tool, Stonefield Query 4.1”

“The newborn edition includes over 30 newborn enhancements – the most momentous existence the Dashboard Wizard”

“As a result, they never intend the flooded benefits of what Goldmine CRM crapper do for them and their business.” (Um, we didn’t really call GoldMine “crapper”. It looks like “can” became “crapper” in the re-translation.)

“They woman opportunities and that effectuation forfeited sales.” (“Miss” became “woman”.)

“The stylish edition provides an ad hoc news resolution that crapper be utilised direct by modify users as substantially as IT staff.” There’s that word “crapper” again.

Thursday, March 24, 2011

Southwest Fox 2011 Session Proposals Due Soon

This is just a quick reminder that session proposals for Southwest Fox 2011 are due by next Monday, March 28. For details, read the Call for Speakers document linked at http://www.swfox.net/callforspeakers.aspx.

FoxPro MVP Podcast

Earlier this month at the MVP Summit, Andrew Duthie and Dane Morgridge of the Community Microphone Podcast interviewed Tamar Granor, Rick Schummer, Alan Griver and me about a wide range of subjects, mostly around the influence FoxPro and the FoxPro community has had on Microsoft and other communities. Have a listen!

Tuesday, March 22, 2011

Nominations for 2011 Ceil Silver Ambassador

The Ceil Silver Ambassador Fund brings a developer to the Southwest Fox conference in the United States as an ambassador for the developers in his or her country. This gives the recipient the opportunity to meet and share experiences with developers attending Southwest Fox and gives other attendees the opportunity to learn about VFP development in the recipient's country. For more information on the Ambassador Fund or to learn how to contribute to it, please see http://www.swfox.net/ambassador.aspx.

The Ambassador selection committee consists of Southwest Fox organizers Rick Schummer, Tamar Granor, and Doug Hennig, former Ambassadors Emerson Santon Reed, Cesar Chalom, and Bernard Bout, and VFP community members Christof Wollenhaupt, Rick Bean, and Alex Feldstein.

We are looking for nominations from the VFP community for the 2011 recipient. To nominate someone you think is deserving to be selected, please email their name and a brief list of their contributions to the VFP community to ambassadorfund@swfox.net. Names must be submitted no later than April 15, 2011.

Monday, March 14, 2011

The Spirit of the Community

CĂ©sar once again shows why the VFP community is alive and well. First, he released a new version of his very cool FoxCharts charting tool. This is a tool that is easily as powerful as many commercial charting tools and yet CĂ©sar has generously donated it and his time to our community. Second, he is actively requesting donations from FoxCharts users, but not for himself: he asks that donations go to the Ceil Silver Ambassador Fund. This fund raises money from the VFP community to bring a developer to the Southwest Fox conference as an ambassador for the developers in his or her country. This gives the recipient the opportunity to meet and share experiences with developers attending Southwest Fox and gives other attendees the opportunity to learn about VFP development in the recipient's country.

Thanks, CĂ©sar, for all you do and for your very strong commitment to the VFP community. CĂ©sar’s generosity and spirit of community should be an inspiration to us all.

Tuesday, March 08, 2011

Southwest Fox 2011 Call For Speakers

Today we released the Call for Speakers for Southwest Fox 2011. Anyone interested in presenting should visit the Call for Speakers page on the Southwest Fox website, read the complete Call for Speakers document (linked from that page), and download the proposal submission application. Session proposals are due by March 28.

As in the past few years, we to offer a good selection of topics in core VFP development, extending VFP, using VFP with other technologies, and VFPX, as well as technology sessions to help VFP developers become better developers, not just more expert at VFP.

If you think you have something to say to the VFP community, please submit session proposals, even if you’ve never spoken at a conference before. Our community is strengthened when more people take an active role. Do be aware that speaking at a conference is a serious commitment. Even for experienced speakers, preparing a new session takes 40-80 hours. Doing it well at the conference calls for several rehearsals beforehand, too. So make sure you can commit the necessary time; the Call for Speakers lays out all the deadlines.

We’re looking forward to seeing what you all come up with. Reading through the proposals we receive each year is really exciting, and choosing among them is always a challenge.

Wednesday, February 02, 2011

Running Network Applications on Windows 7

Like many developers, I like using Windows Virtual PC for testing applications. Today I needed to test running Stonefield Query from a network share, so I started a virtual machine (VM), connected it to the drive on my host system, ran the Stonefield Query workstation installer to install just required runtime files on the VM, and then ran SFQuery.exe from the “server”. I immediately got a “The application failed to initialize properly (0xc000000F)” error. At first I thought something wasn’t installed properly, but a search found this Microsoft KnowledgeBase article:

Error message when you try to open a network-shared application on a client computer that is running Windows 7 or Windows Server 2008 R2: 0xc000000f

Apparently this is a known issue and you can request a hotfix to resolve it. After installing it, all was well.

Saturday, January 22, 2011

Southwest Fox 2010 Keynote Videos

Bernard Bout has kindly uploaded HD videos of the Southwest Fox 2010 keynote. Whether you were at the conference or couldn’t make it, you’ll want to watch them. Craig Boyd gives what must be the funniest keynote at any conference ever.

Thursday, January 06, 2011

Windows Vista Articles

Since Advisor is closing online access to their articles, I have put a copy of my “Developing VFP Applications for Windows Vista” white paper, the source material for a couple of articles I wrote for Advisor, on the Technical Papers page of Stonefield’s web site.

Southwest Fox 2011 Announced

Mark your calendars! Southwest Fox 2011 will take place on October 26-29, 2011 with a post-conference event on the afternoon of October 29 and morning of October 30. Note a few changes this year:

  • The shift not only from the second week in October to the last week (to avoid running into Jewish holy days).
  • The shift from our usual Thursday to Sunday dates to Wednesday to Saturday this year (so you can get home in time for Halloween).
  • The post-conference starts Saturday afternoon rather than the next day.

By the way, the post-conference event is guaranteed to blow your socks off, so you'll definitely want to consider staying the extra day. Stay tuned for more details.