@ontarioextend Domain Camp Preview

Even while preparation falls into place, it was due to to put out a promo video for another round of Ontario Extend Domain Camp.

In the first year of the project, Domain of One’s Own was a component of this provincial-wide program to empower educators with a learning-focused approach to technology integration.

While not required at all to complete the program, we still feel it is the route educators ought to aim at, to be free of the hidden data costs of free services, as well as not be limited to the capabilities of free platforms.

But learning to manage a domain, navigate the array of cpanel tools is a lot to take on. Last summer, we ran an informal series of activities over the summer. For four weeks we offered things to do from the Activity Bank aimed to cover the basics of domain management, setting up a landing page, installing WordPress a few times, and exploring the other apps available. Then we added a few more specific weeks of WordPress focused activities. I’ve moved them off the main page as they will need some updates, but if you like to see the whole program, see the 2018 Domain Camp pages.

So we are revving it up again this year, see the invitation where you will also see a signup form. Camp is open to anyone interested in following along.

The format is simple- a weekly new page added to the site, an offer to drop in for open office hours, and a community space to connect. The hope was also to have people use the Reclaim Hosting Community Newbies Corner as a place to get help from each other (and they are so nice, you can join there even if you are not a client). This year we will also offer a channel in our Slack for campers.

I cannot claim that all of this will make you a Domain Master- it only happens over time with regular effort, occasional breaking things. And I acknowledge it’s not for everyone; what is more important is that you find and use a place to publish and share your ideas.

It’s for people new to domains our those who have spun one around a while. The first thing, will be of course signing up to register a domain name and a web hosting account, so there is some stake in the game called for.

And if this helps, the rumors are true… the eCampusOntario wizards are at work developing a Camper badge for those that complete the basic activities, and even, maybe, a counsellor badge for those who provide support to others.

It gives me a chance also to be goofy once a week on video… yes, the camp setting was my back yard. I was hoping you could hear the bird sounds over the wind.

Regardless, stay tuned for a launch around June 11, stay tuned to us on twitter and also https://extend-domains.ecampusontario.ca/camp

Super Secret Journal Posts

Origin Story

Let’s say someone wanted people to write down very personal, very sensitive thoughts about privilege, bias etc. They’ve turned down Google Docs as an option because they heard that people can see that. They want this even if you’ve said that writing down secrets at all is not a good idea and that writing them anywhere digital, let alone the Internet, is a very bad idea.

So with that said, I think this is a pretty decent way to write stuff that’s only visible to the author and to the administrator of the site. It creates a custom post type called journal and then shuts off every thing that I think allows public access. Take note of the comments below and if you see anything I’m missing let me know.

 $args = array(
    'label' => __( 'journal', 'textdomain' ),
    'description' => __( '', 'textdomain' ),
    'labels' => $labels,
    'menu_icon' => '',
    'supports' => array('title', 'editor', 'revisions', 'author', 'custom-fields', 'thumbnail',),
    'taxonomies' => array(),
    'public' => false,//become super secret 
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_position' => 5,
    'show_in_admin_bar' => false,
    'show_in_nav_menus' => true,
    'can_export' => false,//no exports
    'has_archive' => false,//no archive just in case
    'hierarchical' => false,
    'exclude_from_search' => true,
    'show_in_rest' => false,//not in JSON
    'publicly_queryable' => false,//can't query it
    'capability_type' => 'post',
    'menu_icon' => 'dashicons-lock',//make a lock icon
  );
  register_post_type( 'journal', $args );

I also threw this in here in case it somehow did get public somewhere. It filters content when it’s a journal post type and makes sure you’re the owner or admin. If you turn on some of the public stuff, this would still keep things pretty private.

function secure_the_journal($content) {
  // assuming you have created a page/post entitled 'debug'
  if ($GLOBALS['post']->post_type == 'journal') {
  	$current_user = get_current_user_id();
  	$author = $GLOBALS['post']->post_author;
   	if ($current_user === $author || current_user_can('administrator')){
	   	return $content;
	   } else {
	   	return '<h2>This content is private.</h2> <p>You will need to be the content owner and <a href="'.wp_login_url().'">logged in</a> to access it.</p>';
	   }
  }
  // otherwise returns the database content
  return $content;
}

add_filter( 'the_content', 'secure_the_journal' );

Building an ACF-Based Grade Book Plugin in 30 Minutes or Less

Origin Story

Kathy asked me if I had any grade book plugins that they could use with a faculty development course. The goal was to show faculty where they were in the course. I knew I did not wish to use Learn Dash for any number of reasons– grade book module costs extra, grade book module is super awkward, learn dash requires a fresh multisite install etc. I also had WPLMS from a few years ago when I think Jon asked to try it out. This felt pretty bloated for what we wanted and it wasn’t entirely obvious if it had a grade book in any case. The WordPress plugin repository shows three plugins and the most up to date has not been updated in 3 years.

Not a cheerful landscape. I wondered what it would take to build an ACF-based grade book relying mostly on the repeater field and simple shortcode for displaying the grades to the user. I wasn’t looking to do math or anything. I just wanted a pretty simple interface and a way for users to see their information while administrators could see all the content. That does require people to have accounts and be logged in. A bit of hassle but there is no free lunch.1 This grade book isn’t adding up things or doing weird weighting etc. It’s just a simple way to log people + assignments + scores.2 It is now known as progress book and it lives on github.

The ACF Side

We can do just about everything I can think of with one repeater field as the parent. The sub-fields will be the participant’s name, the assignment name, and the score on a scale of 1 to 100. Since we’re requiring participants to be member of the site, the participant field will be a relationship field tied to the site users. That makes the list of students automatic and makes for an easy way to recognize them when we want to show them their progress. The assignment field is a select field that has the assignments pre-populated. You’ll have to go into ACF to add assignments which isn’t optimal but the only field that lets you add choices in that interface is the checkbox field. That ends up taking up too much room if you’ve got 10 or so assignments. In this case, we should know the assignments ahead of time and even if alternations are needed, adding them via ACF is pretty straightforward. The final piece is just a slider using the range field.

That’s it. Maybe ten minutes of work with the majority of it looking at the assignments piece and trying to find a slightly nicer way to add custom values on the fly. You end up with an interface like the one below that I set to show when a page is called grade book.

One other nice piece I added was the json sync function for the plugin. It takes an extra step compared to doing this in a theme but it keeps your ACF fields nice and sync’d between development and production. This is very handy and prevents all kinds of hassle.

//ACF JSON SAVER
add_filter('acf/settings/save_json', 'my_acf_json_save_point');
 
function my_acf_json_save_point( $path ) {
    
    // update path
    $path = plugin_dir_path( __FILE__ )  . '/acf-json';
    // return
    return $path;
    
}


add_filter('acf/settings/load_json', 'my_acf_json_load_point');

function my_acf_json_load_point( $paths ) {
    
    // remove original path (optional)
    unset($paths[0]);
    
    
    // append path
    $paths[] = plugin_dir_path( __FILE__ )  . '/acf-json';
    
    
    // return
    return $paths;
    
}

Displaying Grades Shortcode

The following chunk of PHP is how we display the ACF data on the front end. It’s tied to a shortcode and builds a little table-like display and uses a tiny bit of logic to show either just your stuff if you’re not an admin or all if the stuff if you are an admin– current_user_can(‘admin’) || get_current_user_id() === get_sub_field(‘student’).

function get_progress_by_user(){
		$html = '';
		if( have_rows('progress') ):
	 	// loop through the rows of data
		$html .= '<div id="your-progress" class="progress-row"><div class="progress-title">Name</div><div class="progress-title">Assignment</div><div class="progress-title">Score</div></div>';
	    while ( have_rows('progress') ) : the_row();
	    	if (current_user_can('admin') || get_current_user_id() === get_sub_field('student')){
		    	$stu_id = get_sub_field('student');
		    	$name =  get_userdata(get_sub_field('student'))->display_name;
		    	$safe_name =  sanitize_title(get_userdata(get_sub_field('student'))->display_name);
		    	$safe_assign = sanitize_title(get_sub_field('assignment'));
		        // display a sub field value
		        $html .= '<div class="progress-row ' . $safe_name . ' ' . $safe_assign .'">';
		        $html .= '<div class="progress-student" data-student="' . $safe_name . '">' . $name . '</div>';
		        $html .= '<div class="progress-assignment" data-assign="' . $safe_assign . '">' . get_sub_field('assignment') . '</div>';
		        $html .= '<div class="progress-grade">' . get_sub_field('grade') . '</div>';
		        $html .= '</div>';
		    }

	    endwhile;

	    return $html;

	else :

	    // no rows found

	endif;

}

To make things a little easier to parse for the admins, I added a little javascript that lets you click on a participant name to hide everyone else or to click on an assignment name to hide all the other assignments.

if (document.querySelectorAll('.progress-assignment')){
	document.querySelectorAll('.progress-student').forEach(function(el){
	  el.addEventListener('click', function() {
	    hideStudents(this.dataset.student);
	  });
	});


	function hideStudents(theStudent){
		let names = document.querySelectorAll('.progress-student');
		names.forEach(function(student){
			console.log(student.dataset.student)
			console.log(theStudent)
			if (student.dataset.student != theStudent){
				student.parentNode.classList.toggle('hide-stu');
				
			}
		})
	}


	document.querySelectorAll('.progress-assignment').forEach(function(el){
	  el.addEventListener('click', function() {
	    hideAssign(this.dataset.assign);
	  });
	});


	function hideAssign(theAssign){
		let names = document.querySelectorAll('.progress-assignment');
		names.forEach(function(assign){		
			if (assign.dataset.assign != theAssign){
				assign.parentNode.classList.toggle('hide-assign');
				
			}
		})
	}
}


1 That’s actually how I measure how bad an experience will be. If they’re willing to give you free food as bait . . . expect the worst.

2 It wouldn’t take a ton of work to figure all that out but I’m not going to encourage the facade that grading requires that kind of complexity. It’s like building a custom kitchen so you can keep making instant noodles. All the fancy math in the world isn’t going to fix the fact that assessment is fundamentally broken.

Two Great WordPress Taxonomies That Link Great Together

Leave it to diabetic to use a sugary metaphor to a candy slogan.

Okay, WordPress, you have these two ways to organize posts, Tags and Categories (yes, there are more than “uncategorized”). I’m working on a new project where I am going to not have my usual freedom for custom theme coding, so I am finding all the things I can do within the box.

I have a Category taxonomy with 3 items, each with 10 sub items. But I am going to need ways to list posts also within each ones as “recommended” or “optional.” I was wondering about ways of finding posts with a category AND a specific tag.

Were I coding, doing a custom query would be a snatch.

And this little thing I found will work as a link, but not much else, but seemed like something worth noting.

So I have a category link on this here blog for WordPress cayetorized posts – https://cogdogblog.com/category/wp/ and by the time I publish this one, there will be 180 posts there.

But I can add a second query parameter via the URL to get posts categorized WordPress and tagged splot like this (41 results) https://cogdogblog.com/category/wp/?tag=splot

And when this one gets published! https://cogdogblog.com/category/wp/?tag=peanutbutter

Just by playing with URLs you can get slices of taxonomies across the two kinds WordPress gives you.


Featured Image: Image by pixel1 from Pixabay

Space for More Spaces

It’s rather telling that my search for “information abundance” is dominated by results with “Information Overload” in the title. This was my effort to find an opening to write about a friend/colleague’s desire to create a new online space.

This first hint of this came upon email notifications of what I missed in Mastodon. I have a number of colleagues who have found a home there more communal than twitter. But frankly I don’t check in very often. It’s not a platform difference, it’s just that I find very little time to engage in yet more conversation spaces.

In fact, I’ve been so buried in trying to get my work projects done, I’ve kind of slipped even out of twitter for a while. Heck, I had not even posted photos to flickr in more than three weeks, and the day I decided to post my catch up was the day flickr was down for their but cloud migration, and it took about 5 rounds just to updated.

And this blog too has sputtered to a stall. I have stuff to write about the wrap of #netnarr and a handful of more posts that just reside on open browser tabs.

Back to the topic. Geoff Gevalt had posted… er “tooted” in Mastodon about his idea to create a community space for artists. One free of the short length limits of social media as well as the trappings of views/favorites that drive behavior there (I have enjoyed Geoff’s recent sharing of photos and short story captions in Instagram) There was banter among quite a few people I knew, but Geoff had also reached out to me via email.

But you see, he had written fully about it in the space I think matters most- his own blog.

And from the perspective of an artist on his third lifetime — that is I write in the mornings (usually) and take pictures in the afternoon (usually) — I want a way to connect to people, to get feedback, to gain perspective and, and, and … to learn from others. It was how newsrooms worked. It was how journalism worked. And it was how the Web did, could and still can work.


I tire of the relentless push to get followers or reactions or some sort of response on Instagram, Twitter, Facebook and even Mastodon. Overall, a sincere waste of time offset by some of the links that I have followed to see work and ideas and writing and visual art and ideas that have been astounding. Uplifting.


But how does it relate to what I struggle with?


I suspect I am not alone. I suspect that, given that making art is a relatively solitary enterprise (even for actors and musicians and performance poets) having a community to connect with is a good and positive thing. It helps climb out of our own skin, to gain perspective, to see other ways of doing things, of resolving problems, of trying something we do not know how to do.

And Geoff wants to devote his tireless energy to trying to make this space, pretty much trying to start with the platform he built for his long running Young Writers Project.

I certainly do not see Twitter, Mastodon, Instagram as being “the place”, the conversations there, connections, enable the discovery of people worth “spacing with”… but my first thought was, do we really need another space?

And then I felt a bit like a cranky old person.

I still hold on to the idea that those old archaic, pre-social media constructs, a personal blog, is the main place, the home, to operate from. There are no limits or controls of corporations or data selling. What’s missing is people attending to them, we;ve been pretty much driven, led, or on our own, decided to spend most of our attention economy in the big spaces. Not to be shut in and never leave, but all the other spaces are somewhat secondary, maybe we visit often.

I’m not looking for the ideal space, to me it’s the entire internet. I wish to be above, to transcend, to hop across spaces (and we all do, unless we are talking about people who equate the internet with facebook).

The thing is, whenever I see a “gg” icon or ggevalt username, I expect the Geoffness I have gotten to know there. You see it was a mutual friend/colleague, Barbara Ganley who connected us, and got to meet Geoff at her house, leading to a visit to his house, and staying up int he freezing cold watching him process his home made maple syrup (which he has several times mailed by a jar of the precious stuff), we have collaborated on mutual projects.

All of this depends on multiple spaces, not one ideal one. And likely I am mis-stating Geoff’s intent, getting it wrapped up in my own angst of never enough time to follow all my interests.

But it’s exactly because of this shared, multi-spaced connections with Geoff, that I even set up an account on his new space, look around, make a post.

Do we need more online spaces? Sure why not, it’s certainly a bit better than spending our mind energy in scroll, click, favorite spaces. Will I be able to spend a ton of time there? Likely not.

It’s not the features of the space that would draw me, it’s the hospitality and shared stories with the person behind it. So where ever you go, rather than focus on the reads, views, likes, analytics, I suggest focus on making more meaningful, real connections.

Ok, Geoff, I’m in. Now you get to hear my complaints about drupal!


Featured Image:

Weekly Web Harvest for 2019-05-19

Weekly Web Harvest for 2019-05-19

At the Arts Gala: Making Stories with Sound

(Wow, is there ever a backlog of overdue blog posts. I’m giving myself demerits for tardiness).

Maybe my favorite media thing to teach is audio editing, because it’s typically fat from most people’s experiences. With an offer from Cori to do a session at the Arts Gala event for the Prairies South School Division, I had the chance to bring this as a workshop to high school students who gathered recently at the school in Gravelbourg.

I came with a back of random objects and way too many things to cover; we ended up doing about 30% of what I had prepped… and it was wonderful at that.

Part of the challenge was not being completely sure of the technology available, but that played out well as the classroom I used had a cabinet of laptops. Because no software could be installed, I had tried out a few different web based HTML5 recording and editing apps– nothing gives all the features of Audacity, but they served us well.

I prepped all the materials in a Google Slide show available at http://bit.ly/arts-gala-sound

What was in there includes:

  • An opening question of what is sound, like physically. I used the metaphor of a rock tossed in a pond (which worked well as the students sat in a semi circle), asking what is the difference between a big rock tossed in, and how water waves travel.
  • I ask them next to take a minute of silence to notice every possible sound, from most to least obvious. The idea is to have them consider how sound is layered, that we never have an absence of sound, and how it subtly gives a suggestion of the setting.
  • What does digitized sound look like? (introduction to waveform), to show them that like words in a document, sound can be edited by the same commands of copy, cut, paste, that we apply formatting to it (by effects). I had them do some recording in TwistedWave Online, a fine simple audio recorder with a few effects. They ended up spending a good chunk of time in this, starting with very simple sounds and applying crazy effects (one of them used my voice, others made seed sounds with finger snaps, and tapping in front of the mic). Here is a montage of the sounds created in both sessions:
Sounds created by high school students, for nearly all, the first time they had done anything like this.
  • I then introduced them to the world of Foley artists with a short overview video. I always love this as most people have no idea that nearly all sounds in movies are added in post production, and while digitally edited, the sounds are all generated by recordings of real objects. I ask the students to do a short version of this by watching the first minute of a Charlie Chaplin silent film clip (from Into the Lion Cage), first asking them to identigy what sounds might be needed, and asking them each to choose to make the sounds (from the box of stuff I brought in, metal things, wood blocks, cloth, etc). We then do a run through to practice, and on the second time I record the audio. I was so impressed with how much the kids got into the creative part of making the sounds and then getting the timing down. I managed to miss the recording of the first session (sorry! operator error) so this re-edit has the foley sounds created by the second group.

And that was pretty much the end of time. They were so into the editing in the first part I did not want to stop them just in the name of an agenda. Quite a few of them managed to import tracks from YouTube and elsewhere without me even explaining how or got inventive by recording from the playback from their smartphones/

What did not get done was the activity I like doing, the old DS106 throwback of the five sound effect story where the challenge is to create a story by editing together five sounds (either downloaded or generated), but no spoken voice. I typically like using this to teach Audacity skills of layering multiple tracks. That would not have been easy in web based editors, but the Bear Audio Editor was good enough for sequencing sounds together- and it had nice features for importing audio from YouTube.

And we did not even get close to playing with a few web-based musical instruments– I imagined hearing a crazy round of sounds from these ones:

This was a ton of fun for me, and it seemed like the kids in the room had a good play at being creative in ways that were new to them.

You can hardly go wrong asking anyone to generate sounds, especially with license to go zany.

Thanks Cori for setting this up for me and thanks to the Arts Gala participants who showed up for a session likely not knowing what they were getting into.


Featured Image by rony michaud from Pixabay

Weekly Web Harvest for 2019-05-12