TexasSwede
texasswede@gmail.com
  • About this blog
  • My Website
  • My Resume
  • XML Export Tool
  • Photos

Monthly Archives: August 2009

Notes client performance

Posted on August 28, 2009 by Karl-Henry Martinsson Posted in Old Blog Post Leave a comment

Watch the two screencam videos linked below. They are each about 10-15 seconds long.

Exactly the same code, running on the same computer, against the same server.

I am able to reproduce the results are reproduced every time I test.

Notes 5.0.12 

Notes 7.0.2

I don’t have Notes 8.x on this system, as our plans currently are to eventually move all our users to Notes 7…
And I don’t see Notes 8.x being deployed in a near future here.

Update: I just used TeamStudio Profiler to time the process. In Notes 5 it took 3.8 seconds, in Notes 7 it took 0.8 seconds. The main difference was in calling a db.GetView(). I then wrote some code that just call that function 8 times, each time to a different view. It took 2.4 seconds in Notes 5 and 0.17 seconds in Notes 7, again according to Profiler.

 

More fun with lists

Posted on August 27, 2009 by Karl-Henry Martinsson Posted in Old Blog Post Leave a comment

After Kathy Brown wrote about lists earlier today, I thought I would share another example of how they can be used. Back in April I shared some code showing how to get latitude and longitude for an address, by calling Google’s GeoCode REST service.
Today I will show how easy it is to use that class together with a list…

First, let’s revisit the GeoCode class. I made some minor modifications, so I will post the latest version here:

Class GeoData Private GeoString As String Public street As String Public city As String Public zip As String Public state As String Public latitude As String Public longitude As String Public Sub New(streetStr As String, cityStr As String, stateStr As String, zipStr As String) Dim httpObject As Variant Dim mapsKey As String Dim mapsURL As String Dim address As String Dim retries As Integer Dim httpURL As String Dim returncode As String Dim coordinates As String Dim ret As Integer Dim xmladdress As String Dim addarray As Variant retries = 0 Set httpObject = CreateObject("MSXML2.ServerXMLHTTP") mapsKey = "your_googleAPI_key" mapsUrl = "http://maps.google.com/maps/geo?q=" address = streetStr & ", " & cityStr & ", " & stateStr & " " & zipStr httpURL = mapsURL & address & "&output=xml&key=" & mapsKey ' Use output=CSV for CVS file Do If retries>1 Then Sleep 1 ' After the two first calls, introduce a 1 second delay betwen each additional call End If retries = retries + 1 Call httpObject.open("GET", httpURL, False) Call httpObject.send() GeoString = Left$(httpObject.responseText,16000) returncode = GetGeoValue("code") If retries >= 10 Then returncode = "500" ' Fake other failure after 10 attempts End If Loop Until returncode <> "620" If returncode = "200" Then coordinates = GetGeoValue("coordinates") latitude = Left$(coordinates, Instr(coordinates,",")-1) longitude = Mid$(coordinates, Len (latitude)+2, Instr(Len(latitude)+2,coordinates,",")-Len(latitude)-2) street =GetGeoValue("ThoroughfareName") zip = GetGeoValue("PostalCodeNumber") city = GetGeoValue("LocalityName") state = GetGeoValue("AdministrativeAreaName") xmladdress = GetGeoValue("address") If city = "" Then If state <> "" Then addarray = R5split(xmladdress,", ") city = addarray(1) zip = Right$(addarray(2),5) End If End If If Ucase(state)<>Ucase(stateStr) Then ' Different state? ret = Msgbox("The address returned seems to be very different" & Chr$(13) & _ "from the one submitted." & Chr$(13) & _ "The address returned is:" & Chr$(13) & Chr$(13) & _ street & Chr$(13) & city & ", " & state & " " & zip & Chr$(13) & Chr$(13) & _ "Do you want to use this address?",4+32,"WARNING") If ret = 7 Then street = streetStr zip = zipStr city = cityStr state = stateStr End If End If If street = "" Then Msgbox "The street address could not be verified." & Chr$(13) & _ "Existing value will be saved." & Chr$(13) & _ "Please verify that address is correct.",,"Street Not Verified" street = streetStr End If If city = "" Then Msgbox "The city could not be verified." & Chr$(13) & _ "Existing value will be saved." & Chr$(13) & _ "Please verify that address is correct.",,"City Not Verified" city = cityStr End If Else If returncode = "602" Then Msgbox "No corresponding geographic location found"_ ,,"Google GeoCode Error 602" Elseif returncode = "603" Then Msgbox "The geocode cannot be returned due to legal or contractual reasons." _ ,,"Google GeoCode Error 602" End If ' Return original value to avoid overwriting... street = streetStr zip = zipStr city = cityStr state = stateStr End If End Sub Public Function Accuracy() As Integer Dim startpos As Long Dim endpos As Long If IsValid = False Then Accuracy = 0 Exit Function End If startpos = Instr(Lcase(GeoString),|accuracy="|) + 10 endpos = Instr(startpos, Lcase(GeoString), |"|) If endpos < startpos Then Accuracy = 0 Else Accuracy = Cint(Fulltrim(Mid$(GeoString,startpos, endpos - startpos))) End If End Function Public Function HasAddInfo(address As String) As Integer If Instr(Lcase(address),"apt")>0 Then HasAddInfo = True Elseif Instr(Lcase(address),"apartment ")>0 Then HasAddInfo = True Elseif Instr(Lcase(address),"suite ")>0 Then HasAddInfo = True Elseif Instr(Lcase(address),"ste ")>0 Then HasAddInfo = True Elseif Instr(Lcase(address)," #")>0 Then HasAddInfo = True Elseif Instr(Lcase(address),", ")>0 Then HasAddInfo = True Else HasAddInfo = False End If End Function Public Function  Compare(str1 As String, str2 As String) As Integer End Function Public Function IsValid() As Integer If GeoString = "" Then IsValid = False Else IsValid = True End If End Function Public Function GetGeoValue(tag As String) As String Dim startpos As Long Dim endpos As Long Dim tempstring As String If GeoString = "" Then GetGeoValue = "" Exit Function End If startpos = Instr(Lcase(GeoString),"<" & Lcase(tag) & ">") + Len(tag) endpos = Instr(startpos, Lcase(GeoString), "</"+Lcase(tag) & ">") If endpos < startpos Then GetGeoValue = "" Else tempstring = Fulltrim(Mid$(GeoString,startpos+2, endpos - startpos - 2)) GetGeoValue = Fulltrim(R5strReplace(tempstring,"&amp;","&")) End If End Function Private Function R5strReplace(mystring As String, search As String, replacewith As String) As String Dim source As String source = mystring While Instr(source, search) > 0 source = Left$(source, Instr(source, search) - 1) + replacewith + _ Right$(source, Len(source) - Instr(source, search) - Len(search) + 1) Wend R5strReplace = source End Function Private Function R5split(strSource As String, strItemDelim As String) As Variant Dim astrReturn() As String ' The array to return Dim intElement As Integer ' The array element currently being set Dim z_intItemCount As Integer ' The total number of elements for the array Dim z_intStartOfItem As Integer ' The start position of the item in the source string. Dim z_intEndOfItem As Integer ' The end position of the item in the source string. Dim z_strCurItem As String ' The currently parsed item Dim z_strRemaining As String ' The remaining string to cycle through Dim z_strStartOfItemBack As String ' The rest of the string, from the start of the item on back. z_strRemaining = strSource ' Cycle through the source string and get a count of elements: While (Not z_strRemaining = "") z_intStartOfItem = Instr(1, z_strRemaining, strItemDelim) If (z_intStartOfItem <> 0) Then z_intItemCount = z_intItemCount + 1 z_strRemaining = Mid(z_strRemaining, z_intStartOfItem + Len(strItemDelim), Len(z_strRemaining)) Else z_intItemCount = z_intItemCount + 1 z_strRemaining = "" End If Wend ' Size the return array so that it can hold all of the elements: Redim astrReturn(z_intItemCount - 1) ' Reset the holder to the value of the source string: z_strRemaining = strSource ' Cycle through the source list, parsing the string into individual array elements: While (Not z_strRemaining = "") For intElement = 0 To Ubound(astrReturn) ' Find the end of the current element: z_intEndOfItem = Instr(1, z_strRemaining, strItemDelim) ' If there is still an item delimiter in the string, parse ' out the item, otherwise assume the remaining text is the ' last item: If (z_intEndOfItem <> 0) Then z_strCurItem = Mid(z_strRemaining, 1, z_intEndOfItem - 1) astrReturn(intElement) = z_strCurItem z_strRemaining = Mid(z_strRemaining, z_intEndOfItem + Len(strItemDelim), _ Len(z_strRemaining)) Else astrReturn(intElement) = z_strRemaining z_strRemaining = "" End If Next Wend ' Return the split array to the caller: R5split = astrReturn End Function End Class

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

Below is a simple code sample that will read all person documents from the NAB, get address information for each person, create a list of GeoData objects, then loop through the list and retrieve data out of it.
Of course it could have been done all in the first loop, but I am splitting it up for demonstration purposes.

Sub ProcessDocs Dim db As New NotesDatabase("dsCorp/Deep-South","names.nsf") Dim view As NotesView Dim doc As NotesDocument Dim geodata As GeoData Dim street As String Dim city As String Dim state As String Dim zip As String Dim uind As strring ' Loop though all person documents Set view = db.GetView("People") Set doc = view.GetFirstDocument() Do While doc Is Not Nothing ' Read address from person documents street = doc.OfficeStreetAddress(0) city = doc.OfficeCity(0) state = doc.OfficeState(0) zip = doc.OfficeZIP(0) If street<>"" Then ' Make sure we have an address unid = doc.UniversalID ' Person document unid, used as list tag ' Create a new list item, with unid as list tag and a GeoData object stored Set geodata(unid) = New GeoData(street, city, state, zip) End If Set doc = view.GetNextDocument(doc) Loop ' Now we will look through the list and get docs again Forall g In geodata ' Get the person document again based on list tag Set doc = db.GetDocumentByUNID( Listtag(g) ) ' Write latitude and longitude to person document doc.OfficeLatitude = g.Latitude doc.OfficeLongitude = g.Longitude Call doc.Save(True,True) End Forall End Sub

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

 

Simple Mail Notification Class

Posted on August 26, 2009 by Karl-Henry Martinsson Posted in Old Blog Post Leave a comment

I have a function I wrote way back to generate mail notification out of my program. But in many cases it had to be modified for each use. Yesterday I decided to write simple class instead, and here is the result. I will post it at OpenNTF.org soon as well.

This is how you use the class:

Set mailnotification = New MailNotification()
mailnotification.SendTo="texasswede@gmail.com"
mailnotification.Subject = "Test email fron Notes"
mailnotification.Principal = "System X "
Call mailnotification.body.AppendText( "This is some text in the body field. " )
Call mailnotification.body.AppendText( "And some more." )
Call mailnotification.body.AddNewLine( 1 )
Call mailnotification.body.AppendText( "Docclink: " )
Call mailnotification.body.AppendDocLink( doc, "Click to open" )
Call mailnotification.body.AddNewLine( 2 )
Call mailnotification.Send()

Easy, huh?
And here is the class itself. I store it in a script library called Class.MailNotification… Enjoy!

Class MailNotification Public maildoc As NotesDocument Public body As NotesRichTextItem Public subject As String Public sendto As String Public copyto As String Public bccto As String Public principal As String Public Sub New() Dim session As New NotesSession Set maildoc = New NotesDocument(session.CurrentDatabase) Call maildoc.ReplaceItemValue("Form","Memo") Set body = New NotesRichTextItem(maildoc,"Body") subject = "" sendto = "" copyto = "" bccto = "" principal = "" End Sub Public Sub Send() If subject<>"" Then maildoc.Subject = subject End If If sendto<>"" Then maildoc.SendTo = sendto End If If copyto<>"" Then maildoc.CopyTo = copyto End If If bccto<>"" Then maildoc.BlindCopyTo= bccto End If If principal<>"" Then maildoc.Principal = principal End If Call maildoc.Send(True) End Sub End Class

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

 

Lotus knows… the Power of One

Posted on August 20, 2009 by Karl-Henry Martinsson Posted in Old Blog Post Leave a comment

Or perhaps the title of this post should be "Lotus should know". The story below is inspired by several suggestions at the Lotus Knows IdeaJam, including this one.

Thisis a true story of how one person in 6 months got a whole department to change from one word processor to another, without even involving the IT department.

In early 1993, I started working as a journalist at Computer Sweden, the Swedish edition of ComputerWorld. I had previously worked at Microsoft (in 1988-1990), and then I worked as a programmer for 2 years. At that workplace we used Microsoft Word and Excel. So I was very used to Word.

At Computer Sweden, they used WordPerfect 5.1 (if I recall correctly). When writing, they used special markup for QuarkXPress, to set headlines, body text, etc. I did not like WordPerfect, and was not used to it, so I loaded Word on my computer and started working. After a few weeks I decided to make life easier by developing a Normal.dot template so I could format the text in a WYSIWYG way, and then have a macro to create the QuarkXPress markup when I was done. I also added code to copy the resulting file to tne network share where the editors could get to it.

Some other users saw it, got Word installed and started using my macro. Within 6 months of me starting, the editor-in-chief demanded that everyone switched to Word and used my macro. WordPerfect was out from that magazine. Soon other magazines followed, and several started using the same macro. Later I modified it to generate HTML, upload the resulting file to teh web server and edit the homepage to include a link to the new story.

Not one dollar spent in sales calls/visits, direct marketing or anything from Microsoft, just one user showing how a different tool could do things faster and better. I am sure a similar macro and template could have been done in WordPerfect. But I knew Word, soI built it there.

Imagine tech-savy students coming out in the workplaces, loading their computers with "Lotus Notes Personal Edition", "Domino Designer Personal Edition" and connecting to a public demo server provided by IBM, and then develop some useful and good looking applications for their new employer in a day or two…Web-enabled and/or Notes client access in one easy-to-use environment.

 

OpenNTF – free hosting of projects?

Posted on August 11, 2009 by Karl-Henry Martinsson Posted in Old Blog Post Leave a comment

During IamLUGlast week, John Head talked about some really exciting new things that are in the planning stage at OpenNTF. Nathan T Freeman teased a little bit about it the other day as well.

What the plan is (and as Nathan said, it is not set in stone it will happen) is that OpenNTF will offer free development hosting. When you create your project, you get a question if you want it hosted. If you select "yes", a VMware server is being setup, Linux and Domino installed, your ID file being created and sent to you within a few minutes. I think John said 120 seconds…

I think this is really exciting, it will let everyone start playing with Xpages and other technologies without the need for your own 8.5.x server. I know that I am excited about testing this! From what I hear, IBM donated an open-ended server license for this to happen.

 

Free legal e-books!

Posted on August 11, 2009 by Karl-Henry Martinsson Posted in Old Blog Post Leave a comment

A couple of months ago, I stumbled on a series of booksat Barnes & Noble. Since I am interested in history, they caught my eye. The first book is named 1632, the second one 1633, and they are parts of a series calledthe 1632 series or "Ring of Fire". Yesterday I happend to stumble on more information about the books, and found out it is a whole series of books, e-books, etc. Many of the books are available as free legal downloads at the publisher Baen Bookswebsite, through the Baen Free Library.

From Wikipedia (slightly edited for length:

The fictional town of Grantville, West Virginia and its power plant are displaced in space-time. A hemispherical section of land about three miles in radius measured from the town center is transported back in time from April of 2000 to May of 1631. The town is thrust into the middle of the Thirty Years’ War, in the German province of Thuringia in the Thuringer Wald, near the fictional German free city of Badenburg.
Grantville, led by Mike Stearns, president of the local United Mine Workers of America (UMWA), must cope with the town’s space-time dislocation, the surrounding raging war, language barriers, and numerous social and political issues, including class conflict, witchcraft, feminism, the reformation and the counter-reformation, among many other factors. One complication is a compounding of the food shortage when the town is flooded by refugees from the war. The 1631 locals experience a culture shock when exposed to the mores of contemporary American society, including modern dress, sexual liberation, and boisterous American-style politics.
Grantville struggles to survive while trying to maintain technology sundered from twenty-first century resources. Throughout 1631, Grantville manages to establish itself locally by forming the nascent New United States of Europe (NUS) with several local cities even as war rages around them. King Gustavus Adolphus rapidly moves the war theater to Franconia and Bavaria, just south of Grantville. This leads to the creation of the Confederated Principalities of Europe (CPoE).

I just downloaded 1632 and will start reading it tonight. If it is good, I might just go ahead and buy the books. I think this kind of publishing is great, you get to read some, see if you like it, then buy the books and support the authors.

 

Happy YellowDay!

Posted on August 11, 2009 by Karl-Henry Martinsson Posted in Old Blog Post Leave a comment

YellowDay
In honor of the second annual YellowDay, I have skinned my twitter pageyellow. :-)

 

HCL Ambassador 2020

HCL Ambassador 2020

IBM Champion 2014-2020

Stack Exchange

profile for Karl-Henry Martinsson on Stack Exchange, a network of free, community-driven Q&A sites

Notes/Domino Links

  • Planet Lotus Planet Lotus
  • IBM dW Forums IBM dW Forums
  • StackOverflow StackOverflow

Recent Posts

  • Notes and Domino v12 is here!
  • NTF Needs Your Help
  • Helpful Tools – Ytria EZ Suite (part 2)
  • Busy, busy – But wait: There is help!
  • Semantic UI – An alternative to Bootstrap?

Recent Comments

  • Viet Nguyen on Keep up with COVID-19 though Domino!
  • Viet Nguyen on Keep up with COVID-19 though Domino!
  • Lynn He on About This Blog
  • Palmi Lord on NTF Needs Your Help
  • Helpful Tools – Ytria EZ Suite (part 2) – TexasSwede on Busy, busy – But wait: There is help!

My Pages

  • How to write better code in Notes

Archives

  • June 2021 (1)
  • April 2021 (2)
  • March 2021 (1)
  • August 2020 (3)
  • July 2020 (2)
  • April 2020 (2)
  • March 2020 (1)
  • December 2019 (2)
  • September 2019 (1)
  • August 2019 (2)
  • July 2019 (2)
  • June 2019 (3)
  • April 2019 (2)
  • December 2018 (1)
  • November 2018 (1)
  • October 2018 (5)
  • August 2018 (2)
  • July 2018 (3)
  • June 2018 (2)
  • May 2018 (1)
  • April 2018 (2)
  • March 2018 (1)
  • February 2018 (2)
  • January 2018 (4)
  • December 2017 (3)
  • November 2017 (2)
  • October 2017 (2)
  • September 2017 (1)
  • August 2017 (2)
  • July 2017 (6)
  • May 2017 (4)
  • February 2017 (1)
  • January 2017 (2)
  • December 2016 (2)
  • October 2016 (3)
  • September 2016 (4)
  • August 2016 (1)
  • July 2016 (2)
  • June 2016 (2)
  • May 2016 (3)
  • April 2016 (1)
  • March 2016 (4)
  • February 2016 (2)
  • January 2016 (4)
  • December 2015 (3)
  • November 2015 (2)
  • October 2015 (1)
  • September 2015 (2)
  • August 2015 (1)
  • July 2015 (5)
  • June 2015 (2)
  • April 2015 (2)
  • March 2015 (3)
  • February 2015 (2)
  • January 2015 (10)
  • December 2014 (1)
  • November 2014 (3)
  • October 2014 (3)
  • September 2014 (13)
  • August 2014 (6)
  • July 2014 (5)
  • May 2014 (3)
  • March 2014 (2)
  • January 2014 (10)
  • December 2013 (5)
  • November 2013 (2)
  • October 2013 (5)
  • September 2013 (4)
  • August 2013 (7)
  • July 2013 (3)
  • June 2013 (1)
  • May 2013 (4)
  • April 2013 (7)
  • March 2013 (8)
  • February 2013 (9)
  • January 2013 (5)
  • December 2012 (7)
  • November 2012 (13)
  • October 2012 (10)
  • September 2012 (2)
  • August 2012 (1)
  • July 2012 (1)
  • June 2012 (3)
  • May 2012 (11)
  • April 2012 (3)
  • March 2012 (2)
  • February 2012 (5)
  • January 2012 (14)
  • December 2011 (4)
  • November 2011 (7)
  • October 2011 (8)
  • August 2011 (4)
  • July 2011 (1)
  • June 2011 (2)
  • May 2011 (4)
  • April 2011 (4)
  • March 2011 (7)
  • February 2011 (5)
  • January 2011 (17)
  • December 2010 (9)
  • November 2010 (21)
  • October 2010 (4)
  • September 2010 (2)
  • July 2010 (3)
  • June 2010 (2)
  • May 2010 (3)
  • April 2010 (8)
  • March 2010 (3)
  • January 2010 (5)
  • November 2009 (4)
  • October 2009 (7)
  • September 2009 (1)
  • August 2009 (7)
  • July 2009 (1)
  • June 2009 (4)
  • May 2009 (1)
  • April 2009 (1)
  • February 2009 (1)
  • January 2009 (3)
  • December 2008 (1)
  • November 2008 (1)
  • October 2008 (7)
  • September 2008 (7)
  • August 2008 (6)
  • July 2008 (5)
  • June 2008 (2)
  • May 2008 (5)
  • April 2008 (4)
  • March 2008 (11)
  • February 2008 (10)
  • January 2008 (8)

Categories

  • AppDev (9)
  • Blogging (11)
    • WordPress (5)
  • Design (5)
    • Graphics (1)
    • UI/UX (2)
  • Featured (5)
  • Financial (2)
  • Food (5)
    • Baking (3)
    • Cooking (3)
  • Generic (11)
  • History (5)
  • Hobbies (10)
    • LEGO (4)
    • Photography (4)
  • Humor (1)
  • IBM/Lotus (175)
    • #Domino2025 (14)
    • #DominoForever (8)
    • #IBMChampion (46)
    • Administration (7)
    • Cloud (7)
    • CollabSphere (8)
    • Community (47)
    • Connect (33)
    • ConnectED (12)
    • Connections (3)
    • HCL (12)
    • HCL Master (1)
    • IBM Think (1)
    • Lotusphere (46)
    • MWLUG (25)
    • Notes/Domino (97)
      • Domino 11 (7)
    • Sametime (8)
    • Verse (14)
    • Volt (2)
    • Watson (6)
  • Life (8)
  • Microsoft (7)
    • .NET (2)
    • C# (1)
    • Visual Studio (1)
  • Movies (3)
  • Old Blog Post (259)
  • Personal (23)
  • Programming (83)
    • App Modernization (11)
    • Formula (4)
    • Lotusscript (46)
    • NetSuite (4)
      • SuiteScript (3)
    • node.js (4)
    • XPages (4)
  • Reviews (9)
  • Sci-Fi (4)
  • Software (24)
    • Flight Simulator (2)
    • Games (4)
    • Open Source (2)
    • Utilities (6)
  • Technology (37)
    • Aviation (3)
    • Calculators (2)
    • Computers (6)
    • Gadgets (7)
    • Mobile Phones (7)
    • Science (3)
    • Tablets (2)
  • Travel (6)
    • Texas (2)
    • United States (1)
  • Uncategorized (15)
  • Web Development (50)
    • Frameworks (23)
      • Bootstrap (14)
    • HTML/CSS (12)
    • Javascript (32)
      • jQuery (23)

Administration

  • Log in
  • Entries feed
  • Comments feed
  • WordPress.org

Tracking

Creeper
MediaCreeper
  • Family Pictures
© TexasSwede 2008-2014