3 Comments

I’m a self-confessed RSS junkie, I ❤ RSS, so when topping up my feeds I wanted a quick way to add to Feedly (my current RSS reader of choice). I already use the Chrome RSS Subscription Extension (by Google) which gives me a handy icon in my address bar when a feed is detected.

RSS Subscription Extension (by Google)

Unfortunately though it doesn’t have Feedly as a service …

Manage feeds

Clicking on ‘Manage…’ gives the rather daunting

Edit feed reader dialog

A quick search for a Feedly specific url turned up Add Feedly to Firefox's Feed Handlers List and I recognised that the browser.contentHandlers.types.#.uri would do the trick. So using the following in the Edit feed reader dialog:

I back to my feed munching ways

Share this post on:
| | |
Posted in How-to, Oddment on by .

Here's some posts which have caught my attention this month:

Automatically generated from my Diigo Starred Items.
Share this post on:
| | |
Posted in Starred on by .

4 Comments

Recently I gleefully exclaimed on Twitter “exciting news” and despite the interest I didn’t feel until now that I could reveal what had happened, Google were looking for a hire … Google were looking to hire me:

Hi Martin,
I am a technical recruiter within Developer Relations at Google and I wanted to get in touch. Based on your background and postings, I feel you could be a great fit, as we are hiring for multiple positions within Developer Relations in NYC and Mountain View, CA locations specifically. Are you currently entertaining new opportunities? If so, I would like to get in touch at your earliest convenience to discuss your background and active opportunities. Looking forward to hearing back!

Ah finally the 100+ blog posts I’ve written on Google, countless presentations on hacking stuff together with Google Spreadsheets (a couple here) and I finally got noticed.  What was most interesting about this message came from … LinkedIn!!!

Yes that’s right despite having a decent presence of Google+ it appears Google do some of their recruiting through someone else's social network. This initially led me to question if it was a genuine approach or just some recruiting agent phishing for CVs spoofing a Google connection. The only thing that gave comfort was the inclusion in the message of the sender’s @google.com email address and I opted to reply via this instead. Still though LinkedIn! Why not Google+ or even Gmail. If Google are looking for hires through LinkedIn that’s a pretty big argument to make sure your graduates have a presence there … right?.

Fortunately the message wasn’t a phish and the recruiter got back to me and we arranged a phone call. The call was primarily a chance for the recruiter to find out if I was suitable to be put forward for one of the posts and included the basics: what programming languages do you use, experience of public speaking etc. As I later found out the recruiter is essentially your handler, making sure you are aware of the next steps, providing a friendly interface to what can be a daunting experience. At this point the expectation of getting a job in developer relations began to slip. As someone who prides themselves on being a hacker, often even using ‘I’m not a developer’ in my introduction - primarily because I’m often talking to novices and I want to make a connection with the audience - my lack of formal IT qualification and experience was going to be a handicap, but this is Google they pride themselves on innovation … right?

Regardless of this the recruiter saw enough to put me through to the next phase which was a 45 minute call with a Google software developer (not HR person, Google use employees to benchmark candidates), which was a mixture of ‘why do you want to work for Google? … hmmm you called me’ and a programming problem to solve. I’m not sure if part of me wanted to sabotage my opportunity but I completely tanked at this. This left me feeling both angry and disappointed. I was mainly angry for pretending to be something I’m not … a software developer. I’m a hacker, an innovator, a scamp, a scallywag. I betrayed my original calling as a Structural Engineer long ago to search of the next novelty, the next shiny thing to play with, the next idea to stretch until it breaks. No I’m not a software developer.  And thankfully Google agreed, which I sure comes as a relief for a number of people in this sector … right?

The recent news that LinkedIn has dropped their minimum age to 13 to entice school kids has extra resonance for me because now I know even Google use it for recruitment. It reassuring to know people like Sue Beckingham, Matt Lingard and others recognise the importance of students having an awareness of LinkedIn.

So folks I‘m afraid you're stuck with me ;)

Some things I learned along the way

Share this post on:
| | |
Posted in failed, Google, Oddment on by .

1 Comment

You may have seen from my colleagues Lorna Campbell (In the meantime…) and Sheila MacNeill (Sideways) that the University of Strathclyde office for Cetis is closing at the end of the month. Things are slightly up in the air right now but we are hopefully the ‘Glasgow based supergroup’ will reform soon. In the meantime we’ve found ‘other projects’ to keep us busy. In my case the Association for Learning Technology (ALT) are looking to utilise some of my ‘production’ talents helping them create their conference site for ALT-C 2013. Given Stephen Downes is keynoting this year it’s rather fitting that we are going down a connectivist inspired route for this. Just as in my earlier work with the ocTEL open course platform we’ll be deploying the lean mean aggregation machine (FeedWordPress) to pull/push delegate activity with some added situational awareness/organisational features. As with ocTEL we’ll be using the WordPress platform as a base sourcing and joining selected plugins to hopefully give delegates a seamless experience. Given the tight deadline I’m not sure how much I’ll be able to share as I go along but at the very least we’ll publish our recipe under an open source license and you can follow some of the commits to the code repo.

To give you a flavour of what is to come below is a list of the main plugins we are using and some early screenshots (skinning is still on the to do).  

Main plugins (so far)

  • Conferencer – for conference programme (inc. tracks, rooms and sessions)
  • BuddyPress – Delegate profiles (inc member search), conference session groups (allows users to follow and discuss sessions)
  • MailPress – daily email push
  • FeedWordPress – to aggregate conference activity from 3rd party networks

Early Screenshots

Programme view
Programme view

Individual session
Individual session

Here's some posts which have caught my attention this month:

Automatically generated from my Diigo Starred Items.
Share this post on:
| | |
Posted in Starred on by .

1 Comment

From the postbag Marjolein Hoekstra (CleverClogs) writes:

Short description
Can you make a Google Script for me that compares two strings character by character? If differences are found, the script should point these out. If no differences are found at all, the script should put out the text "[ id. ]" .

Detailed description
I have two columns containing lists of horizontally identical, but sometimes almost identical text strings. This is on purpose. Each row has another couple of words that need to be compared.

I'd like to compare them on a character by character basis, and then point out in the second column at which positions it differs from the first, for example like this:

A2: ABCDE

B2: ABKDE

If you compare these two, you'll see that cell B2[3] has 'K' where A2[3] reads 'C'.

My envisioned formula would then populate cell C2 with: "[ – – K – – ]"

As far as I can tell, I'd need a Google Script that parses both strings character by character and output "–" when they are identical, and output the value of the character string from B2. It should be relative simple, with a FOR loop. Thing is, I've never written a Google Script, and it's a bit daunting for me to start on my own.

Note that LEN (A) is always identical to LEN (B)

Background info
In case you're interested in the actual use case: I want to use this formula to compare strings of Chinese characters, where the first column contains the traditional writing of these characters (typically requiring more strokes) and the second column containing the simplified writing of those same characters. Sometimes the characters are different, sometimes they are not. You can see this clearly in the screenshot below.

The Google Spreadsheet is used as input for a flashcard deck I'm building, using the iPhone app Flashcard Deluxe (top-notch system, highly flexible) [also available for Android].

Screenshot:

Google Spreadsheet Example Flashcard Deluxe

There's no need to use Chinese characters to test the formula, I'm just providing this so that you know in what context the formula will be used.

The Solution

My initial thought was to use existing formula to SPLIT the cell text into individual character values and then do a comparison but unfortunately the SPLIT formula requires a character to split on. So instead I turned to Google Apps Script and wrote the following custom formula:

function stringComparison(s1, s2) {
  // lets test both variables are the same object type if not throw an error
  if (Object.prototype.toString.call(s1) !== Object.prototype.toString.call(s2)){
    throw("Both values need to be an array of cells or individual cells")
  }
  // if we are looking at two arrays of cells make sure the sizes match and only one column wide
  if( Object.prototype.toString.call(s1) === '[object Array]' ) {
    if (s1.length != s2.length || s1[0].length > 1 || s2[0].length > 1){
      throw("Arrays of cells need to be same size and 1 column wide");
    }
    // since we are working with an array intialise the return
    var out = [];
    for (r in s1){ // loop over the rows and find differences using diff sub function
      out.push([diff(s1[r][0], s2[r][0])]);
    }
    return out; // return response
  } else { // we are working with two cells so return diff
    return diff(s1, s2)
  }
}

function diff (s1, s2){
  var out = "[ ";
  var notid = false;
  // loop to match each character
  for (var n = 0; n < s1.length; n++){
    if (s1.charAt(n) == s2.charAt(n)){
      out += "–";
    } else {
      out += s2.charAt(n);
      notid = true;
    }
out += " ";
  }
  out += " ]"
  return (notid) ? out :  "[ id. ]"; // if notid(entical) return output or [id.]
}

One of the things to be aware of is Google Apps Script formulas are associated with a spreadsheet. You can't globally use a custom formula unless the script is attached. Fortunately when copying a spreadsheet you also get a copy of the script, so providing templates is a way around this.

With this limitation in mind I thought I’d have another go  at cracking this with built-in formula … and guess what it is possible. The key to unlocking this was when playing with the REGEXREPLACE formula I accidentally turned ‘ABCDE’ into ‘,A,B,C,D,E,’ by using =REGEXREPLACE(A20,"(.*?)",","). My RegEx is terrible so I’ll let someone else explain how this works in the comments, but getting to this point meant I could use a combination of SPLIT and REGEXREPLACE to do a character by character comparison on two cells of text. The final version of the formula goes (comparing cell A14 to B14):

=IF(EXACT(A14,B14),"[ id. ]","[ "&JOIN(" ",ARRAYFORMULA(REGEXREPLACE(SPLIT(REGEXREPLACE(B14,"(.*?)",","),","),SPLIT(REGEXREPLACE(A14,"(.*?)",","),","),"–")))&" ]")

My rough workings are embeded below. You can also make a copy of the entire project including the Apps Script solution here.

Update: Bruce Mcpherson has posted an alternative formula to do this which goes like:

"[ " & CONCATenate(ARRAYFORMULA(if(mid(A31, row(indirect("x1:x"&len(A31))) ,1)=mid(B31,row(indirect("x1:x"&len(A31))),1)," – "," "&mid(B31,row(indirect("x1:x"&len(A31)))&" ",1) ))) &" ]"

As you will see from the comments thread on that post Marjolein was having problems using my version with a Chinese characterset. Adding this to the example spreadsheet I'm unable to replicate the error but have encountered the problem here. If anyone can spot the difference I'd welcome your thoughts?

Update 2: Bruce pointed out that "the likely issue is that the columns with the problem are times - the characters mean AM. The same thing would probably happen with numbers. Have you tried wrapping the cell references in concatenate() to convert to a string?"

I said: ah I see what you mean 时 is being interpreted as 上午12:00:00. Not sure how I'd wrap the concatenate with my regexreplace. Your solution looks better all round so rather than loosing sleep I'd go with that

5 Comments

This was the question that came in over the wire this morning:

My first thought was using the Google Visualisation API Query Language which can would let you do a SQL type query and  LIMIT the response to 1 record and OFFSET to a particular row. The Google Code Playground has a nice example of this to play with to see what you can do, even better Tony Hirst’s Guardian Data Explorer helps you generate the query to generate an html view (although Tony hasn’t implemented to LIMIT and OFFSET.  So below is an example spreadsheet:

Example Spreadsheet

… and using the query

https://spreadsheets.google.com/tq?tqx=out:html&tq=select * LIMIT 1 OFFSET 3&key=rYQm6lTXPH8dHA6XGhJVFsA&gid=0

We get … (the important bit is ‘OFFSET 3’ where offset 0 = row 2, offset 1 = row 3, etc.)

Google Visualization html row

So a couple of issues. First the spreadsheet needs to be File > Published to the web and the result is also read-only:

Thinking about the other view offered by Google on Spreadsheets it occurred to me the mobile view might be a solution. The mobile view if you don’t use a native app is List view (here is more about List View):

List View 

… which allows you to edit a row of data

Edit row in List View

the final trick was to change the rows per page to 1 and then use the page query to select the row e.g. to open the spreadsheet to edit row 5 we set &page=4 (the header isn't counted as a row). You can also select the sheet by changing the &ampgid= number. Tip: Open your spreadsheet and switching to 'List View' will help you build the URL.

https://docs.google.com/spreadsheet/lv?key={your_key}&type=view&gid=0&f=true&sortcolid=-1&sortasc=true&page=4&rowsperpage=1

Edit single row in List View

So there you go how to open a Google Spreadsheet at a specific row for editing for Marjolein to use. The perfect solution … well almost?

Update: Saqib Ali has kindly passed on this trick from one of the Google team (I don't think it would work in the original scenario, but still very useful to know

Insert/Comment at a specific cell, and, in that comment "plus someone" - that is, type "+" and then the person's email or name NOTE: you will get a list of people in your domain as soon as you type the "+", filtered as you start typing their name/email the person you "plussed" will get an email with both the contents of the cell and your comment the link in that email will take them DIRECTLY TO THE TARGET CELL with the comment activated.

Share this post on:
| | |
Posted in Google Spreadsheet, How-to on by .

2 Comments

Livros de Redes Sociais, SEO e Web 2.0Perhaps the worst SEO post title I could possibly use. If you are still wondering what SEO is ask Nitin Parmar ;)

Still lost? SEO is Search Engine Optimisation. I’ve had a long interest in SEO primarily in selfish terms to try and get this blog more read, but also in a wider ‘educational resource discovery’ context. I was the author of the ‘SEO and discoverability’ chapter in Into the wild – Technology for open educational resources, which highlights the importance and UKOER programme experiments with SEO.

So it’s perhaps no surprise that I agree with Tony:

Something I’m increasingly become aware of is SEO is not just about having the right metadata on your webpage, in fact arguably this is the least important aspect. The area I’m particularly interested in is the tools/techniques the SEO community use to gain ‘actionable insight’.

Ironically this is an area I’ve been inadvertently contributing to without really knowing it. Someone who spotted this early was Wil Reynolds founder of SEER Interactive:

SEER Interactive offer services in Paid Search Marketing and Search Engine Optimization but what’s particularly interesting is their commitment to being “an Analytics first company, and we will not take on projects where we can’t analyze our impact on your business”.

So what do I do that’s of interest to the SEO community? Well it seems like me SEOers like a good old-fashioned spreadsheet. They also like a good old-fashioned spreadsheet that they can hook into social network channels. A recent example of this is the work Richard Baxter (CEO and founder of SEOgadget) presented at MOZCon which extends TAGS (my Twitter Archiving Google Spreadsheet solution) demonstrating How To Use Twitter Data for Really Targeted Outreach. The general synopsis is:

an alternative method to find sites that our target audiences may be sharing on Twitter. With that data, you can build content strategy, understand your market a little better, and construct an alternative outreach plan based on what real people are sharing and engaging with, rather than starting with sites that just rank for guest post queries.

It was really interesting to read how Richard had used the output from TAGS, which was ingested into Excel where additional free Excel based SEO tools could be used to gain that all important ‘actionable insight’.

So ‘learning tech and library folk’ if you are planning your next phase of CPD maybe you should be looking at some SEO training and perhaps I’ll see you at MOZCon next year ;)

1 Comment

Some stuff from last night that caught my eye (reflections follow each tweet):

There’s also been an interesting series of posts from Brian Kelly around this area (here and here)

How accurate the numbers are is always the question, but personally speaking there are a couple of instances where no-license has created a headache for me. More annoying is when you do reach out to developers for permission to use their code and get no response (on the plus side great to see both code and tutorials being openly licenced on the Google Developer site (Apps Script anyway, not sure about others)  

I was wondering if this extended to colleges/unis. Question is whilst most have charitable status as they for profit?

Mrs H. started her PhD this week…

Useful advice from SocialBro. Instead of the Excel sheet used in the tutorial you can use the Summary sheet on TAGS

Great set of winners! Ones that caught my eye:

  • AspirEdu: analytics and retention solution that adds an administrative dashboard inside the LMS
  • BigBlueButton: open source Web conferencing solution that allows one-click conferencing
  • CloudTime: auto-provisions Amazon EC2 instances and distributes them to students for programming or data mining projects
  • QuestionPress: online classroom response system that makes it easy to drop assessments into a course and write grades back to the LMS

This caught my eye in terms of altmetrics/REF impact

The perennial problem with portfolios - and I guess assessment design -  is it can all get very artificial

This is why blogging is good. Completely forgot I did this

Cohort analysis! I’m still figuring out how this could be used in an open course setting.

Share this post on:
| | |
Posted in I am not sure on by .

5 Comments

For a long time I’ve been in awe of live bloggers like Nicola Osborne and Doug Clow and on several occasions benefitted from being able to point to the information they have captured in posts. This extends to events I’ve not been able to attend such as Doug’s extensive notes from LASI13. For our recent event, which ran as part of LASI-Local, I thought I’d give liveblogging a go. You can see the two posts I captured here and here. Overall I’m disappointed with the result but thought worth reflecting on the process and output.

Wordpress App, Android phone and bluetooth keyboardTo start with the process my setup was an Android phone running the WordPress App connected to a bluetooth iGo keyboard. In the background of the picture you’ll see I’ve connected the phone to a Viliv S7 (yes I like my gadgets), which was used as a power source. The reason I opted to use my phone and not a laptop or tablet is the WordPress App lets you take pictures with the camera and insert them in the post as you type. To also save a bit of time prior to the event I drafted some posts with holders containing session title and presenter. I then republished the post regularly as I was editing. Technically this mostly worked well although for some reason I did loose the edits for one of the session speakers. Also after the event I noticed that the quality of pictures (mainly of slides) wasn’t that great and were a little washed out. Fortunately all the original pictures were still recorded on my phone so I could do some light post production cropping, sharpening and adjusting contrast.

The product. I probably didn’t choose the best two session topics to try live blogging. The session on ‘working with dialogue data’ was excellent but the complexities of machine learning, meta-discourse and rhetorical moves made my head hurt and I struggled processing what was said and converting to summarised text. In the afternoon there was another excellent sessions but as the topic was data visualisation capturing what was both said and shown was a heavy load. Where I probably went wrong was being distracted by taking pictures and not notes. Already a number of presenters have uploaded their slides so there is perhaps little benefit of my poorly framed pics.

One slight exception was the session given Em Bailey on ‘An overlooked tool? Using Excel for advanced data visualisation’. Rather than using a slidedeck Em demonstrated some of the work she’s been doing around NSS and KIS data in Excel. This was a masterclass in what was possible using Excel’s out-of-the-box chart tools hacked to within an inch of their lives to produce advanced interactive data visualisations. Below is a screen shot I took as part of my liveblog post which I’ve now cleaned up a bit and annotated. The liveblog post tries to capture some of the flow but again is light on what is being shown and doesn’t really do Em’s work justice and a post process has been required.

Em's excel-magic

So I think I’ll be leaving the liveblogs to those who are more experienced. I am however interested in other techniques for capturing events I attend.

Share this post on:
| | |
Posted in liveblog on by .