Blackboard's Open Database

With BbWorld '10 and DevCon being in full swing,  it looks like Blackboard's Open Database promise is starting to materialize.  The experience of learning about this is not exactly from "front row seats" being just over 2,000 km away but tweets by following #BbWorld and #BbDC10 do fill in those of us who could not make it to BbWorld '10 this year.  Special thanks go out to those who are tweeting and blogging like John Fontaine's DevCon keynote thoughts at

Documentation and other information is now posted at .  This site (as of right now) provides better insight to what Blackboard's OpenDB is but it doesn't look like it's complete.  At this point, it amounts to documenting the Blackboard database.  I don't see anything yet about extending the database with user defined tables but depending on who you ask, it was discussed.  I hope documentation is forthcoming for this as well. 

For those who don't really know what an "open database" means, it probably won't really matter much if you've followed your license agreement to the letter.  As I have done in troubleshooting and most advanced system administrators will have already done for one reason or another, I'm sure many have already combed those Blackboard tables prior to the Bb Open Database announcement anyway.  If you haven't had a reason to look at the database before, you probably don't need to look for any particular reason.  The Open Database announcement and subsequent follow through amounts to an admission by Blackboard that you can now look at the tables if you like and they even document several of the database tables for you.   It's a little unclear from my point of view at this time but depending on who you talk to, it has been mentioned that you can even have your own tables when developing building blocks.  Again, this doesn't matter much to the normal system administrator but makes things easier for building block developers.  This was all previously "officially" unheard of but now it's a reality.  Let me tell you why I think this matters.

1.  There really is a wealth of information there if you know how to find it. 

Back in 2003, I started to do some database look ups to get the number of active courses and active instructors for each of our schools at Seneca College.  This gave us some insight in how Blackboard was being used.  It allowed us to see usage trends and gave key stakeholders something concrete to show that Blackboard was growing into an important part of the learning process here.

In 2007, Eric Kunnen from GRCC and I decided that we needed to expand this very simple approach to the way I was doing usage statistics and put in a Blackboard Greenhouse Grant proposal.  We looked at some work being done by Glen Parker from USF and John Fritz from UMBC and decided that we needed a real-time dashboard to display much more fine-grained relevant information consolidated by internal departments.  Because of this, Project ASTRO was born.  Project ASTRO is a building block that essentially mines data from the Blackboard database and displays important analytic usage information by graphically representing page views and content item counts for everything that could be found within those Blackboard database tables.  Because of Blackboard Open DB, we finally have permission to look :)  It's pretty much anti-climactic since we already mine the database but we have been working with Blackboard to ensure we could make this building block available to other institutions.  After all, it was not officially an acceptable practice to use the Blackboard database tables, let alone making a building block generally available that does this and calling it a Blackboard Greenhouse project.  Now it is.

2. As a developer, you can create and maintain your own database tables for building blocks.  

I've seen a few building blocks over the years that looked really interesting but required a separate database to run.  Quite frankly, I passed them over because I don't need any more complexity in our system and I'm sure many who have smaller systems don't have the resources to set this up.  I assume it would also be problematic for ASP hosted clients when servers are not on site.  When we developed Project ASTRO, ease-of-use and almost zero complexity was one of our user requirements.   To that end, a lot of work went into a simple installation process that did not need any extra hardware or special access other than being a system administrator and installing the building block.  Internally, Project ASTRO contains scripts that generates it's own database scheme so that it can store it's own data.  These tables are joined to other Blackboard tables to be able to display accurate analytic information without having to generate massive amounts of duplicate data.   While we were a little early on this front and used some internal private Blackboard API's to generate and maintain a Project ASTRO specific database, Blackboard's Open Database will soon (if not already) document how to generate a database with the addition of an extra file or two within a building block archive.  I imagine that specific Open Database API's will also allow a developer  to maintain that database with ease.   This really opens up deep integration.

3. Building blocks that supplement the Blackboard Learn architecture can become much more sophisticated.

It may not seem like much but it instantly makes the building block possibilities in the Learn architecture much more powerful.  Additional tools can be far more robust and not relegated to third-party vendors who have the time and expertise to bring such tools to market.  The Blackboard institutional building block community is growing with an expanding list of projects at the site and I can only see building blocks get more sophisticated from this group.  I once did an integration with a third-party open source system mainly utilizing public Blackboard APIs but I stored the database that was required within Blackboard.  The project didn't go anywhere but it was a proof-of-concept in trying to make it easier to distribute such a system add-on and making it easy to install.  With the proper APIs, the level of expertise to do such a thing would be reduced and that means that building blocks will get better.

While it's still early an details about Blackboard's Open Database initiative continue to surface at BbWorld '10 and beyond, it is definitely a positive step towards a richer and more open architecture.  I think in the long run, giving a little will get you a lot and I'm glad Blackboard is opening up the database.  Since it is now a supported and acceptable practice to explore and use the database, what would it take to make it a supported and acceptable practice to use any Blackboard API that you like? :-)  That would be nice but that may be a little ways off.

Sun/Blackboard Reference Architecture Web Cast

For those of you who may have missed it, Sun and Blackboard did a web cast entitled "Driving IT Efficiency With Blackboard On The Sun Reference Architecture" on October 4, 2007.  I was invited to join in to be part of the web cast because our Blackboard on Sun system architecture was featured as part of the web cast but I was not able to attend so I had to wait until the archived web cast was available.  Kevin Roebuck from Sun Microsystems just posted a link to the web cast on his blog so I finally got to watch it. 

 There is some really good information in it on scaling and performance models as discussed by Steve Feldman, Director of Performance Engineering and Architecture at Blackboard.   Having spoken to him on many occasions, he certainly simplified his portion of the web cast because he is a wealth of information.  While I have not yet personally met Kevin Roebuck or James Simon from Sun Microsystems, Kevin did a great job at facilitating and adding his insights and James is well versed on Sun technology and his insights were valuable.  It's a great web cast even if you don't currently have a Blackboard on Sun deployment.

Have a look at the web cast here.

As a footnote to this web cast and our environment as displayed in it, I don't want to sound like an advertisement but the Sun Fire T2000 app servers that we have are powerhouse servers.  Steve discusses the almost linear scalability of technologies built into later versions of Blackboard Learning System like Tomcat Clustering (recent blog post here) which is remarkable and I can attest to that in the real world. The Sun Fire T1000/T2000 has the raw power and scalable hardware architecture to utilize these technologies to their fullest. 

At Seneca, our Blackboard implementation is mission critical.  It is used as our enterprise portal where all subsystems are accessible through Community System and downtime is not an option.  We have gone as far as mocking up a partially functional portal with login and role based content while Blackboard upgrades occur.  As stated in the web cast, LMS systems like this are becoming more mission critical and our institution has deemed the Blackboard environment to be as critical as our Student Information /Human Resources/Financial system (the only two in this category).   That being the case, our Blackboard environment gets heavily used and we need the software and hardware to make sure that it's responsive, scalable and robust.  The environment we put together certainly handles the volume of traffic.  We also continue work towards implementing a full disaster-recovery solution.

Two additional projects which are still in the works at Seneca are also briefly discussed in the web cast.  We want to use Sun's Identity Management solution for our own internal services on various internal servers that are accessed (via single sign-on) through our enterprise portal.  We are also looking into virtualization through the use of Sun logical domains in Solaris 10 on the Niagara architecture.    When we test and implement, I'll be sure to post more details.




Blackboard Performance Tip: Tomcat clustering

In August, 2007,  Seneca implemented Tomcat clustering in our Blackboard Academic Suite production environment.  Enabling this technology has been referred to as a "free performance boost" so I'll try to explain what this does in simple terms and how it works in our environment.  Unfortunately, other than set up information in the Blackboard Academic Suite Server Administration Manual for 7.2 and 7.3 (the supported versions) along with some preliminary information on getting you started, there is no guide to how it works or better yet, best practices on how best to set it up for your hardware.  Some tinkering is involved and I'm in the process of doing that slowly to see how our servers can handle it with our server usage.  I would normally wait until I have figured out our best configuration and then share it with the community but since there was some recent talk on the BBADMIN-L list, I thought I'd provide an explanation of why it's a good thing for those who may wonder what Tomcat Clustering in Blackboard is.

In our environment, we have three load-balanced Sun Fire T2000 servers with 8 cores, 32GB of memory.  We have had these for a while and I have tried to maximize performance on these but there is only so much you can do before you have exhausted all possibilities with a single Java virtual machine (JVM).  The JVM becomes the bottle neck with hardware that is this powerful and as Blackboard moves to a complete Java environment (rewriting Perl subsystems into Java), the JVM is taxed more and more and the single JVM that runs in Tomcat gets maxed out.

For those who may not know the internals, a simple way of thinking about how the Blackboard application works is as follows:

   1. User requests come into the Apache server running on port 80 or 443 if you have SSL enabled.
   2. Depending upon the request, it goes to one of two "processing plants"
   3. Requests that require Java services get forwarded to Tomcat to execute Java requests
   4. Requests that require Perl services get forwarded to a special version of Apache with the ModPerl extension on it to serve Perl requests.
   5. Both Tomcat and ModPerl Apache have connection pools that connect to the database and perform those requests
   6. The results then get delivered to the client and the process ends until another request is made

With later versions of Blackboard Academic Suite, more and more requests are based on Java and less and less are based on Perl so Tomcat gets a better "workout" as new versions of Blackboard come out.  Tomcat clustering now provides for multiple Tomcat instances (one JVM per instance) to handle more requests simultaneously which effectively lightens the load on the single JVM.

When only one Tomcat instance was available, I spent time tuning my JVM and playing with memory available to it.  The issue is, as you give the JVM more memory, it takes longer to do garbage collection.  Simply put, garbage collection is Java's internal clean-up task to determine what memory is no longer required and to clean it up (it's taking out the trash).  This is a quite an intense process which introduces slowness if your garbage collection times are too big.  Give Java too little memory and you can only serve so many simultaneous client requests before you run out of memory; give it too much and your server is burdened with garbage collection which is not too good either.  You have to find a delicate balance between the two but most application developers will tell you that less Java Heapspace (memory) is better.  What do you do with a server that has 32GB of memory and a boat load of CPU processing that is totally underused? The answer is to give it some extra work.

Enter Tomcat Clustering...

As stated above, Tomcat clustering allows for multiple JVMs but you may be a bit confused on how it works and a little skeptical on if it will work or what happens when one Tomcat server crashes or is slow.  I'll try to explain what I've seen so far.  As noted in the numbered description above, Blackboard still works the same way except number 3 can be expanded, since there are now more than one instance of Tomcat (one JVM per Tomcat) which is how you get multiple JVMs.   Seems kind of simple but there's some overhead you have to think about.  It's actually quite sophisticated in terms of how it works and it's pretty cool for the "techy type".  

Think of a single application server.  Don't get confused with a load-balanced system with multiple app servers.  Consider, for the sake of simplicity, that each app server runs by itself and is set up independently.   We need to figure out how many instances of Tomcat your server can handle at once.  This is determined by how many CPUs and memory your server has along with how Tomcat is configured.  This is what you have to figure out first.  How do I split up my server resources among each Tomcat instance and what is shared among all Tomcat instances?

First off, Blackboard comes with one node already installed when there is no clustering support enabled so if you want a four cluster node, you add three more nodes.  Consider that some of your Tomcat settings in are going to be multiplied by four (in this example). You need to be a little more cautious of some settings and possibly adjust them since things are going to get "bigger" now.

For reference to the settings I'm going to mention, my T2000s each have a 9 node cluster (1 + 8) in production.  You can see that numbers add up quickly so I do want to mention some settings that you need to look at:

bbconfig.max.heapsize.tomcat - This is basically the amount of working memory that Tomcat (the JVM) has to work with.  Too big... lots of garbage collection. To small... you run out of memory.  I am still experimenting with this.  I have my max heapspace set to 3GB (it used to be 6GB with one JVM and the server could handle the garbage collection with some tweaks but not all that well).   With smaller, more efficient garbage collection, I am considering going smaller (2 Gb for sure and maybe even down to 1.5GB).  We run a number of building blocks and Content System so this fact is a consideration because you are throwing more varied Java requests at the servers which take up memory.

bbconfig.max.stacksize.tomcat - This is also multiplied by the number of Tomcats you run. I run 256k because I have run into stack errors before at the default 128k.

bbconfig.max.permsize.tomcat - This, again, quickly adds up if you don't watch for it.  I have also had to increase this (don't remember the default).

bbconfig.jvm.options.extra.tomcat - If you have any special Java tuning switches or parameters in here, these also get transferred to your other Tomcat instances when you create them so be careful of this too.

It was fairly straightforward to set up after following the Blackboard Academic Suite Server Administration Guide for 7.3 so I won't get into how to do it.  I followed the port nuumber sequences that were suggested.  I would suggest you write them down somewhere before you do the set up.  It's easy to transpose numbers when you create the cluster nodes and you may get a node or two that doesn't work because of conflicts (I did this).  

Tip #1:  I followed Jeremy Portzer's Blackboard knowledge base article on "HOWTO Enable Tomcat access logging" at and enabled logging for each instance of Tomcat running (each cluster node) as there are configuration files for each instance.  I later removed them once I knew they ran properly.  These logs don't appear to give you anymore information than the Apache log file except it shows you what is running on each individual node.  You don't really want to be searching each log if you need to do so for troubleshooting purposes  so on to Tip#2...

Tip #2: In Unix, the main Apache log file (~blackboard\logs\http\access_log) has the node id tacked onto each request in the JSESSIONID parameter.  It looks like: - - [05/Oct/2007:07:09:15 -0400] "GET /images/ci/icons/task_li.gif HTTP/1.1" 200 147 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; YPC 3.2.0)" "JSESSIONID=D976D800AF17869BA9D053029B8CE41C.cluster4; session_id=-AT-@168C2336B890B433E41FE416452E4142"

Notice the ".cluster4"?  That is the node that the request ran on.  That's handy for troubleshooting.

Tomcat Clustering works well...

In our environment, we took a server that was severly under utilized and gave it 8 part-time jobs so that it has more to do.  In doing so, it lightened up the load on the original Tomcat instance and I made adjustments so that less memory was used so that Java garbage collection could be quicker.  With 9 nodes, I won't say it's 9 times faster but it certainly can handle much more traffic. It can also handle a better variety of traffic.  I'll try to explain with an example.

We had an issue where Content System was indexing the content within the main Tomcat engine (it ran as part of the application like any other request).  We have since removed the job that runs within the Blackboard application and now cron a job to do this separately so that the app server is not effected but it used to be a very expensive process, taking up processing power and resources from the JVM when it was a single node Tomcat installation (non-clustered).  I observed that this same process, when running within the application, took up one clustered node in the 9 node environment and since it was making heavy use of resource, it appeared that the cluster node was dead.  In fact, my reporting tool showed one process and since it was making heavy use of that JVM, the internal load balancer within the Tomcat cluster environment didn't send any more requests to that node because the other nodes were free or were not as heavily used.  The internal load balancer is smart enought to check what each node is doing and pass on requests when it can handle them.  I was quite impressed and when I looked further into it, I could see that the Content System Lucene indexer process was running on that node and I then realized that I forgot to disable it within the application and move it to it's own croned task.

On another occasion, we had the dreaded "top banner branding images missing" problem on one of the nodes (one node can have the images missing but the others are fine  which is now fixed (see your TSM)), so I was able to shut down a node and restart it with no ill effects.  The load balancer would figure out that the node wasn't up and send requests to the other nodes instead.  When I restarted that node, I could see that it was accepting requests again and it was, again, one of the nodes in use.

How did I determine requests being served by a cluster node?  I use the "lsof" command (available at for Solaris) to check for the number of outgoing connections made from the cluster node.  You will notice that you need the pids to check each one.  The location is in the command line.  I use this count for MRTG graphs for each of my nodes on each of my servers.

For the root node:

    lsof -a -p `cat /usr/local/blackboard/apps/tomcat/temp/` -i tcp@localhost -u bbuser -c java -n | wc -l

For each cluster node ( <node> is your cluster node name )

    lsof -a -p `cat /usr/local/blackboard/apps/tomcat/cluster/<node>/temp/` -i tcp@localhost -u bbuser -c java -n | wc -l

Similarly, I also check the Oracle connections that each cluster node is making.  To do so, replace "tcp@localhost" with "tcp@mybbdatabase-DOT-edu:1521" (replace with your database url and port, if it's different than 1521).  This is how I see what each cluster node is doing so that I can monitor them.


Other than the tips noted above,  two gotchas I've discovered:

1. Restarting cluster nodes:

  • To stop a cluster in Unix, kill it with the appropriate PID located in /usr/local/blackboard/apps/tomcat/cluster/<node>/temp/ ( <node> is your cluster node name ).
  • To start it, use the "" in the appropriate bin directory for the cluster located in /usr/local/blackboard/apps/tomcat/cluster/<node>/bin.

2.  Blackboard takes too long to start up in a cluter environment:
There is an unneeded timeout of two minutes in the start scripts.  This is the code specific to 7.3 so it may differ for 7.2 and I have a ticket in to fix it in later versions so this may not be an issue but for a 9 node environment, Blackboard takes over 20 minutes to start.  The edit is as follows to avoid the 2 minute timeout per cluster node:
There is a two minute timeout in /usr/local/blackboard/system/tooldefs/install/ServiceController/tool-impl.xml.  I commented out line 193 that looked like this:
<touch file="${param.anchorfile}" verbose="false"/>
To this:
<!-- <touch file="${param.anchorfile}" verbose="false"/> -->
It's a long story but you may want to try this on a test server to see if this helps, first.  It will.

Good luck with Tomcat Clustering!

Blackboard Performance Tip: Asynchronous module loading

Before starting this post, I thought I would look through the Blackboard documentation to get a proper description of a new feature in Blackboard Academic Suite 7.2 or higher called "Asynchronous module loading".  I think you have to have Community System for it but I'm not sure.  I'd look it up to be sure but the Blackboard documentation makes no mention of this feature.  It's not in the 7.2/7.3 Release notes or in the Administrator manuals.  No wonder people become completely confused when I rave about the performance implications of this, what appears to be, undocumented feature.

Willem van Valkenburg blogged about it on the E-learn Weblog and I must confess, I read his description in English and didn't translate the page until just now to see where he got that from.  It was not in a document but he asked Blackboard about it.  Kudos for finding a needle in a haystack, Willem :-)  I was told about it in early beta of 7.2 because this was a feature that I put a request in for.  I had done some similar work in one of my modules because it was slow to load and found out it was in development.  I was shown how it worked when we first saw the 7.2 beta and we "blew up" the beta server playing with it so it does need to be used with some caution.  I'll explain later.

To understand the concept, take the "Who's Online" portal module (which is the module I recoded to use the same technique).  If you have a large number of users on your system and you have it installed and active on your portal page, it takes a good while.  Yesterday, we had around 6,000 users online in a three hour period (along with about 10k guest sessions) and the module with this amount of users will take a good 30 seconds or so to load and render the four or five lines it displays.  Depending on the placement of that module, it will hold up the whole page until it completes and can render it's output.  Internet Explorer is dreadful because the whole page is blank until the page is finished but even in Firefox, the page composition pauses at the header of that module and continues when it is finished.

Asynchronous module loading will allow the actual module to be rendered, minus the output but continue on with the page and "pop in" the output of the module when the module has finished it's processing and has rendered it's output.  If, for example, the Who's Online module was the only module you allowed to asynchronously load, you would see the completed portal page with the Who's Online module showing a message saying "Please wait while the module loads..." and when it is complete, that text is replaced with the Who's Online output.  This, of course, can be done with several other modules so you could see many modules with the "Please wait..." message which will dynamically load the output when each of the modules complete processing.  This is done with dynamic HTML and Ajax.  

"Looks kinda fancy but where's the performance improvement", you ask?

Consider several modules that take time to process and render.  If you had 10 modules that took 2 or 3 seconds to load and the portal page took 3 seconds to assemble and display the modules, you have a portal page that takes at least 23-33 seconds to complete.  If all of the modules could be asynchronously loaded on that portal page, that time would optimally be cut down to 6 seconds.  The module would be processing concurrently so the 30 seconds is now theoretically 3 seconds + the 3 second portal page overhead for the 6 second total page rendering.  There is a performance hit for this however because now your application server is handling 1 portal page request plus 10 module requests for a total of 11 simultaneous requests where it used to be 1.  This has implications on your Apache MaxClients limit and your Tomcat Thread limits because these will be taxed a little more but they complete much quicker so the perceived performance is much greater but it is more physically demanding on your Blackboard application server.  

But wait... there's more...

In the past, we've had portal modules that make requests to external servers that have been overtaxed and are slow to respond at times.  Our Weather module, for example, goes off to a weather service to get its data. Here in Canada, we use a different weather module because the old one didn't do Canadian weather. During a snow storm, that remote server takes much longer to return data and, in turn, render the portal module.  We also have several portal modules that go off to other internal servers for things like Student timetables and Employee Attendance and such which, at times, are slow due to the demand also.  Long ago, we implemented portal module caching (within our custom modules) but if the server times out or is slow to respond, one particular module could take up to two minutes before TCP/IP closes down the connection to the remote server.  Before asynchronous module loading, our Blackboard server would slow to a crawl because external servers were not responding fast enough.  The reason is that during portal page loading, the Apache request is waiting for the modules to complete and is stalled until it reaches all of the module processing and rendering.  Multiply this times the number of portal page requests that your users are making at any instant in time and again multiply it by the number of requests that continue to queue up while the other requests are waiting to complete and you can quickly max out Apache (Maxclients).  Your server will slow to a crawl until it's virtually deadlocked.

Asynchronous module loading helps in this case because if one particular module is slow to respond (Weather for example), the student can still see the completed modules and continue without waiting for that module to complete.  Do you want to have your students not be able to access courses because the Weather module is slow?  That was a problem at times but Async module loading has helped.

Great... Let's load all modules asynchronously?

Well, you can't.  Certain modules will not work if loaded asynchronously.  The first one we found during the beta process was the Login module.  When first implemented in early beta, you could async load any module.  That changed quickly when we turned on async loading for all modules as a test and we couldn't log in anymore :-)  The login module is an example of one module that cannot be asynchronously loaded.  Modules that do HTTP refreshes and use Javascript/Ajax will not work because of timing and rendering issues.  This gets complicated to explain so I won't for the sake of trying to make this post less than a book but if any module does redirects or has Javascript or certain DHTML in it, the Javascript/refreshes will not work.  It has to do with timing and handlers and such so what I did was try to set a module to load asynchronously and see if it worked completely.  If so, it was good to go.  If not, I set it back.  The Login module is not a good one to test :-)  Since then, they enforced the ability to not allow that feature for certain modules.  What they are I don't recall but if you don't see the option, you can't set that module to asynchronously load.  Our old weather module used to use Javascript to get it's output but we've since moved to another weather service that uses Flash to dynamically get it's data and output and that works asynchronously with no ill effects.

What I find is that I don't need to asynchronously load any Blackboard modules that get data directly from Blackboard's database but there is one exception here.  The What's New module is slow.  You can asynchronously load it and this was one of the reasons why this was implemented.  My rule of thumb is that if the module goes to any other server, other than our Blackboard server, it gets asynchronously loaded.  The RSS channel modules don't need to be async loaded because they are cached anyways but you may want to experiment with trying some of your modules in a test environment.

This feature is found by going to the Modules page in the System Admin tab and selecting the "Properties" button for any given module.  In the "Availability" section (2), you could see a line at the bottom of that section that says "Allow Asynchronous Loading" and a check box.  Check that box and submit the page and you can see if the module works.

The reason why it is not documented could be that all modules don't work or because there are server performance setting implications but there is one thing I can say about implementing this little known feature...  We are ready for the next snow storm ;-)

Hope this helps,
Santo Nucifora

Seneca Content System: Website tool update and note about Blackboard Support Knowledgebase Wiki

Just a quick note to those who may be using the Blackboard Content System and our building block for websites within Content System.  It has been updates and the new file is available from

Updates include:

  1. Fix for Learning System 7.2 - the instructions within the building block are incorrect for 7.2.  Blackboard changed the Tomcat configuration slightly for Tomcat clustering so the instructions are only slightly different but enough that the websites were not available.  Please check the instructions if you are going to Blackboard Learning System 7.2 with Content System.
  2. Fix for  Learning System 7.3 - I used some private APIS (guilty as charged!) which went away due to some changes in Content System for 7.3, I guess.  I changed the code so it would work using the standard APIs so it's working just like it used to but it's a little less fancy in terms of source code.  It's probably best to upgrade before you go to 7.3 so you won't see the error but if you upgrade after, its not a big deal.  Just do this during your upgrade.

As I am doing with all of my public building blocks, I will be putting up a page on so that it can be searched when system admins are at the Bb Knowledgebase Wiki.  If you are a building blocks developer that makes your blocks freely available, I would encourage you to do the same thing and please use my examples as a template, if you like.  I;ve always thought it was good to put support notes in a central location for all of these public building blocks that various institutions create and make publicly available and the Bb KBWiki is the perfect place for it, in my view.


BbWorld - Reflections of a great event

Well, my attempt at blogging was a total failure as I suspected.  Many people have summarized what they saw in various blogs related to BbWorld.  Some have even blogged sessions.  I can tell you that I went to one keynote (the Blackboard one with Michael Chasen/Peter Segall) and one session (the lethal 7:30 am session after the Client Appreciation party the night before with Jeremy Portzer and John Fontaine).  I don't take notes and I rarely hold a pen but I did hold a pen this past week for a brief moment when Jason Minkoff presented me with a  Blackboard KBWiki pen .  I haven't used it and probably never will but I really appreciated it. 

Blackboard keynote notes:

  •  The iBoard (iPhone parody) was funny.
  • Dan Cane's Facebook page was cool (with the integrated Blackboard application).  I hear it's a mock-up.  I know Dan and I would wager against that.
  • The What's New/What's Due/What's Wrong screen shot was cool.  I need to see if I can get that screen shot from someone.  It was a great looking mock-up.
  • Who's Online was in there.  Blackboard was kind enough to personally ask about the name and if I minded them using it.  They could do far more with it than I can so I happily passed on the reigns.  They didn't have to do this because Who's Online is in WebCT (something I found out when I was playing with  WebCT Vista, I think, a number of months ago).
  • SafeAssign was announced.  It was a funny moment because when it was announced, Eric Kunnen looked at me and I looked at him and neither of us had heard one word about this, which is a rare event indeed.   Chalk one up for Blackboard on that one.

Believe it or not, Blackboard got me to do a session, sort of...  I was in a panel session for the Greenhouse Grant process.  Eric Kunnen and I partnered in a project and won this year (more on the project in an upcoming post).  I actually enjoyed doing it so one day, you may see me do some sessions.  This year I was invited to help out in four other sessions but politely declined because I'm not the "presenter type".  With the Greenhouse panel session, it was scheduled and published in the program before I got a chance to decline.  Chalk one up for Adrian Alleyne this time :-)

I also attended the first day of the Developer Conference.  I went to one session and left part-way through because it was focused on Building Blocks for beginners.  If I was a beginner, it would have been a great session.

So, you may be wondering why I even bothered going to the conference and why I think it was the best conference yet.  I met a number of people that I had known over the net over the years on various listservs and through some work we had done together in Product Development Partnerships (PDPs) and betas.  I also caught up with  several members of Blackboard's Product Development because we do a lot of work with them in those betas and PDPs and I just want them to put a face to a name which is what I was able to do with other colleagues.  I had met several of them at an Ask Dr. C day recently at Blackboard headquarters but I tried to probe a little deeper into whatever I could find on what is coming after 7.4 (all of which is under non-disclosure, of course).  I also attended a couple of focus group sessions (and missed one because it conflicted with the Greenhouse Grant session).

Key highlights for me

  • I got to put some new faces to names (which I started to list and removed because I know I would miss someone)
  • I got to see familiar faces and hung out with many of them and had some great conversations.
  • I got to spend some time with Volker K. and Jeremy P. which is always a treat.
  • Any time I get to talk to John F. or Steve F. is a bonus.
  • I had a great time at the Client Appreciation party with some great people.
  • I am convinced that Kerry Jo is the person in the Energizer bunny suit. 
  • I've never met Neal Caidin or Malcolm Murray face-to-face before so I got to do that this time after all these years!
  • I got to say more than just "Hello" to Martha C. in Bb PD finally.
  • I got to talk to Kristin A. about something other than the gradebook :-)
  • Of course, I got to hang out with JoAnna again who everyone still raves about to me even though she's been gone from Seneca for a year or so already.
  • I got to talk to Bob A. about what the future may bring.
  • I got to share some homemade beer especially made for the Dr. C dinner which was a great time with many of the fellow doctors.
  • I got to talk to Dan C. And Chris E. about Kadoo (which looks great and I can't wait to play with!)
  • I got to show Kate B., Henk  vR. and Ed G. my My Courses Plus module, in person. As a bonus, I got to show them  my Announcements Plus module that's not ready for release yet.
  • Several people were very interested in the Greenhouse Grant project that Eric and I are doing.
I could go on and on but I'll stop now.  It was a great conference with great people.  We have some interesting times ahead.

Monday's BbWorld ramblings...


I'm not sure if this is "day 1" or not as I didn't get a chance to go to any of the pre-conference workshops so I'll just call it "Monday".  Daniel Szabo and I drove to Boston first thing in the morning on Monday.  It was a 9 hour drive and was fairly uneventful.  We made sure we didn't stop for too long because we wanted to make sure we attended the Client Leaders Reception.  This reception was for clients who go a little beyond.  As a Dr. C, a Product Development and Beta client and a leader of a couple of user groups, I was able to attend.  I got to see many of the people I work with in terms of Product Development and others.  After a very long almost non-stop drive and two mixed drinks that didn't have very much Coca Cola in them, let's say I was a little less reserved than I normally am.

Memorable moments...

  • I have met most of Product Development face-to-face before so seeing them again was great.
  • I met a number of familiar folks who I converse with regularly and I try to see whenever I get to a conference.
  • I met a number of people I have only communicated with through email.  I won't name any names because I don't want to leave anyone out.

I write this as the keynote address is happening.  It was a long day yesterday, capped off with a great dinner with a number of old and new friends so I didn't get a chance to try out the internet connectivity at the hotel.  A friend of mine at Wimba ended up paying the dinner bill for the whole group so I just wanted to thank her and Wimba for that.

Onto the offical "Day 1" today... 

I guess I'm Blogging BbWorld '07?

As I have done in the past, I've been wondering lately who was going to put a blog together for BbWorld '07.  I really enjoy reading them and getting other peoples opinions on things so I figured I'd ask the question on the BbWorld '07 Facebook group.  I put off posting that question a couple of times as I always seem to think about things like this when I'm not around a computer.  Anyway, before I could do it, Kate Boardman made a blog post of likely suspects and lo and behold, I'm listed!  So, I'm thinking, that's okay.  I am an avid reader of her blog but maybe nobody will notice it.  Then comes Willem van Valkenburg's blog post which I was also listed in!

I did actually think about blogging.  I have never blogged a conference before as I don't ever write anything down (nor do I read anything that says "Release Notes" or "Manual" on the front, but that's another story) so I think I'm going to give it a shot.  Be warned that the last three day conference I went to produced about 7 or 8 lines typed into my Blackberry so there will be no breaking news here.  If you see something tomorrow or the day after, I guess I'm really blogging :-)

As for now, tomorrow is travel day and I'm packed and ready to go.  I have that sinking feeling that I'm forgetting something but it's a good thing that it won't dawn on me until I get there so I'm not that worried. I have a Client Leaders reception to try to make tomorrow night and afterwards a night out with friends.  It's gonna be a long day. 

Open Source Day II

Last week I finally registered for Blackboard's annual user conference, BbWorld '07 and the Bb DevCon developer conference that follows .  Sadly, it turns out that I will not be able to make the Oscelot Open Source Day II event which I was looking forward to going.  Even though I had some input to shaping this event and the original Open Source Day, I have yet to go to one of these.  I would really like to see how the Open Space Technology format works.  I understood that the last OSD was successful, although it was limited in size.

This years OSDII event agenda  looks really good and having it at MIT which is within walking distance from the BbWorld conference fills out quite a week.  Just going to MIT would be kinda cool but unfortunately, it will not happen this year.  Maybe next year...

BbWorld '07 Conference group on Facebook

Find your own thread.  BbWorld '07BbWorld '07 in Boston is coming and Paul Erickson's blog post inspired me to create a new Facebook group for conference attendees and those who are thinking about it.  His post resonates with me that the conference is not only about the sessions but also about everything that surrounds the sessions; the people you meet, the faces that you can put to email addresses on the various Blackboard listservs and meeting and chatting with Blackboarders that shape the product.  It's about the memorable events that occur and what you take away as memories.

I must sheepishly admit that I am not a big session attender.  My first Bb Conference was in 1999 when I actually went to a full schedule of sessions.  I have a much better time talking to Blackboarders and those who make the Blackboard work at their respective institutions.  You will find that many have the same challenges and triumphs.  I find that the conference opens your mind and energizes you.

If you've not been to one or haven't been in a while, the conferences are pretty big these days and with the combination of the classic Blackboard/WebCT folks attending these now, you get a feel for what the products do, what they don't do and get a glimpse of what is coming (at least whatever the Bb lawyers will let you look at :-))  It's not necessarily an event where go solely to hear what's up with Blackboard but you get a chance to speak to some of your peers about what's going on with Blackboard at their institutions.  I think the message in the conference logo above is perfect.  "Find your common thread".  That's what it's all about!

This year the Blackboard Developer Conference follows BbWorld.  Now I have no excuses not to go.  I've done a fair bit of Building Blocks development yet I have never been to one of these and I'm looking forward to it.  Additionally, the Bb Open Source Day follows the Developer Conference. It's being finalized now so more details will follow.  I was unable to go to the first one so this should be interesting.  I get to meet some of my fellow open source developers.  I'm sure it will be a great time.

If you're on Facebook, come on over and join the BbWorld '07 Conference group.

Thanks for your blog post Paul. I'll see you in Boston. 

My Courses Plus: Ready for release

I think it's finally done.  My Courses Plus is ready for release after some interesting issues with cascading style sheets.  I thought I'd have more issues with the Javascript and Ajax but our version has been in production for a couple of weeks and I think we've ironed out all of the bugs.  The biggest issue was specifically with Netscape 7.2 (not 7.0) and a combination of style sheet attributes that made the column that this module was on within Community System take up the whole page.  It's fixed now.

The module looks a little different than previous versions that were shown here.  It sports new icons.  It is also internationalized which means it has functionality similar to language packs like in the base Blackboard Learning System product.  We do have our own custom version because we have a photo roster built in but development is easier because of I can now copy most files over untouched with our own specific wording.  Here, at Seneca College, we call courses "subjects" and we call Blackboard "My.Seneca".  The picture on the left is of the My Courses Plus and not our My Subjects module. (I accidently replaced the old picture so it will look the same as the new one :-) )

If you would like a copy to play with please email me at and I will send it to you by email.  I don't want to publicly post this yet as there may be minor cosmetic issues  with various browsers to address but the base code has been working for a number of years in our older non-DHTML/Ajax version.

Santo Nucifora

Installing Lambda Probe in Blackboard Environment

Instructions and files on how to install Lambda Probe in Blackboard to monitor the Apache Tomcat instance with key memory utilization information. [Read More]

My Courses Plus ongoing development

Just a quick update...

 Development is ongoing with this.  I was just about ready to make it available when I decided to take a look at the stock Advanced Courses module in Blackboard to see what it did.  I have not looked at this module in a long time as we use an iteration of the My Courses Plus module for ourselves and it has been working flawlessly for many years. I didn't realize the stock module showed announcements, calendar entries and tasks so I figured I would build it in too (if this was to replace the existing module).  I did not build the functionality in to add external courses as this would be possible (utilizing the My Weblinks module code that I put out a while ago) but I didn't want to complicate things.  Well...

The functionality is complete but I'm having issues with the user interface because all web browsers are not created equally.  As displayed in this graphic, the instructor interface works great on Firefox, IE7 and Opera but the "Other" view (anything but instructor) of some of the tools is problematic.  First off, the Tasks API is not public so, if it works, that's great.  If it doesn't, there is a way to turn it off (and any other tool in this module).  The Calendar/Tasks/Announcements API is quite old so I'm sure this will be revamped soon but until then, this will work.  Secondly, I can't just let the links to the announcements/calendar/tasks go to the respective pages.  I gotta get "fancy" and make them show up in the actual module on demand (and this almost works).  This is purely a fault of mine as nothing is ever perfect.

Anyway, this is where my browser issues come in.  I work on a prototype and get it working just right and then I try it in  IE7 and it's a disaster.  IE does some weird things with margins/borders  and calculations so things just don't look right.  I think I just have to scrap the whole "window frame" look and go back to something simple.  By the way, this is just a concept as I was thinking of distinguishing announcements from calendar entries and tasks with different colours and maybe a graphic somewhere.  This was borrowed from some work I did on an Ask Dr. C prototype module which is not yet released.

If everyone were to just use Firefox, I would have been done months ago :-)  Anyway, I'm pretty close but I am busy this week in a "Dive into Mozilla" course that is a week long course on building and developing Mozilla and extensions.  But that's the topic of another post coming soon...

My Course Plus almost released...

After several years of using the My Seneca - Subjects module at Seneca, I decided to make it available to the community for two reasons. 

  1. I usually do make some of what we've created available to the Building Blocks community if it can be used elsewhere in the spirit of academia.
  2. It's my first real Ajax project.   I tend to practice new technology and techniques with something concrete.  This is my concrete example.
  3. Okay, there is actually three.  I said I was going to make it public a long time ago and several years have passed.  It's time ;-)

There's a lot of confusion from beginners on the net about Ajax and just plain dynamic HTML.  So, just so that everyone knows, it actually does use Ajax for a couple of things.   The My Organizations Plus module was an off-shoot of our My.Seneca - Subjects module.  It was actually a stripped down version with the added ability to enroll users in organizations because we can't do it the way we are configured.  Anyway, there are traces of a tree view that is pretty much fixed in My Orgs Plus because it's always one level but the new My Courses Plus (as was the case in our internal My.Seneca - Subjects module) has a dynamic tree view.  This new module uses Ajax to expand and collapse semester views (you can see it in the graphic).  When you collapse a semester folder, an Ajax request goes back to the server and stores a value so that it "remembers" when you come back.  Ajax is also used for the What's New functionality (it's a severe hack but it works on demand as opposed to having to have the module on your page which is resource intensive).

 It has it's fair share of dynamic HTML as it has layered user help (for faculty) and the configuration pages were extremely time consuming as I was trying different things there.  The institution course code configuration page was particularly a pain in the neck and it stalled me for a long time but it was a good learning experience.

So, now that it's public, this Building Block allows you replace the current My Courses module, if you like. Below is a list of features that are part of this module:My Courses Plus module
  • allows you to display courses sorted by term
  • allows faculty to collapse and expand sorted courses
  • allows quick access to course tools through a new Quick Tool Pad option.
  • allows faculty to make their courses available with one click from within the Quick Tool Pad
  • allows faculty to manage enrollments if the option is enabled.
  • allows customizable notices for faculty and students to be shown at the top of the My Courses Plus module.

Some initial configuration needs to be entered but it's fairly straight forward.  I will be putting it up to the Building Blocks site soon.

I do want to thank Eric Kunnen and Wayne Twitchell for having a look while it was being developed.
Thankfully, it's over for now but I also just realized that the Newswire stuff is showing in the graphics I used for the help files (the one I used above).  I guess it's not over yet as I now have to do the My Announcements Plus module which allows special courses to act like Announcement repositories for various portal roles.

When will it end?



Seneca College of Applied Arts and Technology