Monday, April 23, 2007

Run scheduled agent every 60 seconds

The shortest time between executions of a scheduled agent is 5 minutes. But very often you want to run some important function with only 1 minute interval. Your function takes maybe only 2 seconds to run, but you still are required to wait 5 minutes before it can be started again at the next agent invocation.

The agent I created makes it possible to simulate running agent every 60 seconds, or even every 2 seconds if you wish so. Some restrictions apply :)

It uses the fact that Notes counts 5 minutes from the START of the previous instance, not from the END. So if your agent takes 4 minutes 50 seconds to run, the next execution of the agent (assuming perfect conditions) will be just 10 seconds after the previous execution is finished. Delays caused by server load and other unforeseen delays can cause the agent to wait from 30 seconds to 2 minutes until the next execution. During many tests, I havent's observed execution delay longer than 2 minutes.


Even with the worst case 2 minutes delay, it's much better than standard 5 minutes delay. Note that this delay is only for the time between agent executions, within the started agent you can call the function every 2 seconds if you wish.

What if the function takes more than 5 minutes to run? Well, the next instance of the agent will wait until the current instance is finished and then start after a certain delay. In my tests the delay was almost always 2 minutes. The delay if the agent ends 15 seconds BEFORE the 5-minutes period (4m 45s) was according to my tests always 1 minute 5 seconds. These numbers will most certainly be somewhat different on your server.


The main disadvantage of this method is that one of the Agent Manager's threads will be constantly busy, so you would need to increase the number of agent threads to make it possible for other scheduled agents to run too.

To enable your agent to run every 60 seconds, do following:
1) In your existing agent, move the code from Initialize method to MainAction method.
2) Paste the code from the agent below into the Initialize method of your agent.
3) Change variable values as needed.

Agent is configured to execute the MainAction() function every 60 secondss (runinterval), max 100 times (runmaxtimes), during the 5 minute period (agentschedinterval).

Agent execution flow. Click to enlarge.


"Gone in 60 seconds" agent:



Sub Initialize
'Created by Andrei Kouvchinnikov, www.botstation.com

Print "******************* Agent started *******************"

Dim session As New NotesSession
Dim db As NotesDatabase
Dim expectedruntime As Integer 'time which take to run the function. required only for deciding about ending the loop.
Dim runinterval As Integer 'interval (sec) between runs
Dim runmaxtimes As Integer ' max number of times the function will run
Dim runcounter As Integer 'counter of number of times the function run
Dim runstart As Long, runend As Long, rundiff As Long
Dim notimeleft ' loop must be closed now, no time left to run another round
Dim agentstart As Long 'initial time when agent started. required only for deciding about ending the loop.
Dim agentschedule As Integer 'nr of minutes this agent is scheduled to run. required only for deciding about ending the loop.
Dim dynadjust 'instead of hardcoded runtime value, use last run period for calculation of next period
Dim uselongestperiod 'instead of the last run period, use the longest period the function took to run

expectedruntime=10 ' function is initially expected to take max 10 seconds
runinterval=60 ' function is called with interval of X seconds
runmaxtimes=100 'if function's run time variates, you can limit max number of times function runs
agentschedinterval=5 'agent is scheduled to run every X minutes. From the agent properties.
margininterval=5 'nr of seconds to add to the final round. used for situations when function's execution time is 0.
runcounter=0
dynadjust=True
uselongestperiod=True

agentstart=Timer

While runcounter<runmaxtimes And notimeleft=False
runstart=Timer

Call MainAction()

runend=Timer
If dynadjust=True Then expectedruntime=Int(runend-runstart) 'dynamically adjust expected time to actual time it take to run the function
If uselongestperiod Then
If expectedruntime<Int(runend-runstart) Then expectedruntime=Int(runend-runstart)
End If
timeleft=runinterval-expectedruntime

If Int((agentschedinterval*60)-Int(Timer-agentstart))<timeleft+(expectedruntime+Int(expectedruntime/100*30)+margininterval) Then 'assumes that function can take 30% longer time to run than the last time
notimeleft=True
Print "Exit. Function will not manage to finish one more run. Computed time: "+Cstr(Now)+" + "+Cstr((expectedruntime+Int(expectedruntime/100*30)))
End If

If timeleft>0 And notimeleft=False Then
Sleep timeleft 'finished before the expected time. sleep until next execution.
Else
Sleep Int((agentschedinterval*60)-Int(Timer-agentstart))-margininterval 'sleep X seconds-margin
End If
runcounter=runcounter+1
Wend
Print "******************* Agent finished *******************"
End Sub


Sub MainAction()
Print "Triggered "+Cstr(Now)

%REM
Here goes your code
Delete demo code below.
%END REM


Randomize
sleeprand=Int(Rnd()*10)
Sleep sleeprand 'Simulates time taken by the function's operations by sleeping X seconds

End Sub





This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.


Output from the agent. Note the 1m 5s delay between instances.



Technorati:

Thursday, April 05, 2007

Happy Easter!

Happy Easter everyone!


Bible reading for the 21st century: let Sametime bot to choose a random quote from the Bible, and then find that chapter in the book and continue reading from there!

Link to online bot: Random Bible Quote

Monday, February 05, 2007

The fastest way to programmatically import data from Excel to Lotus Notes

There are several ways to import data from Excel to Lotus Notes/Domino. One of the most popular is the built-in Import menu option, which can be used manually and works fine in most cases.

But if you want to import Excel data programmatically, the easiest way is to use Excel's OLE Automation Objects. There are several ways to read data from Excel using OLE, and the one most often mentioned is reading data cell-by-cell. This is a very slow method, and should only be used if you want to read/write special cell properties such color, fonts, etc.

The fastest method I found so far is to read and write Excel data using blocks of data with ExcelSheet.Range method. You can with a single operation read the whole Excel sheet into an array, which extremely efficient, especially if there are many columns.

I have created an example which can be used to import people from Excel to Notes. Sample Excel file can be downloaded here.

Depending on the type of data and number of columns, the speed of this method can be up to 100 times faster than reading cell-by-cell. It imports 100 person documents per second, and the most of this time is used on creating new Notes documents, not on getting data from Excel.

Sub Initialize
'This agent imports person records from Excel to Notes. It uses Range method which makes it very fast.
'Created by Botstation Technologies (www.botstation.com)

Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim xlApp As Variant, xlsheet As Variant, xlwb As Variant, xlrange As Variant
Dim filename As String, currentvalue As String
Dim batchRows As Integer, batchColumns As Integer, totalColumns As Integer
Dim x As Integer, y As Integer, startrow As Integer
Dim curRow As Long, timer1 As Long, timer2 As Long
Dim DataArray, fieldNames, hasData

timer1=Timer
filename="C:\people.xls"
batchRows=200 'process 200 rows at a time

Set db=session.CurrentDatabase
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True 'set Excel program to run in foreground to see what is happening
Set xlwb=xlApp.Workbooks.Open(filename)
Set xlsheet =xlwb.Worksheets(1)

Redim fieldNames(1 To 250) As String

DataArray=xlsheet.Range("A1").Resize(batchRows, 250).Value 'get worksheet area of specified size

For y=1 To 250 'we assume max 250 columns in the sheet
currentvalue=Cstr(DataArray(1,y))
If currentvalue<>"" Then 'abort counting on empty column
fieldNames(y)=currentvalue 'collect field names from the first row
totalColumns=y
Else
y=250
End If
Next

Redim Preserve fieldNames(1 To totalColumns) As String

curRow=2
hasData=True
While hasData=True 'loop until we get to the end of Excel rows
If curRow=2 Then startrow=2 Else startrow=1
For x=startrow To batchRows
curRow=curRow+1
If Cstr(DataArray(x,1))+Cstr(DataArray(x,2))<>"" Then 'when 2 first columns are empty, we assume that it's the end of data
Print Cstr(curRow-2)
Set doc=New NotesDocument(db)
doc.Form="Person"
doc.Type = "Person"
For y=1 To totalColumns
currentvalue=Cstr(DataArray(x,y))
Call doc.ReplaceItemValue(fieldNames(y), currentvalue)
Next
doc.ShortName=doc.FirstName(0)+" "+doc.LastName(0)
Call doc.save(True, False)
Else
hasData=False
x=batchRows
End If
Next
If hasData=True Then DataArray=xlsheet.Range("A"+Cstr(curRow)).Resize(batchRows, totalColumns).Value 'get worksheet area
Wend
timer2=Timer
Call xlApp.Quit() 'close Excel program

Msgbox "Done in "+Cstr(timer2-timer1)+" seconds"
End Sub


This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.


The Excel sample file was generated using this online tool: data generator

Tags:

Tuesday, January 30, 2007

Programmatically change user's Notes password

To programmatically change user's password, Domino developers can use API function W32_SECKFMChangePassword. The function accepts 3 parameters: path to ID file. old password and new password.
Based on the article on experts-exchange web síte, I have created a LotusScript agent which prompts user for his old password, prompts for the new password, automatically reads the path to current ID file and changes the password for that ID file.
Same code can be used in a LotusScript button mailed to users with instructions to click the button in order to change their current password.

At the end of the script developer might also want to add functionality to send an email to the administrator notifying about successfull or failed password change.


Const NOERROR = &H0
Const ERR_MASK = &H3FFF
Const NULLHANDLE = &H0

'// Lotus Notes/Domino C API (Windows/Intel 32-bit)
Declare Function W32_SECKFMChangePassword Lib {nnotes.dll} Alias {SECKFMChangePassword} ( Byval pIDFile As String , Byval pOldPassword As String , Byval pNewPassword As String ) As Integer
Declare Function W32_OSLoadString Lib {nnotes.dll} Alias {OSLoadString} ( Byval hModule As Long , Byval StringCode As Integer , Byval retBuffer As String , Byval BufferLength As Integer ) As Integer

Sub Initialize
Dim session As New NotesSession
Dim IDFile As String, oldpassword As String, newpassword As String
IDFile=session.GetEnvironmentString( "KeyFilename", True )
oldpassword=Inputbox("Enter old password", "Old Password")
If oldpassword="" Then
Msgbox "No password entered"
Exit Sub
End If
newpassword=Inputbox("Enter new password", "New Password")
If newpassword="" Then
Msgbox "No password entered"
Exit Sub
End If

Call ChangePassword(IDFile,oldpassword,newpassword)
End Sub

Sub ChangePassword( id As String, oldp As String, newp As String)
Dim intAPIResult As Integer
Dim szErrorText As String
Dim szBuffer As String * 1024

intAPIResult = W32_SECKFMChangePassword ( id, oldp, newp )
Stop
If Not ( ( intAPIResult And ERR_MASK ) = NOERROR ) Then
szBuffer = String$ ( Lenb ( szBuffer ) , 0 )
Call W32_OSLoadString ( NULLHANDLE , intAPIResult , szBuffer , Lenb ( szBuffer ) - 1 )
If Instr ( 1 , szBuffer , Chr$ ( 0 ) , 5 ) > 1 Then
szErrorText = Left$ ( szBuffer , Instr ( 1 , szBuffer , Chr$ ( 0 ) , 5 ) - 1 )
Elseif Instr ( 1 , szBuffer , Chr$ ( 0 ) , 5 ) = 0 Then
szErrorText = {}
Else
szErrorText = szBuffer
End If
Messagebox szErrorText , 16 , {C API ERROR CODE: } & Cstr ( intAPIResult )
Else
Msgbox "Successfully changed"
End If
End Sub



Tags:

Saturday, January 27, 2007

See Lotusphere Opening Session video recording on Second Life

You can now see the recording of Lotusphere 2007 Opening Session (with guest speaker Neil Armstrong) available on 3-D chat Second Life and on IBM's web site. It's 2 hours 13 minutes long, so it's probably a good idea to watch it at home instead of dong it at work. To see the recording in Second Life, go to IBM Theater on IBM Island and click on the big TV screen. In a couple of seconds you'll see the video on 4 TV screens. Below is a screenshot of me watching Mike Rhodin's opening speech. In the middle right corner of the screenshot you can see Virtual Lotusphere building where you can (if you are lucky) meet other Lotusphere interested people. I hope that more IBM employees and business partners discover the Second Life program and IBM island.

Click to enlarge





Opening session webcast on IBM's web site:
https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?lang=en_US&source=sw-pprod05&S_PKG=SW-lotusphere2007webcast

Tags:

Wednesday, January 24, 2007

Sametime bot shows latest Lotusphere2007 blogs

Today I've created a new bot function which shows latest 20 blog posts tagged with "Lotusphere2007" on Technorati. Took me 20 minutes to modify it from an old example of LotusScript agent and setup STWidget, the LotusScript agent code can be improved but it works.

It works like this: you type "Lotusphere2007" (not case sensitive) to sametime bot and it responds with the 20 latest blog posts. You can click the links in the result to read the post.

Here you can try the "Lotusphere2007" bot live: http://www.botstation.com/sametime/stwidget_lotusphere.html

Or just try it embedded at the end of this post with help of Sametime Widget.

Code of the LotusScript agent which bot calls to get the results:
Function AgentMain(doc As notesdocument)
Dim param As String
param= doc.ArgValue(0)
Dim objHttp, i
Set objHttp = CreateObject("Microsoft.XMLHTTP")
url = |
http://feeds.technorati.com/feed/posts/tag/lotusphere2007|
objHttp.open "GET", url, False, "", ""
objHttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.send("") 'send request to web server

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.loadXML (objHttp.ResponseText)
Set xmlLst = xmlDoc.getElementsByTagName("item")
cnt=0
For i = 0 To xmlLst.length - 1
cnt=cnt+1
Set xmlNode = xmlLst.Item(i)
Set att=xmlnode.childnodes
Forall child In att
If child.nodename="title" Then
tmp=tmp+Cstr(i)+". "+child.text+": "
End If
If child.nodename="link" Then
tmp=tmp+|<a href="|+child.text+|" target="_blank">Link</a><br/><br/>|
End If
If cnt=20 Then i=xmlLst.length
End Forall
Next

AgentMain="Last 20 posts in category Lotusphere2007:"+"<br/>"+tmp
End Function








Tags:

Monday, January 22, 2007

Sunday, January 21, 2007

Notify database responsible person about new documents using Sametime

Imagine that you are responsible for a Domino application where users can register themselves and you want to get notified about about new registrations as soon as possible.

Screenshot of the demo application:
reg db demo

This can be done by sending an email message in WebQuerySave event or SMS message, but it has its disadvantages. Sending by email can give several minutes of delay, and receiving 20 SMS per hour can be annoying. Using Sametime messages for notification is not as disturbing as beeping SMS messages and also ensures instant delivery.

One more way to see the latest registrations is to use a Sametime bot to get a quick overview of the latest registrations without opening the database in Notes client.

Let's see how you can use tools provided by Botstation Technologies (all available as free trial) to accomplish these tasks.
1) Immediate notification when user saves his registration
2) Course administrator gets latest results by asking Sametime bot

Immediate notification
To immediately notify the responsible person about new registration, all you need to do is add a couple of code lines into your WebQuerySave agent. The code uses STAgent script library, which contains the most popular functions for working with Sametime. You can easily send a Sametime message to the specified person:
Here is an example:
Dim STAgent as New STAgent()
Call STAgent.login("stserver.company.com", "Notification Agent", "password")
Call STAgent.sendMessage("Admin Doe", "New registration: "+doc.CourseDate(0)+" / "+doc.CreatedBy(0)+" / "+doc.Subject(0))
Call STAgent.logout()

The recipient immediately gets a Sametime message showing registration details and can take an appropriate action if needed.

If you have several responsible persons and want to send the notification message only to one of them, you can send the message only to the first person whos Sametime online availability status is set to Active. You can query the online status with this code line:
onlinestatus=STAgent.getOnlineStatus("Admin Doe") 'Active, Away, Offline

You can download an evaluation version of the STAgent and try by yourself in your own agents.


Notification on demand
Instead of sending a Sametime message immediately after each registration, you can query Sametime Bot to get the new registrations since last the query time. Sametime Bot from our company Botstation Technologies is able to run ordinary LotusScript agents, which makes it possible to accomplish this task in just 5 minutes. Same solution can be re-used later in similar applications. You can also restrict access to this particular bot functionality to only certain persons.

"Access properties" screenshot:

Sametime bot security

To ask bot for new registrations, you simply choose bot from your buddy list and type "registrations" to him. Bot receives your message and immediately answers with a list of last registrations.
To make this work, all you need to do is to create a LotusScript agent which searches for documents created after agent's last run time and then create a Question mapping in the bot's configuration database.
To create a bot question which triggers an agent, you specify keywords (e.g. "registrations", "bookings") and choose an agent from a list of available agents. See the picture below.

Sub Initialize
Dim s As New NotesSession
Dim agent As NotesAgent
Set agent = s.CurrentAgent
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = s.CurrentDatabase
Set doc = db.GetDocumentByID(agent.ParameterDocID)
tmp= AgentMain(doc)
doc.AgentResult=tmp
doc.savedbyagent="Yes"
Call doc.Save(True,False)
End Sub

Function AgentMain(doc As notesdocument) As String
Dim session As New NotesSession
Dim db As NotesDatabase
Dim coursedb As notesdatabase
Dim coll As NotesDocumentCollection
Dim coursedoc As NotesDocument
Dim agent As NotesAgent
Set db=doc.ParentDatabase
Set coursedb=New NotesDatabase(db.server, "coursereg.nsf")
Set agent=session.CurrentAgent
Set dateTime = New NotesDateTime(agent.LastRun )
Set col=coursedb.search(|Form="Document"|, dateTime, 0)
Set coursedoc=col.GetFirstDocument
tmp="No new registrations found since "+Cstr(agent.LastRun)
If col.count>0 Then tmp="Found "+Cstr(col.count)+" new registrations since"+Cstr(agent.LastRun)+"<br>"

While Not coursedoc Is Nothing
tmp=tmp+coursedoc.CourseDate(0)+" / "+coursedoc.CreatedBy(0)+" / "+coursedoc.CourseName(0)+"<br>"
Set coursedoc=col.GetNextDocument(coursedoc)
Wend

AgentMain=tmp
End Function


I've created a live demonstration of this functionality using the code above, you can try it here: live demo of Sametime bot reading the registration database

To emulate the real application, the bot in the demo application adds a random number of new documents (1-5) after each run. So every time you issue "registrations" command to bot, you will get some unique results.

Screenshot:
Sametime bot answers

Tags:

Sunday, January 14, 2007

Sametime-related error messages at console after removing Sametime server

If you uninstalled Sametime server from Domino server, or manually removed Sametime task, you can sometimes get following error messages in Domino console:

FAILURE - lRes:2 hKey:0
hRoot:-2147483646 szKey:[SOFTWARE\Lotus\Sametime\STDiagViewer\STDiag1\]

FAILURE - lRes:2 hKey:0
hRoot:-2147483646 szKey:[SOFTWARE\Lotus\Sametime\STDiagViewer\STDiag1\UTIL Configuration API]

These messages are show during the startup of the server. They are not logged in the log.nsf database and can only be seen on console.

In my particular case the Sametime was "removed" by deleting all Sametime-related entries in notes.ini, deleting sametime entry in Windows registry and deleting STADDIN task from the list of tasks in notes.ini.

After searching the Internet, I could not find any solutions to get rid of the irritating console error messages, so I had to investigate it myself. It took a couple of hours to eliminate possible causes and at last I found the solution:
Remove "scs" parameter from servlets.startup= row in servlets.properties file and the error messages will dissapear.
While you are editing servlets.properties file, delete other Sametime-related parameters which IBM masqueraded as important Domino tasks to fool the unsuspecting admins:
auth admin mmapi stcal fileupload rapfile

Usually there are only Sametime-related entries in servlets.properties, so you can probably just delete everything you can see in the file.

If you are getting mentioned error messages even after the startup, this means that users are still trying to access the sametime server using Java Connect client. Delete stsrc.nsf database (which contains the HTML form for launching the Connect client) and the messages will dissapear.


Read more about Sametime servlets here: http://www-128.ibm.com/developerworks/lotus/library/ls-STservlets/index.html


Tags:

Friday, January 12, 2007

Callback functionality for COM/ActiveX objects in LotusScript

Unfortunately there is no such callback functionality in Lotus Notes. The only type of callback which developers can use are for Notes native objects.

The only solution I found is to periodically poll a variable from COM object and when the variable's value is changed from the previous poll value, it means something happened and you can take an appropriate action in LotusScript.

For example, you have an ActiveX with function which returns statuses "Busy", "Idle", "In progress", "Finished" for a telephony application. You can not make callback when status changes to immediately notify LotusScript, but you can poll status every 1 second using LotusScript:

Dim status as String
Set MyPhone=CreateObject("PhoneApp")
Call MyPhone.MakeCall("+1818222333444")
status=MyPhone.GetStatus()
While status<>"Finished" And status<>"Idle"
status=MyPhone.GetStatus()
if status="In Progress" then
Print "Call is in progress, continue looping."
end if
if status="Busy" then
Print "Phone is busy, status will change to Finished automatically soon."
end if
Sleep 1
DoEvents
Wend
Call LogCall(StartTime, EndTime, PhoneNumber)


This solution works pretty well in most cases. Make sure you have Sleep and Doevents in your code, otherwise Notes client will hang until the loop is finished.
To avoid locking Notes client while code is running, set agent's property "Run in background client thread" and user will be able to continue working with Notes client even if the agent is still running.

A similar solution was described in my article in The View magazine for working with Skype API.

To make a shorter delay time than 1 second, you can use Sleep 0.5

Another work-around is to use Visual Basic as a wrapper to the COM object.
Visual Basic supports all callbacks, so compiling a Visual Basic project into ActiveX component and exposing variables which are populated from the callback functions inside VB code makes it possible to have access to callbacks which are not accessible with the technique described above.

Tags:

Sametime bot finds zip code with @DBLookup

Based on Thomas Adrian's Swedish postcodes database, I've created a function for our company's Sametime bot which returns the post codes(zip codes) for a specified city or the city name by specified zip code. All you need to implement this functionality in the free evaluation version of Botstatiuon Bot is to create a "pattern answer" with @formula which makes lookup to the database. Similar formula can be used for any database lookup from bot. Later I will add bot function to lookup for phone area codes for cities in USA and Sweden.
With Sametime Widget (STWidget) AJAX-based tool you can make a live test of the function.
Commands you can type to bot:
postcode 18200
postcode Danderyd
zip 14700
zip tumba

And of course the most popular "joke" command which shows you a random joke every time you type it :)

TRY HERE: http://www.botstation.com/products/stweb/stwidget_zip.html


-------------------------------------
city:=@ReplaceSubstring(@Trim(@Right(@RequestText;" "));" ";"-");

tmp:=@DbLookup("":"NoCache";@Subset(@DBName;1):"bot\\pnr.nsf"; "By city";city;2);
@If(@IsError(tmp); @If(@Length(city)!=5;@Return("Postnumber not found for city "+city);"");@Return("Zip code(s) for "+city+": "+@Implode(@Sort(@Unique(tmp));", ")+"<br>--------------<br>You can also try reversed command:
postnumber "+@Subset(tmp;1)));

tmp1:=@DbLookup("":"NoCache";@Subset(@DBName;1):"bot\\pnr.nsf"; "By number";city;2);
@If(@IsError(tmp1);"City for postnumber "+city+" not found"; "City for postcode "+city+": "+@Implode(tmp1;", ")+"<br>--------------<br>You can also try reversed command:<br>postnumber "+@Subset(tmp1;1))

-------------------------------------

@RequestText function above is translated by Bot into the incoming command text, for example "zip 12345".

Screenshot of Bot's answer configuration page:
Sametime bot formula

An alternative way to find zip code is to make call to a Web Service, which is also possible with Botstation Sametime Bot, I'll show how to accomplish it in some of the posts later this month.


Related posts:
Sametime bot shows a random Bible quote
Merry Christmas from Sametime Bot




Tags:

Monday, January 01, 2007

Beginning new year with a new blog design

Today I have updated the design of this blog to the new "Google-style" design. It looks similar to the old design, except for some small details. The option to upgrade the blog to a new design was available there for several months, and a new year is a good time to begin with a new design.


After update, an additional RSS link has been added ( http://dominounlimited.blogspot.com/feeds/posts/default ) , but luckily the old Atom RSS link (http://dominounlimited.blogspot.com/atom.xml ) seems to be still valid.


So far I found a couple of small disadvantages with the new design.
One of them is that links to configure the sections in the navigation panel are always shown for all visitors and when a visitor clicks on them, a popup with login screen is shown. Those links are for blog's owner only and has no use for other people. I would prefer not to have those links at all and do all design modifications from the blog's maintenance page. Maybe I've just missed some setting to hide those links.
One more irretating thing is that HTML editor for richtext (in blog posts) adds many unneccessary DIV tags.

Old posts for the last month were of course automatically re-saved during the update and are shown in the RSS readers as new posts.


The biggest maintenance difference to the old blog is probably a new way to manage the right-side navigation pane. With the new design, it's possible to manage the sections without having to write HTML code, which was the only way in the original Blogger template. See the picture below:




Using a customisable HTML section, I've added STWidget chat widget below the "About me" section in the right navigation panel.

Maybe one day I'll update to a Domino-based blog to be able to make advanced customisations and add cool functions, but so far I am satisfied with the Blogger blog :)

Should you update your old Blogger blog to the new Google design? Well, if you want a larger control over the right navigation panel you might consider doing it, otherwise there are no huge advantages with it.