<?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-9203618</id><updated>2011-04-21T11:15:16.117-07:00</updated><title type='text'>Linkwood Development</title><subtitle type='html'>Development Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://linkwood.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://linkwood.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/04539382975944287673</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.linkwood.nildram.co.uk/galleries/people/tommy/AshtonWestSide.jpg'/></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-9203618.post-110985599236565757</id><published>2005-03-03T04:56:00.000-08:00</published><updated>2005-03-03T05:19:52.370-08:00</updated><title type='text'>Trees in SQL: Nested Sets and Materialized Path</title><content type='html'>Whilst searching the internet for methods of storing hierarchies in a database I came across possibly the &lt;a href="http://www.dbazine.com/tropashko4.shtml"&gt;best example&lt;/a&gt; I have ever seen.&lt;br /&gt;&lt;br /&gt;Vadim Tropashko's &lt;a href="http://www.dbazine.com/tropashko4.shtml"&gt;article&lt;/a&gt;, entitled the same as the subject of this post, talks us through a hybrid hierarchy storing method for SQL databases. A cross between nested sets and materialized paths produces a method of uniquely numbering a node in a hierarchy by using binary fractions. When I read this the benefits seemed immediately apparent, all node manipulation based on atomic integer operations all factored by binary logarithm (base 2).&lt;br /&gt;&lt;br /&gt;Further more I was unable to find any other examples of this sort of hierarchy in use anywhere else, even MSDN suggests using methods which appear to be inferior to this one. MSDN only appears to scribe about adjacency lists, a method which is undoubtably performs, but requires an awful lot of (nested) SQL to work with. &lt;br /&gt;&lt;br /&gt;After reading Vadim's posts, I decided to create some &lt;a href="http://www.linkwood.nildram.co.uk/galleries/binaryfractionhierarchyconcepts.png"&gt; conceptual maps&lt;/a&gt; based on what I had read to fully understand the idea.&lt;br /&gt;&lt;br /&gt;Vadim's code and proof of concept was all, unfortunately for me, in Oracle syntax, so a quick bit of conversion over to Transact-SQL syntax and I had created a fully operational &lt;a href="http://www.linkwood.nildram.co.uk/galleries/workingbinaryfractionhierarchyexample.jpg"&gt;example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the top pane of my Visual Studio screenshot you can see the SQL to generate the view, the center pane holds the result set and the lower pane the source information (also depicted is a method of working optimistic concurrency, with CreateStamp, UpdateStamp, DeleteStamp).&lt;br /&gt;&lt;br /&gt;Harnessing the power of hierarchies in SQL has been a side-fetish for me now for the past 2 or 3 monthes as the necessity to implement something like this in my work has been under increasing demand. My work on this is as yet unappreciated by my colleagues. I'm likely to keep it a secret until people have a use for it, sure enough they will do, such hierarchies have already been in heated discussions, with my managers unsure of how to cope with such a complex technical implementation. My view is its a relatively complex method but one which is preferable to a bodged job.&lt;br /&gt;&lt;br /&gt;I'm sure fellow developers in the world have always thought to 'do something better if they were doing it for personal gain', well my work on this could well end up being just that.&lt;br /&gt;&lt;br /&gt;I'm just pondering on the potential for the suitability of this type of hierarchy in semantic web style applications, which is somewhere I seriously need to do lots of reading up on. &lt;br /&gt;&lt;br /&gt;Very very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9203618-110985599236565757?l=linkwood.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linkwood.blogspot.com/feeds/110985599236565757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9203618&amp;postID=110985599236565757' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110985599236565757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110985599236565757'/><link rel='alternate' type='text/html' href='http://linkwood.blogspot.com/2005/03/trees-in-sql-nested-sets-and.html' title='Trees in SQL: Nested Sets and Materialized Path'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/04539382975944287673</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.linkwood.nildram.co.uk/galleries/people/tommy/AshtonWestSide.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9203618.post-110733766453740621</id><published>2005-02-02T01:31:00.000-08:00</published><updated>2005-02-02T01:47:44.536-08:00</updated><title type='text'>Open Product Taxonomies and The Semantic Web</title><content type='html'>With my recent ramblings on product categories, less than a month or 2 ago, I have stumbled across the discovery which appears to be taking alot of people by storm, The Semantic Web.&lt;br /&gt;&lt;br /&gt;A system of classification for anything? Sounds ideal! I think this is the field that I'm going to specialize in as I grow older. &lt;br /&gt;&lt;br /&gt;After reading &lt;a href="http://ftrain.com/google_takes_all.html"&gt;How Google beat Amazon and Ebay to the Semantic Web&lt;/a&gt; by &lt;a href="http://ftrain.com/PaulFord.html"&gt;Paul Ford&lt;/a&gt;, the thoughts of such semantic systems make me very excited! Working with such a diverse set of interconnected data/ontologies, that have the capacity to be linked and referenced by other ontologies to create a mass of data, with the potential for exponential growth is enough to make my toes curl!&lt;br /&gt;&lt;br /&gt;Do such semantic ontologies already exist for describing the predicate links between subjects and objects such as products, manufacturers, suppliers and retailers? Well I'm still looking into that, but the idea of an 'Open Product Taxonomy' is very exciting and could push benefits for retail systems development, which is my current field.&lt;br /&gt;&lt;br /&gt;Obviously developing anything like this for my present company is a bit of a pipe dream, but is definitely something I'd consider playing with in my spare time, which at the moment is severely restricted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9203618-110733766453740621?l=linkwood.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linkwood.blogspot.com/feeds/110733766453740621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9203618&amp;postID=110733766453740621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110733766453740621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110733766453740621'/><link rel='alternate' type='text/html' href='http://linkwood.blogspot.com/2005/02/open-product-taxonomies-and-semantic.html' title='Open Product Taxonomies and The Semantic Web'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/04539382975944287673</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.linkwood.nildram.co.uk/galleries/people/tommy/AshtonWestSide.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9203618.post-110355285951990588</id><published>2004-12-20T06:02:00.000-08:00</published><updated>2004-12-20T06:27:39.520-08:00</updated><title type='text'>Optimistic Concurrency and Synchronisation</title><content type='html'>An interesting, obvious and totally overlooked problem cropped up the other day in the office... the problem of synchronising deleted records with remote databases.&lt;br /&gt;&lt;br /&gt;Our implementation is a bit freakish, with what could be called (but are designed nothing like) 'data warehouses' feeding off of a centrally located database.&lt;br /&gt;&lt;br /&gt;If implemented correclty, this model can serve to be totally rewarding, our implementation, I fear, is far from rewarding.&lt;br /&gt;&lt;br /&gt;Anyway, the problem exhibited is that when we delete records from the central database, these deleted records need to be forwarded to the data warehouses so that they can be deleted there as well where appropriate.&lt;br /&gt;&lt;br /&gt;This complication was totally overlooked in our implementation, and a half-baked solution has been concocted over much collusion and semi-implemented.&lt;br /&gt;&lt;br /&gt;I was theorising on a method of allowing concurrency at the same time as allowing synchronisation, and it seemed fairly obvious that a database-wide strategy is required for identifying new records, amended records and deleted records. &lt;br /&gt;&lt;br /&gt;All of the above can be done with time stamps, nice, simple, time stamps.&lt;br /&gt;&lt;br /&gt;Below are the fields which will exist in every database table in my conceptual database model:&lt;br /&gt;&lt;br /&gt;Key {&lt;br /&gt;! = Can be null&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CreateStamp    Date&lt;br /&gt;AmendStamp     Date&lt;br /&gt;DeleteStamp    Date !&lt;br /&gt;&lt;br /&gt;The create stamp is set the first time the record is inserted, nice, simple, clean and effective. At the same time, the Amend stamp is set to the same date as the create stamp, if the two match then the record has obviously never been modified.&lt;br /&gt;&lt;br /&gt;The amend stamp is updated when the record is changed, thus the create and amend stamp are no longer equal, resulting in a record which can be identified as amended.&lt;br /&gt;&lt;br /&gt;The delete stamp is different, it is set when the record is deleted, along with the amend stamp which is set at the same time to the same value. The delete stamp can be set back to null, effectively undeleting the record, as long as the amend stamp is updated to the time of undeletion.&lt;br /&gt;&lt;br /&gt;This allows a much greater level of synchronisation, as when a data warehouse requires to synchronise with the remote database, it simply gets all the record with an amendment time greater than its last synchronisation time. If the delete stamp is not null, the record (as long as it has no dependancies) are deleted at the data warehouse, or stored as deleted, whichever. &lt;br /&gt;&lt;br /&gt;A record with a deleted stamp set can safely be deleted whence all data warehouses have a synchronised stamp greater than the deleted stamp. This would be a batch purge function.&lt;br /&gt;&lt;br /&gt;Concurrency by default use of a data adapter and a command builder in .NET, is enforced strictly by comparing all mapped fields in the where clause. This is costly CPU cycles enforcing this very strict evaluation. Specifying a where clause on the amend stamp only is, in my oppinion, vastly superior. As long as the amend stamp in the disconnected data matches the record in the database, the data can safely be updated; else the user can be prompted for a abandon, overwrite or comparison process.&lt;br /&gt;&lt;br /&gt;There are two slight concerns in my theory however, the synchronisation of time between different domains/data warehouses. All date/times would have to be UTC, another method of conformity. The second concern would be concurrency between data warehouses and a central data source. If two data warehouses update data to their local databases away from the central database, batch processing would have be performed on all remote data warehouses at once whence they are ready to reconcile with the central database to identify concurrency conflicts. A second set of time stamps could be introduced for each record, including an indicator as to the origin or holder of the source data, and the central time stamps provided by the origin, which are only updated if the application updating the database is identified as the datas root source.&lt;br /&gt;&lt;br /&gt;Interesting, no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9203618-110355285951990588?l=linkwood.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linkwood.blogspot.com/feeds/110355285951990588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9203618&amp;postID=110355285951990588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110355285951990588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110355285951990588'/><link rel='alternate' type='text/html' href='http://linkwood.blogspot.com/2004/12/optimistic-concurrency-and.html' title='Optimistic Concurrency and Synchronisation'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/04539382975944287673</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.linkwood.nildram.co.uk/galleries/people/tommy/AshtonWestSide.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9203618.post-110355114678561473</id><published>2004-12-20T05:38:00.000-08:00</published><updated>2004-12-20T05:59:06.786-08:00</updated><title type='text'>Conformity</title><content type='html'>ISO standards are a key asset in allowing inter-operation between multiple organisational entities.&lt;br /&gt;&lt;br /&gt;I mentioned in my last blog that I'm performing some conceptual modelling of a database structure which is globalised, ontological and simple.&lt;br /&gt;&lt;br /&gt;I was casually glancing an eye over the operation of Froogle, the shopping search engine provided by google. It had a merchants information page, where &lt;a href="https://www.google.com/froogle/merchants/advanced_feed_instructions.html"&gt;instructions&lt;/a&gt; could be found on how to get your product data onto froogle.&lt;br /&gt;&lt;br /&gt;I noticed that these feeds conformed to ISO standards, which is where I had a sudden realisation. This is definitely the key to designing future systems, allowing a system the capacity to talk to other systems... allowing froogle to canvas an online product catalogue would be extremely impressive- an attractive prospect to many potential clientel.&lt;br /&gt;&lt;br /&gt;This should be BLATANTLY obvious to anyone working in this industry for a surmountable period of time, however I'm only young, and at 21, I find these quite major details overlooked by similar professionals with ALOT more experience than me.&lt;br /&gt;&lt;br /&gt;The first step I took at implementing ISO standards was currencies, and remodelled my conceptual currency table to the following:&lt;br /&gt;&lt;br /&gt;Key {&lt;br /&gt;!  = can be null&lt;br /&gt;PK = Primary Key&lt;br /&gt;FK = Foreign Key&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Currencies {&lt;br /&gt;cu_ID		PK		Fixed Unique&lt;br /&gt;cu_ISO				&lt;a href="http://www.xe.com/iso4217.htm"&gt;Industry Standard ISO-4217&lt;/a&gt;&lt;br /&gt;cu_ISO_Unicode			&lt;a href="http://www.xe.com/symbols.htm"&gt;Industry Standard ISO-4217	&lt;/a&gt;&lt;br /&gt;cu_Global_ID	! FK            Language Entity&lt;br /&gt;cu_Rank&lt;br /&gt;CreateStamp&lt;br /&gt;AmendStamp&lt;br /&gt;DeleteStamp     !&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;The undoubtable benefit of this is automatic exchange rate computation. There is probably an XML web service somewhere (I think I may have already found one, but I can't recall bookmarking it) that reports all of the exchange rates to a base rate.&lt;br /&gt;&lt;br /&gt;Consequentially, I looked at other standards I could conform to, and languages was an obvious optimization:&lt;br /&gt;&lt;br /&gt;Languages {&lt;br /&gt;la_ID		PK		Fixed Unique&lt;br /&gt;la_ISO_1			&lt;a href="http://www.loc.gov/standards/iso639-2/"&gt;Industry Standard ISO-639-1&lt;/a&gt;&lt;br /&gt;la_ISO_2			&lt;a href="http://www.loc.gov/standards/iso639-2/"&gt;Industry Standard ISO-639-2&lt;/a&gt;&lt;br /&gt;la_Rank			&lt;br /&gt;la_Lang_ID	! FK&lt;br /&gt;CreateStamp&lt;br /&gt;AmendStamp&lt;br /&gt;DeleteStamp     !&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;If you're wondering what the 'Rank' fields might be about, its an aggregate field which is to be the result of a database wide aggregate process on the associated records usage, this will result in a 'most frequently selected' functionality in the user interface; It will be user adjustable.&lt;br /&gt;&lt;br /&gt;My next blog, which I'm about to write, will be about optimistic concurrency and the usage of the (Create/Amend/Delete)Stamp fields, including their usage as a method of synchronisation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9203618-110355114678561473?l=linkwood.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linkwood.blogspot.com/feeds/110355114678561473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9203618&amp;postID=110355114678561473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110355114678561473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110355114678561473'/><link rel='alternate' type='text/html' href='http://linkwood.blogspot.com/2004/12/conformity.html' title='Conformity'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/04539382975944287673</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.linkwood.nildram.co.uk/galleries/people/tommy/AshtonWestSide.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9203618.post-110086184269191607</id><published>2004-11-19T02:49:00.000-08:00</published><updated>2004-11-19T02:57:22.693-08:00</updated><title type='text'>Standard XML Reporting Schema</title><content type='html'>After a brief Googling session, I can't appear to find any reporting schema standards where XML is concerned. The main complication appears to be that reports are totally diverse and are different for each business need.&lt;br /&gt;&lt;br /&gt;The main reason I desire a standard reporting schema is the portability of presentation. After a reporting XML schema is defined, it can be easily reinterpretted by applying XSLT transformation. This would suitably accomodate my needs where a report has to be presented in a rich context, e.g. HTML, or in a standard fixed width text format for printing from a till receipt printer. Either way, the underlying data source is the same, its just the transformation schema applied to it which dictates its presentation.&lt;br /&gt;&lt;br /&gt;This could be classed as an 'ideal' implementation, something I know we're not interested in by the company I work for. &lt;br /&gt;&lt;br /&gt;But I forsee the benefits of the potential application independance, after all, additional layers of abstraction are always commendable.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9203618-110086184269191607?l=linkwood.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linkwood.blogspot.com/feeds/110086184269191607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9203618&amp;postID=110086184269191607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110086184269191607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110086184269191607'/><link rel='alternate' type='text/html' href='http://linkwood.blogspot.com/2004/11/standard-xml-reporting-schema.html' title='Standard XML Reporting Schema'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/04539382975944287673</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.linkwood.nildram.co.uk/galleries/people/tommy/AshtonWestSide.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9203618.post-110070358985752117</id><published>2004-11-17T05:29:00.000-08:00</published><updated>2004-11-17T07:01:23.533-08:00</updated><title type='text'>Automated IRC Bot Hierarchical Object Model</title><content type='html'>I was talking to a chap on channel #slack of Quakenet the other day, where he described the implementation of his IRC bot's internal address list (aka IAL). He said it was a 4 dimensional value array. However, since it was PHP implementation, the array could be indexed by string, hence some hashing must have been involved.&lt;br /&gt;&lt;br /&gt;Updating the IAL would have its 4 dimensions walked thusly:&lt;br /&gt;&lt;br /&gt;[Server]-&gt;[Channel]-&gt;[Alias]-&gt;[User Particulars (e.g. 'Modes')]&lt;br /&gt;&lt;br /&gt;PHP supports this hashing natively, or so I've read, but I jest that it may not be the most ideal solution, especially when you want to perform statistics analysis, mostly because of the lack of association between different users, and the difficulty involved with implementing such associations in a multi dimensional array. Aggregate walking would have to be performed from the server dimension, matching all identical aliases in all the seperate channels, etc to identify a single user and the channels that they are in.&lt;br /&gt;&lt;br /&gt;As such, I theorised the following &lt;a href="http://www.linkwood.nildram.co.uk/galleries/ircbot.GIF"&gt;object model&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One thing to note before we continue, when I refer to a 'clone' or 'clones', it actually means a particular user under a particular alias on a particular server. Multiple 'aliases' may appear under the same hostname (shared internet connections, for example), but they still have to be uniquely identifiable.&lt;br /&gt;&lt;br /&gt;An ideal addition to this model would be logical associations between different 'clones', by having the bot hold an internal user list of whom it recognises (and their associated hostmasks in standard hostmask based syntax). The logical group of users (assembled by either manually or done by automated analysis), once concatenated together could be subject to a series of instant statistical evaluations designed to be performed on either a group of users or a group of channels.&lt;br /&gt;&lt;br /&gt;Likewise for duration based statistics reporting periods, this data could easily be stored in XML, with seperate files representing hours, days (ideal, in my oppinion) or weeks. The structure would break away from the previous paradigms I've seen where all information is associated with the channel and instead associates it with the user. This may introduce a processing overhead for when the user simply wants to view a conversation on a particular channel- as it is the users structure which will be walked in order to recreate the channel log.&lt;br /&gt;&lt;br /&gt;The reactive structure would be where all the model is controlled, reacting to messages received by the server. As its all hashed, the lookup would be almost instantenous. A join message would be parsed by first checking only the hostname of the user, evaluating what server the message was received from, then transverses the clone relationship based on the alias identified for that hostname for that server. It then associates the channel, its particulars (e.g. permissions) in a 'userchannel' class, which would have a composite relation to the channel (by transversing the Server-&gt;Channel relationship based on the server message from the root). The relationship is then fully complimented by automatically adding the user to that channels 'clones' collection.&lt;br /&gt;&lt;br /&gt;Automation is the key to the hierarchies smooth operation. The above diagram doesn't depict the key locations where cyclic references would occur, but it will be most likely on the channels 'clones' collection, where the contained objects store a reference back to the channel in their 'userchannels' collection.&lt;br /&gt;&lt;br /&gt;This is still, all only theory. As a personal project, it could be a little bit cumbersome with my current time constraints, especially when all of the client-server message logic would have to be written. But as is true with majority of frameworks, with the model in place it can be easily and intuitively expanded.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9203618-110070358985752117?l=linkwood.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linkwood.blogspot.com/feeds/110070358985752117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9203618&amp;postID=110070358985752117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110070358985752117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9203618/posts/default/110070358985752117'/><link rel='alternate' type='text/html' href='http://linkwood.blogspot.com/2004/11/automated-irc-bot-hierarchical-object.html' title='Automated IRC Bot Hierarchical Object Model'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/04539382975944287673</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.linkwood.nildram.co.uk/galleries/people/tommy/AshtonWestSide.jpg'/></author><thr:total>0</thr:total></entry></feed>
