The most clever spam comment I have ever seen

If you run a blog – you have a periodic task of clearing out spam comments. I don’t get too much spam so every few weeks is enough. But I thought this spam comment was worth keeping. It is clearly a grammar to generate many variations of similar comments. Apparently the spammer forgot to generate the text – they just posted the input to the spam text generation process. Perhaps they mis-read their “Dummy’s Guide to Spam Commenting as a Profession”.

I think it would be super cool to have a Python assignment to read this data and pick amongst the choices and randomly generate the real comments. It should be pretty straightforward. So without further ado, here is a very flexible and repurposable spam comment:

{I have|I’ve} been {surfing|browsing} online more than {three|3|2|4} hours
today, yet I never found any interesting article like yours.
{It’s|It is} pretty worth enough for me. {In my opinion|Personally|In my view}, if all {webmasters|site owners|website owners|web owners} and
bloggers made good content as you did, the {internet|net|web} will be {much
more|a lot more} useful than ever before.|
I {couldn’t|could not} {resist|refrain from} commenting.
{Very well|Perfectly|Well|Exceptionally well} written!|
{I will|I’ll} {right away|immediately} {take hold of|grab|clutch|grasp|seize|snatch} your {rss|rss feed} as I {can not|can’t} {in finding|find|to
find} your {email|e-mail} subscription {link|hyperlink} or
{newsletter|e-newsletter} service. Do {you have|you’ve} any?
{Please|Kindly} {allow|permit|let} me {realize|recognize|understand|recognise|know} {so that|in order that} I {may just|may|could} subscribe.
{It is|It’s} {appropriate|perfect|the best} time to make
some plans for the future and {it is|it’s} time to be happy.
{I have|I’ve} read this post and if I could I {want to|wish
to|desire to} suggest you {few|some} interesting things or {advice|suggestions|tips}.

{Perhaps|Maybe} you {could|can} write next articles referring to
this article. I {want to|wish to|desire to} read {more|even more} things about it!|
{It is|It’s} {appropriate|perfect|the best} time to make {a
few|some} plans for {the future|the longer term|the long run}
and {it is|it’s} time to be happy. {I have|I’ve} {read|learn} this {post|submit|publish|put up}
and if I {may just|may|could} I {want to|wish to|desire
to} {suggest|recommend|counsel} you {few|some} {interesting|fascinating|attention-grabbing} {things|issues}
or {advice|suggestions|tips}. {Perhaps|Maybe} you {could|can} write {next|subsequent} articles {relating
to|referring to|regarding} this article. I {want to|wish to|desire to} {read|learn} {more|even more}
{things|issues} {approximately|about} it!|
{I have|I’ve} been {surfing|browsing} {online|on-line} {more than|greater than} {three|3} hours {these days|nowadays|today|lately|as of late}, {yet|but} I {never|by no means} {found|discovered} any {interesting|fascinating|attention-grabbing} article like yours.
{It’s|It is} {lovely|pretty|beautiful} {worth|value|price} {enough|sufficient} for me.
{In my opinion|Personally|In my view}, if all {webmasters|site
owners|website owners|web owners} and bloggers
made {just right|good|excellent} {content|content material}
as {you did|you probably did}, the {internet|net|web}
{will be|shall be|might be|will probably be|can be|will likely be} {much more|a lot more} {useful|helpful} than ever before.|
Ahaa, its {nice|pleasant|good|fastidious} {discussion|conversation|dialogue}
{regarding|concerning|about|on the topic of} this {article|post|piece of writing|paragraph} {here|at
this place} at this {blog|weblog|webpage|website|web site},
I have read all that, so {now|at this time} me also commenting {here|at this place}.|
I am sure this {article|post|piece of writing|paragraph} has touched all the internet {users|people|viewers|visitors}, its really really {nice|pleasant|good|fastidious} {article|post|piece of writing|paragraph} on building up
new {blog|weblog|webpage|website|web site}.|
Wow, this {article|post|piece of writing|paragraph} is {nice|pleasant|good|fastidious},
my {sister|younger sister} is analyzing {such|these|these kinds of} things, {so|thus|therefore} I am
going to {tell|inform|let know|convey} her.|
{Saved as a favorite|bookmarked!!}, {I really like|I like|I love} {your blog|your
site|your web site|your website}!|
Way cool! Some {very|extremely} valid points! I appreciate you
{writing this|penning this} {article|post|write-up} {and the|and
also the|plus the} rest of the {site is|website is} {also very|extremely|very|also really|really} good.|
Hi, {I do believe|I do think} {this is an excellent|this is a great} {blog|website|web site|site}.
I stumbledupon it ;) {I will|I am going to|I’m going to|I may} {come back|return|revisit} {once again|yet
again} {since I|since i have} {bookmarked|book marked|book-marked|saved as a
favorite} it. Money and freedom {is the best|is the greatest} way to change, may you be rich and continue to {help|guide}
{other people|others}.|
Woah! I’m really {loving|enjoying|digging} the template/theme of this {site|website|blog}.
It’s simple, yet effective. A lot of times it’s {very hard|very difficult|challenging|tough|difficult|hard}
to get that “perfect balance” between {superb usability|user friendliness|usability} and {visual appearance|visual appeal|appearance}.
I must say {that you’ve|you have|you’ve} done a {awesome|amazing|very good|superb|fantastic|excellent|great} job with this.
{In addition|Additionally|Also}, the blog loads {very|extremely|super} {fast|quick} for me
on {Safari|Internet explorer|Chrome|Opera|Firefox}.

{Superb|Exceptional|Outstanding|Excellent} Blog!|
These are {really|actually|in fact|truly|genuinely} {great|enormous|impressive|wonderful|fantastic} ideas in {regarding|concerning|about|on
the topic of} blogging. You have touched some
{nice|pleasant|good|fastidious} {points|factors|things} here.
Any way keep up wrinting.|
{I love|I really like|I enjoy|I like|Everyone loves} what you
guys {are|are usually|tend to be} up too. {This
sort of|This type of|Such|This kind of} clever work and
{exposure|coverage|reporting}! Keep up the {superb|terrific|very good|great|good|awesome|fantastic|excellent|amazing|wonderful} works guys I’ve
{incorporated||added|included} you guys to {|my|our||my personal|my own} blogroll.|
{Howdy|Hi there|Hey there|Hi|Hello|Hey}! Someone in my {Myspace|Facebook} group shared this {site|website} with us so I came to {give it a look|look it over|take a look|check it out}.
I’m definitely {enjoying|loving} the information. I’m {book-marking|bookmarking}
and will be tweeting this to my followers! {Terrific|Wonderful|Great|Fantastic|Outstanding|Exceptional|Superb|Excellent} blog and {wonderful|terrific|brilliant|amazing|great|excellent|fantastic|outstanding|superb} {style and design|design and style|design}.|
{I love|I really like|I enjoy|I like|Everyone loves} what you guys {are|are usually|tend
to be} up too. {This sort of|This type of|Such|This
kind of} clever work and {exposure|coverage|reporting}!
Keep up the {superb|terrific|very good|great|good|awesome|fantastic|excellent|amazing|wonderful} works
guys I’ve {incorporated|added|included} you guys to {|my|our|my personal|my own} blogroll.|
{Howdy|Hi there|Hey there|Hi|Hello|Hey} would
you mind {stating|sharing} which blog platform you’re {working with|using}?
I’m {looking|planning|going} to start my own blog {in the near future|soon} but I’m having a {tough|difficult|hard} time {making a decision|selecting|choosing|deciding} between BlogEngine/Wordpress/B2evolution and
Drupal. The reason I ask is because your {design
and style|design|layout} seems different then most blogs and I’m looking for
something {completely unique|unique}. P.S {My apologies|Apologies|Sorry} for {getting|being} off-topic
but I had to ask!|
{Howdy|Hi there|Hi|Hey there|Hello|Hey} would you mind letting me know which {webhost|hosting company|web host} you’re {utilizing|working with|using}?
I’ve loaded your blog in 3 {completely different|different} {internet browsers|web browsers|browsers} and I must say this blog loads a lot {quicker|faster}
then most. Can you {suggest|recommend} a good {internet
hosting|web hosting|hosting} provider at a {honest|reasonable|fair} price?
{Thanks a lot|Kudos|Cheers|Thank you|Many thanks|Thanks},
I appreciate it!|
{I love|I really like|I like|Everyone loves} it {when people|when individuals|when folks|whenever people}
{come together|get together} and share {opinions|thoughts|views|ideas}.
Great {blog|website|site}, {keep it up|continue the good
work|stick with it}!|
Thank you for the {auspicious|good} writeup. It in fact was
a amusement account it. Look advanced to {far|more} added agreeable from you!
{By the way|However}, how {can|could} we communicate?|
{Howdy|Hi there|Hey there|Hello|Hey} just wanted to give you a quick heads up.
The {text|words} in your {content|post|article} seem to be running
off the screen in {Ie|Internet explorer|Chrome|Firefox|Safari|Opera}.
I’m not sure if this is a {format|formatting} issue or something to do with {web browser|internet browser|browser} compatibility but I {thought|figured} I’d post to let
you know. The {style and design|design and style|layout|design} look great though!
Hope you get the {problem|issue} {solved|resolved|fixed} soon.
{Kudos|Cheers|Many thanks|Thanks}|
This is a topic {that is|that’s|which is} {close to|near to} my heart…
{Cheers|Many thanks|Best wishes|Take care|Thank you}!
{Where|Exactly where} are your contact details though?|
It’s very {easy|simple|trouble-free|straightforward|effortless} to find out any {topic|matter} on
{net|web} as compared to {books|textbooks}, as I found this
{article|post|piece of writing|paragraph} at this {website|web site|site|web page}.|
Does your {site|website|blog} have a contact page? I’m having {a tough time|problems|trouble} locating it but,
I’d like to {send|shoot} you an {e-mail|email}. I’ve got some {creative ideas|recommendations|suggestions|ideas} for your
blog you might be interested in hearing. Either way, great {site|website|blog} and
I look forward to seeing it {develop|improve|expand|grow} over time.|
{Hola|Hey there|Hi|Hello|Greetings}! I’ve been {following|reading} your {site|web site|website|weblog|blog}
for {a long time|a while|some time} now and finally got the {bravery|courage} to go
ahead and give you a shout out from {New Caney|Kingwood|Huffman|Porter|Houston|Dallas|Austin|Lubbock|Humble|Atascocita} {Tx|Texas}!
Just wanted to {tell you|mention|say} keep up the {fantastic|excellent|great|good} {job|work}!|
Greetings from {Idaho|Carolina|Ohio|Colorado|Florida|Los angeles|California}!
I’m {bored to tears|bored to death|bored} at work so
I decided to {check out|browse} your {site|website|blog} on my iphone
during lunch break. I {enjoy|really like|love}
the {knowledge|info|information} you {present|provide} here
and can’t wait to take a look when I get home. I’m {shocked|amazed|surprised} at how {quick|fast} your blog loaded
on my {mobile|cell phone|phone} .. I’m not even
using WIFI, just 3G .. {Anyhow|Anyways}, {awesome|amazing|very good|superb|good|wonderful|fantastic|excellent|great} {site|blog}!|
Its {like you|such as you} {read|learn} my {mind|thoughts}!
You {seem|appear} {to understand|to know|to grasp} {so much|a
lot} {approximately|about} this, {like you|such as you} wrote the {book|e-book|guide|ebook|e book} in it or something.
{I think|I feel|I believe} {that you|that you simply|that you just} {could|can} do with {some|a few} {%|p.c.|percent} to {force|pressure|drive|power} the message {house|home} {a
bit|a little bit}, {however|but} {other than|instead of} that, {this is|that is}
{great|wonderful|fantastic|magnificent|excellent} blog.
{A great|An excellent|A fantastic} read. {I’ll|I
will} {definitely|certainly} be back.|
I visited {multiple|many|several|various} {websites|sites|web sites|web pages|blogs} {but|except|however} the audio {quality|feature} for audio songs {current|present|existing} at
this {website|web site|site|web page} is {really|actually|in fact|truly|genuinely} {marvelous|wonderful|excellent|fabulous|superb}.|
{Howdy|Hi there|Hi|Hello}, i read your blog
{occasionally|from time to time} and i own a similar one and i was just
{wondering|curious} if you get a lot of spam {comments|responses|feedback|remarks}?
If so how do you {prevent|reduce|stop|protect against} it, any plugin or
anything you can {advise|suggest|recommend}?
I get so much lately it’s driving me {mad|insane|crazy} so any {assistance|help|support} is very much appreciated.|
Greetings! {Very helpful|Very useful} advice {within this|in this particular} {article|post}!
{It is the|It’s the} little changes {that make|which will make|that produce|that will make} {the biggest|the largest|the greatest|the most important|the most significant} changes.
{Thanks a lot|Thanks|Many thanks} for sharing!|
{I really|I truly|I seriously|I absolutely} love {your blog|your site|your website}..

{Very nice|Excellent|Pleasant|Great} colors & theme.
Did you {create|develop|make|build} {this website|this site|this web site|this amazing site}
yourself? Please reply back as I’m {looking to|trying to|planning to|wanting
to|hoping to|attempting to} create {my own|my
very own|my own personal} {blog|website|site} and {would like to|want
to|would love to} {know|learn|find out} where you got this from or {what the|exactly what the|just
what the} theme {is called|is named}. {Thanks|Many thanks|Thank you|Cheers|Appreciate it|Kudos}!|
{Hi there|Hello there|Howdy}! This {post|article|blog post}
{couldn’t|could not} be written {any better|much better}!

{Reading through|Looking at|Going through|Looking through} this {post|article} reminds me of my previous roommate!
He {always|constantly|continually} kept {talking about|preaching about} this.
{I will|I’ll|I am going to|I most certainly will} {forward|send} {this article|this information|this post} to him.
{Pretty sure|Fairly certain} {he will|he’ll|he’s going to} {have a good|have a very good|have a great} read.
{Thank you for|Thanks for|Many thanks for|I appreciate you for} sharing!|
{Wow|Whoa|Incredible|Amazing}! This blog looks {exactly|just} like my old one!
It’s on a {completely|entirely|totally} different {topic|subject} but it has pretty much the
same {layout|page layout} and design. {Excellent|Wonderful|Great|Outstanding|Superb} choice of colors!|
{There is|There’s} {definately|certainly} {a lot to|a great deal to} {know
about|learn about|find out about} this {subject|topic|issue}.
{I like|I love|I really like} {all the|all of the} points {you made|you’ve made|you have made}.|
{You made|You’ve made|You have made} some {decent|good|really good} points there.

I {looked|checked} {on the internet|on the web|on the net} {for more info|for more information|to
find out more|to learn more|for additional information} about the
issue and found {most individuals|most people}
will go along with your views on {this website|this site|this web
{Hi|Hello|Hi there|What’s up}, I {log on to|check|read} your {new stuff|blogs|blog} {regularly|like every week|daily|on a regular basis}.
Your {story-telling|writing|humoristic} style is {awesome|witty}, keep {doing
what you’re doing|up the good work|it up}!|
I {simply|just} {could not|couldn’t} {leave|depart|go away} your {site|web site|website} {prior to|before} suggesting that I {really|extremely|actually} {enjoyed|loved} {the standard|the usual} {information|info}
{a person|an individual} {supply|provide} {for your|on your|in your|to
your} {visitors|guests}? Is {going to|gonna} be {back|again} {frequently|regularly|incessantly|steadily|ceaselessly|often|continuously} {in order to|to} {check
up on|check out|inspect|investigate cross-check} new
{I wanted|I needed|I want to|I need to} to thank you
for this {great|excellent|fantastic|wonderful|good|very good} read!!
I {definitely|certainly|absolutely} {enjoyed|loved}
every {little bit of|bit of} it. {I have|I’ve
got|I have got} you {bookmarked|book marked|book-marked|saved as a favorite} {to check out|to look at} new {stuff you|things
you} post…|
{Hi|Hello|Hi there|What’s up}, just wanted to {mention|say|tell you}, I {enjoyed|liked|loved} this {article|post|blog post}.
It was {inspiring|funny|practical|helpful}. Keep on posting!|
I {{leave|drop|{write|create}} a {comment|leave a response}|drop
a {comment|leave a response}|{comment|leave a response}} {each time|when|whenever} I {appreciate|like|especially enjoy} a {post|article} on a {site|{blog|website}|site|website} or {I have|if
I have} something to {add|contribute|valuable to contribute} {to the discussion|to the conversation}.
{It is|Usually it is|Usually it’s|It’s} {a result of|triggered
by|caused by} the {passion|fire|sincerness} {communicated|displayed} in
the {post|article} I {read|looked at|browsed}. And {on|after} this {post|article} Dr.
Chuck’s Blog

Moving Virtual Box Images from Mac Internal Hard Drive to External Drive

There seem to be a lot of posts that show how to move a VirtualBox or Boot2Docker image to a new hard drive the hard way using the command line. I just came across an easy way to move a virtual box image to an external hard drive to free up space on my main hard drive. As I start playing more with docker I cannot affort to fill my main hard drive up with docker / virtualbox images. Here is the trick.

virtualbox-prefsGo to Virtual Box Preferences and change the Default Machine Folder to be on your external drive.

Then control-click on the image that is stored on your main disk and clone it. Since the default is now your external drive it will clone it to your external drive.

Then boot your cloned VM to make sure it is OK and then delete your original VM from the VirtualBox UI. Then just to be doubly sure it still works.

As an added bonus, if you make new VM’s (i.e. perhaps you downloaded and installed boot2docker) they will be placed on the external drive as that is now the location where all new VMs get created.

Of course it means that you need to plug in your external drive whenever you do anything with boot2docker of VirtualBox. But you have a bunch o disk freed up on your main hard drive.

Idea: Split Secrets for OAuth

We are talking about ways to establish shared secrets where both the Tool Consumer and Tool Provider contribute key material to an overall shared key used to sign and validate OAuth messages. Often these “secrets” are treated as strings of varying length. Common practice is to choose random numbers wih something like the uniq() PHP function or Java’s UUID() and then hex encode the random bits for strings of varying length.

Using the current approach, (a) we cannot assume the serialization of this data and (b) the secrets can be of effectively any length (short or long). By not specifing an encoding that allows us to transmit bit-level randomness, we implicitly shorten key lengths by using a non-predictable encoding so we have to fall back to strings and likely strings with a very limited character set.

We have not yet seen situations where secrets include non-Latin1 characters. As we move to moving secrets across web services – serialization becomes inclreasingly important and if we get too tricky with character sets we might find ourselves with some interoperability problems.

My proposal is to define the binary bit-length of the two halves of the “split secret” and insist that these are serialized using a known serialization so both sides can de-serialize these pieces to cryptographically strong secrets with a well understood bit length.

So each of the sides contributes 512 cryptographically random bits to the shared secret. When each side communicates the secret – they are serialized and transferred using 128-character hex encoded using only lower case letters for a-f. An example of a half-secret is as follows:


To form the OAuth consumer secret the two hex halves are just concatenated as hex strings. Since the OAuth signing simply appends the key to the message and computes a digest, we can make use of all 1024 bits of randomness by using a 256 character hex-encoded key. While this means that the pad has a known character set (0-9) and (a-f) – it makes up for that by being 4 times longer. Also we avoid any encoding problems if we allow non-latin1 characters in the OAuth shared secret.

By speicfing the bit length and encoding – both sides can build database models that store secrets in fixed length fields.

By insuring there are 1024-bits of cryptographically strong randomness – other uses like sending data between the sides with two-way encryption approaches like Blowfish or AES can create shorter bit length keys from the known 1024-bits of randomness.

I am just putting this up because I like openness in the design of any security scheme in case I made any mistakes or incorrect assumptions.

This design is not at all final – comments are very welcome.

Tracing History from to “Imitation Game” to the Modern-Day Internet (#IHTS)

In a sense Alan Turing’s cryptography, code breaking and computer science work at Bletchley Park featured in the Imitation Game movie was the kickoff for the modern day Internet and well as modern day electronic computing technologies. For the first time in history, communication was essential for survival and applying computation to understanding communication was critical to success or failure in World War II. There was unprecedented funding poured into research into mathematics, computer science, social science, linguistics, and many other fields. Bletchley Park was one of the world’s first great large-scale cross-disciplinary research labs. The creativity and innovation at Bletchley Park had a tremendous impact on the results of World War II and the shape of our world to the present day.

If you are interested in learning how we got from Bletchley Park to today’s Internet – I would invite you to attend my free self-paced Internet History, Technology, and Security course on Coursera.

IHTS was one of the first 20 pioneering MOOCs as Coursera was rolled out in 2012 (yes two years seems like a long time ago). And now IHTS is one of the first Coursera courses to pioneer a new self-paced format that allows students to start and take courses at any time and at their own pace.

We initially have soft-launched IHTS so students can view all of the lectures and supplementary materials. Over the coming months, we will be adding quizzes and other assessments so that the self-paced offering includes all the features of the previous scheduled cohort based offerings on Coursera – except with no deadlines :).

The course is a mix of lectures and interviews with Internet innovators. All of the course materials are open and available under a CC-BY Creative Commons License to allow reuse of the lecture materials.

I hope to see you in class.

Riding My Way Back – Veterans Day – And my own Big-Screen Film Debut

Tomorrow is Veterans Day and I will be attending a film screening of “Riding My Way Back” Tuesday November 11 at 7PM at the Celebration Cinema in South Lansing.

Riding My Way Back ( is a documentary film about a veteran who came back from Iraq and Afghanistan with with traumatic brain injury (TBI) and Post-Traumatic Stress Disorder (PTSD) and how his relationship with a horse named “Fred” helped him rebuild his life.

In addition to Riding My Way Back, we will be showing “CHUM Families” which is a documentary about parents and children that are part of the C.H.U.M. Therapeutic Riding family. I produced the film and it if the first time any of my work will be shown on a big screen cinema.

Here is a preview of the CHUM Families movie on YouTube.

The proceeds for the showing will go to support the programs at C.H.U.M. Therapeutic Riding (

I hope to see you there.

How to Achieve Vendor Lock-in with a Legit Open Source License – Affero GPL

Note: In this post I am not speaking for the University of Michigan, IMS, Longsight, or any one else. I have no inside information on Kuali or Instructure and am basing all of my interpretations and commentary on the public communications from the web site and other publically available materials. The opinions in this post are my own.

Before reading this blog post, please take a quick look at this video about Open Source:

The founding principles of Open Source from the video are as follows:

  1. Access to the source of any given work
  2. Free Remix and Redistribution of Any Given Work
  3. End to Predatory Vendor Lock-In
  4. Higher Degree of Cooperation

A decade ago efforts like Jasig, Sakai, and Kuali were founded to collaboratively build open source software to meet the needs of higher education to achieve all of the above goals. Recently Kuali has announced a pivot toward Professional Open Source. Several years ago the Sakai and Jasig communities decided to form a new shared non-profit organization called Apereo to move away from Community Source and toward pure Apache-style open source. So interestingly, at this time, all the projects that coined the term “Community Source”, no longer use the term to describe themselves.

In the August 22 Kuali announcement of the pivot from non-profit open source to for-profit open source, there was a theme of how much things have changed in the past decade since Kuali was founded:

…as we celebrate our innovative 2004 start and the progress of the last decade, we also know that we live in a world of change. Technology evolves. Economics evolve. Institutional needs evolve. We need to go faster. We need a path to a full suite of great products for institutions that want a suite. So it is quite natural that a 10-year-old software organization consolidates its insights and adapts to the opportunities ahead.

There were many elements in the August 22 announcement that merit discussion (i.e. here and here) but I will focus on these particular quotes from the FAQ that accompanied the August 22 announcement:

This plan is still under consideration. The current plan is for the Kuali codebase to be forked and re-licensed under Affero General Public License (AGPL).

The Kuali Foundation (.org) will still exist and will be a co-founder of the company. … The Foundation will provide initial capital investment for the company out of its reserves.

In a follow-up post five days later on August 27 they clarified the wording about licensing and capital:

All software that has been released under the current, Open Source Initiative approved Educational Community License (ECL) will and can continue under that license.

The software license for work done by the new entity and from its own capital will be the Open Source Initiative approved Affero GPL3 license (AGPL3).

While the details and overall intent of the August 22 and August 27 announcements from the Kuali Foundation may seem somewhat different, the AGPL3 license remains the central tenet of the Kuali pivot to professional open source.

The availability of the AGPL3 license and the successful use of AGPL3 to found and fund “open source” companies that can protect their intellectual property and force vendor lock-in *is* the “change” that has happened in the past decade that underlies both of these announcements and the makes a pivot away from open source and to professional open source an investment with the potential for high returns to its shareholders.

Before AGPL3

Before the AGPL3 license was created, there were two main approaches to open source licensing – Apache-style and GPL-style. The Apache-like licenses (including BSD, MIT, and ECL) allow commercial companies to participate fully in both the active development of the code base and the internal commercial use of that code base without regard to mixing of their proprietary code with the open source code.

The GNU Public License (GPL) had a “sticky” copyleft clause that forced any modifications of redistributed code to also be released open source. The GPL license was conceived pre-cloud and so its terms and conditions were all about distribution of software artifacts and not about standing up a cloud service with GPL code that had been modified by a company or mixed with proprietary code.

Many companies chose to keep it simple and avoided making any modifications to GPL software like the Linux kernel. Those companies could participate in Apache projects with gusto but they kept the GPL projects at arms length. Clever companies like IBM that wanted to advance the cause of GPL software like Linux would hire completely separate and isolated staff that would work on Linux. They (and their lawyers) felt they could meet the terms of the GPL license by having one team tweak their cloud offerings based on GPL software and a completely separate team that would work on GPL software and never let the two teams meet (kind of like matter and anti-matter).

So clever companies could work closely with GPL software and the associated projects if they were very careful. In a sense because GPL had this “loophole”, while it was not *easy* for commercial companies to engage in GPL projects when a company tweaked the GPL software for their own production use, it was *possible* for a diverse group of commercial companies to engage constructively in GPL projects. The Moodle project is a wonderful example of a great GPL project (well over a decade of success) with a rich multi-vendor ecosystem.

So back in 1997, the GPL and Apache-like licenses appeared far apart – in practice as the world moved to cloud in the past decades the copyleft clause in GPL became less and less of a problem. GPL licensed code could leverage a rich commercial ecosystem almost as well as Apache licensed code. The copyleft clause in GPL had became much weaker by 2005 because of the shift to the cloud.

AGPL – Fixing the “loophole” in GPL

The original purpose of the GPL license was to insist that over time all software would be open source and its clause to force redistribution was a core element.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

The fact that these cloud vendors could “have their cake and eat it too” could be easily fixed by making the AGPL3 license tighter than the GPL license by adding this clause:

The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.

This seems simple enough. Fix the flaw. The GPL license did not imagine that someday software would not be “distributed” at all and only run in the cloud. The AGPL3 license solves that problem. Job done.

But solving one problem in the GPL pathos causes another in the marketplace. AGPL3 ensures that we can “see” the code that those who would remix and run on servers would develop, but it creates an unfortunate asymmetry that can be exploited to achieve a combination of vendor lock-in and open source.

AGPL3 = Open Source + Vendor Lock-In

The creators of GPL generally imagined that open source software would have a diverse community around it and that the GPL (and AGPL) licenses were a set of rules about how that community interacted with each other and constrain companies working with GPL software to bring their improvements back to the commons. But just like the GPL founders did not imagine the cloud, the AGPL creators did not imagine that open source software could be created in a proprietary organization and that the AGPL license would ensure that a diverse community would never form (or take a really long time to form) around the open source software.

These days in Educational Technology it is pretty easy to talk to someone on your Caltrans commute and get $60 Million in venture capital for an educational technology startup. But your VC’s want an exit strategy where they make a lot of money. I think that there are likely no examples of VC-funded companies that used an Apache-like license in their core technology that were funded let alone successful. That hippie-share-everything crap just does not cut it with VC’s. Vendor lock-in is the only way to protect asset value and flip that startup or go public.

Clever company founders figured out how to “have their cake and eat it too”. Here is the strategy. First take VC money and develop some new piece of software. Divide the software into two parts – (a) the part that looks nice but is missing major functionality and (b) the super-awesome add-ons to that software that really rock. You license (a) using the AGPL3 and license (b) as all rights reserved and never release that source code.

You then stand up a cloud instance of the software that combines (a) and (b) and not allow any self-hosted versions of the software which might entail handing your (b) source code to your customers.

Since the (a) portion is incomplete it poses no threat to their commercial cloud offering. And since the (a) part is AGPL it is impossible for a multi-vendor commercial ecosystem to emerge. If a small commercial competitor wants to augment the (a) code to compete with the initial vendor that has (a)+(b) running in the cloud, they are bound by the AGPL3 license to publish all of their improvements. This means that if the second company comes up with a better idea than the original company – the original company gets it and any and all competitors of the second company get the improvement for free as well. But if the original company makes an improvement – they keep it hidden and proprietary thus extending their advantage over all other commercial participants in the marketplace:

You can see this theme in the August 22 Kuali FAQ where they talk about “What happens to the Kuali Commercial Affiliates (KCAs)?”:

There will be ample and growing opportunities for the KCAs to engage with Kuali clients. The company would love for KCAs to take on 80% or more of the installation projects. The Kuali platform will continue to become more and more of a platform that KCAs can augment with add-ons and plugins. In addition, KCAs will likely be used to augment the company’s development of core code and for software projects for Kuali customers.

Reading this carefully, the role for companies other than Kuali, Inc. is to install the software developed by the new “Kuali, Inc.” company or perhaps develop plugins. With the source code locked into AGPL3, the greatest role that a community of companies can do is be “Kuali Inc’s little helpers”. The relationship is not a peer relationship.

When a company builds a proprietary product from scratch and releases a portion of it under APGL3, there never was a commons and the AGPL3 license is the best open source license the comapny can use to insure that there never will be a true commons.

Revisiting – AGPL – Fixing the “bug” in GPL (oops)

Now the AGPL3 advocates actually achieve their goals when the original company goes out of business because even though we never see the (b) component of the software, since the (a) part is open source and a truly open ecosystem could emerge around the carcass of the company – but by the time the company failed – it is not likely that their “half-eaten code carcass” would be all that useful.

What is far more likely is that the company using the AGPL strategy would get a few rounds of VC, thrive and sell themselves for a billion dollars or go public for a few billion dollars. After the founders pocket the cash, there would no longer need to market themselves as “open source” so they would just change the license on (a) from AGPL3 to a proprietary license and stop redistributing the code. Since the (b) code was always proprietary – after a few months of improvements to the (a) code in a non-open source fashion and the deep interdependence of the (a) and (b) code, the open copy of (a) has effectively died on the vine. The resulting company has a wonderfully proprietary and closed source product with no competitors and the VC’s have another half-billion dollars to give to some new person on a Caltrans ride. And the “wheel of life” goes on.

Each time open source loses and VCs and corporations win, I am sure somewhere in the world, about ten Teslas get ordered and a puppy cries while struggling to make it to the next level.

Proprietary Code is a Fine Business Model

Probably by this time (if you have read this far) you probably have tagged this post as #tldr and #opensourcerant – it might indeed warrant #tldr – but it is not an open source rant.

I am a big fan of open source but I am also a big fan of proprietary software development. The educational technology market is made up of well over 90% of its software that is proprietary. Excellent proprietary offerings come from companies like Blackboard, Coursera, Instructure (part b), Piazza, Microsoft, Google, Edmodo, Flat World Knowledge, Pearson, McGraw Hill, Apple and many others. Without them open source efforts like Sakai and Moodle would not exist. I am not so foolish that I believe that purely open source solutions will be sufficient to meet the need of this market that I care so much about.

The right combination in a marketplace is a combination of healthy and competitive open source and proprietary products. This kind of healthy competition is great because choices make everyone stronger and keep teams motivated and moving forward:

  • Linux and Microsoft Windows
  • Microsoft Office and LibreOffice
  • Sakai and Blackboard
  • Apache HTTPd and Microsoft IIS
  • ….

The wisest of proprietary companies even see fit to invest in their open source competitors because they know it is a great way to make their own products better.

The reason that the “open source uber alles” strategy fails is that proprietary companies can raise capital far more effectively than open source efforts. This statement from an earlier Kuali blog post captures this nicely:

We need to accelerate completion of our full suite of Kuali software applications, and to do so we need access to substantially more capital than we have secured to date to meet this need of colleges and universities.

The problem is also why it is very rare for an open source product to dominate and push out proprietary competitors. Open source functions best as a healthy alternative and reasonably calm competitor.

AGPL3 + Proprietary + Cloud Strategy in Action

To their credit, Instructure has executed the AGPL3 open/closed hybrid strategy perfectly for their Canvas product. They have structured their software into two interlinked components and only released one of the components. They have shaded their marketing the right way so they sound “open source” to those who don’t know how to listen carefully. They let their fans breathlessly re-tell the story of “Instructure Open Source” and Instructure focuses on their core business of providing a successful cloud-hosted partially open product.

The Kuali pivot of the past few weeks to create Kuali Inc., (actual name TBD) is pretty clearly an attempt to replicate the commercial success of the Instructure AGPL3 strategy but in the academic business applications area. This particular statement from the August 22 Kuali announcement sums it up nicely:

From where will the founding investment come?

The Foundation will provide initial capital investment for the company out of its reserves. Future investment will come from entities that are aligned with Kuali’s mission and interested in long-term dividends. A first set of investors may be University foundations. There is no plan for an IPO or an acquisition.

Read this carefully. Read this like a lawyer, venture capitalist, or university foundation preparing to invest in Kuali, Inc. would read it. The investors in Kuali, Inc. may be more patient than the average investor – but they are not philanthropic organizations making a grant. The AGPL license strategy is essential to insuring that an investment in Kuali, Inc. has the potential to repay investors investments as well as a nice profit for its patient investors.

Is there any action that should be taken at this time? If I were involved in Kuali or on the board of directors of the Kuali Foundation, I would be very suspect of any attempted change to the license of the code currently in the Kuali repository. A change of the kind of license or a change to “who owns” the code would be very significant. The good news is that in the August 27 Kuali post it appears that at least for now, a board-level wholesale copyright change is off the table.

All software that has been released under the current, Open Source Initiative approved Educational Community License (ECL) will and can continue under that license.

I think that a second issue is more about the individual Kuali projects. There are lots of Kuali projects and each project is at a different maturity level and has its own community and its own leadership. I think that the approach to Kuali, Inc. might be different across the different Kuali Foundation projects. In particular if a project has a rich and diverse community of academic and commercial participants, it might be in that communities’ best interest to ignore Kuali Inc. and just keep working with the ECL licensed code base and manage its own community using open source principles.

If you are a member of a diverse community working on and using a Kuali project (Coeus and KFS are probably the best examples of this) you should be careful not to ignore a seemingly innocuous board action to switch to AGPL3 in any code base you are working on or depending on (including Rice). Right now because the code is licensed under the Apache-like Educational Community License, the fact that the Foundation “owns” the code hardly matters. In Apache-like licenses, the owner really has no more right to the code than the contributors. But as soon as the code you are working on or using is switched to AGPL3, it puts all the power in the hands of the copyright owner – not the community.

A worrisome scenario would be to quietly switch the license to AGPL3 and then have the community continue to invest in the Kuali Foundation version of the code for a year or so and then a year from now, the Kuali Foundation Board could then transfer ownership of the code to someone else and then you would have to scramble and pick through the AGPL3 bits and separate them out if you really wanted to continue as a community. This is usually so painful after a year of development that no one ever does it.

The Winter of AGPL3 Discontent

If we look back at the four principles of open source that I used to start this article, we quickly can see how AGPL3 has allowed clever commercial companies to subvert the goals of Open Source to their own ends:

  • Access to the source of any given work – By encouraging companies to only open source a subset of their overall software, AGPL3 ensures that we will never see the source of the part (b) of their work and that we will only see the part (a) code until the company sells itself or goes public.
  • Free Remix and Redistribution of Any Given Work – This is true unless the remixing includes enhancing the AGPL work with proprietary value-add. But the owner of the AGPL-licensed software is completely free to mix in proprietary goodness – but no other company is allowed to do so.
  • End to Predatory Vendor Lock-In – Properly used, AGPL3 is the perfect tool to enable predatory vendor lock-in. Clueless consumers think they are purchasing an “open source” product with an exit strategy – but they are not.
  • Higher Degree of Cooperation – AGPL3 ensures that the copyright holder has complete and total control of how a cooperative community builds around software that they hold the copyright to. Those that contribute improvements to AGPL3-licensed software line the pockets of commercial company that owns the copyright on the software.

So AGPL3 is the perfect open source license for a company that thinks open source sounds great but an actual open community is a bad idea. The saddest part is that most of the companies that were using the “loophole” in GPL were doing so precisely so they could participate in and contribute to the open source community.


As I wrote about MySQL back in 2010, a copyright license alone does not protect an open source community:

Why an Open Source Community Should not cede Leadership to a Commercial Entity – MySql/Oracle

Many people think that simply releasing source code under an open license such as Instructure or GPL is “good enough” protection to ensure that software will always be open. For me, the license has always been a secondary issue – what matters is the health and vitality of the open community (the richness and depth of the bazaar around the software).

Luckily, the MySQL *community* saw the potential of the problem and made sure that they had a community-owned version of the code named MariaDB that they have actively developed from the moment that Oracle bought MySQL. I have not yet used MariaDB – but its existence is a reasonable insurance policy against Oracle “going rogue” with MySQL. So far, now over four years later Oracle has continued to do a reasonable job of managing MySQL for the common good so I keep using it and teaching classes on it. But if MariaDB had not happened, by now the game would likely be over and MySQL would be a 100% proprietary product.

While I am sure that the creators of the Affero GPL were well intentioned, the short-term effect of the license is to give commercial cloud providers a wonderful tool to destroy open source communities or at least ensure that any significant participation in an open-source community is subject to the approval and controls of the copyright owner.

I have yet to see a situation where the AGPL3 license made the world a better place. I have only seen situations where it was used craftily to advance the ends of for-profit corporations that don’t really believe in open source.

It never bothers me when corporations try to make money – that is their purpose and I am glad they do it. But it bothers me when someone plays a shell game to suppress or eliminate an open source community. But frankly – even with that – corporations will and should take advantage of every trick in the book – and AGPL3 is the “new trick”.

Instead of hating corporations for being clever and maximizing revenue – we members of open source communities must simply be mindful of being led down the wrong path when it comes to software licensing.

Note: The author gratefully acknowledges the insightful comments from the reviewers of this article.

Sakai 11: iFrames are starting to vanish

You have been hearing a bunch about the new responsive Morpheus portal and the removal of the iFrames from Sakai 11. Lots of work has been going on. Last night I committed the first of many changes to the portal code in trunk to start Sakai 11 down the path to being iframe free. The Morpheus effort is already well on the way to making our default portal mobile friendly and responsive.

If you go to the nightly server as of this morning, you will see that there are no more iframes except for the following tools:

Lessons, Samigo, Preferences, Resources, DropBox, and Home

If you want to a fun test, go to:

Make an account, make a site, add the Gradebook and a few other tools to the site – then click the four buttons across the top of Gradebook and then click the Back button four times – watching the URL change. No iframes, real REST looking URLs in the location box and flawless back button.

At this point we have not done anything that is irreversible, all we did was change two property defaults in trunk. You can restore yesterday’s behavior by setting these back to their old defaults:


If you are playing with the morpheus portal, the next time you so an ‘svn update’ the same settings and behaviors will be in effect. The morpheus portal is inlining all but the above tools as well.

None of this will be put into Sakai 10 – it will remain in trunk for Sakai 11. We know there will be lots of little issues as we completely rewrite how the portl works underneath our feet and so we really need the next six or so months to colletively test these major UI improvements.

Over the next few weeks, we will be working on tweaking little markup glitches to make it so all tools can be inlined in both the neo and morpheus portals. Lessons, Samigo and Preferences have small issues of markup conflicts, jQuery versions or local CSS bits that should be easily fixed to allow them to be inlined. DropBox and Home use Bootstrap Javascript and CSS and so they have significant markup conflicts between them and the portal – we may need to wait for morpheus to mature some more to get these two tools working in inline mode. Home has four tools on a single page and there is no way to inline more than one tool on a page other than using portlets so the Home page will take some work – or perhaps we just replace it with the Dashboard :).

As we make these changes, every effort will be made to keep the tools working in all variants of the portal (neo with frames, neo with no frames, and morpheus with and without frames). But at some point we will need to change tool markup in a way that it no longer works with the neo portal or works in a diminished mode in neo. By that point, morpheus will have nmatured to the point where it will be the default and only portal that we support for Sakai 11. When that happens there will be plently of communication and announcements and opportunities to do some testing and feedback from the community. So make sure to listen carefully to the developer and user lists in Sakai over the next few months as this bit of “evolution in place” happens.

You can track what is happening at this JIRA:

If you find a problem that appears to be a markup conflict between the portal and tool markup, please file a JIRA and link it to SAK-27774 and we will see what we can do.

Let us know what you think of this on the user and developer lists. One of the benefits of being part of the Sakai community is that we make changes like this in the open and invite broad disucssion about them. It is one of the hallmarks of an open community of developers and users guiding a product forward together.

This is the first of many steps to a state-of-the-art responsive and iframe-free user experience – the journey of a thousand commits starts with a single commit.

Sakai 10 Released – The Magic of Open Source

In this post I am not speaking for University of Michigan, Longsight Inc., or the IMS Global Learning Consortium.

It is always a great feeling for an open source community to finish a release. So much work goes into a release and so many volunteers are involved and work hard – so it is a proud moment for a lot of us. I tend to be involved in more of the up front development and working on crazy next gen stuff. So I am doubly grateful to those who put the finishing touches on these releases and then get them out to the public and put them into production.

Here is the official release notice for Sakai 10. There is a long list of great stuff in that link that I won’t replicate here.

As I said in the The Post-LMS LMS article in Inside Higher Education, the past year has seen a lot of incremental investment in all five of the major LMS systems in the marketplace. In a sense we were all reacting to changes in the market. As we gain experiences with larger sized classes that we hope to run at scale (i.e inspired by MOOCs) there are a number of MOOC-like features that are finding their way into products. Sakai-10’s peer-assessment and improvement of group-submitted are partially inspired by the MOOCs heavy use of peer features. It is not so much that MOOCs were the first to do peer-assessment – more that peer-assessment has gotten a lot of attention in the past two years.

If Sakai end-users feel strongly enough about a feature to bring funding or resources to the table, the features get built and added to the core product and are part of the next release surprisingly quickly. It is that simple – no product marketing layer or sales people to fight through. You find or hire the necessary resources and have a feature in the core product. There is no other product in the LMS marketplace where end-users personally know the core developers of the product on a first name basis.

Another big trend is making sure that LMS systems can function well in cloud environments (i.e. like Amazon). In the past two years, Amazon’s costs have dropped dramatically and their capabilities have grown significantly. The addition of Solid State Disk Drives in many of their offerings is a quantum leap forward in the ability to host “normal” applications in the cloud that was impractical a while back. Simply put, two years ago – you had to be pretty clever to move a large application into the cloud because of the subtle performance tuning that was required – but now Amazon’s cloud resources have very similar performance characteristics to locally-owned hardware – expecially if virtualization is used on that hardware.

Just a quick look at Amazon’s EC2 pricing is pretty amazing – especially the one and three year fixed contract pricing. A m3.medium instance with about 4G RAM, 4G SSD and one CPU is $172 for three years. A bit more capable two CPU, 8G RAM, 32G SSD m3.large server is $343 for three years. Why would I ever run a server under my desk at work with prices like that?

So there is a pull for both self-hosted schools and commercial companies that host LMSs in their own clouds to take advantage of these prices. This is true for all vendors. Based on my rumors and bar conversations, I think that Canvas is the only major hosting company that is mostly using Amazon – but all the other vendors are likely eyeing hosting new work and new expansion in the cloud and as servers get replaced in a company data center it is likely that there will be an urge to use Amazon instead.

But as we move the hosting of these systems into the Amazon cloud, we still want to spend as little money as possible. And if you look at what you are getting in Amazon, the most expensive element of the cost is the RAM followed by I/O. CPU is almost an insignificant concern on most LMS applications. So not surprisingly, if you want to optimize costs in a cloud version of Sakai, you find a way to trade CPU for RAM and database I/O. The solution of course for all applications is a shared cache like memcache or Reddis.

So not surprisingly in the above video you see three Sakai Commercial Affliliates (AshaiNet, Longsight, and Unicon) putting a lot of energy into cloud-tuning Sakai by reducing app server memory footprint and database I/O by adding a shared cache and switching to elastic search.

This kind of cloud tuning goes on for all of the LMS systems. For Moodle, Moodlerooms and RemoteLearner separately tune Moodle to scale for the cloud. Of course Instructure tunes Canvas for the cloud all the time but we never see the source code. Blackboard announced thair plans to host Learn on AWS at BBWorld14 – an impressive step – since I was not in Vegas, I had to settle for screen shots of slides in Twitter DMs.

But the essential difference in the Sakai community is that three competitors saw fit to pool their cloud tuning efforts and put their code into the community release. Even while the code was being built and tested, developers from AsahiNet, Longsight, and Unicon were communicating regularly, checking, testing, and fixing code written by one of their “competitors”. And when it was all done the code ends up in the open source trunk of Sakai. There are no secret repositories with the “magic sauce” – you don’t have to go to the bar and get a drawing on a napkin to find out the clever tuning tricks that are being done to make this possible. Just check out the source code and take a look.

Now while to a proprietary competitor, it might seem crazy to give away the “crown jewels”. But like many crazy plans, it is just so crazy that it might work. First, everyone is running the same code. Vendors don’t need a vendor fork for perfomance tweaks. Self-hosted schools can deploy the same solution as the commercial vendors if they like. If self-hosted schools are a little nervous about switching from the “app server” / “db server” architecture – they can just wait while the commercial Sakai vendors gain experience – but at any time – they have access to the exact same cloud code that the vendors are using in production when they are ready to start saving hardware costs.

The second and more important issue is that cloud performance tuning is a moving target. Amazon will continue to tweak their offerings and performance characteristics. You never really are sure how something will scale until you are running it at scale. Who knows if Unicon, LongSight, or AsahiNet will be the first one to encounter a little bit of code that needs a bit of tweaking as you add the millionth user. But as long as we avoid tweaks in vendor branches and keep the tweaks in the trunk, when the second vendor crosses that million user barrier – the code will be there for them – sitting in trunk and fully tested.

Again it might seem insane for one vendor to commit code that will allow other vendors to match their offerings in the marketplace or allow self-hosted schools to avoid out-sourcing their applications to a vendor because they have 100% access to the same code. But the reality is that it is far less risky to work together than to work separately. There is no single school or commercial vendor in the Sakai ecosystem that can go it alone and ignore everyone else. We are in this together. We sink or swim together.

We will all help each other find our way to the cloud together. That is the power of real open source. That is the magic of real open source.

Even if you run a commercial LMS at your University – you should join us and be part of Apereo. Apereo is not just about Sakai. Apereo is where the next generation of teaching and learning technology will be collectively defined and built. Because what is next will be even more exciting than getting an LMS ready for the cloud.

Current Demographics for My Programming For Everybody Session 2 on Coursera

This blog post is to share some of the demographic data with my students in Programming for everybody on Coursera.

Demographics PR4E#002 (PDF)

Please contact me if you want ot use this in a blog post or some other publication to make sure I get you the most up to date materials.

Dear Google – You Need A Tip Jar So I can Show the Love

Google – Yesterday you saved me $2000 and there is no way to say ‘thank you’. If there were a place to “tip” Google I would certainly give you a nice tip.

Here is my story.

Two days ago, my wife came into the house and wondered why it was so hot even though we had turned the air conditioner on hours earlier. It did seem to be a bit warm so I went out to look at the compressor.

The fan was not spinning but it was hot and making a low hum – not good. Then I used a stick to push the fan to see if it was bad or sticking bearing – the fan spun freely but did not start. Our house was built in 2001 and many of the homes in the neighborhood have been replacing their 15-year old air conditioners. And it was in a series of very hot days so I knew it would take forever to get it fixed – groan. I turned off the power and figured I would use Google Search to do some research on how much this would cost me.

First I just tried to find out how much a new condenser would cost installed – so I googled “AC Condenser price” and “installation cost AC condenser” . There was no clear answer so I figured I would just go get the model number of my existing Carrier condenser and Google it to find the replacement cost of the exact same condenser.

So I started typing ‘carrier 38ckc036340’ and as I was typing – the following screen came up:

I was intrigued by the mention of ‘capacitor’ as I knew that it was pretty common for lots of electronic things to fail because of capacitor failure. So I looked at a few pages and then switched my search to ‘carrier 38ckc036340 fan stopped’ and quickly found this page:

Carrier A/C condenser not working (fan doesn’t come on)

The picture looked pretty easy to interpret so I turned off the power to my AC unit and opened it up. Not only was my capacitor top obviously bulging, I had a stripped wire that I was surprised had not shorted these past 15 years.

A couple of machine screws later I had the capacitor off. A quick motorcycle ride to the appliance parts store and $35.00 later I had a new capacitor. I popped it back in and the AC started working immediately:

So here is the upshot. Google’s type ahead saved me as much as $2K – not only did it save me money but I was able to complete the repair in about the same amount of time it would have take a repair company to call me back.

I know who helped me here and want to share the love. But there is no “tip jar” to drop $5 or $20 into to thank “Google”.

I think that you should make this part of AdWords. Put it in the AdWords rectangle as shown below. I know that I need to show the love to (a) the site with the money-saving knowledge and (b) Google for getting me there – so a profit split from the tip jar would put the right incentives in place for all.

Now in the future as search ads become less and less valuable (especially on the non-video internet) – you might find that a tip jar model is a great source of revenue.

Let me know if this works out for you. You could share a bit of the love for me coming up with such a cool idea by clicking on my little Leave Tip button.