Saturday, April 30, 2016

2016-04-30 Saturday - Suggested Machine Learning Books

On the recommendation of a friend, I've ordered a book today:

Understanding Machine Learning: From Theory to Algorithms, 1st Edition, Cambridge University Press
by Shai Shalev-Shwartz and Shai Ben-David

Also, I've ordered this one too...

Foundations of Machine Learning (Adaptive Computation and Machine Learning series, MIT Press)
by Mehryar Mohri, Afshin Rostamizadeh, and Ameet Talwalkar

Friday, April 29, 2016

2016-04-29 Friday - Windows 2016 (and Nano) Technical Preview 5

I'm spending some time this weekend exploring Windows 2016 Technical Preview 5 (and Windows Nano Server).

Here's a github project that I've started to help me organize notes and links to resources - that may also be of interest to others.

Wednesday, April 27, 2016

2016-04-27 Wednesday - A High-Level Design (HLD) Template

Rationale: Numerous times, in my travels as a consultant, I've encountered organizations in which there is no established standard/template for what should be included in an HLD. Quite often (even in organizations that ostensibly have a template), the artifacts that architects and engineers produce devolve into a wild-wild west of anything-goes. Consistency engenders repeat-ability - a worthy goal. And therefore, the intended purpose in sharing least as a starting point for further customization.

The goal of an HLD is to enable communication and coordination, both within teams and organizations - as well as serving as a tool for communication and coordination with external partners.

The HLD provides a consistent format for teams to assemble details - which support a goal of being able to reuse design artifacts - and is intended to provide sufficient information to Program/Project Management to be able to plan and coordinate large-scale development efforts. Additionally, an HLD serves as an effective mechanism to support Design Review and Architecture Governance efforts.
The target level of detail is to scope the effort, provide sufficient input to the estimation process, and to clearly articulate the How of an approach.

Investing effort in the creation of the HLD is intended for larger-scoped tasks - that have some non-trivial number of unknowns, technical complexity, a high number of coordination points, or any external integration/coordination requirements.

Sunday, April 24, 2016

2016-04-24 Sunday - TiKV, a distributed KV database powered by Rust

Much goodness to grok in TiKV,
...a distributed KV database powered by Rust
...uses Raft to support Geo-Replication

"TiKV is a Distributed Key-Value Database which mainly refers to the design of Google Spanner and HBase, but much simpler (Don't depend on any distributed file system). We've implemented the Raft consensus algorithm in Rust and stored consensus state in RocksDB. It not only guarantees consistency for data but also makes use of placement driver to implement sharding (split && merge) and data migration automatically. The transaction model is similar to Google's Percolator, and with some performance improvements."

Saturday, April 23, 2016

2016-04-23 Saturday - Taxonomy of Artifact Classification Codes - updated

I've spent some time today doing a bit more organizing and extending of my working draft of a taxonomy of classification codes for various types of artifacts (e.g. proposal development, requirements, high level design, detail level design, architecture, testing, operations, training, etc.)

Still a work-in-progress, but it feels like it is beginning to congeal...

I fear I still have quite a bit of re-organization and re-structuring to do before I will be satisfied with the final product - but with what is there already - it is a decent foundation upon which others might yet build.

And so, it is worth publishing this update.  

2016-04-23 Saturday - MSI GT72 6QE Dominator Pro G Notebook Review

I've been working with a new notebook since January, an MSI GT72 6QE Dominator Pro G-034 (GTX 980M) with the 6th Generation Intel Core i7-6700HQ Skylake processor - running Windows 10.

I chose this particular model based on price, performance, features, and local store availability. 

I've had enough experience working with this new notebook to have reached some observations / conclusions that I'm willing to share...
  • This seems like a rock-solid development machine
  • I've been very pleased with the performance of the machine
  • The keyboard is comfortable, although the position of the Insert, Delete, Home, and End keys has taken a bit getting used to...
  • The screen is well lit - and resolution is fine
  • The wireless/network connectivity is good - I'm lucky to have a 1GB internet connection through Wave G Fiber
  • Disk access speeds are quite good
  • Running various Linux distributions in Oracle's VirtualBox has been snappy
  • Boot-up time is excellent
  • It is much heavier than I expected - and quite bulky - and doesn't quite fit into most of my backpacks - but 'just' fits into a rolling bag
  • The power unit is quite bulky and heavy
  • The various MSI utilities / add-ons are quite handy / nice
Given that my work often requires me to travel - the size and weight of this machine is a definite drawback. However, given that much of my software engineering interest is focused on container- based distributed architectures - this platform gives me enough horsepower to run multiple virtual machines - and is an excellent platform for GPU parallel programming experimentation (1536 CUDA Cores).  If you are interested in the software that I have installed, click here.

Udacity offers a free NVIDIA created course, Intro to Parallel Programming, Using CUDA to Harness the Power of GPUs

Available On Amazon
(although I picked mine up at a local
  • Intel® Core™ i7-6700HQ Processor(6M Cache, 2.6 GHz  - up to 3.50 GHz)
  • 4 processors
  • 24 GB SO-DIMM, GDDR5
  • 256GB M.2 SATA 
  • 1TB 7200 RPM
  • 17.3 display, 1920 x 1080 
  • NVIDIA Geforce GTX980M
  • 6 USB 3.0 ports 
  • DVD
  • 8.4 pounds 
  • 16.85 x 11.57 x 1.89 inches 

Additional Links:

2016-04-23 Saturday - Visual Studio 2015 on Windows 10 - Screen Flicker

2016-04-30 Update:
After trying a number of things, I discovered that I just needed to uncheck the box for G-SYNC

My primary development machine is an MSI GT72 6QE Dominator Pro G (GTX-980M), 6th Generation notebook with the new Skylake processor.

When launching any of the Visual Studio 2015 tools, the screen flickers constantly.

If you are experiencing the same thing, it may be due to a a bug with the new Intel HD graphics drivers for the new Skylake processors.

You may be able to resolve the issue by disabling Hyper-V with this command:
> dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

Friday, April 22, 2016

2016-04-22 Friday - Jo: a shell command to create JSON

A very nice (and elegant) command line utility (Jo, a shell command to create JSON) by Jan-Piet Mens (@jpmens)

2016-04-22 Friday - Book Review: Docker In Action by Jeff Nickoloff

If you are interested in Docker, there is a new book out by Jeff Nickoloff, published by Manning that you should check out.

Docker In Action

I'm waiting for Manning to send me my copy of the book to review - will update this post after I've completed my read.

Wednesday, April 20, 2016

2016-04-20 Wednesday - Are You Serious About Innovating?

I've been pondering this question lately - and thought that sharing this small sample of my own introspective questions might benefit others who struggle with nurturing the seed of innovation within organizations.

This is written from the specific perspective of a software engineering discipline – but is applicable to so many different types of organizations and teams.

Further, these thoughts are based on a slightly constrained premise that you have an existing product/service - and that stagnation has set in - and your innovation muscles have atrophied...

Questions that you might want to consider, in assessing whether your organization is serious about innovation…

1. Does your culture allow for errors and mistakes? If your organization operates under a threat of punishment and fear – how will your engineers ever have the courage to try something new and potentially innovative? I recently heard a CTO proudly state: “We have a perfect track record of tech choices and implementation so far, and we don't want to risk that”. A search of review comments on his company’s Glassdoor page – appears to reflect what I expected - a culture of fear and punishment. Which begs the question – are his engineers too afraid to try something new? Are yours?

2. Do you plan – and give your engineers time to “throw the first one away”, especially for critical new  components? If you are racing to the finish on every release – how much of your solution is designed (for maintenance, for scalability, for extensibility) – and how much is simply hacked together? How much innovation can be introduced – if there is no luxury of time for trial-and-error?

3. As an engineering organization, do you periodically do collective code reviews and discussions of innovative Open Source software projects to glean great ideas? More specifically, for the individual, I think there are five essential practices to becoming a world-class innovative engineer:
  • Read great code written by others;
  • Write a lot of code – with intent - focused on solving meaningful problems;
  • Be willing to experiment;
  • Constantly be re-learning your craft (patterns, algorithms, new developments, etc.);
  • Share what you learn
4. If you did a poll of your engineering group – and ask them what books they are reading, how many would have a ready answer? What percentage are focused on your current technology stack – and what percentage are looking further afield? Innovation benefits from cross-pollination of ideas.

5. What are you doing to support access to innovative ideas and continued professional development within your engineering group? Do you have a corporate Safari account program in place? Why not? When was the last time you invited an innovative leader to give a talk to your engineering group?

6. How many of your engineering group are members of the IEEE and ACM? Those two organizations provide access to their Digital Libraries – and are a wealth of ideas for innovation. Here’s a tip: Provide your engineering group with reimbursement for their membership dues. But that doesn’t go far enough. You need to close the circle. Institute a monthly discussion forum in which a rotating set of people present innovative ideas that they have gleaned from the latest papers, journal
articles, etc.

7. Do you have a wiki for collecting links to innovative articles and Open Source projects? Sometimes the flood of new things is overwhelming – but you can at least have a process for organizing information and curating it for later re-discovery.

8. When is the last time you sent any of your engineering group to a conference? It isn’t about picking-up new skills – it is about the exposure to ideas – and the invigorating surge of energy that is shared by being exposed to a large collection of people that are doing innovative leading-edge things. Sure, they could watch conference talks on Youtube – but that isn’t nearly as effective in achieving the transmission of enthusiasm...nor does it help you in spotting potential new candidates to recruit for your engineering group – or communicate with enthusiasm some of the interesting new problems your group is tackling.

9. Is there some bit of code, tooling, etc. that you could Open Source – that might be beneficial to the Open Source community at large? Trust me, being supportive of your engineers’ effort to Open Source something (that is truly meaningfully useful) will repay itself in all kinds of ways that you cannot imagine. Second best – lend some portion of your engineering team’s efforts to support an existing Open Source project. Again, the payback in innovation, enthusiasm, pride, etc. is beyond what you can imagine.

10. How much of your engineering development effort is allocated to re-factoring? Unless your code base is of a trivial size – planning for re-factoring efforts needs to be part of your technology road-map. That’s also where innovation can seep back into your solution.

11. Do you have a formal Innovation Reward Program? Why not? If your business is driven by software, or derives value from the software that runs it – you are insane to not have a formal Innovation Reward Program. Establishing a culture of financially rewarding people for game-changing innovative ideas is moral, equitable, and in your best interest. Your business is people. Your best, most vital asset, is people. Take care of your people, and they will take care of you. Invest in them. Reward your people in proportion to the value they create. If someone in your engineering group creates a solution that will reduce costs by 10% - why not give them 1% of that reduction as an Innovation Reward? Reward the behavior that is beneficial – and eventually, it will stifle the behavior that isn’t.

12. Are your key business processes documented? Without first assessing what you do - and how you do it, and understanding the underlying cost/value of that activity - how will you prioritize and drive change with a focus on First Things First?

13. Have you done time-motion studies of your key critical process flows? Why not? How could they be reworked to dramatically improve efficiency and eliminate waste - to provide an innovative competitive advantage?

14. Do you actively listen to your end users and HEAR what they need and want? I was once brought in to consult to a major software engineering group on the East Coast - to help alleviate some amorphous and undefined problem that Executive Management didn't want to specify. The Director of Engineering was quite proud of the fact that they had Nobel Prize winners in their organization - and that his group did 26 releases a year. But when I interviewed their end users (in another State) - their biggest complaint was that they were underwhelmed by the slow/buggy behavior of the application - and were not pleased with 26 changes foisted upon them per year. Sometimes the Art of Listening with Intent - is the missing ingredient to achieving breakthrough innovation.

A critical component of sustained innovation is establishing a virtuous feedback loop of positive reinforcing behavior. Change doesn't happen overnight, but with the right incremental steps, support, and nurturing - any organization, in any field of endeavor, can be changed into an innovation dynamo.

My name is Kelvin Meeks, and I help software engineering organizations achieve breakthroughs in changing their culture, envisioning  new products and capabilities, introducing innovative new architectures, and achieving breakthroughs in performance & scalability.

2016-04-20 Wednesday - Exploring Apache SINGA 0.3.0, A General Distributed Deep Learning Platform

Exploring today's Apache SINGA 0.3.0 release, A General Distributed Deep Learning Platform
"SINGA is a general distributed deep learning platform for training big deep learning models over large datasets. It is designed with an intuitive programming model based on the layer abstraction. A variety of popular deep learning models are supported, namely feed-forward models including convolutional neural networks (CNN), energy models like restricted Boltzmann machine (RBM), and recurrent neural networks (RNN). Many built-in layers are provided for users. SINGA architecture is sufficiently flexible to run synchronous, asynchronous and hybrid training frameworks. SINGA also supports different neural net partitioning schemes to parallelize the training of large models, namely partitioning on batch dimension, feature dimension or hybrid partitioning."

Tuesday, April 19, 2016

2016-04-19 Tuesday - VirtualBox Host-Only Ethernet Adapter Problem

2016-04-19 3:35pm Update:
Uninstalling 5.0.16, rebooting, and doing a clean install of 5.0.18 appears to have resolved my issue.

I'm researching an issue setting up a VirtualBox Host-Only Ethernet Adapter in a Mint 17.3 Linux Guest OS (on Windows 10). Note: I have successfully configured this in a prior version (4.3.x) of VirtualBox.

You can see the error below.

I've been using VirtualBox 5.0.16 - but will uninstall and upgrade to the latest (5.0.18) today.

It is worth noting that I do have a Host-Only Ethernet Adapter installed - and Windows reports that the driver is up-to-date (confirmed, after I removed the device, and had it re-install the drivers). However, it appears that there is no entry in the Properties list for a Host-Only Ethernet Adapter connection item.

A number of posts have described a similar problem - going back to several prior releases of VirtualBox.

Helpful References:

Some conjectures on how this problem might arise:
  • Not properly shutting down a Guest OS before upgrading to a new version of VirtualBox
  • Not doing a clean uninstall of VirtualBox before upgrading
  • Not physically deleting the left-over contents of the VirtualBox directory after an uninstall
  • A default Windows setting of [8] in the Windows Registry Key for MaxNumFilters
  • Possibly needing to specify this as a parameter when installing some older release of VirtualBox? 
    • -msiparams NETWORKTYPE=NDIS6
  • Not running the Windows MSI installer as Admin?
  • ...?

Error Encountered..

Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter' (VERR_SUPDRV_COMPONENT_NOT_FOUND).
Failed to attach the network LUN (VERR_SUPDRV_COMPONENT_NOT_FOUND).

Result Code:
E_FAIL (0x80004005)
IConsole {872da645-4a9b-1727-bee2-5585105b9eed}

Thursday, April 14, 2016

2016-04-14 Thursday - Building Lua on Ubuntu

While trying to build Lua...
curl -R -O
tar zxf lua-5.3.2.tar.gz
cd lua-5.3.2
make linux test

I encountered the following error:
fatal error: readline/readline.h: No such file or directory

All that I needed to do was:  
sudo apt-get install libreadline-dev 
This blog post is also worth reviewing, as it illustrates how to find the various 
version of readline
(i.g. "apt-cache search readline")
Note the distinction between the lib version for running an application, versus 
for developing applications.

Saturday, April 09, 2016

2016-04-09 Saturday - Installing Go 1.6 on Ubuntu

How to Uninstall golang-go on Ubuntu
  • sudo apt-get remove --auto-remove golang-go

How To Install Go 1.6 on Ubuntu 14.04

  • sudo apt-get update
  • sudo apt-get -y upgrade
  • sudo curl -O
  • sudo tar -xvf go1.6.linux-amd64.tar.gz
  • sudo mv go /usr/local
  • export PATH=$PATH:/usr/local/go/bin