SharePoint and more

Just a quick follow-up on Saturday’s adventures with SharePoint: On Sunday morning, after letting my VM chug through 100+ Windows updates, and increasing the amount of RAM allocated to it from 1 GB to 2 GB, I eventually found myself with a barely-operational SharePoint install.

But I decided I didn’t want to spend the whole day staring at my laptop, alone in my apartment, so I turned it off and hopped on the train into New York, and spent some time at the Metropolitan Museum. Overall, I think that was a better use of my time than banging away at my SharePoint VM all day.

I spent some time this morning reading various blog posts about SharePoint development environments, and I’ve come to the conclusion that I’ll never be able to get a useful one up and running on my current hardware. With only 4 GB of RAM on my ThinkPad, there’s no way I can allocate enough to the VM. Most of the advice I’ve seen recommends 8 GB minimum for the VM, so I’d really need a laptop with at least 12 GB of actual RAM. (And some blogs indicate that 24 GB is really the reasonable minimum for SharePoint development.)

I’ve also looked at a few options for running a VM in the cloud. The one no-cost option is to sign up for a free Azure trial, and set up a VM in Azure. That might be interesting, but I don’t think the trial would be long enough to be really useful.

So I think I’m going to have to give up on the idea of setting up a SharePoint environment on my own, and wait for my new project at work to firm up a bit more. At that point, I’ll know enough about exactly what I need to do that I can make specific requests related to a specific project, and hopefully get the software/hardware I need to get up and running. Until then, I’m just going to have to settle for reading books and using my imagination!

SharePoint development

My boss told me this week that I may need to do some SharePoint development work for my next project. I don’t have any details on what exactly I might need to do, but I think it’s likely to be creating a Web Part that will interface with Dynamics AX in some way, probably through a web service. I’m well-versed at this point on the Dynamics AX side of things, but I know almost nothing about SharePoint development. So, being the proactive kind of guy that I am, I’m starting to flounder around, trying to figure out what I can about SharePoint development.

It’s not easy to get started. At work, I asked one of the other developers for some pointers, since she’s done some SharePoint work before, but since I don’t really have any details about what I’m supposed to be doing, she wasn’t much help. I don’t want to waste her time, so I’m going to hold off on asking her any more questions until I have a better idea of what I need. And, on the IT end, I had one of the SharePoint admins set up a site that I can apparently use for testing, once I’m at the point where I actually have something to deploy. But there’s not much I can do with it right now.

I have Visual Studio 2012 installed on my AX VM, so I went ahead and installed the SharePoint tools on that VM. That worked, and I now have the templates needed to create a new SharePoint web part project in VS. But, it seems that you can’t actually create a SharePoint web part project on a machine that doesn’t have SharePoint itself installed on it. Looking into it a bit further, it seems like it might be possible to do so, but it’s not obvious or simple. And that’s about as far as I got in work on Friday.

Today, I decided to see how far I could get in setting up a full SharePoint 2013 VM on my ThinkPad. I’m using VirtualBox on the ThinkPad, and I have plenty of hard drive space, so I decided to give it a go. I loosely followed the instructions in this blog post by Bill Baer, though I simplified things as much as I could. I downloaded the 180-day trial of Windows Server 2012 as a VHD. Then, I got that up and running in VirtualBox. I had to mess around with the settings a bit to get it to work, but it seems to work fine under VirtualBox, once you get the settings right. Then, I downloaded the 180-day trial of SharePoint 2013 and installed that. I hit a few snags, but nothing that I couldn’t get past with a little Google-fu. All of that downloading and installing killed most of the day. Now, the sun is about ready to go down, and I’ve got a VM that probably has a working SharePoint 2013 install on it. I say “probably” because I haven’t been about to bring it up in a browser yet. I think that’s just because the VM is running slow, and it’s taking a while to get past all the background stuff that needs to happen on a new Windows Server 2012 and SharePoint 2013 install. So, for now, I’m patiently letting it chop away at 100% CPU, hoping that eventually, it’ll settle down and become usable. There may be a few more things to straighten out though. If so, I guess I’ll be spelunking through some log files and doing some more Google-fu.

Once I’m sure I’ve got a working SharePoint 2013 install, then I’m going to have to install Visual Studio 2013. I’m hoping I can just use the free version of VS 2013, but I’m not sure. If I can’t, then I guess I have to check and see if there’s an eval version of VS 2013 Pro, or whichever version I need for SharePoint dev.

I’m not sure if the end result of all this is going to be a usable VM. The ThinkPad is a few years old. Though I did replace the hard drive with an SSD recently, it’s still only got 4 GB of RAM, and a mediocre CPU. That’s all fine for doing normal work, but it’s a little thin for powering a VM that’s got a full SharePoint install on it. So I may have to give up on this thing entirely.

I found a good blog post on how to set up an “awesome VM” for SharePoint development, but it looks like I’d need a much more powerful laptop to follow those instructions, and probably a lot more free time too. So, if the fairly basic VM that I’m trying to set up now doesn’t work out, I’ll probably give up on it for now.

Meanwhile, I’ve started reading Beginning SharePoint 2013 Development, via my company’s Books24x7 subscription. (And I ordered a used copy of the physical book from Amazon.) I haven’t gotten much useful information out of the book yet, but I haven’t gotten very far into it yet.

I went into this process knowing that I might hit some dead-ends, and knowing that I might not be able to get very far on my own. But I’m hoping that I’ll at least get far enough that I can ask the right questions when I start getting project details from my boss. I’m not sure if I’ll need to set up a new VM on my work PC with the full SharePoint install, or if I’ll be able to hook up my existing AX VM to the test SharePoint site that the admin guy set up for me. Or if I’m even going to need to do any of that at all. But, either way, I’m hoping to learn some new skills, and add “SharePoint developer” to the old resume!

The Humble Programmer

I ran across a reference to E. W. Dijkstra’s 1972 essay “The Humble Programmer” recently. I’d never read it before, but I like to think I already understood the concept. Any sort of serious programming job is going to reinforce a programmer’s humility on a fairly regular basis, unless the programmer in question is incredibly good, or incredibly deluded.

The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague.

At my current job, for the ERP system I work on, we do production deployments once a week, usually. We may do a post-deployment fix or supplemental deployment occasionally, but usually only if a really show-stopping bug made it in. (The deployment process is apparently time-consuming and arcane. I don’t really know how it’s done, exactly, but I think it involves ritual animal sacrifice and long incantations from the Necronomicon.)

I managed to introduce two exciting bugs into the system in last week’s deployment. So this week’s deployments include:

  1. A fix to a problem that I knew would occur, under a certain set of circumstances, but which I thought would probably only occur once in a blue moon, if ever. Instead, it happens about 20 times a day. One user referred to it as “really really really frustrating” and “a horrible inconvenience” in a support ticket she opened.

  2. A fix to a problem that had never even once occurred in testing, and which I have still never been able to recreate in testing. In production, of course, it happens about 10 times a day. And since I still haven’t been able to recreate the issue in the test environment, I can’t really be sure if the “fix” actually fixes the problem.

So, basically, my errors have been annoying the heck out of our users for the last week, and I have once again been reminded that I am fallible, sometimes spectacularly so!

Code Complete

Code CompleteCode Complete by Steve McConnell
My rating: 5 of 5 stars

I started reading Code Complete years ago. (More than ten years ago, I think.) It’s a great book, but I kept putting it down in favor of more specific programming books, usually ones that I needed to read for something I had to learn for work; a new language or software package or whatever. And then I kind of forgot about it for awhile. But I finally got back to it in 2014, and just finished it up today. Near the end, I switched over from reading my hard copy of the first edition to reading the second edition on Safari.

Although the second edition is fairly old now too, and some of the specifics in it could be considered out of date, I’d say that almost everything in the book is still applicable.

The book, overall, is a solid introduction to the “best practices” for a professional software developer. It covers a lot of stuff that’s applicable for any professional programmer, regardless of the language you’re using or the environment you work in. McConnell has a lot of specific advice, and he backs it up with data; this isn’t one of those books that reads like a religious screed. It’s not just opinion.

If you’re making your living as a computer programmer, you should really read this book.

View all my reviews

Dynamics AX silliness

How’s this for a post title?

Compare Tool causing a failure, forcing an element restore which results in negating the changes made on the element

Yes, in Dynamics AX, the ERP system I work in every day, using the “compare” tool can destroy your code! Admittedly, it’s an edge case, and it’s not likely to happen terribly often. But still. Compare tools should not actually mess up your code! (Merge tools should, maybe, sometimes. But AX doesn’t even have a merge tool. Don’t get me started…)

Farewell, Dr. Dobb’s

Sad to see that Dr. Dobb’s is getting shut down. I had a subscription to the old print magazine for many years. They had some great, useful, well-written articles and columns, from people like Michael Swaine, Jeff Duntemann, and Al Stevens.

There are a lot of great programming resources out there on the internet, of course, from Q&A sites like Stack Overflow to podcasts like .NET Rocks. But I don’t think there’s anything else out there that’s quite like Dr. Dobb’s was, in its heyday.

Dynamics AX documentation annoyances

So there’s an event I can override, with the following signature:

public void cursorNotify(int _event)

So if I look that up in the documentation, I should be able to see what values I might get for the _event parameter, right? Nope.

It says there’s going to be a table of event IDs, but there is no table.
Go back to the AX 2009 documentation, though, and you can see the table.

And hey, it even has some example code. A lot of the AX 2012 documentation leaves me with the impression that it was automatically generated, and then never reviewed by an actual human. And that they don’t really want to bother updating it or improving it And, sometimes, I feel like I need to vent about that…

So Much Microsoft News

Wow, so much nifty news coming out of Microsoft this week! Scott Hanselman has a good overview. And The Morning Brew for today has a great round-up of links to various blog posts from within Microsoft and elsewhere.

I’m definitely excited about the new Visual Studio Community version. I’ve been using VS Express at home, for my various recreational programming projects, and it’s not bad, but I’m glad that I can now use a version of VS that supports extensions, and doesn’t impose artificial barriers between desktop and web development.

Oh, and F# 4.0 looks interesting!

Using RecordSortedList in Dynamics AX 2012

Dynamics AX 2012 has a nice class called RecordSortedList, which can be used to create a list of records from a database table. It can be useful when you need to pass a list of records into a method, or return a list of records from a method.

I honestly haven’t used it that often, but I had a case today where I thought it would be perfect. I had a method that currently returns a single record from a table, but that needed to be changed to return a short list of records.

I wrote some code to insert records into the list, then another bit to loop through the list and do something with the records in it. I was puzzled that, while I was definitely inserting multiple records into the list, I was only getting a single record back out. After some trial and error, I discovered that the methods to retrieve records from the list don’t really work right if you fail to explicitly set a sort order on the list. I wasn’t really concerned with sort order, so I didn’t bother setting one at first. Once I set a sort order, everything worked fine.

If you want to see this quirk for yourself, run the test job below with and without the sortOrder() call. As far as I can tell, this isn’t actually documented anywhere, so I thought I’d write up this blog post, as a reminder for myself, and as a resource for anyone else who happens to stumble across this little quirk.

// https://gist.github.com/andyhuey/84495f8a3480d2df31f9
static void AjhTestRSL(Args _args)
{
    CustTable custTable;
    RecordSortedList myList = new RecordSortedList(tableNum(CustTable));
    boolean moreRecs;

    myList.sortOrder(fieldNum(CustTable, AccountNum));

    // create a list
    while select firstOnly10 * from custTable
    {
        myList.ins(custTable);
    }

    // step through the list
    moreRecs = myList.first(custTable);
    while (moreRecs)
    {
        info(custTable.AccountNum);
        moreRecs = myList.next(custTable);
    }
}