Windows CardSpace Logo announced

by Sander Gerz June 25, 2007 21:02

Microsoft has officially announced the logo for Information Card. The reason for having a logo is that it creates recognition. People will immediately see that a website support logon with an Information Card. This is what it looks like:

You can download the logo package here. Obviously, the logo comes in different sizes. I've already updated the login for my website, but I hope the little twist is ok with the guidelines. If you want to watch a webcast on Windows Cardspace, there's one on June 29th.

 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Creating a simple captcha

by Sander Gerz June 08, 2007 09:01

The new DevTips.NET website allows for people to comment on most content, unlike the old site. Obviously this opened up possibilities to add comment spam on all the places. There is a common technique to counter this, called CAPTCHA or “Completely Automated Public Turing test to tell Computers and Humans Apart”. There is also an easy ASP.NET control that you can implement on a website to implement this captcha from Miguel Jimenez. I use it on this blog. For some reason though, the captcha-image didn't display on the new site. Several options are available: figure out what's wrong, look for another control or... build one myself. Thinking that it shouldn't be too hard, and being a developer, I obviously chose the last option. So here goes:

First, we need an image to display. I chose to use an HttpHandler for this. Seemed like a good choice, since we only need to Response.Write an image, and store the generated code somewhere.

<%@ WebHandler Language="C#" Class="HipHandler" %>

 

using System;

using System.Web;

using System.Drawing;

using System.Drawing.Imaging;

using System.Drawing.Drawing2D;

using System.Drawing.Text;

 

public class HipHandler : IHttpHandler {

 

    public void ProcessRequest (HttpContext context) {

        context.Response.ContentType = "image/jpeg";

        SendImage(context);

    }

 

    public void SendImage(HttpContext context)

    {

        int fontSize = 24;               

        int width = 100;

        int height = 30;

 

        // Setup the rectangle to draw the text on

        RectangleF rectF = new RectangleF(0, 0, width, height);

        Bitmap pic = new Bitmap(width, height);

        Graphics g = Graphics.FromImage(pic);

        g.SmoothingMode = SmoothingMode.AntiAlias;               

        SolidBrush fgBrush = new SolidBrush(Color.RoyalBlue);

        SolidBrush bgBrush = new SolidBrush(Color.SkyBlue);

        g.FillRectangle(bgBrush, rectF);

 

        // Choose the font and style

        FontStyle style = FontStyle.Regular;       

        Font font = new Font("Arial", fontSize, style, GraphicsUnit.Pixel);

 

        // Make sure the text is centered

        StringFormat format = new StringFormat();

        format.Alignment = StringAlignment.Center;

 

        // Draw horizontal and vertical lines to make is less computer-readable

        Pen p = new Pen(new SolidBrush(Color.SteelBlue), 1);

        for (int i = 0; i < height; i=i+7)

        {

            g.DrawLine(p, 0, i, width, i);   

        }

 

        for (int i = 0; i < width; i=i+10)

        {

            g.DrawLine(p, i, 0, i, height);   

        }

 

        // Get 4 random characters, no weird ones

        string randomText = GenerateRandomText(4, false);

        System.Security.Cryptography.SHA256Managed hashAlg = new System.Security.Cryptography.SHA256Managed();

 

        // Hash the text so it can be verified after postback

        string hashText = HttpUtility.UrlEncode(hashAlg.ComputeHash(System.Text.Encoding.Default.GetBytes(randomText)));

        context.Response.AppendCookie(new HttpCookie("HipHash", hashText));

 

        // Write the text and send it to the browser

        g.DrawString(randomText, font, fgBrush, rectF, format);       

        pic.Save(context.Response.OutputStream, ImageFormat.Jpeg);       

    }

 

    public static string GenerateRandomText(int maxlength, bool ultraStrong)

    {

        char[] ultraChars = "!@#$%^&*~|=?{}[]qwertyuiopasdfghjklzxcvbnm1234567890!@#$%^&*~|=?{}[]".ToCharArray();

        char[] normalChars = "qwertyuiopasdfghjklzxcvbnm1234567890".ToCharArray();

 

        string password = string.Empty;

        for (int i = 0; i < maxlength; i++)

        {

            char n = ' ';

            if (ultraStrong) n = ultraChars[GetRandomNumber(ultraChars.Length - 1)];

            if (!ultraStrong) n = normalChars[GetRandomNumber(normalChars.Length - 1)];

            if (i % 2 == 0)

                password += n.ToString().ToUpper();

            else

                password += n;

        }

        return password;

    }

 

    public static int GetRandomNumber(int maxvalue)

    {

        System.Security.Cryptography.RandomNumberGenerator random =

            System.Security.Cryptography.RandomNumberGenerator.Create();

 

        byte[] r = new byte[1];

        random.GetBytes(r);

        double val = (double)r[0] / byte.MaxValue;

        int i = (int)Math.Round(val * maxvalue, 0);

        return i;

    }

 

    public bool IsReusable {

        get {

            return false;

        }

    }

}

I'm reusing a method to generate random texts. It was originally intended to create random passwords, hence the variable names in the implementation of the method GenerateRandomText(). The randomly chosen four characters are displayed in the image and also stored in a cookie. No, not directly of course. The text is hashed making it impossible to read before it's stored in the cookie. Other storages, like session or response headers are unavailable or unusable in an HttpHandler. Using a session to store a code is bad practice anyway.

The second part is a Web User Control that displays the image and asks the user to enter the displayed code.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControlHip.ascx.cs"

 Inherits="UserControlHip" %>

<img src="HipHandler.ashx" alt="HIP" />

Enter the code:

<asp:TextBox ID="TextBoxHip" Width="100" runat="server"></asp:TextBox>

<asp:Label ID="LabelCodeStatus" runat="server" Text=""></asp:Label>

Obviously you can modify the html of this user control to fit your needs and style. The code-behind is a bit more elaborate.

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

public partial class UserControlHip : System.Web.UI.UserControl

{

    private string m_controlToVerify;

 

    public string ControlToVerify

    {

        get { return m_controlToVerify; }

        set { m_controlToVerify = value; }

    }

 

    protected void Page_Load(object sender, EventArgs e)

    {

        if (IsPostBack)

        {

            // Verify the submitted code to the generated code

            System.Security.Cryptography.SHA256Managed hashAlg = new System.Security.Cryptography.SHA256Managed();           

            string hashText = HttpUtility.UrlEncode(hashAlg.ComputeHash(System.Text.Encoding.Default.GetBytes(TextBoxHip.Text)));

            string hashTextFromHeader =  Request.Cookies["HipHash"].Value;

            LabelCodeStatus.Text = "";

            if (hashTextFromHeader != hashText)

            {               

                // If the code is not correct, save the contents of the control to verify (usually

                // a comments-textbox) in a session so visitors don't loose their elaborate entry

                // After that, redirect to the same page

                TextBox textBoxControl = (TextBox)this.Parent.FindControl(m_controlToVerify);

                Session["HipControlToVerifyValue"] = textBoxControl != null ? textBoxControl.Text : "";               

                Response.Redirect(Request.Url.PathAndQuery);

            }

        }

        if (!IsPostBack)

        {

            TextBox textBoxControl = (TextBox)this.Parent.FindControl(m_controlToVerify);

            // If return from a redirect, meaning the code entered was incorrect,

            // fill the textbox with the session-stored entry.

            if (Session["HipControlToVerifyValue"] != null)

            {

                textBoxControl.Text = HttpUtility.HtmlEncode((string)Session["HipControlToVerifyValue"]);

                LabelCodeStatus.Text = "Wrong code";

            }

            Session["HipControlToVerifyValue"] = null;

        }

    }

}

The most important part of the control is to verify the code entered. Since this is stored in a cookie, we retrieve it first and then compare the hashed value of the code with the hashed value stored in the cookie. If the values match we do... nothing. Just let the rest of the page render and do any processing it may need to. However, if values do not match, there's a Response.Redirect to the same page, so rendering and processing of the page stops.

It's certainly a pain if you've just entered an elaborate comment somewhere only to make a typo when you enter the captcha-code, thereby redirecting and losing everything you wrote. So, to make it more friendly, the control has a property “ControlToVerify”. Perhaps the naming is incorrect, but this allows you to store the value of a control, before redirecting and setting the value of the control after the redirect. In this code, it has to be a textbox, but you can change it to anything you like of course.

After all this, you can put the control on any ASP.NET web page, like this:

<%@ Register Src="UserControlHip.ascx" TagName="UserControlHip" TagPrefix="uc1" %>

This Register directive is to be set at the top of the page. The following code is placed at the position you want people to enter the verification code.

<uc1:UserControlHip id="UserControlHip1" runat="server" ControlToVerify="TextBox1"></uc1:UserControlHip> 

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 

<asp:Button ID="Button1" runat="server" Text="Button" />

That's it. Please add error handling code as you see fit. The rendered image is pretty simple, and you've probably seen more elaborate ones. But I think it'll do the job. If you want to see what it looks like, check out an article, code snippet or news item on DevTips.NET.

You can download a sample project that implements all this here.

Currently rated 3.7 by 24 people

  • Currently 3.666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

.NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET | .NET

Memory problems when hosting ASP.NET on Windows 2003

by Sander Gerz April 26, 2007 07:43

Hoster Poster made me aware of an interesting KB article that describes the issue of failures when hosting ASP.NET on Windows 2003. Simple reading the title really makes you wonder:

“You may receive an error message, or the computer may stop responding, when you host Web applications that use ASP.NET on a computer that is running Windows Server 2003“

Say what? If I host ASP.NET on Windows Server 2003 I may receive an error or the machine may stop responding altogether? Okay, the article itself explains the conditions under which this may occur. But it doesn't make me happy (as we're doing ASP.NET hosting too).

Currently rated 1.5 by 4 people

  • Currently 1.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Trouble with threads and cultures

by Sander Gerz April 11, 2007 14:19

Here's something that bit me today. A few days ago, a Windows Service I built was redeployed to another machine. Most operations went on just fine, but some didn't. And as always: 'it worked on my machine'. As it had also worked in testing and on the previous production server. After some digging, we found that the regional settings for the service account on this machine were not what they were on the other servers. Yes, I know, don't depend on regional settings, but there was some legacy code (hah..it's not my fault) and it had never created issues before.

So, easy enough, we set the thread for the service to the required culture, like so:

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("nl-NL");

Unfortunately, it didn't have the desired effect. Nothing changed. As it turns out, you have to set the culture on every thread running. See the sample below:

using System;

using System.Globalization;

using System.Threading;

 

namespace RegionalTime

{

    class ClassDemo

    {

        public static void TimeNow()

        {

            Console.WriteLine("Date setting: {0} ({1})",

                DateTime.Now.ToLongDateString(),

                Thread.CurrentThread.CurrentCulture.DisplayName);

        }

 

        public delegate void TimeNowDelegate();

 

        [STAThread]

        static void Main(string[] args)

        {

            // Look at current regional settings

            TimeNow();

 

            // Switch to French

            Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

            TimeNow();

 

            // Switch to US

            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

            TimeNow();

 

            // Now through a delegate on a different thread.

            TimeNowDelegate methodDelegate = new TimeNowDelegate(TimeNow);

 

            IAsyncResult result = methodDelegate.BeginInvoke(null, null);

 

            while (!result.IsCompleted)

            {

                Thread.Sleep(500);

            }

 

        }

    }

}

As you will see, from running this code, the call through the delegate uses the regional settings from the active user.

Date setting: woensdag 11 april 2007 (Dutch (Netherlands))
Date setting: mercredi 11 avril 2007 (French (France))
Date setting: Wednesday, April 11, 2007 (English (United States))
Date setting: woensdag 11 april 2007 (Dutch (Netherlands))
Press any key to continue . . .

There seems to be no way to specify one culture for the entire AppDomain (note: I'm not talking about ASP.NET here, this was a multithreaded Windows Service). If any thinks or better yet, knows, that this is possible, let me know. I am always eager to learn.

 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

.NET

DevTips.NET renewed

by Sander Gerz April 10, 2007 09:23

It's taken quite some time, but I've finally put the new DevTips.NET website online. The old site was really... old. The codebase was from 2001 when I learned to code in C# myself. You can imagine it didn't incorporate best practices, since there were few practices to begin with.

So a rewrite was quite necessary. Now, I could have used DotNetNuke, or CommunityServer or any other project to base the new site on but where the fun in that ;-)

The entire code was written by me, but I did use TechTalk's Genome (sorry, Frans) as the O/R mapper which saved me a lot of time.

One of the decisions I made was to remove the forum. For one, the forum was not very active and this would prove dissappointing for people asking questions. Secondly, there are a number of Dutch forums already available (like the ones on www.dotned.nl, www.sdn.nl, and www.vbcentral.nl). Improvements have been made to the layout (most obvious), the commenting and rating system. Also, it's easier to edit content and publish news stories with more body than previously.

If you would like to add content to the site, e.g. news, codesnippets, articles or otherwise, please register an account. You can add and manage codesnippets immediately. If you want to publish news or articles, drop me a line.

If you spot any errors, please let me know.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Congratulations! We are pleased to present you with the 2007 Microsoft® MVP Award!

by Sander Gerz April 01, 2007 10:46

This just in: “The Microsoft MVP Award is our way of saying thank you and to honor and support the significant contributions you make to communities worldwide. As a recipient of Microsoft’s Most Valuable Professional award, you join an elite group of technical community leaders from around the world who foster the free and objective exchange of knowledge by actively sharing your real world expertise with users and Microsoft.  Microsoft salutes all MVPs for promoting the spirit of community and enhancing people’s lives and the industry’s success everyday.  To learn more about the MVP Program, visit: www.microsoft.com/mvp.”

What can I say? I've been active in the community this past year (mmm... not so much on this blog, I have to work on that), so I was hoping to get my MVP status renewed, but you never know for sure until you get this e-mail. I think it's also an encouragement to continue my efforts.

In fact, at this very moment I'm planning the sessions for our first Dutch .NET CodeCamp: http://www.code-camp.nl/. A joint effort of SDN, VBCentral and DotNed. It looks like we've got more session proposals (25) than we can accomodate (+/- 20), so it's going to be a packed day. If you haven't signed up, please hurry, because there's a limit of 120 attendees. Given that the event won't draw hundreds of people means you can more easily interact with your peers, and with the speakers. Subjects will range from: WPF, LINQ, XNA, WF, and many other MLA's (multi-letter-acronyms). However, it will not all be about great “new stuff”. We'll also cover topics that address issues we're having today. How about: COM Interop, ASP.NET Ajax, Designing Windows Controls. I'll do a session (if I can fit it in) on Visual C# 2005 tips and tricks. Although upon request, we dive into the new 'Orcas' release as well.

Anyway, I'm grateful to be nominated MVP again and hope to see you on May 12th.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Omg, I'm also tagged

by Sander Gerz January 05, 2007 15:37

So yes, I tried to escape but resistance is futile. André Obelink was kind enough to tag me, and therefore, it seems I need to divulge some trivia you may not know from me.

1. I learned computing around the age of 13 or 14. It was an Easter holiday and my parents decided I should go to 'computer camp'. Here I learned basic on a true and original Philips P2000. You can imagine my discomfort when my parents subsequently decided to buy a Commodore 64. A device I knew nothing about. Well, that didn't take long. With Latin classes at school, I was kinda showing off my skills by programming Dutch-Latin translation on the C64's that were on display at the nearby V&D. Well, local. Breda that is, since I grew up in Rijen.

2. My ambition was to be an astrophysicist. But then I discovered I sucked at chemistry and physics, so that was a nogo.

3. To finish my studies in public administration (and now for something completely different) I wrote my thesis on a comparative study between drugs policy in Rotterdam and Northern France. Mid nineties there was quite some publicity around the obvious differences, with France being more repressive and the Netherlands being ehmm 'pragmatic'. My findings can be found in this book.

4. In 1996 I went to Star Trek convention in... Italy. Well, just thought it would be fun even though I didn't speak much Italian. Obviously I knew at least one person to get me invited. Had a great time. I've been a Star Trek fan ever since the original series. You won't see me in a costume though, I like the series and science fiction in general, but I'm not crazy ;-) 

5. I met my wife Anja through my sister after visiting her, my sister that is, in India. Anja also went for a visit and brought back the sneakers I forgot. We got married in 2000 and have two kids now: Steven (5) and Michelle (3). You can check their stories at www.sanderenanja.com.

And now it's my turn to tag these: Peter van Ooijen, Emad Ibrahim , Egbert Nierop, Stefan Stranger, Nix


 Blog-Tag: A game for Virtual Party

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Windows CardSpace gets, no, already had, Firefox support

by Sander Gerz December 14, 2006 15:50

When Mary Jo Foley writes that Firefox will get support for Windows Cardspace, a number of bloggers will pick up on that (see also here  and here).

Although choice is never a bad thing, there was a Firefox extension doing that already. The new one wraps the native CardSpace implementation on Windows so you can use it from Firefox as oposed to the one at xmldap.org that uses Java behind the scenes.

This has advantages and disadvantages. Anyone interested in this thread?

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Vista available on MSDN and Visual Studio 2005 issues

by Sander Gerz November 17, 2006 08:10

It's out that Windows Vista has been made available for download for MSDN subscribers. For developers that are running Visual Studio 2005 on Vista, Microsoft has created a page listing all known issues:  http://msdn2.microsoft.com/en-us/vstudio/aa948853.aspx

This one caught my attention:

Title: Exception thrown when accessing FTP URL's

  • Description: When a user attempts to access a FTP URL Visual Studio calls getInputStream() and getContent() of URLConnection which results in it throwing java.io.IOException "The operation has timed out".
  • Work Around: None

 Notice the exception? Seems Microsoft is using Java without anyone finding out before. Now, who you're gonna blame? ;-)

 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Wiki dedicated to Windows Workflow Foundation

by Sander Gerz November 15, 2006 13:43

Fellow MVP Maurice de Beijer recently launched a Wiki-based website on Windows Workflow Foundation (WF). Although I sometimes find wikis difficult to navigate, Maurice has managed to publish a significant amount of information. Here's a short list:

A wiki is all about joint content sharing, so if you've found some good resources on WF or are currently involved in a WF project, please share!

 

 

Currently rated 4.5 by 2 people

  • Currently 4.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Powered by BlogEngine.NET 1.4.5.0
Theme by Mads Kristensen | Modified by Mooglegiant