Job Demand: Java, C#, C++, and Windows Compared

As a long-time Windows/C++ developer, I’m curious to know what technologies are in demand. I’ve personally used Dice.com almost exclusively in the past, but they don’t provide a good interface for viewing job trends. Indeed.com is an aggregating website which compiles results from multiple job-posting sites. It provides a very nice interface for graphing job trends.

Comparing Java, C++, and C#, it appears that there are a tremendous number of Java jobs, while C# and C++ are vying for around the same percentage of total job listings:

Of course, C++ development on *nix is often a very different beast from C++ on Microsoft Windows, and transition between the two can be problematic. If we ignore Java and add a trend line for Windows C++, it becomes clear that C++ on Windows is steadily declining, while by comparison C# is exploding:

I was curious how this compares to data sourced solely from Dice.com. Since they don’t provide any sort of trend interface, I wrote a script which feeds Dice data into the Google Charts API each week:


Posted in Technology | Leave a comment

iTunes COM SDK for Windows and Encrypted File System

The “iTunes COM SDK for Windows” archive from the Apple Developer Center contains files which are marked as encrypted. Shortly after extracting the files to my libraries folder, I was surprised to receive a popup dialog from Windows 7, “Encrypting File System,” which prompted me to back up my encryption certificate and key:

Windows 7 "Encrypting File System" dialog

I used CIPHER.EXE to verify that the only encrypted contents on the volume were those of the Apple download:

C:\lib>cipher /u /n

Encrypted File(s) on your system:

C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\.DS_Store
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\iTunesCOM.chm
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\iTunesCOMInterface.h
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\iTunesCOMInterface_i.c
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\LicenseAgreement.rtf
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\ReadMe.rtf
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\SampleScripts\.DS_Store
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\SampleScripts\CreateAlbumPlaylists.js
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\SampleScripts\RemoveDeadTracks.js
C:\lib\24460_itunescomwindowssdk\iTunesCOMWindowsSDK\SampleScripts\RemoveUserPlaylists.js
C:\lib\24460_itunescomwindowssdk\__MACOSX\._iTunesCOMWindowsSDK
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\._.DS_Store
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\._iTunesCOM.chm
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\._iTunesCOMInterface.h
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\._iTunesCOMInterface_i.c
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\._LicenseAgreement.rtf
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\._ReadMe.rtf
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\._SampleScripts
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\SampleScripts\._.DS_Store
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\SampleScripts\._CreateAlbumPlaylists.js
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\SampleScripts\._RemoveDeadTracks.js
C:\lib\24460_itunescomwindowssdk\__MACOSX\iTunesCOMWindowsSDK\SampleScripts\._RemoveUserPlaylists.js

To fix this, I opened the properties for the iTunesCOMWindowsSDK folder, selected the General tab, clicked Advanced, and unselected “Encrypt contents to secure data”:

Posted in Technology, Windows | Leave a comment

Where is the iTunes SDK?

The Apple iTunes SDK (“iTunes COM SDK for Windows”) is astonishingly difficult to find. It can be found on the Dowloads & ADC Program Assets (connect.apple.com) page. In the “Downloads” box on the right, click on “Developer Tools,” then search the page for “iTunes COM SDK for Windows.”

The irritating thing is that there seems to be no direct path from the Apple Developer’s Center to this “Downloads & ADC Program Assets” page.

Posted in Technology, Windows | Leave a comment

Domain Registrars as Recommended by Hacker News

If you’re looking for domain registrar reviews, you probably know how hard it is to find pages that aren’t just poorly concealed spam or astroturfing ‘affiliates’. While for a registration option better than GoDaddy, I found a bunch of suggestions on Hacker News, in this post from 2008. Hacker News is a social bookmarking site targeted at tech startup entrepreneurs. Its users tend to be technically proficient, and it has an extremely high signal-to-noise ratio in its comments.

To create this table, I simply read through the comments and added each recommended registrar. The ‘upvotes’ column represents the tally of upvotes received by comments which mentioned the registrar in a positive light. The ‘negatives’ column reflects the number of upvotes received by comments about the registrar which were generally negative. This is by no means a precision ranking method, but it should provide a reasonable summary.

‘Privacy’ refers to whether the registrar offers private registration. ICANN rules dictate that a current address be listed, which creates obvious privacy concerns. This can be avoided by (technically) legally transferring the domain name to a 3rd party, which is referred to as “domain privacy,” “private registration,” or some other, proprietary term.

The pricing column data are correct, to the best of my knowledge, as of March, 2011.

Update September 7, 2011: This HN comment indicates that Name.com has some evil in their Registration Agreement. They automatically park your new domain, serve up their own ads, but make you legally responsible for the content of those ads.

NameUpvotesNegativesBase CostPrivacy
EasyDNS240$19 / yr?
(spam guard is mentioned)
NearlyFreeSpeech.NET120$8.99 / yr$0.01 / day (approx $3.65 per year)
(plus possible document/voicemail forwarding fees, normally don't apply)
"RespectMyPrivacy"
Dynadot111$9.75 / yr$2 / yr
Namecheap356$10.16 / yr
(price varies by TLD)
$2.88 / yr
"WhoisGuard"
1&1144 (sort of)$8.99 / yrFree?
Google (sort of)50$10 / yrNo?
DynDNS30$15 / yr$9.95 / yr
("Secret Registration")
Gandi60$15 / yrFree
DirectNIC44$15 / yr$5 / yr
("directPrivacy")
Joker60$12.80 / yrNo?
Name.com (also Domainsite.com)31$9.99 / yrFree?
Register 4 Less10??
Yahoo! Domains40$9.95 / yr$9.00 / yr
Netfirms10$7.99 / yrFree
Domain Monger10$17?
DreamHost111?

Included in hosting plan?
Free
GoDaddy (aka Domains By Proxy)72 here, here
$11.99 / yr$9.99 / yr
Posted in Technology | Leave a comment

id3v2: Command Line MP3 Tag Editor Compiled for Cygwin

id3v2 is a powerful command line tool for editing MP3 ID3 tags.  Getting it to compile on Windows under Cygwin, though, took a bit of effort.

For the convenience of others, here is id3v2 0.1.12 compiled under Cygwin.  It depends upon Cygwin and Cygwin’s zlib package.

Posted in Cygwin, Technology, Windows | Leave a comment

Cushion Treemaps

Today, I learned that the technique used to create visualizations like those used in WinDirStat and KDirStat is called a cushion treemap. This page has examples of treemaps used in a variety of software, and links to treemap algorithms in Java.

Posted in Algorithms, Technology | Leave a comment

Ubuntu: Keyboard Reverts to German After Reboot

Every time I rebooted or logged out of my Ubuntu virtual machine, my keyboard layout would switch to “Germany Eliminate dead keys” (“Deu”). Removing the offending layout from the keyboard manager seemed to work, but the problem would reappear the next time I logged in!

Ultimately, the solution that worked for me was:

  1. Open System | Preferences | Keyboard
  2. Select the Layouts tab
  3. Select the German keyboard layout and click ‘Remove’
  4. Click “Apply System-Wide” (critical step)
  5. Close and reboot (critical step)

For some reason, the reboot was required. Merely logging out and back in resulted in the old behavior.

If you wish to keep the other keyboard layout(s), make sure that the correct language is selected at the bottom of the login screen. If you don’t have a login screen, turn it on by selecting System | Administration | Login Screen, click Unlock, select “Show the screen for choosing who will log in,” and log out.

Posted in Linux, Technology | Leave a comment

db46 Checksum Error During MacPorts Upgrade

Problem

When upgrading my MacPorts installation, using sudo port upgrade outdated, I ran into the following error:

--->  Verifying checksum(s) for db46
Error: Checksum (md5) mismatch for patch.4.6.21.1
Error: Checksum (md5) mismatch for patch.4.6.21.2
Error: Checksum (md5) mismatch for patch.4.6.21.3
Error: Checksum (md5) mismatch for patch.4.6.21.4
***
The non-matching file appears to be HTML. See this page for possible reasons
for the checksum mismatch:

***
Error: Target org.macports.checksum returned: Unable to verify file checksums
Log for db46 is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_databases_db46/main.log
Error: Problem while installing db46

Solution

sudo port clean --all db46

Subsequently, running sudo port upgrade outdated worked as expected.

Posted in OS X, Technology | 1 Comment

Mac OS + MySQL-python-1.2.3: ImportError | Library not loaded | libmysqlclient.16.dylib

Attempting to get Python communicating with MySQL via MySQLdb on OS X resulted in the following error when I tried to import MySQLdb:

Traceback (most recent call last):
  File "./dbtest.py", line 3, in 
    import MySQLdb
  File "build/bdist.macosx-10.6-universal/egg/MySQLdb/__init__.py", line 19, in 
  File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in 
  File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/fitzsimj/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib
  Referenced from: /Users/fitzsimj/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so
  Reason: image not found

I eventually found a solution mentioned here. I added the following line to /etc/bashrc:

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/

There is another solution suggested, using install_name_tool. That approach involves Ruby, which I’m not using.

Posted in Technology | 5 Comments

BluetoothAPIs.h Broken in Windows SDK

Summary

The Microsoft Windows SDK versions 7.0 and 7.1 appear to have broken BluetoothAPIs.h header files.

Details

So far, I have uncovered two types of errors in this header file:

  • The use of #pragma deprecate instead of #pragma deprecated, causing compiler warnings.
  • Several callback function pointer type definitions omit the CALLBACK (__stdcall) calling convention, causing a crash.

The first error simply results in compiler warnings.

warning C4068: unknown pragma

The second type of error results in dereferencing of an invalid memory location when using BluetoothRegisterForAuthenticationEx and BluetoothAuthenticateDeviceEx. This is because the standard calling convention (__cdecl) assumes that the caller will clean up the stack. Since the caller in this case is assuming that the callback function minded its own stack, it immediately pops ESI, placing zero into the register:

5EBCFFE2  mov         ecx,dword ptr [ebp-4]
5EBCFFE5  pop         esi
5EBCFFE6  xor         ecx,ebp
5EBCFFE8  pop         ebx
5EBCFFE9  call        @__security_check_cookie@4 (5EBDBBBBh)

Later, ntdll.dll dereferences memory at ESI + 4, triggering an access violation:

774A8301  test        byte ptr [esi+4],4

“Unhandled exception at 0x774a8301 (ntdll.dll) in [Application]: 0xC0000005: Access violation reading location 0×00000004.

Solution

To the compiler warnings, I replaced all instances of

#pragma deprecate

with

#pragma deprecated

To fix the crash bug, I added the CALLBACK calling convention keyword to PFN_AUTHENTICATION_CALLBACK and PFN_AUTHENTICATION_CALLBACK_EX. They now appear as follows:

typedef BOOL (CALLBACK *PFN_AUTHENTICATION_CALLBACK)(LPVOID pvParam, PBLUETOOTH_DEVICE_INFO pDevice);

typedef BOOL (CALLBACK *PFN_AUTHENTICATION_CALLBACK_EX)(__in_opt LPVOID pvParam, __in PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams);

Interestingly, the function pointer type definitions for the attribute-enumeration and device-selection callbacks (PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK and PFN_DEVICE_CALLBACK, respectively) are defined correctly, using CALLBACK or WINAPI. I suspect that the inconsistency is because someone at Microsoft was using the /Gz compiler switch, making __stdcall the default calling convention.

Posted in Technology, Win32, Windows | Leave a comment