Saturday, December 26, 2015

Microsoft 70-486: Design and implement routes

Exam Objectives


Define a route to handle a URL pattern, apply route constraints, ignore URL patterns, add custom route parameters, define areas

Quick Overview of Training Materials


Friday, December 18, 2015

MIT 6.006 Intro to Algorithms

Resources:

Tuesday, December 15, 2015

Migrating AppEngine Datastore Entities to a SQL Database: Jenkins Automation

In two previous posts I laid out the process for extracting the entities from the Google AppEngine datastore and then loading them into Azure SQL.  While this process was successful, it was also a bit labor intensive.  I felt pretty certain that the process could be automated, so I set out to script it out and run it from Jenkins.

My initial goal was to complete the entire process, from initiating the datastore backup to pushing to Azure, without modifying the existing app in any way.  So, while the most straight forward way to backup the enties periodically is with a (shocker) cron job, I wanted to try to trigger the backup from outside the app.

Sunday, December 6, 2015

Berkeley CS61B - Data structures (Projects)

Back in May I worked through the Data Structures class through UC Berkeley.  I got the homeworks finished, but I put off working on the projects right away.  In August I got projects 0 and 1 finished.
In late October I finally got around to finishing Project 2.  Finally, in early December I finished Project 3 (I got sidetracked working through MIT's Intro to Algorithms class... and doing like, a billion HackerRank challenges lol)

Wednesday, November 25, 2015

Migrating AppEngine Datastore Entities to a SQL Database: Azure Load

In my last post, I went over the process of getting our datastore entities from into a .csv file via BigQuery.  This seemed like a good split point, since getting a .csv or Excel file into an Azure SQL database might be of interest regardless of where the .csv came from.  I'll also quickly go over some Azure gotcha's to look out for.

As a bit of background, initially I was just going to do all the querying from within BigQuery.  But it was a bit clunky, and kind of intimately tied me in to the process of getting the data the supervisors wanted.  My manager pointed out that a more general solution was probably preferable, so I looked into getting the .csv data into a SQL database.  This is the rest of the story...

Migrating AppEngine Datastore Entities to a SQL Database: Extraction

Handwavy, tl;dr version: 
  • Back up entities to Cloud Storage
  • Import into BigQuery
  • Export .csv
  • Migrate with SQL Server Import - Export Data tool

Our help ticket system at work (creatively named "HTS") is hosted on Google AppEngine, with data persisted to the HR datastore.  My manager approached me (since I'm the "appengine developer") and asked me if it would be possible to do a "data dump".  Nothing pretty, just get it all out and into a spreadsheet or something so that supervisors could run some rudimentary reporting (the build-in capabilities in HTS weren't cutting it). So I rolled up my sleeves and got to work.  Here's how it all went down...

Sunday, October 4, 2015

Coursera Machine Learning by Stanford

Just finished up my first full blown course from Coursera, a course from Stanford University on Machine Learning.  I'd watched through the lecture series for the Stanford Natural Language Processing class, but I didn't do the programming exercises (yet...) so I don't really count that one. Finished up way ahead of schedule, though to be fair, they set a pretty leisurely pace.




Thursday, July 2, 2015

Microsoft 70-486: Manage data integrity

Exam Objectives


Apply encryption to application data, apply encryption to the configuration sections of an application, sign application data to prevent tampering

Quick Overview of Training Materials


MSDN - Encrypting and Decrypting Configuration Sections
Using CryptoStream in C#

Pitfalls of trying to mix Entity Framework providers for SQLite and SQL Server

As part of my annual evaluation, I was given the task of figuring out how we might use an in memory database (such as SQLite) to run integration tests against instead of using the full test database (SQL Server).  I was initially optimistic, but after some experimentation I have decided that this approach is fundamentally flawed.  While I think you could theoretically pull it off, you would never recoup the amount of work involved.  Ultimately, I think for integration tests you are better off just pointing EF at a test database of the same type.

Monday, June 29, 2015

Building C# project with MSBuild and Jenkins, including quality metrics with SonarQube

In two previous posts I outlined how I set up Jenkins to run a build based on which branch was built in source control and deploy it to a version on AppEngine based on the branch, and also how I set up SonarQube to perform static analysis on the code.  It got plenty of owwws and aaahs from my colleagues but there was a gorilla in the room: This was all based on Java... and most of our projects are in .NET.  It's all well and good for the AppEngine pipeline, but how are the other developers going to leverage this kind of build-test-deploy automation if everything they work on is C# and VB?  Thus was the gauntlet laid down: get this working for Microsoft.

Friday, June 26, 2015

Automating code coverage and static analysis with Jenkins, JaCoCo, and SonarQube

So now that I had a Maven build running in Jenkins (as outlined in a previous post), I wanted to get some static analysis and code coverage data as part of the build.  So I started looking into SonarQube, and it looked like a good product.  Fired up another VM, found some instructions (and more instructions) and native packages for Ubuntu, and the set up part was relatively painless (relatively being the operative word...).  The hard part was getting it to work with Jenkins.

Monday, June 22, 2015

Multiversion Push To Deploy with Jenkins, BitBucket, and GAE

Round Two in my ongoing battle to get CI to work (Round 1 was a bit of a wash).  I had a pretty straight forward goal in mind this time: Push a branch to BitBucket, initiate a Jenkins build job, and push to a specific version of the app on AppEngine based on which branch was pushed (development, staging, master).

Wednesday, June 10, 2015

CBTNuggets App Engine series

As part of my quest to become a cloud developer extraordinaire, I've been trying a number of different learning resources for Google App Engine.  I had a pretty positive experience with the Udacity offering.  The CBTNuggets series on GAE, however, I found a bit disappointing.  Whereas Udacity aims to cover GAE in about a week, the CBT course is about 8 hours.  Though really it's more like 5 hours because the demos are all done twice, once in Python and once in Java.

Monday, June 8, 2015

Berkeley CS169 - Software Engineering (Lecture Notes)

Recently finished up all the lectures for the Berkeley Webcast of CS 169 - Software Engineering.  This course focuses on building Software as a Service (SaaS) applications in Ruby on Rails.  Although I don't anticipate the need to know a lot of RoR for work, the concepts discussed in the course were extremely valuable and I would definitely recommend them to anyone looking to learn about professional software development.  Some key topics of interest:
  • Agile project development
  • Testing and refactoring
  • Design patterns
  • CI and deployment
These are my notes on the lectures, which are really more like a detailed table of contents so that I could easily reference the lectures if I wanted to revisit a topic.  I figure the course website has all the slides and reference to the book, so recreating that content seemed a bit silly...

Friday, May 22, 2015

Berkeley CS61B - Data structures

I hadn't ventured into the open courseware realm for a while, and I've wanted to get a bit of formal education on data structures and algorithms for a while, so I finally took the plunge a couple weeks ago and started 61B.  For quick reference, here are the relevant locations:

Course Website
Course Lectures
Big O Cheatsheet
Wikipeadia articles on data structures.

Wednesday, May 20, 2015

Experimenting with Jenkins, ReviewBoard, and Redmine on Azure

As the developers at work finished up the last loose ends on the Programming Standards we were tasked with creating at work, one of the last things we talked about was how to enforce the standards.  This led to a discussion of code reviews, and I went down the rabbit hole, going so far as to read SmartBear's free 150 page ebook on the subject.  I thought it was a great approach but it seemed that in order to really get the most out of it, you needed a tool.  I wanted to play around with something, so I began looking into what was available for free, and ended up going down a bit of a different rabbit hole: continuous integration.  I wanted to see how Jenkins, ReviewBoard, and Redmine could work together to act as a suite of tools for agile development.  So I spun up some Ubuntu 14.04 instances on my Azure account, and away I went...

Udacity Course: Developing Scalable Apps in Java

My new position focuses on cloud development, with an emphasis on Google App Engine.  I wanted to get up and running quickly, so I worked through this course from Udacity.  Prior to this course, I'd only worked on one other App Engine project, which was basically an expansion on the Google Backend API Walkthrough.  I'd previously used the Google Plugin for Eclipse, however this project uses the App Engine maven plugin, so that was different.  Overall I thought it was a good course.  Naturally, nothing involving Eclipse can go smoothly the first time, but after a couple hiccups, I was off and running.

Monday, April 27, 2015

Microsoft 70-486: Design and implement MVC controllers and actions

Exam Objectives


Apply authorization attributes, global filters, and authentication filters; specify an override filter; implement action behaviors; implement action results; implement model binding

Quick Overview of Training Materials


New Filter Overrides feature in ASP.NET MVC 5 and ASP.NET Web API 2
MSDN Controllers and Action Methods in ASP.NET MVC Applications
MSDN Filtering in ASP.NET MVC

Wednesday, March 25, 2015

Saturday, March 7, 2015

Fun with ciphers and generated text with JavaScript

Many moons ago, on a day I had very little else to do, I had this silly notion to create a Google Spreadsheet that would generate a line of text "mad-lib" style.  I'd already created a "team name" generator that basically just picked an adjective and a noun and put them together, which made for some rather amusing results, such as "The Pensive Tangerines", "The Drunk Stumpies", and "The Kindly Rippers".

Friday, March 6, 2015

AppEngine, Eclipse, Google API's ... and grey hairs

This is another straight forward "lessons learned" kind of post.  The last week I've been working on a side project at work for the "Innovation" team.  We're tasked with creating a paperless timecard system for the agency, and I've taken on the piece that interfaces with the Google APIs to save the timecards.

Wednesday, January 28, 2015

Microsoft 70-486: Plan an adaptive UI layout

Exam Objectives


Plan for running applications in browsers on multiple devices (screen resolution, CSS, HTML), plan for mobile web applications

Quick Overview of Training Materials


Sunday, January 18, 2015

Thursday, January 15, 2015

Fun with Coordinates: A story about using JavaScript to do things the hard way.

Went to a training class this morning on using Google's MyMaps.  Interesting enough, though I don't see myself ever really using it.  For the uninitiated, this application lets you upload a spreadsheet of locations with a bunch of metadata, and you can manipulate the visualization.  Well, the map pointers are placed based on either an address or a lat and long.  The presenter noted that she wasn't sure if you could use UTM or State Planar Coordinate System coordinates.  Because I had pretty much exhausted my interest in playing with the MyMaps interface in about 10 minutes, I took it as a challenge to obtain and test a UTM data set.  I did a search for an available dataset but didn't find anything useful, however I had at my disposal a Google Sheets spreadsheet that had the Wyoming zip codes with latitudes and longitudes (basically a truncated version of this file). "So I'll just convert the ones I have, easy..." BWAHAHAHA ok, we'll get to what that was about.

Wednesday, January 14, 2015

Microsoft 70-486: Design and implement UI behavior

Exam Objectives


Implement client validation, use JavaScript and the DOM to control application behavior, extend objects by using prototypal inheritance, use AJAX to make partial page updates, implement the UI by using JQuery

Quick Overview of Training Materials


Exam Ref 70-486: Developing ASP.NET MVC 4 Web Applications - Objective 2.2
Programming ASP.NET MVC 4 (OReilly) - Chapters 3 (Data Annotation, 4 (Client Programming) and 6 (AJAX)
Professional ASP.NET MVC 5 (WROX) - Chapters 6 (Data Annotation) and 8 (AJAX)


Previous blogs relevant to objective:

Thursday, January 8, 2015

Microsoft 70-486: Apply the user interface design for a web application

Exam Objectives


Create and apply styles by using CSS, structure and lay out the user interface by using HTML, implement dynamic page content based on a design

Quick Overview of Training Materials


Friday, January 2, 2015

Microsoft 70-486: Implement a secure site with ASP.NET

Exam Objectives


Secure communication by applying SSL certificates; salt and hash passwords for storage; use HTML encoding to prevent cross-site scripting attacks (ANTI-XSS Library); implement deferred validation and handle unvalidated requests, for example, form, querystring, and URL; prevent SQL injection attacks by parameterizing queries; prevent cross-site request forgeries (XSRF)

Quick Overview of Training Materials


Hashing Passwords using ASP.NET's Crypto Class - MSDN Crypto Class 
Password management made easy in ASP.NET with the Crypto API
MSDN - Differences Between AntiXss.HtmlEncode and HttpUtility.HtmlEncode
owasp.org - ASP.NET Request Validation