The Arena Community Developer Board

Friday, July 02, 2010 8:37 AM by nairdo
the Board - NOTIn February 2007 the guys at Arena ChMS established what was loosely called the Community Developer Board (or CDB). This little known group was comprised of the Arena team (Jeff M, Steve, Mark, Alfred, etc), Jon and David from CCV, and Phil and myself from Central. Since that time a few more churches were invited to the team (Joel & Daniel: High Desert Church, Jeremy Hoff: Shepherd of the Hills, Tom Powers: Southeast Christian Church) but our charter has been roughly the same as summarized here:
The CDB’s role is to foster and grow structured development for the Arena community. To achieve this, the CDB should, among other things, create and maintain documentation that illustrates how to properly design, develop and package Arena modules for use by the community.  Additionally it should ... fulfill other needs that are essential to more efficient module development.

A few of the things the board has done:

  • help establish the.Community site
  • establish the original wiki which later moved to the official wiki
  • establish the namespace/naming standards
  • create the Arena Custom Module Developer guide (ACMD)
  • establish the monthly and yearly Arena Developer Roundtables
  • establish the module export/import feature (and applying constant pressure to make it more complete)
  • establish our original shared source repository on CVS Dude
  • establish the "My Portal" framework enabling developers to write personalization modules
  • establish consistency on various things like using the MS Ajax CDN

Although we haven't always agreed on things, we've made good progress in areas where there was consensus. (Establishing the RefreshCache tribe has been instrumental in relieving pressure in areas where we have not agreed -- more below.)

With the arrival of Mike Gold at Arena and onto the CDB, he's been reshaping how things are done at Arena and as result the CDB will be undergoing a reboot or reinvention. Regardless of the direction the CDB takes, the RefreshCache team will continue to grow in importance. On that team Arena has no responsibility -- which means they are not on the hook for anything.  This has been a real blessing for everyone. Having that kind of clarity has freed up the community to take responsibility and ownership for things that they feel are critical or important (our Manifesto).

For the most part, everyone who attended last year's event is part of the RefreshCache team. Over the past year this team has:

  • established and manage the #ArenaChMS IRC channel (Brian Slezak)
  • established the Arena Sample Server - a place where developers can setup their custom modules and try out other live modules in action
  • established our Redmine project server - the new repository (replacing CSV Dude) for hosting your code, issue tracking, wiki, etc. more... (Daniel Hazelbaker)
  • created an amazing Arena module installer (Jon Edmiston, David Turner) 
  • really beta tested each major release of Arena before its available to everyone (Austin Spooner) 
  • created the Arena Sandbox - a place where developers can test installing their modules in a clean sandbox environment (Daniel Hazelbaker)
  • taught developers essential tips and tricks for developing Arena modules (David Turner, Jeff Schinella, Jason Offutt)
  • shared vital ideas and concepts about ChMS (Jon Edmiston)

We're only about about 3 months away from RefreshCache 101010 so it's not too late to get involved on this team by signing up to attend the free event. As you can see on our Speakers page, this year we're planning on having the guys from Integrum (creators of Gangplank) stop by and chat with us about stuff they think is important. There are a few other surprises we're hoping to unload on everyone there too but it's too soon to spill the details.

Lastly, I'm serious about this:  if anyone else is out there and can't attend RefreshCache because of cost please let me know. You can stay at my house (last year we had a few people at my place -- it was great!) or I'll help find independent sponsors to help with travel costs, etc.


101010 A Developers Conference: RefreshCache

Saturday, May 08, 2010 6:28 PM by nairdo

RC 101010Last year we decided to take a little more ownership of our destiny so we created "RefreshCache," the free two day event for church developer teams that use the Arena ChMS platform.  We're doing it again, but this year we're breaking the ice with pre-event social and hack-night on the evening of 10/10/10.  (We did not initially realize it was a binary day.)

We only made one announcement on the Arena community developer forum and we already have 19 registered attendees with two (and possibly three) of the top ten largest Christian churches in America attending.  If you're looking to get plugged into the core of the Arena community developer team, the RefreshCache (RC) team is it.

We haven't locked everything down yet, but to give you an idea of what kinds of things we cover, check out last year's schedule or one of these other blog posts. Also as an added bonus, this year we're providing all registrants with early releases of a bunch of modules created by RefreshCache founding members.  These modules include:

  • Arena <-> Planning Center Online (PCO) integration.  Created by Jon and David over at CCV.  Currently being tested by Austin at NCBC.
  • TinyMCE based Advanced HTML Editor. Created by Jason O at Central.
  • CuFon Font Replacer. Use the CuFon font rendering engine instead of boring Arial, Verdana, etc on your website. Assembled by me.
  • Promotions via XSLT.  It can use a custom XSLT (for layout), inject style sheet, apply image effects, randomize, and cache.  (The 'promotions' module to end all other promotion modules.
  • and a few others...

I really hope you don't miss it -- register now.


Ignore This Book At Your Own Peril

Saturday, March 27, 2010 11:09 AM by nairdo

Rework by Jason Fried and David Heinemeier Hansson"Ignore this book at your own peril." -- Seth Godin said that about the book Rework by the founders of 37signals.  Before I even finished it, I went and ordered two copies for some friends. Everyone will benefit from reading the book, but anyone who's writing software, is running a business, wants to start their own business, is a product manager, or is managing projects, really should stop whatever they are doing and take 2-4 hours to read this book.

I've read a bunch of books on various topics over the past several years -- and while many of them are really good, I usually don't talk them up too much.  This book is 99% meat and no fluff.

I experienced so many of the things Jason and David write about but one in particular stands out to me. Meetings are toxic.  Not all meetings, but most.  When I worked at a very large Fortune 100 company, I remember getting pulled into meetings with hundreds (400-800) of others.  If you take the average salary and compute the cost of this 800-1600 man hour meeting, you're in the $20,000-$50,000 range. As my old boss, Frank Dooris, used to say, "How many pagers does a sales guy have to sell to make up for that?"

I could say so much more about this book.  It describes much of what inspired us to start our own developer conference for the Arena ChMS community developers. We're giving this book to all attendees of this year's RefreshCache conference.  I hope you or your developers can come.  We all end up hurting if you don't make it to the event, but ultimately you'll be missing out the most.


Arena Loves Twitter Too

Wednesday, February 03, 2010 8:26 PM by nairdo

Have I mentioned how much I love Arena?  Here's why - because it can do almost anything you need it to.  Let me illustrate with a small example.  I recently heard someone say 'oh, Arena can't do that yet' on the topic of integrating twitter with our website.  Not true.  There's no need to wait for a future of release of Arena.  You can easily add your favorite tweets to an Arena powered website using the XML File Transformation module.

@RefreshCache tweets as seen on www.refreshcache.com (powered by Arena ChMS)

Here's how to do it in three simple steps.

1) Publish an XSLT file that transforms a Twitter RSS feed to suit your website's layout, look and feel.  I've included mine below which you can reuse or modify as you see fit.

2) Add the XML File Transformation module to a page.

3) Configure the module's settings appropriately.  For example, I'm using "http://twitter.com/statuses/user_timeline/47123579.rss" for the XML File Path and "~/xslt/Custom/Cccev/twitter.xslt" for the XSLT File Path setting.  (That XML File Path is the RSS feed for our @RefreshCache tweets.)

Ok, I'm definitely no XSLT expert -- in fact I'm an absolute bumbling n00b in this area.  Regardless, I was able to cobble something together that works.  Notice in lines 9-60 I'm falling back to my language of choice (C#) for date processing mostly because the JavaScript date parser does not like the RSS pubDate string format.  Yes, lines 63-75 are me embedding a style block directly inline.  (I know, shame on me.)  Line 78 is where I restrict the number of tweets displayed to only 5.  Lastly, lines 77-86 are the main HTML layout for the tweets. Again, you can download mine and modify it as you please.

   1: <?xml version="1.0" encoding="ISO-8859-1"?>
   2:  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   3:         xmlns:msxsl="urn:schemas-microsoft-com:xslt"
   4:         xmlns:cs="urn:cs"
   5:         xmlns:js="urn:custom-javascript"
   6:         exclude-result-prefixes="msxsl js" 
   7:  >
   8:  
   9: <msxsl:script language="c#" implements-prefix="cs">
  10:  <![CDATA[       
  11:     public static string UXDate( string pubDate )
  12:     {
  13:         DateTime d = DateTime.Parse( pubDate );
  14:         DateTime now = DateTime.Now;
  15:         TimeSpan timeSince = now - d;
  16:         
  17:         double inSeconds = timeSince.TotalSeconds;
  18:         double inMinutes = timeSince.TotalMinutes;
  19:         double inHours = timeSince.TotalHours;
  20:         double inDays = timeSince.TotalDays;
  21:         double inMonths = inDays / 30;
  22:         double inYears = inDays / 365;
  23:  
  24:         if(Math.Round(inSeconds) == 1){
  25:             return "1 second ago";
  26:         }
  27:         else if(inMinutes < 1.0){
  28:             return Math.Floor(inSeconds) + " seconds ago";
  29:         }
  30:         else if(Math.Floor(inMinutes) == 1){
  31:             return "1 minute ago";
  32:         }
  33:         else if(inHours < 1.0){
  34:             return Math.Floor(inMinutes) + " minutes ago";
  35:         }
  36:         else if(Math.Floor(inHours) == 1){
  37:             return "about an hour ago";
  38:         }
  39:         else if(inDays < 1.0){
  40:             return Math.Floor(inHours) + " hours ago";
  41:         }
  42:         else if(Math.Floor(inDays) == 1){
  43:             return "1 day ago";
  44:         }
  45:         else if(inMonths < 3 ){
  46:             return Math.Floor(inDays) + " days ago";
  47:         }
  48:         else if(inMonths <= 12 ){
  49:             return Math.Floor(inMonths) + " months ago ";
  50:         }
  51:         else if(Math.Floor(inYears) <= 1){
  52:             return "1 year ago";
  53:         }
  54:         else
  55:         {
  56:             return Math.Floor(inYears) + " years ago";
  57:         }
  58:     }
  59:  ]]>
  60: </msxsl:script>
  61:  
  62:   <xsl:template match="rss/channel">
  63:       <style>
  64:        #tweets a {
  65:         text-decoration: none;
  66:         color: #444;
  67:        }
  68:        
  69:        #tweets span {
  70:         font-family: Verdana, Helvetica, sans-serif;
  71:         font-size: 9px;
  72:         color: #888;
  73:         font-style: italic;
  74:        }
  75:       </style>
  76:  
  77:         <div id="tweets" style="padding-left:5px;font-family: Verdana, Helvetica, sans-serif; font-size: 10px; width: 500px;">
  78:         <xsl:for-each select="item[position() &lt;= 5]">
  79:             <p>
  80:               <a href="{link}">
  81:                   <xsl:value-of select="substring-after(title,': ')" />
  82:               </a>
  83:               <br/><span><xsl:value-of select="cs:UXDate(pubDate)" /></span>
  84:             </p>
  85:         </xsl:for-each>
  86:         </div>
  87:     </xsl:template>
  88: </xsl:stylesheet>

An "expert" may cringe at what I've done in there, but I really don't care.  I mostly care about the end result.

In case you're wondering, the XSLT transforms this sort of thing:

<?xml version="1.0" encoding="UTF-8"?> <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:georss="http://www.georss.org/georss"> <channel> <title>Twitter / refreshcache</title> <link>http://twitter.com/refreshcache</link> <atom:link type="application/rss+xml" href="http://twitter.com/statuses/user_timeline/47123579.rss" rel="self"/> <description>Twitter updates from Refresh Cache / refreshcache.</description> <language>en-us</language> <ttl>40</ttl> <item> <title>refreshcache: #ArenaChMS comm devs - planning is underway for RefreshCache 2010! Submit your topics and discussion ideas now http://digs.by/1KpL</title> <description>refreshcache: #ArenaChMS comm devs - planning is underway for RefreshCache 2010! Submit your topics and discussion ideas now http://digs.by/1KpL</description> <pubDate>Wed, 03 Feb 2010 19:57:37 +0000</pubDate> <guid>http://twitter.com/refreshcache/statuses/8600862288</guid> <link>http://twitter.com/refreshcache/statuses/8600862288</link> </item>
.
.
.

...into this.  Here's a close up of the final product.

@RefreshCache tweets as seen on www.refreshcache.com (powered by Arena ChMS)

 


RefreshCache 09: Summary

Sunday, October 11, 2009 11:47 AM by nairdo

RefreshCache 09

Wow, what a week**.  Based on the feedback we heard or saw (Josh, tweets), some blog posts we read (Joel, Brian), as well as Jason and my own observations, we can now say RefreshCache was a total success!

While each person had their favorite part, I think we're all in agreement when I say we came together because of our passion for using software technology to grow the Kingdom of God.  Each of us wants to make a difference for the kingdom and we want to use our skills to create software.  Ultimately RefreshCache was a seed; a realization that we are not limited by the speed of a vendor (as is the case with most other ChMS systems) and a kick start to working together as a community throughout the whole year.

For me, it was an honor to be able to rub shoulders with the guys that attended.  Here were some of my highlights and favorite moments:Life After Features

  • Getting to hang out with Daniel Hazelbaker from HDC and chat about check-in, subversion, CodePlex, branching, etc.  You should see the Arena WS API he created!
  • Having time to work in Visual Studio with Austin Spooner from NCBC.  Austin is Mr. Answer Man when it comes to Arena modules.
  • Having time to talk about open source and Typo3 with Brian Slezak from COR.  We're lucky to have someone with Brian's experience on our team. 
  • Getting owned by David Turner in a few rounds of Halo ODST and learning about the Voracity Solutions package installer.  This guy is skilled with Visual Studio and the Rocket Launcher.
  • Getting to see the work of Tom Powers, Josh Martin, and Maxim Strelsov from Southeast Christian.  These guys are pretty new to Arena but they're already creating great stuff.  I can't wait to see what they tackle next.
  • Talking with Joel Lingenfelter from HDC about coffee and all things ChMS.  He has to be the most gifted CFO I've ever met!
  • Chatting with Michael Speers and Eric Byrd from Shadow Mountain.  Thanks to their questions, they spurred on a mini "check out the features right under your nose" session.
  • Getting to hear from Central's own Jason Offutt on JSON, SOA, and jQuery.  Jason's an engineer and an artist!
  • Listening to CCV's Jeff Schinella on Semantic Web, CSS and XSLT.  We all need to put his lesson into action.
  • Hearing Jon's closing presentation on "Life After Features" some of which is touched on in his blog. and David's blog on eRA.  Jon is a visionary and always seems to be 2 steps ahead of everyone.

For you Arena community developers who missed this year's event, you need to join us on IRC channel #ArenaChMS if you want to plug into this group of guys. Like I said at R.C., we are all going to see the rediscovery of Internet Relay Chat once the Google Wave hits -- albeit in a newer, easier to use form.

To correct the record, I'd say that Mark Miller was the actual inspiration for RefreshCache.  Mark is a creative cinematographer/director genius and due to unforeseen events he had to bow out from the planning of RefreshCache early this summer. Hopefully we'll have someone of his caliber to kick next year's RefreshCache into the event-execution stratosphere.  Also thanks to Mark we have the only clear picture at RefreshCache (showing a handful of people).

Lastly, I just want to publically thank Kim Musgrave, Liz (my wife) and especially Jason Offutt who picked up the tasks when we lost Mark Miller, because without him RefreshCache 09 would not have happened.

** For anyone that though I was kidding, I crashed at 7pm on Thursday night and slept for 13 hours.


SSRS, SQL 2005 and Parameterized TOP

Wednesday, September 30, 2009 10:47 PM by nairdo

I was writing a query for Reporting Services (SSRS) and I really wanted to use a parameter to allow the user to choose how many of the "top" results should be retrieved/shown.  With SQL Server 2005, the TOP expression is now parameterized however attempting to use it in an SSRS dataset like this:

SELECT TOP ( @topN ) p.person_id, p.first_name,p.last_name
FROM core_person p WITH(NOLOCK)
ORDER BY p.last_name

only gave me this error:

SSRS Error

Rats!  It should have worked.  My @topN parameter is properly defined as a Report Parameter of type Integer with a default value of 20.  

Looking around I found a lot of complicated ways around the issue some of them involving creating dynamic statements and such like this one (link).  Way too complicated for me and I hate dynamic SQL -- I just say NO.

It turns out with a little creative oob thinking you can just trick SSRS by declaring another variable in your dataset and then setting it to the value of your Report Parameter like this:

DECLARE @NewTop int
SET @NewTop = @topN

SELECT TOP ( @NewTop ) p.person_id, p.first_name, p.last_name
FROM core_person p WITH(NOLOCK)
ORDER BY p.last_name

Problem solved.


RefreshCache 2009

Tuesday, September 29, 2009 12:24 PM by nairdo

RefreshCache 09Well it's less than a week away -- our first 100% community organized, managed and executed developer gathering for Arena called RefreshCache.  I originally envisioned this get together as a very small group of guys (6-8) but we decided to open it up to other Arena community developers.  Invitations were sent out about a month ago and we are now double what I was originally expecting.

Arena is unique, and although I've always known it, something changed this past spring when we collaborated with Joel and Daniel of High Desert Church to create a check-in system that works for both of our churches exactly the way we both needed it to work.  Something happened when we broke away and moved our code to CodePlex.  I think I realized that we are limited only by our fear and actions, and not by any one vendor.

This small group of developers who are gathering together next Monday and Tuesday in a desert town of Arizona are a unique group of developers who share the same goal: to collaborate and combine our development efforts in order to increase the fruit of our labor (my first public blog post).  This has been a great journey so far, but the best days are still to come.


Online Arena ChMS Demo

Thursday, September 10, 2009 10:55 AM by nairdo

Arena glassIn case you did not hear via twitter (@ourarena or #ArenaChMS) or the Arena blog, Chris Rivers will be giving a 10,000 foot demonstration of Arena ChMS.  If you have never seen Arena in action and are considering a switch from your current Church Management System (ChMS) I would definitely encourage you to sign up for the Sept 16th demo next week.

The demo won't even scratch the surface of all the features and possibilities Arena has, but it's definitely a good starting point.


The Voracity Solutions 'Installer'

Tuesday, July 21, 2009 10:50 AM by nairdo

Voracity Solutions Control PanelIf you haven't checked out Voracity Solutions you should do it now.  You already know the guys at Voracity Solutions as Jon Edmiston and David Turner the original creators of what has become Arena ChMS.  Among various long term plans and projects, they've started cooking up custom modules and solutions for Arena.

A few weeks ago I got an early glimpse of an Arena module installer/control panel they worked on, but now they have a public demo in their latest blog post. (I'd recommend subscribing to their blog to get the latest tidbits and news.)  Although such a mechanism was discussed some time ago, Jon and David finally had a serious need to make it happen.

It's called the Voracity Installer and it has the potential to make installing your custom Arena modules a snap (literally a one click operation). I say potentially because they’re wondering if other Arena community developers are interested in using it – so if you are interested, let them know by dropping your comment/reply on that post.  If they publish their package file specification we'll almost certainly adopt it for use in all our module packages.


Roundtable: Reason for Not Attending

Saturday, May 30, 2009 1:59 PM by nairdo

I've been asked by a few people why we decided not to attend this year's roundtable.  We've been very disappointed with the 2008.3 release (the problems that it created, the lack of a documented test plan and release certification checklist/sign-off, missing feature documentation and general lack of product responsibility) and decided to make a statement that Arena needed to focus its attention on their core business first.

We made this decision several months ago shortly after the 2008.3 release prior to knowing about the two things that will be announced at the roundtable.  I'll be commenting on these two things immediately as the news breaks on Monday morning.


The Break Up: the Branching of CCV and Arena

Friday, May 29, 2009 6:27 PM by nairdo

Now that it's been announced to the Arena community developers I can discuss the news: CCV has decided to branch away from the Arena core code base.

It's difficult for me to talk too much about this situation, since I'm pretty close with Jon and David, and I've got friends over at the Arena HQ in Tennessee.  I've also been involved in the Community Developer Board for the past two years, so I've been able to listen in on many of the discussions between CCV and Arena.  I think it's probably safe for everyone to assume that there is at least some blame (not even sure blame is the right word) on both sides.  Also, based on some things I've heard, both sides believe they will be unshackled a bit by the breakup.  Undoubtedly not having to worry about each others changes will eliminate some additional work they've both been having to deal with, but I personally believe this will probably come at a cost.

Regardless of the reasons that brought CCV and Arena to this point, what will this mean to Arena?

Originally this was going to be the end of the post and I was going to initially refrain from giving my opinion. But after several days of reflection I've decided to be the first to chime in...


I think without proper guidance and strong, decisive leadership there is a danger that Arena could become what many other older ChMS products became: dull, convoluted, complicated, and bloated.  But I think there is definitely hope...

Yes, CCV originally created what we now call Arena ChMS.  They are the masterminds and designers behind most of what it is today.  We all have David and Jon to thank for this.  And the guys at Arena definitely made it a product and added various regular features and many administrative features.  As much as I'd like to think that CCV has been directing the future of Arena/Arena-features, you could make a case that this really has not happened as much over the past 2 years.  I do believe the relationship they shared allowed CCV to influence the overall product to a degree and a continued commitment to that relationship could still have a similar effect.  Even so, CCV's branching will eventually mean that their modules** will not be compatible with any of our Arena installations.

I believe the key to Arena's future is what the community does.  It's the community that makes Arena unique.

When I read Joel's recent post I was reminded of this fact.  Thanks Joel!  What other ChMS system allows you to pick between three different check-in solutions?  As more developer churches come aboard and create more solutions/modules, we all win.  However, now more than ever - the community's role must increase.  And it's not necessarily easy or free.  It will mean more focused, thoughtful discussions.  More energy spent on packaging and documenting your modules for others.  More communicating and coordinating with others.  More of everything.

Trust me -- it takes time and energy.  If you do not put in the time, it will not just happen automatically.

Will the community rise to the challenge?  I believe it will.

[The other great news is that Arena has finally established a single person to be the Product Manager -- and it is Mark White.  I'll cover this in another post.]

** Jon and David tell me they will actually still do some development on the standard Arena product too -- if not during their work week, on their own free time.  And so they will still be part of the community.  So, be on the lookout for some of this great stuff because I recently got a glimpse of some of it.


Wow - "The Most Important Feature"

Friday, May 22, 2009 4:30 PM by nairdo

I was pretty excited about the upcoming AZGroups event with Scott Guthrie next week, but when I started reading about VS 2010 beta 1 released yesterday and some of the .NET 4.0 features I had a flashback about something I said in 2006, but first check out this quote by Kathleen Dollard** in her recent blog entry:

".NET 4.0 is likely to offer patterns that will be the most important change in my coding since the huge changes brought on by LINQ (and supporting techniques like extensions and lambdas) of .NET 3.5. That was the most important change to my coding since generics in .NET 2.0. That was the most important change to my coding style since strongly typed full OO programming came on in .NET 1.0. That was the most important change to my coding style since the visual coding style of Visual Basic (pre .NET). That was the most important change to my coding style since Clipper and FoxPro. Get the trend? Eight years, eight years, three years, two years, 18 months... I do a talk for INETA called "Rethinking Object Orientation" that tries to get a grip on these changes... .NET 4.0 is going to bring a lot and inspire a lot of rethinking.

...

The most important feature of .NET 4.0 is Windows Workflow 4.0."

I think she's exactly right.  When I first started looking at WF at the end of 2006, I said the following in a blog post:

 "...I believe WF has the potential to further revolutionize software development by allowing designers to extract hard-coded business logic from their applications..."

Unfortunately WF was really difficult to use, but if they've solved that problem with this complete re-write, I think it's going to be another thing that we'd be unwise to ignore (similar to what I said about LINQ) as it will become a part of every developer's world.

I hope Scott Guthrie spends some time talking about WF next week.

-Nick 

** I first saw Kathleen at DevConnections in Vegas a year or so ago and she stood out to me as a very level headed and practical developer/architect and I have a lot of respect for her assessments.


UX Transitions: the R-evolution

Monday, April 27, 2009 6:16 PM by nairdo

MIX09I know this is a month old, but I'm just getting caught up on some reading/viewing...  If you also haven't seen the day 1 keynote of MIX 09 and care about where your craft is going, you need to watch at least the first 8 minutes of the video and then if you're short on time jump to the 97 minute mark and watch the demo of Expression Blend 3.

Having watched that video and having recently worked on our new web site, it's becoming more clear to me how important user experience really is.

Here's a small example of what I mean...

Previously, I might not think twice about a login popup that went something like this:

user experience 1

Now, it seems to me like everything ought to behave more like this:

user experience 2

On one hand it may seem subtle, but on the other hand it definitely changes the user experience.  I actually enjoy logging in to the site (ok, yes, I'm quite weird ;).

I'm guessing we'll get to see some other related cool demos when Scott Guthrie presents next month at the local AZGroups event.  I'll see you there!


New Cccev Website - Powered by Arena

Friday, April 17, 2009 4:22 PM by nairdo

This week we finished development and implementation of our latest, jQuery flavored, Arena powered cccev.com website -- and I'm pretty excited about how it turned out.  Everyone did a tremendous job: Jeremy Wagner and Mark Miller on design; Jason Offutt, Dallon and myself on development and implementation; the company PSD2HTML for slicing, and many other Cccev staff for content and testing.

It went down like this...

Jason, Dallon and I first sat down with Mark and his PSD mockups.  It was agreed in advance that our team would provide about 30 days of development time.  We broke everything down into the individual modules we needed to create or customize, and then entered each feature into OnTime (as sprint 1) along with an estimated number of hours to complete it.  Mark had to make decisions whether to keep or toss an idea, because once OnTime said we had reached a total of 30 days worth of estimated work, our meeting was over and sprint 1 was locked in.

Next Mark took the PSDs and worked with PSD2HTML to slice everything into working HTML mockups.  As Mark received output from PSD2HTML we got to work on making them actual functioning Arena modules (more on this approach at the conclusion).

What follows is a quick dissection of sprint 1 for the site.

We created six page templates.  One for the home page, three for department/subpages (1 col, 2 col, 3 col), one for our newsletter main page called "the Drop", and one for the video/podcast stuff called Central TV.

Home page:

  • The promotion/feature roller you see on the home page is a custom Arena module Dallon created which uses LINQ-to-Objects to get the promotions and jQuery and the jquery.galleryScroll.1.4.5.pack.js for the slide navigation.
  • The main drop down navigation is a custom module Jason created which also uses LINQ-to-Objects and jQuery for the slide effects. (applied to the appropriate content area of all new templates)
  • The login-link-user-login popup is a combination of a custom Login Logout control I wrote which controls the display of a custom UserLogin.ascx module (which inherits the standard Arena ArenaWeb.UserControls.Security.UserLogin control). (applied to the appropriate content area of all new templates)

Sub pages: 

  • Side bar calendar with mini event details was created by Jason.  It starts from a parent event id (module setting) and traverses the tree to obtain all child events that are flagged with the given topic areas (module setting).  jQuery is used to slide the event details when there are multiple events.
  • The calendar Invite Friend popup was written by Jason and is smooth-shown via a jQuery wired to the click event of the 'send invite' link on the side bar calendar.
  • The subpage navigation was created by Dallon in about 100 lines of code and markup which uses LINQ-to-Objects (see snippet below) to obtain the pages and jQuery for the sub-sub page slide animation:
    var pages = (from p in rootPage.ChildPages.OfType<PortalPage>()
                 where (p.PortalPageID != -1 && p.DisplayInNav && p.Permissions.Allowed(Arena.Security.OperationType.View, CurrentUser))
                 select p).Distinct().OrderBy(p => p.PageOrder);
  • The serving opportunities viewer, created by Dallon, also uses LINQ-to-Objects and jQuery (see a pattern? I told you LINQ was not something to ignore;) and displays all public viewable serving tags which are a child of a given parent serving tag (module setting).
  • (Not shown) a custom Background changer module applied to the department pages which uses jQuery to dynamically add css classes to particular elements to effectively change the background image according to the configured background (lookup; module setting).
  • (not shown) a custom Flickr module Jason wrote which uses Athena (which uses LinqExtender).  It takes a Flickr ID (module setting) and creates a small grid of photo thumbnails which smoothly slides on prev/next navigation.

The Central TV pages use three custom modules created by Jason: channel viewer, series/topic viewer, and video player.

The Drop page uses a custom NewsletterSubscriber.ascx (it inherits the standard ArenaWeb.UserControls.Core.NewsletterSubscribe class) to achieve the exact layout needed to match Mark and Jeremy's design.

Lastly, for those who care, we relied on the underlying Arena object framework -- we did not create any custom objects.

We actually finished on time, and the burndown chart in OnTime really helped everyone stay focused.  In conclusion, one valuable lesson I learned was the added complexity of setting up our development pipeline overlapping with PSD2HTML.  The dependency between their work (javascript, css, and HTML slices) and our modules made our work messy, inefficient and disheartening at times as we would have to chase down layout bugs after merging their latest output with ours.  Next time we'll just wait until they're complete before starting our work.


Our Virtual Check-in System

Sunday, February 08, 2009 3:34 PM by nairdo

For the past few weeks, I was beginning to think our new Arena check-in module was only going to be a virtual system -- not a real, working application.  You see, we had to postpone the full rollout a few weeks ago when our first full scale pilot had a printing meltdown.  After about 20-40 people had successfully checked in, all remaining check-in labels (Zebra LP2824) would fail to print.

Zebra LP2824: my baneIn hindsight, the source of the problem now seems virtually clear... (hint hint)

Jason and I could see where the problem was, but we couldn't explain it.  In code, we check the PrintDocument's IsValid property, and while normally this should return true, after some unknown point it would always return false.   We also discovered just prior to this, our exception log had a System.AccessViolationException with the message 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'

The only way to clear the system from this state was to perform an "iisreset".   The problem seemed to linger in the IIS application pool.  We reckoned that the memory Derek added to the VM host a few days earlier might be the issue so we removed it and tried again.  Same problem.

We did more digging and testing and were able to see this in the stack trace:

at System.Drawing.Internal.IntUnsafeNativeMethods.IntCreateDC(String lpszDriverName, String lpszDeviceName, String lpszOutput, HandleRef lpInitData) 
at System.Drawing.Internal.IntUnsafeNativeMethods.CreateDC(String lpszDriverName, String lpszDeviceName, String lpszOutput, HandleRef lpInitData) 
at System.Drawing.Internal.DeviceContext.CreateDC(String driverName, String deviceName, String fileName, HandleRef devMode) 
at System.Drawing.Printing.PrinterSettings.CreateDeviceContext(IntPtr hdevmode) 
at System.Drawing.Printing.StandardPrintController.OnStartPrint(PrintDocument document, PrintEventArgs e) 
at System.Windows.Forms.PrintControllerWithStatusDialog.OnStartPrint(PrintDocument document, PrintEventArgs e) 
at System.Drawing.Printing.PrintController.Print(PrintDocument document) 
at System.Drawing.Printing.PrintDocument.Print() 
at Arena.Custom.Cccev.CheckIn.CheckinLabel.PrintAllLabels(String printerURL) in C:\Arena Trunk\trunk\Arena.Custom.Cccev\Arena.Custom.Cccev.CheckIn\Entity\CheckinLabel.cs:line 341 
at Arena.Custom.Cccev.CheckIn.Entity.CccevPrintLabel.Arena.Custom.Cccev.CheckIn.Entity.IPrintLabel.Print(FamilyMember attendee, IEnumerable`1 occurrences, OccurrenceAttendance attendance) in C:\Arena Trunk\trunk\Arena.Custom.Cccev\Arena.Custom.Cccev.CheckIn\Entity\CccevPrintLabel.cs:line 61 
at Arena.Custom.Cccev.CheckIn.Controller.PrintLabel(FamilyMember attendee, IEnumerable`1 occurrences, OccurrenceAttendance attendance) in C:\Arena Trunk\trunk\Arena.Custom.Cccev\Arena.Custom.Cccev.CheckIn\CheckInBLL.cs:line 500

Hmmm... IntUnsafeNativeMethods...This seemed to point us in the direction of a driver problem.  We removed the latest Seagull Scientific drivers (7.1.6) and put their older drivers (7.0.2) which we've been using in another environment with no issues.  The problem happened again, but the exception was slightly different:

at System.Drawing.SafeNativeMethods.DocumentProperties(HandleRef hwnd, HandleRef hPrinter, String pDeviceName, IntPtr pDevModeOutput, IntPtr pDevModeInput, Int32 fMode) 
at System.Drawing.Printing.PageSettings.CopyToHdevmode(IntPtr hdevmode) 
at System.Drawing.Printing.PrinterSettings.GetHdevmode(PageSettings pageSettings) 
at System.Drawing.Printing.PrintController.OnStartPrint(PrintDocument document, PrintEventArgs e) 
at System.Windows.Forms.PrintControllerWithStatusDialog.OnStartPrint(PrintDocument document, PrintEventArgs e) 
at System.Drawing.Printing.PrintController.Print(PrintDocument document) 
at System.Drawing.Printing.PrintDocument.Print() 
at Arena.Custom.Cccev.CheckIn.CheckinLabel.PrintAllLabels(String printerURL) in C:\Arena Trunk\trunk\Arena.Custom.Cccev\Arena.Custom.Cccev.CheckIn\Entity\CheckinLabel.cs:line 341 
at Arena.Custom.Cccev.CheckIn.Entity.CccevPrintLabel.Arena.Custom.Cccev.CheckIn.Entity.IPrintLabel.Print(FamilyMember attendee, IEnumerable`1 occurrences, OccurrenceAttendance attendance) in C:\Arena Trunk\trunk\Arena.Custom.Cccev\Arena.Custom.Cccev.CheckIn\Entity\CccevPrintLabel.cs:line 61 
at Arena.Custom.Cccev.CheckIn.Controller.PrintLabel(FamilyMember attendee, IEnumerable`1 occurrences, OccurrenceAttendance attendance) in C:\Arena Trunk\trunk\Arena.Custom.Cccev\Arena.Custom.Cccev.CheckIn\CheckInBLL.cs:line 500

Could the problem be with the Hyper-V which is running our virtualized server?  Phil recommended that we copy our environment to a non-virtualized host, and after several more hours of setup and testing -- presto -- problem gone.  We ran our Gilbert campus children's check-in all weekend long on this temporary, alternate system without a hitch.  Jason and I finally took a sigh of relief.

Our (Derek's) next step is to definitively isolate the problem by moving our server to Microsoft's Virtual Server to see if the problem is exclusively with Hyper-V, and if needed, possibly de-virtualize the system entirely back to reality.

I wonder if we're the only shop trying to serve Zebra printers with Seagull Scientific drivers on a Win2003 virtual environment.  Anyone?  (If you're out there, we feel your pain.)


More Posts Next page »

Powered by Community Server, by Telligent Systems