Learning and Corporate Development - Hometag:lcd.weblog.glam.ac.uk,2011:mephisto/Mephisto Drax2010-08-19T09:45:01Zrtylertag:lcd.weblog.glam.ac.uk,2010-08-19:1302722010-08-19T09:38:00Z2010-08-19T09:45:01ZSCRUM (Agile Methodology)
<h2><b>SCRUM</b></h2>
To succeed in software development in today’s environment we must deliver with speed and flexibility, old methods of developing are beginning to fail due to customer’s requirements and priorities frequently changing.<br><br><h2>Scrum’d up</h2>Scrum is an agile process that enables us to deliver the best possible product in the shortest time.<br> <br>
Scrum promotes rapid software development that is inspected every 2-4 weeks.<br><br>
The business sets the priorities. Teams self organize and find best ways to deliver.<br><br>
Software is demonstrated every 2-4 weeks, decisions are made to release, continue or refine.<br><br><h2>Characteristics</h2>
• Self-organizing teams<br>
• Product progresses in a series of sprints (Fortnightly in our case)<br>
• Requirements are stored in a “Product Backlog” (Pivotal Tracker)<br>
• Full specification unknown<br>
<h2>Agile Manifesto </h2>
<img src="http://www.devballs.com/wp-content/uploads/2010/02/agilemanifesto.gif"><br><br>
<h2>Sprints</h2>
An iteration of work, functionality is implemented during a sprint. <br><br>
The sprint starts with a one-day sprint planning meeting. Many daily Scrum meetings occur during the sprint (one per day). At the end of the sprint there should be a sprint review meeting, followed by a sprint retrospective meeting.<br><br>During a sprint the product is designed, coded and tested. Traditional methods of developing would separate these techniques, scrum teams do a little of everything all of the time.<br><br>During a sprint is not the time to make changes!<br><br>
<h2>Scrum Framework</h2>
<b><h3>Roles</h3></b><ul><li>• Product owner</li><li>• Scrum Master</li><li>• Team</li></ul>
<br><b><h3>Ceremonies</h3></b><ul><li>• Sprint planning</li><li>• Sprint review</li><li>• Sprint retrospective</li><li>• Daily scrum reporting</li></ul><br>
<b><h3>Artifacts</h3></b><ul><li>• Product backlog</li><li>• Sprint backlog</li>
<h3><u><b><i>Roles</i></b></u></h3><br><b>Product owner</b><br>• Define product features<br>• Decide release date and content<br>• Responsible for profitability of the product<br>• Prioritise features according to value<br>• Adjust features and priorities, at every iteration if needed<br>• Accept/reject work<br><br><b>ScrumMaster</b><br>• Represents management to the project<br>• Enacts Scrum values and practices<br>• Removes barriers<br>• Ensure team is productive/functional<br>• Enable close co-operation across roles and functions<br>• Remove external interferences<br><br><b>Team</b><br>• Cross-functional (Programmers, testers, user experience designers)<br>• Should be full time<br>• Self organizing<br>• Membership should not change mid sprint<br><br><br><h3><u><i><b>Ceremonies</b></i></u></h3><h3><b>Sprint planning</b></h3>
<img src="http://lcd.weblog.glam.ac.uk/assets/2010/8/19/Picture_16.png">
<br><br>The Sprint planning meeting is a negotiation between the team and the product owner about what the team will do during the next sprint.<br><br>The product owner and all team members agree on a set of sprint goals, which is used to determine which product backlog items to commit from the uncommitted backlog to the sprint. <br><br>Typically the team will then excuse the product owner from the room and break the backlog Items down into tasks. The product owner is expected to be on call during this phase (previously called the sprint definition meeting) for renegotiation or to answer questions that affect the time estimates. This portion of the sprint planning meeting is time-boxed to four hours. Sometimes teams insert placeholder tasks (with rough estimates) for the product backlog items they don't expect to start working until later in the sprint.<br><br>
<h3>Sprint review</h3>
Team shows what the sprint has accomplished; this is often a quick demo of new or refined features. If no visible changes have been made it may be worth explaining that time has been spent refactoring code.<br><br>This is an informal meeting that needs minimal preparation, invite the whole team and others.<br><br>
<h3>Sprint retrospective</h3>
<br>The sprint retrospective meeting is held at the end of every sprint after the sprint review meeting. The team and ScrumMaster meet to discuss what went well and what to improve in the next sprint. <br><br>The product owner does not attend this meeting.<br><br>The team should take time to reflect on what is working and what is failing. <br><br>What should the team:<br>• Start doing<br>• Stop doing<br>• Continue doing<br><br>
<h3>Daily scrum reporting</h3>
<br>• Daily<br>• Short (15 minutes)<br>• Can be stand up<br><br>This is not a time for solving problems.<br>Helps to avoid further meetings.<br><br>Each team member should answer 3 questions:<br><br>1. What have I done since the last scrum?<br>2. What will I do before the next scrum?<br>3. What may stop my progress?<br><br><h3><u><i><b>Artifacts</b></i></u></h3><br><h3>Product backlog</h3><br>• The requirements<br>• A list of all desired work on the project<br>• Ideally expressed such that each item has value to the users or customers of the product <br>• Prioritised by the product owner<br>• Reprioritised at the start of each sprint<br><br>The requirements of the system are held in a backlog, this is a prioritised list of work to be completed. These jobs/tasks are made up features, chores and bugs. <br><br>The product owner should take responsibility to prioritize the product backlog. During a Sprint planning meeting, backlog items are moved from the product backlog into a sprint.<br>
nwillia2tag:lcd.weblog.glam.ac.uk,2010-08-11:1294162010-08-11T13:53:00Z2010-08-11T14:22:09ZRails... Staying on 'track' with partials
<p>
I've recently started developing in Ruby on Rails and I just thought I'd dump some of my new found knowledge somewhere, so that maybe it would help me again in the future.
</p>
<p>
Before using rails I was well into my ASP.NET and the move is obviously very different. I feel myself trying to think of how to do things in rails the way I would have done it in .NET... this is BAD! Each time I ask a question in the office about doing something, the first response is normally "why do you want to do it". Most of the time, my answer is "this is how I did it before" :)
</p>
<p>
Anyway, I will learn, in time, to leave the .NET methods behind me and embrace this so well renowned language.
</p>
<p>
During my learning process there is one aspect of Rails which did make me quite excited, this part is partials.
</p>
<p>
Partials make cleaning up your code insanely simple and just make the programming experience far more enjoyable. I've used a similar idea in .NET before, using UserControls, but partials are just so much simpler.
</p>
<p>
Below I talk about a couple of things I've found out today, I'll try and make this more comprehensive and more factual (!) as time gores on and I start using partials in more scenarios.
</p>
<h2>My Environment</h2>
Ruby: 1.8.7
Rails: 2.3.2
<h2>Using a single partial</h2>
<p>
Lots of the examples on partials I've read online all discuss the various ways they can be called..
</p>
<h3>Example uses 'user' controller to manipulate users of a system.</h3>
<p>I've found the following statements online and all should work when your partial file is called '_user.html.erb'</p>
<pre>
render :partial => @user
render :partial => "user", :object => @user
render :partial => "user", :user => @user
render :partial => "user", :locals => { :user => @user }
</pre>
</p>
<p>If you have a partial that is called the same as your controller, e.g. '_user', then you might aswell go with the first example as I believe this is the latest implementation and rails does a lot of the work for you. You don't have to worry about passing :object or :collection, it just works out which it is and gives you the correct instance variable 'user' in the partial file.</p>
<h3>But what if you want more than one partial?</h3>
<p>The above methods would be fine to use for a form or a list, but you wouldn't really want to use the same one for both, as the list will have a different structure to a form.</p>
<p>I did go down the road of having some conditions in the one partial to identify whether the form should be rendered or the table (for the list). But this just over complicates things for no reason.</p>
<p>When I seperated the functionality into two partials: '_userForm' and '_userList', I started having problems with the instance variable that is generated for me.</p>
<p>It turns out, that the following code creates an instance variable called 'userForm' rather than 'user' inside the partial</p>
<h3>Example - Code to render the form partial</h3>
<pre>
render :partial "userForm", :object => @user
</pre>
<p>So I then wrote the following code, thinking it was the new way to cope with this, but it just seemed to break the functionality.. When using 'user', you get 'user' is undefined and when you use 'userForm' as the instance variable, you get invalid use of nil.</p>
<pre>
render :partial "userForm", :user => @user
</pre>
<p>So to get around this I used the '_user' partial for the form / details page and the '_userList' partial for the listing of data.</p>
<h3>Example - Calling the form partial ('_user')</h3>
<pre>
render :partial => @user
</pre>
<h3>Example - Calling the list partial ('_userList')</h3>
<pre>render :partial => "userList", @collection => @users, :as => :user</pre>
<p>Now that I've finished my first ever blog post I've realised that I will need to edit this and break it down to actually get to a point!! Please take anything I've said in this post with a pinch of salt as I've posted examples from memory :). To be continued... / refactored!
If you want a very good reference to partials, the best one I've found is this: <a href="http://guides.rubyonrails.org/layouts_and_rendering.html">http://guides.rubyonrails.org/layouts_and_rendering.html</a>
rtylertag:lcd.weblog.glam.ac.uk,2010-08-11:1294032010-08-11T09:32:00Z2010-08-11T09:33:53ZRails Console SQL Output
<p>It is sometimes useful when in Rails Console to see the SQL produced when testing model relationships.</p>
<p>So you start up "Rails C" or for people on older versions of Rails "script/console"</p>
<p>First run this line:</p>
<quote>ActiveRecord::Base.logger = Logger.new(STDOUT)</quote>
<p>Lookup some record and you will see the SQL (If you are using a SQL database) that was produced:</p>
<img src="http://lcd.weblog.glam.ac.uk/assets/2010/8/11/Console.png" />
rtylertag:lcd.weblog.glam.ac.uk,2010-05-21:1245862010-05-21T13:25:00Z2010-05-21T13:26:30ZRails 3 Beta and RVM
<div class="content edit_area"><h2>Rails Version Management (<span class="caps">RVM</span>) and Ruby 1.9.1</h2>
<p>Run this in terminal:</p>
<pre><code>mkdir -p ~/.rvm/src/ && cd ~/.rvm/src && rm -rf ./rvm/ && git clone git://github.com/wayneeseguin/rvm.git && cd rvm && ./install</code></pre>
<p>Read the output, it will tell you to add a line of code to your bash_profile.</p>
<p>Then run:</p>
<pre><code>rvm install 1.9.1</code></pre>
<p>this will install ruby 1.9.1, may take some time.<br></p>
<p>As long as this is successful then run:</p>
<pre><code>rvm 1.9.1 --default</code></pre>
<p>This will set ruby version to 1.9.1 and make it the default for new terminal screens.<br><br>To Change version type:<br></p>
<pre><code>rvm system</code></pre>
To view all versions type:<br><br><span>rvm list</span><br><br>
<h2>Installing Rails 3 beta</h2>
<p>To install Rails 3 Beta run these two lines of code:</p><pre>gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n<br>gem install rails --pre<br></pre><p><span class="caps">If you want to use SQL Lite for your app:<br></span></p><pre>gem install sqlite3-ruby</pre><p><span class="caps">MAKE SURE not to use "SUDO", this is no longer required when installing gem!<br></span></p>
<p>Create a new Rails application:</p>
<pre><code>rails beta<br />cd beta<br></code></pre>
<p>To run the server you will need to type:</p>
<pre><code>rails server<br><br>No more script/server!<br><br><br><br></code><br><br></pre></div>
rtylertag:lcd.weblog.glam.ac.uk,2010-05-18:1243712010-05-18T11:45:00Z2010-05-18T11:46:12ZGitHub
<p>A great resource for learning Git:</p>
<p>http://progit.org/book/</p>
rtylertag:lcd.weblog.glam.ac.uk,2010-03-29:1209792010-03-29T14:34:00Z2010-03-29T14:36:47ZJavaScript Loop Checkbox Array
<h2>Looping through an array of elements</h2>
<p>
A list of records in a form required two tick boxes, each an array holding the id of the record. Only one box should be ticked:
<br />
</p>
<img src="http://lcd.weblog.glam.ac.uk/assets/2010/3/29/checkboxes.png" />
<p>
The HTML of the Check boxes:
</p>
<p>
<strong>input type="checkbox" value="22" onchange="reject_check(22)" name="confreject_ids[]" id="confreject_ids_"</strong>
</p>
<p>
<strong>input type="checkbox" value="22" onchange="accept_check(22)" name="confaccept_ids[]" id="confaccept_ids_"</strong>
</p>
<ul>
<li>On clicking a check box the function is called and the ID of the record passed, so if an accept checkbox is pressed then the <strong>reject_check(id)</strong> function is called.</li>
<li>The script sets a variable to the array of checkboxes</li>
<li>Sets a variable to the number of checkboxes</li>
<li>Loops through the check boxes and checks the value it holds.</li>
<li>If the value equals what was passed through to the function then it is the check box belonging to that record and it is unchecked.</li>
</ul>
rtylertag:lcd.weblog.glam.ac.uk,2010-02-03:1166962010-02-03T10:08:00Z2010-02-03T10:10:02ZRuby on Rails - Code Escape
<p><strong>A quick Ruby tip for breaking up a long line of code:</strong></p>
<p><code>def app_state</code><br />
<code> if self.title_id != nil and self.title_id != '' \</code><br />
<code> and self.given_names != nil and self.given_names != ''\</code><br />
<code> and self.surname != nil and self.surname != '';</code><br />
<code> return true</code><br />
<code> else</code><br />
<code> return false</code><br />
<code> end</code><br />
<code>end</code></p>
<p>Use \ at the break point of each line and ; at the end of the last line.</p>
rtylertag:lcd.weblog.glam.ac.uk,2010-02-01:1165882010-02-01T15:29:00Z2010-02-01T15:29:56ZRuby on Rails Authorising Ownership
<p>Given an application has users and tasks.</p>
<p>A user signs into a website and would like to see their tasks, you define:</p>
<b><p>def index</p>
<p> @tasks = current_user.tasks.all</p>
<p>end</p></b>
<p>This is fine as only the logged in users tasks will be shown.</p>
<p>The problem is usually in the show definition, most show methods will look like this:</p>
<b><p>def show</p>
<p> @task = Task.find(:params[:id])</p>
<p>end</p></b>
<p>The problem with this, a user logs in to the website, and follows a link to a specific task they will see in the <span class="caps">URL</span>:</p>
<p>/users/42/tasks/20</p>
<p>If the user changes the <span class="caps">URL</span> to:</p>
<p>/users/42/tasks/33</p>
<p>They are able to view a task that does not belong to them.</p>
<p>A solution to this is to change the lookup to include the current user:</p>
<p><b>@task = current_user.tasks.find(params[:id])</b></p>
<p>This will only return the record if it is owned by the current user, other wise an error is returned.</p>
rtylertag:lcd.weblog.glam.ac.uk,2009-12-11:1123012009-12-11T14:16:00Z2009-12-11T14:23:15ZMounting a Windows Share on Linux
<p><strong>Ubuntu</strong></p>
<p><strong>Mounting a Windows Share</strong></p>
<p>In this instance the connection to the Windows share is from a Ubuntu server.
Open terminal on your Mac and connect to the server you wish to mount a new drive on:</p>
<p><strong>ssh -p 8888 user@stagingserver.isd.domain.ac.uk</strong></p>
<p>Change Directory to ‘etc’</p>
<p><strong>cd /etc</strong></p>
<p>Then open fstab using the VI editor:</p>
<p><strong>sudo vi fstab</strong></p>
<p>Add a new line to the file:</p>
<p><strong>//servername/share /mnt/share smbfs user,credentials=/etc/samba/cred-file,uid=user,gid=users 0 0</strong></p>
<p>The key values here are:</p>
<p>(server/share) (mount point) (File System) (Options)</p>
<p>The mount point must exist:</p>
<p><strong>cd /mnt</strong></p>
<p><strong>sudo mkdir share</strong></p>
<p><strong>sudo chown user:user share</strong></p>
<p>This will create a new directory named “share” and grant ownership to “user”</p>
<p>Next install Samba and smbfs using aptitude</p>
<p><strong>sudo aptitude install smbfs</strong></p>
<p><strong>sudo aptitude install samba</strong></p>
<p>Change directory to /etc/samba and create the credentials file:</p>
<p><strong>cd /etc/samba</strong></p>
<p><strong>sudo touch cred-file</strong></p>
<p><strong>sudo vi cred-file</strong></p>
<p>Add windows user credentials to the file:</p>
<p><strong>username=domain/user</strong>
<strong>password=blahblah</strong></p>
<p>Now remount all directories in the fstab file using:</p>
<p><strong>sudo mount -a</strong></p>
<p>To view information on the current mount’s run:</p>
<p><strong>df -h</strong></p>
rtylertag:lcd.weblog.glam.ac.uk,2009-12-09:1121112009-12-09T10:46:00Z2009-12-09T10:50:49ZBasic UNIX Vi Usage
<h1>Using Vi from the terminal window to edit files</h1>
<p><strong>Basic Cursor use</strong></p>
<img src="http://lcd.weblog.glam.ac.uk/assets/2009/12/9/vi_hjkl.gif">
<ul>
<li>k Up one line</li>
<li>j Down one line</li>
<li>h Left one line</li>
<li>l Right oen character (or spacebar)</li>
<li>w Right one word</li>
<li>b Left oen word</li>
</ul>
<p><strong>Editing</strong></p>
<ul>
<li>i Enter text entry mode</li>
<li>x Delete one character</li>
<li>dd Delete a whole line</li>
<li>r Replace a single character</li>
<li>R Overwrite text, <esc> to end</li>
</ul>
<p><strong>Exiting</strong></p>
* To exit you must be in command mode-press <esc> if you are not in command mode
* You must press <return> after commands that begin with a : (colon)
<ul>
<li>ZZ Write (if there were changes), then quit</li>
<li>:wq Write, then quit</li>
<li>:q Quit (will only work if file has not been changed)</li>
<li>:q! Quit without saving changes to file</li>
</ul>
rtylertag:lcd.weblog.glam.ac.uk,2009-08-24:1000182009-08-24T15:36:00Z2009-08-24T15:56:48ZQuercus Plus and IE 7 Fix
<p><strong>Visiting the url gives this error:</strong></p>
<p><img src="http://lcd.weblog.glam.ac.uk/assets/2009/8/24/Error-01.jpg" height="585" alt="" width="691" /></p>
<p><img src="http://lcd.weblog.glam.ac.uk/assets/2009/8/24/Error-02.jpg" height="341" alt="" width="527" /></p>
<p><strong>The details tell you that jvm.dll has crashed Internet Explorer. IE 7 uses the DLL from the location:</strong></p>
<p>C:\Program Files\Oracle\JInitiator 1.3.1.26\bin\hotspot\jvm.dll</p>
<p>C:\Program Files\Oracle\<strong>[LATEST VERSION]</strong>\bin\hotspot\jvm.dll</p>
<p><strong>If you have java installed then you can replace this DLL with one that will work:</strong><br />
(http://www.java.com/en/download/index.jsp)</p>
<p>C:\Program Files\Java\jre1.6.0_06\bin\client\</p>
<p>C:\Program Files\Java\<strong>[LATEST VERSION]</strong>\bin\client\</p>
<p>Rename the old file to “jvm.dll.old” and paste in the working DLL</p>
<p>Should now work fine.</p>
rtylertag:lcd.weblog.glam.ac.uk,2009-08-12:980812009-08-12T14:51:00Z2009-08-12T15:08:26ZRuby - Compare Dates
<p>Code to compare two dates in years:</p>
<p>years = (((end_date – start_date).to_i)/365).round</p>
<p>Will return the number of years the dates are apart.</p>
rtylertag:lcd.weblog.glam.ac.uk,2009-07-29:963932009-07-29T19:48:00Z2009-07-29T19:49:29ZInstalling old Gem Versions
<p>After spending a while trying to find an old version of a gem have found this command:</p>
<p>sudo gem install—no-rdoc—no-ri—no-update-sources searchlogic -v 1.6.6</p>
<p>will only install the Ruby gem with a specific version</p>
rtylertag:lcd.weblog.glam.ac.uk,2009-05-01:889512009-05-01T10:48:00Z2009-05-01T10:49:52ZLatest version of webrat
<p>After updating webrat today I was unable to use</p>
<p>I should see “Stuff”</p>
<p>within my cucumber tests.</p>
<p>Fix</p>
<p>To use RSpec’s expectations (should), make sure the following is in features/support/env.rb:</p>
<p>require ‘spec/expectations’</p>
tmorristag:lcd.weblog.glam.ac.uk,2009-04-29:884572009-04-29T10:58:00Z2009-04-29T10:58:49ZCRM User Group meeting - DMU
<p>On 24/04/2009 myself and Sarah Darby (E&A) attended the latest <span class="caps">CRM</span> User Group meeting at DeMontfort University Leicester.</p>
<p>A few of us met the night before in a local curry house to reminisce on meetings gone past and current developments within the <span class="caps">CRM</span> community.</p>
<p>So bright and early (well @ 10:30) on the 24th, the meeting began.</p>
<h4><b>Introduction</b></h4>
<p>Nigel Thomas, from Agresso, opened with a brief introduction on how the day would run. This was followed by an update on the state of play of Agresso and <span class="caps">CRM</span> in general. In 2008 Agresso gained 23 new HE & FE customers, and education now forms the largest area of Agresso’s <span class="caps">CRM</span> business. He finished off by saying that the next Agresso user group will be held in the Celtic Manor in 2010.</p>
<h4><b>Salford University</b></h4>
<p>Next up was Salford University and they presentation on their implementation of <span class="caps">CRM</span>. It seems that they’ve adopted a slightly different approach to the project than other Universities. They’ve entered into an “assisted partnership” implementation with Agresso. This basically means that they have a dedicated resource on-site at all times and that the Agresso project manager has more frequent site visits.</p>
<p>We heard from two people involved with the project and whilst they felt they had benefited from the assisted approach, the general feel was that is was always going to be a trade off between the costs and timescales for this type of implementation.</p>
<p>For more information please <a href="http://www.employer-engagement.salford.ac.uk/cms/news/article/?id=9">see link</a></p>
<h4><b><span class="caps">CRM V4</span></b></h4>
<p>Ian Carter (Agresso) then outlined the some of the new features of V4 of the Microsoft <span class="caps">CRM</span> software, followed by a demonstration of some of these features. For the end user, V4 seems to offer a host of new goodies.</p>
<ul>
<li>Faster searching</li>
<li>use of Microsoft <span class="caps">SQL</span> Server Reports services (MSRS)</li>
<li>improvements with workflow, making use of Windows Workflow Foundation (WWF)</li>
<li>and many more, including enhancements to the duplication detection</li>
</ul>
<p>Cross entity relationship processing seems to have been greatly improved in V4.</p>
<p>I think that even if we were to be one of their pilot sites, it would be at least 12 months before it would be ready for implementation. At least that’s what one of their developer’s said to me.</p>
<h4><b>Lunch</b></h4>
(the <span class="caps">DMU</span> presentation was cancelled due to the long running of previous demos).
<h4><b><span class="caps">FAQ</span> Module</b></h4>
<p>After lunch (nice too) Nigel & Paul Adams (Agresso) then gave us a demonstration of their latest module, <span class="caps">FAQ</span> (Frequently Asked Questions). Sarah has had a meeting with the developer to discuss its development and the potential use of it here at the University as a replacement to our existing Hobsons (Ask Glam) and Virtual Advisor software.</p>
<p>It’s got as number of interesting features, including a questions rating facility. The software will require the purchase of an additional Microsoft connection license as it allows non <span class="caps">CRM</span> users to access the database. With the University potentially looking for a Hobsons replacement, we’ll see if this fits the bill</p>
<h4><b>User group chair intro</b></h4>
<p>Rayhana Rahman, the chair of the user group then spoke about the set up of the Yahoo user group and how it could be developed further.</p>
<p>The use of a discussion board/forum was thought to be a good idea, as this would allow users to bounce ideas/problems around.</p>
<p>Basically Rayhana is open to any new ideas that can be used to improve the running of the user group.</p>
<h4><b>Enhancements requests and issues</b></h4>
<p>Then followed a slightly disjointed session where various issues were discussed. The trouble with this format is that not everyone seemed to be interested in what was being discussed, and Agresso themselves felt that they were under pressure to answer the issues there and then. They felt it would be better to log these as issues so that they would have a record of them and their resolution.</p>
<p>May be the discussion board mentioned above would be a good idea.</p>
<h4><b>Summing Up</b></h4>
<p>As I talked to other <span class="caps">CRM</span> users, it struck me that other University’s seem to be able to allocate far more resources to their <span class="caps">CRM</span> implementation then we are currently doing. This is true at both the technical and business level, and they seem to be benefiting from this.</p>
<h4><b>Date of next user group meeting</b></h4>
<p>The next user group meeting is planned for October the 22nd to be held at Salford University.</p>