Pages

Showing posts with label an. Show all posts
Showing posts with label an. Show all posts

Thursday, March 12, 2015

Facilitating a retrospective with 50 people in an hour

As one of the volunteers at Agile 2012 I was honoured to be asked to facilitate the volunteer retrospective.

There were a few constraints that made this retrospective challenging. First, due to our volunteer responsibilities we had just under an hour to eat lunch and complete the retrospective. Second, there are about 50 volunteers - allowing everyone to have a voice in such a short time frame would be a challenge. Third, it was important to all of us to celebrate the things that went well and also give a clear, prioritized list of ideas to future volunteer teams.

After discussing the constraints and various facilitation options with some of you, here is what we did:

1. Instead of building a timeline of our experiences we held the retrospective in our volunteer room. Throughout the week we had plastered the walls with our schedules (including happy/sad faces), guidelines, issues, ideas for improvement, etc which then served as visual provocations for the retrospective.

Picture courtesy of Adam Yuret
2. We used silent brainstorming liberally in order to speed up the retrospective while still including every voice. In general we followed the Rising Patton Fusion retrospective model that combines silent brainstorming, silent grouping, and silent voting.

3. We split into 5 groups of 10. Each group would perform a retrospective step together before sharing their results with the larger group.

4. The two major prompts we used in the retrospective were:
The combined greats
- "It was great because...". Each table wrote these in silence, read them out loud to each other, grouped them in silence and then named the groups. The named groups were then shared with the rest of the tables and consolidated into one larger list.
- "Do differently". Once again, each table wrote these in silence, read them out loud to each other, and then voted in silence. The top 3 items from each table were again shared with the rest of the tables and consolidated into one larger list.

5. Finally, we posted pictures of all the results (yes, every single post-it note) on the Agile Conference Volunteers Facebook page for later reference and comments.

It was a lot of fun and seemed to work well given the constraints. We achieved our goal of giving everyone a voice in a short time period, celebrating what went well, and also producing a nice list of actionable ideas for next year. Anything you would do differently?

Subscribe to Winnipeg Agilist by Email
Read more »

Monday, March 9, 2015

Building an Idea Bank using Google Apps Script

Editor’s Note: This is a guest post by Saqib Ali. Saqib is a Google Apps evangelist at Seagate. He has used Apps Script to create a number of applications that leverage Google Apps. His other interests include the curation of Lewis Carroll’s letter and translation of Urdu poetry to English. -- Ryan Boyd

What is an Idea Bank?

Idea Banks are repositories for innovative ideas that Seagate employees can submit, and others can vote on those ideas. Before Google Apps Script we had a custom built Idea Bank on the LAMP stack. With the release of the UI Services in the Google Apps Script, we wanted to port that Idea Bank to Google Apps to easily manage idea submissions in a Google Spreadsheet.

Designing the Idea Bank

A typical Idea Bank consists of three basic functions:

  1. Ability to submit and store ideas to a central database.
  2. Ability to vote on ideas.
  3. Ability to add description comment on ideas.

A traditional application would probably use a Relational Database like MySQL to store the ideas. However we found that using Google Spreadsheet to store the ideas provides two inherent benefits:

  1. Entered data can be easily managed using the Spreadsheet Editor;
  2. Revision history. Since Spreadsheet provides built-in revision history, we don’t have to create a system for tracking the changes to the submitted ideas.

The number of votes, and the voters are tracked using cells in the spreadsheet. For voters we used the Session.getUser().getEmail() to get the email address of the logged in user, and store them in the spreadsheet.

Since the Ideas Bank is embedded in a Google Site, we were able to simply use the Google Sites Page as a place holder to add description and comments to the ideas. Once the idea is submitted, a Google Sites page gets created corresponding to that idea from predefined template using the createPageFromTemplace() function. The submitter can then add detailed description in the template. Others can add comments to that Site pages.

Implementation Details

Using Spreadsheet Services to Manage Data

All the data is stored in a Google Spreadsheet, which makes it easy for the Idea Bank manager to manage (delete, remove, modify) the ideas using the Spreadsheets Editor.

Code snippet for adding new ideas to the spreadsheet:

var ss = SpreadsheetApp.openById("");  // Spreadsheet id goes here
SpreadsheetApp.setActiveSpreadsheet(ss);
ideas_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Ideas");

var last_row = ideas_sheet.getLastRow();
var next_empty_row = last_row+1;

ideas_sheet.setActiveCell("A"+next_empty_row);
ideas_sheet.getActiveCell().setValue(e.parameter.ideadescription);
ideas_sheet.setActiveCell("B"+next_empty_row);
ideas_sheet.getActiveCell().setValue(Session.getActiveUser().getUserLoginId());
ideas_sheet.setActiveCell("E"+next_empty_row);
ideas_sheet.getActiveCell().setValue(Session.getActiveUser().getEmail());

Code snippet to read the ideas from the Spreadsheet and display them:

var ss = SpreadsheetApp.openById(""); // Spreadsheet id goes here
SpreadsheetApp.setActiveSpreadsheet(ss);
ideas_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Ideas");

var last_row = ideas_sheet.getLastRow();
var last_column = ideas_sheet.getLastColumn();
var sheet_array = ideas_sheet.getRange(2, 1, last_row, last_column).getValues();

var submitIdeaButton = app.createButton("I have another idea");
var submitIdeaButtonHandler = app.createServerClickHandler(showSubmitIdeaDialog);
submitIdeaButton.addClickHandler(submitIdeaButtonHandler);
applyCSS(submitIdeaButton, _submitideabutton);

var ideaContents = app.createGrid().resize(last_row,3);
ideaContents.setId("ideacontents");
ideaContents.setWidth("100%");
ideaContents.setCellSpacing(0);
scrollPanel.add(ideaContents);
app.add(scrollPanel);

for (var row_i = 0; row_i < last_row-1; row_i++) {
var ideaDescriptionLabel = app.createLabel(sheet_array[row_i][0]).setStyleAttribute("font","16px Sans-serif").setWordWrap(true);
var submitter = sheet_array[row_i][1].split("@");
var ideaAuthor = app.createLabel(submitter[0]).setStyleAttribute("font","10px Courier New, Courier, monospace").setStyleAttribute("color", "#CCC")
ideaContents.setWidget(row_i, 0, app.createVerticalPanel().add(ideaDescriptionLabel).add(ideaAuthor)).setStyleAttribute("overflow","visible").setStyleAttribute("white-space","normal !important");

//Button to display the voters
var numberOfVotesForm = app.createFormPanel().setId(numofvotesform);
var numberOfVotesFormContent = app.createVerticalPanel()
numberOfVotesForm.add(numberOfVotesFormContent);
numberOfVotesFormContent.add(app.createTextBox().setName(ideaID).setText(row_i + "").setVisible(false).setSize("0","0"));
numberOfVotesFormContent.add(app.createTextBox().setName(voters).setText(sheet_array[row_i][4]).setVisible(false).setSize("0","0"));
var numberOfVotesButton = app.createButton(countVotes(sheet_array[row_i][4]) + " vote(s)").setId("numberOfVotesButton"+row_i);
applyCSS(numberOfVotesButton, _numofvotesbutton);
var numberOfVotesButtonHandler = app.createServerClickHandler(showVotersDialog);
numberOfVotesButtonHandler.addCallbackElement(numberOfVotesFormContent);
numberOfVotesButton.addClickHandler(numberOfVotesButtonHandler);
numberOfVotesFormContent.add(numberOfVotesButton);

//Button to cast a vote
var voteForm = app.createFormPanel().setId(voteform);
var voteFormContent = app.createVerticalPanel();
voteForm.add(voteFormContent);
voteFormContent.add(app.createHidden(ideaID, row_i + "").setSize("0","0"))

// Identify the function schedule as the server click handler
var voteButton = app.createButton(I like this!).setId("voteButton"+row_i)
var voteButtonHandler = app.createServerClickHandler(casteVote);
voteButtonHandler.addCallbackElement(voteFormContent);
voteButton.addClickHandler(voteButtonHandler);
if (sheet_array[row_i][4].indexOf(Session.getActiveUser().getEmail())>-1)
voteFormContent.add(voteButton.setText("Thanks!").setEnabled(false));
else
voteFormContent.add(voteButton);

ideaContents.setWidget(row_i, 1, numberOfVotesForm);
ideaContents.setWidget(row_i, 2, voteForm);
}
app.add(submitIdeaButton);

Using Ui Services to embed User Interface in Google Sites

Ui Service was used to build the front end for the app. UI Services are based on GWT, so it is a good idea to have a basic understanding of the GWT framework. The following were used in building this app:

  1. Horizontal panel to display each idea;
  2. Vertical panel to display the list of ideas;
  3. Simple button to cast votes and submit ideas;
  4. Form panel to accept new ideas.

A real live working example is available here. Full source code is available here.

But why Google Apps Script?

So why did I choose Google Apps Script? Well for one it is at no extra cost, comes with your Google Account, it is in the cloud (i.e. no servers required), integrates well with Google Sites and Spreadsheets, and most importantly it uses GWT UI widgets. Google Apps Script’s UI Services and the ability to easily integrate with any REST interface make Apps Script an easy choice.

Saqib Ali

Saqib is a Google Apps evangelist at Seagate. He has used Apps Script to create a number of applications that leverage Google Apps. His other interests include the curation of Lewis Carroll’s letter and translation of Urdu poetry to English.

Read more »

Friday, February 27, 2015

LN01 How to Become an Expert


Just completed my second Learning Nugget (LN) entitled: How to Become an Expert?! Oops, I failed the the golden 1-minute spectrum rule (1:59 minutes or less)! This learning nugget is 2:52 minutes! But, besides that this one is certainly an improvement compared to the first one. 

CLICK HERE to visit the 1-Minute Learning Nuggets Project site.


LEARNING NUGGET 01



In my next learning nugget, I will explore another authoring tool. Stay tuned for that! Now, lets reflect in brief how this learning nugget was developed...


TOOLS USED?

Tools used to create this learning nugget:
  • iPad
  • PowerPoint (2013)
  •  Google Drive
  •  Explain Everything

References used:
  • How to be an expert? (diagram)
  • The 10,000 Hour Rule!(Infographic)


HOW?

This is how this learning nugget was created (in brief):

  1. Created quickly a visual storyboard in PowerPoint (2013). No narration scripts were created this time. 
  2. Created or mashed-up all the graphics in PowerPoint (2013). Remove Background, Group (items) and Save as Picture  are really useful PowerPoint features to cook up your own graphics.
  3. Graphics created or mashed-up were grouped (if needed) and then saved using the Save as Picture feature to PNG format to keep the background transparent.
  4. All the graphics were then uploaded (synched) to Google Drive.
  5. This time around, I imported the graphics from Google Drive to respective slides using the Explain Everything authoring tool on my iPad (It supports direct import from Dropbox, Evernote, iTunes and WebDAV, too).
  6. Used Explain Everything on my iPad to record audio (and video for one slide), and add the visual animations to the slides (concurrently). No headset with microphone was used. Sat in a reasonably quiet room to avoid background noise.
  7. Once completed, the content was published directly to YouTube from Explain Everything (cool feature).
  8. Mission accomplished! 


LESSONS LEARNED!

Creating learning nuggets is fun! Alright, this time around, I failed the 1-minute learning nugget spectrum (2:52 minutes). But, besides that, I have to admit that progress is being made. I still have got a long way to create WOW, but at least there is progress (Step-by-step!). Explain Everything ($2.99 USD only) is a pretty cool authoring tool for creating learning nuggets.

I really like the Explain Everything feature that empowers you to add video (head), while you present. It can be re-sized and placed anywhere on the screen. You can even run more than one video at once, while recording. Also, you can import videos, and even annotate on the video itself while playing during your recording. This is great for illustration, and when you want to highlight certain aspects in a video, while it is in motion. Thumbs up for that! Though, it should be made simpler to re-record (or edit) your video within your presentation. Otherwise, you have to always delete and create a new one, when you are not happy with the initial recording. 

My total production time was roughly 2 hours 30 minutes:
  1. Visual Storyboarding (20 min)
  2. Finding and mashing-up Graphics (30 min)
  3. Slide Creation in Explain Everything (10 min)
  4. Recording audio and animation (80 min)
  5. Publishing (10 min)
Based on this data, obviously I need to improve the recording audio and animation phase, and that is mostly because I didnt prepare a narration script. As I began recording, ideas started flowing on how to improve what I was saying here and there. In other words, next time I might as well create a narration script, which should not take more than 10-30 minutes (for a 1-minute learning nugget), and then the recording phase can be done faster (say 10-20 minutes). Best case scenario, I could save between 30 - 60 minutes on that phase alone. 

My target is to create quality 1-minute multimedia learning nuggets from scratch in less than an hour.  

Thats enough reflection for now! Stay tuned for Learning Nugget 02! What authoring tool should I explore next?
Read more »

Thursday, February 26, 2015

Lessons Learned from Students use of an Online Learning Environment

Link to article (by N. Beasley)
"This article highlights the lessons learned from recent research into the use made of an online learning environment by workplace-based students...
(Lessons Learned) The students, being workplace-based, often found that they had distinct blocks of free time to spend studying and said that if the materials were structured into timed units, more effective workplace study could be facilitated. Although the idea of tightly timed units is counter to the idea of self-paced, needs-based learning, on a practical level it may be beneficial to students trying to fit study into their working days. Although the students appreciated the activities provided, they stated that they would have preferred more of them, and more interactivity within them.

The evaluation indicated that if more use were made of visual, interactive elements, which would not be possible in the printed version, students would be more likely to use the web for other parts of the course as well, making more use of hyperlinks and the non-linear structure. A more explicit integration of activities and content would ensure that students studying using the activities view felt reassured that they were covering all the desired content. It is also key to provide students with explicit instructions on how to study effectively using the online learning environment and the activities within it."

Also, students liked the flexibility of the printed materials, which enabled them to study anywhere, and the ability to annotate the printed materials. Interesting article! There are several interesting lessons to be learned here .
Read more »

Wednesday, February 18, 2015

C Program to delete an element from an Array

C++ Program to delete an element from an Array

#include<iostream.h>
#include<process.h>
#include<conio.h>

void main()
{
clrscr();
int a[50],x,n,i,j,b[50];
cout<<"How many elements of Array you want to create?";
cin>>n;
cout<<"Enter elements of Array
";

for(i=0;i<n;++i)
cin>>a[i];
cout<<"Enter element to delete:";
cin>>x;

for(i=0,j=0;i<n;++i)
{
if(a[i]!=x)
b[j++]=a[i];
}

if(j==n)
{
cout<<"
Soory!!!Element is not in the Array";

exit(0);
}
else
{
cout<<"
New Array is ";

for(i=0;i<j;i++)
cout<<b[i]<<" ";
}
getch();
}
Read more »

Sunday, February 15, 2015

Resize an Amazon EBS Volume Cent OS with CPanel



  1. Create a snapshot of the volume you want to resize.
  2. Create a new bigger volume from the snapshot.
  3. power off (Stop) the Instance.
  4. Check the old volumes attachment information if you are not familiar with this (You will need to specify this on device: /dev/sda1).
  5. Detach the old volume.
  6. Attach the new bigger volume.
  7. Power on (Start) the instance.
  8. Go to WHM and log in as root
  9. Check if your servers ip has changed (it most definitely will) (IP Functions> Show IP Address Usage) copy the ip that will have your servers name.
  10. Go to (Server Configuration>Basic cPanel & WHM Setup).
  11. Go to Basic config change the ip address to the servers shared ip address that you copied above.
  12. Go to your WHM backend (Resellers>Manage resellers main/shared IP) and change all resellers ips to the servers main shared ip.
  13. Go to (Account Information>List Accounts) Edit the ips of all the accounts listed there to your servers ip (you copied it earlier).
  14. Ping your elastic IP (your Security Group should allow: ICMP from 0.0.0.0/0)-Not a requirement for this tutorial it just helps you see if the server is up.
  15. You now need to restart the server for the ip changes to take effect. (System Reboot>Graceful Server Reboot).
  16. When the server comes back up you will be able to see it pinging.
  17. You can now access your websites again and you have managed to attach a bigger EBS volume however the additional space is not being recognized.
  18. To check space (From SSH- run: #df -h) (From WHM: Server Status>Server Information)
  19. To resize the volume (connect via SSH and run:#resize2fs /dev/sda1) you will see something like this (Performing an on-line resize of /dev/sda1 to 131072000 (4k) blocks.)
  20. When it completes it will display (The filesystem on /dev/sda1 is now 131072000 blocks long.)
  21. If you now check from SSH or CPanel (see step 17) you will see that now all the volumes space is available

    Read more »

    Wednesday, February 11, 2015

    C program to find whether a given character is an alphabet digit or any special character using ASCII values


    #include<stdio.h>
    #include<conio.h>


    void main()
    {
        char ch;
        clrscr();    //to clear the screen
        printf("Enter any character:");
        scanf("%c",&ch);
        if((ch>=A&&ch<=Z)||(ch>=a&&ch<=z))
            printf("
    You have entered an alphabet");

        else
            if(ch>=0&&ch<=9)
                printf("
    You have entered a digit");

            else
                printf("
    You have entered a special character");



        getch();    //to stop the screen
    }
    Read more »