I found a use today for a new feature that will be in ReSharper 5.0 - "Structural Search and Replace". Essentially it's a way to add code matching templates into R# to add new refactoring patterns in addition to those that come in the box.
For example, Microsoft recommends (and Code Analysis/FxCop generates appropriate warnings) if you are doing a comparison between a string value and an empty string, to use the String.IsNullOrEmpty() method.
I always wanted R# to make this change for me, and now I can:
- Go to Resharper | Tools | Patterns Catalog
- Click on 'Add Pattern'
- Enter "
$value$ == "" " in the Search Pattern textbox.
- Click on 'Add Placeholder' and add an 'Expression' placeholder named 'value' of type System.String
- Enter "
string.IsNullOrEmpty($value$)" in the Replace Pattern textbox
- Ensure Pattern Severity is set to at least 'Show as suggestion'
- Click on 'Add'
R# will now use this pattern and highlight code that matches. You can then hit the QuickFix shortcut (Alt-Enter by default) and get a smart tag offering to refactor/replace your code.
If you can't wait for the final release of ReSharper 5 (due in the next few months) then install beta 2 or one of the recent nightly builds.
If one wasn't enough this week, today I passed another exam – 70-451 PRO: Designing Database Solutions and Data Access Using Microsoft SQL Server 2008.
Combining that with yesterday's success means I am now a Microsoft Certified IT Professional (MCITP): Database Developer 2008.
Doing the exams are an interesting (and educational) process but they have other advantages too – they'll be useful to my employer (LobsterPot Solutions) and might benefit efforts for me to become a Microsoft Certified Trainer.
This morning I took the Microsoft exam "TS: Microsoft SQL Server 2008, Database Development 70-433". I was quite chuffed after I hit the 'Finish' button and it said I'd passed!
One thing different about today's exam was that I chose to do it at Rockfort International Pty Ltd. An impressive name, but it turns out they appear to be a 2-man outfit in a quite tiny office. I wasn't even sure I was in the right place until the guy turned up and confirmed that yes they did do exams! Having said all that, once I sat down at the exam PC it was pretty good – quiet, comfortable and the PC had a reasonable screen. I've done most of my other exams at Excom, and last time I was there they still had a crumby old CRT monitor (running at a really low refresh rate) and that room had pretty noisy air conditioning. So even though the office may not be quite as swish, I'd rate the actual examination environment higher.
Over the weekend I was doing some study toward the exam and came across the following things that were new to me. Some of them may be obvious to others, but they're not things I've used before or been aware of.
- You can create filtered indexes (an index that has a WHERE clause)
- An indexed view needs to use WITH SCHEMABINDING, and as a consequence the index must be UNIQUE CLUSTERED.
- Run a table-valued function against all the rows of a query using APPLY.
Note – these were things I came across BEFORE I did the exam. I am definitely not indicating these topics were either in or out of the exam (and no, there's no hidden meaning here, I really mean that). All I am saying is that by reviewing the curriculum I happened to learn some new things.
Finally, let me pre-empt the inevitable lazy sod who emails me and asks for some hints or answers to this exam (apart from the fact that by taking the exam, I've agreed to Microsoft's Non-Disclosure Agreement which includes not "Disseminating actual Exam content" ) ..
Do what I did – use the product, and know all (or enough of) the stuff it says you need to know and you should pass!
I mentioned yesterday that the Hyper-V server had been experiencing the Blue Screen Of Death with the message "A clock interrupt was not received on a secondary processor within an allocated time" (0x00000101). The problem is that it doesn't really give you any clues as to what was the cause of the error.
Yesterday morning I changed the BIOS defaults to "Fail safe" and things had been working fine… until this morning, when it crashed again. Researching this error is not that encouraging:
- There are a few posts to forums where suggestions such as BIOS settings, defective CPU cores, RAM timing, CPU VCore etc are thrown up.
- Almost every other reference I've seen also indicates the problem is seen when running a 64-bit OS.
- AMD lists some basic checks but nothing very specific (I've already tried resetting BIOS settings, updated the BIOS to the latest firmware version
Presumably Microsoft are slightly more interested in the crash as today's Windows Error Reporting asked for me to submit extra debugging info. I'm happy to do that, though I don't expect to get any quick answers.
This is quite frustrating as until I can identify and resolve the cause of this problem, I don't have a lot of confidence in the server.
Once I figured out my preferred components I emailed MSY and put in an order with MATS. However it turns out that just because MSY have something on their parts list, doesn't mean they have it in stock. I ended up having to go to their Plympton and City stores, and got the PSU from MATS as MSY didn't have that at all.
The case I used was from an old desktop PC. It can accept an ATX board, but as the previous motherboard was a slightly smaller model I had to do some "creative" metal work to move the hard drive bays around so that they could still fit inside the case and not bump into the motherboard.
Things that changed
Noctua CPU Fan vs Ripjaw RAM
One reason I preferred the G.Skill Ripjaws RAM was that the heat spreaders were less intrusive than those on the "Trident" model. Having said that, once I went to clip the fans onto the Noctua, the wire clips on the RAM-side were in the way of the RAM. A bit of physical effort with a couple of pliers managed to bend the wire clips flatter against the heat sink such that the RAM could just slide past into the sockets on the motherboard.
I added an old DVD drive I had lying around and went to install Windows Server 2008 R2. The installation proceeded as expected, then I noticed that the machine had suddenly rebooted. On restarting a message indicating that "Windows had not expected to shutdown" appeared. That's odd. Allowing it to continue then displayed a message that the installation had failed and to try again.
Hmm.. Just out of curiosity, I fired up the Memory Diagnostics tool and after ticking over it came up with a message indicating there was a problem! Restarting the machine I went back into the BIOS to see what it said there.. Only 6G of RAM??? Hmm. Now a visual inspection of the sticks of RAM and something looked wrong!
Reseating the RAM in the sockets and re-running the memory diagnostics and everything was happy again.
I realised after I'd installed Windows Server 2008 R2 that I'd left the BIOS at the default settings, which included the SATA emulating IDE instead of AHCI. Because the boot disk was also connected this way, you can't just change the BIOS and reboot – you need to tweak the registry so that the ACHI driver gets loaded properly.
"A clock interrupt was not received on a secondary processor within an allocated time"
Lots of references to this online – some solutions suggest lowering the bus speed slightly. I fiddled around with these a bit but the crashes kept happening. I have no experience over (or under) clocking so I was quite out of my depth. Finally in desperation I changed the BIOS settings to the "fail safe" defaults. This appears to have done the trick.
An unfortunate side-effect of trying to re-use an old desktop case is that I don't think the cooling of the various components is as good as it could be.
Using HWMonitor I am seeing the following temperatures being reported:
|Component ||°C |
|CPU Core #0 ||41 |
|CPU Core #1 ||36 |
|CPU Core #2 ||43 |
|CPU Core #3 ||38 |
|HDD ST314003 #1 ||53 |
|HDD ST314003 #2 ||55 |
I'm thinking getting a proper-size case and possibly some extra cooling might help bring things down to a better level. It would also mean the disks would be slightly more secure in the case!
I now have a number of machines capable of gigabit networking but my trusty Billion 7402GL modem/router only has 4 100Mb network ports. I purchased a new Asus GX-D1081 8 port gigabit switch to enable better network performance. This also meant I could connect the Windows Media Center PC directly (it was previously using a wireless connection). After confirming the switch worked correctly, I then changed the network settings on all the gigabit-capable machines to enable "Jumbo frames" at 9K. I'm pretty sure this has resulted in a noticeable improvement in performance – especially when browsing pictures through the media center that are stored remotely on the Windows Home Server box.