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

Category Archives: IBM/Lotus

Updated MailNotification class – Now with HTML email support and web links

Posted on June 27, 2016 by Karl-Henry Martinsson Posted in IBM/Lotus, Lotusscript, Notes/Domino, Programming 2 Comments

I have updated my MailNotification class with some additional functionality I needed at work. Since our mail system now is Outlook/Exchange, and therefore the Notes doc links don’t work anymore, I am in the process of converting all my email notifications into HTML email. The doc links are now made into HTML links, pointing to a notes:// or http:// address.

I simply added a new class, HTMLmail. It is based on the old NotesMail class, but I override a few functions that are different. This makes it very easy to update the emails I am generating in my Lotusscript agents, in most cases I only have to replace NotesMail with HTMLmail in the declaration and instantiation:

Dim maildoc As HTMLMail
Set maildoc = New HTMLMail()

When I had doc links in the email I also had to modify the code where I generate it. The method takes three arguments: the NotesDocument to link to, the Alt/Title attribute for the link (to be displayed when hovering over the link) and the text of the link:

Call maildoc.AppendDocLink(doc,"Click to open",doc.ClaimNumber(0))

In order to generate the links I created a Link class, where you can set what protocol you want to use (“notes” or “http”) you want the link to use, you can change the port from the default of 80, and you can even force the link to point to a different server. I use this class in the AppendDocLink method in the HTMLmail class.

Here is a short code sample, it is just a function to create a mail notification for an insurance claim. The claim document is passed to the function and a mail is sent to the adjuster and his/her manager.

Sub SendNotification(doc as NotesDocument)
	'*** Create a new object and set the sender, recipients and subject
	Set maildoc = New HTMLMail()
	maildoc.Principal = |"System Notification" <noreply@example.com>|
	Call maildoc.AddMailTo(doc.GetItemvalue("Adjuster")(0))
	Call maildoc.AddMailCC(GetManagerName(doc.GetItemValue("Adjuster")(0)))
	maildoc.Subject = "30 DAY ALERT - " & doc.GetItemValue("ClaimNumber")(0)
	'*** Build body content, including a link to the document
	Call maildoc.AppendText("Claim number ")
	Call maildoc.AppendDocLink(doc,"Click to open",doc.GetItemValue("ClaimNumber")(0))
	Call maildoc.AppendText(" was received on ")
	Call maildoc.AppendText(Format$(doc.GetItemValue("Received_Date")(0),"mm/dd/yyyy") & ". ")
	Call maildoc.AppendText("This claim has been opened for 30 days. ")
	Call maildoc.AppendText("Please confirm all appropriate actions has been performed.")
	Call maildoc.AddNewLine(2)
	'*** Add no-reply notification to the end and send the email
	maildoc.NoReply = True   
	Call maildoc.Send()
	'*** Flag the NotesDocument as processed and save it to avoid duplicate notifications
	doc.Warning30daySent = "Yes"
	Call doc.Save(True,True)
End Sub

That’s pretty much it.  Enjoy the code, and as usual I do not guarantee anything. Use on your own risk, as always. If you like this code and use it, let me know.

Option Public
Option Declare

Class NotesMail
	Public maildoc As NotesDocument 
	Public body As NotesRichTextItem
	Private p_subject As String
	Private p_sendto List As String
	Private p_copyto List As String
	Private p_blindcopyto List As String
	Private p_principal As String
	Public NoReply As Boolean 
	Public mailbox As NotesDatabase
	
	Public Sub New()
		Dim session As New NotesSession
		Dim mailservername As String
		' We must use mail.box on current server.
		mailservername = session.Currentdatabase.Server
		' Using mail.box directly is unsupported, but is the
		' only way to make the mail look like it is actually
		' sent from another address, in our case the principal.
		Set mailbox = New NotesDatabase(mailservername,"mail.box")
		If mailbox.Isopen = False Then
			Print "mail.box on " & mailservername & " could not be opened"
			Exit Sub
		End If
		Set me.maildoc = New NotesDocument(mailbox)
		Call me.maildoc.ReplaceItemValue("Form","Memo")
		'Set me.body = New NotesRichTextItem(maildoc,"Body")
		Call CreateBody()
		me.p_subject = ""
		me.p_principal = ""
		' Empty lists for addresses
		Erase me.p_sendto
		Erase me.p_copyto
		Erase me.p_blindcopyto
		me.NoReply = False	' Default is not to add a disclaimer to the end
	End Sub
	
	Private Sub CreateBody()
		Set me.body = New NotesRichTextItem(maildoc,"Body")
	End Sub
	
	Public Property Set Subject As String
		me.p_subject = FullTrim(Subject)
	End Property
	
	Public Property Get Subject As String
		Subject = me.p_subject
	End Property
	
	Public Property Set Principal As String
		me.p_principal = FullTrim(Principal)
	End Property
	
	Public Property Get Principal As String
		Principal = me.p_principal
	End Property

	'*** Recipient address (mailto) functions
	Public Property Set MailTo As String
		me.p_sendto(FullTrim(MailTo)) = FullTrim(MailTo)
	End Property
	
	Public Property Get MailTo As String	' Get the first address only
		ForAll mto In me.p_sendto
			MailTo = mto	
			Exit ForAll
		End ForAll
	End Property
	
	Public Property Set SendTo As String	' Alias for MailTo
		MailTo = SendTo
	End Property
	
	Public Property Get SendTo As String	' Alias for MailTo
		SendTo = MailTo	
	End Property
	
	Public Sub AddMailTo(address As String)	' Additional address
		me.p_sendto(address) = address
	End Sub
	
	Public Sub RemoveMailTo(address As String)	' Remove address from list
		Erase me.p_sendto(address)
	End Sub

	' *** Functions for CC address
	Public Property Set MailCC As String
		me.p_copyto(FullTrim(MailCC)) = FullTrim(MailCC)
	End Property
	
	Public Property Get MailCC As String	' Get the first address only
		ForAll mcc In me.p_copyto
			MailCC = mcc	
			Exit ForAll
		End ForAll
	End Property
	
	Public Sub AddMailCC(address As String)
		me.p_copyto(address) = address
	End Sub

	Public Sub RemoveMailCC(address As String)
		Erase me.p_copyto(address)
	End Sub
	
	' *** Functions for BCC address 
	Public Sub AddMailBCC(address As String)
		me.p_blindcopyto(address) = address
	End Sub
	
	Public Property Set MailBCC As String
		me.p_blindcopyto(FullTrim(MailBCC)) = FullTrim(MailBCC)
	End Property
	
	Public Property Get MailBCC As String	' Get the first address only
		ForAll bcc In me.p_blindcopyto
			MailBCC = bcc	
			Exit ForAll
		End ForAll
	End Property
	
	Public Sub RemoveMailBCC(address As String)
		Erase me.p_blindcopyto(address)
	End Sub
	
	' *** Functions for email body 
	Public Sub AppendText(bodytext As String)
		Call me.body.AppendText(bodytext)	
	End Sub
	
	Public Sub AppendDocLink(doc As NotesDocument, comment As String, linktext As String)
		If FullTrim(linktext) = "" Then
			Call me.body.AppendDocLink(doc, comment)	
		Else
			Call me.body.AppendDocLink(doc, comment, linktext)	
		End If
	End Sub
	
	Public Sub AppendNewLine(cnt As Integer)
		Call me.body.AddNewline(cnt)	
	End Sub
	
	Public Sub AddNewLine(cnt As Integer)
		Call me.body.AddNewline(cnt)	
	End Sub
	
	Public Sub AttachFile(filename As String)
		Call me.body.EmbedObject(1454,"",filename)	
	End Sub
	
	' *** Send the mail
	Public Sub Send()
		Dim session As New NotesSession 
		Dim richStyle As NotesRichTextStyle 
		Dim recipients As String 
		If me.subject<,>,"" Then
			maildoc.Subject = me.subject
		End If
		recipients = ""
		If ListItemCount(me.p_sendto)>,0 Then
			maildoc.SendTo = ListToArray(me.p_sendto)
			recipients = recipients + Join(ListToArray(me.p_sendto),"~") + "~"
		End If
		If ListItemCount(me.p_copyto)>,0 Then
			maildoc.CopyTo = ListToArray(me.p_copyto)
			recipients = recipients + Join(ListToArray(me.p_copyto),"~") + "~"
		End If
		If ListItemCount(me.p_blindcopyto)>,0 Then
			maildoc.BlindCopyTo = ListToArray(me.p_blindcopyto)
			recipients = recipients + Join(ListToArray(me.p_blindcopyto),"~") + "~"
		End If
		maildoc.Recipients = FullTrim(Split(recipients,"~")) 
		If me.p_principal<,>,"" Then
			Call maildoc.ReplaceItemValue("Principal", me.p_principal)
			' If principal is set, we want to fix so mail looks like
			' it is coming from that address, need to set these fields
			Call maildoc.ReplaceItemValue("From", me.p_principal)
			Call maildoc.ReplaceItemValue("Sender", me.p_principal)
			Call maildoc.ReplaceItemValue("ReplyTo", me.p_principal)
			Call maildoc.ReplaceItemValue("SMTPOriginator", me.p_principal)
		End If
		' If NoReply is set, append some red text... 
		If NoReply = True Then
			Set richStyle = session.CreateRichTextStyle
			richStyle.NotesFont = 4
			richStyle.NotesColor = 2
			richStyle.Bold = True	
			Call me.body.AppendStyle(richStyle)
			Call me.body.AddNewLine(1)	
			Call me.body.AppendText("*** DO NOT REPLY TO THE SENDER OF THIS MESSAGE! ***")	
			Call me.body.AddNewLine(1)	
			Call me.body.AppendText("*** IT IS AN AUTOMATED SYSTEM MAIL ***")	
		End If
		On Error Resume Next
		'Call maildoc.CopyItem(body, "Body")
		If me.p_principal<,>,"" Then
			Call maildoc.Save(True,False)	' Save in mail.box
		Else
			Call maildoc.Send(False)			' Send mail normally
		End If
	End Sub
	
	
	' *** Private functions called from within the class ***
	
	' *** Convert list to array
	Private Function ListToArray(textlist As Variant) As Variant
		Dim i As Integer 
		Dim temparray() As String
		ReDim temparray(0) As String 
		ForAll t In textlist
			temparray(UBound(temparray)) = t
			ReDim Preserve temparray(UBound(temparray)+1) As String
		End ForAll
		ListToArray = FullTrim(temparray)
	End Function
	
	' *** Count items in a list
	Private Function ListItemCount(textlist As Variant) As Integer
		Dim cnt As Integer
		cnt = 0
		ForAll t In textlist
			cnt = cnt + 1
		End ForAll
		ListItemCount = cnt
	End Function

End Class


%REM
	Class HTMLMail
	Description: Inherits from NotesMail class, implements additional functions
%END REM
Class HTMLMail As NotesMail
	Private session As NotesSession 
	Private mimebody As NotesMIMEEntity 
	Private header As NotesMIMEHeader 
	Private stream As NotesStream
	Private p_server As String
	Private p_protocol As String
	Private p_port As Integer
	Public LinkServerOnly As Boolean
		
	%REM
		Sub CreateBody
		Description: Override body creation with HTML body
	%END REM
	Private Sub CreateBody()
		Dim db As NotesDatabase 
		Set session = New NotesSession()
		Set db = session.CurrentDatabase 
		Set stream = session.CreateStream 
		session.ConvertMIME = False ' Do not convert MIME to rich text 
		Set me.mimebody = maildoc.CreateMIMEEntity
		Call stream.writetext(|<,HTML>,|)
		Call stream.writetext(|<,head>,|)
		Call stream.writetext(|<,/head>,|)
		Call stream.writetext(|<,body>,|)
		Call stream.writetext(|<,div style="font-family: Calibri,Arial; font-size:12pt;">,|)
		me.p_protocol = "notes"
		me.p_port = 80
		LinkServerOnly = False
	End Sub
	
	Public Sub AppendText(bodytext As String)
		Call me.stream.writetext(bodytext)	
	End Sub
	
	Public Sub AddNewLine(cnt As Integer)
		Dim i As Integer
		For i = 1 To cnt
			Call me.stream.writetext("<,br>,")
		Next 
	End Sub

	Public Sub AppendNewLine(cnt As Integer)
		Dim i As Integer
		For i = 1 To cnt
			Call me.stream.writetext("<,br>,")
		Next 
	End Sub

	Public Sub SetLinkServer(server As String)
		Me.p_server = server
	End Sub
	
	Public Sub SetLinkProtocol(protocol As String)
		Me.p_protocol = protocol
	End Sub

	Public Sub SetLinkPort(port As Integer)
		Me.p_port = port
	End Sub
	
	Public Sub AppendDocLink(doc As NotesDocument, comment As String, linktext As String)
		Dim html As String
		Dim link As Link
		Set link = New Link(doc)
		Call link.SetProtocol(Me.p_protocol)
		Call link.SetPort(Me.p_port)
		If Me.p_server<,>,"" Then
			Call link.SetServer(p_server)
		End If
		link.ServerOnly = LinkServerOnly
		html = |<,a href="| & link.URL() + |"|
		If FullTrim(linktext)<,>,"" Then
			html = html + | title="| + comment + |" alt="| + comment + |"|					
		End If
		html = html + ">," + linktext + "<,/a>,"
		Call AppendText(html)
	End Sub
	
	Sub AddNoReplyNotification()
		Call me.stream.writetext(|<,div style="font-family: consolas, courier; font-size: 10pt; color:#FF0000; margin-top: 25px; margin-bottom: 25px;">,|)
		Call me.stream.writetext("***************************************************<,br>,")	
		Call me.stream.writetext("*** DO NOT REPLY TO THE SENDER OF THIS MESSAGE! ***<,br>,")	
		Call me.stream.writetext("***   IT IS AN AUTOMATED SYSTEM MAIL FROM LNP   ***<,br>,")	
		Call me.stream.writetext("***************************************************<,br>,")
		Call me.stream.writetext("<,/div>,")
		If me.p_principal = "" Then
			me.p_principal = |"Do Not Reply" <,noreply@deep-south.com>,|
		End If
	End Sub
	
	' *** Send the mail
	Public Sub Send()
		Dim doc As NotesDocument 
		Dim recipients As String

		maildoc.Form = "Memo" 
		'*** If NoReply is set, append some red text... 
		If NoReply = True Then
		'	Call stream.writetext(|<,p>,<,font color="red">,|)
		'	Call stream.writetext("*** DO NOT REPLY TO THE SENDER OF THIS MESSAGE! ***<,br>,")	
		'	Call stream.writetext("*** IT IS AN AUTOMATED SYSTEM MAIL ***")
		'	Call stream.writetext("<,/font>,<,/p>,")
			Call AddNoReplyNotification()	
		End If
	 	'*** Add HTML for end of email
		Call stream.writetext(|<,/div>,|) 
		Call stream.writetext(|<,/body>,|) 
		Call stream.writetext(|<,/html>,|) 
		Call mimebody.SetContentFromText(stream, "text/HTML;charset=UTF-8", ENC_IDENTITY_7BIT) 
 
		If me.subject<,>,"" Then
			maildoc.Subject = me.subject
		End If
		recipients = ""
		If ListItemCount(me.p_sendto)>,0 Then
			maildoc.SendTo = ListToArray(me.p_sendto)
			recipients = recipients + Join(ListToArray(me.p_sendto),"~") + "~"
		End If
		If ListItemCount(me.p_copyto)>,0 Then
			maildoc.CopyTo = ListToArray(me.p_copyto)
			recipients = recipients + Join(ListToArray(me.p_copyto),"~") + "~"
		End If
		If ListItemCount(me.p_blindcopyto)>,0 Then
			maildoc.BlindCopyTo = ListToArray(me.p_blindcopyto)
			recipients = recipients + Join(ListToArray(me.p_blindcopyto),"~") + "~"
		End If
		maildoc.Recipients = FullTrim(Split(recipients,"~")) 
		If me.p_principal<,>,"" Then
			Call maildoc.ReplaceItemValue("Principal", me.p_principal)
			' If principal is set, we want to fix so mail looks like
			' it is coming from that address, need to set these fields
			Call maildoc.ReplaceItemValue("From", me.p_principal)
			Call maildoc.ReplaceItemValue("Sender", me.p_principal)
			Call maildoc.ReplaceItemValue("ReplyTo", me.p_principal)
			Call maildoc.ReplaceItemValue("SMTPOriginator", me.p_principal)
		End If
		On Error Resume Next
		If me.p_principal<,>,"" Then
			Call maildoc.Save(True,False)	' Save in mail.box
		Else
			Call maildoc.Send(False)			' Send mail normally
		End If
		session.ConvertMIME = True ' Restore conversion - very important 
	End Sub

End Class


%REM
	Class Link
	Description: Class for Doc Link functionality
%END REM
Class Link
	Private p_protocol As String
	Private p_server As String
	Private p_domain As String
	Private p_port As Integer
	Private p_dbpath As String
	Private p_docunid As String
	Private p_Action As String 
	Private p_doc As NotesDocument
	Private p_db As NotesDataBase
	Public ServerOnly As Boolean
	
	%REM
		Sub New
		Description: Constructor
	%END REM
	Public Sub New(doc As NotesDocument) 
		Dim server As NotesName
		Set p_doc = doc
		Set p_db = doc.Parentdatabase
		Set server = New NotesName(p_db.Server)
		Call SetServer(server.Common)
		Call SetPort(80)
		Call SetProtocol("notes") 	'Set as default
		ServerOnly = False
		p_domain = GetDomain()
		p_dbpath = doc.Parentdatabase.Filepath
		p_docunid = doc.UniversalID
		p_action = "OpenDocument"
	End Sub
	
	%REM
		Sub SetProtocol
		Description: Set the protocol to use (notes:, http:, https:)
	%END REM
	Public Sub SetProtocol(protocol As String)
		Dim tmp As String
		'*** Remove any : or /
		tmp = Replace(protocol,":","")
		tmp = Replace(tmp,"/","")
		p_protocol = LCase(tmp) + ":"
		If Not p_db Is Nothing Then
			tmp = GetDomain()
			Call SetDomain(tmp)
		End if
	End Sub
	
	%REM
		Sub SetAction
		Description: Set the action, e.g. ?OpenDocument
	%END REM
	Public Sub SetAction(action As String)
		Dim tmp As String
		'*** Remove any ? if already there
		tmp = Replace(action,"?","")
		p_action = "?" + tmp
	End Sub
	
	%REM
		Sub SetServer
		Description: Override server name if we want another server
		Do not specify the Notes domain or Internet domain name!
	%END REM
	Public Sub SetServer(servername)
		p_server = servername
	End Sub

	Public Function GetDomain() As String 
		Dim tmp As String
		Dim startpos As Integer
		Dim endpos As Integer  
		If p_protocol = "notes:" Then
			tmp = p_db.NotesURL
		Else
			tmp = p_db.HttpURL
		End If
		startpos = InStr(tmp,"://")+3
		endpos = InStr(startpos,tmp,"/")
		If endpos>,startpos Then
			tmp = Mid$(tmp,startpos, endpos-startpos)
		Else
			tmp = "deep-south.com"
		End If
		GetDomain = tmp
	End Function
	
	%REM
		Sub SetDomain
		Description:Set the domain part of the URL, e.g. @Deep-South or .deep-south.com 
	%END REM
	Public Sub SetDomain(domain As String)
		p_domain = domain
	End Sub
	
	%REM
		Sub SetPort
		Description: Set the port number, e.g. 80 or 3000
	%END REM
	Public Sub SetPort(portnumber As Integer)
		p_port = portnumber
	End Sub
	
	%REM
		Function URL
		Description: Get the URL for the document
	%END REM
	Public Function URL() As String
		Dim tmp As String 
		tmp = p_protocol & "//" 
		If p_protocol<,>,"notes:" Then
			tmp = tmp & p_server 
			If ServerOnly = False Then
				tmp = tmp & "."
			End if 
		End If
		If ServerOnly = False Then
			tmp = tmp & p_domain
		End If
		If p_protocol<,>,"notes:" Then
			If p_port <,>, 80 Then
				tmp = tmp & ":" & p_port  
			End If
		End If
		tmp = tmp & "/" & p_dbpath & "/0/" & p_docunid & "?" & p_action
		tmp = Replace(tmp,Chr$(92),"/")	'Replace \ with / for URL
		URL = tmp
	End Function
	
End Class

MWLUG in Austin – I will be presenting again

Posted on June 27, 2016 by Karl-Henry Martinsson Posted in Bootstrap, HTML/CSS, IBM/Lotus, jQuery, Lotusscript, MWLUG, Web Development Leave a comment

I have been selected to present at MWLUG in Austin on August 17-19. My presentation will be kind of part two of my presentation last year in Atlanta. It will focus less on the basics and go more into the fun and more advanced stuff. Kind of an extended version of my Connect 2016 presentation.

The title is “Think Outside The Box – Part 2”, and I will discuss and show how you can build a modern web front-end using standard techniques like Javascript/jQuery and frameworks like Bootstrap and jQuery Mobile and have it work against a Domino backend. I will demonstrate how to easily read data from and write data to the Domino database, and how to consume data using free plugins like BootstrapTable and FullCalendar.

I will also discuss the difference between JSON and JSONP and why the latter usually is better when building this type of integration. You will leave with a sample database containing the source code all the demos I will be showing as well as Lotusscript script libraries with classes I built to easily build agents that will interact with the website.

The idea is that you should be able to attend my session in Austin even if you haven’t seen any previous presentation. I will assume you have basic web design skills (HTML, CSS and a working understanding of Javascript) but you don’t have to be an expert at all. I also recommend some Lotusscript knowledge, as I will be providing all attendees with plenty of code to bring home and start using yourself.

I hope to see you in Austin in August! If you haven’t registered yet, go ahead and do it now! There are still seats left.

Review – Ytria consoleEZ

Posted on May 25, 2016 by Karl-Henry Martinsson Posted in Notes/Domino, Reviews, Software, Utilities 3 Comments

Recently I wrote about the great customer service I received from Ytria, and that made me realize that I haven’t been writing about one of their newer tools yet. The tool is consoleEZ, and it has actually been out for over a year. A new version was recently released.

As the name indicates, it is a Domino server console on steroids. You can load a number of consoles into one window, have them neatly tiled and get a great overview of what’s happening on your servers. Just like all other Ytria tools it runs in it’s own process, which means that it does not lock up your Notes, Administrator or Designer client. This is of course very convenient.

consoleEZ1

Each console window has a field where console commands can be entered. A nice feature here is auto-complete/type-ahead. You also have a drop-down button that will give you any previous commands you sent to any console, it does not have to be the one you are working on. And the commands are saved, as opposed in Domino Administrator where you lose your command history when you close the client.

You can also launch a task viewer, where you can see what tasks are running on a specific server. It updates every 3 seconds, so you can stay updated for example on views being updated, somethings I sometimes need.consoleEZ2

I would highly recommend consoleEZ for any Domino administrator, as well as for the more advanced developer who need to see what’s happening on the servers.

Contact Ytria for a current price quote in you region.

 

MWLUG – Abstract submission deadline approaching

Posted on May 25, 2016 by Karl-Henry Martinsson Posted in Community, IBM/Lotus, MWLUG Leave a comment

The deadline for session abstract submissions to MWLUG is this Friday,  May 27. You have until 5pm that day to submit any session you like to present at the conference, which takes place in Austin August 17-19.

Even if you don’t plan to present, you can of course register for the conference. There is a limited number of seats, so don’t miss out on this conference!

 

Good vs bad customer service

Posted on May 6, 2016 by Karl-Henry Martinsson Posted in Generic, IBM/Lotus, Software, Utilities 2 Comments

Today I experienced some very good customer service, and that made me think about how important that is when it comes to how a company is seen by customers (current and prospective).

What happened was that I downloaded the latest version of Ytria‘s developer tools (scanEZ, toolBarEZ, viewEZ, designPropEZ and signEZ). I been using those tools for year, and was very excited when I found out they had just released a major new version. So I downloaded it as normal, installed it and then logged in to our account to get the new license keys. I then found out that the license had not been renewed last fall. I got the invoice and passed it on within my company, but somewhere on the way it got dropped.

So now I had the new version installed, but could not use it as I did not have any valid license keys. I found the old invoice, mailed Ytria and they told me that we could just pay that invoice and the license would be reinstated. They even gave me temporary license keys so I could get up and working even before that payment was sent out from our accounting department. I had not expected that, and this little thing really impressed me. I have always liked their tools and their customer service and support is excellent.

Then we have the opposite. Recently my wife broke her phone, a Samsung Galaxy Note5. She is dependent on it and uses it every day, not only for calls and internet but also to sign things with the pen (that’s the reason she got the Note). She contacted the insurance/replacement company AT&T is using for this kind of exchanges/insurance claims and started the process online. Then when she talked to them they told her that the Note5 was back-ordered and they did not knwo when they would get one in for her. They could not tell if it would be a day or two weeks. My wife was using her old Galaxy S4 temporary, and she was not happy to hear this. So we all switched our family plan (with 5 phones, a tablet and a hotspot) to T-Mobile withing a couple of days. We are even saving some money after switching (if you sign up for three lines you get one without any extra cost), plus we all got brand new phones (Samsung S7 Edge) with a “buy one get one free” offer. We also got a few other goodies (one VR headset and one year free Netflix per phone).

So in one case the company made an existing customer happy and gained long-term loyalty, in the other case the company lost a customer spending $400+ on their services and pushed us to a competitor.

PS. If you are a Notes/Domino developer or admin, Ytria will have a webcast on Wednesday, May 11 where they will demonstrate the new version and it’s features.

 

Registration for MWLUG is open!

Posted on April 26, 2016 by Karl-Henry Martinsson Posted in Community, IBM/Lotus, MWLUG Leave a comment

MWLUG ( Mid-West Lotus User Group) is a user group event that thakes place in different cities every year. They started in the Mid-west, hence the name, but in 2016 the conference will take place in Austin, TX on August 17-19.

Registration is now open, and the fee for this 3-day conference is only $75. Yes, you read that right, the conference is practically free. You just pay for your travel and lodging. So go ahead and register!

I was able to attend MWLUG for the first time 2015 in Atlanta, and Richard Moy and his team delivered a first rate event. I have no doubt that the 2016 conference will be at least as good. So if you can go, take this opportunity. I expect that there will be many excellent presentations again this year.

Save the date – IBM Connect 2017 announced!

Posted on March 23, 2016 by Karl-Henry Martinsson Posted in Connect, IBM/Lotus, Lotusphere Leave a comment

Earlier today Inhi Cho Suh, the General Manager of ICS (IBM Collaborative Services), was speaking at the user conference Engage in the Netherlands. There she announced the dates and new location of IBM Connect, the conference previously called Lotusphere and until this year taking place in Orlando, FL.

The dates are February 19 to 22 and the location is going to be San Francisco, CA. More details will emerge later this year. I hope that European attendees will still come, despite the little bit longer (about 2 hours longer) flights. I am excited about this move, I think this will work out well despite the changes.

Good-bye Florida, hello San Francisco!

IBM gave me another badge

Posted on March 21, 2016 by Karl-Henry Martinsson Posted in IBM/Lotus 1 Comment



This is actually pretty cool. The badge is using Mozilla OpenBadges technology to let people display verifiable acheivements.

A digital badge is an online representation of a skill you’ve earned. Open Badges take that concept one step further, and allows you to verify your skills, interests and achievements through credible organizations. And because the system is based on an open standard, you can combine multiple badges from different issuers to tell the complete story of your achievements — both online and off.

Some upcoming conferences

Posted on March 14, 2016 by Karl-Henry Martinsson Posted in Community, IBM/Lotus, MWLUG, Notes/Domino 2 Comments

IBM Connect is not the only conference that you should attend if you are interested in the IBM collaboration/social platforms, there are many other spread out over different continents, and many of them are even free. You just pay your travel and hotel.

Next one up is Engage (formerly BLUG) arranged by Theo Heselmans and his team. This year it takes place in Eindhove, the Netherlands on March 23-24. There are less than 20 seats left for this free event with world class speakers, many of them are IBM Champions. Inhi Cho Suh, the new GM of IBM Collaboration Solutions, will be speaking at the Opening General Session together with Suzanne Livingston, Christ Crummey and Sarah Gibbons, all from IBM. There are five tracks with sessions, and if you look at the agenda I am sure you will find plenty to choose from. Theo always put on a great conference, I really wish I was able to attend! Update: there will be 43 IBM Champions attending, 33 of which will be presenting!

On April 11-13 you have EntwicklerCamp in Gelsenkirchen, Germany. This conference, which has been taking place for many years and I have heard much good about, is arranged by Rudy Knegt and the cost is €1499 for the three day conference. If you look at the agenda, you will see that there are sessions not only in German but also in English. Many of the sessions are presented by IBM Champions.

ICON US (formerly IamLUG) did not take place last year, but in 2016 Chris Miller and his team is back with a two day vertual conference. It takes place May 9-10 and you can register here. Seats (even if they are virtual) are limited.

Social Connections 10 is taking place in Toronto, Canada this year, June 6-7. Keynote speakers are Luis Suarez and Alan Lepofsky. As the name indicates, this conference focuses on IBM Connections. Early bird registration ends on April 1, and the cost is CA$229.00 while the regular price is $CA269.00.

Then there is MWLUG, this year taking place in Austin on August 17-19. Richard Moy and his team did a great job in Atlanta in 2015, and I am looking forward to this years conference. This is an “almost free”  conference, the fee is $75 but don’t be fooled to think it is a cheap conference. Don’t miss out on some excellent content!

So go to some user conferences, be social and learn amazing new things!

 

 

IBM Connect 2016 – My impressions

Posted on February 17, 2016 by Karl-Henry Martinsson Posted in Connect, IBM/Lotus, Lotusphere 3 Comments

When I attended IBM Connect 2015, I thought it would be the last time I got to attend the conference that for most of it’s running was called Lotusphere. I attended Lotusphere 1997 in Nice but from January 1998 I attended the conference at Walt Disney World Dolphin and Swan in Orlando every single year. After the 2015 conference the contract between IBM and Walt Disney World was up, and everyone expected the 20 year run to be over.

But something happened. IBM decided to do another IBM Connect in 2016, this time at a new location in Orlando, the Hilton. And people came. I have heard a number of about 2,200 attendees. Yes, just a fraction of what it was at it’s pinnacle, with 10,000+ attendees. But still more than previous years.

Connect2016_DiningTent

Dining tents during breakfast

The hotel and conference area was great. You still had to walk between conference rooms like in the Swolphin but you did at least not have to run over to another hotel. The dining tents reminded me of the first 10+ years of Lotusphere, but the food was a notch or two above when we were used to at Swolphin. And it was great to be able to sit outside and eat if I wanted to.

Pete Janzen and Martin Donnelly of IBM

Pete Janzen and Martin Donnelly, both from IBM

The conference was great. There is always room for improvements, but in general the conference team had done a great job. The scheduling was better than in many years, I was able to attend a number of great sessions and I even liked the new simpler badges. The check-in process was automated, and I used a combination of the conference app and the printed conference paper to find my session. I actually liked that, even if I did miss the convenient little agenda booklet one kept in the badge holder.

I also did my first presentation at IBM Connect this year, a 20 minute Lightning Talk in the Expo Showcase Theatre. This was a bit of a challenge, as I had all the exhibitors right there, and the noise from everybody talking to the vendors made the presentation more difficult, both for the presenters and the audience. I hope that everyone that attended (thank you!) got something out of it.

Connect2016_ChampionScreen

IBM Champions got a lot of exposure

The IBM Champions were represented strong at Connect 2016, and we got a lot of exposure. Champions were featured on the screen before the opening session and also in many other places during the conference. Many sessions were also presented or co-presented by IBM Champions.

Connect2016_BluemixWhen it came to the sessions, I noticed a theme. For the last 4-5 years we have seen a massive number of sessions geared towards XPages. This year the big theme was Bluemix and integration between different services, including XPages. This is where the broad portfoilio of IBM really is beneficial, you can connect different systems with each other. Using Bluemix you can connect XPages to a SQL database or a Domino NoSQL-databas, you can throw in Angular.js or even cool new technologies like Node-Red and then use services from Watson to process your data. A year ago I felt a bit “meh” when it came to Bluemix, but after Connect 2016 I really want to sit down and start playing around with it and see what cool stuff I can do.

Connect2016_RoadmapThe Opening General Session (OGS) was split into two separate parts. It was not until after the 45 minute break we got to see demos and learn more about future plans from IBM. But there were no customer panels and the customer presentations were short, to the point and relevant. I actually really liked this format. Good job, IBM!

Lets talk a little about the vendor showcase. In 2014 the exhibit hall in Dolphin was way too big, and in 2015 it was moved to a very small and cramped room in Swan. This year IBM got it right. I was able to visit most of the vendors, and there was plenty of space to mingle with people as well as during the coffee breaks that took place in the Expo Showcase.

Vendor Showcase

Vendor Showcase

So what are my suggestions for IBM Connect 2017, if IBM decides to do it again? Stay at Hilton, it was a very good location. Move the Lightning Talks to some place where it is less noisy and distracting. Update the badge holders with a pocket for business cards and perhaps even bring back the pocket agenda. Bring back the longer 2 hour jumpstart/master classes on Sunday. Otherwise I am very satisfied with how Connect 2016 turned out!

 

Stack Exchange

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

Recent Posts

  • Domino 14 is now available
  • Domino 14 Early Access Program
  • Announced: Engage 2024
  • Integrate Node-RED with Notes and Domino
  • Notes and Domino v12 is here!

Recent Comments

  • Theo Heselmans on Announced: Engage 2024
  • Lotus Script Multi-thread Message Box [SOLVED] – Wanted Solution on ProgressBar class for Lotusscript
  • Viet Nguyen on Keep up with COVID-19 though Domino!
  • Viet Nguyen on Keep up with COVID-19 though Domino!
  • Mark Sullivan on Looking for a HP calculator? Look no further!

My Pages

  • How to write better code in Notes

Archives

  • December 2023 (1)
  • October 2023 (2)
  • September 2023 (1)
  • 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 (10)
  • 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 (178)
    • #Domino2025 (14)
    • #DominoForever (8)
    • #IBMChampion (46)
    • Administration (7)
    • Cloud (7)
    • CollabSphere (9)
    • Community (49)
    • Connect (33)
    • ConnectED (12)
    • Connections (3)
    • HCL (15)
    • HCL Master (1)
    • IBM Think (1)
    • Lotusphere (46)
    • MWLUG (25)
    • Notes/Domino (99)
      • Domino 11 (7)
    • Sametime (8)
    • Verse (14)
    • Volt (3)
    • Watson (6)
  • Life (8)
  • Microsoft (7)
    • .NET (2)
    • C# (1)
    • Visual Studio (1)
  • Movies (3)
  • Old Blog Post (259)
  • Personal (23)
  • Programming (84)
    • App Modernization (11)
    • Formula (4)
    • Lotusscript (47)
    • 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 (7)
    • Europe (1)
    • Texas (2)
    • United States (1)
  • Uncategorized (16)
  • Web Development (50)
    • Frameworks (23)
      • Bootstrap (14)
    • HTML/CSS (12)
    • Javascript (32)
      • jQuery (23)
  • Prev
  • 1
  • …
  • 6
  • 7
  • 8
  • 9
  • 10
  • …
  • 18
  • Next

Administration

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

Tracking

Creeper
MediaCreeper
  • Family Pictures
© TexasSwede 2008-2014