06/10/2010

Treat Your Change Requests like Your Deposit Bottles

Category  
0

For those of you who don't know what deposit bottles are all about, check out this old Seinfeld clip:

http://www.youtube.com/watch?v=TEpDBQ_Ww6k

So how do deposit bottles relate to change requests?  Nobody returns their bottles as soon as they are done with them, so don't release your changes as soon as you finish them. But wait--isn't reacting quickly to all change requests the responsive thing to do? Well, yes... But remember that things are constantly changing.  And nobody likes change, let alone constant change.  

And the other extreme?  I was returning my one re-usable bag of bottles the other day and saw someone with several shopping carts full of bags of bottles.  Must have run out of room under the porch to store more (hopefully it wasn't the result of the weekend's festivities).  That would be a metaphor for storing up change requests for way too long.  You'd be explaining all the changes to your users for days, just like it will take several days for that guy to put all his bottles into the return machine.

So what's the right mix, and what do you do in the meantime?  Well, you have to touch that database anyway, so why don't you leave it better than you found it?  Any hard-coded server names?  Recently, I found a formula agent from R3 days.  It had that old

fldName := fldName

stuff all over it.  It also checked to see if it was running on OS/2!   A few deletes and a much better agent.  Nobody sees those changes, but you won't have to go back in there for another 10 years, just because you got a new server.  

Maybe you could run a spell check... Here's a fun one: Search the 8.5.1 client help contents for lotuscript with one "s."  Just sayin' - it can happen to anyone.

How often to release new code?  There's something magical about the number 7, so try releasing seven changes at a time.  And tell them I told you to.

05/14/2010

My New England Lotus User Group Door Prize

Category
0

Here is the raffle prize I got at this week's meeting (nelotus.org)

A picture named M2

And speaking of user group meetings, what gets YOU to go to a user group meeting?  Do you want a multi-day affair in a city near you, with many sessions and the possibility of vendor subsidies?  Or an after-work meeting on a topic of interest?  Is it easier to go before or after work (maybe leave early),  rather than justify several days off and maybe some travel expense?  Do you want to share experiences with other, local, users in a more intimate setting?  Or do you want to hear from the best speakers?  

As a developer, there are some topics that I am not focused on at the time, so I might miss a monthly, single topic, meeting.   And a multi-day event would need several, parallel, tracks so I could pick and choose.   I do like the smaller sessions where I can share stupid ques--I mean, go a little deeper on a topic.

What about vendor sessions?  Speaking as a vendor, we believe we have a solution for some problem you have.  So of course we are also going to tell you about products we have that will make your job easier.  Hey, maybe you don't know there was another way to do something (brute force is one way to do something).  When we sponsor an event as a vendor, we do it so we can meet lots of people and see our customers face-to-face. This one of the reasons we did not sponsor The VIEW Admin and Developer Conference this year. The way the sessions are structured at the show leaves very little time or opportunity for  attendees to stop by.  Vendors are more than willing to tell you the problem their solution solves--you just need to make an effort to visit them and ask.  And if you truly don't have a need for that solution, (not everyone needs to search and replace hard coded server names for instance), no one wants to waste your time at the show, or afterwards with follow-up phone calls.

How about webinars?  Are these a more effective means of getting information?  Are small user group meetings on the way out?  Are you satisfied with Facebook as a way of staying in touch with other developers/admins?  Are lotususergroup.org virtual meetings the way to go?   Did I say I'll bring the beer?  

Let me know your thoughts!

04/06/2010

Avoid reading this if you are not going to do anything about it

Category  
0
I was using one of our applications and noticed the lack of column sorting made the view hard to use (we'll come back to this). So I thought I should just fix it. Since IT rarely lets me have Designer access to production databases, I went looking for another way. It turns out the database inherited it’s design from a template. It also turns out the template was not on the server (I created a private view in the Catalog to show this - yes, it is up to date, and yes I did remove the part of the selection formula that hid databases not shown in the Catalog). Next, I went looking for a database to hijack. Back to the catalog.

The view Access Control Lists by level quickly showed me a database with -Default- access of Manager. It was called Discussion Test, had no documents, and was created in 2003. Perfect candidate to become my new template. Copy the original database, design only and create a template locally. Fix the views. Now set the hijacked database to be a template and replace the design from my local copy. Now, sign the database with the active server id. Last step, sit back and wait for the design task to fix my database. By the time anyone notices, any evidence in the log file will be gone.

So, what are you going to do about it? Right now you are going to open your Catalog and identify any database or template where the -Default- access is Manager and change it. Don't stop there. Also check the databases with -Default- access set to Designer - I can hijack those also.

And all this came about because the requirements for the application didn't include a requirement that the sort sequences made sense! Is that so hard?

03/05/2010

I know you are not that guy...

Category    
0

...because you are reading this post.  But you know who I mean.  The developer who found some code that did a generic dblookup for a combo box with easily configured messages--and then pasted that code everywhere, without knowing what it did.  

Hey, code re-use is a good thing.  But he didn't see the part where it was checking to see if the database is on an OS2 server! Then there's the guy who continues to modify the code in that $$WebQueryOpen field, rather than moving the code to the more appropriate event handler.

This is the same developer that doesn't know about

A picture named M2 PlanetLotus.Org.  Or

 A picture named M3 OpenNTF.org.  Or

 A picture named M4  LotusUserGroup.org.  


He might know about the forums. He might even keep the handouts from his "Introduction to Notes" development course.  Every once in a while I run into one of these caveman developers - they stay in their caves and don't take advantage of the vast resources available in the Lotus community.  So what I do is tell them I know about some fantastic tip--I just don't remember the details... But look on PlanetLotus (or OpenNTF or wherever) and you'll find it.  

What do you do when you run into one of these developers?

02/24/2010

You are in a Helicopter

Category
0
This is an old story, from back before they invented GPS or even radar! My favorite version goes like this:

Some big shot goes to Seattle and hires a helicopter to take him to his meeting.  As happens in Seattle, it was a foggy day.  After a while, the pilot says to his passenger, "I don't know where we are.  I am going to go lower to ask for directions."  (Must have been a female pilot, because a guy would never ask for directions).  As they come out of the fog bank, the pilot sees a man in the window of an office building.  The pilot yells out to the man, "Where am I?"  The man in the office yells back, "You're in a helicopter!"  The pilot thanks him and takes off.  The big shot asks,"How did that help you know where we are?"  And the pilot says, "His answer was technically correct and totally useless, so I know that is the Microsoft Tech Support Center, and our destination is just to the left of this building."

But, back to the Notes world.  How about this one: "Object variable not set!"  Okay, you know which variable is not set, and you even know what line of code has the problem.  So why don't you just tell me?  Why do I have to fire up the debugger?  And remember - a developer came up with this error message for other developers.  Is there some limit to the length of error tweets?  

This message is not new, so what drove me to this post?  I got this message the other day: "dojoUsage is deprecated and no longer supported."    Number one, I didn't put this line of code in my custom control.  So why is someone putting deprecated code in my control?  Number two, if you know this is deprecated, you must know what the modern replacement is.  Again, some developer came up with this error message for other developers.  

So, as professional developers, can we all agree to provide meaningful error messages?   Maybe even include some options for resolution?  And none of this "see your administrator for more information."  I am the administrator, and I only know what you tell me.

12/22/2009

We are Not in Kansas Anymore

Category  
0
I recently came back from a trip where I was working with several customers to implement source code control systems. I wasn't in Kansas, but I could see it from my porch. But my real message is that 8.0 and beyond really changed the Notes development environment, and everyone needs to consider implementing some source code controls.

Let me explain. I updated my mail file to 8.5.1 because I wanted to be able to accept meeting invitations in preview mode (a really cool feature in 8.5.1). Then I opened my mail file in 8.0 and discovered I could not accept meeting invites in preview mode. You see, it wasn't just changes to the mail template. This feature also requires changes to the Notes client, even though there were no new features in this release. Because this feature was implemented in the Java views and forms, it was not something I could change by opening the template in Designer and copying. Because it was implemented in the Java views and forms. This would seem to mean the days of tweaking your designs on the production copy of the database are quickly ending.

So now that you have another copy of the database on your server for implementing new features (and maybe fixing things that users think are bugs), you need to be able to tell how the two databases are different. And this is where the source code control system comes into place.

You see, good source control should allow you to identify the user request for the change you are making, and it should help you manage the different versions of your applications. I can't tell you how many databases I've seen with design elements that are named 'Copy of...'. At one site, the developer admitted to me that he could delete all 20 of the private agents in his database that were one-time only data fixes (because the source code control system could always bring back stuff that was deleted).

So, sooner or later, you are going to need a source code control system. I am sure you will find it will actually make your life easier.

11/02/2009

Share this Column

Category
0

Did you catch my earlier post on UI?  It reminded me of my favorite shared column.  Why should you just display a paper clip in a view when the document has an attachment when you can add value by displaying what kind of attachment it has?   Try this formula and be sure to check Display values as Icons.

extList := ".ODS":".XLS":".ODF":".DOC":".ODP":".PPT":".NTF":".TXT":".MP3":".ZIP":".PDF";
ext := @UpperCase( @Right( @AttachmentNames; 4 ) );
choice := @Member( ext; extList );
@If( @Attachments > 5; 30:30;
        @Attachments > 1;150 + @Attachments;
        @Attachments = 0; 0;
        @If( choice = 0; 5; @Select( choice; 141;141;142;142;143;143;145;1;15;10;171) ) )

To add other icons, add the extension to the first line, and add the icon number to the last line.  Also note that in ND 8, the icons for the M$ products have changed to a generic icon, despite the documentation.  

Also note that if you want to modify the mail template, this column is copied to every folder, which needs to be modified separately.  And if you want help interpreting the formula, the first clause checks to see if the version of Notes is less than R4 - you can probably safely remove this clause along with its other clauses that start with the @IsAvailable( $ContentIcon) phrase.  You can then fit this @if into the remaining @If statement.

10/28/2009

Free Designer client is a double-edged sword

Category
0

The good news is more people have access to Designer and can start making those small changes to their databases that have been bugging them for ever. The bad news is that now even Bob in accounting has access to Designer (no offense Bob).

Now, more than ever, developers need to be sure their data is secure. Remember, a ‘Hide when’ formula is not a security feature. Just right click on the document and show document properties. Fine, you say. I'll just hide the design and the list of fields isn't displayed. Still not a security feature.

I am not going to go into the details here, but think of a View with the first column categorized on a sensitive field like BirthDate, and be sure to not check the option to 'Don't show empty categories'. For real security, you need to encrypt the fields, or use Reader fields. Since a Reader field applies to the whole document, put that sensitive information on a 'daughter document' with appropriate Reader access.

We know Bob is a nice guy, but don't give him a head start down the wrong path.

10/26/2009

I am no UI expert, but I am a user

Category
0

The other day I was watching a football game.  Okay, it was the Patriots 59 to nothing blow-out in a snow storm.  I noticed that the graphic that showed the score had 3 yellow dots over each team’s name.  Later in the game I realized that these dots were not just part of the graphic.  They conveyed the all important information as to how many time outs each team had left.  Intuitively obvious to the casual observer.  

In contrast, I found myself completely confused by the graphic superimposed on the field showing what down it was and how many yards were needed to get a first down.  I found myself trying to make sense of the head or tail of the graphic.  It isn't where the ball is.  It isn't where they need to go.  It appears to be totally random.  Even though it is a really cool thing, instead of adding value it just added confusion.

Which reminds of the Notes application I was using recently.  I was looking for some information and couldn't find and couldn't even understand why I wasn't finding in.  Then I realized the first column of the view was categorized, the second column had information, and the third column was sorted.  So when I read the view from left to right, scrolling down the unsorted second column, nothing made sense.  

Who knew that you would have to explicitly state that a requirement for that application should be that the sort order of views made sense.  If the third column really needed to be sorted, it should be the first column after the categorized column.  Or sort the second column.  It makes it much easier for simple people like me to find stuff.

10/14/2009

5 Songs Every Runner Should Have on Their MP3 Player

Category  
0

No matter how fast or slow you run, when one of these songs comes on I guarantee you will change your pace to match.  In no particular order

     1. Mambo No. 5 by Lou Bega
     2. Candyman by Christina Aguilera
     3. Hanky Panky by Madonna
     4. Girlfriend by Avril Lavigne
     5. Chelsea Dagger by the Fratellis'

 And just for fun, any steel drum song because whenever that comes on, no matter where you are or what you're doing, you can't help but smile!  Happy trails!

09/08/2009

Guess what I forgot to bring to the gym this time?

Category   
0
Sandals. Not a mission critical piece of workout gear, but if you want to avoid a nasty fungus.... Two days earlier I saw one of our account managers at the gym in stocking feet - he forgot his sneakers. But he has two pair in his trunk. (Side bar - at our office in the US, you are very likely to run into some Teamstudio person at the gym. There is another company in our complex where you are very likely to run into one of them on a cigarette break down by the pond. Talk about corporate culture!)

Anyway, I have been to the gym dozens of times, but sometimes something gets left off. Have you tried running with a dead MP3 player? It turns out that any manual process, like getting ready to go to the gym or releasing a new update of an application, can occasionally have missed steps. No matter how often you do it, no matter how well documented your procedures are. Missing a step in the gym prep routine isn't usually a big deal. But missing a step in releasing that application can be. I know one of our customers didn't have that single property to Require SSL connection turned on, and ended up having to pay for credit protection for thousand of customers.

I am sure you all have your own horror stories. The moral of the story is if you can automate your release procedures so that you can have a repeatable process where nothing gets skipped, you should. It also turns out we have worked with a lot of companies to do this, and could probably help you as well.

08/24/2009

Have you read your Database Catalog recently

Category
0
Have you read your Database Catalog recently?

It really does make for a good read, and no spoiler alert because I am not going to reveal how it ends. I talk to a lot of companies these days that are trying to eliminate unneeded resources, and I mean disk space and servers, not people. But disk is cheap, so why should I care? Well, you know your storage array has some fault tolerance built into it which adds extra disk. And that cluster doubles the amount of disk you need. And you know all those things that run every night, like backup, or catalog? They have to look at those databases to see if they have changed. So unused databases are not really free. And as you plan to upgrade to 8.5.1, would you rather have to think about testing 20,000 databases or only 5,000 databases?


Have you read your Database Catalog recently

07/20/2009

So You Think the User Interface Does Not Matter

Category
0
Due to circumstances I will not go into here (except to say that none of them were any fun), I had the opportunity to drive several different vehicles than my normal transportation. I was on my way home and it started to rain, Now how do you turn on the wipers? Is it that dial or on that stick thing? No, that's the rear wiper. Oops, that's the sun roof, not what I wanted on a rainy day. I finally got that thing working.

Now it is getting dark - how do I turn on the lights? It's dark outside and now it's dark inside and I can't even see where a switch might be. But I know if I open the door a light will go on inside - better pull over first before opening that door. Fortunately, the turn signal is one of those things that is consistent for every car (it's the stick on the left side of the steering wheel - you push it down to tell people you are turning left and push it up to tell people you are turning right. I say that because evidence suggests not many people know this.) And you know the other thing that is consistent between cars? The ever intuitive push-and-hold to set your pre-sets on the radio.

The point, is, if your controls are consistent between your applications, it is easier for your users when switching from one to another. And it doesn't really matter that the icon for save is a floppy disk (at least it is a 3.5 inch disc, not a 5 1/4 one!) - people just know what it means. And don't worry - the terminology will eventually catch up (who knows what a Return key did?).

06/18/2009

Triatholons are too hard!

Category  
0

Sorry, Michael, I keep my fitness regimen to distances under 4 miles - something I can do in a half hour.  Because that's all you have to do right?  Just enough fitness?  And to prove it, I ran a 5K race this weekend (3.1 miles).   And here are my tips for doing 'well' in a race.  Pick a 'first annual' race that no one has heard of - there won't be as many entrants.  Pray for bad weather (cold and rainy was what I got) so the sunshine runners won't show up.  And wait until a milestone birthday so you will be in a different age bracket.

But I have to tell you, those old people don't have to go to kids soccer games, so all they do is train.  So this was my first race in almost three years.   Because you have to stay healthy and avoid injuries (and hope your gym doesn't go bankrupt) in order to train.  So I found this race because it was near me.  The short version is I finished in 24 minutes, 52 seconds!   My wife was going to document my finish, and I said I wanted to break 25 minutes - I guess I was too fast and beat her to the end, so no pictures.   I came in 3rd in my age bracket, and 24th overall.   Never mind that there were 6 people in my age bracket and 90 runners total.  

So, Michael can have his triathlons - I'll stick to the short ones!  Happy trails!

06/15/2009

Are XPages the Dojo Killer

Category
0
One of the topics that comes up frequently in conversations these days is web-enabling applications. I used to talk about adding a little bit of Dojo to your code to get a very appealing web interface. And then I saw XPages, which really addresses the notion of: 'what are you trying to accomplish by web enabling your application? XPages allows the developer to completely rethink how a user interacts with the data. Can you imagine trying to order something from Amazon if a Notes developer just web enabled that database?

Based on the articles, blog posts, and videos going around, it seems that XPages have been very quickly adopted by the development community. I know you are supposed to use the tool that is appropriate for the problem, but those frameworks were (see - I'm even talking about them in the past tense) hard to use. The Notes team has given us a tool in XPages that is a lot easier to adopt. So, is anyone still debating Dojo versus Ext.ND anymore?

06/01/2009

Do you know what a STIG is?

Category
0
Not who as in the Top Gear guy, but what. It's from the Department of Defense and stands for Security Technical Implementation Guides. One of these guides covers Application Security and Development. Just wondering if anyone out there in the yellowverse has come into contact with any of these, what the review process was like, and whether you uncovered any tools to help automate this review. John

05/27/2009

Not Good Bye - Just Catch You Later

Category
0

It was my pleasure getting to know Rocky better and to work with him

So it is not good-bye, just catch you later.  In the time that Rocky was here at Teamstudio, I had the pleasure of working with him on several projects.  And even though I have been working with Notes since release 2, I learned some new things from Rocky about old stuff (we are always learning about the new stuff).  And I was able to teach Rocky a few things.  Okay, it was only mnemonic to remember the 9 most used letters in the alphabet, but in true Rocky fashion, he took it and came up with his own mnemonic.

I also wanted to take this opportunity to poke Rocky about his complete silence on season 8 of American Idol.  I mean, more people voted in the finals than voted in the last presidential election (since I said it on the internet, it must be true).  I was calling for a final between Adam and Allison, so I got that half right.  No matter what, I am sure we will hear from many of these contestants in the future.  

Anyway, if you see Rocky at a conference, you should ask him the most commonly used letters in the alphabet.

04/29/2009

Things that Seem Counter-intuitive

Category
0
I read an article in the Boston Globe recently that claimed that runners’ injuries are caused by shoes. Not bad shoes - shoes in general. The author claimed shoes forced feet to move in unnatural ways. He went on to say running barefoot, or with minimalist coverings, was far healthier. Interesting idea.

The next counter-intuitive notion was that cancer screening is a waste of resources. This author claimed that screening detects tumors, but many of the tumors found this way are non-lethal. And you can't screen often enough to detect the fast growing, lethal tumors. My wife the nurse says this is rubbish.

The third idea is this. Just because Notes allows you to make simple changes to applications very quickly and easily, doesn’t mean you should. In fact, you shouldn't. Here's why. Users don't like constant change. They like to know that what they did yesterday will still be possible to do today. But they do like to know that you are responding to their feedback. Simply collect all the comments into one bigger release. You will be able to spend more time working on related items, changing that main form just once, and cleaning up all those things that you wanted to address at the same time. It is a side effect of the RAD environment Notes provides, but it can be detrimental to respond too quickly to change requests.

03/17/2009

How I GTD (Get Things Done)

Category  
0
Recently I commented on the Getting Things Done session at Lotusphere (BP304 - IBM Lotus Notes and Me: Maximizing Personal Productivity with Lotus Notes), over at the Governance for Notes blog. Well, I was one of the worst offenders. My inbox had over 150 UNREAD messages alone. Since that time, my inbox is empty every night when I leave, I have only 4 folders I put things in (isn't searching much easier?), and all those screen shots end up in my personal journal rather than cluttering up my desktop (and I am working greener too!). I now use the mail preview feature all the time (one less click) ( note to self - change the calendar invite to allow accepting in preview mode). The one aspect I haven't embraced is the To Do list, unless you count my calendar.

My aversion to lists goes way back. When my kids were little (they both own their own houses now, thanks for asking ), they had a series of stories with a toad and a frog. One of my favorites has the toad (or the frog) sitting by the side of the road and the frog (or toad) comes up and asks him what he is doing. The toad says he lost his To Do list. The frog says why don't you find it. The toad says I don't remember all the things on my list, but I am pretty sure finding the list was not one of them! This goes on for awhile and ends when the toad remembers one item on his list - go to bed. So, at 10 am, that is what he does.

Anyway, I don't know if I am getting things done any better than before, but at least my inbox is empty and I am trying to be more efficient. Incidentally, I will be at the View's Developer 2009 show (or the Admin 2009 if you prefer) in Boston, so stop by our booth and we can talk about it!

01/27/2009

If I could mashup some Lotusphere sessions ...

Category
0
As always, there were some great sessions this year at Lotusphere. There were three in particular that I would have combined. The first would be Developing a World-class Web 20 App with X-Pages by Bruce Elgort and Matthew White. They did a fabulous job with a new app - Task Jam. But I would have mashed this with the session by Eric Mack and David Allen on Maximizing Personal Productivity with Lotus Notes. These are the ‘Get Things Done’ guys. That would have been a nice app to do in X-Pages. That app had a lot of UI decisions, and that's where I would mash in my third session. Getting to WOW ... Interface First Design by Chris Blatnick and Tom Duff. Of course that mashup would take all day but the results would be well worth it.

01/16/2009

Sneak Peek Analyzer template preview

Category
0

At our last Tool Time presentation, I showed some new views that are going to be part of the next release.  There is also a hidden view that allows some of the advanced filters I demonstrated.  Here is that template.  Note that this has not been signed by a typical ID, and it has a different file name from the template released with Analyzer (to allow roll back if necessary), and it claims to be the same template name as the regular template.  You should sign and rename as appropriate for your situation.  And needless to say, this sneak peek version is not the supported release version, but feel free to contact me with questions.
Download File DEANTemplate.ntf

01/14/2009

ND8 fix required

Category      
0
I was working with a customer and was made aware of a change in the way ND8 works that was breaking her pre-ND8 apps. It turns out that she somehow got forms without the compiled Lotuscript. Prior to ND8, the code was compiled when the form loaded, so no problems. Apparently. for performance reasons, ND8 doesn't do this, so the code behind the events is not found, and the form doesn't load. The fact of the missing object code is not reported by any of our design tools, but it is detectable via Lotuscript. I wrote the following bit of code to print out the forms with this problem.

       Dim s As New NotesSession
       Dim db As NotesDatabase
       Dim doc As NotesDocument
       Dim nn As NotesNoteCollection
       Dim nID As String
       Dim x As Variant
       
      Set db = s.CurrentDatabase
       Set nn = db.CreateNoteCollection( False )
       nn.SelectForms = True
       nn.SelectSubforms = True
       nn.SelectionFormula = "@isAvailable('$$Script')"
       Call nn.BuildCollection
       
       If nn.Count = 0 Then Exit Sub
       nID= nn.GetFirstNoteId
       Set doc = db.GetDocumentByID( nID )
       Do While Not( doc Is Nothing )
               If Not( doc.HasItem( "$$Script_O") ) Then
                       x = doc.GetItemValue( "$TITLE" )
                       Print x( 0 )
               End If
               nID = nn.GetNextNoteId( nID )
               If nID = "" Then Exit Sub
               Set doc = db.GetDocumentByID( nID )
       Loop

Change the bolded line to point to the database you want to scan. This simply prints out the name of any form in the database that is missing the compiled object code. You may not have any, but this step allows you to be proactive in identifying this situation. I hope this is useful and helps.

11/15/2008

I may be lazy but...

Category  
0
I have recently run into several organizations that have had 'problems' because they have private agents in databases in their production environment. All sorts of alarm bells go off - why are they private? Why are they necessary? What are the requirements of the application that support this need?

When you have an agent that is only available to an admin because they occasionally need to go into a database to 'fix' some data, you HAVE to say there is something wrong with the design of the application. Why is the data messed up? Why did the application allow the data to get this way?

And in case you are wondering, the solution is not to create a private agent to fix it this one time, only to leave that agent in the production environment as a part of the overall application design. The correct solution is to prevent users from doing the things that they do to mangle your data. That is one of the requirements for your application, even if it is not explicitly defined. Remember - the customer is always right, and users are allowed to be stupid! And here is a real simple exercise that should be in every application test plan - what happens if you delete a document?

So, spend the time to test your application, and get those features correct so no one has to go in later to 'fix' the data.

10/28/2008

What's the Coolest Application You Have Worked on?

Category
0
I was doing some contract work at a local college (soon to be university). They, like many other colleges, used a commercial, off-the-shelf Oracle application to store student and course information. The athletic department wanted to keep track of student athletes on academic probation -- make sure they were attending class, doing homework assignments, etc. So they went to the Oracle team and asked them to build this application.

Oracle team: "How often are you going to use this application?"
Athletic dept: "Once or twice a semester."
Oracle team: "Okay, we'll add it to our list of projects."
Athletic dept: "When can I test this?"
Oracle team: "We'll let you know."

So the athletic department came to the Notes team.

Notes team: "Sure -- one SQL query for student athletes on probation, one SQL query for their courses, and then an email to their professors. Do you want out-of-season sports as well as in-season?"
Athletic dept: "Wow -- you can do all that? When can I test it?
Notes team: "2 weeks."

The application worked so well the Dean of Students expanded it to all students on academic probation. The really cool part is how easy it was to do with Notes -- accessing data from a non-Notes database, adding bits of information, adding some email notifications, and in much less time than the relational database people could do it in, if it ever became enough of a priority.

How about you? What's the coolest application you have worked on? By the way, if it is really cool, you might also want to enter it in the Teamstudio Spotlight Awards contest.

10/13/2008

What do you call a Best Practice when a better practice comes along?

Category  
0
Was the best practice just a mistake? How could you get better than best?

I was talking with Rocky Oliver the other day and we were discussing signing agents. In the old days, we didn't pay too much attention to who signed the agents. We developers had full access to production, with full permissions to run any agent on the server, and all the end users trusted us. We now know that some developers are not to be trusted. So the practice became to sign the agents with another ID. The problem was the Admin client gave us the choice of current user ID or the server ID. Well, that's easy. It's too hard to create a new ID for signing because you would have to switch to that ID, so let's just sign the database with the server ID.

Once again, that has turned out to be a bad idea, because you have given the agent all the permissions the server has - no data is safe anymore. So the practice became to sign the database with a special ID, like 'Lotus NotesTemplate Development' or 'Teamstudio Template Development'. The bad part of this was giving that ID permission to run unrestricted methods and operations (which means that they can perform operations that are restricted, such as accessing the file system on the server).

So the 'Best Practice' has evolved so that agents should be signed by a special ID, and that ID should not be in the group that can run unrestricted methods. Agents that need to perform restricted operations need to be justified, reviewed, and signed with an even more special ID. And that's the Best Practice. At least for today...

09/02/2008

Be careful what you search for!

Category
0
I was working with one of our customers, and I can tell this story because he was working on a third party application that someone else wrote. Do you know the JavaScript function navigator.appName? It is used to tell what type of browser is accessing your application. In Notes/Domino 7, this function was changed so that it now returns "IBM Lotus Notes" instead of just "Lotus Notes". So any application that tests for a Notes client needs to change to look for this new string. This person was trying to reduce the number of 'false' search results and was looking for the strings.

navigator.appName == "Lotus Notes"

and

navigator.appName <> "Lotus Notes"

Well, it turned out that this approach missed code like this:

variable = "Lotus Notes"
:
:
navigator.appName == variable


and several other instances, including one in the original code that was mis-typed as "LotusNotes" (no space) which never worked in the first place! The moral of the story is, you can be too smart for your own good. In this case, it is best to just find every occurrence of navigator.appName and look at it in context. Or, you could search for navigator.appName AND "Lotus Notes" and hope that the variable is not passed as a parameter, making it defined in a different sub or function from where it is used. But whatever you do, you need to look in every design element to make sure you find all occurrences because we can hide code in a lot of different places.

08/15/2008

Show Time

Category    
0
People who don't know me must think I came from a small town in Missouri. I'm from the part where not only must you show me, but I have to show it to myself. I recently heard a presentation on 10 functions to avoid and one of them was GetNth document. I thought that was kind of odd to be making a blanket statement like that so I had to find out for myself. I wrote a simple example to walk through some documents - one using GetFirst/GetNext and the other using GetNth.

So when I ran my example, I was surprised to find that GetNth was actually faster than GetNext. Let me say that again. On ND 7.0.1, Lotus has quietly improved the performance of GetNth so now it is actually faster than using a GetNext loop. But wait - there's more. Sure, for a small sample size it might be faster, but those of you in the real world have databases with thousands of documents. So yes, I did run my tests on a database with 40,000 documents. And GetNth was still faster. Now, it's not so much faster that I would go and re-code all my loops, but I certainly won't avoid using GetNth entirely.

(read more)

08/04/2008

Don't Ask a Question You Don't Want to Know the Answer To

Category
0
You may have seen other references to a new product we are coming out with called Agent Registry. Just so you know, we do use our tools on our own systems. One of the things that Agent Registry does is report on the errors generated by scheduled agents - messages that normally end up in the vast pit of the Notes log. I was looking at the Agent Registry log the other day and noticed that an agent called 'Overdue Invoices' wasn't running because of some LSX error. Do you think this might be important to know? How long has this been going on? I'll get back to you on that, as soon as I go through all my overdue invoices!

05/30/2008

Corrupt Design Elements: Urban Legend or the Latest Political Scandal?

Category  
0
We were having this discussion the other day and one of the guys said 1 in 25 databases has corrupt design elements in them. I have seen them, but not in any database that has been regularly updated. Case in point--a customer sent us a database that was causing problems for one of our tools. Our investigation found that there was a piece of code laying around that was modified by a Mac designer client--no, not something new, but left over from 10 or 12 years ago. And we all know that Notes is famous for leaving stuff laying around. For example, put in a Hide-When formula, but don't check the box to use the formula.

I don't know if this is a good thing or not, but stuff gets left around. But my contention is that corrupt design elements used to be a problem, but the problem is less prevalent today, in fact, so rare that it is not found in modern databases. I do see more interest in the subject as people are looking to upgrade to ND8, which is a good thing. But by this point, most people have already been through at least one migration, fixing any corrupt design elements that had been left around.

But what is your experience? Do you still find corrupt design elements?

05/14/2008

Separating the Men from the Boys

Category
0
Anyone who has been working with Notes for awhile can tell you what a 'run once' agent is. And a newbie can't. And here's the weird part - the reason the new kids don't know what a run once agent is, would be a surprise to the old timers. That's because run once agents disappeared in ND6 and us old guys forget that (because we don't think about it, not because we are forgetful). Although in typical Lotus fashion, the run once flag is still used - but now it means that the target documents of the agent are 'none', which of course makes it perfectly clear for all of us. ;)

And the real reason I bring this up is that I was trying to get a handle on all the agents on my server, and not just the scheduled ones. I found a wide variety of issues with a lot of agents, Things like nonexistent servers to run on, agent signers not authorized to run restricted agents or is it unrestricted? Which agents are more powerful? That's right, the unrestricted agent can do anything. It's not that the restricted agent can do restricted things.

So, my question for you is how do you keep track of the things that are messing with your data?

04/22/2008

Print Screen Isn't a Method of Source Control

Category  
0
I am amazed at the number of people I talk to that use 'print screen' as a method for controlling their source code. The rationale is, apparently, that if the modified date for a design element is the same in this printout from last month as the printout I did today, the design must not have been changed. But does that printout tell you when someone restored that version from a backup? What happened in between? And if the date has changed, can the printout tell you why it changed? Now, I truly believe that not all applications need to be tracked, but for those that do, how can manual processes be acceptable? There are so many shortcomings with screen prints that people shouldn't even bother.

04/14/2008

How I got started in Lotus Notes

Category  
0
I walked into the lobby and saw a pencil laying on the table. I picked it up to see what kind it was, and just then some guy comes in and says 'I see you have a coding pencil--you must be the Notes developer the agency sent over." And that's how it all started.

No? Okay, seriously. I have an engineering degree and an MBA. I have been involved in high tech for a long time, in roles including development and tech support. In the early 90's one of the people in my group brought this guy in to show us this cool new tool called Lotus Notes. I was hooked on the rapid application development aspects right from the start. About the same time, circumstances allowed me to get laid off by my employer, only to start working for them as a contractor the following week, doing Notes development. And I haven't looked back since.

I have developed applications at large companies, and at small companies for large companies. I have presented sessions on server sizing at Lotus Symposiums, and I have sat in many sessions over at the Yacht and Beach Club, cheering along with the rest as new features were shown. And when I was looking for a new challenge, the recruiter told me about a company in Beverly looking for a sales support manager. I said that must be Teamstudio. I started here a little over a year ago, and don't tell anyone where you heard this, but I'd pay them to let me do what I do here. I am just so glad to continue to be involved in Lotus Notes, and to be able to talk to the wide variety of people I run across. Lotus Notes is used in so many different companies, that I continue to be amazed at what people do with Notes. And the technology keeps changing, so there is always something new to learn--and to share with other people. I get to wear many hats over here, and hopefully you will see me wearing one of them someday.

In the mean time, that's my story and I'm sticking to it.

04/02/2008

Welcome to the Lotus Community Bob Picciano

Category
0
There were so many 'announcements' yesterday that we had to let them gestate for a day so that we knew which ones were real. I particularly enjoyed the one where the iSeries was going to be renamed the AS/400. But there were some other, real announcements made at COMMON, generating responses like this one. I was sad to realize the CouchDB announcement was fake--too good to be true.

But it turns out the Mike Rhodin news was real, as confirmed by Ed Brill. We want to join in and welcome Bob Picciano to the Lotus community!

03/06/2008

Teamstudio's Dirty Little Secret

Category  
0
Those who know us know that we are all about template based development. Because you know that it is the process of giving the template to the admin to update design that relieves us developers from any responsibility to making changes in production. But you know what? We don't actually develop on templates. I know--what hypocrites! Here's the whole story. An NTF file has size limitations that an NSF file doesn't, scheduled agents in NTF's are ignored, and you can't preview anything in an NTF with a web browser. So, rather than make changes to an NTF, refresh the design of our development copy of the NSF, go back to the NTF to fix what we didn't get right (it might happen!), refresh the design again... we just do our development in the NSF.

But here is the key part--when we are done with our development and are ready to hand it over to test, we make a new copy of our NSF, just copy design (no documents), and we name the file whatever.NTF. We just created a template! And check this out - our NTF doesn't claim to be a template! This avoids the whole issue of multiple databases 'claiming' to be a template. But it does allow us to REPLACE the design of the database we are testing. That's because the Replace Design dialog shows all NTF's, regardless of where they are on the system or whether they claim to be a template. Refresh Design, and the server based design task, both rely on the database saying it gets it's design from a template.

So we really are doing template based development, without using templates--sort of. Now, if only there were a tool to automate this process...

02/11/2008

It's the Admin's Fault!

Category  
0
One of my favorites from this years sessions was a comment made by Bill Buchan, of course. In the Worst Practice session he said one of the reasons he likes having the admins apply his design changes in production, rather than do it himself, was because if something broke, it was the admin who did it, not him! I'm all in favor of that. My other excuse for having the admins do it is because I got tired of working nights and weekends to apply my changes. You should give it a try yourself! The session was entertaining as always, and you can find more here. For those who missed it, Duffbert (Tom Duff) come up at the end and told how Bill and Paul Mooney broke every rule in setting up and running the server for Irish Lotus User Group--a true case of do as I say...

You can hear the pledge that began the session here (audio isn't the greatest) on YouTube.

12/20/2007

Copying and Pasting Your Way to a Crawl

Category
0
I was walking around the office the other day and overheard someone complaining about a button taking up to 3 minutes to perform an action on 10 documents. Two things occurred to me. One, users don't normally complain about things like this because they have no idea how long something should take, so they just assume it is working the way it was designed and that's the way it is. The second thing is people don't normally think of something as simple as a button as having performance issues.

I had to look into it. What I found was the agent was changing one field, then doing a ComputeWithForm. There's your sign. It was a very complex form so there must be other fields affected by the change. So then I tried to find the 'other fields.' And there weren't any. Wait a minute, if there weren't any fields affected, why was the ComputeWithForm being done? Further review showed that there were many more agents that changed one field and then did a ComputeWithForm.

There are two things wrong with this picture. The first one is a ComputeWithForm can be a very expensive way to update fields, especially on a complex form, and especially in a user-initiated process across several documents. It is much better practice to identify the affected fields and just re-compute them. The second thing is don't go around copying and pasting things that you don't understand. There may have been a legitimate reason for the ComputeWithForm in the first agent (although I doubt it) and copying the agent for a similar task just propagated that bad code. I can't tell you how many times I have seen excess code pasted somewhere because the developer didn't understand what was being copied.

Removing that ComputeWithForm made the button run in 3 seconds instead of 3 minutes. And the users were now able to use the button. The functionality was so painful before that most users avoid using it, with the result that their work was unorganized and inefficient. All because of a copy and paste!

11/07/2007

If You're Going to Refactor, Go All Out

Category    
0
I was looking at someone else's code the other day and came across a button that had code like this:

fieldName := FieldName; D_PLATFORM_PATHSEP := "\\" : "\\" : "\\" : ":" : "/";
D_PLATFORM_TYPES := "Windows/16" : "OS/2v1" : "Windows/32" : "Macintosh" : "Unix";
D_Product_RepID := dProductRepID;
D_Product_View := "PrimaryNotesNamesRegion";
U_Product_Title := "Select a Product";
R_POKCANCELLIST := "Select an product from the list";
D_Product_Column := 6;
D_Product_View := "PrimaryNotesNamesRegion";
D_Product_Region := "Northeast";

and then some 20 lines later,

Choice:=@PickList([Custom]:[Single]; D_Product_RepID; D_Product_View; U_Product_Title; R_POKCANCELLIST; D_Product_Column; D_Product_Region);

And in the meantime, there was a bunch of generic code to get the database path and server name.

So what is wrong with this code? You know it was updated to use a replication ID instead of a server and database name. But, when was the last time you saw Notes on an OS2 platform? And what is up with all the path name stuff when it wasn't even used? And did you see the grammar mistake? You know this code is so last century because of the first line that was needed in R3, and because of the reference to Windows16. And defining parameters so far from where they are used doesn't really make code re-use simpler as much as it makes maintenance more difficult. Especially when those 'parameters' are only used one time.

So, the next time you have to update an application, help us all out and get rid of any unnecessary code when you see it.

10/11/2007

Concurrent Development

Category  
0
I have recently had conversations with several groups of Notes developers looking for a tool to support the way they want to work. The situation involves several developers working on the same database, making changes for various reasons. Everybody has adopted a practice to manage multiple developers in the same database, whether it is using design locking or passing the coding pencil. The problem is that they want to release selected bits of functionality without releasing other bits that may still be being tested or developed. Current practices that these teams have used include cutting and pasting individual design elements, turning on the prohibit refresh flag, and many other schemes that can cause more problems than they solve (cutting and pasting can cause replication failures of design elements, prohibit refresh can be left on inappropriately, etc.).

But consider this--how thoroughly can something be tested if you are selectively pushing design changes into production? If you test your changes and then only put some into production, how do you know that what you put into production didn't somehow rely on something you didn't move? (more)

Feeds

Custom Button Custom Button

Category Cloud

Disclaimer

The views expressed by the authors on this blog do not necessarily reflect the views of Teamstudio, those who link to this blog, or even the author’s mother, father, sister, brother, uncle, aunt, grandparents, cousins, step relations, any other blood relative - and sometimes not even the author himself or herself.

Comments on this website are the sole responsibility of their writers and it is assumed those writers will take full responsibility, liability, and blame for any libel or litigation that results from something written in, or as a direct result of something written in, a comment. The accuracy, completeness, veracity, honesty, exactitude, factuality and politeness of comments are not guaranteed. Oh, how they are SO not guaranteed.