<?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-7401712043400993543</id><updated>2011-11-27T15:45:30.122-08:00</updated><category term='tables'/><category term='DTD'/><category term='hack'/><category term='custom tags'/><category term='scrollbar'/><category term='spreadsheet'/><category term='CSS'/><category term='Javascript'/><category term='html'/><category term='abstraction'/><category term='efficiency'/><category term='extensible markup language'/><category term='layout'/><category term='standards'/><category term='XML'/><category term='XHTML'/><category term='cascading style sheets'/><category term='Python code efficiency beauty programming style loops'/><category term='SURRAnet history story Python mod_python SIS software development origins'/><category term='Steve Gibson'/><title type='text'>SURRAnet Development</title><subtitle type='html'>SURRAnet is an open-source student information system (SIS). It is named after its creator, Michael Surran, who as a teacher himself created SURRAnet to be easy to use, simple, and efficient at what it does. It has been in use at Greater Houlton Christian Academy for a number of years now.

This blog will detail Mr. Surran's continued development of this software. SURRAnet is an intranet web application server written Python.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-752297992353034660</id><published>2010-07-07T10:13:00.000-07:00</published><updated>2010-07-07T10:34:54.040-07:00</updated><title type='text'>The King is Dead... Long Live the King!</title><content type='html'>Long story short - this will probably be my last blog entry. "The king is dead..." If this blog had thousands of readers and other developers who where participating in the discussion, then I might reconsider keeping this blog alive, but that is not the reality. However...&lt;br /&gt;&lt;br /&gt;"Long live the king!" While I've decided that blogging takes too much time from actual coding, I'm not totally leaving the scene. In a way, you can think of this as a regeneration (Doctor Who fans will understand). The blog has died, but it's reborn in a new, different way. If you are interested in SURRAnet or software development in general, and you want to continue following my development of SURRAnet (as well as other software products like my new iPad app called "&lt;a href="http://www.facebook.com/pages/Word-Cross/107492512633954"&gt;Word Cross&lt;/a&gt;"), then I invite you to follow me at these sites:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.facebook.com/pages/SURRAnet/139398512738773"&gt;The SURRAnet Facebook Fanpage&lt;/a&gt; - this page will basically pick up where this blog left off, except that it won't provide such long and detailed writeups. Facebook allows me to do more while requiring me to do less - more frequent, quicker, almost Twitter-like posts, but also screenshots, notes for when I want to write something "long and detailed", discussions, etc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.surratech.com"&gt;The SURRAtech Website&lt;/a&gt; - SURRAtech is the name of my "company" website, which right now is just me :-) I needed a domain from which to host apps, open source code, etc. This website is a work in progress, but it will be where I host SURRAnet code, instructions on how to download and use SURRAnet, etc. It also will host my other projects, which I expect will grow once SURRAnet 3.0 is finished.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.twitter.com/SURRAtech"&gt;The SURRAtech Twitter Feed&lt;/a&gt; - For those who prefer Twitter updates over Facebook, this feed will basically provide a mirror to the Facebook page, but it also includes updates regarding other projects of mine as well.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ghca.com/blogs/reader.php?n=msurran"&gt;My GHCA Blog&lt;/a&gt; - If your interest is more in me and the type of things I do, then you may be interested in my main blog at Greater Houlton Christian Academy. GHCA is my primary employer, where I work as their system administrator and a part-time Computer Technology teacher.&lt;br /&gt;&lt;br /&gt;I originally was going to delete this blog, but I realized that it's a good "diary" of at least some of my thoughts and experiences working on SURRAnet 3.0. In some ways I wish I had started a blog like this way back in 2002 when SURRAnet first began to take form. I'll keep the blog online for these memories, and for the links to the above resources. Thank you all who have been following my work, and I hope the new "king" will continue to serve you well!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-752297992353034660?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/752297992353034660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/07/king-is-dead-long-live-king.html#comment-form' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/752297992353034660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/752297992353034660'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/07/king-is-dead-long-live-king.html' title='The King is Dead... Long Live the King!'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-1699489578925085923</id><published>2010-03-31T06:47:00.000-07:00</published><updated>2010-03-31T06:58:08.908-07:00</updated><title type='text'>Consistent Variables</title><content type='html'>Sort of sounds like an oxymoron, huh? For whatever reason, I've gotten used to naming variables one way in Python and another in Javascript. In Javascript, I've been using the "variableNameExample" scheme, whereas in Python I've been using the "variable_name_example" scheme. I've been going back and forth between the two a lot lately, and I'm asking myself "Why?"&lt;br /&gt;&lt;br /&gt;Part of me whats to switch everything to the first example, since I think is easier to type and looks "prettier", and it definitely is the more common scheme used in Javascript. Of course, changing everything over on the Python side will take time that I currently don't have. I may just start using the case-switch scheme for here on out, and then later go back and "sed" many of the underscore variables to case-switch variables..&lt;br /&gt;&lt;br /&gt;Hindsight is always 20x20!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-1699489578925085923?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/1699489578925085923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/03/consistent-variables.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1699489578925085923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1699489578925085923'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/03/consistent-variables.html' title='Consistent Variables'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-4995972429865490422</id><published>2010-03-22T10:07:00.000-07:00</published><updated>2010-03-22T10:35:22.720-07:00</updated><title type='text'>CS = Computer Sculpting</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2778/4454053203_a0d24cd2bc.jpg"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 500px; height: 332px;" src="http://farm3.static.flickr.com/2778/4454053203_a0d24cd2bc.jpg" alt="" border="0" /&gt;&lt;/a&gt;We usually think of "CS" as being the abbreviation for Computer Science, but sometimes I wonder how much "science" goes into writing a program. Now I know of all the arguments - CS is more about the algorithms whereas CE is more about actually "engineering" a computer program, but in my experience, there is a whole lot of "art" that goes into programming. In fact, I feel more like a sculptor than a scientist or even an engineer!&lt;br /&gt;&lt;br /&gt;I find that I often will write code, look at it, rethink it, "carve" stuff away, add new "stuff", tweak, modify, carve, and add until the blob of code begins to look like something beautiful, much like how an artist shapes a blob of clay. I do have a picture in my head of what I want, but unlike actual clay, software code has some very strict limitations, some of which I don't discover until I'm knee-deep pursuing a specific method of doing something. This is particularly true as I work with the UI, thinking that certain combinations of XML, CSS, and Javascript will give me what I'm looking for. But that isn't always the case, regardless of what the standards promise. Other times I get what I was looking for, but actually seeing it and using it makes me realize that what I had in my head wasn't such a good idea after all! Often it is a spur-of-the-moment idea that ends up giving me a user interface that just "feels right." These ideas rarely come to me on the first go around.&lt;br /&gt;&lt;br /&gt;Like the UI, I also strive to make beautiful code. Simplistic and elegant, that's what I want, seasoned with a dash of cleverness. I also like the idea of optimized code, though I believe that simplicity will often result in optimization, and I'm not going to throw out beauty to shave off a few milliseconds on the rendering time of a page.&lt;br /&gt;&lt;br /&gt;Maybe I'm just goofy this way. Maybe there are programmers out there who know from start to finish exactly what they want, and that's what they get on the first try. For me, the process of developing a large piece of software is more like how Yoda describes seeing the future - &lt;span style="font-style: italic;"&gt;"Difficult to see. Always in motion [it is]..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;ps - usually lengths of time between blog posts mean that I'm distracted by other obligations (SURRAnet being a project that I work on in my spare time), but lately SURRAnet has been receiving a lot of attention. If the mind can focus on code, then the blog takes a back-burner. Today my mind is a bit fuzzy, so here I am! I have a new screenshot of my work on the academic section of SURRAnet. I also uploaded the new SN3.0 code a while back (which currently does not include the academics).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-4995972429865490422?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/4995972429865490422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/03/cs-computer-sculpting.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/4995972429865490422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/4995972429865490422'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/03/cs-computer-sculpting.html' title='CS = Computer Sculpting'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2778/4454053203_a0d24cd2bc_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-7349674623987500206</id><published>2010-02-27T09:04:00.000-08:00</published><updated>2010-02-27T11:35:24.098-08:00</updated><title type='text'>IANAL</title><content type='html'>I have invested years working on SURRAnet. Most of the world doesn't know this because it hasn't been something that I've blogged about or posted online until recently. The code I'm working on now is the third major "rewrite" of the SURRAnet database, and I'm finally "proud enough" of the code to release it to the world.&lt;br /&gt;&lt;br /&gt;I've become very comfortable with programming over the years, but as the saying goes, "I am not a lawyer." Originally when I published a copy of SURRAnet 2.0, I released it under the GPL. As a general fan and user of open source software, that just seemed the way to go. But as I considered how much work I've put into SURRAnet, I started rethinking this. The reality is that I'm more pragmatic regarding software "freedom" than Richard Stallman and the Free Software Foundation are. I'm more like Linus in this regards.&lt;br /&gt;&lt;br /&gt;I may even have a little Bill Gates in me. WHAT?? Well, I find myself thinking thoughts that have some parallels to his famous letter to the hacker community. Why should I give up all my rights to the software I've spent so many hours on? I know, I'm walking a slippery slope with open source advocates, but ultimately the decision is mine as to how I license SURRAnet to the world.&lt;br /&gt;&lt;br /&gt;I have two concerns. The first is that I "lose control" of SURRAnet. Now I'm sounding like Steve Jobs! The main reason for this is that I have very clearly defined goals for SURRAnet, and I have a specific way of how to get there. Once SURRAnet is finished, in the sense that I've met my goals, then I think I'll be more open to outside input. In the meantime, I don't want to lose control of the "master copy".&lt;br /&gt;&lt;br /&gt;The other concern revolves around compensation. No, I'm not expecting to license every copy of SURRAnet for a fee or royalty. I don't want the headache - I'm a programmer, not a businessman! I don't mind other people using SURRAnet for free, modifying the source code for their own use, making copies for their organization, etc. I don't even mind Linux distributions packaging SURRAnet. In fact, that would be quite the honor! What bothers me is the idea of some corporation coming along and "stealing" SURRAnet, with some fat-cat businessman making millions selling SURRAnet as a package or SAAS (software as a service), while I'm left out in the cold.&lt;br /&gt;&lt;br /&gt;HA - sounds like I'm dreaming, huh? Probably, but you never know! I can dare to dream big, and I can dare to think that SURRAnet may offer something that other programs don't, something that a corporation might invest in.&lt;br /&gt;&lt;br /&gt;So what am I going to do? Well, I am not a lawyer... After spending a few days reading, researching, and bouncing around ideas, I've picked a license. I'm not 100% sure if it addresses all of my needs and concerns, but it's the closest one I can find that seems to provide a balance between users rights and my rights. The license I picked - &lt;a href="http://www.opensource.org/licenses/artistic-license-2.0.php"&gt;&lt;span style="font-weight: bold;"&gt;Artistic License 2.0&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I like this license for a couple of reasons. First, it's simple. I can read it and understand what I'm reading! Second, it's not "preachy". I go to church to hear a preacher; I don't need my software license to preach at me, nor do I want to use a license that preaches a "dogma" that I don't fully agree with. That rules out the GPL.&lt;br /&gt;&lt;br /&gt;But what I like most of all is that the license seems to reserve some of my own rights. From the license, "&lt;span style="font-style: italic;"&gt;The intent is that the Copyright Holder maintains some artistic control  over the development of that Package while still keeping the Package  available as open source and free software.&lt;/span&gt;" Since IANAL, I am still a little unsure about how the license protects my work from being exploited by a "fat cat businessman". Maybe there's a loophole, but hopefully if some corporation someday takes interest in SURRAnet, they'll see the wisdom of bringing the author of the software onto their team.&lt;br /&gt;&lt;br /&gt;I'll have the first pre-alpha release of version 3.0 available for download soon. (I know, I've been saying that for months.) When I do release it, it will be under the &lt;span style="font-weight: bold;"&gt;Artistic License 2.0&lt;/span&gt;, unless somebody (maybe a lawyer) convinces me otherwise.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note - there are some graphical elements in SURRAnet which I don't own. Those parts retain the licenses of the copyright holders (for example, Creative Commons).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-7349674623987500206?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/7349674623987500206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/02/ianal.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7349674623987500206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7349674623987500206'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/02/ianal.html' title='IANAL'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-8703060472965880031</id><published>2010-02-22T08:40:00.000-08:00</published><updated>2010-02-22T08:59:22.937-08:00</updated><title type='text'>HTML5, Python 3000, and Other Shifting Gangplanks</title><content type='html'>I've spent some time at sea, and I'm quite familiar with that "shifting" feeling when boarding a ship via the spanning bridge called the gangplank. This is especially noticeable when sea conditions result in the ship and/or pier bobbing up and down. It takes a special kind of walking, sea legs they call it, to not look like a drunk while boarding a ship.&lt;br /&gt;&lt;br /&gt;Programming SURRAnet feels a little like this, too. The "ground" I'm "walking on" is shifting. New features in HTML5 and the release of Python 3000 is causing me to compensate by considering what new features obsolete the current code that I have in place. &lt;span style="font-weight: bold;"&gt;The key is not to overcompensate&lt;/span&gt;. Otherwise SURRAnet will never get done!&lt;br /&gt;&lt;br /&gt;What does this mean for SURRAnet? First off, I'm just not ready to make the switch to Python 3000. I thought about it, and even tried running my code in Python 3000 mode (a feature of Python 2.6), but the reality is that all my servers run Python 2.6, and whatever Python 3000 gives me isn't currently worth the pain of forcing it onto my servers. Someday the switch will happen, but not this release.&lt;br /&gt;&lt;br /&gt;In fact, that's what it all boils down to - &lt;span style="font-weight: bold;"&gt;what is and is not worth the pain?&lt;/span&gt; HTML 5 also is very interesting, providing lots of nifty new tags and features. I'm hoping it provides better handling of tables (especially the ability to scroll the table body separate frowhat is and is not worth the pain?m headers, footers, and sidebars). However, there are some features that don't really make my life any easier except that it makes the code slightly prettier. Since I'm already using XML encapsulated in Python objects, I'm not ready to rewrite the whole markup language of SURRAnet just because HTML 5 came out. What I AM willing to do is to see if I can, using HTML 5, reduce complexity. If I can use a single HTML 5 tag where I normally would need multiple HTML 4 tags, then I'm all for it!&lt;br /&gt;&lt;br /&gt;Figuring out what new the features in Firefox and Python offer me as a developer is a bit like walking on a gangplank in rough seas. My code may "bob up and down" a bit as I try different things. However, in an effort not to overcompensate, don't expect the SURRAnet code to be completely rewritten overnight to use all the new features of HTML 5, Python 3000, and whatever else new comes down the block. I'll fall overboard and drown if I try to do all of that at once!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-8703060472965880031?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/8703060472965880031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/02/html5-python-3000-and-other-shifting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8703060472965880031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8703060472965880031'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/02/html5-python-3000-and-other-shifting.html' title='HTML5, Python 3000, and Other Shifting Gangplanks'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-5797781269795893987</id><published>2010-01-27T04:45:00.000-08:00</published><updated>2010-01-27T05:12:17.599-08:00</updated><title type='text'>New Look. New Policies.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2784/4304714227_5f5f332ec1.jpg"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 500px; height: 261px;" src="http://farm3.static.flickr.com/2784/4304714227_5f5f332ec1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;C&lt;/span&gt;all me crazy, but if I'm going from version 2.0 to 3.0, and I'm making changes to the GUI for the purpose of user-friendliness, then I feel the need to make the "theme" of SURRAnet look fresh and new as well. Unfortunately, artistic design is not my greatest strength, but I think I've come up with a new look that is pretty "cool". I was actually inspired by the Personas feature of Firefox 3.6. Unlike Personas, the look of SURRAnet is not customizable at this time, but hopefully it's easy enough on the eyes that users will enjoy the experience of spending time in SURRAnet. Who says that efficient must be boring?&lt;br /&gt;&lt;br /&gt;The new policies are not SURRAnet related, but Google Groups related. I want to love Google Groups, but the nonstop spam makes it very hard to do so. In order to prevent spam from stacking up in my moderation folder, I changed the policies so that I must explicitly invite members to join. You cannot request membership directly to my SURRAnet group, but you can, through this blog, email me and request membership that way. This should thwart the spammers. So far, the group isn't very active, nor do I expect it to be until SURRAnet "takes off",  assuming that ever happens. That said, if you wish to start a deep discussion regarding a particular piece of code in SURRAnet, the group is there for this purpose. Otherwise, you can always just comment on one of my blog posts.&lt;br /&gt;&lt;br /&gt;Today I am focusing on SURRAnet for much of the day, except during Steve Job's announcement :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-5797781269795893987?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/5797781269795893987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/01/new-look-new-policies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/5797781269795893987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/5797781269795893987'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/01/new-look-new-policies.html' title='New Look. New Policies.'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2784/4304714227_5f5f332ec1_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-8437348041486649767</id><published>2010-01-25T07:07:00.000-08:00</published><updated>2010-01-25T07:12:48.861-08:00</updated><title type='text'>Version Numbers</title><content type='html'>The more I work with this new release of SURRAnet, the more I realize that this is a ground-up rewrite of much of the code. Part of this is a result of cutting the tether with Apache, and a large part is a result of my better mastery of object oriented design in Python. Oh, and then there is enhanced browser support for UI elements.&lt;br /&gt;&lt;br /&gt;My point is this - what I'm coming up with is different enough from the original "SURRAnet 2.0", that I think it warrants being designated "SURRAnet 3.0". Right now, it's SURRAnet 3.0-alpha, but hopefully with my focus now on this project, it can move to the beta stage in a few months. I'll probably keep calling it a beta throughout the new school year until all of the obvious bugs are discovered by my teachers and worked out.&lt;br /&gt;&lt;br /&gt;Stay tuned - the first code release of &lt;span style="font-weight: bold;"&gt;SURRAnet 3.0&lt;/span&gt;-alpha is on its way!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-8437348041486649767?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/8437348041486649767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/01/version-numbers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8437348041486649767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8437348041486649767'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/01/version-numbers.html' title='Version Numbers'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-6947272222993522922</id><published>2010-01-20T07:52:00.000-08:00</published><updated>2010-01-20T07:58:45.712-08:00</updated><title type='text'>Now We Have Hours Instead of Days</title><content type='html'>I'm reminded of a scene in Star Trek II, Wrath of Khan, where Kirk and Spock trick Khan by replacing "hours" with "days" in explaining how long it will take to do basic repairs to the Enterprise. I had some projects, as part of my regular job, that should have only taken hours. Instead, they took many, many, MANY hours (days). It's like Scotty's miracle fixes in reverse.&lt;br /&gt;&lt;br /&gt;SO... Here I am weeks later and not very far ahead with SURRAnet. Time is whizzing by! I really want to get the next version up and running before summer, because the cold main winters are much better used for programming than our beautiful summers.&lt;br /&gt;&lt;br /&gt;Even today, I was supposed to be solely focused on SURRAnet, and yet my other duties and just random "stuff" have gotten in the way. As they say in the movies, Take Two!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-6947272222993522922?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/6947272222993522922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/01/now-we-have-hours-instead-of-days.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/6947272222993522922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/6947272222993522922'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/01/now-we-have-hours-instead-of-days.html' title='Now We Have Hours Instead of Days'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-7575609668219666281</id><published>2010-01-04T06:21:00.000-08:00</published><updated>2010-01-04T07:04:28.397-08:00</updated><title type='text'>Starting a New Year with New Resolve</title><content type='html'>I find that a huge project like SURRAnet has its own sort of inertia, and with various other "distractions" in 2009 taking me away from SURRAnet, it has followed the law, "an object at rest tends to stay at rest." Now that 2010 is here, I have new resolve to apply an "outside force" to get SURRAnet production underway again.&lt;br /&gt;&lt;br /&gt;Helping me regain my enthusiasm for this undertaking is a recent accolade I received during the accreditation process that my school, &lt;a href="http://www.ghca.com"&gt;Greater Houlton Christian Academ&lt;/a&gt;y, is undertaking. I'll post the exact wording of the commendation once that report is released for public viewing. Needless to say, it's a lot easier working on a big project without those nagging doubts, "Is this really worth it?" and "Does anybody really care?" SURRAnet may never go beyond the borders of GHCA, but its role in our school is important enough that I am recommitted to finishing this major rewrite.&lt;br /&gt;&lt;br /&gt;A new year, even a new decade, is a great time to reconsider other aspects of life as well. Related to SURRAnet, I'm repurposing my &lt;a href="http://twitter.com/extra_ketchup"&gt;twitter account&lt;/a&gt; to share my progress with SURRAnet (as well as other technology-related projects) instead of boring people with my personal life. As a relatively private person in "real life", I'm thinking that posting every personal thought and action online for the universe to read really isn't the best idea anyway. By using &lt;a href="http://twitter.com/extra_ketchup"&gt;twitter&lt;/a&gt; as a microblog of my progress with SURRAnet, I'll be able to keep those interested "in the loop" without wasting too much time typing long blog entries like this one. I'll save this blog for milestone events, announcements, or the sharing of thoughts that require more than 140 characters.&lt;br /&gt;&lt;br /&gt;Well, enough typing of English paragraphs. It's time to start typing Python code. I suspect today will be mostly spend reading my code and remember what on earth I was thinking back last summer when I last worked on SURRAnet. Keep an eye out for a new source code release soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-7575609668219666281?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/7575609668219666281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2010/01/starting-new-year-with-new-resolve.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7575609668219666281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7575609668219666281'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2010/01/starting-new-year-with-new-resolve.html' title='Starting a New Year with New Resolve'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-77925039043604620</id><published>2009-11-16T09:11:00.001-08:00</published><updated>2009-11-16T09:18:59.329-08:00</updated><title type='text'>Back to the Drawing Board</title><content type='html'>It's been months since I last looked at the new SURRAnet code. When I realized that I wouldn't have the revised code ready for the new school year, I refocused on "old" SURRAnet to make sure the data can more easily transition to the new SURRAnet when it's time to make the swap. Of particular interest was the elimination of quarters and grade weights.&lt;br /&gt;&lt;br /&gt;When I say, "Back to the drawing board," I'm not talking about redesign, but about rewrapping my mind around my original design plans. It may take me a week just to set the "stage" of my brain up with all the objects and objectives of the new SURRAnet.&lt;br /&gt;&lt;br /&gt;Now that winter is almost here, I will be dedicating those cold, chilly days to SURRAnet, when I'm off from school, of course. Winter is a nice, quiet time of year, and I find it a great time to pound out computer code because who wants to be outside in sub-zero temperatures?&lt;br /&gt;&lt;br /&gt;I would really, really like to be able to finish the majority of the new code before we print the final report cards this school year (June). I make no guarantees, as we know what happened the last time. I sometimes even wonder if it is worth it, now that open source SIS programs are more readily available, but, I put my hand to this plow, so I'd like to finish what I started. Maybe, just maybe, my SURRAnet has something to offer that the other programs do not.&lt;br /&gt;&lt;br /&gt;Time to clear out the cobwebs and remember everything I forgot over the last three months!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-77925039043604620?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/77925039043604620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/11/back-to-drawing-board.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/77925039043604620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/77925039043604620'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/11/back-to-drawing-board.html' title='Back to the Drawing Board'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-806504059321147919</id><published>2009-07-14T09:34:00.000-07:00</published><updated>2009-07-14T09:58:20.458-07:00</updated><title type='text'>When Real Life Interferes With Our Plans</title><content type='html'>Today I received a letter that stated the following:&lt;br /&gt;&lt;blockquote&gt;Dear Mr. Surran:&lt;br /&gt;&lt;br /&gt;       Justice Hunter has reviewed your request to be excused from jury service and has denied your request. Please report for jury service on ______, as instructed in the summons you previously received....... We will do our best to minimize the inconvenience.&lt;br /&gt;&lt;/blockquote&gt;In that previous summons, I was told not to plan anything from late July until late September, which very inconveniently overlaps with the start of the school year (as a reminder, I'm the system administrator and part-time teacher at Greater Houlton Christian Academy). I requested a change in schedule, but it appears that the judge doesn't agree that teachers should be available for the first month of classes...&lt;br /&gt;&lt;br /&gt;My ability to finish SURRAnet for the new school year was being taxed before receiving this letter due to other major work-related projects. Now, it's practically impossible without making some insane sacrifices on my part.&lt;br /&gt;&lt;br /&gt;After discussing the situation with my boss, we have decided that we're pushing back our goal for the launch of the new SURRAnet at GHCA until the following school year, giving me an extra year to finish it.&lt;br /&gt;&lt;br /&gt;Part of me is relieved to have an extra year to complete SURRAnet since this is a massive project - a project that has to be tabled for a few months while I perform my civic duties. That's not to say that I won't be working on it, but SURRAnet will be truly a "in my spare time" project for the next few months.&lt;br /&gt;&lt;br /&gt;I do want to push to finish the code on the Record system so that I can upload a snapshot of the new code for you to have, especially since this code has some drastic changes from what's currently available to download.&lt;br /&gt;&lt;br /&gt;As for missing my first month of teaching classes (Computer Fundamentals and Computer Programming), along with the major time-crunch that my other projects now face, I can only say &lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Grrrr!!!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-806504059321147919?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/806504059321147919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/07/when-real-life-interferes-with-our.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/806504059321147919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/806504059321147919'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/07/when-real-life-interferes-with-our.html' title='When Real Life Interferes With Our Plans'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-285147819295522391</id><published>2009-07-09T04:46:00.000-07:00</published><updated>2009-07-09T05:08:33.849-07:00</updated><title type='text'>Google Chrome and Other Tidbits</title><content type='html'>Recently &lt;a href="http://news.cnet.com/8301-17939_109-10282442-2.html"&gt;Google announced a new operating system&lt;/a&gt; tied to their web browser, Chrome. I find this interesting for a number of reasons, but one reason should be obvious in relation to this blog - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SURRAnet&lt;/span&gt; was written for Chrome.&lt;br /&gt;&lt;br /&gt;Okay, let me rephrase - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SURRAnet&lt;/span&gt; was written for the browser, and Chrome promises to be designed with browser apps in mind, so you could say that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SURRAnet&lt;/span&gt; was written for Chrome, or even more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;appropriately&lt;/span&gt;, Chrome was written for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SURRAnet&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;I'm a bit tickled because &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SURRAnet&lt;/span&gt; was first conceived and designed as a web app before web apps were commonplace. It also is refreshing to know that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SURRAnet&lt;/span&gt; has a good run ahead of it because it's using technology that's just now becoming mainstream. Cool!&lt;br /&gt;&lt;br /&gt;Here are a few other tidbits. I'm hoping to release my latest work on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;SURRAnet&lt;/span&gt; sometime this weekend. I'm trying to finish up the majority of the Records system before doing this. This will be the first release with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SURRAnet's&lt;/span&gt; own HTTP server code, meaning that it no longer needs Apache to run. The new release also uses XML vs HTML and has some major &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;enhancements&lt;/span&gt; in the base classes. If you compare the new code to the old code, you will hopefully appreciate the differences. I'll set it up so that interested parties can try &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;SURRAnet&lt;/span&gt; "out of the box" with little setup overhead.&lt;br /&gt;&lt;br /&gt;One of the things slowing me down is the amount of time seemingly simple tasks can take to code for. Today's browsers still have &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;shortcomings&lt;/span&gt; that making programming &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;applications&lt;/span&gt; for them "tricky". I've been spending time working on the AJAX &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;communication&lt;/span&gt; between client and server, and having solved those issues, I'm not working on the final polishing of the Records system.&lt;br /&gt;&lt;br /&gt;Another thing slowing me down is distraction. It seems that all of my quiet programming spots are, well, NOT quiet lately! My office at the school is subjected to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;construction&lt;/span&gt; noise as summer renovations happen all around me. My home office is shaken by the noise of the constant convoy of dump trucks and farm traffic that plague my road. Our local library is &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;surprisingly&lt;/span&gt; noisy and distracting. I have a friend with a cabin in the middle of the woods, and I'm tempted to shack up there for a week to get some work done! Oh, and don't get me started on the poorly-timed jury duty....&lt;br /&gt;&lt;br /&gt;Well, there's not much more to say. Hopefully my next post will be accompanied by code! I'll end on this thrilling note - a tarball of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;SURRAnet&lt;/span&gt;, including a few years of student data, currently fits on a single floppy disk!! (No, I don't use floppy disks, but I remember their capacity). In the world of bloat, I find this very cool indeed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-285147819295522391?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/285147819295522391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/07/google-chrome-and-other-tidbits.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/285147819295522391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/285147819295522391'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/07/google-chrome-and-other-tidbits.html' title='Google Chrome and Other Tidbits'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-4524692585952393521</id><published>2009-07-01T03:44:00.000-07:00</published><updated>2009-07-01T04:41:05.073-07:00</updated><title type='text'>Dancing With The Client</title><content type='html'>This title is inspired by the show, "Dancing With The Stars". I was thrilled yesterday when I had an eureka moment, at least IMHO, regarding the "dance" that the server and client will perform to make the user experience of SURRAnet.&lt;br /&gt;&lt;br /&gt;SURRAnet was a web 2.0 app before there was a web 2.0. Back when I decided to make SURRAnet's GUI engine the browser, it really wasn't common for applications to be built for the browser (and when they were, they were Java or Flash apps). Since SURRAnet's initial release, web apps like &lt;span style="font-weight: bold;"&gt;Google Apps&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Facebook&lt;/span&gt;, and even this blog have pushed the boundaries of what a browser can do, thanks to the ever-expanding capabilities of modern browsers like &lt;span style="font-weight: bold;"&gt;Firefox&lt;/span&gt;. One of the reasons I'm rewriting SURRAnet is to take advantage of these new capabilities and thus remove the clunkyness of the "old web."&lt;br /&gt;&lt;br /&gt;One goal for this rewrite is to find the right balance between server-side and client-side processing. There is a place for each, and if the right balance is not found, the product suffers. In fact, I often wonder if sites like Facebook are missing this balance, resulting in the client "stepping on the feet" of the server. In my opinion, using client-side scripting to do something that is easily done on the server-side or even in simple static HTML/XML is a mistake. Facebook has become extremely client-side processor intensive, and often Firefox just freezes up for seconds while the insane amount of Javascript churns away to generate the page you see. Take a look at their source code sometime - it's crazy!!!&lt;br /&gt;&lt;br /&gt;I obviously don't want SURRAnet to perform sluggish like Facebook or even Google Docs. I want it to be fast and responsive. I also want it to require the least amount of work to use (right now it requires too much clicking and navigating). I'm definitely going to use both client and server-side processing, but what is the correct balance? How will these two dance together for the best performance?&lt;br /&gt;&lt;br /&gt;My eureka moment came while working on the validation phase of my student records manager. In the past, the client Javascript did the validation. This required plenty of data to be copied from the server to the client, and Javascript has limitations that make this phase of writing SURRAnet less than fun. The old SURRAnet represented the student records as a form that needed to be submitted in order to be recorded (old web). The new version sends individual field data immediately to the server via AJAX, thus providing instant updates to the database and eliminating the need for a "Click here to save" button. It dawned on me that since I'm using AJAX in this fashion, I can make the server do the validation!&lt;br /&gt;&lt;br /&gt;This provides a number of benefits, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Small and simple Javascript&lt;/span&gt; - This reduces the file size of the .js file needed to be loaded and processed by the client. On slower clients, like old computers and netbooks, this simple Javascript will run much snappier, as it basically just displays the results sent back from the server. Since the server is the powerhouse, it makes sense that it do more of the work when it can.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Complex code stays in Python&lt;/span&gt; - As a personal preference, I'd rather code in Python than Javascript any day! It also makes validation and data processing much easier with direct access to the database objects. Otherwise I'd need to copy many internal server objects to the client Javascript.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Security&lt;/span&gt; - Client-side validation places trust in the client, but what if a hacker tries to post data directly to SURRAnet and thus bypasses validation meant to protect the database from errors? By keeping the validation on the server, the data sent it will be checked regardless of its source, and bad data is not accepted.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Maintained Web 2.0 experience&lt;/span&gt; - Since I'm using AJAX, and SURRAnet is designed to run on a LAN / WAN, the user still gets instant feedback regarding mistakes. Even though validation is taking place on the server, it feels like it is happening client-side because it is just as fast. This might be different if someone were using dialup to connect to the school intranet, but for the average teacher using SURRAnet on a 100 Mbps LAN, this method is perceivably instantaneous.&lt;/li&gt;&lt;/ul&gt;I'm not pretending that I'm the first one to think of this fine balance of server and client scripting. I'm sure there are many web apps that do this already. For SURRAnet, however, it definitely is a move in a new and exciting direction. For me as a developer, it should shave off weeks of coding since the resulting code will be much simpler and "Pythonic". For the user, it will result in an interface that is fast, easy to use, and to the point. It's all good!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-4524692585952393521?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/4524692585952393521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/07/dancing-with-client.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/4524692585952393521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/4524692585952393521'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/07/dancing-with-client.html' title='Dancing With The Client'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-1578361142644219247</id><published>2009-06-17T04:39:00.001-07:00</published><updated>2009-06-17T05:28:49.853-07:00</updated><title type='text'>Location, Location, Location</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3357/3633586968_2dcae6ba4b.jpg?v=0"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 500px; height: 375px;" src="http://farm4.static.flickr.com/3357/3633586968_2dcae6ba4b.jpg?v=0" border="0" alt="" /&gt;&lt;/a&gt;My wife and I have treated ourselves to a little present - an &lt;a href="http://www.amazon.com/MSI-Wind-U120-001US-10-Inch-Netbook/dp/B001P5GKBW/"&gt;MSI Wind&lt;/a&gt; (hers is pink). The Wind is a nice little netbook with a 10 inch screen and great keyboard. It isn't as fancy as some of the latest netbooks, but with features like a 160 GB hard drive, card reader, and great battery life, it is perfect for my work, especially at the $300 price tag!&lt;br /&gt;&lt;br /&gt;I made this purchase for a few reasons, but the main reason was portability while maintaining usability. I have one of the orginal Asus Eee PCs, and while that netbook is great for surfing the web and checking email, I would not want to code SURRAnet on it, for my eyes and hands would suffer before long! The MSI Wind, on the other hand, is a great little platform to work from. It gives me flexibility to take my work "on the road" in a way that my large, heavy, and power-hungry 17" HP laptop prevents me from doing. &lt;br /&gt;&lt;br /&gt;As you can see from the picture, I can find some great locations to program from! I was inspired by &lt;a href="http://www.grc.com/stevegibson.htm"&gt;Steve Gibson&lt;/a&gt; who is pounding out hours of code at his local Starbucks. For me, "location, location, location" is very important regarding how much work I can get done, since SURRAnet requires me to be very focused in order to juggle all the details and big-picture goals without dropping them all on my mental floor.&lt;br /&gt;&lt;br /&gt;The one negative is the 10" screen, since SURRAnet is designed for a larger monitor and resolution. However, I can plug the netbook into a full-sized monitor when I have one at my disposal, and I do a lot of testing even with a limited screen size.&lt;br /&gt;&lt;br /&gt;I'm still looking for the perfect programming environment. My home office is great when the dump truck army isn't shaking my house. The hillside is great when swarms of hornets aren't buzzing over my head. Maybe I'll try the local library. If only the beach were closer!! With this little netbook, the sky is the limit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-1578361142644219247?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/1578361142644219247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/06/location-location-location.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1578361142644219247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1578361142644219247'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/06/location-location-location.html' title='Location, Location, Location'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-1728765737431012240</id><published>2009-06-09T06:12:00.000-07:00</published><updated>2009-06-09T06:34:49.228-07:00</updated><title type='text'>if insomnia or dump_truck_noise: raise RuntimeError</title><content type='html'>There's nothing like a 10 day stretch of bad sleep to mess up one's mind and make complex, object oriented programming almost impossible. Add to this a fleet of noisy dump trucks going back and forth all day long on an otherwise peaceful country road, and code production comes to a standstill.&lt;br /&gt;&lt;br /&gt;People who do not program really don't understand the mental exercise this discipline is, especially with large programs that have hundreds of pieces that one must mentally keep track of at all times. There are plenty of tasks that I can do with "half a brain", but programming SURRAnet is not one of them! I find that I almost have to enter a higher state of consciousness in order to see the big picture and simultaneously focus on specific lines of code. It's like 3D chess in some ways, with the need to predict the outcome many moves into the future. Needless to say, a tired, fuzzy mind and a distracting environment are poison to the process.&lt;br /&gt;&lt;br /&gt;So... I'm a week behind where I'd like to be. I'm slowly getting back on a decent sleep schedule, and soon I'll have a more portable programming platform (the &lt;a href="http://www.amazon.com/MSI-Wind-U120-001US-10-Inch-Netbook/dp/B001P5GKBW/"&gt;MSI Wind&lt;/a&gt;) so that I can take my software development on the road to quiet and peaceful locations. When my mind is clear and alert, my productivity increases 10 fold!&lt;br /&gt;&lt;br /&gt;BTW, in tracking down why I haven't been able to sleep, I've come across multiple reports that Splenda can cause insomnia. I recently switched to &lt;span style="font-weight:bold;"&gt;Splenda&lt;/span&gt; as part of new eating habits I'm adopting (with mental clarity being one of my goals). I have since stopped using Splenda and hope to return to a normal sleep pattern very shortly. The brain is a very complex biologic machine, and chemistry has a lot to do with its efficient operation. That chemistry is determined in large part by what we eat. As SURRAnet becomes a focus and my September deadline looms, I'll be eating lots of brainfood! Feel free to share what helps keep your brain fit by commenting on this blog post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-1728765737431012240?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/1728765737431012240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/06/if-insomnia-or-dumptrucknoise-raise.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1728765737431012240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1728765737431012240'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/06/if-insomnia-or-dumptrucknoise-raise.html' title='if insomnia or dump_truck_noise: raise RuntimeError'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-1760386470487475534</id><published>2009-05-29T02:50:00.000-07:00</published><updated>2009-05-29T03:29:34.959-07:00</updated><title type='text'>The True Beauty of Object Oriented Programming</title><content type='html'>When first introduced to object-oriented programming, I really didn't like it. Looking back, I think I understand why. Besides the obvious fact that OOP takes a while to wrap one's mind around, it often is presented as another way to do procedural programming. In fact, I remember seeing many such examples where I scratched my head and thought, "Why do you add all these layers of complexity just to do that?!?" Think about it, how many times have complex classes been used where a simple function or even a simple script would have done the job with less code and less confusion?&lt;br /&gt;&lt;br /&gt;As I was reading the book &lt;a href="http://www.dreamingincode.com/"&gt;Dreaming in Code&lt;/a&gt;, I came to a part that resonated with me. Actually that happened many times, but the time related to this blog entry was when the Chandler team hired a Python expert to look at their code. He scolded the developers for using Java methodologies in Python, thus creating a huge and overly complex code base. I look at how OOP in Python is presented in many books and websites, and I think that the Chandler developers are not the only ones guilty of this.&lt;br /&gt;&lt;br /&gt;So in rewriting SURRAnet, I'm trying to break away from some of the mistakes I've copied from examples I've seen in the past. Often classes are treated as functions on steroids or variables with attributes, but I think the true beauty of OOP is deeper than that. In the SURRAnet rewrite, I'm trying to harness the true power of Python OOP by creating the equivalent of custom types.&lt;br /&gt;&lt;br /&gt;I've already done this in some places. For example, the "core" SURRAnet database class, SDBM, is basically a simple Python dictionary (dict) with file operations added to it. It's simple yet beautiful. The SchoolYear class is another example of objects that behave like special variable types, allowing me to use those objects in very intuitive and simple ways.&lt;br /&gt;&lt;br /&gt;Yesterday I reworked the StudentData class (now just Student) in light of the added flexibility I have since breaking away from Apache. Instead of being a sort of ugly extension of the StudentDB class, it is truly a "student type", and instead of handling student IDs all the time, I can actually just handle Student objects!&lt;br /&gt;&lt;br /&gt;This adds many benefits and simplifies much of my code. Let me leave you with this one example. In the past, sorting students by their name was a big pain, since students were represented by integers (their ID), and sorting those integers would not do. If you look at the current code I have available for download (at the time of this writing), you'll see this strange voodoo sort method in the StudentDB class (sort_stuids_by_fieldname or something like that). Now, by overloading the __cmp__ operator of the Student class, I can have lists of Student objects and just call a regular sort() on that list, and poof - sorted students! No funky voodoo! Here's an example:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;SDB = database.StudentDB()&lt;br /&gt;students = SDB.students&lt;br /&gt;students.sort()&lt;br /&gt;for student in students: print student.fullname&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Needless to say, the code is simple, beautiful, and logical. I'm quite looking forward to using my new student "type" today as I continue to switch SURRAnet over from Apache-based to a stand-alone server program.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-1760386470487475534?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/1760386470487475534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/true-beauty-of-object-oriented.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1760386470487475534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1760386470487475534'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/true-beauty-of-object-oriented.html' title='The True Beauty of Object Oriented Programming'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-5069799102800672857</id><published>2009-05-27T04:24:00.000-07:00</published><updated>2009-05-27T05:08:29.558-07:00</updated><title type='text'>My Own Little Web Server</title><content type='html'>As detailed in my last entry, I've been contemplating the need for &lt;a href="http://www.apache.org/"&gt;Apache&lt;/a&gt; as part of the SURRAnet stack. Yesterday I whipped up a nice little web server that handles all SURRAnet's static content (html, xml, css, js, images, etc.) quickly and efficiently. In fact, I was amazed at how easy it was to make my "own little Apache" server!&lt;br /&gt;&lt;br /&gt;I am thus putting my hand to the plow and not looking back. Apache is bye-bye! Now let me say for the record again, I love Apache - it's a terrific tool. It's just too much tool for my job. I love big jets like the 747, but I'd rather bike to work than fly a big jet to work every day.&lt;br /&gt;&lt;br /&gt;In my last blog post I mention some of the great benefits of going Python only, but there is another huge benefit that I'm still wrapping my head around. You see, Apache always ran in the background, but SURRAnet only ran when generating a page for the user. The problem with this is that big, expensive (in cycles) to set up objects like the databases only existed for a fraction of a second and would then disappear into the computer "ether" until the next page was called for, requiring these objects to be regenerated all over again. I tried to figure a way to keep objects alive in mod_python / Apache, but never found a satisfying way. I worked out a way during this current rewrite to at least make object creation as efficient as possible, but now:&lt;br /&gt;&lt;br /&gt;Now I can have SURRAnet itself running full time in the background. My "snserver", which is my little web page server (technically it's an http request handler) can build all the core database objects when the program is first started and &lt;span style="font-weight:bold;"&gt;keep them in RAM for the duration&lt;/span&gt;! RAM usage may go up just a tad, though I bet cutting out Apache will more than compensate, but CPU and I/O utilization should decrease drastically. There is a lot of stuff that only needs to happen once, like sorting students into their classes, retrieving records from the hard drive, etc.&lt;br /&gt;&lt;br /&gt;This may end being the biggest change to the "behind the scenes" in SURRAnet since switching from PHP to Python. My big goal for this rewrite is to remove more complexity than I add, and I believe going to a 100% Python solution will definitely remove complexity. Now I'm focusing on how exactly I'll handle "sessions" and per-page code. I have some ideas. Hopefully by today's end, I'll have a working model.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-5069799102800672857?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/5069799102800672857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/my-own-little-web-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/5069799102800672857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/5069799102800672857'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/my-own-little-web-server.html' title='My Own Little Web Server'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-8536520091641209621</id><published>2009-05-25T11:06:00.000-07:00</published><updated>2009-05-27T05:11:29.990-07:00</updated><title type='text'>Apache Or Not Apache, This Is My Question..</title><content type='html'>I'm very seriously considering removing &lt;a href="http://www.apache.org/"&gt;Apache&lt;/a&gt; from the SURRAnet stack. If it is possible without too much heartache, then now is the time to do it while I'm undergoing such a major rewrite of the core code.&lt;br /&gt;&lt;br /&gt;Apache is there to begin with because SURRAnet was originally written in PHP. Boy did I learn a lot from that mistake! SURRAnet 2.0 is the "2.0" because it went from PHP to Python, and I couldn't be happier with my choice to use this language. However, my original Python code (much of which remains in the latest tarball that I uploaded) is "ugly" due to my trying to marry HTML and Python.&lt;br /&gt;&lt;br /&gt;A lot of my work this past Spring was creating a nice abstraction layer to separate the HTML (now XML) and Python via my widgets.py module, which continues to be refined and grow with new features. In fact, I'm not far from being able to generate very nice XHTML in an easy and clean Pythonic way.&lt;br /&gt;&lt;br /&gt;This got me to thinking - why do I need Apache? Besides the obvious "to serve content via http", Apache basically is just glue binding my Python code to simple HTML templates. In this regard, it seems like a lot of overkill. It also brings extra baggage in configuration, installing mod_python, etc. If SURRAnet will someday be an easy "download, install, and use" program, it would be nice if the whole thing can be done in Python so that all the end-user needs is Python, nothing else.&lt;br /&gt;&lt;br /&gt;However, there is that nagging need to "server content via http." As a reminder, SURRAnet is designed to be used on an &lt;span style="font-weight:bold;"&gt;intranet&lt;/span&gt; by a relatively small group of teachers. The web component is handled separately via PHP on an external web server. Again, Apache seems like overkill for this environment. I think of something like CUPS, which has its own HTTP server, and I'm wondering just how hard it would be to make a very simple HTTP server for SURRAnet using the BaseHTTPServer module.&lt;br /&gt;&lt;br /&gt;The changes this would bring would go beyond just how the content is delivered between SURRAnet and the client. If I wrote a HTTP server, it would keep a "living" database object in RAM at all times, which could greatly reduce I/O stress and increase performance. However, that means that the internal changes that would need to be made would be much bigger than I originally planned for. I need to have a working system by September for the start of &lt;a href="http://www.ghca.com"&gt;GHCA&lt;/a&gt;'s 2009-2010 school year. Finding myself with so much in common with the story told in &lt;u&gt;Dreaming In Code&lt;/u&gt;, I wonder if this is wise.&lt;br /&gt;&lt;br /&gt;I suppose the first thing for me to do is play around with the BaseHTTPServer module and see how capable it is and how easily I can plug SURRAnet code into it. I would love to ditch Apache, not because Apache is a bad thing, but because I want SURRAnet to be as lightweight, easy to install, and easy to configure as possible. Why use a wrecking ball to pound a nail when a hammer does just fine?&lt;br /&gt;&lt;br /&gt;I'll keep you posted as I experiment with this idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-8536520091641209621?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/8536520091641209621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/apache-or-not-apache-this-is-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8536520091641209621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8536520091641209621'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/apache-or-not-apache-this-is-my.html' title='Apache Or Not Apache, This Is My Question..'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-344983153919813187</id><published>2009-05-20T04:30:00.000-07:00</published><updated>2009-05-20T04:58:54.918-07:00</updated><title type='text'>I Had to Cheat and Lie</title><content type='html'>I finally was able to create the user interface that I've been aiming for, but I had to "cheat and lie" in order to do it. I don't like cheating or lying. I prefer honesty, both in my daily life and my computer code. I'm hoping that once the CSS spec adds some sorely missing features and web browsers do a better job of implementing this spec that I'll be able to remove the various hacks that I needed.&lt;br /&gt;&lt;br /&gt;Before I give you some examples, let me explain that I have indeed switched to XML for providing SURRAnet data. So what looks like a typical HTML table on the screen is actually custom XML that has been "shaped" using CSS into a table layout.&lt;br /&gt;&lt;br /&gt;Now let me give you some examples of my cheats and lies. First example - In order to provide both horizontal and vertical scrollbars to a table body that allows it to be scrolled without losing the top header row, I had treat the body as if it were a header. Using CSS this looks like:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;table-layout: table-header-group;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;If I use the intuitive css "table-row-group", everything breaks.. Very strange. So by using this cheat I can have both scrollbars available at the same time, and the header stays on the screen just like a frozen spreadsheet row.&lt;br /&gt;&lt;br /&gt;Another cheat is needed to keep the header in sync as I scroll the table horizontally. It's a pretty easy cheat which uses Javascript to manually scroll the header the same amount that the table body is scrolled. That said, the UI I'm creating isn't anything new. One would think that CSS would allow for this as easily as it does horizontal scrolling.&lt;br /&gt;&lt;br /&gt;I also had to hack my way around some buggy implementations of Javascript in Firefox, etc. It's a tad bit annoying due to the amount of time needed to discover why something doesn't work as it intuitively should, and then to brainstorm "hacks" to overcome deficiencies in the platform.&lt;br /&gt;&lt;br /&gt;The good news is, I have finally achieved what I was beginning to think as impossible. Having conquered this obstacle, I hope to get back to creating useful and productivity-enhancing features into SURRAnet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-344983153919813187?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/344983153919813187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/i-had-to-cheat-and-lie.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/344983153919813187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/344983153919813187'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/i-had-to-cheat-and-lie.html' title='I Had to Cheat and Lie'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-8303948309587258140</id><published>2009-05-13T06:12:00.000-07:00</published><updated>2009-05-13T06:26:52.704-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DTD'/><category scheme='http://www.blogger.com/atom/ns#' term='custom tags'/><category scheme='http://www.blogger.com/atom/ns#' term='XHTML'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='extensible markup language'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Boldly Going Where I Have Not Gone Before</title><content type='html'>Okay, I must admit, "boldly" may be a the wrong word. Maybe "hesitantly" would be a better adverb. What am I talking about? XML.&lt;br /&gt;&lt;br /&gt;XHTML to be precise. I actually considered the role of XML back when I first started SURRAnet version 2, because SURRAnet is indeed data-centric, and XML seems better suited for handling custom data. It was my unfamiliarity with the details of XML / XHTML and its relationship with page layout in a browser that kept me sticking with safe and familiar HTML.&lt;br /&gt;&lt;br /&gt;However, recent trouble with tables has me rethinking how I build these tables to get past the limitations of the HTML-specific table structure. The "work horse" of modern website design seems to be the &amp;lt;div&amp;gt; tag, which is then controlled by CSS to build all sorts of interesting layouts. If I were to go this route, I'd need to "micromanage" my &amp;lt;div&amp;gt; tags, which is what I would have to do with my own custom XML tags anyway, so why not have XML tags that are specific to SURRAnet? After all, SURRAnet is more of a intranet application than a website.&lt;br /&gt;&lt;br /&gt;Now I just have to wrap my head around XHTML. I'm "cool" with the idea of creating custom tags and using CSS to control their visual properties. What I need to spend time with is the DTD and how to write my own. In some ways this feels like more work on top of an already big project, but one of my big goals is to "future proof" SURRAnet so that the hard work I do now will stand the test of time for years to come. Moving to XHTML seems like a good idea in this regard.&lt;br /&gt;&lt;br /&gt;Luckily I chose to do this while I'm in the middle of rewriting the widgets.py module which serves as an abstration layer between Python-only code and the PSP templates. In fact, I'm quite happy in how nice and "object oriented" the widget objects are turning out. As I just said, the hardest part of this will be figuring out the DTD.&lt;br /&gt;&lt;br /&gt;I suppose the best way to learn something new is to dive in! Let's see if I can create a custom table based on my own XML scheme... Maybe I'll even get the on-screen layout that I've been working so hard to achieve!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-8303948309587258140?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/8303948309587258140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/boldly-going-where-i-have-not-gone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8303948309587258140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/8303948309587258140'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/boldly-going-where-i-have-not-gone.html' title='Boldly Going Where I Have Not Gone Before'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-545365969869362999</id><published>2009-05-12T04:55:00.000-07:00</published><updated>2009-05-12T05:21:23.230-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='spreadsheet'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='cascading style sheets'/><category scheme='http://www.blogger.com/atom/ns#' term='Steve Gibson'/><category scheme='http://www.blogger.com/atom/ns#' term='scrollbar'/><category scheme='http://www.blogger.com/atom/ns#' term='tables'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><category scheme='http://www.blogger.com/atom/ns#' term='efficiency'/><title type='text'>The Trouble With Tables</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iPk08o1TjvA/Sglj1_FptzI/AAAAAAAAAKc/ssm-MnteHUE/s1600-h/surranet_dev1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 202px;" src="http://4.bp.blogspot.com/_iPk08o1TjvA/Sglj1_FptzI/AAAAAAAAAKc/ssm-MnteHUE/s320/surranet_dev1.png" alt="" id="BLOGGER_PHOTO_ID_5334905012716418866" border="0" /&gt;&lt;/a&gt;My title is inspired by the "&lt;a href="http://en.wikipedia.org/wiki/The_Trouble_with_Tribbles"&gt;The Trouble with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Tribbles&lt;/span&gt;&lt;/a&gt;" episode of Star Trek, the original series. Like Kirk, I'm finding some basic lack of features within my beloved &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;CSS&lt;/span&gt; to be a great distraction from the serious work to be done.&lt;br /&gt;&lt;br /&gt;Shown to the right is a screen shot of what I'm working on. Notice the difference in the menu system on the left. My goal is to have a navigation system that is intuitive and requires the least amount of clicks to get from home to destination. Now I would like to draw your attention to the table itself. It looks basically the same as before, but there are indeed some major improvements. One such improvement is the locked header that stays put as the list is scrolled vertically. This is easily achieved with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;CSS&lt;/span&gt; and the use of a table header and a table body. The scroll bar attaches to the table body instead of the entire browser window.&lt;br /&gt;&lt;br /&gt;But wait, where is that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;scrollbar&lt;/span&gt;? It's off the screen, since the horizontal size of the table is bigger than the window width! This is NOT what I want. I would like to be able to attach the horizontal scroll bar to the table as easily as I attached the vertical scroll bar and allow both to be visible at the same time. However, it seems that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CSS&lt;/span&gt; stops short of providing what would be a very useful feature.&lt;br /&gt;&lt;br /&gt;That's not to say that it is impossible to achieve. Google Spreadsheet does this. However, it appears that Google has a ton of "Javascript magic" working in the background, and I bet the HTML is an ugly hack to make this work. I strongly dislike ugly, processor-intensive hacks. Strongly.&lt;br /&gt;&lt;br /&gt;In fact, I'm somewhat old-fashioned that way. That I'm writing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SURRAnet&lt;/span&gt; in 100% text editor, including the HTML, is proof. I'm much like the venerated &lt;a href="http://en.wikipedia.org/wiki/Steve_Gibson_%28computer_programmer%29"&gt;Steve Gibson&lt;/a&gt;, creator of &lt;a href="http://www.grc.com/intro.htm"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SpinRite&lt;/span&gt;&lt;/a&gt;, in that I believe strongly in simple, fast, to-the-point code. That said, I'm not going to switch over to assembly language for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;SURRAnet&lt;/span&gt;, but I'm also not ready to start using some of the massive Javascript libraries out there that do indeed achieve my goals. Not yet. I want to see if there is an easy, fast, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SURRAnet&lt;/span&gt;-specific way to get this job done. I don't want &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;SURRAnet&lt;/span&gt; becoming the next &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Facebook&lt;/span&gt; - bloated and slow as &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;molasses&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So this is my focus right now. The table is a key part of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;SURRAnet&lt;/span&gt;, and I'm making it even more so as I program additional functionality into various table views. The "ultimate" table is the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;gradebook&lt;/span&gt;, which emulates the look and feel of a spreadsheet, with some obvious differences. The more I can do via &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;CSS&lt;/span&gt; and the less "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;hackery&lt;/span&gt;" I have to do in creating the table and manipulating it with Javascript, the better. Thus is my focus again today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-545365969869362999?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/545365969869362999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/trouble-with-tables.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/545365969869362999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/545365969869362999'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/trouble-with-tables.html' title='The Trouble With Tables'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_iPk08o1TjvA/Sglj1_FptzI/AAAAAAAAAKc/ssm-MnteHUE/s72-c/surranet_dev1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-7271393777375660718</id><published>2009-05-08T02:46:00.000-07:00</published><updated>2009-05-08T03:00:28.404-07:00</updated><title type='text'>Back On Track</title><content type='html'>SURRAnet often takes a back seat to other time-sensitive tasks related to my job, but as the new school year rapidly approaches, SURRAnet is becoming one of those time-sensitive tasks! Thankfully I am able to rearrange my schedule to allow more coding time.&lt;br /&gt;&lt;br /&gt;Yesterday I worked on the records table view, which is almost complete. I continued to further abstract the HTML from the Python via my widgets module, so that there is zero HTML in the code that generates the pages. On the flip-side, I've reduced the Python code in the HTML layout to a bare minimum, so that everything is as "pure" as possible, making for much better readability, tighter code, uniformity across all the pages, etc.&lt;br /&gt;&lt;br /&gt;I hit a glitch with the CSS tag &lt;u&gt;max-height&lt;/u&gt;, which does not seem to work properly in Firefox for some odd reason. I need to research this.&lt;br /&gt;&lt;br /&gt;Of course a lot of the day was spent debugging and looking for oddball glitches...&lt;br /&gt;&lt;br /&gt;I must admit, programming huge (for me) pieces of software with multiple modules each with multiple objects is not my favorite thing. While I like my classes and the flexibility that their objects provide, I struggle keeping all these things in my head at once. It tires me out much more than what I typically need to write as a system administrator. I suppose the problem is that I'm one person working on a team-sized project, but that's most likely the way it will be until Fall. Once I have the core of my "vision" in code, I'll be open to allow others to help me with it. &lt;br /&gt;&lt;br /&gt;My goal for the coming week is to finish the records portion of SURRAnet and move on to the curriculum section, which is one of the most complex sections behind-the-scenes. I need to rethink how I treat our curriculum because so many students have taylored courses. Oy.&lt;br /&gt;&lt;br /&gt;I'll post a developer's snapshot as soon as I finish with the records portion, in case anyone is interested in what's happening behind-the-scenes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-7271393777375660718?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/7271393777375660718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/back-on-track.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7271393777375660718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7271393777375660718'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/back-on-track.html' title='Back On Track'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-378871145446636756</id><published>2009-05-06T07:17:00.000-07:00</published><updated>2009-05-06T07:55:10.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='layout'/><category scheme='http://www.blogger.com/atom/ns#' term='standards'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='cascading style sheets'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='abstraction'/><title type='text'>The Wonderful New World of CSS</title><content type='html'>I've been a fan of cascading style sheets for some time, but with recent advancements in the CSS definitions, and more importantly, browser support, CSS is taking on a whole new sense of wonderful!&lt;br /&gt;&lt;br /&gt;When I first started SURRAnet, CSS support was very minimal. SURRAnet version 2 was able to take advantage of many more CSS features, but I still found that I had to use a lot of "tricks" in Javascript and the generation of the HTML to do what I want. In my recent efforts to clean up the SURRAnet code and provide the features listed in previous blog entries, I have thrilled to see that CSS takes care of so much more than it used to.&lt;br /&gt;&lt;br /&gt;One big example is scrolling tables with locked headers. SURRAnet has a lot of tables and even simulates a spreadsheet in many ways with the gradebook, but the "lost" headers due to scrolling was a pain, and the work-around was messy and complicated. Now I can have some simple CSS take care of the header locks and focus on generating the content in my Python code.&lt;br /&gt;&lt;br /&gt;The one problem with CSS, and also Javascript, is that browser support is all across the board. What I have chosen to do is to focus on one browser - Firefox. Most of SURRAnet is designed to be deployed in a single organization where the IT department can provide the same browser to everyone. Firefox is open source and cross-platform, and it seems much more standards-friendly than IE. Understand that I'm not trying to program FOR Firefox (taking advantage of Netscape-only tags), but if CSS and Javascript works great in Firefox but breaks in IE, oh well..&lt;br /&gt;&lt;br /&gt;CSS is helping me separate all the various layers of SURRAnet. Separating database processing from content generation from layout results in much easier to maintain and modify code. I'm also taking advantage of extra features that are now easier to implement thanks to CSS. Hopefully you'll find the new role CSS has in SURRAnet as a huge benefit for users and developers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-378871145446636756?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/378871145446636756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/05/wonderful-new-world-of-css.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/378871145446636756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/378871145446636756'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/05/wonderful-new-world-of-css.html' title='The Wonderful New World of CSS'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-7867799509741139873</id><published>2009-03-03T07:33:00.000-08:00</published><updated>2009-03-03T08:06:56.353-08:00</updated><title type='text'>New Ideas</title><content type='html'>While I am doing things like cleaning up the code and restructuring &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SURRAnet&lt;/span&gt; to be more configurable for other schools, I am also thinking of ways of extending &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SURRAnet's&lt;/span&gt; capabilities. As stated previously, I'm not interested in it becoming the next Emacs, but I am interested in making &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SURRAnet&lt;/span&gt; a flexible and powerful student information system. Here are things that I am considering:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Part-time students&lt;/span&gt; - I want our school to offer "A-la-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;carte&lt;/span&gt;" classes. This may be via our upcoming online courses or the ability for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;homeschoolers&lt;/span&gt; to take a class or two without becoming full-time students. Currently &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SURRAnet&lt;/span&gt; has no sense of a part-time vs. full-time student. It should be &lt;span style="font-style: italic;"&gt;relatively&lt;/span&gt; easy to implement through the addition of an extra field and code to consider this in forms, etc.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Adult education&lt;/span&gt; - similar to my previous note, I want to be able to add adult students as well.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Customized courses&lt;/span&gt; - In a class of 20 students, a large range of academic abilities may be represented. This often results in tweaking the course for individual needs. Currently &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SURRAnet&lt;/span&gt; has no easy mechanism for this except to create an entirely separate course for that student. I want to change this. This may result in changing how assignment data is stored, in that more information will be stored in student assignment records (like title, description, etc.) It also may change how course data itself is stored. I will be giving this more thought, as it will require some major code changes.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Transfer students and course add / drops&lt;/span&gt; - We get students joining us part-way throughout the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;schoolyear&lt;/span&gt;, and we also have students dropping and adding courses. This ties in with my previous bullet - I need more flexibility in mapping courses to students.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;External data feeds&lt;/span&gt; - what I mean by this is that I want an interface that allows me to import and export data easily between &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SURRAnet&lt;/span&gt; and external applications. I'm particularly interested in creating two special apps - one is the ability for computerized exams to directly record grades to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;SURRAnet&lt;/span&gt;. The other is:&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Automated attendance system&lt;/span&gt; - Attendance is a "tricky" subject, because what makes an absence vs. a tardy vs. a dismissal? If somebody is dismissed two hours after arriving at school, shouldn't that be considered an absence? My goal is to move to a "punch clock" style of attendance tracking. Students "punch in" and "punch out" and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;SURRAnet&lt;/span&gt; will track those times, hours present per day, percentage present, etc. To facilitate this, I would love to have some sort of automated system, like a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;barcode&lt;/span&gt; reader or a keypad to allow students to easily and quickly clock in and out.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;Customizable&lt;/span&gt; extend records&lt;/span&gt; - I want users to be able to add their own "extended records" to what &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;SURRAnet&lt;/span&gt; provides as default record information. For example, locker numbers! If users can create their own fields, this will provide a whole new level of flexibility to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;SURRAnet&lt;/span&gt; while not greatly changing the current design.&lt;/li&gt;&lt;/ul&gt;The big theme here is "flexibility". Obviously I can't make it too flexible at this point without a complete rebuild-from-scratch design (maybe someday there WILL be a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;SURRAnet&lt;/span&gt; 3.0).&lt;br /&gt;&lt;br /&gt;Anyway, enough blogging - I have coding to do!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-7867799509741139873?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/7867799509741139873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/03/new-ideas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7867799509741139873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/7867799509741139873'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/03/new-ideas.html' title='New Ideas'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-1278299994767741607</id><published>2009-02-27T11:00:00.000-08:00</published><updated>2009-02-27T11:04:06.112-08:00</updated><title type='text'>Sickness Setback</title><content type='html'>My day job is the system administrator / CIO at Greater Houlton Christian Academy. Did you know that schools are like germ factories? I spent all week at the school while everyone else was on vacation, no problem. But the day everyone comes back, I get a dreadful cold..&lt;br /&gt;&lt;br /&gt;Maybe it's age or maybe it's me or maybe it's normal for everyone, but I have a hard time writing complex code like what's found in SURRAnet when my mind is even a little bit foggy. Needless to say, production has been on hold. I'm praying that my immune system kicks up the counter-attack and drives these invaders from my body soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-1278299994767741607?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/1278299994767741607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/02/sickness-setback.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1278299994767741607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/1278299994767741607'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/02/sickness-setback.html' title='Sickness Setback'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-939913654920589487</id><published>2009-02-25T04:15:00.000-08:00</published><updated>2009-02-25T04:28:09.222-08:00</updated><title type='text'>Cleanup Begins</title><content type='html'>I'm going to start today cleaning up the modules. I have a confession - while I'm a big supporter of open source, I had a hard time initially releasing SURRAnet, because like many others, some of my code embarrasses me. Especially the early stuff.&lt;br /&gt;&lt;br /&gt;I'll be starting a new "branch" that will be purely development from now until this Fall when I put it online at my school. This will allow me to gut out the old stuff without breaking anything (actually, I'll be breaking all sorts of stuff, but I won't care because the goal is to fix it again).&lt;br /&gt;&lt;br /&gt;Since I am going through this process, I am also taking some time to consider what SURRAnet is and what I want it to do. I do NOT want it to become the next EMACS (in the sense that it has &lt;u&gt;too&lt;/u&gt; many features). What it does do I want it to do very well. SURRAnet is a student information system, so I am considering just what information is handy for a school to keep track of for students.&lt;br /&gt;&lt;br /&gt;Of course I want to keep it basically the same - reinventing the wheel over and over again is a mistake that too many software designers fall into (read &lt;a href="http://www.amazon.com/Dreaming-Code-Programmers-Transcendent-Software/dp/1400082471/"&gt;Dreaming in Code&lt;/a&gt;). At the same time, I don't want to have to redesign the core modules every year just to add a new feature.&lt;br /&gt;&lt;br /&gt;Anyway, I'm going to attempt to do a better job at the "post early, post often" motto of open source. SourceForge is right now overkill for my purposes, so I am going to create a page on the GHCA website that will make it easier to get SURRAnet development code and look at it. This blog will also be a major part of keeping track of what I'm up to as I plug away at this daunting project :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-939913654920589487?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/939913654920589487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/02/cleanup-begins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/939913654920589487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/939913654920589487'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/02/cleanup-begins.html' title='Cleanup Begins'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-4419468928527969326</id><published>2009-02-20T02:54:00.000-08:00</published><updated>2009-02-20T03:36:26.167-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python code efficiency beauty programming style loops'/><title type='text'>Beauty and Efficiency</title><content type='html'>These are two goals that I have before me as I go through the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SURRAnet&lt;/span&gt; code base. Sometimes one leads to the other, and other times one must be sacrificed for the other. I shall explain what I mean by beauty and efficiency.&lt;br /&gt;&lt;br /&gt;I'll start with &lt;span style="font-weight: bold;"&gt;efficiency&lt;/span&gt;. I recently did quite a bit of research and experimentation in optimizing Python code. I was amazed to see how certain "tweaks" can drastically speed up code execution, especially when done in a large or multi-layered loop. One example is the overhead of looking up variables in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;namespace&lt;/span&gt;. For example, a local variable "x" is quicker to access then an instance variable "self.x". By copying instance variables into local variables (x = self.x) before entering a large loop, many seconds can be shaved from code execution time. This and other "tricks" will be especially useful in generating large tables and reports.&lt;br /&gt;&lt;br /&gt;Of course, it is often "prettier", based on simplicity, to just deal with "self.x" without the extra code to copy back and forth to a local variable. I am taking the advice of one programmer, "Optimize just the inner loop." In other words, if I am iterating through a loop 10 times, the extra code is not worth just a couple of milliseconds of performance.&lt;br /&gt;&lt;br /&gt;There are two other areas of optimization I am working on. One is fixing a mistake that I made in my understanding of how &lt;span style="font-style: italic;"&gt;mod_python&lt;/span&gt; handles &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;namespaces&lt;/span&gt;, global variables, and objects across multiple sessions. As a result, I have new objects being created and destroyed multiple times during heavy looping. This definitely adds overhead, especially if I am creating new database objects. For example, by making &lt;span style="font-style: italic;" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;StudentData&lt;/span&gt; a child of the &lt;span style="font-style: italic;" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;StudentDB&lt;/span&gt; class, every time I looped through a bunch of students, the underlying &lt;span style="font-style: italic;" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;StudentDB&lt;/span&gt; class would be initialized over and over. I have recently rewrote this so that &lt;span style="font-style: italic;" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;StudentData&lt;/span&gt; now takes a single instance of &lt;span style="font-style: italic;" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;StudentDB&lt;/span&gt; that is created beforehand, which is obviously before any looping. This will bring logical and perceivable speedup to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SURRAnet&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The other area is caching. The idea is this - it takes a lot of work for SURRAnet to generate reports and large tables (like the grade sheet). Since the output to the screen is simple HTML, why not save a snapshot of this HTML to a cache and just reuse it the next time the user wants that report / table? I already have this implemented in later code in SURRAnet and it works well. The trick is determining when the cache is stale, which is basically when any data is changed that affects the given report.&lt;br /&gt;&lt;br /&gt;Regarding &lt;span style="font-weight: bold;"&gt;beauty&lt;/span&gt; - Python is a beautiful language to program in. I personally need beauty in my code, not just for the sake of beauty, but for the sake of readability, debugging, and enhancing. I am going through and applying techniques and new algorithms to areas of older code written when I didn't know the best way to do something (examples including using &lt;span style="font-style: italic;"&gt;map()&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;enumerate()&lt;/span&gt;, some new Python 2.5 features, etc.).&lt;br /&gt;&lt;br /&gt;However, what makes my code "ugly" is the HTML scattered through it like buckshot. Let's face it, what you browser renders when using SURRAnet is HTML. The Python code must generate this HTML. So how do I get the HTML out of the Python code? Wrappers.&lt;br /&gt;&lt;br /&gt;I started with with the widgets module, but that module was a bit too high end and not enough low end. For example, I would provide a list of data and try to generate a table from that. That works for simple tables, but not complex ones. It also adds the overhead of looping twice - once to create the data list and again to render the HTML. My new approach is to wrap the simple HTML entities into objects like &lt;span style="font-style: italic;"&gt;TableCell&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;TableRow&lt;/span&gt;, etc. These new objects allow the building of the HTML during the initial loop. In fact, the objects themselves become the containers, instead of using separate lists! The end result? Much cleaner Python code. Below is an example of new code that generates a list of absent, tardy, and dismissed students for the day (note - my blog deletes the Python indents:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;# Now on to generating our absentee table&lt;br /&gt;header = TableRow('th')&lt;br /&gt;header.addseq((' ','Absence List','Tardy List','Dismissal List'))&lt;br /&gt;table = BasicTable(header)&lt;br /&gt;# Provide a function to determine how we display the info in our table&lt;br /&gt;def format_data(name, data):&lt;br /&gt;  if data['type'] == 'absence':&lt;br /&gt;      return "%s (%s)"%(name, data['reason'])&lt;br /&gt;  else:&lt;br /&gt;      date = database.datetypes.Day(data['timestamp'])&lt;br /&gt;      return "%s at %s (%s)"%(name, date.time, data['reason'])&lt;br /&gt;for grade in self.gradelevels:&lt;br /&gt;  row = TableRow()&lt;br /&gt;  columns = {'absence':List(), 'check-in':List(), 'check-out':List()}&lt;br /&gt;  grade_sIDlist = list(sIDlist.intersection(SDB.gradelist[grade]))&lt;br /&gt;  if not grade_sIDlist: continue&lt;br /&gt;  for sID in SDB.sort_stuids_by_field(grade_sIDlist):&lt;br /&gt;      student = StudentData(SDB, sID)&lt;br /&gt;      attdict = self.day_attendance[sID]&lt;br /&gt;      columns[attdict['type']].append(format_data(student.name, attdict))&lt;br /&gt;  row.addcell(grade,'gradelevel')&lt;br /&gt;  for col in ['absence','check-in','check-out']: row.addcell(columns[col], col)&lt;br /&gt;  table.addrow(row)&lt;br /&gt;self.html = table.html&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-4419468928527969326?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/4419468928527969326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/02/beauty-and-efficiency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/4419468928527969326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/4419468928527969326'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/02/beauty-and-efficiency.html' title='Beauty and Efficiency'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-3254082762608464908</id><published>2009-02-19T13:31:00.000-08:00</published><updated>2009-02-19T14:06:25.919-08:00</updated><title type='text'>Moving Forward - The Big Picture</title><content type='html'>There is a time when technology is first adopted that it is forced into the "old &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;wineskins&lt;/span&gt;" - those old ways of doing things before the technology was available. For example, many of the first websites were nothing more than electronic brochures. Then people start to realize that they can do so much more with the technology once they let go of the old ways and adopt "new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;wineskins&lt;/span&gt;." &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Facebook&lt;/span&gt; is a good example of just what a website can be.&lt;br /&gt;&lt;br /&gt;Our school's administrative team is starting to see the possibilities of doing education using the proverbial new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;wineskins&lt;/span&gt;. For example, the question was raised, "Why do we print report cards every quarter?" Since &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SURRAnet&lt;/span&gt; allows parents and students to access their grades at any moment online live, what is the point of wasting this paper and setting aside four "report card days"? This question led to the next logical question - why divide the academic year up into four quarters to begin with when most of our classes are single year-long courses?&lt;br /&gt;&lt;br /&gt;They say the best programmers don't add code to make their software better, they remove code. There is a ton of complexity built into &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SURRAnet&lt;/span&gt; around this concept of academic quarters. There is other complexity as well, like weighted points, that is required because &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SURRAnet&lt;/span&gt; was forced into old &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;wineskins&lt;/span&gt;. I've been given the green light to remove all this complexity from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SURRAnet&lt;/span&gt;. Let me tell you, I am thrilled to no end!&lt;br /&gt;&lt;br /&gt;When I am done with SURRAnet, it will no longer care about time, except in regards to the academic school year (the start and end date). Grades won't close at artificial markers on the calendar (our current quarters) nor will there be four individual grades and a final average. Each course will only have one grade - the final average. Nor will it matter if one course is a semester long course while another is a year long. Courses will be identified by their credits, and this will allow some students to take a full year to finish a 1/2 course credit if necessary. It will also let fast students finish a year course in less time. Obviously that will require flexibility in the school's schedule, self-pacing, etc., but SURRAnet need not be concerned about this. It only needs to track the grades.&lt;br /&gt;&lt;br /&gt;I do realize that there is benefit of generating reports for a specific slice of time, which is the original purpose of the academic quarter, but it is even more useful to have that time slice be fluid. For example, it would be nice to generate averages for our basketball season, or maybe the month of December, or for the entire semester. My goal is to create a fluid report system that will accept a start and end date each time reports are generated, similar to a QuickBooks report. This way a school that needs to could emulate the four quarters method, or three trimesters, or two semesters. The one difference is that the overall average will always be calculated by the overall points earned divided by the total points.&lt;br /&gt;&lt;br /&gt;In fact, think about it for a minute - is it fair that four quarters are treated equally? Are they really equal? For our school some quarters are interrupted with snow days, basketball dismissals, and vacation time. Sure, they may be close, but what if teachers give less work during a sports season? If a student does 2/3 of the work during the 2nd quarter compared to the other quarters, is it fair or even logical that all quarters are treated equal?&lt;br /&gt;&lt;br /&gt;Because the changes are pretty drastic, and because I am also doing some fundamental reorganizing of the code base itself (I'll discuss that in my next entry), I'm going to develop these changes separate from my current version. Usually I patch our working system "in flight", that is the SURRAnet that is running right now at GHCA. These changes will be big enough that I want to develop on a separate, non-critical system with the goal of swapping out the new SURRAnet for the old by August of 2009. This means that I'll be actively developing SURRAnet over the next number of months.&lt;br /&gt;&lt;br /&gt;I'm excited about the simplicity that removing this "old wineskin" code will bring to SURRAnet, and that should allow me to do things with it that so far have only been ideas!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-3254082762608464908?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/3254082762608464908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/02/moving-forward-big-picture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/3254082762608464908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/3254082762608464908'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/02/moving-forward-big-picture.html' title='Moving Forward - The Big Picture'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7401712043400993543.post-6629697113461065022</id><published>2009-02-18T04:58:00.000-08:00</published><updated>2009-02-18T06:07:56.803-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SURRAnet history story Python mod_python SIS software development origins'/><title type='text'>The Story Behind SURRAnet</title><content type='html'>&lt;a href="http://sourceforge.net/projects/surranet/"&gt;SURRAnet&lt;/a&gt; started back in 2002 as a very simple discipline database written in Python. The private school where I work, &lt;a href="http://www.ghca.com"&gt;GHCA&lt;/a&gt;, had grown tremendously since the 90s, and we adopted a more formalized system of issuing and tracking discipline issues. SURRAnet wasn't called SURRAnet back then, it was just called "Discipline Database."&lt;br /&gt;&lt;br /&gt;We used to keep our grades via spreadsheet, but the growth of our school, which included additional staff and classes, made this system unwieldly. We actually owned a &lt;a href="http://en.wikipedia.org/wiki/Student_information_system"&gt;student information system&lt;/a&gt;, but it was incredibly difficult to use, it didn't have features that we needed (though it had tons of useless features), and the licensing scheme was prohibitive for a private school. In my blissful ignorance I told my boss, "I can build us a grading system over the summer!" Thus SURRAnet was born.&lt;br /&gt;&lt;br /&gt;The original SURRAnet was written in PHP because that seemed at the time like the language everyone was using to create web applications. I designed SURRAnet to be an intranet-based web application. Our school had a number of older computers at the time, and I had noticed how they could just barely run our spreadsheet software. I wanted a central server to handle the hard work, so that as long as the client computer had enough horsepower to run a browser, it could run SURRAnet. I also felt more comfortable with HTML than with GUI toolkits like GTK, QT, etc.&lt;br /&gt;&lt;br /&gt;I learned very quickly that I had bitten off more than I could chew. SURRAnet was "finished" in time for the next school year, sort of, but I sacrificed almost all of my personal time to make it happen. During the process I realized a few things. First, PHP is, IMHO, a terrible language for doing something large scale. I know there are plenty of sites out there that pull it off, but as SURRAnet grew, my code got uglier and more difficult to manage. Second, when I thought SURRAnet would be easy to write, I based this on the notion that it would do a relatively simple task of recording grades and generating reports. I did not fully understand the depth of human stupidity (I include myself in this category). I didn't plan for people entering the wrong information into the fields, like entering a name into the date field, or a letter grade where it specifically states "points". I also didn't expect that students would be moved from class to class throughout the school year as their grades were assessed, or that we'd have a volume of transfer students arrive part-way through the year, or 100 other unforeseen variables that added an expotential layer of complexity to SURRAnet.&lt;br /&gt;&lt;br /&gt;I also made some dumb mistakes when first designing the database engine. I didn't want to use SQL or version thereof (and I still don't), I wanted to have my own system. There are what I consider good reasons for this that I may save for another blog post. The problem with the original database engine was that it broke under certain conditions because of its dependency on delimiters, special symbols, etc. It also was a pain to expand upon.&lt;br /&gt;&lt;br /&gt;I came to realize that SURRAnet 1.0 was not going to cut it. I really, really wanted to get away from PHP, and wasn't I delighted when I discovered &lt;a href="http://www.modpython.org/"&gt;&lt;span style="font-style: italic;"&gt;mod_python&lt;/span&gt;&lt;/a&gt; for Apache! &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; is my language of choice for larger projects (another topic for a future blog post). Using Python opened up a new world of possibilities in both the logic of SURRAnet and the database itself. SURRAnet 2.0 is much "cleaner" from the use of modules, custom objects, a simple to use but powerful database object based on a Python dictionary, etc. Coding SURRAnet 2.n is much more of a joy!&lt;br /&gt;&lt;br /&gt;I also had access to new client-side features that made SURRAnet more powerful and easy to code for, especially in the area of CSS. In the past I had to hand-code different GUI-like interfaces. For example, if a name didn't fit in a table cell, I had to hand-code the shortening of the name - "John Sm..." Now CSS takes care of this. CSS also takes care of things like scrolling table bodies, various mouseover effects, and much more.&lt;br /&gt;&lt;br /&gt;This brings up another point - SURRAnet isn't just Python, it's also a lot of Javascript. There is much that I try to take care of on the client side, especially in form validation. Javascript has really come a long way since I first started coding SURRAnet. So has HTML, which is the "glue" that I use to hold everything together.&lt;br /&gt;&lt;br /&gt;Let me end this post on a final note, since I hope to have many future posts that look into specific details of SURRAnet. SURRAnet was originally created for GHCA. In fact, my first commitment remains to the Academy. It had a lot of our school "hard coded" into the base code itself. To be honest, while &lt;a href="http://www.google.com/search?q=ghca+open+source"&gt;I am a big supporter of open source&lt;/a&gt;, I never thought anyone would be interested in my little program with all the other SIS options out there. I was wrong. Now that I see there is a demand, and also in light of the ever-changing landscape at our own school, I am working to make SURRAnet more flexible and open for anyone who wants to use it. It is not there yet. Much of this blog will follow my efforts to move SURRAnet to a 2.1 status (btw - it really never hit 2.0 status due to a number of incomplete features). Even if you are not interested in SURRAnet itself, you may find this blog interesting if you like programming, open-source software, the Python language, etc. Feel free to follow this blog and contact me with any feedback!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7401712043400993543-6629697113461065022?l=surranet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://surranet.blogspot.com/feeds/6629697113461065022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://surranet.blogspot.com/2009/02/story-behind-surranet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/6629697113461065022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7401712043400993543/posts/default/6629697113461065022'/><link rel='alternate' type='text/html' href='http://surranet.blogspot.com/2009/02/story-behind-surranet.html' title='The Story Behind SURRAnet'/><author><name>Tom Didymus</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_iPk08o1TjvA/SZ3eqVTZDcI/AAAAAAAAAJE/Nr-elWIRyHo/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry></feed>
