New in C# 7.0: Part 2 – Ref Locals

After about a year, I’m finally trying to start writing some more blog posts, so I’ll pick up right where I left off. Today, I’m going to give a brief overview of Ref Locals.

Ref Locals allow you to create an alias for a variable so that you are not creating another copy of the data or reference (in the case of an object), in memory. In previous versions of C#, if you wanted to refer to a local variable with a different name, you’d have to do this:

This unfortunately creates another copy of the variable, so changes to the original are not reflected in the copy. With Ref Locals, you can ensure changes are reflected in both places:

This is particularly helpful when dealing with arrays of items.

The changes will be reflected in the array itself, instead of just in the copy version of the variable.

That’s it for today. Next week is Ref Returns.

New in C# 7.0: Part 1 – Out Variables

This is the first post in a series on the new features available in Visual Studio 2017 and C# 7.0. Today, I’m going to be talking about Out Variables.

One of the great new features is probably something you will use frequently, which is defining an out variable, and using that variable in the same statement. Currently, to use an out variable, one must do something like this:

With simple syntactic sugar in the new version, you can instead do this:

That’s pretty much it. This is definitely a small, but useful little addition to the C# language.

Next time, I’ll be going over Ref Returns and Ref Locals.

Hello, Ruby!

As part of my professional development plans for the year, I’m learning the Ruby language and the Ruby on Rails framework. Now, I’m just getting started so I’m a complete newbie, but here’s the first program that we all write when we’re learning a language: Hello, world!

I’m using the “irb” REPL command instead of actually saving source file(s) at this point. Here’s how I started:

Output: Hello, world!

Basic, right? Now, let’s take some user input, and say hello to an entered name.

Input: Russell
Output: Hello, Russell!

If you just use gets, you will also receive the newline character on the input. The chomp function removes this character.

That’s all for now. I’ll be creating more posts as I continue learning Ruby.

Alarm Updates

I was going to shut down the Alarm Update service today (after originally saying it would be taken offline back in April), and I realized that it hasn’t actually been working properly since I migrated my websites to Azure. So, I’ll give all the 3.5.18 and earlier users until August 18, 2016 to update, and then I’m definitely shutting it off. So, update to 3.5.19!

Alarm 3.5.19 Released

Today, I officially released Alarm 3.5.19. You can get it on the “Things I Work On” page, or just Check for Updates in the application. This is the first official release of Alarm since July 2011, so there is a huge amount of changes (even though it is a minor revision).

This version contains several performance enhancements and large rewrites of core areas of the application. It also updates the Update Checker to the new RWC API. It is targeted against .NET 3.5 and also removes support for Windows XP.

Please Note: All previous versions will no longer be supported as of April 10, 2016, so it’ll be a good idea for you to upgrade as soon as you can. After that date passes, the update check in the software will no longer function, and you will have to upgrade manually.

SimpleLookups 2.0 Released

Today, I released SimpleLookups v2.0. This version includes the following changes:

New Features:
– Lookup Caching (Enabled by Default)
– Core improvements/optimizations.
– Support for .NET 4.5.1, 4.5.2, and 4.6.

Removed Features:
– Support .NET 2.0 and 3.0.

Version 2.0 is now available on NuGet and on this site. Please install using Visual Studio, if possible. This way, your download counts!

A few links for the lazy:
Getting Started with SimpleLookups

Download SimpleLookups 2.0 | NuGet
View Complete SimpleLookups API Documentation

SimpleLookups 2.0 Beta 1

Today, I’m releasing the first beta of SimpleLookups v2.0. This version includes the following changes:

New Features:
– Lookup Caching
– Core improvements/optimizations.
– Support for .NET 4.5.1, 4.5.2, and 4.6.

Removed Features:
– The final version will not support .NET 2.0 and 3.0.

Caching is enabled by default. You can turn it off by adding the following attribute to the node in your web.config: enableCaching=”false”. Or, if you use the SimpleLookups.Initialize() method, there’s now a set of overloads that deal with caching.

Version 2.0b1 can be downloaded here.

If you run into any issues at all, please email and I’ll take a look at the issue.

I have a few cleanup tasks to do over the next week or two, so expect the final version to be ready around August 16th. Source will also be released at that time.

WCF: Logging All SOAP Messages

Do you want to know what is actually in that SOAP message that your Windows Communication Foundation service is sending? Well, look no further. It’s actually quite simple to output the XML that is being created.

First, there are a couple classes that need to be added to your service project (or a separate project). The first of these is perhaps the most important, which is the message inspector that is used to do the actual logging, etc.

Next, we’ll create a behavior that uses this inspector.

Now we’ll create a Behavior Extension that uses the behavior we created.

Finally, we have to set up the behavior extension in the web.config so that the service uses it.

1. Assuming that there is already an element in the <system.serviceModel><services>, change the appropriate element to have a behaviorConfiguration=”LoggingBehavior”.

2. Still under <system.serviceModel>, add an element under <behaviorExtensions> with the name “loggingBehavior” and the type pointing to the full namespace of our LoggingBehaviorExtensionElement.

3. Again, still under <system.serviceModel>, add a element under <behaviors>/<endpointBehaviors> with the name “LoggingBehavior” and an element within it called “loggingBehavior”.

Here’s the full XML that we’re adding to the web.config:

That’s all there is to it. You can add code to log using your favorite logger within the LoggingMessageInspector methods. Feel free to comment if you have any questions or improvements.

Supporting iPhone 6/6 Plus Native Resolutions: The Basics

Ever since I got the new iPhone 6, I’ve been silently cursing the applications that haven’t yet properly updated their apps for the new screen sizes. The zoomed iPhone 5s display looks really terrible, folks! So, I’m going to give you a five minute tutorial to update your applications. Assuming, of course, that you updated your app last year for iOS 7. I’m also assuming that you have a reasonable understanding of how to navigate Xcode, so this post is a bit light on screenshots.

Step 0: Upgrade to Xcode 6.
I’ll wait. This doesn’t count as part of the five minutes.

Step 1: Add a Launch Screen File in Project Settings

This one is actually pretty easy. Click on your project on the left of Xcode, and select the proper project under “TARGETS”. It’ll probably be auto-selected. Go to the General tab (again, probably already selected) and scroll down to the “App Icons and Launch Images” section. For the Launch Screen File, select your storyboard file. Easy.

Set up Launch Screen File.

Set up Launch Screen File.

Step 2: Update all of your constraints

Alright, so this will take a bit longer. Basically, add constraints to your layouts so that it can stretch and still keep your controls where you want them. Set up constraints for the items on the left based on the left layout bound, and do the same for the items on the right based on the right layout bound. Auto-layout is your friend here. Pay attention to any red or yellow warning indicators that appear in your Document Outline, and fix them/add other constraints where necessary. One of the things that you’ll notice here is that in Xcode 6, the default left/right bounds are to “Margin”. This is something that was introduced in iOS 8, so if you’re still supporting iOS 7, as you should be, this will mess up your layout on those devices. The easiest way to avoid using margins in your constraints is to press the Option key, which changes “Leading Edge to Container Margin” to “Leading Edge to Container”, which was the default behavior in previous versions.

Constraint setup with Container Margins.

Constraint setup with Container Margins.

Constraint setup after pressing Option key.

Constraints setup after pressing Option key.

Step 2.1: A “Gotcha” on Table Views

Sometimes, you just can’t get the table view to start at the top of it’s container. Assuming that you have created your layout correctly, and set the TableView’s top to the Top Layout Guide, it’s because there’s an “Inset” set up. Click on the View Controller in the Document Outline, and uncheck “Adjust Scroll View Insets”.

TableView insets.

TableView insets.

Step 3: Add some new image assets

The iPhone 6 Plus’s display requires @3x image assets. If you want to truly support that device, you need to add @3x versions of your images and icons. @2x images will still work, but they’re obviously scaled up to the @3x size, which can look bad depending on the image.

Application icons.

Application icons.

That’s all. You’re kind of ready for the new iPhones!

iOS 8: Notifications Changes

We’re updating our iOS application at work, and I came across some fun with iOS 8 and notifications. So, I thought I’d write a short post about it.

In iOS 7, we used the following method on the shared UIApplication instance to set up notifications:

In iOS 8, this doesn’t work. So now, it’s a multi-step process:

First, we get an instance of the shared UIApplication (this is obviously optional, but I think it makes the code easier to read). Then, we create a UIUserNotificationSettings instance that specifies which notifications we want. After that, we register for user notifications, and finally, register for remote notifications.

The new method, registerForRemoteNotifications:, sends the same messages as the registerForRemoteNotificationTypes: method. These are application:didRegisterForRemoteNotificationsWithDeviceToken: for a successful registration, and application:didFailToRegisterForRemoteNotificationsWithError: for an error.

Well, what if you want to support both iOS 7 and iOS 8? It’s simple. See if the UIApplication instance responds to the new selector. Here’s the complete code:

Let me know if you have any questions or if there’s a better way to do this in the comments.

EDIT: I originally messed up the if statement in the complete code above. I used registerUserNotificationSettings instead of registerUserNotificationSettings: which caused the statement to be false, even on iOS 8.