Although I tend to prefer Microsoft .NET for my programming projects, I've used a large number of programming languages throughout the years. Last weekend I did a minor project in PHP for a change.
It involves helping users to configure their mail clients pretty much automatically. Outlook combined with Exchange does this really nicely, but that functionality is not limited to Exchange. Or Outlook, for that matter. I've run my own Linux based mail server at home for years, and this little project makes things a little bit easier for users of that mail server.
If you're at all interested in this sort of stuff, check out the project on GitHub.
PS: yes, this is the first article in a long time. I've started several, but decided against them halfway through. I always write about fairly niche things, but sometimes it turns out to be a bit too niche :)
Now, I could have done all this stuff in .NET of course. I personally have ASP.NET running even on my Linux box. Since this was such a tiny project and would usually run on a Linux based mail server rather than a dedicated web server, I figured that using .NET Core or Mono would make it a bit too niche again. Besides, using PHP every now and them makes me appreciate .NET all the more.
There are many isolation frameworks around that make writing unit tests relatively simple. It's highly unlikely that any single framework will meet all your needs, so writing your own utilities can be useful in order to make your tests easier to write and – perhaps more importantly – read.
I regularly find myself wanting to verify that a certain dependency is called in the right way by my system under test. This includes passed argument values, which can be complex objects themselves.
More...
Yesterday I ran into an interesting (and dangerous) little detail about the C# compiler regarding virtual (field-like) events; they do not behave as you might expect. Consider this code, which I've simplified from a real world example of some refactoring gone wrong:
public abstract class MyClassBase
{
public virtual event EventHandler<EventArgs> MyEvent;
public void DoStuff()
{
if (MyEvent != null)
{
MyEvent(this, EventArgs.Empty);
}
}
}
public class MyClassDerived : MyClassBase
{
public override event EventHandler<EventArgs> MyEvent;
}
To my surprise, when one subscribes to MyEvent, it will never be called:
More...
Last December I created a small utility to reduce the size of XAP files for modular Silverlight applications. It served my purpose at the time, but more recently I've been using the tool in the context of a new application, which revealed a problem related to localization. In some cases the application could crash because of satellite assemblies that are embedded into the XAP files.
The new version takes satellite assemblies into consideration: they are removed whenever the main assemblies is also removed. There are a small number of other issues that were fixed, like an incorrectly described command line parameter.
More...
Even though Silverlight has fallen out of grace with the powers that be, there are still some companies using it today for entertainment or line of business applications. Particularly for that last category, modularity can be a powerful tool in creating a flexible solution.
Over the past few years, I've worked with modular Silverlight applications based on Microsoft Prism. Every module is it's own XAP file, which is loaded on demand by the framework. Over the years, people have also rolled their own lightweight modular applications, also making use of XAP files. This article is about a specific problem with building these types of applications: optimization of the total application download size.
More...
Note: This article was edited after a Gonçalo Lopes presented me with a better solution. Thanks!
Every now and then you run into a situation where you wish your programming language of choice was just a tad more flexible than it actually is.
For example, constructors in C# always have to directly call one of the base type constructors as the first thing they do (or do they? keep reading).
Yesterday I ran into a situation where I would like my derived class to always use the same implementation* for a certain injectable dependency. No problem:
public class FooBase
{
public FooBase(IDependency dependency) { /* stuff here */ }
}
public class MyFoo : FooBase
{
public MyFoo() : base(new MyDependency()) { }
}
The dependency is created on the fly and my base class constructor is happy. However, my derived class also needed to make use of this dependency and my base class does not expose any property or field for me to access it. So before calling the base constructor, I would have liked to store a reference to this newly created MyDependency object.
More...
The evolution of spam
Many blog owners will be familiar with one particular pest on the internet: spam bots. This blog is no exception, but I was determined to keep my pages clear of digital graffiti even when I don't have much time to post regularly.
Fortunately there are some nice and unobtrusive countermeasures available, like Akismet. They work pretty much like the spam detection for your email. For some time, this used to be enough to keep the spam bots at bay, but spammers are constantly changing their angle of attack. Many comments that are posted nowadays don't even contain any links anymore. With some luck, they can even pass for a comment from an interested reader. I'm not completely sure how exactly this helps the spammer, but no doubt they are trying to raise the reputation level of the IP address or email used to post the comment with, so t
hey are more likely to pass through filters like Akismet later. In any case, spam filters are not as effective against these messages as they are against something containing one or more actual links.
More...
Every now and then, you run into a piece of code that makes you wonder how it ever got into existence. I personally have a bit of a fascination for these things. I read TheDailyWTF regularly for amusement, but I always try to understand what caused these usually inventive but nevertheless misguided pieces of work. When I run into something within my own circle, understanding may also help me prevent problems in the future.
More...
Earlier today, I blogged about a reusable behavior extension to make debugging Silverlight apps a little easier. I wrote most of that article months ago and in the meantime I've added a second behavior extension to support Silverlight software development. I included it with the download, but some explanation about its purpose might be in order.
More...
If you're used to debugging ASP.NET web applications together with WCF services, you will know that Visual Studio automatically attaches the debugger to the service process in addition to the website. When you It doesn't do this for services being called from Silverlight. Instead, Visual Studio will probably warn you that the service call will fail, but we've taken care of that problem with the behavior extension from the previous post.
The solution is fairly obvious: you will have to make sure that the debugger is attached to both your web application and your service.
More...