Sunday, March 29, 2009

Facebook, Twitter, and the Non-Web Generation

I attended MeetingsTechOnline Summit 2009 (www.mtosummit.com) for my real job earlier this week in Washington, DC. The main topic of discussion throughout all the sessions and by the keynote speakers was social media, especially Facebook and Twitter. During lunch the people around my table had a very interesting discussion. Of the people sitting at my table, 3 of us, including myself were what I am going to refer to as the web generation. All under 30 and all grew up using the internet. Each of us were regular users of both Facebook and Twitter and the information presented at the conference wasn't really big news to us. What was interesting about the conversation was listening to the other 5 people at the table try and wrap their heads around these technologies. They had heard of Facebook. One of the ladies at the table even had an account that her kids helped her setup. A few of them had heard of Twitter, but didn't know what it was. The lady with the Facebook account kept calling it Tweetter. They kept asking why people would use these things, especially in a professional context.

Marketing Platform
One of the main points I tried to emphasize was the opportunity these new mediums offer as a marketing platform. With nearly 200 million users, Facebook offers unique ways for marketers to reach their audience. Marketing through Facebook is different from traditional web marketing. While you can use sponsored links, purchase ads, etc., so far those haven't shown to be particularly effective. The click-through rates for Facebook ads are actually a lot lower than other web advertisements. This doesn't mean you shouldn't pursue these methods, but what excites me about Facebook are the other ways you can reach your audience. Facebook apps, Pages, or Connect are just a few of the other programs Facebook offers that can be potentially used to build brand awareness and allow you to reach your customers in new ways.

Sense of Community
A second idea I discussed with the group at lunch was the sense of community that these social media outlets give users. This feeling of community allows potential buyers to feel like they are more that just another customer. They are someone who is engaged and involved with the companies and products they are purchasing. Twitter, for example, can help your customers stay current with new initiatives, product developments, and other announcements, without having to read a lengthy press release. You can even use Twitter to publicize the press release. Again, it is another outlet to reach those customers who are the most loyal and most interested in your products. If they have already taken the steps to follow your Twitter feed or become a fan on Facebook, this is your target demographic. You don't have to convince them about your product or service. They want you to succeed and letting them feel involved in your business further establishes that relationship.

Enhanced Communication
Finally, I talked about the new methods of communication these platforms provide. One of the people at the table asked me if this replaces email. Obviously, he was still struggling to wrap his head around the overall concept, but these tools definitely don't replace email as a form of communication. They allow you to publicize and market yourself outside of traditional methods. One idea I mentioned was setting up a quick poll type question on your product's Facebook page to gauge interest in a new feature or enhancement. This feedback from your most loyal customers is something that can be difficult to obtain through traditional means.

Not just for old classmates
Basically, what I tried to emphasize to the other people at my table was that using Facebook, Twitter, and other social media platforms isn't something that is simply for connecting with the cute girl you sat next to in high school. That might be the reason people initially sign up for these services, but once they get hooked, a new, unique opportunity for marketing and communication is opened up. As more and more people use these services, marketers and other professionals need to adapt and change their marketing strategies to include exposure in these areas.

Tuesday, March 24, 2009

Back in the Saddle

It is time to dust off my blog. I have had this blog for over 4 years and it has been very neglected. I have been working on my business (QFi Systems) almost that entire time and I am excited to say it is coming to an end. It looks like I am going to be able sell it in the next couple of weeks. When that is officially complete, I will be sure to post an official announcement.

I am also working on some new projects and am excited to track the details of these. One of the things I am doing is building a couple of iPhone apps. I am in the final stages of uploading my initial test app. It is a basic mortgage/loan calculator app. The thing I think I have done a little differently with this app, as compared to other mortgage calculators, is the special "what-if" section. Obviously it allows a user to calculate the effect of extra payments, but it also enhances those extra options by letting a user figure out what the effect would be if they skipped buying their mocha latte or Big Mac and applied that money to their loan. This is going to be a free app, with the idea that I am learning about the iPhone development/distribution process. I will be working on some other apps that I hope to be able to sell.

I have also been doing a lot of php development over the last year, including building a couple of Facebook apps. I intend on posting information about some of these things as time goes on. I have been just dipping my toe into these and other topics over the last couple of years and I am now jumping in with both feet. Come along for the ride...

Tuesday, October 16, 2007

Outlook calendar appointment email with Java 2.0

I have decided to finally update my blog. The only real traffic I get is from a post I wrote about 2 years ago. At the time I was working on a project to send an Outlook appointment using Java. I have had a lot of questions about how to do this without having to open the attachment. A few months ago, with the help from my colleague, Wayne Woodfield (check out his site www.jumpbid.com) we figured out how to mimic the actual Outlook message headers.

It is basically the same as before, with just a couple of additional headers. The start and end times are hard coded in the example below, so you are going to want to dynamically set those. We ended up logging into the mail server and viewing the message headers as text. This allowed us to find the proper format and the headers we were missing previously.

Here is the example:

import org.apache.commons.lang.StringUtils;

import java.util.Properties;
import java.util.Calendar;
import java.util.TimeZone;
import java.io.*;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.activation.DataHandler;
import javax.activation.DataSource;


public class OutlookMeeting
{
private String outgoingMailServer;
private String fromEmail;
private String toEmail;
private String subject;
private String rsvpTo;
private String organizer;
private SessionTime sessionTime;
private TimeZone timezone;
private String location;
private String message;

public static void main(String[] args) throws Exception {
OutlookMeeting meeting = new OutlookMeeting();
meeting.setOutgoingMailServer("mail.mailserver.com");
meeting.setFromEmail("test@test.com");
meeting.setToEmail("test@test.com");
meeting.setSubject("Outlook Meeting Request Using JavaMail");
meeting.setRsvpTo("test@test.com");
meeting.setOrganizer("test@test.com");
meeting.setTimeZone(TimeZone.getDefault());
meeting.setLocation("Test Location");
meeting.setMessage("This message was sent out with JavaMail");
meeting.send();
}

public void setOutgoingMailServer(String outgoingMailServer)
{
this.outgoingMailServer = outgoingMailServer;
}

public void setFromEmail(String fromEmail)
{
this.fromEmail = fromEmail;
}

public void setToEmail(String toEmail)
{
this.toEmail = toEmail;
}

public void setSubject(String subject)
{
this.subject = subject;
}

public void setRsvpTo(String rsvpTo)
{
this.rsvpTo = rsvpTo;
}

public void setOrganizer(String organizer)
{
this.organizer = organizer;
}

public void setSessionTime(SessionTime st)
{
this.sessionTime = st;
}

public void setTimeZone(TimeZone timezone)
{
this.timezone = timezone;
}

public void setLocation(String location)
{
this.location = location;
}

public void setMessage(String message)
{
this.message = message;
}

public void send() throws Exception
{
try
{
Properties prop = new Properties();
prop.put("mail.smtp.host", outgoingMailServer);

Session session = Session.getDefaultInstance(prop, null);

// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromEmail));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
message.setSubject(subject);

String body = "BEGIN:VCALENDAR\n" +
"PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n" +
"VERSION:2.0\n" +
"METHOD:REQUEST\n" +
"BEGIN:VEVENT\n" +
"ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:" + StringUtils.defaultString(rsvpTo, fromEmail) + "\n" +
"ORGANIZER:MAILTO:" + StringUtils.defaultString(organizer, fromEmail) + "\n" +
"DTSTART:20070908T180000Z\n" +
"DTEND:20070908T190000Z\n" +
"LOCATION:" + location + "\n" +
"TRANSP:OPAQUE\n" +
"SEQUENCE:0\n" +
"UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100\n" +
" 000004377FE5C37984842BF9440448399EB02\n" +
"DTSTAMP:" + VCalUtil.getVCalDateTimeString(Calendar.getInstance(TimeZone.getTimeZone("GMT"))) + "\n" +
"CATEGORIES:Meeting\n" +
"DESCRIPTION:" + StringUtils.replace(this.message, "\n", "\\n") + "\n\n" +
"SUMMARY:" + subject + "\n" +
"PRIORITY:5\n" +
"CLASS:PUBLIC\n" +
"BEGIN:VALARM\n" +
"TRIGGER:-PT15M\n" +
"ACTION:DISPLAY\n" +
"DESCRIPTION:Reminder\n" +
"END:VALARM\n" +
"END:VEVENT\n" +
"END:VCALENDAR";

// Fill the message
DataHandler handler = new DataHandler(new OutlookMeetingDataSource(body));
message.setDataHandler(handler);

// send message
Transport.send(message);
}
catch (MessagingException me)
{
me.printStackTrace();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}

class OutlookMeetingDataSource implements DataSource
{
private byte[] data;

public OutlookMeetingDataSource(String data) {
try
{
this.data = data.getBytes("UTF-8");
}
catch (UnsupportedEncodingException uex)
{
}
}

public InputStream getInputStream() throws IOException
{
return new ByteArrayInputStream(data);
}

public OutputStream getOutputStream() throws IOException
{
throw new IOException("Unsupported operation. We can only send Outlook Meeting invites with this handler, not receive them.");
}

public String getContentType()
{
return "text/calendar; method=REQUEST; charset=\"UTF-8\"";
}

public String getName()
{
return "Microsoft Outlook Calendar Item";
}
}
}

Hopefully this is a good update for people looking to send Outlook appointment emails. I will try and be better at responding to comments or questions.

Thursday, August 25, 2005

6 months

I just happend to look at my blog today because I got an question from someone about sending a java email message with high priority. It is amazing the way the web has become such a resource of information. I had posted the email code primarily as a resource for me in the future if I ever need to figure something like tht out again. It got posted on a Sun Java forum and now I get emails all of the time asking about different email situations. I am glad to help and hopefully am able to answer people's questions.

I have had to chance to play around with a lot of home networking type gear lately due to my WISP business. Some of it has been really good, like the Linksys WRT54G Wireless Router. My company secured a contract with a condo development and we have these routers deployed in 20 buildings. I have had to add more powerful antennas to them to get better coverage through the 3 floors of each condo building, but they have worked really well. They have good security features including WPA and MAC address filtering, both of which are very easy to set up.

Tuesday, February 22, 2005

QFi Systems and iGo

I have taken the plunge and am starting my own company. I have wanted to start my own company for a while, but haven't had the right opportunity. Well, I think that has come along. Myself and a friend are starting a wireless internet service provider (WISP). Our name is QFi Systems. We are going to be providing internet access in Eagle Mountain, UT. We are starting small but we feel like we have great potential. The only competition we have is the city owned DSL, which is expensive and not very reliable, and another wirless internet service provider, who is really struggling right now. We are hoping that this can turn into a very nice side business, with the potential to get even bigger. I have been reading everything I possibly can about starting a WISP, but if anybody has any suggestions or ideas please let me know. And if you know anybody in Eagle Mountain, UT let them know to sign up!

I have been playing around with a new gadget lately as well. I recently was given an iGo Juice 70 along with some additional accesories. What a sweet little gadget. Now I leave the power supply for my laptop at work because I can use the iGo at home. And the flexibilty of the multiple tips combined with auto/airplane connectivity makes it a great travel accessory. If you have the chance I would definitely check one of these out. Too bad they don't have a USB tip for my BlackBerry, but I guess I can charge my laptop while plugging in my BlackBerry...

Saturday, January 22, 2005

Outlook calendar appointment email with Java

This week I have been working on figuring out how to send an Outlook calendar appointment email with Java. I looked at a lot of different websites and it seemed like a lot of people are asking how to do this and no one is really giving any kind of solution. I use the web all of the time to answer questions, so I figured that since I had figured this out I would contribute back to the general knowledge base. Matt Bess also helped me in figuring this out.

What I have determined is that if you want to send an Outlook calendar appointment using Java, you have to send it as either a .vcs or .ics attachment. All the receipient has to do is double click on the attachment and it will be put in their calendar. Initially I wanted to have the behavior mimic that of a native Outlook appontment by giving the "Accept" or "Decline" buttons. Whenever I tried to send the email I would get the following error:

javax.activation.UnsupportedDataTypeException: no object DCH for MIME type text/calendar

This happens because there is not a mail handler defined in my mailcap file. But as far as I know there is not a java mail handler for Outlook messages. So the way to get around this problem is to send a multipart message. The first part is the content of the message that will display in the email client. This nice thing about doing it this way is that you can still have a HTML formatted email as the message and then attach the appointment for their calendar. Using the multipart gives a lot of flexibility. Here is some sample code:


MimeMessage message = mailSender.createMimeMessage();

message.setFrom( new InternetAddress("jared.blake@gmail.com", "jared.blake@gmail.com") );
javax.mail.Address address = new InternetAddress("jared.blake@gmail.com", "jared.blake@gmail.com");
message.addRecipient(MimeMessage.RecipientType.TO, address);
message.setSubject("test");

String contentType = "text/plain";

StringBuffer buffer = new StringBuffer();

buffer.append("BEGIN:VCALENDAR\n" +
  "PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN\n" +
  "VERSION:1.0\n" +
  "BEGIN:VEVENT\n" +
  "ATTENDEE:MAILTO:jared.blake@gmail.com\n" +
  "DTSTART:20050120T170000Z\n" +
  "DTEND:20050120T180000Z\n" +
  "LOCATION;ENCODING=QUOTED-PRINTABLE:Lindon, UT\n" +
  "UID:040000008200E00074C5B7101A82E008000000004024D79F7EFDC4010000000000000000100\n" +
  " 00000CA06303EA8D5AD408E07455F234F0294\n" +
  "DESCRIPTION;ENCODING=QUOTED-PRINTABLE:This is a test calendar item.=0D=0A\n" +
  "SUMMARY;ENCODING=QUOTED-PRINTABLE:My Event\n" +
  "PRIORITY:3\n" +
  "END:VEVENT\n" +
  "END:VCALENDAR");

// Create the message part
BodyPart messageBodyPart = new MimeBodyPart();

// Fill the message
messageBodyPart.setText("Here's the file");

// Create a Multipart
Multipart multipart = new MimeMultipart();

// Add part one
multipart.addBodyPart(messageBodyPart);

// Part two is attachment
// Create second body part
messageBodyPart = new MimeBodyPart();
String filename = "test calendar.vcs";
messageBodyPart.setFileName(filename);
messageBodyPart.setContent(buffer.toString(), "text/plain");

// Add part two
multipart.addBodyPart(messageBodyPart);

// Put parts in message
message.setContent(multipart);

// send message
mailSender.send(message);


This code should give you a basic idea. You can find a lot of different sites that explain how to use the vCal format. I found this page to have some good links.

http://wmf.editthispage.com/discuss/msgReader$7900?mode=day

Like I said, I know a lot of people are looking to figure out how to send Outlook calendar appointments, so I hope this has helped get you started. If you have questions I will try to answer them the best I can.

Saturday, January 08, 2005

Headphone update

I used my Bose Noise Cancelling Headphones on the airplane for the first time this week. (See previous post) They worked awesome. When I put them on the engine noise was reduced to a small sound of rushing air. And once I listened to music or was listening to the movie, I couldn't even hear that air. They are great.