Archive

Archive for the ‘Uncategorized’ Category

Syncing Outlook 2010 and Google Calendar

I use Outlook 2010 at work and Google Calendar at home and on my phone and found after upgrading from Outlook 2007 that the sync tool that Google have only works with Outlook 2003/2007.  I decided to write my own Outlook 2010 VSTO add-in which will sync my entries every hour for the past couple month and three months in the future.

I have uploaded the inital code to github and you can find more details and get the source here http://github.com/MrKevHunter/Outlook2010GoogleCalendarSync

The add in allows you to specify your account details and the number of months of historical and future appointments to sync. When the add in loads for the first time you will be prompted by a settings box



After entering your details and clicking Save your details we be kept in the user.info file with the password encrypted. The add in will then sync your Calendar’s every time you login. I have plans to make it much less garish when I get chance.

You can make the application sync at any time by pressing the sync icon, and change the settings by clicking the settings icon

The code is pretty rough at the moment without enough error handling or unit tests, but that will change when I get time. My testing has found the synchronisation to work okay so far but there is no real logic on matching moved entries (yet), but as we know version 1 sucks anyway

Please don’t hold me responsible if it deletes all your entries, creates crazy new appointments or wipes your hard disk and if you find it useful let me know. Features and problems can be logged on github or in the comments here. I plan to write a bit more about how I wrote it and some of the technologies used (StructureMap, MSpec) when I get chance.

Advertisements

The belated new year post

February 15, 2010 Leave a comment

It’s time to try and get my blogging back on track, after a reasonably strong start ( I thought) it’s certainly tapered off in the last couple of months so lets start now by setting some late new years resolutions.

so here we go…

  1. Blog more, realistically I don’t have as much time as I would like to keep this blog up to date, but I aim to make a post at least once a month.
  2. Learn a scripting language, I think its time to learn powershell, although the syntax frankly looks completely mental although I thought that about regex…
  3. Contribute – I have started an open source project ubersprogen which I am regretting giving such a stupid name but it’s letting me learn much more new stuff, more about it in a later post.
  4. Read some technical books cover to cover. For too long i have been dipping  into books rather than reading them all. This one may be tough
  5. Get more comfortable with WPF. From what I have seen so far I like although the curve is steep

I think that should be enough to keep me busy, although if i think of any more I will add them.

As a .Net developer what else should I be learning?

Creating Fake Credit Card Numbers in c#

August 16, 2009 4 comments

I recently had to create a credit card number generator, nothing nefarious, just we needed unique valid credit card numbers after asking on StackOverflow and getting a less than stellar response (for the first time). I came across something on DarkCoding.Net which did exactly what I wanted but was in Java, I’ve ported it over to c# and I hope you find it useful

Update

I recently rewrote this code. removing a couple of bugs and making it a bit more c# and bit less Java

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace CreditCardNumberGenerator
{
	public class RandomCreditCardNumberGenerator
	{
		/*This is a port of the port of of the Javascript credit card number generator now in C#
		* by Kev Hunter https://kevhunter.wordpress.com
		* See the license below. Obviously, this is not a Javascript credit card number
		 generator. However, The following class is a port of a Javascript credit card
		 number generator.
		 @author robweber
		 Javascript credit card number generator Copyright (C) 2006 Graham King
		 graham@darkcoding.net
		 This program is free software; you can redistribute it and/or modify it
		 under the terms of the GNU General Public License as published by the
		 Free Software Foundation; either version 2 of the License, or (at your
		 option) any later version.
		 This program is distributed in the hope that it will be useful, but
		 WITHOUT ANY WARRANTY; without even the implied warranty of
		 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
		 Public License for more details.

		 You should have received a copy of the GNU General Public License along
		 with this program; if not, write to the Free Software Foundation, Inc.,
		 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
		 www.darkcoding.net
		*/


		public static string[] AMEX_PREFIX_LIST = new[] {"34", "37"};


		public static string[] DINERS_PREFIX_LIST = new[]
		                                            	{
		                                            		"300",
		                                            		"301", "302", "303", "36", "38"
		                                            	};


		public static string[] DISCOVER_PREFIX_LIST = new[] {"6011"};


		public static string[] ENROUTE_PREFIX_LIST = new[]
		                                             	{
		                                             		"2014",
		                                             		"2149"
		                                             	};


		public static string[] JCB_15_PREFIX_LIST = new[]
		                                            	{
		                                            		"2100",
		                                            		"1800"
		                                            	};


		public static string[] JCB_16_PREFIX_LIST = new[]
		                                            	{
		                                            		"3088",
		                                            		"3096", "3112", "3158", "3337", "3528"
		                                            	};


		public static string[] MASTERCARD_PREFIX_LIST = new[]
		                                                	{
		                                                		"51",
		                                                		"52", "53", "54", "55"
		                                                	};


		public static string[] VISA_PREFIX_LIST = new[]
		                                          	{
		                                          		"4539",
		                                          		"4556", "4916", "4532", "4929", "40240071", "4485", "4716", "4"
		                                          	};


		public static string[] VOYAGER_PREFIX_LIST = new[] {"8699"};

		/*
      'prefix' is the start of the 	CC number as a string, any number
		private of digits	'length' is the length of the CC number to generate.
	 * Typically 13 or	16
		*/
		private static string CreateFakeCreditCardNumber(string prefix, int length)
		{
			string ccnumber = prefix;

			while (ccnumber.Length < (length - 1))
			{
				double rnd = (new Random().NextDouble()*1.0f - 0f);

				ccnumber += Math.Floor(rnd*10);

				//sleep so we get a different seed

				Thread.Sleep(20);
			}


			// reverse number and convert to int
         var reversedCCnumberstring = ccnumber.ToCharArray().Reverse();

			var reversedCCnumberList = reversedCCnumberstring.Select(c => Convert.ToInt32(c.ToString()));

			// calculate sum

			int sum = 0;
			int pos = 0;
			int[] reversedCCnumber = reversedCCnumberList.ToArray();

			while (pos < length - 1)
			{
				int odd = reversedCCnumber[pos]*2;

				if (odd > 9)
					odd -= 9;

				sum += odd;

				if (pos != (length - 2))
					sum += reversedCCnumber[pos + 1];

				pos += 2;
			}

			// calculate check digit
			int checkdigit =
				Convert.ToInt32((Math.Floor((decimal) sum/10) + 1)*10 - sum)%10;

			ccnumber += checkdigit;

			return ccnumber;
		}


		public static IEnumerable<string> GetCreditCardNumbers(string[] prefixList, int length,
		                                          int howMany)
		{
			var result = new Stack<string>();

			for (int i = 0; i < howMany; i++)
			{
				int randomPrefix = new Random().Next(0, prefixList.Length - 1);
	
				if(randomPrefix>1)
				{
					randomPrefix--;
				}

				string ccnumber = prefixList[randomPrefix];

				result.Push(CreateFakeCreditCardNumber(ccnumber, length));
			}

			return result;
		}


		public static IEnumerable<string> GenerateMasterCardNumbers(int howMany)
		{
			return GetCreditCardNumbers(MASTERCARD_PREFIX_LIST, 16, howMany);
		}


		public static string GenerateMasterCardNumber()
		{
			return GetCreditCardNumbers(MASTERCARD_PREFIX_LIST, 16, 1).First();
		}

		public static bool IsValidCreditCardNumber(string creditCardNumber)
		{
			try
			{
				var reversedNumber = creditCardNumber.ToCharArray().Reverse();
				
				int mod10Count = 0;
				for (int i = 0; i < reversedNumber.Count(); i++)
				{
					int augend = Convert.ToInt32(reversedNumber.ElementAt(i).ToString());

					if (((i + 1)%2) == 0)
					{
						string productstring = (augend*2).ToString();
						augend = 0;
						for (int j = 0; j < productstring.Length; j++)
						{
							augend += Convert.ToInt32(productstring.ElementAt(j).ToString());
						}
					}
					mod10Count += augend;
				}

				if ((mod10Count%10) == 0)
				{
					return true;
				}
			}
			catch
			{
				return false;
			}
			return false;
		}
	}
}
Categories: Uncategorized