comments python, drm, google edit

I purchase all of my music through Google Play, and I primarily use their web application to listen to it. As a precaution, I also use the Music Manager application to keep a local backup of all of this music on my NAS.

Recently, I wanted to switch to a new Google Account because I was changing primary email addresses. Before doing this, I made sure the music manager had downloaded any purchased music to my NAS because I will be deleting the old Google Account permanently.

Once I had verified the music had been downloaded, I logged out in the Music Manager application, and logged in under my new account. At this point, I had to wait for ALL of my music to be re-uploaded to Google’s servers.

After the music had uploaded, there were 17 songs that could not be uploaded because I had purchased them under a different account. (Apparently not of all the music contains DRM?)

You can see the error in the troubleshooter –

“Song was purchased with another Google Play account”

A little digging led me understand that Google hides their DRM in a hidden ID3 tag that is not easily removable by conventional means. This digging, however, also led me to a Python utility that could do it – and so, into the world of Python.

First, I had to install Python, which was dead easy – https://www.python.org/downloads/ *Note: I am on a Windows machine, and the utility I will show you apparently requires version 2.7 of Python, so get that one :)

During the installation, I let the installer add python.exe to my PATH variable.

Once the installation was complete, I launched a command prompt and installed ‘eyeD3‘ using pip:

eyeD3-install

Now, navigate to your music directory (mine is on my NAS, mapped to my computer as “M:”)

cd /d M:

Execute one simple command, and let it run (depending on how much music you have, it could take a while)

python -m eyed3.main --remove-frame PRIV ./

You should now see a lot of text flowing through your console output. That’s eyeD3 doing its thing. Let it run. Go grab a snack.

Once completed, the Google Music Manager picked up on the fact that the files had changed on disk, and started to re-upload them – without error I might add!


comments career, meta edit

I realized earlier that today marks my one year anniversary at Heuristic Solutions (thanks, Facebook ‘On this day’ :-) ).

My time at Heuristics has definitely been a game changer for me. Being able to work alongside Seth Petry-Johnson and Matthew Groves has proved beneficial beyond my imagination. To say, “I’ve learned a lot”, would be an oversimplification of the amount of knowledge I’ve gained over the past year, but that’s the easiest way to put it – I truly have learned a lot.

What does the next year hold?

Hard to say for sure. I would imagine a ton of new lines of code for LearningBuilder and more learnin’.

Outside of that, surprise me.


comments blogging, career, review edit

Over the last few weeks, I’ve been indulging in the content delivered to my inbox by a Mr. John Sonmez.

This content, or what is better known as his 5 day email course on blogging, has been a delight to consume. If you’ve never blogged before, but have always wanted to, I suggest you subscribe to John’s email course. He provides a clear and concise path for potential bloggers to get started easily and quickly that I haven’t found in other blogging materials.

For me, personally, since I’m already somewhat of a blogger, it’s provided a ton of ideas that I plan to work through and implement here.

To close, GO SIGNUP FOR THE COURSE!


comments conference, review, codemash edit

I’ve known about CodeMash for about 3 years, and of those three years, I had to skip out on TWO of them. The first year had already sold out before I found out, so there wasn’t much I could do in that situation. The second year, our daughter was born one week before (which I obviously knew ahead of time), so I couldn’t go then either.

Finally, with no children being expected, plenty of forewarning, and a ticket paid for by my [awesome] company, Heuristic Solutions (hey, we’re hiring), I was able to attend!

I didn’t end up attending any of the pre-compilers, only the main two days of sessions.

Let’s get to it!

Day One

Ten Practical Tips for Automated Testing of Web Applications - Jim Holmes

Jim is an experienced tester, and a great speaker – so this is a fantastic session for anyone interested in testing (obviously).

I walked away with some good tips, and a testing framework that I hadn’t heard of before.

The Future of C# is Now! - Dustin Campbell

I went into this session expecting an overview of new C# features, and I got that.

However, Dustin was also showing off a code analyzer that he built using Roslyn that included fixes for migration pre-C# 6.0 code to C# 6.0.

My love for Roslyn begins.

Decoupling the Frontend through Modular CSS - Julie Cameron

I am the furthest thing from a front-end designer as you can get, but I do have to think about stuff like it on a daily basis.

I, more or less, went to this session by recommendation, and I’m actually glad I did.

Julie gave some great tips for structuring your HTML, CSS, & JavaScript that I hadn’t paid much attention to before. She also went over some conventions that I had never even known about, so all in all, this was an excellent session.

Xamarin Forms and The Future of Mobile Application Development - Jesse Liberty

This was one of the vendor sessions, but since it was being presented by Jesse Liberty, I had to go. I tend to enjoy his style of teaching (I think I’ve watched every single one of his Pluralsight courses :))

Not only that, but Xamarin Forms is on my radar of things to deep dive, so I figured this would be a great session.

I was let down a little bit, to be honest. It was very introductory to what Xamarin Forms is and the basics on how to use it. I expected somewhat of a deeper look into it.

Still a good session, if that’s what you’re looking for.

Building Code Aware Frameworks using the .NET Compiler Platform (“Roslyn”) - Kevin Pilch-Bisson

As you previously read, I have fallen in love with Roslyn, and couldn’t pass up the opportunity to sit on a session dedicated to it.

Ironically, I had received the latest MSDN magazine in the mail prior to leaving for CodeMash, and had brought it along to read (which I did). This session demonstrated the concepts and sample code from one of the articles in that issue.

It was still a great session, and just the conversation and questions that went on were worth it.

Day Two

Getting More Out of Git - Jordan Kasper

I was a little late to this session – hey, it was early, alright! – and it was packed, so I ended up sitting in the floor. Comfy.

Anyway, there were a lot of good tips packed into this session, and Jordan did a great job of presenting. For me, though, I wish it had been later in the day, because I might have zoned out a time or two. Maybe. Probably. Yeah, I did.

Clean Code: Writing for Humans - Cory House

I’ve been following Cory for a while now, and was actually able to meet him and see his session while at CodeMash. Cory is an awesome guy, super cool, super nice, and gives a great session on clean code to boot.

The funny thing about this session, is, you listen to it, nodding your head the whole time agreeing with everything he says. Something about the material being reiterated to you in a fantastic presentation really makes the session worth it.

From Backbone to Ember and Back(bone) Again - Jonathan Knapp

I wasn’t fond of this session, mainly because it outlined a contracting gig where they did exactly what the title says. It didn’t hit home with me because I’ve never used either of those frameworks (and likely won’t for some time). Jonathan gave some metrics as to LOC/Speed/etc difference between the two, which was nice to see – but then ended up picking the slower/bigger one, and I don’t quite understand why. The whole time he kept reiterating that the original developers didn’t know JavaScript, and I suppose that’s a fair reasoning for being there, I think I expected more of why I should choose one of these frameworks over another – and, unfortunately, I still don’t have that answer.

Do You Even Kanban? - David Neal

This was another vendor session, and quite honestly, I was a little let down with it.

What I thought would be a session with a lot of information on LeanKit, it turned out to be an introduction to Kanban.

I already Kanban.

OPEN SESSION: Roslyn

Guys, this was awesome (as are most open sessions).

This open session was packed, with people such as:

  • Kevin Pilch-Bisson
  • Dustin Campbell
  • Jon Skeet
  • Tim Rayburn
  • Kathleen Dollard

If you don’t know who those people are, go find out. NOW.

I didn’t contribute much to the overall conversation, but listening to these industry leaders talk about Roslyn made my day. I followed along with most of it (some definitely went over my head).

You can have your movie star idols – some of mine are listed right here. It was very difficult to choose those sessions, there were a ton of options for every time slot, and you want to see them all!

Conclusion

To summarize:

  • CodeMash is awesome.
  • The people that attend CodeMash are awesome.
  • The sessions are awesome.
  • The food is awesome.
  • Meeting new people is awesome.

Get your ticket and attend next time – find me and say hello, cause you better believe I’m going back next year!


comments jenkins, iis edit

You want to run Jenkins on port 80 on your windows machine, huh? It’s easier said than done.

Well, it used to be before I wrote this blog post. If you’re like me, you’ve already spent some time trying to get this to work the way you would expect it to work like the Jenkins documentation alludes to:

  • Open Jenkins.xml
  • Set --httpPort=80 in the command line section

Seems fairly easy doesn’t it? Well, as you’ve probably already figured out, it doesn’t work.

Jenkins, apparently, cannot bind to a ‘system’ reserved port (anything below 1024).

Again, if you’re like me, you fiddled with this for a while. Setting the windows service to run as Local Account/Network Account/Local Admin/Domain Admin/etc/etc/etc, Nothing works.

Then, you start searching the internet and find out this is a real problem that people have been struggling with for a while, and apparently, you can solve it by installing Apache.

Now, don’t get me wrong, I have nothing against Apache, though I haven’t used it in a while, I use to use it quite exclusively. For this installation, however, I didn’t feel like attempting to get that work, and wondered if it would be just as possible with IIS - which was already installed.

I finally figured out the secret recipe for getting it to work, and it goes a little something like this:

  • Configure Jenkins to run on whatever port you like - I left it at the default 8080
  • Install IIS
  • Install the IIS URL Rewrite module
  • Install the IIS Application Request Routing module
  • Create a ‘dummy’ website in IIS that is bound to port 80
  • Add a ‘Reverse Proxy Inbound Rule’ to the dummy website that rewrites the requests from port 80 to port 8080 (on the same machine)
  • Step 6 is a little more involved than the others, so, screenshots!

Pick the rule type to create (Reverse Proxy Inbound Rule) Rule Creation

Configure the destination IP/port on the dialog, and hit OK Rule Configuration

Right-click the new rule, and click ‘Edit’ - the rule should look similar to this Current Rule Configuration

Then, we’re only using HTTP, so I remove the condition, and hard-code HTTP in the rewrite URL Modified Rule Creation

If all is successful, you should be able to hit the ‘website’ running on port 80 of your server, and silently be directed to Jenkins on port 8080 without even noticing it.

If you run into any issues, or have any feedback, please leave a comment below!


comments career, imposter-syndrome edit

As most of you know, I recently started a new job with Heuristic Solutions working on their LearningBuilder product. I’ve been with them now for about a month, and up until about last week, things were going great. Then, out of nowhere, The Imposter Monster made its unwelcoming return.

Now, I’ve always been rather hard on myself when it comes to my work. Doubts plague me daily about where I am and where I should be. They never quite overlap in my mind – probably never will – but I’m working on it.

Having said all of that, I do believe that part of this is just from the stress of starting a new job. Everybody has been there, I imagine. You leave a job where you provided value, felt good about the decisions you made, knew everyone, etc. – then, all of a sudden, you’re back on the bottom of the totem pole without any of those happy feelings.

Am I supposed to be here? Do I deserve this job? Do I fit in? Do I actually have what it takes to bring value to this company?

I can’t answer those questions.

All I really wanted to do was get this post out here, in hopes that if someone is feeling the same way, perhaps they’ll come across this post and realize – they’re NOT alone.


comments channel9, dotnetconf, powershell edit

Based on my previous script of a nearly identical title, this script will snag the 2014 dotNetConf videos (high quality MP4s) from Channel 9.

Change the $baseLocation to a folder of your choosing, and let it go.

$baseLocation = "V:\Coding\Channel 9\dotNetConf 2014\"

$rssFeed = New-Object -TypeName XML
$rss = (New-Object System.Net.WebClient).DownloadString("http://s.ch9.ms/Events/dotnetConf/2014/RSS/mp4high")

$rssFeed.LoadXml($rss)

$itemCount = $rssFeed.rss.channel.item.Count

for($i = 0; $i -lt $itemCount; $i++) {
     $fileCount = $i + 1
     Write-Progress -Activity "Downloading Recordings..." -Status "Processing file $fileCount of $itemCount" -PercentComplete (($i/$itemCount)*100)

     $item = $rssFeed.rss.channel.item[$i]

     $fileExtension = $item.enclosure.url.Substring($item.enclosure.url.lastIndexOf('.'), $item.enclosure.url.length - $item.enclosure.url.lastIndexOf('.'))

     $cleanFileName = [RegEx]::Replace($item.title, "[{0}]" -f ([RegEx]::Escape([String][System.IO.Path]::GetInvalidFileNameChars())), '') 

     $downloadTo = $baseLocation+$cleanFileName+$fileExtension

     If(!(Test-Path $downloadTo)) {
          (New-Object System.Net.WebClient).DownloadFile($item.enclosure.url, $downloadTo)
     }
}


comments career edit

The last few weeks have been a little stressful here at the Allen household due to the job situation, but things are turning around!

On Tuesday, May 27th, I will be starting a new job that I’m extremely excited about.

What is it you ask?

Well, I have accepted an offer with Heuristic Solutions to work on their LearningBuilder product!

Not only do I get to work with a fantastic team of people on a great product, but I get to do it from home!


comments virtualbox edit

I had a really difficult time coming up with a title for this post, but essentially what I’m trying to convey is:

  • You created a VirtualBox machine
  • You deleted/removed/transferred the VM files on your HDD
  • VirtualBox will no longer let you manage that machine - indicates “inaccessible” (can’t even remove it).

I found myself in this predicament earlier this evening. All I wanted to do was remove the VM from the list of machines in VirtualBox, but it wouldn’t let me because it couldn’t find any of the files in the given location. After a few hacks, I found a solution. Hopefully, this might help someone.

Given a VirtualBox machine - let’s call him “Test Machine”, that resides on your host machine’s file system Setup - Image 1 Setup - Image 2

You, accidentally or purposefully, delete the folder containing the VM Folder is gone

Suddenly, you can no longer access the VM from within the VirtualBox Manager Machine Invalid

And, any attempts to remove it are futile Cannot Remove

If you can deal with the ‘clutter’ of an orphaned VM, yay. If not, like me, we gotta get rid of that thing.

Here’s how I did it.

  • Shut down ALL VMs, and close VirtualBox Manager
  • Navigate to your personal VirtualBox settings file (Mine is IN my Users folder - C:\Users\Calvin\.VirtualBox\VirtualBox.xml)
  • Edit the file IN Notepad/Notepad2/Notepad++/WhateverEtcPad++2
  • Find the MachineRegistry section, and remove the MachineEntry for the offending machine VirtualBox Configuration
  • Save the file, close, and reopen VirtualBox Manager. If successful, you should no longer see the machine. Invalid Machine Gone

That’s it! Hope it helps someone!


comments channel9, build, powershell edit

Crazy long title, but you get the idea.

Here is a PowerShell script that will download all of the mp4 high quality videos from Channel 9 for Build 2014.

Change the $baseLocation to a folder of your choosing, and let it go.

$baseLocation = "V:/Coding/Channel 9/Build 2014/"
$rssFeed = New-Object -TypeName XML

$rss = (New-Object System.Net.WebClient).DownloadString("http://s.ch9.ms/Events/Build/2014/RSS/mp4high")
$rssFeed.LoadXml($rss)
$itemCount = $rssFeed.rss.channel.item.Count

for($i = 0; $i -lt $itemCount; $i++) {
    $fileCount = $i + 1
    Write-Progress -Activity "Downloading Recordings..." -Status "Processing file $fileCount of $itemCount" -PercentComplete (($i/$itemCount)*100)
    $item = $rssFeed.rss.channel.item[$i]
    $fileExtension = $item.enclosure.url.Substring($item.enclosure.url.lastIndexOf('.'), $item.enclosure.url.length - $item.enclosure.url.lastIndexOf('.'))
    $cleanFileName = [RegEx]::Replace($item.title, "[{0}]" -f ([RegEx]::Escape([String][System.IO.Path]::GetInvalidFileNameChars())), '') 
    $downloadTo = $baseLocation+$cleanFileName+$fileExtension
    
    If(!(Test-Path $downloadTo)) {
        (New-Object System.Net.WebClient).DownloadFile($item.enclosure.url, $downloadTo)
    }
}