Google's Accessibility Menu Isn't as Accessible as It Could Be

Profile on a face with sound waves depicted from the mouth

When Google announced the Accessibility menu in G Suite I was excited for the various possibilities of this tool. My focus was on the screen reader. We all learn best in various ways. Accessibility tools shouldn't be considered just for those with special needs they can benefit all of us. Screen reader allows document text to be read back to the user. It also verbalizes the menus and actions the user is taking on the screen.

Image of the Tools menu with Accessibility Settings highlighted at the bottom
 Accessibility menu with Turn on Screen Reader Support checked off and Turn on collaborator announcements turned onImage of the accessibly menu

While I conducted a training the Accessibility menu was asked about. I hadn't previously had the time to explore it. The menu had just appeared on the school's domain teacher thought it could help a lot of students with various tasks. I was on my Macbook Pro and turned on the accessibility screen reader, "Speak" ...nothing. Teachers were on various PC's and turned on their Speak from the Accessibility menu. Again, nothing. I had to move on with the training but aimed to circle back and explore it in my own time.

What I've found is that the Accessibility menu relies on the native device features to work with the Chrome browser. Mac relies on VoiceOver. PC relies on NVDA. Chromebooks have ChromeVox built-in.  The menu assumes there is already a screen reader installed on the system and being used rather than providing a quick and easily accessible functionality switch.

My expectation and the teachers' I was training expectation was to turn on the screen reader as we turned on accessibility. Unfortunately there is a whole install and enabling procedure which complicates use for many schools due to how they are setup. Extensions for Chrome browsers are often turned off for schools with Macs and PCs. Chromebook users have it easier with the ability already setup on their operating system. The ChromeVox extension is recommended, however there's no way to turn it on and off.

Instant screen reading is what was expected but the difficulty in engaging with the Accessibility menu had me look else where for options. The menu is intended for full screen reader ability in the Chrome browser. What the teachers needed was a way to have text read back. This is a different level of accessibility from what the Accessibility menu provides. I pulled up an extension I've used with English language learners called Read Aloud: A Text to Speech Voice Reader. The extension allows more reading control and highlighting of text with voice selection.

To further complicate usage of Accessibility tools there is a long list of complicated key stroke combinations to access various elements on the screen. If you have ever had the change to unlock a secret level through some button clicks on your controller Accessibility is very similar. You don't unlock a hidden level after pressing Ctrl+ ⌘ + Shift + N you just move to the next table. The list of these key codes is immense and requires further memorization to take advantage of. Such elements create further barriers to accessibility. There is also no access to customize such key codes to accommodate a user. We really need to rethink how we provide access to elements on the screen.

I applaud Google for including Accessibility features in the G Suite, but I'm ultimately disappointed in how the Accessibility needs to be setup, the lack of simple controls and transparency for usage. Don't expect to turn on the Accessibility Menu and find things accessible. Ultimately we need to provide users various levels of accessibility and accessibility needs to be easily accessible and adaptable for all.


Don't Talk At Me, Talk With Me

Insufficient permission
I had an opportunity to attend the Google Cloud OnBoard ML yesterday in NYC. My expectations were an introduction to the Google Cloud, some Machine Learning, and a bit of a sales pitch. I expected to walk away with some minor new skill in doing a linear regression on Google's Platform. What I walked away with was a clear experience of what education should not be. Even as a theatrical experience it should not be what Google gave us. Large companies would benefit from engaging with life long educators on how to model and connect with other during their events.

On arrival I set myself up at a hightop to do some work. It wasn't long before a Googler was engaging some attendees behind me. Of the three being chatted up there was a vast range of skills sets with their experience in cloud technologies and machine learning. One had no experience, another had played with cloud products and another had run some machine learning with scikit-learn. This was a good snapshot of what I saw the rest of the day; various skill levels with a common interest to learn and know more about machine learning.

The event started in a large ballroom with close to 1000 of us seated at thin tables facing a presenter and two large screens. This was my position for the majority of the day. A brief video was presented on organizing data and machine learning. Then a kickoff by a customer relations manager. All a basic intro with housekeeping format to begin the day. This degraded educationally from here.

ROITraining lead the training elements of the day. The format was a lecture that almost wanted to be socratic but failed in a large room. Followed by a demo that moved so fast if you wanted to follow along on your own terminal you needed to have an understanding of what was being demonstrated before the demonstration. This went on for six modules with lunch and a break in between.

While I soaked up the knowledge of the Google infrastructure and gained a better understanding of how the cloud worked there wasn't an opportunity to try the skills presented or anyone easily accessible to support when stuck. The intention is to "on board" the users to machine learning on the cloud. What I experienced was being talked at for a day.

Teachers capitalize on the basic fact that students show up everyday to learn something. Often not all students want to be in the classroom learning. Large events such as what Google offered provide rare opportunities of a filled space of eager learners. When you have that level of attention on a topic of product every moment counts. Engage the learner, build connections, and develop entry level skills. Avoid a chalk and talk scenario.


  • Provide opportunities for intimate questions or anonymous questions. Have a back channel going. a place for some one to ask that question they don't want to feel stupid for asking publicly or wasting time on. 
  • Setup sections for various levels of support help. Provide the support for that section. 
  • Direct attendees to live help in the moment. You have me in the room now. Don't direct me to an online course. I would stayed at home and done in. 
  • Connect members in similar and diverse fields. Such similarities and diversities can solve more problems when connected than apart. Create the opportunities for connections. 
  • Talk with me, not at me. You have me present engage me. Work with me. Provide opportunities for me to explore and be successful under your guidance. 
  • Give immediate reference resources. Don't assume everyone knows how to begin a demo. provide the lowest level documentation or be clear about prerequisites. 
I've been in many effective classrooms. The most effective for older learners provide autonomy to the learner with direct facilitated support and easily accessible resources. Consider the least skill level in the room and provide ways for them to be successful and grow. 

Authentic Technology Learning Experiences


Education is full of flashy tech tools to help students grasp concepts. Many are very effective at the goal. Some are just fun to play with. But which tools offer experiences students will encounter in the real world? How is learning with technology relevant and authentic to their lives? 

When choosing educational technology we rely on the SAMR , TPACK, and Bloom’s Taxonomy models to guide us. The goal when implementing technology into education is to support student learning. While these models influence the learning experience it’s also important to keep it grounded in reality. Tasks can be modified for real world scenarios. We’ve all heard or said the phrase “where am I ever going to need this?” The internal response is “the state test that measures how well you are doing at ‘school’”. Realistically where do we use calculus in our daily lives? 

Technology just to teach a concept is less effective than using it for authentic learning opportunities. When the experience is realistic and the outcome is meaningful the learner is more engaged it the task. Surrounding a project with opportunities for learning enhance and deepen the learning process. Making the project authentic with industry standard tools creates a meaningful experience.

When we look at educational technology for use in our classroom it’s also important to ask where and how is what we we are choosing to use being used in the real world. How can we provide an authentic experience to students? To do this we can follow this flowchart:


Using authentic technology tools works best for authentic experiences. If students can work cross curricular on a particular project supported by a full school community the experience can be much more meaningful and engaging. This level of project based authentic learning requires a strong collaborative community.

Vlogging to Support the Writing Process


Kids vlogging
Vlogging to support the writing process.

Learning how to write a well crafted paper can be a frustrating process for many students. It can be just as frustrating for teachers teaching students how to write an essay. Vlogging can help students to structure thoughts and provide a framework to build off. I've created some slides to support the process with iMovie.

I was recently asked to provide a short workshop for an Apple related “unconference” event. It allowed me the opportunity to put down ideas I had regarding digital media and teaching writing. I chose to explore the use of vlogging when teaching writing. I chose to use Casey Neistat as my example. You may know him from “Bike Lanes” https://youtu.be/bzE-IMaegzQ Being in NYC I needed a vlogger students could connect with while also getting something academic out of the content. Casey had vlogged on a recent event “Living in NYC during a Crisis”. Looking at the Vlog I could identify the main parts and connect the pieces quite clearly to an essay format. It also didn’t hurt that he had a video on “How to Vlog like Casey Neistat”.

Students can often feel intimidated by the written word. They may struggle putting it down on paper. Frequent student concerns are about word choice, spelling, punctuation, grammar, etc. It can be frustrating even thinking of what write. 

Fortunately vlogging can help to make this easier. Students can concentrate on the structure of what they want to say. It’s easy to take a recording and make corrections. Students can record a point or section at a time and put it back together like a puzzle. Many think when we write we have to start at the beginning. It can be made very clear with a vlog that students can start at any point. 
Yes, you get a room full of students talking. Some will preen in the camera. Others will make faces. They’ll move past this and use it as a tool. 

Some students will be uncomfortable on the camera and some won’t want to be seen. Have them use puppets, their hands, or other visual elements. It should be noted that a vlog can be easier to edit because students see where they said certain things. A podcast doesn’t provide the same visual but can also be used as a tool to support writing in the same way. 

The parts of a vlog can be related to the parts of an essay. Have students deconstruct professional vlogs and relate them to essays. They can do the same on their own works. 

Vlogs have a built in hook for students. Many want to be famous and recognized for something about them. Learning to vlog can support them having a platform. And it’s easily within reach for many. This would also be a point to talk about being a  digital citizenship leader. 

Vlogging can free student’s voices and open them to the written form. The effort for some to put the written word down can be immense. The framework of talking through something piece by piece provides a structure they can use later to support getting words on paper. Closed captioning generation can also help by providing the speech to text transfer they struggle with. Students can focus on their writing structure and word choices from this material. 

The Vlog framework

  1. Starting state - this is unique to a vlog. We get an establishment of the beginning. I often think of this as the heading on a paper or the title page. We say where and when they are. Sometimes we get a who they are as well.
  2. Opening overview - here we establish what we are about to talk about. We identify the points we intend to cover. I consider this to be part of our intro paragraph; our thesis statements. We hook our watchers here. *The starting state and the overview can be interchangeable in their order.
  3. Inciting Incident - why are we taking about what we are talking about? It’s important to establish a personal reason for your choice of topic. The opening needs to be passionately justified for you and us to want to continue. In our paper this would be brief supporting statements for our thesis statements. 
  4. Main points - we elaborate on each point we made in our overview. A point in the overview would be made a section of our main point we intended to talk about. We give supporting details, data, facts or our opinion to support our point. This would be the body of our paper with a paragraph for each point. 
  5. Recap - we summarize our main points into a brief bit of information we want our watcher to take away. This is the conclusion in our paper. 
  6. Ending - where we thank everyone and give credit. We also urge people to subscribe to our vlog. This would be a bibliography on our paper. The subscriber urge is particular to a vlog. 

Why are we still fighting the tech implementation battle?

I’ve recently seen a few posts on social media indicating technology takes away from education. I’ve witnessed certification opportunities from large companies being redesigned to reach educators. This year one large company, only now, has released a tablet version of their product. *coughgooglecough* 

Why are we still fighting this battle of implementation of technology in education rather than embracing it? Tech in education is not an argument. Certification is a must and shouldn’t have to be sold. Simple handheld devices must be the norm for our entry point students.

I can access college level coursework on my phone at anytime. I’m able to explore Mars in Virtual Reality from 360 images recently sent back to earth. I can reach hundreds of colleagues to collaborate on ideas. Why would I hold my students back from having access to resources and skills they will need for their own success when they graduate? 

If this is the world now what will it look like to our kindergarteners?  To give perspective, our 10th graders were in kindergarten when the first iPhone came out in 2007.

Technology is a part of education. Technology is a part of our world. It’s not a question and is not an argument any more. Every teacher needs to be certified in technology products. Thankfully, right now, most large companies provide free certifications. They want students using their products so they train the teacher. Every teacher out of obligation to the future of our students is obligated to be certified in at least one productivity suite or operating system. Ignorance and age is not an excuse. 

Yes, books still have a place in the classroom. Literature is necessary for our students. But do they have to be on paper where they can be lost and/or destroyed? Can’t we hold them in a place where discussions can happen at any time? 

Why do I still see questions as to the efficacy of technology in education? It’s not completely about how well tech supports learning. Technology is embedded in everything. Our students must know how to navigate with it.  Thereby we need to know. 

  • Certify yourself in at least one major product. Right now that’s looking like Google, Apple, or Windows. You can do it at home and online. Training material is offered by each organization. 
  • Fight for reasonable and responsible technology use in your classroom. If you aren’t in a 1:1 environment reach out to your community for old devices. Look in to grants to support providing technology access. 
  • Allow technology into your curriculum. That is to say your curriculum should not be about technology unless that’s what you teach. Let students create work through devices. Consider going paperless if appropriate. Look at the SAMR model to support your growth.
  • Share, show, collaborate, communicate with fellow educations on how technology in can improve education. Small steps of change by many can lead to great shifts. Better yet drag the least technical among you into this world of tech in education and you will see a rush to try it. Fear often holds back change. Be courageous in your steps forward.

Teachers currently in education programs need access to certification programs. Teachers currently teaching need to seek out certifications even when a district doesn’t offer it. Becoming fluent in immersing technology in your classroom doesn’t just make you a better teacher. It makes you a current teacher. 

Collect Quick Formative Feedback

We often send our students to complete independent writing work. We circulate the room and the students that are vocal get the attention. But what about those students that don't raise their hand to ask for help? How can we provide an easier way for them to reach out to us? Well, here's a way to create a custom menu for a document and collect some formative feedback.

Sample:
Spreadsheet collecting data, Document which can be copied with the code.

Our starting function is the onOpen function. This is a reserved word which the doc looks for in the script. As the document is opened this script is run. In this case we engage the DocumentApp library of code. The getUi begins the user interface. We createMenu and name it something. I've named it with a emoji of a hand to support the idea that we don't always need menus with words. This menu will show up as a new main menu like File or Edit. We then add a menu item with addItem. The first item is a sad face. the sad face is connected to the function of helpMe. The second item is a thumbs up connected to the function called doingGood. Lastly we all it all to the user interface with addToUi. These menu items are on separate lines but they are really strung together commands. The semicolon identifies the end of the line of commands.

function onOpen(e) {
  DocumentApp.getUi()
      .createMenu('✋')
      .addItem('😕', 'helpMe')
      .addItem('👍', 'doingGood')
      .addToUi();
}

The helpMe and doingGood functions are nearly identical except for the message we set in the secon column. I'll use the helpMe function to detail what's happening. The same will be true for the doingGood and any others you want to make.

To begin we set a global variable as the sheet ID. A global variable is set outside of the functions and is used for all the functions. Because our variable isn't changed by the program we could also declare it as a constant but we'll keep it simple and just use var to declare the sheetid variable. The sheet id can be found in the url of the sheet. The sheet needs to be shared as editable for it all to work.

Our helpMe function starts by assigning the spreadsheet by the id and the specific sheet by name to the sheet variable. We next identify the last row used and assign it to the variable lrow. We then get the range of the last used row represented by lrow plus 1. This would be the next empty row. This row with the column of 1 is the cell we get and set the value of the currently logged in user email. The range then is grabbed for the second column and the value is set to the words 'Help me!'.

var sheetid = '1C1bUbiouvFgeE6qfZjknW9zumpMLOHYcqQNjO39sVAI';

function helpMe() {
  var sheet = SpreadsheetApp.openById(sheetid).getSheetByName('Sheet1');
  var lrow = sheet.getLastRow();
  sheet.getRange(lrow+1, 1).setValue(Session.getActiveUser().getEmail());
  sheet.getRange(lrow+1, 2).setValue('Help me!');
}

function doingGood() {
  var sheet = SpreadsheetApp.openById(sheetid.toString()).getSheetByName('Sheet1');
  var lrow = sheet.getLastRow();
  sheet.getRange(lrow+1, 1).setValue(Session.getActiveUser().getEmail());
  sheet.getRange(lrow+1, 2).setValue('Doing Good');
}

This is a pretty simple code to create a quick menu for formative feedback. Consider stopping the class a few minutes into independent work and asking the class to select the menu item that best identifies how they currently feel about the topic. You would get immediate feedback on the spreadsheet. They may have to accept permissions the first time around. You can also add a timestamp to another column by setting the value to .setValue(new Date()) You may also want to set another column with a particular class name. There's alot you can do with this from here.

Auto Add User to Sheets

Ever needed to grab the name of the user that edited a line of a Sheet? Sure you can comb through the version history but isn't it better to just see the the information right on the sheet? Google Scripts provides a way to capture the user that edited. Let's take it one step further and make a bathroom log. Students logged in to their Google Account on the same domain as you will be able to click an icon and create a record that they are going to the restroom. No one will be able to mark the sheet while they are out. Sample

So the code we need to know to identify the user currently editing the sheet would be Session.getActiveUser().getEmail()
To break this down, the Session refers to the period a user is logged in. A session can be time limited or limited to the particular device being used. We use the Session to access the method of
getActiveUser()
The active user is the user logged in. From here the only selection is
getEmail()

Stringing these together and we  can identify who is using the sheet.

We begin our function creating our variables to represent the Spreadsheet and the currently active sheet.

function bathroom() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
}

Because we will be adding the user to the last empty row we want to identify which row that is. sheet.getLastRow() returns the value of the last filled row. So the next available row would be sheet.getLastRow() + 1.

function bathroom() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow() + 1;
}

We need to consider the structure of our spreadsheet. We'll create a sheet with the following headers.

EmailOutInDuration
We can use the function getColumnByName used in the previous post here. But I'll keep it very simple and we'll use the column numbers. We're going to want to know if a student has come back from the bathroom first. To do this we want to check the last filled row and the 3rd column which is labeled "In".

function bathroom() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow() + 1;
  var lastcell = sheet.getRange(lastRow-1, 3).getValue();
Logger.log("Last Row " + lastRow + " Last Cell Value " + lastcell)
}

I've thrown a loger line here to test the code and see what values it returns. It's helpful to do this as your write. I've torn my hair out and spent days staring at code not realizing I only thought I knew the value of a particular variable. Don't assume, debug.

The last entered user is also going to be needed. We can get this in the same manner we retrieved the lastcell variable.

function bathroom() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow() + 1;
  var lastcell = sheet.getRange(lastRow-1, 3).getValue();
  var user = sheet.getRange(lastRow-1, 1).getValue();
Logger.log("Last Row " + lastRow + " Last Cell Value " + lastcell + " User " + user)
}

Now we start doing some comparisons to know the condition our sheet is in.
 if (lastcell.length == 0 && user == Session.getActiveUser().getEmail())
Here we are checking if the number of characters in the lastcell variable is equal to 0 AND the user variable has the same email in it as the current user in the sheet then we will do something. If these two things are true then it means the student has come back from the bathroom and is checking in. We will need to enter the current timestamp in the "In" column and we can set the formula to calculate how long they were in the bathroom.
We initialize and set a variable to the result of setting the timestamp. Assigning this to a variable can help to identify errors if things are going wrong but not absolutely needed. We grab the range using the last row variable which we already advanced by 1. To get the last filled row we reduce the variable by 1. The column is column number 3. We set the value to a new date object which we typically read as a timestamp.
we also move forward with setting a formula in Row and Column format. The formula here is relative to the cell the formula is entered in. In this case R[0] stands for the current cell's row. C[-1] is one column less. since we are putting our formula in column 4 one column back would be column 3 which we just put our In timestamp in. We then subtract the C[-2] column  or column 2 of the same row. This gives us a duration of how long they were in the bathroom.

function bathroom() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow() + 1;
  var lastcell = sheet.getRange(lastRow-1, 3).getValue();
  var user = sheet.getRange(lastRow-1, 1).getValue();
  if (lastcell.length == 0 && user == Session.getActiveUser().getEmail()){
    var col2 = sheet.getRange(lastRow-1, 3).setValue(new Date());
    var formula = sheet.getRange(lastRow-1, 4).setFormulaR1C1("=R[0]C[-1] - R[0]C[-2]")
  }
}

We now have the if statement identifying when a user returns. But what if the user clicking the icon is not the user in the bathroom. They need to know that they can't go yet. We again check if the lastcell length is 0 meaning it's blank. We also check to determine the user in the last row is not the current user. The usage of != means not equal. If both conditions are true we assign the variable ui an alert with a message.

function bathroom() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow() + 1;
  var lastcell = sheet.getRange(lastRow-1, 3).getValue();
  var user = sheet.getRange(lastRow-1, 1).getValue();
  if (lastcell.length == 0 && user == Session.getActiveUser().getEmail()){
    var col2 = sheet.getRange(lastRow-1, 3).setValue(new Date());
    var formula = sheet.getRange(lastRow-1, 4).setFormulaR1C1("=R[0]C[-1] - R[0]C[-2]")
  }else if(lastcell.length ==0 && user != Session.getActiveUser().getEmail()){
    var ui =SpreadsheetApp.getUi().alert('Sorry, someone is currently out.')
    }
  }
}

Finally at the end if the user is not the one returning and if the user is not still out and we can add a new user we do so. The else statement is our default statement. If 1 then 1a, else if 2 then 2a, else default. We can think of the progression like this. In our action for the default response we use the variable col1 to capture the setting of the user. The range is gotten of the last row variable which represents a new row and the column of 1. We set this cell to the value of the current users email address. We then set the second column on the same row as a new date object which we know of as a timestamp.

function bathroom() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow() + 1;
  var lastcell = sheet.getRange(lastRow-1, 3).getValue();
  var user = sheet.getRange(lastRow-1, 1).getValue();
  if (lastcell.length == 0 && user == Session.getActiveUser().getEmail()){
    var col2 = sheet.getRange(lastRow-1, 3).setValue(new Date());
    var formula = sheet.getRange(lastRow-1, 4).setFormulaR1C1("=R[0]C[-1] - R[0]C[-2]")
  }else if(lastcell.length ==0 && user != Session.getActiveUser().getEmail()){
    var ui =SpreadsheetApp.getUi().alert('Sorry, someone is currently out.')
  }else{
    var col1 = sheet.getRange(lastRow, 1).setValue(Session.getActiveUser().getEmail());
    var col2 = sheet.getRange(lastRow, 2).setValue(new Date());
  }
}

This function can then be assigned to an image or a menu. Consider using some of these techniques for an onEdit trigger to track who changes a line on a spreadsheet.

Social Emotional Well-Being During Online Teaching and Learning

The world is a bit nutty right now because of the COVID-19 pandemic. Schools are switching to online learning and parents are working from...