Weekly Web Harvest for 2019-03-24

The SPLOT Image Truck is Here!

Cue the music… the truck is rolling through your neighborhood, blaring the music, here to deliver random images to all the kids– and the truck is fueled by json.


This could be a way for the TRU Collector SPLOT to provide random images that might one day, be an alternative source than flickr for both pechaflickr and Five Card Photo Stories. This would take away concerns over the using flickr as a source (it comes up legit as a question for teachers), but more if you wanted a way to manage the pool of photos without a third party host.

It started with a tweeted question from my pal @dogtrax.

I had a hard time this morning connecting the dots to what Kevin was referring to (maybe not yet enough coffee), but then realized maybe it was this nifty service Lorem Flickr which you can use in HTML anywhere it wants an image, and it serves up CC licensed ones from flickr.

For example, using the URL in an img tag will give a different dog each time, 640×480 pixels in dimensions:

random dog from flickr

The code for this is

<img src="https://loremflickr.com/640/480/dog" width="640" height="480" alt="random dog from flickr" />

That’s pretty nifty, right? Random dog photos. The options on Lorem Flickr let you do a few more tricks.

I had used it for a #netarr activity that maybe did not even get used, something I toyed around with for a site that generated a random character with random information using like 4 different services, all done in the browser.

Characters Cubed- A #NetNarr Experience (Proceed if you dare)
An experimental site to generate characters for Networked Narratives.

Then I thought about a playful site I did to with a free domain I got from Reclaim Hosting (it was for coming up with an original domain)

That site uses server side scripting to rewrite the web site every hour; it does some flickr API calls to find photos at the bottom of the interesting list and key words of “dull” or “boring”, and retrieves info on the last 10 photos by the same person.

sample photo pulled up for a lesser known photographer on flickr, actually the photo here is quite good, a

That could work, with bit of fiddling to do one every day to change it up (via a server cron script), to be a random prompt kind of site that automatically updated itself.

And then another memory- I had started work to add some custom endpoints to the WordPress API so any site running the TRU Collector theme to be the source of random images.

You can see what the special endpoint does (the built on WordPress ones do not do random selection of content), by using a URL on the SPLOT TRU Collector demo site like:


The number at the end tells it how many images to send back data for. I’m able to return a number of useful bits of info for the entry at http://splot.ca/collector/45/

    "title": "Happy as a Sheep",
    "link": "http:\/\/splot.ca\/collector\/45\/",
    "sharedby": "@cogdog",
    "license": "CC BY Creative Commons By Attribution",
    "images": {
      "thumb": "http:\/\/splot.ca\/collector\/files\/2015\/01\/15116810596_13effa377f_b-150x150.jpg",
      "large": "http:\/\/splot.ca\/collector\/files\/2015\/01\/15116810596_13effa377f_b.jpg"

Including title, url for the page with the image, who contributed to the site (hey, that’s me), and URLs for a thumbnail and large size images.

This is done in the SPLOT site by registering a new endpoint for the API.

add_action( 'rest_api_init', function () {
  // redister a route for just random images, accept a paraemeter for the number of random images to fetch
  register_rest_route( 'splotcollector/v1', '/randy/(?P&lt;n>\d+)', array(
    'methods' => 'GET',
    'callback' => 'trucollector_randy',
	 'args' => array(
		  'n' => array(
				'validate_callback' => function($param, $request, $key) {
			  	return is_numeric( $param );
  	) );

which define the URL path and the last parameter as a variable for the number of images. The callback function retrieves the data to send back.

function trucollector_randy( $data ) {
  // general function for getting random images, first test version
  // get specified random number of posts
 $posts = get_posts( array( 'orderby' => 'rand', 'posts_per_page' => $data['n']) );
  // bad news here
  if ( empty( $posts ) ) {
    return null;
 // walk the results, add to array
  foreach ($posts as $item) {
  	// find code for license, if not present set to code for unknown
	$lic = ( get_post_meta( $item->ID, 'license', 1 ) ) ? get_post_meta( $item->ID, 'license', 1 ) : 'u';
  	$found[] = array(
  		'title' => $item->post_title,
  		'link' => get_permalink( $item->ID ),
  		'sharedby' => get_post_meta( $item->ID, 'shared_by', 1 ), 
		'license' => trucollector_get_the_license( $lic ),
		'images' => array(
			'thumb' => wp_get_attachment_image_src( get_post_thumbnail_id( $item->ID ), 'thumbnail')[0],
			'large' => wp_get_attachment_image_src( get_post_thumbnail_id( $item->ID ), 'large')[0]
 // server up some API goodness
 return new WP_REST_Response( $found, 200 );

I then started tinkering with a simple site to get one random image via JSON and display it (using the ever useful Backstretch.js to fill the screen).

See it in action first at http://lab.cogdogblog.com/randysplot/ (you will of course get a different image than this one… just reload to swap in a new one).

Cannot describe image because it's randomly loaded, but at the bottom is a text box with its title, link to original, and reuse license
Random image pulled via browser script from http://splot.ca/collector

The HTML is basic, just place holders for content loaded down below it.

<div id="stuff" class="trans_box1">
		<h1 id="title"></h1>
		<p class="small">An experiment in random images drawn from the SPLOT at  <span id="splot"></span><br /><span id="license"></span> <span id="sharedby"></span></p> 
		<p id="furl"></p>	

We lazily load in from remote libraries a jquery library and the backstretch.js code:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-backstretch/2.0.3/jquery.backstretch.min.js"></script>	

The work is done in jQuery code. We define a source site for the SPLOT, set up a function to populate the in page content, and then use an Ajax call to get the remote data (likely needs some error checking in case it get nothing, hey this is a beta version).


	// this sets the image source, in the future it could be
	// a front page entry
	var splot_source = 'http://splot.ca/collector';

	function update_backdrop ( fromsplot ) {
		// populates the page with stuff from the remotely fetched json data
		randyimage = fromsplot[0]; 
		// load the background image
		// set the title and source of the SPLOT site
		// load license data
		if (randyimage.license === null) randyimage.license = "Rights Status Unknown";
		$('#license').html('This image is licensed: <strong>' + randyimage.license + '</strong>');		
		// load the credit data
		if (randyimage.sharedby != '') $('#sharedby').html( 'and was shared by <strong>' + randyimage.sharedby + '</strong>');
		// add link to the source splot item page
		$('#furl').html('<a href="' + randyimage.link + '" target="_blank" rel="noopener noreferrer">' +  randyimage.link + '</a>');

	// Let's get some images!
	  url: splot_source + '/wp-json/splotcollector/v1/randy/1',
	  success: function(data) {
		// save the results in array we can use later
		splotstuff = data;
		// use function to update display
		} //success
	  }); //ajax

This was a good practice to do some basic random image fetching. The part I need to figure out next to make a pechasplot demo is figuring out in the WordPress code to create the custom API endpoint, how to have 2 variables in the URL (one for number of images to get and another to limit by tag).

Here the SPLOT truck? It’s full of random images to deliver.

Featured Image: Added SPLOT logo and some json code to The Super Green Lime Ice Cream Truck flickr photo by Señor Codo shared under a Creative Commons (BY-SA) license

Gravity Forms to ACF Pattern

When you use Gravity Forms to make a post, you can provision ACF fields but what I found was that the data wasn’t showing up correctly until I manually went and updated the created post. I tried using the WordPress wp_update_post() function but found that didn’t do it.

I ended up taking a look at the post_meta in the database directly.1 That’s something that I find myself doing more and more. When you can look directly at evidence, do that. Don’t assume. So what I saw was this . . .
Screenshot of Sequel Pro showing the metadata associated with the post that Gravity Forms created.
You can see that the base custom fields are there. The data is visible.

Now I hit update and refreshed the database view and saw lots of new custom fields get generated. This data associates the human readable fields with the field keys that ACF creates. Note the underscores which prevent those fields from showing up in the backend of WP even if you have view custom fields selected.
New view showing all the new metadata fields that get generated.

I feel like this has something to do with acf/save_post but couldn’t figure out how to make that work. When my knowledge fails,2 I resort to force.

First, I turned on the ability to see the field keys in ACF. It’s easy to miss and easy to forget that this is a Screen Option in WP.
Showing the screen option at the top of the page that allows you to see the ACF field keys.

Once I could see that clearly, I felt typing in all that junk would take a while and be a place where I could make dumb errors. So I cut and pasted the data into a Google Sheet and used my old text manipulation tools to build the function that would build the text I needed.


That was cut/pasted into the plugin and hooked to the after submission hook that Gravity Forms has.

add_action( 'gform_after_submission_1', 'asphs_update_post_content', 10, 2 );

That triggers this function and everything now behaves.

function asphs_update_post_content( $entry, $form ) {
    //getting post
        $post_id = get_post( $entry['post_id'] );
    $i = wp_update_post( $post_id );


1 I use Sequel Pro.

2 And many, many Google searches . . .

Please TRU Write With Me, I’m All Shiny And New

What’s wrong around here? It’s been maybe a month since I’ve blogged about SPLOTs. Some might speculate it’s the cold here, but quite the opposite, the hands have been very warm, working deep in the code.

There were some wild sparks when I cracked an issue in SPLOTs like TRU Writer, TRU Collector, and SPLOTbox that offer the front end rich text editor to compose stuff. Until now, the editor did not automatically embed media from sites like YouTube, vimeo, twitter, SoundCloud from a plain URL — the user had to trust it would happen.

With a bit of rummaging around StackExchange, it was a matter of enqueuing on more script on the page this was loaded on. For TRU Writer, in the part of the code where I add my extra scripts, we do one more if it’s the page with the writing form:

if ( is_page('write') ) { // use on just our form page
  // More functionality in rich text editor
  // h/t https://wordpress.stackexchange.com/a/287623
  wp_enqueue_script( 'mce-view' );


Woah, easy. And even better, one more option on the set up for the rich text editor, makes it so it supports drag and dropping media files to upload and insert them:

// set up for inserting the WP post editor
  $settings = array( 							 
  'textarea_name' => 'wText', 
  'editor_height' => '400', 
  'tabindex'  => "3", 
  'drag_drop_upload' => true, 

wp_editor(  stripslashes( $wText ), 'wtext', $settings );

Another feature was changing one css class in the template page, so the form is wider, giving more room to work in. But while fiddling there, I decided that some sites may want the wide column layout for content, so this is now a Customizer feature.

Choosing content widths in the customizer; it only affects screens larger than 740px wide.

There are a batch of other smaller fixes, layout cleanups. I created a few more options for the usage rights menu, and improved the display of the creative commons license (if used as a feature).

You can see (and try these out yourself) in the demo site http://splot.ca/writer

I was also motivated to get this in the mix for a fabulous new site created as a home for #femedtech.

Femedtech oer19 Open Space site

I was pinged by Lorna Campbell and Frances Bell a few weeks ago when they were setting up, and excited to see them not only make the SPLOT front and center, but to garner already a lot of guest writing.

Because I have access, I gave their site a beta test with the new version, Frances jumped right in.

The newest version is ready for you at https://github.com/cogdog/truwriter. And I am working with Reclaim Hosting to push out an update for any sites that made a site from their one click cpanel installer.

If you are wise to run your sites on Reclaim Hosting, you can get all of these installed in your domain.

If not, you will either have to roll up the sleeves and do the old school manual upload via sftp. Or there is the Easy Theme and Plugin Upgrades plugin that lets you upload a ZIP of the theme and have it update (WordPress still refuses to do this, you can install this way, but not update, pfffft). I wrote up some more details on SPLOT updates a few posts ago.

I’ve got updates coming with the same features soon on TRU Collector, and SPLOTbox — these need to be rigged up with a new approach to a preview/update/publish cycle.

It’s kind of shiny, at least to me.

Featured Image:

It’s One Thing to Talk About Accepting the FAIL…

The whole notion of learning from failure is a motivational speaker industry. And it’s been part of my messaging, just recently for a talk to education students at the University of Regina.

I often start technology talks with a promise that the technology will likely fail:

If it does fail, then I met my expectations. If it doesn’t then I have exceeded them.

Still sounds cliché, yes. But I firmly believe in the value of messing up in front, be it a presentation or teaching. It shows you are human. The problem is not in failing in public, it’s not recovering.

A favorite example was in the early MOOC days, when a Coursera massive course in online learning made a major fail, and they just folded up and went home.

At the same time, I was parallel teaching with Jim Groom a DS106 class in person at University of Mary Washington. This was pre Domains Of Ones Own; at that time we had students set up hosting on a service a colleague had enabled for us. The first week, after we got them to set up their first WordPress blogs, most of them ended up being hacked by some scoundrel named EMRE5807

Okay, so we had maybe 50 students, not 40 gazillion, but you know what we did? First was emailing students instructions on how to re-install WordPress (after the server admins plugged the hole, it was an old non-updated WordPress site on the shared server).

Then… well we made EMRE a character, a subject of our course. Someone (cough) made a twitter account that mocked us teachers. Memes were made. Emre5807 became part of the experience.

Letting go of your own expectation to always be poised, near perfect, in control, not failing is a great relief.

I got the full taste today for the Network Narratives course I co-teach with Mia Zamora.

This morning, I got a text message from Mia letting me know she was at the doctors office, very ill, unable to teach tonight. What do we do? Teach on.

We already had a plan set up and posted, plus a studio visit. The remote teaching was what I did all of 2018, via Google Hangout. We emailed one of our grad students, and Kelli was willing to try and get her computer connected to the class projector system. But at 20 minutes before class, she DM-ed a photo of the kind of cable she lacked on her laptop.

The English department office was tied up in a meeting. The option to borrow a VGA enabled laptop meant it had to be returned by 6pm (class goes til 7:15pm).

So the plan hatched 5 minutes before class- I made a short url for the hangout join link (it was for the hangout set up in advance for our guest visit), sent to Kelli, and we had students get in pairs, in the classroom, and be in the hangout.

This mostly worked (well some students on OS X laptops were forced to download a plugin) except for the audio feedback issue, so we had students mute their mic unless they wanted to speak.

It was enough to do the opening announcements, let them know we would be trying to run class like this. Then we invited in Brian Lamb, my friend, and guest for the Studio Visit. And we just rolled with it.

This was the unexpected bonus, having the students individually or in pairs, be inside the hangout. Usually we have the one laptop in class, and they are sitting away from it, harder to see and hear. Having them all in the hangout made it feel a bit more conversational (I thought) and while they maybe did not speak much (I asked for audio hellos) they took to being active in the chat.

It was a great free form conversation about the state of the internet and also the possible use of animated GIFs, maybe the best part was an impromptu question to all students at the end to say how they think GIF is pronounced.

That was only half the class. The rest was supposed to be mostly hands-on activity time; I found from my teaching remotely last year the thing that worked least was me talking a lot. So I like to make the time mostly activity.

The first was an ask for them to tweet a GIF they saw most recently, or shared themselves.

This was well played as it riffs off a comment Brian made in the earlier conversation.

The next activity was meant to have them look at some collections of less typical GIFs we had assembled, to find something interesting to share. This, well, slid by, they were still wildly sharing the first kind. But hey, they can do this latter activity later.

Then I tried an overview of the first activity, one designed to have them learn how to use Giphy to make GIFs from some YouTube videos we asked as the source material. But by demo failed, as loading the giphy create tool just came in as a black screen on my overheated laptop, so I talked through the screen shots I had made for the assignment.

I decided then to just overview the second assignment and then leave the remaining 45 minutes for them either to choose to go and do the work at home, or stay and work through it or ask questions.

Nearly all just stayed. I think I had to tell them to stop at the end of class. They reported that giphy was stalling for them too. So we quickly tried shifting to using a similar video to gif tool at gifs.com (which I found to be more flexible!). We ended up making gifs about giphy fail.

It was both chaotic and exhausting, but we all went through this together.

Technology will always let you down, the sooner you are okay with that, and can keep juggling, the better. It took me a while to get to this place, I lived in fear of the FAIL.

Letting the FAIL get you is worse than the FAIL itself.

Image credit: Meme image found at Saying Images, created on memegenerator.net author unknown.

Clean Up the Playground WordPress Plugin

I looked around for a WordPress plugin that would delete content every X hours and didn’t find anything. It may be this is a strange desire or I could be bad at searching but in any case I built something to do that.

The idea I had was that people in a multisite environment could try out sites and get a good feel for how the plugin/theme would work but without the barrier of adding it to their site or creating an entirely new site.

The plugin also creates a page that has the shortcode on it which will trigger the cleansing manually.


I assume we’re going to delete all the content that wasn’t created by the admin. That lets us leave some directions and some demo content if needed that will persist after the site is purged of content.

I figured we’d auto-add people using the Join My Multisite plugin and setting the user to editor or lower. It might make more sense to create a custom role and/or restrict the ability to maliciously or accidentally change the author of content.

I used wp_schedule_event and set the refresh at every 24hrs.

I am only deleting pages, posts, and media. I haven’t gotten around to finding/deleting custom post types.

Plugin Name: Playground Cleaner - 24hr deleter of non-admin users and content
Plugin URI:  https://github.com/woodwardtw/playground-cleaner/
Description: delete non-admin users and content every 24 hours, use in conjunction with join my multisite or other way to add users
Version:     1.0
Author:      Tom Woodward
Author URI:  http://altlab.vcu.edu
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Domain Path: /languages
Text Domain: my-toolset

defined( 'ABSPATH' ) or die( 'No script kiddies please!' );

function get_users_and_destroy_them(){
	$blog_id = get_current_blog_id();
	$args = array(
	'role__not_in' => array('Administrator'),	//leave the admins alone
	$users = get_users( $args );
	foreach ($users as $key => $user) {
		echo $user->ID;
		$posts = new WP_Query( array( 'author' => $user->ID ) );
		remove_user_from_blog($user->ID, $blog_id, NULL);

function get_content_and_destroy_it($user_id){
	$args = array(
		'author' => $user_id,
		'post_type' => array('post','page','attachment'),// add foreach ( get_post_types( '', 'names' ) as $post_type  to deal w custom post types - also attachments
    	'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash'),    
		'posts_per_page' => -1,

	$the_query = new WP_Query( $args );
	// The Loop
	if ( $the_query->have_posts() ) :
		while ( $the_query->have_posts() ) : $the_query->the_post();
			if (get_post_type() === 'post' || get_post_type() === 'page'){
			  wp_delete_post( get_the_id(), TRUE );
			if (get_post_type() === 'attachment'){
			  wp_delete_attachment( get_the_id(), TRUE );

	// Reset Post Data


add_shortcode( 'destroy', 'get_users_and_destroy_them' );

//only show your own posts/pages in admin land
function posts_for_current_author($query) {
    global $pagenow;
    if( 'edit.php' != $pagenow || !$query->is_admin )
        return $query;
    if( !current_user_can( 'activate_plugins' ) ) {
        global $user_ID;
        $query->set('author', $user_ID );
    return $query;
add_filter('pre_get_posts', 'posts_for_current_author');

//make a page that allows you to manually delete by visiting the page and stores the hours for the cron job

function make_destroy_page(){
	} else {
		$my_post = array(
		  'post_title'    => 'destroy',
		  'post_content'  => '[destroy]',
		  'post_status'   => 'publish',
		  'post_author'   => 1,
		  'post_type'	=> 'page',	
		// Insert the post into the database
		$post_id = wp_insert_post( $my_post );
		update_post_meta($post_id, 'destroy_content_pattern','48');

register_activation_hook( __FILE__, 'make_destroy_page' );

//make it run every 24 hrs & deactivate if plugin deactivated
register_activation_hook(__FILE__, 'scheduled_purge');

function scheduled_purge() {
    if (! wp_next_scheduled ( 'my_scheduled_purge' )) {
	wp_schedule_event(time(), 'daily', 'my_scheduled_purge'); //change back to daily 

add_action('my_scheduled_purge', 'get_users_and_destroy_them');

//turn off purge if plugin deactivated
register_deactivation_hook(__FILE__, 'purge_deactivation');
function purge_deactivation() {

1 Acknowledged laziness.

Weekly Web Harvest for 2019-03-17

Springtime Answers!

A question or even several of them, surreptitiously, slyly sent my way via a blog post. Even cleverly using my own photo as a featured image.

“Well played, my friend.” was my comment in response.

Alas, the algorithm remains #NotMyFriend.

Some answers…

  1. Yes, the frequency needs an increase from very infrequent, to something more quasi-frequent. And the 20 minute rule remains in place, and shall be broken.
  2. I’d be happy to serve up some SPLOTs for your inf115 class.
  3. A Una foto cada día fest? I’m in. I should help you update the theme too, got some new features.
  4. Let’s bash Instagram for being wiping out you class pix. We disdain its false regulations.
  5. Medium’s price is your freedom? Don’t cave it. All you need to do is wipe your cookies at the door.

So the response here, is “as soon as we can!”. Operators are standing by.

Featured image: Snagged a screenshot from Antonio’s instagram feed, he’s not posting much to flickr (and he ought to maybe change the default license on his images there?). For yes, there is a wild beast on his path:

View this post on Instagram

Wild beast on my path.

A post shared by Antonio (@avunque) on

Is this the same freshman I saw on campus in 2016?

Springtime Answers!

A question or even several of them, surreptitiously, slyly sent my way via a blog post. Even cleverly using my own photo as a featured image.

“Well played, my friend.” was my comment in response.

Alas, the algorithm remains #NotMyFriend.

Some answers…

  1. Yes, the frequency needs an increase from very infrequent, to something more quasi-frequent. And the 20 minute rule remains in place, and shall be broken.
  2. I’d be happy to serve up some SPLOTs for your inf115 class.
  3. A Una foto cada día fest? I’m in. I should help you update the theme too, got some new features.
  4. Let’s bash Instagram for being wiping out you class pix. We disdain its false regulations.
  5. Medium’s price is your freedom? Don’t cave it. All you need to do is wipe your cookies at the door.

So the response here, is “as soon as we can!”. Operators are standing by.

Featured image: Snagged a screenshot from Antonio’s instagram feed, he’s not posting much to flickr (and he ought to maybe change the default license on his images there?). For yes, there is a wild beast on his path:

View this post on Instagram

Wild beast on my path.

A post shared by Antonio (@avunque) on

Is this the same freshman I saw on campus in 2016?

Silly Media Offered at 24th TCC Conference Teaser Session

Yesterday I had the fun opportunity to talk about attributed and possibly [semi] serious use of the kinds of media people see/share all the time.

Animated GIF man shaking head side to side with text above "Do We Need to Explain What this is?"

This session was a free pre-conference teaser for the 24th annual Teaching, Colleges and Community (YCC) conference.

That’s right, 24… and it’s still being organized by the very people who did the first one, Bert Kimura and Curtis Ho from the University of Hawaii. Maybe the best little free online conference you have never heard of.

Before I go silly, I have to do my web paleontology act to dial back to a League for Innovation conference in 2003 where this smiling man named Bert asked to talk to me about the conference. At that time, the acronym as aimed at Community Colleges, and as I was doing instructional technology work at the Maricopa Community Colleges, he gently pitched the idea of getting Maricopa to participate at an institutional level. This meant I got my office to pay a single registration fee, and any employee could take part of the online conference at no cost to them. It was a fabulous PD opportunity to offer, and we got to joke about sending so many people to a conference in Hawaii (meaning they did it from their office).

Since then…

I decided in December, when the call for presentations for this year’s TCC went out, to submit a presentation- it’s actually going to be a revisit of the 2004 one and see where we have gone in 15 years in terms of communicating with shared photos.

So… when Bert and Curtis approached me last month asking if I would do the free pre-conference session they offer in March, I of course had to say yes. They said I could do the same talk, and I of course declined that offer, and pitched my silly idea.

The interest in “doing more” with media we see as entertainment (or worse) in social media goes back of course to many things DS106, but more to the studio sessions we did for the UDG Agora project- Brian Lamb led one on Meme Media: Attention-Grabbing Images And Animated Gifs and I did one one on Making Short Form Videos. It’s been a part of Networked Narratives (2017-2019). And I did a first run of Affordances of Silly Media for a group of mostly community center leaders in Melbourne Australia during my ISS Institute fellowship there in 2017.

I had lots to draw on. The platform for TCC was Adobe Connect, a platform I have not seen since leaving NMC (before 2011 then). Honestly, it’s not changed much since. I had to provide “slides” for them to upload, which of course meant, none of the GIFs moved, I just had to describe them moving and provide links (and twice during my talk Adobe Connect went down in a beach ball spiral of doom).

I thought I had packed way too much in, the Keynote presentation was 25Mb for 65 slides, many meant for fast flipping. I must have talked fast, as I got through on about 40 minutes.

We had a great audience, with folks I could see during intros from across the US, Canada, Japan, Greece (where it was 2am apparently), and even a colleague from Canberra who saw me present there in 2007.

Anyhow, I have the slides and a whole bunch of links (a lot) over in my Presentation show room

A meme image of "Grandma discovers the internet" with text "This can be serious"

And a recording of the silliness is available on the conference web site.

At least four people took up the challenge during the talk to make meme images about TCC; thanks so much to the always eager and excited Cynthia Cologne for making and sharing them.

And thanks of course to Bert and Curtis and his TCC team plus Rebecca and John Walber from Learning Times for helping run the show.

If you are looking for a great online conference experience, check out TCC in April. The theme this year is “Sustainable Learning, Accessible Technologies, & Diverse Contexts.”

Technology, Colleges and Community (TCC), is a worldwide online conference attended by university and college personnel including faculty, research associates, academic support staff, counselors, student services personnel, students, and administrators.

Join our 24th edition of this annual event to share your expertise, experiences, and knowledge relevant to the use of information technology in learning, teaching, innovation, and academic services. This event is very helpful and “friendly” to novices. It provides you with a strong foundation about teaching and learning with modern technologies.

Featured Image: TCC2019 Meme made at imgflip using the Distracted Boyfriend pic.