<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6816267483119227655</id><updated>2012-02-16T12:04:23.551-08:00</updated><category term='Extreme Methods'/><category term='Plugin'/><category term='New Technology'/><category term='Chrome'/><category term='Digital Audio'/><category term='Google'/><category term='SQL Server'/><title type='text'>Red River Software</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rrsoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rrsoftware.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>RR</name><uri>http://www.blogger.com/profile/03517235479830213980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6816267483119227655.post-6892205471039788490</id><published>2008-09-18T06:27:00.000-07:00</published><updated>2008-09-18T07:06:45.290-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Methods'/><title type='text'>Extreme Programming - Getting Started</title><content type='html'>Just a few words about the theory.  There are a couple of concepts I want to introduce and a few Rights and Responsibilities I wish to present.  I will try to keep the theory to a minimum in this blog, only explaining enough to keep non-experienced readers up to speed.  I will introduce each as it impinges on that part of the project and they may not be in the order that they are presented in the texts I am reading.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;In the background I have selected the project, I have briefed the client on the approach taken and have assembled the team.  The client, who I’ll keep under wraps for now, is somewhat keen to experiment with this method.  &lt;br/&gt;&lt;br /&gt;&lt;br /&gt;Firstly a few basic concepts.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Customer Centric Development and the Circle of Life&lt;/h4&gt;&lt;br /&gt;XP puts the customer firmly at the centre of the projects in terms of defining requirements (user stories), getting involved in the testing and choosing project priorities.  The programmer is equally important and in refining the scope, diagrammatically the interaction is meant to look like this..&lt;br/&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_osBiYskz0-s/SNJfVOdUuWI/AAAAAAAAAAk/KYE8ROoiHyY/s1600-h/extreme1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_osBiYskz0-s/SNJfVOdUuWI/AAAAAAAAAAk/KYE8ROoiHyY/s400/extreme1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5247361334103030114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are four variables we can control in the project: cost, time, quality and scope.  They are interdependent.  Take a minute to look at these variables and play around with increasing or decreasing each one.  What happens? &lt;br/&gt;&lt;br /&gt;Getting the customer involved as in the circle of life above allows honest decisions to be made about what can be achieve in the limits of the four variables.  Cost, in most of our experience, is the limiting constraint.  The other variables adjust to suit.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;Ideally XP insists on the customer being on-site and available.  This is an ideal we shall have to work around.  One rule we must adhere to is that “communication is king”.  There will be misunderstandings, we must plan for them.  Email communication is error prone, verbal communication (meetings, telephone conversations etc.) is ideal.  Communication shortens project timescales!&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;User Stories and the Beginning of the Project Scope&lt;/h4&gt;&lt;br /&gt;User Stories are customer requirements.  Customers define User Stories, programmers, however tempting it is, don’t.  XP suggests that the customer defines the stories on cards, with each card representing a piece of functionality that the system will need to accomplish.  Stories should encompass one or two weeks of work.  All the stories don’t need to be defined at the beginning.  XP “embraces change” and have ideas in place to meet them.  User stories will grow, shrink, change and split over the lifetime of a project.&lt;br/&gt;&lt;br /&gt;User stories will be picked up by a programmer and developed.  More on that later!&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Testing, Testing&lt;/h4&gt;&lt;br /&gt;XP demand that testing is carried out strategically, continuously by developers and customers.  Customers define tests as well as programmers. Programmers should aim to automate the testing as much as possible.&lt;br/&gt;&lt;br /&gt;Testing should be done all of the time to keep the development on track and the quality of code to a maximum.&lt;br/&gt;&lt;br /&gt;Oh, and it might be an idea to consider parallel testing, stress testing and monkey testing (idiot users and nonsensical input etc.) as well. &lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Releasing&lt;/h4&gt;&lt;br /&gt;XP plans for frequent releases.  Frequent releases to the customer allow them to check functionality, see progress, refine stories and choose priorities.  Releasing at the end of a project runs the risk of delivering something the customer did not want. XP is the antidote to this.&lt;br/&gt;&lt;br /&gt;Each release should be as small as possible and should contain the most valuable business requirements.&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Thoughts and Progress&lt;/h4&gt;&lt;br /&gt; We are all in agreement with the concepts and have begun to implement the process.  I have had a look at some of the software packages available to manage the process but for now we have opted for a purist, pen and paper approach.&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Do I agree with everything?&lt;/h4&gt; &lt;br /&gt;&lt;br /&gt;I’m not sure.  Some of the terminology isn’t sitting right with me.  I have something against the word “stories”.  &lt;br/&gt;&lt;br /&gt;The testing and releasing concepts hold no problems for me and the team.&lt;br /&gt;The customer centric approach is great but I envisage a time when we drift away from the ideal and the customer gets detached from the development cycle.&lt;br/&gt;&lt;br /&gt;Measurement of success is on our minds at present, both for this project and for XP as a whole.  I shall have to delve into the theory more.&lt;br/&gt;&lt;br /&gt;So we are off…  We have our project, team, customer room, whiteboards, cards and coffee.  We have defined our first user stories and have are at the beginnings of implementing some of the features.  &lt;br/&gt;&lt;br /&gt;The next blog will present a more developer focused view of XP.&lt;br/&gt;&lt;br /&gt; &lt;br /&gt;References:   &lt;br/&gt;&lt;a href="http://www.amazon.co.uk/Extreme-Programming-Explained-Embrace-Change/dp/0321278658/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1221744247&amp;sr=8-1"&gt;Extreme Programming - Explained&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.uk/Extreme-Programming-Installed-Ron-Jeffries/dp/0201708426/ref=sr_1_6?ie=UTF8&amp;s=books&amp;qid=1221744247&amp;sr=8-6"&gt;Extreme Programming - Installed&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6816267483119227655-6892205471039788490?l=rrsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rrsoftware.blogspot.com/feeds/6892205471039788490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6816267483119227655&amp;postID=6892205471039788490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/6892205471039788490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/6892205471039788490'/><link rel='alternate' type='text/html' href='http://rrsoftware.blogspot.com/2008/09/extreme-programming-getting-started.html' title='Extreme Programming - Getting Started'/><author><name>RR</name><uri>http://www.blogger.com/profile/03517235479830213980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_osBiYskz0-s/SNJfVOdUuWI/AAAAAAAAAAk/KYE8ROoiHyY/s72-c/extreme1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6816267483119227655.post-7033048918382278354</id><published>2008-09-17T06:27:00.000-07:00</published><updated>2008-09-18T06:39:17.997-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Methods'/><title type='text'>Extreme Methods - Are They Right For Us?</title><content type='html'>Like a lot of people in the world of software, I had heard of extreme programming (XP) and knew enough of the concepts to be interested.  I had even bought the book for some of my customers to attempt to define a more rational way of working in an environment of rapid change and limited appetite for long scoping phases. &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Some of the concepts of extreme programming, such as pair programming, customer-centric development, openness and frequent refactoring are core to my beliefs.  The healthiest projects I have worked in have embraced these philosophies and have produced well finished, working systems with happy clients and happy developers.  It sounds like that should happen every time but we’ve all been around long enough to no it is not a “given”. &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;The partners at Red River Software set up the business with an ethos which has proved very successful. It encompasses many of the aspects of openness and partnership we will discuss in this thread. But more of the business later for now my aim is to test out extreme programming and its suitability for the projects we come across in our business. &lt;br /&gt;What will this take?&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Firstly, I will have to brush up on the theory and practice of Extreme programming.  I am starting with the two of the most commonly read texts on the subject “Extreme Programming Explained” and “Extreme Programming Installed. &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Secondly, I will pick a project and document our journey through the project.  &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Finally, I intend to have a wash-up discussion at the end with the aim of refining or shaping extreme programming to suit the shape of our business.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;I intend to highlight the theories of extreme programming in the coming weeks and show where the theory works well in practice and where we are struggling with it.  I would welcome feedback on anything written and if needed, other people’s experiences and wisdom on this subject.  &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;I am in the process of setting up an “extreme methods group” in my local enterprise area which will explore the implementation of the extreme ideas in businesses other than software.  That’s another story (those that know extreme methods-please excuse the pun).&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;The next blog entry will be the start…&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;References:   &lt;br/&gt;&lt;a href="http://www.amazon.co.uk/Extreme-Programming-Explained-Embrace-Change/dp/0321278658/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1221744247&amp;sr=8-1"&gt;Extreme Programming - Explained&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.uk/Extreme-Programming-Installed-Ron-Jeffries/dp/0201708426/ref=sr_1_6?ie=UTF8&amp;s=books&amp;qid=1221744247&amp;sr=8-6"&gt;Extreme Programming - Installed&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6816267483119227655-7033048918382278354?l=rrsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rrsoftware.blogspot.com/feeds/7033048918382278354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6816267483119227655&amp;postID=7033048918382278354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/7033048918382278354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/7033048918382278354'/><link rel='alternate' type='text/html' href='http://rrsoftware.blogspot.com/2008/09/extreme-methods-are-they-right-for-us.html' title='Extreme Methods - Are They Right For Us?'/><author><name>RR</name><uri>http://www.blogger.com/profile/03517235479830213980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6816267483119227655.post-3150250859670357768</id><published>2008-09-16T06:23:00.000-07:00</published><updated>2008-09-18T07:02:09.669-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Creating SQL Server tables automatically - from Visual Studio Datasets or XSD Schemas</title><content type='html'>&lt;p&gt;This article tackles one of the more frustrating features (or lack thereof) in Microsoft Visual Studio. While Microsoft have furnished it with Server Explorer (which lets you manage database tables directly in SQL Server) and a DataSet designer (which lets you manage code objects for wrapping up tables and relationships), it’s only possible to create a DataSet based on database tables as a one-way manual process, which regenerates DataSet code.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I’ve long found it far more comfortable and better practise to define a schema in one place – usually, the DataSet designer in VS: it’s quick, its easy to define many tables and their relationships at once and the results go into source control.  Historically, I would use Visual Studio to create an XSD in this manner then propagate changes to SQL Server manually.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I’m definitely not alone in this requirement – you can find lots of posts on forums and newsgroups.  It’s always worth posting these solutions so that future frustratees can share the solution.  That said:&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;The solution&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;There exists an ActiveX library – “Microsoft XML BulkLoad for SQL Server 3.0 Type Library”, also known as &lt;strong&gt;SQLXMLBULKLOADLib&lt;/strong&gt;.  The &lt;strong&gt;SQLXMLBULKLOAD3Class&lt;/strong&gt; component within it can be used from a .NET environment very easily, using interop, and is designed to create (or update) database tables in SQL Server, based on an XML schema.  The library is installed along with SQL Server 2005 development tools.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I will present a basic overview of how to use the tool to update database tables from a Visual Studio DataSet object itself, at run-time, without even having to use XSD files.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;The catch&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;The XML format that the &lt;strong&gt;SQLXMLBULKLOAD3Class&lt;/strong&gt; object uses for creating the tables differs slightly from the XSD format that Microsoft use in Visual Studio.  Things such as relationships (foreign keys), nullable column specification, and so on, are possible with a little modification of this method but aren’t covered here!&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;The code&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;First, take a quick look over &lt;a href="http://msdn.microsoft.com/en-us/library/ms171878.aspx"&gt;this MSDN article&lt;/a&gt; - it describes a few important basics, like the fact the component won’t run in a multi-threaded environment (use STAThread).  The article is written for SQLXML 4.0 but this still applies.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Remember to add an ActiveX reference to the library and a ‘using’ directive for the &lt;strong&gt;SQLXMLBULKLOADLib&lt;/strong&gt; namespace.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I usually create a console application for initialising a database using this technique – simply create any dataset objects your application uses and pass them to the method below.  Obviously, this would remove any data already in the database.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The usual disclaimers apply: take a backup of your database first, add salt to taste, lather, rinse and repeat.&lt;/p&gt;&lt;br /&gt;&lt;pre style="font-size:7pt; font-family:Tahoma; line-height:10px; color:maroon;"&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Creates tables in SQL Server, for all of the tables within the DataSet object.&lt;br /&gt;/// Does not populate the tables with data.  Optionally drops existing tables if&lt;br /&gt;/// they exist.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="connectionString"&amp;gt;Example:&lt;br /&gt;/// "Provider=SQLOLEDB;Data Source=MyServer;Database=MyDatabase;Integrated Security=SSPI;"&lt;br /&gt;/// &amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name="schemaObject"&amp;gt;Any DataSet object - for example &amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name="dropTablesIfExist"&amp;gt;Deletes tables if they alreday exist, before recreating&lt;br /&gt;/// them&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;public void CreateSchema(string connectionString, DataSet schemaObject, bool dropTablesIfExist)&lt;br /&gt;{&lt;br /&gt;    // instantiate the bulk load object&lt;br /&gt;    SQLXMLBulkLoad3Class bulkLoad = new SQLXMLBulkLoad3Class();&lt;br /&gt;    bulkLoad.BulkLoad = false;&lt;br /&gt;    bulkLoad.SchemaGen = true;&lt;br /&gt;    bulkLoad.SGDropTables = dropTablesIfExist;&lt;br /&gt;    bulkLoad.SGUseID = true;&lt;br /&gt;    bulkLoad.ConnectionString = connectionString;&lt;br /&gt;    bulkLoad.ErrorLogFile = "error_log.xml"; // used to log problems from the component&lt;br /&gt;&lt;br /&gt;    string temporarySchemaFilename = Path.GetTempFileName();&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        // write out the schema to disk&lt;br /&gt;        dataSet.WriteXmlSchema(temporarySchemaFilename);&lt;br /&gt;&lt;br /&gt;        // load the schema into a memory document - for processing!&lt;br /&gt;        XmlDocument doc = new XmlDocument();&lt;br /&gt;        doc.Load(temporarySchemaFilename);&lt;br /&gt;&lt;br /&gt;        // overview of the XML processing we will perform:&lt;br /&gt;&lt;br /&gt;        // doc root -&gt; element -&gt; complextype -&gt; choice -&gt; table elements&lt;br /&gt;        // remove this ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&lt;br /&gt;&lt;br /&gt;        // loop through tables in the dataset, updating XML structure accordingly&lt;br /&gt;        XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);&lt;br /&gt;        mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");&lt;br /&gt;        XmlNode goodDataParent = doc.DocumentElement.ChildNodes[0].ChildNodes[0].ChildNodes[0];&lt;br /&gt;&lt;br /&gt;        foreach (XmlNode kid in goodDataParent.ChildNodes)&lt;br /&gt;        {&lt;br /&gt;            foreach (XmlNode field in kid.ChildNodes[0].ChildNodes[0].ChildNodes)&lt;br /&gt;            {&lt;br /&gt;                // FEATURE - correctly pick up on the MaxLength property for string columns here!&lt;br /&gt;                if (field.Attributes["type"] == null)&lt;br /&gt;                {&lt;br /&gt;                    XmlNode max = field.SelectSingleNode("//xs:maxLength", mgr);&lt;br /&gt;                    if (max != null)&lt;br /&gt;                    {&lt;br /&gt;                        XmlAttribute attrib =&lt;br /&gt;                            doc.CreateAttribute("sql:datatype",&lt;br /&gt;                            "urn:schemas-microsoft-com:mapping-schema");&lt;br /&gt;                        attrib.InnerText = "nvarchar(" + max.Attributes["value"].InnerText + ")";&lt;br /&gt;                        field.Attributes.Append(attrib);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                // other things (nullable column specifications, etc) would need to be done here&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            doc.DocumentElement.AppendChild(kid.CloneNode(true));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        doc.DocumentElement.RemoveChild(doc.DocumentElement.ChildNodes[0]);&lt;br /&gt;&lt;br /&gt;        doc.Save(temporarySchemaFilename);&lt;br /&gt;        bulkLoad.Execute(temporarySchemaFilename, null);&lt;br /&gt;    }&lt;br /&gt;    catch (Exception ex)&lt;br /&gt;    {&lt;br /&gt;        // rethrow the exception&lt;br /&gt;        throw new DataException("Problem creating schema in SQL Server: " + ex.Message, ex);&lt;br /&gt;    }&lt;br /&gt;    finally&lt;br /&gt;    {&lt;br /&gt;        // clean up temporary file&lt;br /&gt;        if (File.Exists(temporarySchemaFilename))&lt;br /&gt;            File.Delete(temporarySchemaFilename);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6816267483119227655-3150250859670357768?l=rrsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rrsoftware.blogspot.com/feeds/3150250859670357768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6816267483119227655&amp;postID=3150250859670357768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/3150250859670357768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/3150250859670357768'/><link rel='alternate' type='text/html' href='http://rrsoftware.blogspot.com/2008/09/creating-sql-server-tables.html' title='Creating SQL Server tables automatically - from Visual Studio Datasets or XSD Schemas'/><author><name>RR</name><uri>http://www.blogger.com/profile/03517235479830213980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6816267483119227655.post-7130926655255537337</id><published>2008-09-03T00:21:00.000-07:00</published><updated>2008-09-18T07:02:34.565-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='New Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google Chrome - A new open-source browser</title><content type='html'>&lt;p&gt;Yesterday, Google entered the browser market with their new open-source offering, &lt;a href="http://google.com/chrome"&gt;Chrome&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A list of some new features unique to Chrome can be found &lt;a href="http://www.google.com/chrome/intl/en-GB/features.html"&gt;here&lt;/a&gt;.  Things that caught our eye immediately:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Multi-process application model&lt;/b&gt; - each tab / plugin runs not just in its own thread, but its own process.  This has several juicy implications - for example if one site crashes, hangs, or hogs resources, it can be controlled and terminated without compromising the rest of the application&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Task manager&lt;/b&gt; - hit Shift+Esc at any time to get a Task Manager, for monitoring, statistics and control of all processes.  There's even a &lt;b&gt;Stats for nerds&lt;/b&gt; link for detailed diagnostics&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;JavaScript: V8&lt;/b&gt; - Google's new JIT-compiler for JavaScript.  In Chrome, JavaScript is compiled to native code - very fast.  What's more, Google have invented a new API for the next generation of web apps.  Plus there's an extensive integrated JavaScript debugger and console.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;'Home' page&lt;/b&gt; - a feature already growing on me can be seen whenever you open the browser or a new tab page.  A list of recent bookmarks, and sites you access frequently (along with little screenshot thumbnails!) is presented, along with a 'history search'.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;WebKit engine (ala Safari)&lt;/b&gt; - the render engine borrows largely from WebKit.  This means it generally renders web pages the same as Safari.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;No doubt there will be much more to come very soon.  Developers will be interested in reading through &lt;a href="http://www.google.com/googlebooks/chrome/"&gt;this very informative cartoon&lt;/a&gt;, and perhaps even &lt;a href="http://dev.chromium.org/developers/how-tos/build-instructions-windows"&gt;compiling Chrome themselves&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6816267483119227655-7130926655255537337?l=rrsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rrsoftware.blogspot.com/feeds/7130926655255537337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6816267483119227655&amp;postID=7130926655255537337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/7130926655255537337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/7130926655255537337'/><link rel='alternate' type='text/html' href='http://rrsoftware.blogspot.com/2008/09/google-chrome-new-open-source-browser.html' title='Google Chrome - A new open-source browser'/><author><name>RR</name><uri>http://www.blogger.com/profile/03517235479830213980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6816267483119227655.post-1179057362391336039</id><published>2008-07-30T06:10:00.001-07:00</published><updated>2008-09-18T07:03:14.472-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='Digital Audio'/><title type='text'>Plugin fun: An Introduction to Digital Audio (Part 1)</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This article is the first in a short series explaining the concepts of digital audio processing in software.  The series will be backed up with the development of a VST plugin – a software component which works with audio and may be used with almost all digital audio processing software packages (called DAWs – or Digital Audio Workstations).  As such it is generally aimed at software developers of any background, but should be of interest to anyone with a technical interest in the topics covered.&lt;br /&gt;&lt;br /&gt;We’ll start with the basics – how sound and music is modelled and represented, digital audio concepts, what tools are available, and move on to specific useful topics including examples of types processing (including delay, reverb, chorus, filters, EQ, compression and spectrum analysis).&lt;br /&gt;&lt;br /&gt;Starting with the second or third in the series, each article will be accompanied by a downloadable archive containing source code for a plugin, designed to be modified and experimented with in order to get some hands-on experience.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Models of Sound&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sound is simply the movement or vibration of air.  We’ve all seen sound waves represented graphically, like this –&lt;br /&gt;&lt;img src="file:///C:/DOCUME%7E1/Kieren/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;img src="file:///C:/DOCUME%7E1/Kieren/LOCALS%7E1/Temp/moz-screenshot-1.jpg" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_osBiYskz0-s/SJBo_PhxBpI/AAAAAAAAAAM/oEg9IJhfujQ/s1600-h/g1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_osBiYskz0-s/SJBo_PhxBpI/AAAAAAAAAAM/oEg9IJhfujQ/s320/g1.PNG" alt="" id="BLOGGER_PHOTO_ID_5228794603086349970" border="0" /&gt;&lt;/a&gt;In visualisations like this one, the x axis represents time, and the y axis is the amplitude of the sound wave at that point in time (physically, the amplitude is related to the pressure of the air – peaks are high pressure and troughs low pressure).&lt;br /&gt;&lt;br /&gt;An entire sound can be represented entirely by a waveform or collection of waveforms, much like the one shown above.  To reproduce the sound from the waveform, an object is made to move or vibrate in line with the changing of the waveform.  Typically this is a speaker diaphragm moved by an electromagnet.  Imagine tracing along the x axis at a constant speed, and looking at how the level of the wave varies.  As the amplitude of the wave moves up, the speaker would move in one direction – and as it moves down, the speaker would move in the other direction.&lt;br /&gt;&lt;br /&gt;The resulting changes in air pressure are propagated and move through the air, eventually causing vibrations which are detected within our ears.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;font-weight: bold;"&gt;Pitch and Loudness&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Two of the fundamental properties of a sound as we hear it – pitch and loudness – we perceive based on the behaviour of the waveform as it moves through continuous cycles.  The more cycles per second there are, the higher the frequency, and so the higher the pitch.  Similarly, the higher the amplitude of the waveform is, the louder it will be.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_osBiYskz0-s/SJBpjPv0RGI/AAAAAAAAAAU/1XjdmT8uGLU/s1600-h/g2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_osBiYskz0-s/SJBpjPv0RGI/AAAAAAAAAAU/1XjdmT8uGLU/s400/g2.PNG" alt="" id="BLOGGER_PHOTO_ID_5228795221620573282" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Measuring Frequency&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The frequency, or number of complete cycles per second, is measured in Hertz (Hz).  Each musical note has a particular specific frequency - the standard ‘Concert Pitch’ reference for Middle A is 440Hz.  For each octave (12 notes) higher the frequency is doubled.  This means that the frequencies of musical notes are not equally spaced.  In order to discover or convert between musical notes and frequencies, you can see &lt;a href="http://www.phy.mtu.edu/%7Esuits/notefreqs.html"&gt;http://www.phy.mtu.edu/~suits/notefreqs.html&lt;/a&gt; or use the following equation:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_osBiYskz0-s/SJBp-wV0kxI/AAAAAAAAAAc/_0FW8n8qZzM/s1600-h/g3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_osBiYskz0-s/SJBp-wV0kxI/AAAAAAAAAAc/_0FW8n8qZzM/s400/g3.png" alt="" id="BLOGGER_PHOTO_ID_5228795694226379538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Where fn is the frequency of the note you are trying to obtain and n is the number of semitones away from Middle A the note is.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Measuring Loudness&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Physically, sound is measured as a Sound Pressure Level (SPL), with the unit dB (decibel).  The dB scale is a logarithmic one, so that the entire range of human hearing can be represented with meaningful values.  This means that while the human pain threshold may be pressure levels literally millions of times louder than the quietest sounds we can hear, we can represent the difference between the same two amplitudes using a decibel figure of around 100dB.&lt;br /&gt;&lt;br /&gt;It is very important to note that the dB is a relative unit.  When we talk about a 10dB sound, it is implied that this is relative to the quietest sounds the human ear can perceive (which itself would be written as 0dB.  In exact terms this is around 0.00002 Pascals).&lt;br /&gt;&lt;br /&gt;It works out that for a change in about +3dB in volume, the amplitude of a signal will double.  Relative to the human hearing threshold, some typical approximate values are:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Quiet room&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;15dB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Normal conversation&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;50dB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Typical TV&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;60dB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Major road traffic noise&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;80dB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Hearing damage from long-term exposure&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;85dB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Loud live music gig&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;100dB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;Hearing damage from short-term exposure&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size:85%;"&gt;120dB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;This concludes the first in the series!  Next time - Digital Models of Sound (Digital Audio).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6816267483119227655-1179057362391336039?l=rrsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rrsoftware.blogspot.com/feeds/1179057362391336039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6816267483119227655&amp;postID=1179057362391336039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/1179057362391336039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/1179057362391336039'/><link rel='alternate' type='text/html' href='http://rrsoftware.blogspot.com/2008/07/plugin-fun-introduction-to-digital.html' title='Plugin fun: An Introduction to Digital Audio (Part 1)'/><author><name>RR</name><uri>http://www.blogger.com/profile/03517235479830213980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_osBiYskz0-s/SJBo_PhxBpI/AAAAAAAAAAM/oEg9IJhfujQ/s72-c/g1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6816267483119227655.post-4742853133622874224</id><published>2008-06-16T11:48:00.001-07:00</published><updated>2008-07-29T01:25:26.260-07:00</updated><title type='text'>Blog</title><content type='html'>We are Red River Software - a unique team of intelligent, dynamic and experienced people dedicated to providing high-quality bespoke software solutions for businesses.  You can read a little more about us at our website, &lt;a href="http://www.red-river-software.co.uk/"&gt;http://www.red-river-software.co.uk/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6816267483119227655-4742853133622874224?l=rrsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rrsoftware.blogspot.com/feeds/4742853133622874224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6816267483119227655&amp;postID=4742853133622874224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/4742853133622874224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6816267483119227655/posts/default/4742853133622874224'/><link rel='alternate' type='text/html' href='http://rrsoftware.blogspot.com/2008/06/blog-design.html' title='Blog'/><author><name>RR</name><uri>http://www.blogger.com/profile/03517235479830213980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
