Dot .Net Dilemmas
Last night I was reading up on how to create a good ‘Elevator Pitch’. I have to say that I'm not even 100% sure that I need one at this stage. I’m not looking for investment or help from anyone who I would need to ‘sell’ the idea to. However, I do think that it will be a good exercise for me to complete as it will force me to answer some very important questions about what the business should be. It may even have the effect of making me face up to the fact that my idea just won’t sell. I hope not or this could be the shortest-lived Micro-ISV of all time…
I have however, come to the conclusion that I would really like/need to get some help with the ‘Who is your Competition’ question. I know that I could go to Google of Bing and start searching on the web for all the companies and Micro-ISV that will be my competitors and that I will need to keep an eye on. Right now however, I just don't have the business knowhow to assess the success of a business just by looking at their website. I know that perfect person to ask, now all I need to do is get her to say ‘yes’.
I am going to be honest here, this is all very new to me and I am going to do all my learning and make all my mistakes in public so, if I am making stupid mistakes or asking stupid questions, please point them out and if you can, cut me a little slack to begin with.
Friday, June 19, 2009
Thursday, June 18, 2009
Day 1: BPD Micro-ISV
Dot .Net Dilemmas
For a long time how I have been thinking about and working towards starting up my own online business which, I have found out is called a ‘Micro-ISV’ . I don't think that I have a particularly brilliant business brain but, I look around and see that there are a lot of people who are just like me (and some that don't have the same skills that I have) running very successful software business. I think that there comes a time for most people when they would just like to work for themselves. Give it your best shot and see how it goes.
This is day 1 – “Blank Page Day”. Hopefully, someday not too far into the future, I will be writing a blogs on how I have just made my first sale, my first year in business, version 2 of my product and hopefully (someday) being able to give up working full-time so that I can concentrate on my own million dollar business.
Although the aim of the business is (and should be) to make money (and lots of it), I hope that I learn a lot along the way. I plan to use a host of new ideas and technologies (new to me anyhow) and maybe some of the things that I learn and mistakes I make along the way will help others who are thinking along the same lines. If nothing else it will be an experience and it should be an exciting one.
For a long time how I have been thinking about and working towards starting up my own online business which, I have found out is called a ‘Micro-ISV’ . I don't think that I have a particularly brilliant business brain but, I look around and see that there are a lot of people who are just like me (and some that don't have the same skills that I have) running very successful software business. I think that there comes a time for most people when they would just like to work for themselves. Give it your best shot and see how it goes.
The great thing about having a full-time job is that, within reason, if the company has a bad month or you get sick, you still get paid the same as you did last month. On the negative side, when the company does really well and you’ve worked really, really hard, you STILL get paid the same as last month. I don't think that it takes a genius to figure out that, I will ever get ‘rich’ working for ‘the man'…
Micro-ISV
I really don't like the term 'Micro-ISV' (Eric Sink is to 'blame'; he used it in an article for Chris Sells at Microsoft) but it does explain exactly what the business will be, a small Independent Software Vendor. And in my case a REALLY small Independent Software Vendor. To start with, it will be just me…. But that’s ok.
I have a number of ideas and products that I want to try and bring to market and I have settled on one as my first small footsteps into the world of online business. I won't go into what exactly it is that I hope to develop but, I have noticed a gap in the market in an industry that I have some background in and, I reckon I could help fill that gap (or at least make it a smaller gap).
Over the last few months I have been reading loads and loads of articles and listening to even more podcasts on how best to start an online business and what technologies I should use. However, except for that I honestly am at the very start of this journey and this is going to be my online journal of how I get on. The one thing that I keep hearing over and over is, 'Just get it out there', so that's what I plan to do. I hope to have version one of the product available in roughly 4 months.
I really don't like the term 'Micro-ISV' (Eric Sink is to 'blame'; he used it in an article for Chris Sells at Microsoft) but it does explain exactly what the business will be, a small Independent Software Vendor. And in my case a REALLY small Independent Software Vendor. To start with, it will be just me…. But that’s ok.
I have a number of ideas and products that I want to try and bring to market and I have settled on one as my first small footsteps into the world of online business. I won't go into what exactly it is that I hope to develop but, I have noticed a gap in the market in an industry that I have some background in and, I reckon I could help fill that gap (or at least make it a smaller gap).
Over the last few months I have been reading loads and loads of articles and listening to even more podcasts on how best to start an online business and what technologies I should use. However, except for that I honestly am at the very start of this journey and this is going to be my online journal of how I get on. The one thing that I keep hearing over and over is, 'Just get it out there', so that's what I plan to do. I hope to have version one of the product available in roughly 4 months.
This is day 1 – “Blank Page Day”. Hopefully, someday not too far into the future, I will be writing a blogs on how I have just made my first sale, my first year in business, version 2 of my product and hopefully (someday) being able to give up working full-time so that I can concentrate on my own million dollar business.
Although the aim of the business is (and should be) to make money (and lots of it), I hope that I learn a lot along the way. I plan to use a host of new ideas and technologies (new to me anyhow) and maybe some of the things that I learn and mistakes I make along the way will help others who are thinking along the same lines. If nothing else it will be an experience and it should be an exciting one.
Books
Ok, I am currently reading 3 books:
Wish me luck…
Ok, I am currently reading 3 books:
- Micro-ISV: From Vision to Reality by Bob Walsh (forwarded by the legend who is Joel Spolky)
- Neuro Web Design: What Makes Them Click? by Susan M Weinschenk
- Applying Domain-Driven Design and Patterns: With Examples in C# and .NET by Jimmy Nilsson
Wish me luck…
Wednesday, April 29, 2009
Visually Impaired? Here, let's try and make this a little more difficult for you.
Dot .Net Dilemmas
I get the need for CAPTCHA on a website but, I really don't like it as a solution to preventing automated site attacks. I see it as real barrier to purchasing online as more often than not, it takes a number of attempts to get the word(s) entered just how the software wants to see it. Unless I really want something, I hit the 'X' in the top left hand corner of the browser. Now I'm a web developer and I find it tricky and annoying so I can only imagine how frustrating it is to someone who is simply trying to purchases tickets online for the first time, to see Celine Dion live in concert.
Now think about how much more difficult the whole process is if you are visually impaired. Recently I was trying to purchase tickets online (not to Celine Dion, I promise) when before the application would even let me know if there were any tickets still available I was hit with this:

I wasn't 100% sure what the words were (even after clicking 'Try another' a few times) so, I had a look around for some help. There right under 'Try another' is 'Vision Impaired' see it?

Don't get me wrong, it is a good idea and anything that helps people with a disability access to the web is a good thing; but just look how small it is... If you are visually impaired and can not see or make out the words in the Security Check, how on earth are you meant to see the tiny 'Vision Impaired' text?
Moving on, let's pretend that I am visually impaired and I have someone who is able to tell me what I should do next close by. I click on 'Vision Impaired' expecting to see the words displayed over the whole page in letter so big that you can make them out from space but no...
What you get next is an even smaller screen, that plays an audio of some numbers (that you are meant to type in to the text box provided) over the tops of some ghost like moaning and whispering.
So, if you are visually impaired, you first have to be able to find the 'Vision Impaired' link. If you some how miraculously find it and click on it, you have to find the play button and then hope that your PC or laptop has a sound card. If it does, you had better hope that your hearing isn't also impaired (it would explain wanting to see Celine Dion in concert) and than you are able to make out the numbers from the ghostly bingo caller.
As I said, I really don't like the CAPTCHA approach (I understand that it is easy to criticise and I haven't come up with anything better) but surely this is an idiotic solution to a very simple problem. If you are expecting people who are visually impaired to use your site, make it so easy for them. Just make the letters and words BIGGER...
I get the need for CAPTCHA on a website but, I really don't like it as a solution to preventing automated site attacks. I see it as real barrier to purchasing online as more often than not, it takes a number of attempts to get the word(s) entered just how the software wants to see it. Unless I really want something, I hit the 'X' in the top left hand corner of the browser. Now I'm a web developer and I find it tricky and annoying so I can only imagine how frustrating it is to someone who is simply trying to purchases tickets online for the first time, to see Celine Dion live in concert.
Now think about how much more difficult the whole process is if you are visually impaired. Recently I was trying to purchase tickets online (not to Celine Dion, I promise) when before the application would even let me know if there were any tickets still available I was hit with this:

I wasn't 100% sure what the words were (even after clicking 'Try another' a few times) so, I had a look around for some help. There right under 'Try another' is 'Vision Impaired' see it?

Don't get me wrong, it is a good idea and anything that helps people with a disability access to the web is a good thing; but just look how small it is... If you are visually impaired and can not see or make out the words in the Security Check, how on earth are you meant to see the tiny 'Vision Impaired' text?
Moving on, let's pretend that I am visually impaired and I have someone who is able to tell me what I should do next close by. I click on 'Vision Impaired' expecting to see the words displayed over the whole page in letter so big that you can make them out from space but no...
What you get next is an even smaller screen, that plays an audio of some numbers (that you are meant to type in to the text box provided) over the tops of some ghost like moaning and whispering.

As I said, I really don't like the CAPTCHA approach (I understand that it is easy to criticise and I haven't come up with anything better) but surely this is an idiotic solution to a very simple problem. If you are expecting people who are visually impaired to use your site, make it so easy for them. Just make the letters and words BIGGER...
Monday, April 27, 2009
It's my party and I'll... keep listening to my iPod if I want to.
Dot .Net Dilemmas
Why do offices (usually HR) insist on having employee birthday celebrations? Ok, I'll admit, I am a bit of a strange one when it comes to forced celebrations (hey, it's your birthday, you HAVE to be happy today... Did you hear me? BE HAPPY!!!!!). However, I can think of few things worse than looking up from my work and having to take my headphones off as the whole office stand around my desk, arms folded with a look on their face that falls somewhere between boredom and pure pain just to wish me a happy birthday.
It's happened in almost every company I've worked in and there is just no need for it. None!!!! It is pointless and simply a management exercise in touchy feely. The majority of people that I know hate it, really, really hate it. Granted, most people I know in a work environment are programmers and they aren't too fond of any social interaction. The worst thing about it all is that I have NO say whatsoever in it happening. It's suppose to be MY birthday yet, I sit here all day feeling slightly ill knowing that at any moment I am going to be surrounded by some people who never really speak to me, but are now going to sing to me...
So, it's my birthday today and I am sitting here writing this and waiting... Waiting and trying to take my mind of what's to come. I now believe strongly that it's not the getting older as to why most people hate their birthday it's waiting, like a man on death row, for the forced office 'celebration' to begin.
Time for my happy face... Tick, tick, tick....
Why do offices (usually HR) insist on having employee birthday celebrations? Ok, I'll admit, I am a bit of a strange one when it comes to forced celebrations (hey, it's your birthday, you HAVE to be happy today... Did you hear me? BE HAPPY!!!!!). However, I can think of few things worse than looking up from my work and having to take my headphones off as the whole office stand around my desk, arms folded with a look on their face that falls somewhere between boredom and pure pain just to wish me a happy birthday.
It's happened in almost every company I've worked in and there is just no need for it. None!!!! It is pointless and simply a management exercise in touchy feely. The majority of people that I know hate it, really, really hate it. Granted, most people I know in a work environment are programmers and they aren't too fond of any social interaction. The worst thing about it all is that I have NO say whatsoever in it happening. It's suppose to be MY birthday yet, I sit here all day feeling slightly ill knowing that at any moment I am going to be surrounded by some people who never really speak to me, but are now going to sing to me...
So, it's my birthday today and I am sitting here writing this and waiting... Waiting and trying to take my mind of what's to come. I now believe strongly that it's not the getting older as to why most people hate their birthday it's waiting, like a man on death row, for the forced office 'celebration' to begin.
Time for my happy face... Tick, tick, tick....
Friday, November 14, 2008
POP-Before-SMTP
Dot .Net Dilemmas
I recently had to move one of my web applications off one hosting provider (that changed their trust levels without informing anyone) and on to a new hosting provider where I could set the trust level in my web.config file. I wanted to keep the web and mail service on the old provider as transferring the domain to the new provider could have meant even more downtime for my client and she really couldn't afford that (who could at the moment?).
Anyhow, all was ok until I was testing the application on the new server, went to purchases some sessions and BANG! Another issue raised its ugly head;
I contacted my old hosting provider and the response I got back was;
"If a valid POP login is not received before sending mail through the server, then the mail is greylisted and held for 5 minutes before a retry"
To the point but, it didn’t actually explain how I might do this. They actually suggested that;
“The easiest way would be to click on "Send/Receive" in the email software before sending the email."
Even though they knew that the email was being created from within code.
I posted a message on Stackoverflow, and found out that I would basically have to write the code myself, as ‘POP3 is not built into the .NET framework’.
Below is the code that I put in place. Basically, I do a POP-Before-SMTP. This logs me into the POP3 server, my credentials are authenticated and I can send the email that I need to send, immediately after the call. (I tried to put snapshots in here but the quality was awful.)
Ultimately, I will move everything over the new hosting provider (and hopefully talk my client into moving to a dedicated server) but for now, this works perfectly well.
using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
namespace Pop3
{
public class Pop3Client
{
private Pop3Credential m_credential;
private const int m_pop3port = 110;
private const int MAX_BUFFER_READ_SIZE = 256;
private long m_inboxPosition = 0;
private long m_directPosition = -1;
private Socket m_socket = null;
private Pop3Message m_pop3Message = null;
public Pop3Credential UserDetails
{
set { m_credential = value; }
get { return m_credential; }
}
public string From
{get { return m_pop3Message.From; }}
public string To
{get { return m_pop3Message.To; }}
public string Subject
{get { return m_pop3Message.Subject; }}
public string Body
{get { return m_pop3Message.Body; }}
public IEnumerator MultipartEnumerator
{get { return m_pop3Message.MultipartEnumerator; }}
public bool IsMultipart
{get { return m_pop3Message.IsMultipart; }}
public Pop3Client(string user, string pass, string server)
{m_credential = new Pop3Credential(user,pass,server);}
private Socket GetClientSocket()
{
Socket s = null;
try
{
IPHostEntry hostEntry = null;
// Get host related information.
hostEntry = Dns.GetHostEntry(m_credential.Server);
// Loop through the AddressList to obtain the supported
// AddressFamily. This is to avoid an exception that
// occurs when the host IP Address is not compatible
// with the address family
// (typical in the IPv6 case).
foreach(IPAddress address in hostEntry.AddressList)
{
IPEndPoint ipe = new IPEndPoint(address, m_pop3port);
Socket tempSocket =
new Socket(ipe.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
tempSocket.Connect(ipe);
if(tempSocket.Connected)
{
// we have a connection.
// return this socket ...
s = tempSocket;
break;
}
else
{
continue;
}
}
}
catch(Exception e)
{
throw new Pop3ConnectException(e.ToString());
}
// throw exception if can't connect ...
if(s == null)
{
throw new Pop3ConnectException("Error : connecting to "
+m_credential.Server);
}
return s;
}
private string GetPop3String()
{
if(m_socket == null)
{
throw new
Pop3MessageException("Connection to POP3 server is closed");
}
byte[] buffer = new byte[MAX_BUFFER_READ_SIZE];
string line = null;
try
{
int byteCount =
m_socket.Receive(buffer,buffer.Length,0);
line =
Encoding.ASCII.GetString(buffer, 0, byteCount);
}
catch(Exception e)
{
throw new Pop3ReceiveException(e.ToString());
}
return line;
}
private void LoginToInbox()
{
string returned;
// send username ...
Send("user "+m_credential.User);
// get response ...
returned = GetPop3String();
if( !returned.Substring(0,3).Equals("+OK") )
{
throw new Pop3LoginException("login not excepted");
}
// send password ...
Send("pass "+m_credential.Pass);
// get response ...
returned = GetPop3String();
if( !returned.Substring(0,3).Equals("+OK") )
{
throw new
Pop3LoginException("login/password not accepted");
}
}
public void CloseConnection()
{
Send("quit");
m_socket = null;
m_pop3Message = null;
}
public void OpenInbox()
{
// get a socket ...
m_socket = GetClientSocket();
// get initial header from POP3 server ...
string header = GetPop3String();
if( !header.Substring(0,3).Equals("+OK") )
{
throw new Exception("Invalid initial POP3 response");
}
// send login details ...
LoginToInbox();
}
}
}
I recently had to move one of my web applications off one hosting provider (that changed their trust levels without informing anyone) and on to a new hosting provider where I could set the trust level in my web.config file. I wanted to keep the web and mail service on the old provider as transferring the domain to the new provider could have meant even more downtime for my client and she really couldn't afford that (who could at the moment?).
Anyhow, all was ok until I was testing the application on the new server, went to purchases some sessions and BANG! Another issue raised its ugly head;
"The server rejected one or more recipient addresses. The server response was: 450 : Recipient address rejected: Greylisted for 5 minutes"
I contacted my old hosting provider and the response I got back was;
"If a valid POP login is not received before sending mail through the server, then the mail is greylisted and held for 5 minutes before a retry"
To the point but, it didn’t actually explain how I might do this. They actually suggested that;
“The easiest way would be to click on "Send/Receive" in the email software before sending the email."
Even though they knew that the email was being created from within code.
I posted a message on Stackoverflow, and found out that I would basically have to write the code myself, as ‘POP3 is not built into the .NET framework’.
Below is the code that I put in place. Basically, I do a POP-Before-SMTP. This logs me into the POP3 server, my credentials are authenticated and I can send the email that I need to send, immediately after the call. (I tried to put snapshots in here but the quality was awful.)
Ultimately, I will move everything over the new hosting provider (and hopefully talk my client into moving to a dedicated server) but for now, this works perfectly well.
using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
namespace Pop3
{
public class Pop3Client
{
private Pop3Credential m_credential;
private const int m_pop3port = 110;
private const int MAX_BUFFER_READ_SIZE = 256;
private long m_inboxPosition = 0;
private long m_directPosition = -1;
private Socket m_socket = null;
private Pop3Message m_pop3Message = null;
public Pop3Credential UserDetails
{
set { m_credential = value; }
get { return m_credential; }
}
public string From
{get { return m_pop3Message.From; }}
public string To
{get { return m_pop3Message.To; }}
public string Subject
{get { return m_pop3Message.Subject; }}
public string Body
{get { return m_pop3Message.Body; }}
public IEnumerator MultipartEnumerator
{get { return m_pop3Message.MultipartEnumerator; }}
public bool IsMultipart
{get { return m_pop3Message.IsMultipart; }}
public Pop3Client(string user, string pass, string server)
{m_credential = new Pop3Credential(user,pass,server);}
private Socket GetClientSocket()
{
Socket s = null;
try
{
IPHostEntry hostEntry = null;
// Get host related information.
hostEntry = Dns.GetHostEntry(m_credential.Server);
// Loop through the AddressList to obtain the supported
// AddressFamily. This is to avoid an exception that
// occurs when the host IP Address is not compatible
// with the address family
// (typical in the IPv6 case).
foreach(IPAddress address in hostEntry.AddressList)
{
IPEndPoint ipe = new IPEndPoint(address, m_pop3port);
Socket tempSocket =
new Socket(ipe.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
tempSocket.Connect(ipe);
if(tempSocket.Connected)
{
// we have a connection.
// return this socket ...
s = tempSocket;
break;
}
else
{
continue;
}
}
}
catch(Exception e)
{
throw new Pop3ConnectException(e.ToString());
}
// throw exception if can't connect ...
if(s == null)
{
throw new Pop3ConnectException("Error : connecting to "
+m_credential.Server);
}
return s;
}
private string GetPop3String()
{
if(m_socket == null)
{
throw new
Pop3MessageException("Connection to POP3 server is closed");
}
byte[] buffer = new byte[MAX_BUFFER_READ_SIZE];
string line = null;
try
{
int byteCount =
m_socket.Receive(buffer,buffer.Length,0);
line =
Encoding.ASCII.GetString(buffer, 0, byteCount);
}
catch(Exception e)
{
throw new Pop3ReceiveException(e.ToString());
}
return line;
}
private void LoginToInbox()
{
string returned;
// send username ...
Send("user "+m_credential.User);
// get response ...
returned = GetPop3String();
if( !returned.Substring(0,3).Equals("+OK") )
{
throw new Pop3LoginException("login not excepted");
}
// send password ...
Send("pass "+m_credential.Pass);
// get response ...
returned = GetPop3String();
if( !returned.Substring(0,3).Equals("+OK") )
{
throw new
Pop3LoginException("login/password not accepted");
}
}
public void CloseConnection()
{
Send("quit");
m_socket = null;
m_pop3Message = null;
}
public void OpenInbox()
{
// get a socket ...
m_socket = GetClientSocket();
// get initial header from POP3 server ...
string header = GetPop3String();
if( !header.Substring(0,3).Equals("+OK") )
{
throw new Exception("Invalid initial POP3 response");
}
// send login details ...
LoginToInbox();
}
}
}
Login to the POP server just before you try to send the email..
p = new Pop3Client("user","password","server");
if(p != null)
{
p.OpenInbox();
// ...Send Email.
}
Monday, November 10, 2008
DeployLX - Software Protection System
Dot .Net Dilemmas
The company that I work for are looking into completely overhauling our Licensing and Software protection system for all our software products. We currently have 4-5 products that are sold over the web and installed on the clients' machine and each needs to be protected.
The company that I work for are looking into completely overhauling our Licensing and Software protection system for all our software products. We currently have 4-5 products that are sold over the web and installed on the clients' machine and each needs to be protected.
Our current 'in-house' system ties the license to a machine profile and this makes it difficult to manage the licenses. In the future, we need our license system to be a lot more flexible allowing for; extensions on trial versions of our software, subscriptions for both our single and floating licenses and ease of license transfer.
I was given the task of investigating the various licensing system out there and come back with a recommendation. The basic brief was;
Single License:
In the end, after looking at 8-10 products, I put my money (well, my company's money) on DeployLX and Codeveil from Xheo. It seemed to offer everything that we needed and compared to a lot of companies, it was pretty well priced.
I was given the task of investigating the various licensing system out there and come back with a recommendation. The basic brief was;
Single License:
- Tied to a machine profile.
- Must be easily deactivated from one machine and transferred to another.
- A company should be able to install our software on each PC/Laptops required, without having to go through a complicated registering/activation process. The Activation of the software licences should only happen on the server which controls the licences and use of software.
- The monitoring software should ensure that it can only be installed on one server even if that server is part of a server farm.
- The software can be evaluated for a predetermined amount of time.
- An extension may be give on the trial of the software by the use of an extension code
Subscription License
- On both the Single and Floating licenses.
Even though the support from Xheo was excellent (Gary would respond to my emails in a matter of hours and this while I was still only trialling the software). I found that the level of documentation, particularly with regards to 'How-To' style documentation to be lacking.
There is little-or-no help of any kind on the web so I've decided to document, over the next few weeks, how to achieve the results that I need to achieve and hopefully they will be of help to others.
Hopefully, it will also be a way of me getting out of doing too much internal documentation as I will just be able to point future employees who have to work with DeployLX to my blog.
Monday, November 3, 2008
Don't you just love when something is simple?
Dot .Net Dilemmas.
Recently I had to change my hosting provider (more about that later) and one of the issues that it caused was with a web application that was created for an Irish business.
The dates that were displayed and used in various searches needed to be in the format "dd/MM/yyyy" but because my new provider was based in the US, the hosting server reports in Pacific time. All of my code fell over and the searches produced the "String was not recognized as a valid DateTime." error.
I honestly felt that I was going to have to change a lot of code and set the CultureInfo but then I posted the question on Stackoverflow and the answer was oh so simple.
In your web.config file add the element under the node (if you don't already have one) and add the correct culture. In our case "en-gb".
<system.web>
<globalization culture="en-gb">
<!-- ... -->
</system.web>
Recently I had to change my hosting provider (more about that later) and one of the issues that it caused was with a web application that was created for an Irish business.
The dates that were displayed and used in various searches needed to be in the format "dd/MM/yyyy" but because my new provider was based in the US, the hosting server reports in Pacific time. All of my code fell over and the searches produced the "String was not recognized as a valid DateTime." error.
I honestly felt that I was going to have to change a lot of code and set the CultureInfo but then I posted the question on Stackoverflow and the answer was oh so simple.
In your web.config file add the
<system.web>
<globalization culture="en-gb">
<!-- ... -->
</system.web>
Subscribe to:
Posts (Atom)