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.)


Software Development On Time

Tuesday, January 13, 2009 5:49 PM by nairdo

I'm coming out of my cave to share a few great bits of news.

OnTime 2009 Express1) Since my last post, Jason Offutt has joined our team! Jason comes from Christ's Church of the Valley (CCV) where he was previously developing Arena modules.  With his hiring, Jason also becomes Central's first full time developer (I'm still a self-inflicted part-timer).

2) Without Jason's help we would still by at 70% development completion of our new Arena check-in module.  However due to his monumental efforts we actually had our first complete test milestone at the end of December and are piloting the new Children's check-in this weekend.  We've been in touch with a few other churches (I'll let them comment if they want) and will be sharing the code via the community SVN shortly after the rollout.

3) OnTime 2009 Express edition only costs $5 for a team of up to 5 developers!  Read the full press details.  With the edition of Jason and Dallon's ever increasing development contributions, we're really in need of a bit of a process and tool overhaul to help manage our software projects.  We'll be using OnTime 2009 for sure.  If you've ever seen Axosoft's founder, Hamid Shojee, talk you know what I mean when I say he's brilliant -- check out his entertaining 'SCRUM in under 10 Minutes' video.  He can even make a presentation in software development methodology fun.


Here We Go Again

Friday, September 19, 2008 10:03 AM by nairdo

(Note: With this post I'm going to tag any similar, future rants as "angry coder".  Although they will be few, I'm doing this just in case you want to take a pass on any of these kinds of entries.)

BSOI love Google, but with their recent announcement I thought I was going to cry.  Does the world really need another browser?  Aren't the existing set of mediocre ones enough?  Opera, Safari, IE, Firefox, Konqueror, AOL TBD, Flock, etc., and now Chrome.

Let me pick on Google for a minute.  I'd really like to see them work on support for HTML/CSS in their premiere email client, Gmail.  It's arguably among the worst when it comes to CSS support.  Perhaps their entry into the browser market will help them with this problem...

I was a staunch Netscape supporter back in the day but, as a web developer, it was never fun being the middleman in the browser display/layout war.  When you're just trying to write programs to solve the latest business problem (and do it in a cross-platform, client-lite way), you really don't have the desire or patience to worry about some other vendor's browser.  It's inefficient at best and it's certainly not your job.  Or is it?  Perhaps when we decided to write a web application we also signed on to support any and every web browser that one of our users wants to use?  Perhaps there is no place to draw the line.  There is no hope.

Enter the 3rd party control developers!  Yes, that's right -- it's their job.  Pick from Telerik, ComponentArt, Infragistics, Devexpress, etc.  Let them worry about the war.  They will do it better and more completely than you and I can.  You and I can get back to developing solutions for our domain(s) and leave the browser war behind.

Let me summarize with the point that drove me to finally speak up regarding this topic. I think Jon Edmiston's key #7 captures it well.  Beware of bright shiny objects.  Chrome is definitely shiny.  Seriously.  Will installing it or twittering it (don't get me started on this ;) help us be successful?  Will having it help with the business problems we're getting ready to solve?

LOL - can you do this?[update: only moments after posting this, I happened to visit a link that Scott Miller had sent earlier today.  I had to laugh out loud because I don't think I've ever actually had this happen to me.  Perhaps this (see image) is another way to deal with it.  Hey, where is Chrome in that list?]


Arena Enables the Paperless Office

Monday, June 16, 2008 5:47 PM by nairdo

I dig the latest version of Arena ChMS and the new Document Types feature is great.  In a nutshell it allows you to attach documents (pdf, images, .doc, etc.) to a person, tag or group.  It's the feature that enables you to move to a paperless office and it's super easy to setup.

Last click to watch demoweek a super admin, Kim came to me and said something like, 'I want to throw out this huge book of completed paper forms before I drop it on my foot and break my toe.'  I said "let's do it."  We quickly setup a new Document Type and a Person Attribute to hold the document. Now she just scans the document, attaches it to the person's record and then shreds the original.

In Kim's case she was maintaining the paper copies of our driving insurance form -- some paperwork that our insurance company gives us when someone has permission to drive the church vans.  The document is slightly sensitive so we also locked it down so that only few people have access to edit or view it.

We've lined up several more documents we'll be moving to Arena including our:

  • 4 page application to serve (currently a fillable PDF)click to watch
  • applicant background check (pdf)
  • applicant's reference response documents (typically emailed .doc or paper)
  • and several other paper forms people are physically signing

With Arena you can literally set these up in just a few minutes.  Watch this video to see how it is done.


More Posts Next page »

Powered by Community Server, by Telligent Systems