Skip to content →

flowing motion Posts

Uniform Server unexpectedly throws a php5ts.dll error

Uniform Server is a portable version of WAMP. Apologies if you are an expert developer but some people arriving here may not be so let me explain a little.

What is WAMP?

WAMP means Windows Apache MySQL PHP. It is a bundle of web server, database server and PHP language that we download onto our Windows laptops so that we can develop new websites locally.

What is Uniform Server?

What does portable mean in practice?

Uniform Server is a portable version of WAMP. You can install it on a USB stick and use it without installing it on your laptop. This is very useful when you are working in situations such as universities where you may not want to lug your laptop around with you. You can take your USB stick from office to library to lecture hall and plug it in to whatever computer is there. When you pull it out, you have left no “registry dust”, i.e., you haven’t changed the configuration of the computer at all. But you may have changed the content on the USB. The equivalent for Word would be that Word has been installed on the USB rather than on the computer.

What happens when I buy a new laptop before my project has ended?

A portable server is also useful when we have a long project because over the life of a long project, a laptop is likely to be replaced. By having everything to do with a project on a standalone portable server, we simply plug the USB into the new laptop. We don’t have to stop and think – what software is on here? What needs to be installed? Will the versions be compatible, etc.?

How do I make backups?

Having server, software and data in one place is also handy for backups. Though this makes for a big file, we usually handle backups in three levels. The server is backed-up. The program files are backed up. And the data files are backed up. Backing up at three levels is good practice and makes sense when the server is shared, when the program files are common and when data is specific. But for many researchers, a failure is a nightmare. We aren’t thinking in terms of three levels and panic ensues when something fails. Sorting the mess out can take days because we are unfamiliar with the processes. A bundle on a USB obviates that panic. Back up nightly. It is a bit slow but if the work is important, back up onto another USB or even onto your laptop and backup again via a tunnel to the university’s servers. Then the worst case scenario is a 24 hour loss. Just pick up yesterday’s USB and begin again there.

The flaw in Uniform Server

But I have discovered a flaw in the system. I had an old version of Uniform Server running on my laptop: 8.6.4. I started it up and it threw an error.


1. C:\my_uniform_server_directory_name\my_website_folder\usr\local\php\php5ts.dll was present.
2. I had other versions of Uniform Server on my laptop. Shutting down the first and starting up others threw the same error.
3. There was sometime between last time I started up Uniform Server and the error. It seemed unlikely that multiple versions of php5ts.dll had been corrupted and much more likely that something downloaded to my computer since I last used Uniform Server was clashing.
4. And here is the flaw. Though Uniform Server is fully portable, the path name set up within Uniform Server does not explicitly reference php5ts.dll. This means that when this .dll is called, Windows looks at it generic path statement and accesses the php5ts.dll in other versions of PHP on your computer (or fails to find it).

The fix for the php5ts.dll error

1. For each and every version of Uniform Server on your computer or USB stick, edit C:\my_uniform_server_directory\my_website_folder\usr\local\apache2\conf\httpd.conf to include a direct reference to the php5ts.dll file that came with Uniform Server. Simply add the last line to the list of code shown below.

Loadfile “C:/portables/”
Loadfile “C:/portables/”
Loadfile “C:/portables/”
Loadfile “C:/portables/”
Loadfile “C:/portables/”

5. Save, stop Uniform Server if it is running and restart. All should be well.

In short, phpt5ts.dll and Uniform Server

1. If you have an error message about pht5ts.dll, then check the file is present.
2. Think if there is any reason that if could have been corrupted.
3. Check the httpd.conf file and add the direct reference.
4. Test.
In all likelihood, Uniform Server was not picking up its own version of pht5ts.dll.


Leave a Comment

Read data files into R

Make what you will of this. It was written during a long day trying to make sense of the JHU course on R with liberal helpings of the simpler course from Princeton.  I haven’t checked the text for accuracy or typos and have put it here just so I can find it when I need it. If it helps you to make sense of R, good.

Get your data and save it in a .csv file

Your first task when using R to do statistical analysis is to collect the data.

Layout your data

Normally, you lay out your data in a table. Observations, cases, instances or people are in the rows. Variables or things you observed are in in columns.

Usually there is one column, which is unique but anonymous identifier for each case/row.

You will also have columns for ‘factor’ information such as gender (male/female/other), age (0-125), and so on.

You can put the column names in Row 1 – or you can leave out the column names and put the first case in Row 1.

Save your data

It is quite normal to load data into an Excel table and then to save it in .csv (comma separated value) format. 

.xls format can be read but .csv is more common and should be your standard practice.

You can also capture your data in Excel and save it as .text file. I will show you how to read both the .csv and .txt.

Read your data into R

Your second task is to read a data file into R so that you can use it and analyse it.

You have three primary ways to read in your file.  By the time you have worked through these methods, you will have mastered several basic R commands.

First method: Read the file from an online source

1.       Online urls tend to be long and cumbersome. So put the url into a variable called fileurl.

2.       We use <- to equate the variable and the url

3.       We surround the url with “”

4.       fileurltxt<-“” [name taken from one of the Coursera courses]

5.       For avoidance of confusion: notice this is a text file and even though we have made a variable with this name, the file we read in remains a .txt file.

6.       Alternatively: fileurl csv<- “”

7.       Now you can see why my variable was named – file-url-csv or file-url-txt – I don’t want to forget what I have done.

8.       To read a .txt file, simply:

mydata <- read.table(fileurltxt, header = TRUE) or mydata <-read.table (fileurltxt, header=T)

9.       To read a .csv file, simply:

mydata <- read.csv(filurlcsv, header = TRUE) or as above, abbreviate TRUE to T

10.    If you leave off the header=TRUE, the first line of the file is treated as data. Let’s spell this out: if you leave off the information about the header and the first line is a set of column headings, these will be erroneously treated as the first case. If you do not have headers, then of course, replace TRUE with FALSE or, just take out header=TRUE. I recommend setting header = FALSE so that when you return to your program after many months, you are immediately clear about what you did.

What you have learned to do so far

·        To set up a variable to store a long url

·        The <- command to “put data into a variable or matrix or table or dataframe”

·        To put “” around strings (includeing urls)

·        To check whether your data is in a .txt or .csv file

·        Adifferent command to read .txt and .csv files (read.table and read.csv, respectively)

·        To add header=TRUE or header=FALSE to say whether the top line of the file contains column headings or data.

·        To read your data into a data frame called mydata.  You can call mydata what you like (though you might discover some reserved names). Use a name that is short, descript and memorable.

At this point, you can easily read data from a location on the web and you have data in mydata ready to use.  If you want to see your data, simple type mydata followed by enter and your data will be listed.  If you have a very long file, don’t list all of it.  Type head(mydata) instead to get the top few lines and tail(mydata) to get the bottom few lines

So you have learned to more things:

11.    To read a data frame, simply type its name

12.    To read the first or last lines of a large dataframe, type head(dataframename) or tail(dataframename).

Read the file from a directory or folder on your laptop

If you have downloaded or aved a file onto your laptop, then you are going to follow exactly the same procedure as above. But you will have to replace the url within “” with a path and filename.

Begin by learning how to set your working directory.

1.       To find out your current working directory, use: getwd()

2.       To set a working directory, use: setwd(“C:/users/yourusername/documents/R”)

3.       Check that with getwd()

4.       Of course, if R does not exist, make the directory and put your datafile there

5.       The reason I used R is that when you load packages and libraries, R automatically makes this folder

6.       Note you can also put your data in a sub-directory “C:/users/yourusername/documents/R/datafiles”

7.       Of course, datafiles can be anything you chose to name it

8.       Also note that you must use / not \

9.       Assuming your data file is in /R/datafiles and that your working directory is R, then your path is “datafiles”

10.    Here are your new commands for reading a .txt file

filenametxt = “your file name including .txt”

path = “datafiles”

mydata<-read.table((file=file.path(path, filenametxt), header = TRUE)

11.    And for .csv

filenamecsv =”your filename including .csv)

path =”datafiles)

mydata<- read.csv((file=file.path(path, filenamecsv), header=TRUE)

Read any one data files in any one of many directories

Now let us imagine you are working on a large project and you have several data sub-directories (part1, part2, etc.).  And each directory contains many datafiles. The datafiles might be named with numbers (001.csv to 999.csv).  Everything in this section applies to .txt files too, but you must use read.table not read.csv and substitute .txt for .csv

1.       To be able to tell R to find the file you want, we set the file name as an argument in a function or script.

2.       Set up the barebones of the function:

getdatafile <-function(id, path){


3.       Type getdatafile to see the script

4.       Edit the getdatafile function by using fix(getdatafile) .  Note that you will edit in a little popup and when you save, you should see the corrected function on the original console.  I have had endless trouble with this, so work carefully to eliminate muddle. 

getdatafile <-function(id, path) {

read.csv((file=file.path(path, id)), header=TRUE)


Now run getadatafile(“filename.csv”,”datafiles”) by replacing your

The full datafile should come up on the console.

5.       Explore that further by editing getdatafile again and reading the file to mydata:

mydata<-read.table((file=file.path(path, id)),header=TRUE)

6.       Now the data will not read out. Moreover when you type mydata, you will get NULL, or a message that it does not exist, or values of my data that you put there earlier.  So rerun this command but clear mydata first with mydata<-0.

7.       To have access to the data, you have to set the value of the whole function as the value of mydata.  To do this, type return(mydata) just before the }

8.       Now when you run  the getdatafile(“put the file name here”, “put the path name here”), the data prints to the console again.

9.       To store this data for later use, you have to type mydata<-getdatafile(“filename”,”pathname”)).  The reason for this is that mydata only existed within the function and the ‘logic’ of a function is that you return a value of a function, not a value of things inside the function.  To tease this out further, you can have mydata=3 set before you call the function.  Unless you call the function “onto” mydata, mydata will continue to be 3, despite having read a whole file into another mydata within the function.

So what has been learned here?

·        A function has a specific form with

a.       The name of the function

b.      <-

c.       Function

d.      () containing arguments

e.      {}

f.       Code within the {}

·        The function exists to arrive a t a value, that might be one number or a large table.  This is what is returned.

·        The value of the function vomited up to the console unless we direct it to a variable such as valueofgetdatafile<-getdatfile(“filename”,”pathname”)

·        If we redirect the output into a variable within the function, such as mydata<- read.csv(filepathcsv), then we must remember to make the output the value of the function again but typing return(mydata) just before the last }

·        Once again, if we don’t want mydata vomited up over the console we must direct it into valueofgetdatafile

All this seems unnecessarily convoluted but, as I understand it, it is a function of the modularity of object oriented programming.  Don’t fight it, just master it.

As a final frill, we are going to make it easier to type in the file name.  At present, we have to type in “24.csv” or “345.txt” etc.

Can we make it easier and let people simply type (24,”path name here”)?

To do this, we will use a command called sprintf and two other commands called paste as.numeric. 

Sprintf allows us to add trailing zeros to a number.   For 1 to be 001, and 10 to be 010 and 100 to stay 100 –

filename<-sprintf(“%03d, id)

Notice that this command will fail when you want a file called 1000.csv.

To add on the .csv, use the paste command.  The paste command makes lists and adds spaces by default. Sep=”” removes the spaces.

filename<-paste(sprintf(%03d,id),”.csv”, sep=””)

Notice that you might have thought the items to be concatenated would be in their own (), but they are not.

Also notice, if you try this, that it still will not work because the id has been turned into text or character. To keep the number as the number, we will use as.numeric

filename<-paste(sprint(“%03d”, as.numeric(id)), “.csv”, sep=””)

Replace id in the read.csv (or read.table) commands and the user is at liberty to put the number of the file only without the extension into the getfiledate(id,path).

Note also that this little routine does not help if some of the files are .txt and some are .csv. They must all of be same type and the code must reflect the type and the read.csv or read.table must match.

You should now have a script that reads

getdatafile(function(id, path){


Mydata<-read.csv9(file=file.path(path, filename),header=TRUE)



And you use the script –

Gethecontentsofdatafile<-getdatafile(23, “datafiles”)

Where you put the number of the file that you want and datafiles is the directory /R/datafiles where the file can be found.

To retrieve the file, you type



This post covered how to read files into R from three sources – an external url, a folder on your machine, and from one or more directories containing many files.

It is important to check whether you are using .txt or .csv files and to change the scripts to match.  Also change the command – read.table is for .txt and read.csv for .csv.

It is also necessary to have the labelling of files in some coherent pattern.  This script goes up to 999 files and does not handle files with names like abc.txt.

We also covered the basics of a function – and the very confusing return function. It is best to play around with this until it becomes more intuitive.

Finally, we used three more commands –sprint that is used for printing and has a useful feature for adding trailing zeros and can make 1 into 001.

As.numeric stopped 001 turning into text and keeps it as a sequence of three digits.

And the paste command allows you to add .csv on the end and its feature sep=”” allows us to remove a space so 001 .csv becomes 001.csv.

I hope you find this helpful


Using data.frame in R

Data frames in R

A useful feature of R is the data.frame.

What is a data.frame?

Without being an expert in R: a data.frame is like a table.  So when I read a table from a .csv file, then it read it into a data.frame.

mydata<-read.csv(“myfile.csv”, header=TRUE).

Reshape data with a data.frame on the fly

A very useful feature of a data.frame is that I can construct it, on the fly, so to speak.

Let’s say I make a list that could correspond to column, in ordinary English.


And now imagine that I concatenate ten letters into a row:

row1= c(“a”,”b”,”c”,”d”,”e”,”f”,”g”,”h”,”I”,”j”)

I can make data.frame of two columns with col1, as is, and row1 turned into a column.

data.frame(col1, row1)

This is a very handy piece of data reshaping and I can do this with any combination of numbers.

I can also make this a bit neater add headings to my columns by extending the command

data.frame(vname1 = col1, vname2 = row1)

If I need to return this from a function then of course I place the command in the line above where the x is: return(x)

If I need to put the data.frame into an object, then myobjectname<-data.frame(vname1 = col1, vname2 = row1)


Leave a Comment

Getting started in R

I am currently doing the John Hopkins course on R that is offered through Coursera.   There is likely to be a gap between taking the course and using R, and these are my notes on how to get started.

Software and setup

  1. Google R, download the version to match your operating system, and install it on your machine using the defaults.  Set up a data folder in My Documents.


  1. Store your data in your folder in a .csv file.
  2. Use the first row to label your columns.
  3. Use NA to mark missing data.

Read your datafile

  1. Open R with the shortcut
  2. Read your datafile using this command substituting the filename for datafile:  data <- read.csv (“datafile.csv”)
  3. List your data to screen with this command: data
  4. Note that you can use any name you like instead of “data” [though I imagine there are some unallowable names]

Find out the number of rows/cases and varibles/columns

  1. To find out the number of columns where data is the name of your data as above : ncol(data)
  2. To find out the number of rows where data is the name of your data as above : nrow(data)

Print out the first line to inspect the names of your variables/columns

  1. Use this command where data is the name of your data as above : data[1, ]

Take a subset of your data

  1. For sake of the example, let the name of your first variable be VAR1 and your third variable be VAR3
  2. Make a new dataframe containing all rows where the values of VAR1 and VAR3 are as shown: newdata <- subset(data, VAR1 > 31 & VAR3 > 90)

Take a subset of one variable excluding missing data

  1. Set up a new variable/vector containing a LOGICAL variable which is TRUE when a value is missing: VAR1BAD <-[,1])
  2. Set up a new variable/vector that copies the values from the original vector, providing they are not “bad”: VAR1GOOD <- data[,1][!VAR1BAD]

Do some basic statistics on your newly created variable/vector

  1. Mean[VAR1GOOD]
  2. Max [VAR1GOOD]

Issues covered during the first week not listed above

  1. Vectors must contain data of the same type i.e., numeric, character, or logical
  2. A list can contain a mix of types
  3. When a vector, as opposed to a list, has mixed types, the type is “coerced” to the LCD, so to speak – logical is reduced to numeric (1,0) and numeric and logical is reduced to character
  4. R uses factors – which in essence are labels such as “male” and “female” where other statistics programmes used numerals. Note that the underlying value might actually be numerical.
  5. Data is read in as a dataframe rather than a matric i.e. as a table that can contain columns of different types. Dataframes can be converted to matrices.
  6. There are various tricks for using massive data sets not covered in this post.


Leave a Comment

A simple ‘to do’ list for Drupal 7 using Date & Calendar

This post describes a very simple ‘to do’ list that I made in a Drupal 7 website.

The website already had a Calendar and Date function.  I can add a Date, and all its details, which is recorded as a node of content-type Date and displayed on a Calendar View.

Already installed and enabled : Drupal 7, Token, Pathauto, CTools, Views and Views UI, Date, Calendar, Computed Field

To add items and to put them on and off the ‘to do’ list

To make this simple to do list, I decided –

  1. To add the things I want ‘to do’as a Date and, if they have no date, I record an arbitrary start date – say the end of the quarter or the end of the half.
  2. When I want to move an item to my active ‘to do’ list, I simply edit the item and change the start date to today or if it on this week’s list, to Monday.
  3. When I have finished the task, I edit the item again to reflect the finish date.
  4. As I will describe below, an odd feature of the filter’s in Views required an extra Boolean filed so I check a box when the task is complete.

Permanent record

With this simple set up, I have a permanent record, in one place, of all my projects that are pending, and of all my projects in the past with the dates when I started them and finished them

Adding focus

To keep me thoroughly focused, I made two taxonomies – one for work and one for leisure. Both of these were added to Date so that later I can retrieve work and leisure activities into separate Views.

Additional information

As I have both start and end information, I added another field to Date to calculate the Elapsed Time between the date I started and ended a project. There is code available on the internet and I repeat it here.  Simply, we retrieve the entity values for the two times, make DateObjects with the values, and then choose our granuality (‘days’).

I also added another field to Date, Days in Queue, and added similar code to calculate the time between the day the Date was added and the start date.

To display my ‘to do’ list

To display my current ‘to do’ list, I made a View in a Block, in table format, and display the taxonomy tag and Date title

I also added two filters. First, using a Relative filter, I selected Dates with a start date equal or larger than now.  Second, I searched on the Complete check box.  It is important to manually put in 1 and 0 as the default values when you set up the field initially, otherwise they will filter will not work in the View. The reason that I added what seems to be a superfluous checkbox is that the default finish date for a new task is not NULL, as one might expect, but the start date. The only way to select tasks that have been started and not finished is to add the extra box.

As I have made a Block, I can put the Block in a side bar.

Note also that we can tell the Block View to order the items in the order of the Taxonomy.  So when you set up the Taxonomy, ensure you put the tags for work into the order of your daily routine.

Note also that I did try using Editable Views but firstly, it did not work out of preview, and secondly, the preview showed a massive date edit screen that would not be user friendly.  So to record a project as finished, I follow the link and edit the Date and check the complete box.

To set up my ‘to do’ list

To review my pending list of items in the queue, I made another View, this time as a page. This time I use all four fields – Date, title, Elapsed Time, Days in Queue – in a table.

I can also filter by taxonomy.

Here I can pick my items, follow their link and change the start date to today or Monday.

To review what I have achieved

For those days when I have been buried in a task and feel that I have achieved nothing, I have an ordinary View of all four fields – Date, title, Elapsed Time, Days in Queue – in a table. This time, I have two exposed filters.  The first is headed, ‘Finish on or after’ and the second is headed, ‘Finished before’.

By setting my time range, I can immediately see what I have finished during the period in question.


I can repeat the entire setup for leisure items.

Features to be developed

My next tasks will be to track my Elapsed Time and Days in Queue, particularly for work items.

To understand my own planning behaviour better, I will group all my Dates by week and count the number of items inserted and the number of items that are finished. Now I will have the basic information to understand my queue – how fast am I adding things and how fast am I finishing things.  Ideally, I’ll plot these numbers on a graph.

To understand the chunking of my tasks, I’ll group them again by week and calculate the minimum, average and maximum Elapsed Time.   Hopefully, both the spread of times and the average time will decrease below 5 days – meaning, I have designed tasks that can be finished within a week.

And I will calculate the minimum, average and maximum Elapsed Time and Days in Queue for a moving period of quarters, halves and years so that I can be aware of how long I take to complete something I have decided to do and how my behaviour changes in time.


There it is.  A simply backlog manager.  Add Dates to a Calendar.  Use Computed Fields to monitor both the Elapsed Time and the Days in Queue. Use a check box to show a task is complete because filtering by a blank end date does not work.  And add two taxonomies so that you can split your lists and display tasks in order.

One Comment

How to make a Slideshow in Drupal 7

How to make a slideshow in Drupal

The concept behind a slideshow

A slideshow in Drupal is actually a View.   A View is a query that will search through your pile of nodes, pick out any that match the criteria you set, and display them in a format you set.  Slideshow simply extends Views to layout your content in a slideshow with our without a carousel.

This post will describe how to get the slideshow working without a carousel.

Before you start

Before you start, you will obviously need a working Drupal website with some content, such as a collection of images.  You can also use a slideshow to display ordinary posts as I do on the front page of Rooi.  We will use images here because that is the more common use.

Additionally, you need to have View downloaded and enabled and you will also have to enable its sub-module View_UI.

You also need to know, at least roughly what the following mean:

  • Page and block
  • Content-type, node and field

Modules & Plugin

To set up Slideshow, you will need the modules: Libraries, Views _Slideshow, Views_Slideshow_JCarousel and Libraries.  When you enable Views Slideshow, also enable Views_Slideshow_Cycle.

Additionally, you will need the jCycle plugin which you download from (get the .zip file on the right).

Unpack the file into your Libraries folder. If you don’t have a Libraries folder, make one under /sites/all/.  Rename the folder that the .zip file creates as jquery.cycle.

Make a View Slideshow

You will recall that to make a View, you go to Structure/Views and make a new view.

Screen 1

  1. Add a name and a description
  2. Choose your content.   Notice that everything on the list is a content-type. If you have a separate content-type for images, choose it. Otherwise choose a content-type that has a field for images. The default content-type Article has a default field for images and I chose Article.
  3. Decide whether you want to display your slideshow on a page or a block.
  4. If you chose page, check the path.
  5. At format, choose slideshow.
  6. Set the number of images to show before pagination kicks in.
  7. Decide whether you want a direct link to show on a menu.
  8. Continue & edit but beware, your work has not been saved at this point.

Screen 2

  1. The second screen has a baffling array of controls.  Look over them carefully and ignore Advanced Options in column three for the moment.
  2. The middle column controls the path, the links to menus, the permissions, and pagination.
  3. Most of the controls that you want for a slideshow are in column one.
  4. Starting at the top, you see Display Name and Title. Display name is the name used to when Views are listed. Title is the name displayed as part of the view – that is, above the slide show.  So make sure the Display Name speaks to administrators and developers and Title speaks to users and visitors.
  5. The next four blocks cover FORMAT, FIELDS, FILTER CRITERIA and SORT CRITERIA.
  6. Starting from the bottom — as those are easiest to understand – Sort Criteria telsl you the order in which slides will be displayed.  If you want to change the order, this will be the block where you will find the controls.
  7. Filter Criteria is also fairly self-explanatory:  with the default settings, the slideshow will only display published content that is an Article.
  8. The FIELDS block, if you followed the instructions for Screen 1, will be blank.
  9. FORMAT refers in the first line to Slideshow|Settings and Content|Teaser.  We will begin with Content and you will see that varying the Content changes your Field options in the Fields block below.
  10. Click on Content and choose Fields.  Now you see Content:Title come up below.  You can also Add a field.
  11. Add a field and you will see many choices.  Think a little – you are looking for Content: Image.  Add that, and it will come up in the Fields block.

Inspect Preview

Scroll down to the bottom of your screen.  You should see a slideshow of all the images that you have uploaded into Articles with the title of the Article above the Image.

Save and go to the menu where you linked the slideshow or type in the url to see your work on your website.

Advanced Option

You might also note that you are also seeing the title to every Article, whether it contains an Image or not.

To add a another Filter to choose only the Articles that contain an image, you can look first at the list of Filters.  I don’t think we will find a suitable filter because we are displaying nodes of content-type Article and we want a logic that would go something like “contains an image” rather than “is an image”. But look anyway.

(Remember to edit a View, go to Structure/Views.)

I went instead to Advanced Options and chose the Relationships. On that list I could find Content:Image (field). I added it and checked required.

Now my slideshow only contains Articles which contain an image.  And it is cycling nicely.  Save if you wish.

Slideshow Settings

What if I want to speed up my slideshow or add previous and next buttons?

Go back to the View and go to Slideshow | Settings in column one.  (Btw, if you have not downloaded jcycle correctly, on the following screen you will get a big warning message in red. So if something is not running correctly and you want to eliminate jcycle as being the cause look here.)

To get some basic settings, scroll down to the bottom and check the options under Bottom of the page.  Be patient as when you check the options, more options are revealed.

Oddly, the controls aren’t working as I expected them to.  I checked all three and checked the option to stop when hovering.  Only the counter is showing at the bottom for me.


So far, we have downloaded the correct modules and plugin and set up the basic slideshow view.

You know how to reveal fields and to add fields.  You know how to filter on the content-type (column 1) and on the fields (under Relationships in column three).  And you know where to find the settings to control the slide show.

You can also decide where your slideshow will go on you site – onto a page or block and if it is page, attached to a menu or not.

The next post will describe how to get the carousel working.






One Comment

How to install WYSIWYG and CKEditor on Drupal 7

To install WYSIWYG successfully, it is helpful to understand that works at three levels: text filters, WYSIWYG and Editor.

Text filters

Drupal 7 arrives with pre-installed text filters.  If you have a fresh install (and even if you don’t), got to the admin bar at the top of screen and select Configuration.  On the left hand side, close to the top, you will see Text Filters.  Have a look at these.  You will see Filtered HTML, Full HTML and Plain Text.

The filters give you control over three things:

1.  Who can use Full HTML, or Filtered HTML and who must use plain text.

When you are new to Drupal, leave everything on default.  You can see that with the default settings only administrators can use Full HTML.  Later on, you might want to limit anonymous users to plain text as Drupal attracts spam.

2. Which Filter is used by default

Also, note that Filtered HTML is at the top. That means that is acts as the default, even for administrators. If changing the filter manually becomes annoying when you need Full HTML, change the order.  You can change the order back again later, if you wish.

3.  The exact functions of the filter and the order in which they work

As a general rule, do not play with the settings. There are several of them and when you fiddle, you are fiddling with relationships to the underlying code and to the effect of combinations of settings.  When in doubt, don’t touch!

There are three settings that you will probably want to change though.

  1. When you add the Media module, you must check the box for “Convert Media tags to markup” (and Save).  The Media module will remind you if you forget. You must check this box in both Filtered and Full HTML.
  2. When you add the WYWIWYG module, you are recommended to uncheck “Convert line breaks into HTML (i.e. <br> and <p>)”.  Uncheck this box in both Filtered and Full HTML.
  3. Additionally, when you add the WYSIWYG module, go to “Limit allowed HTML tags” under Filter Settings near the bottom of the page, and add <p> and <br>.  You only need to add these tags in Filtered HTML.

Text Filters is the first level of setting up WYSIWYG.

WYSIWYG module

You can install and enable the WYSIWYG module in the usual ways.

  • Either, use drush (drush dl wysiwyg) and (drush en –y wysiwyg)
  • Or, go to the admin bar/modules and insert the url that you retrieved from the WYSIWYG page. When prompted, enable the module.

WSYIWYG should now show up on the Configuration page under Text Filters. If it does not, then clear your caches.

  • Either, use drush (drush cc, followed by 1 when prompted)
  • Or, go to the admin bar/configuration and performance where you can clear all caches.

Go to WYSIWYG at the Configuration page and you will see the three Text Filters you saw in the first stage above, with a drop-down box that says “No Editor”.

Your next task, is to go to the “third level” and install an editor. Then we will configure a combination of WYSYWYG and the editor you have installed.


Drupal will prompt you with a list of editors and highlight one in particular, CKEditor, in pink.  CKEditor is very well established but I must begin with two warnings.

  • Do not install the CKEditor for Drupal.  Install the normal CKEditor.
  • Do not install the most recent CK Editor, because Drupal/WYSIWYG will insist that it cannot see it.   You can install the latest development version of WYSIWYG (by downloading it manually into the WYSIWYG folder), but it does not play nicely with DRUPAL and destroys the Edit layout and does not render a tool bar.  Install an older version, say 3.5.
  • Do not fuss about all the instructions about where to put the CKEditor. Download the zip file and unzip it into /www/yourwesbite/sites/all/libraries. If this is the first library that you are installing, then you must create the library folder.  CKEditor will unpack itself neatly.

Once you have an (old) version of CKEditor, when you go to WYSIWYG on the configuration page, you should now see CKEditor in the drop-down box where you once saw No Editor. If it doesn’t show up, try cleaning your caches before you panic.

Now you can configure your WYSIWYG/CKEditor.  You only have one task to do but you must do it for Filtered HTML and Full HTML. And remember to save each time.

Click on Configure and go to Buttons and Plugins. Check all the buttons that you want on your tool bar. Be mean, rather than extravagant but remember to check “HTML Block Format” which give you a drop down list for headers and “Media Browser” if you are going to add the Media Module (near the bottom).  This may feel like a tedious chore, but enjoy – when you are done with this you will have working WYSIWYG.


WYSIWYG requires you to think at three levels.

  1. Set up your text filters and prepare for the addition of WYSIWYG and Media as I described in the first section above.
  2. Install WYSIWYG and go to the configuration page where you are prompted to get an editor.
  3. Get an old version of CKEditor and set up the buttons for your tool bar with the configure button.




One Comment

8 scenarios to think clearly about mobile first

What is mobile first?

Mobile first.  This is the new mantra for web design.

We design the smallest screen first and design the larger screens later.

Does mobile first help me position my service?

As the owner of a service, I like mobile first.

Mobile first constrains me to think clearly about the main purpose of my website.

The small screen prompts me to edit, edit and edit again until I am saying what I need to say, simply and completely.

Where can I get good examples of mobile first?

Though the mobile first mantra has become a mantra, when I google mobile design, I have found very little advice about how to think about mobile design.

Oddly, blog posts promising 50 best responsive sites, for example, immediately contradict the mobile first mantra and show the desktop layout first.

In short, much to my frustration, I haven’t found a good catalogue of examples of responsive design that is mobile first.

What advice on mobile first is out there?

The advice out there is either very generic (think about what the customer wants) or very technical about media queries, for example, or very sophisticated, such as have dummy actions to make the user think your website is more responsive than it is.

To get started on using mobile first, I am going to have to think through the principles for myself.

How does mobile first clarify my service design?

The scenario

Mobile users are probably on the go somewhere.  They are unlikely to be at their desk.  They don’t have a keyboard.

Not only are they away from the conveniences of their own desk, at any time their signal might fail.  They are very likely to be interrupted by something going on around them, or by having to break off a task and ‘move on’, get off a train,  say.

They not even all that likely to be sitting down.  They may be on public transport with their bags and worldly possessions between their feet, with one hand hanging onto the overhead strap, and only one hand and a thumb to work their mobile phone.

What mobile users want and need

Clearly, the interaction between mobile users and myself must

  • Obvious at a glance
  • Not disturbed by noise and activity around the user
  • Manageable one handed with a thumb
  • Complete in itself in a very small window (a few seconds).

This list feels dull and pedestrian.  It is certainly “micro”.  Can I really conceptualise my interaction with a user as a matter of seconds?

Mobile interactions are small

The smallness, if not meanness, of mobile engagements, stopped me in my tracks.  Has life come down to a few seconds?

Alternatively, I can ask was life ever about more than a few seconds?

What did we do before we had mobile?

If we arrived at the supermarket without a shopping list, for example, what did we do?  Instead of calling home to get oyur list, we had to guess?

Before we had mobile, when we were sitting on a train, we made a plan in our head for what we would do when we left the train.

After all, we still do this when we are driving, or when we don’t have a signal.

Plus ca change – has mobile changed anything?

I am not totally convinced that mobile has changed anything.

To continue the supermarket example, we might be able to call home to get our shopping list and rectify our own confusion, but our relationship with the supermarket does not change.

The supermarket doesn’t have our goods waiting for us when we arrive.  Nor, do they send us scooting around their warehouse with an efficient map like an Amazon worker.  Nor, does a robot fetch our goods for us.

Our relationships with our users persist even with mobile

The relationship between user and supplier, at least in the case of the supermarket, has not changed.  All that has changed is that the user can be a little more efficient.

I am going to use this insight as a heuristic and generate all the relationships we might have with a user and look where our offering of a mobile experience might allow them to be more efficient.

What do we do when we are mobile and don’t have a signal?

When we are driving or sitting on a plane without a signal, how do we think about lives and our relationships with the various people on whom we depend?

What do we want to know and what decision have are we thinking about making?

What will make us happy and feel we have achieved what we set out to achieve?

Scenario 1

I am whiling away the time and hoping for something to do to pass the time.  If I don’t have an internet connection, I might pick up a free newspaper or an inflight magazine.

Scenario 2

I might feel at a loss in the setting and not want other people to see that I feel at a loose end.  If I don’t have a mobile connection, I might scribble on a notepad or pretend to look seriously at the artwork on the walls.

Scenario 3

I might want to catch up with news, international or purely social, and be taking this moment because my movements precluded doing it earlier.  Without a mobile connection, I might look at a newspaper for news or glance at my email or social media messages.

Scenario 4

Particularly at the beginning of the day, I might be looking for amusement and entertainment as a mood-maker to start the day with a smile.  In days gone by, I would have looked for the daily cartoon.


Scenario 5

Particularly at the end of the day, I might be hoping for some inspiration or distraction to contradict a disheartening day, or recent encounter.   Anything, which allows me to jump the tracks of despair, and to creatively restore hope, will do.  Without rich resources, I would have depended on my imagination and memory.

Scenario 6

I might have a specific problem to solve and I am hoping that someone has put a clear solution online. For example, how do I check my foot size before buying shoes?  Or, how do I think economically about mobile design?  Is there someone out there who is sufficiently expert to lay out the issues clearly?  Without a connection, I might be thinking about how to find out and whom to ask when I am connected to the world again.

Scenario 7

I might be looking out for a specific message from someone – on my email, twitter account, or even on a broadcast service.   I am looking for something specific and I want to go to a url, log in if necessary, and get an answer to my question.  Has the message come and can I relax or move to the next stage of a task?

Scenario 8

I might be hoping to make a specific action.  To take a simple example, I might want to bookmark ten useful sources that I can follow up at home.  At this stage, we might be tempted to mimic a website set up for desktops.  It might be more helpful to think through the basic actions first.  What actions? What information do I need to act and what will the action be?  How do I know when I am done (or when I am half-done)?  How will I remember how far I got?

Using the scenarios to gain insights

Working through the scenarios, I was struck that the first scenario and possibly, the fifth, fall into window shopping.   These services might be important to regular customers of mine but probably of limited value to someone looking desultorily for distraction.

Scenarios 2, 3 and 4 provide services to clients that used to be served by mainstream media and newsletters.  To the extent that we have anything useful to contribute, clients might like this service.

Scenario 6 offered a specific insight for my kind of business.  Design my layout to show the questions, provide sufficient information for the user to judge whether they have found their answer, and make provision to bookmark the link in some way.

Scenario 8 turns out to be the most insightful for me.  So often when we start a new task, the steps aren’t clear to us.  Thinking in the micro terms of mobile helps us communicate the structure of tasks more clearly to our clients.

Scenario 7 seems to be more a matter of general services but will include messages from us.

Moving forward

I am going to begin from here.  Do these insights help me visualize the small screen of mobile and what my clients would like to receive as they, for example, hang from a strap on a jolting train, and attempt to look something up one handed with only a thump free?



One Comment