Search results for insideuhs

InsideUHS Exposed

The technologies that run insideUHS are a blend of brand name products, proprietary shareware, free, open source software, and custom developed scripts. I presented this list to a small but very enthusiastic group of BAISnet members that visited UHS today.

Brand Names
– Microsoft Exchange Server (Outlook Web Access)
– Microsoft Server (Internet Information Services, file server)
– Macromedia Dreamweaver (HTML documents)
– Athena (library catalog)
– Naviance (college counseling)

Proprietary Shareware
DAF: Dynamic Authentication Filter (user authentication)
FileMan (remote file access)

Free Open Source Software
YaBB Forum (bulletin board)
Moodle (course web sites)
Greymatter (blog)
Nucleus CMS (blog)
CalendarScript (calendar)
Plone (content management system, wiki)
Coppermine (photo gallery)

Custom Scripts Developed In-House
Athletics schedules and results
– Community service learning plans and hours
– Independent study proposals
– Wireless registration
– EMU announcements
– Student class schedule
– Student directory
Application for admission
Alumni community site
– English 1 vocabulary activity
– Parent web account registration
– Slideshow
– School Council elections
– Attendance submission and reports

Improving Inside U Prep

One difference between being a tech director and academic dean is the much smaller amount of time that I have available for tech tasks. I don’t replace MacBook hard drives anymore, but I do still run at least one school website, Inside U Prep. This summer, I had the chance to have some fun and make a number of long-desired improvements to the website. Many of these simply bring it up to the standard I wished for when I first launched the site.

In the tradition of other internal school websites, Inside U Prep meets a couple of important school needs. Inside sites provide direct access to resources that students and faculty and staff members frequently use. While the main school website prioritizes outward-facing content, intranet websites give top billing to items of internal interest. Internal school websites are less bound by the the design constraints of a public audience, since they have less need to project specific aesthetics. Its audience comes to campus every day!


The improvements include changes to visual appearance, user interface, and custom module functionality. Let’s get started:

Responsive theme

mobileThe prior theme (Bartik) did not change appearance on mobile devices, a liability in the current, mobile era. Fortunately, someone modified Bartik to make it responsive and then posted it as a community theme (Responsive Bartik D7).

Child theme
Short on time, I originally configured Bartik with a custom logo and manually added a couple of graphic elements. These changes were overwritten each time that I installed an update to the theme. This time, I created a child theme of Responsive Bartik. This allowed me to make the prior customizations permanent and then make precise improvements to layout and appearance. The new sans-serif look is cleaner and better spaced.

Simplify menus

The two menus now appear in one column and have moved from the primary menu and right sidebar regions of the page to the more commonly used left sidebar. Usage stats indicate that the custom modules and outward links are used more frequently than the internal resources, another reason to enhance their visibility.

Views instead of custom code

Screen Shot 2015-08-15 at 9.53.22 PMSince site launch, the resources content type has accepted link URLs, uploaded files, and HTML content. The home page displays whatever content has been provided, with a priority order. Previously, I coded this custom, but this time I created a view block for each cell, with the help of Views Conditional so that it would be more standard for me or someone else to modify this configuration in the future.

ITIP module

Screen Shot 2015-08-15 at 9.51.07 PMOne of six custom modules I have authored to provide dynamic data collection and reporting services for specific school programs. ITIP is our faculty professional development and evaluation program. The system now shows multiple years and can accept multiple submissions per item. It will soon request and share an informal project title from each faculty member and then share these to all faculty members, to promote awareness and sharing.

Course resources module

A.k.a. “textbook list.” This module collects course textbook, ebook, app, and website subscription information from teachers in the spring and shares it with families in the fall. This year, the system will show a customized course resources list for each student, instead of requiring families to wade through the complete list to identify the items to purchase for their student.

Community service module

This module makes the submission of community service hours completely electronic. The prior version was pretty bare bones, just performing the basic functions of storing student hours, sending mail messages to supervisors for verification, and producing a dashboard and reports of student progress toward the service requirement. New features include: better structured data entry and storage, normalized organizations table to reduce duplication, faster approval interface for the service coordinator, and dashboard access for advisors. With this done, we will be able to share back to students the 300+ service organizations that they have entered into this database in the past two years. Time permitting, I am very excited to try Addressfield Autocomplete, which may be able to perform a live Google Maps lookup of organization address information. This would be both really slick as well as more convenient and accurate for the service coordinator. Again, the Drupal community has been actively improving the sophistication and usability of contributed modules while I have been gone!

Screen Shot 2015-08-15 at 9.54.15 PMTwitter feeds

Live feeds from three school Twitter accounts of interest to internal audiences.

Finally configured pathauto

Human-friendly URLs.

Maxlength module

Maxlength limits user input into textarea fields, previously a weakness of this site. Users would enter unexpectedly long content into certain fields (usually adding explanations), and database insert statements would break.

Screen Shot 2015-08-15 at 9.55.19 PMDate picker module

Drupal finally created an easy way to attach popup calendar selectors to date fields. We use date selectors all the time, for example to record student community service. Date picker

I look forward to seeing how these improvements play this year and so appreciate having a few days this summer to make a brief return to my web development days.

Intranet Portal Version 7

Today, I rolled out a new version of our intranet portal home page to the school. The change was required since our main website gained social community features formerly on this site (blog, forum, directory, carpool map, photo galleries, video publishing, etc.). The site still runs Moodle and a number of custom Perl and PHP scripts, but it no longer runs Drupal or Gallery. I also took the opportunity to make it easier to read. Let me know what you think of the redesign. How do you manage your intranet portal?

The home page still shows different items depending on one’s Active Directory group membership.

My view

Typical student view

Previous versions





20100104-old insideUHS.png

Web Site Design Portfolio

This portfolio shows major sites I have designed and built for organizations.

Catlin Gabel School (2009-present)
The school’s main, public-facing website provides a complete content management system, multimedia publishing tools, user accounts for students, staff, parents, and alumni, and ties into the school’s student information system. A layer of the site is login-protected, so that community members may publish articles, photos, and videos to the school community.

Catlin Gabel website

Tools: Drupal and Blackbaud, including custom PHP development.

insideCatlin (2006-present)
This intranet web portal provides operational tools for the members of Catlin Gabel School. Teachers provide students with course materials and interactive discussion areas, departments publish commonly-used forms, and individuals schoolwide exchange information such as community service hours and textbook orders. The portal is organized by commonly-desired content and transactions, rather than by tool.


Tools used: Moodle, Drupal, Blackbaud database access, and custom Perl and PHP scripts.

Shasta Mountain Guides (2005 – present)
The guiding company uses this site to publish trip information, collect reservations, solicit customer questions, and sell merchandise. Customers may browse through trip descriptions, photos, and testimonials and then book a reservation online, including payment. The co-owners maintain the Backcountry Blog and photo galleries on the site. A live weather feed and equipment lists help hikers plan their trips.

Shasta Mountain Guides

Tools: Drupal, osCommerce, custom Perl scripts, custom graphic design

San Diego Hat Co (2001 – present)
This web site allows the company to quickly publish an online catalog of hundreds of items to wholesale customers twice each year. Within the login-protected site, customers browse or search for hat styles, zoom in to view close-up detail, and see available colors for each style. The site also includes static pages for company information and an online store for retail customers.

San Diego Hat Co

Tools: Web Site Baker, osCommerce, custom Perl scripts.

Maru-a-Pula School (2006 – present)
The school upgraded its web presence with a content management system and custom graphic design (Elavacion, Inc.). I moved the hosting service to the U.S., to improve upon the reliability of Botswana-based hosting services.

Tools used: Drupal

San Francisco University High School (2002 – 2006)
This site provided for all of the public-facing web site needs of this school community: a description of the school program, faculty and staff contact directory, admission inquiry toolkit, alumni profile and notes tools, and Arts department mini-site.

San Francisco University High School

Tools: Dreamweaver, custom Perl scripts.

insideUHS (2002-2006)
This intranet school portal provided the community with communication and information tools: course web sites, athletics schedules, community service project database, independent study project database, community announcements, schoolwide events calendar, student photo directories, online file access, and student discussion forums.

Tools: Moodle, YaBB, phpBB, FileMan, Blackbaud database access, custom Perl scripts.


site snapshot at The Internet Archive (original site no longer available)

Gateway High School (1999-2002)
The graphic design of this site communicates the school’s unique position as a public charter school in San Francisco. Learning Center and People receive high visibility, and student work is featured on the home page.

Gateway High School

Tools: Dreamweaver at the Internet Archive

Web Script Migration Tips

Some years ago, a fellow tech director asked me why I would go to the trouble of writing custom scripts if they would all periodically have to be updated to keep up with changing technologies. At the time, I replied that the upgrade paths for commercial web programs were typically not painless, and that I thought that the upgrades would not take very long compared to the time invested the write the scripts in the first place. However, I have never had the chance to put this theory to the test until today. Fortunately, I have been proven right so far.

Last week, I installed the updated framework of IIS6, PHP5, mySQL5, and PERL 5.8.8. Today, it has taken only half a day to restore functionality to about three quarters of the insideUHS web scripts. I have learned a few lessons along the way.

IIS6 has added Web Service Extensions, which must be enabled for each script extension you want to be able to run (e.g., .cgi, .php). This seems obvious in hindsight, but I somehow managed to lose about half a day getting scripts to run on the new server. I was thrown off by the “file not found” error messages that IIS6 returns for the sake of security-by-obfuscation.

D’Arcy Norman provided a quick rundown on upgrading mySQL that I used to move from mySQL4 on the old server to mySQL5 on the new. My transition was a bit tougher than his. I learned that it is important to use the -Q option he specified, as some column names conflicted with mySQL reserved words. I learned to run the mysql_fix_privilege_tables script in order to upgrade the mysql user database to the new version. I somehow barely missed out on a slightly newer version of mySQL that has a mysql_upgrade script included in the distribution.

I was also hung up for a while on mySQL import errors while moving data from the old server to the new. Seems that some students had input dates of 2005-02-30 and 2006-06-31 into date fields, of which mySQL6 is less forgiving. I fixed all these, but then I ran into an “out of range” error that was harder to troubleshoot. Having a hard time fixing all the bad data in our rather large database, I searched the web for a workaround and found that I could temporarily disable strict mode in my.ini for the import. I then restored strict mode and everything worked fine. I suppose the bad data may produce an error again one day, but then it should be a lot easier to localize and fix within the context of a working web app. Lots of last year’s data won’t ever be viewed again. If the problem is a poorly-written open-source script, then a new version should do the trick.

I am still getting used to the new security feature of IIS6 which suppresses PERL compilation errors because they do not include a full content-type header. I still want to search ActiveState for a way to temporarily enable headers on error messages when debugging scripts. However, I have found a couple of other ways to debug these scripts. First off, you can see the compilation errors by running scripts from the command line, e.g. c:\> perl test.cgi. If you need to pass parameters to the script to produce the error, then the format is different from a URL query string, e.g. c:\ perl test.cgi action=submit. This is not going to scale up to a full form, but it resolves most script issues.

Most PERL script issues I have found are related to libraries I used on the old server that I must reinstall on the new server. The command-line error messages are very informative in this case. I love the ActiveState Perl Package Manager (PPM). Just run ‘ppm’ at the command line, search for the module you want, and then install it. For example,

ppm>search DBD
ppm>install DBD-mysql

It’s a good idea to search first before installing. I was expecting to use the colon format DBD::mysql but discovered that ppm uses dashes instead, e.g., DBD-mysql. It’s a really fast way to automatically find and install PERL modules into your Windows PERL distribution.

A few scripts have required some easy path edits, since I altered the web directory structure a little bit to better organize static and dynamic content. This was previously motivated by the need to store PHP scripts separately from HTML docs in order to keep database passwords out of directories to which users have read access. I have been good about naming paths to essential data files and templates at the top of each script, so it has been easy to fix those for each script.

This reminds me to mention that Windows has not satisfactorily addressed FTP security problems. Instead of permitting me to set FTP permissions by user account, I only have the option of making users be restricted to their home directories for FTP — and this is not trivial to do. That’s why I had to remove the PHP scripts from the web directories in the first place. Otherwise, users would be able to download PHP source code and look for juicy database passwords contained therein. FTP still relies solely on directory permissions, which are not helpful when you want to give users HTTP read access but no FTP access of any sort. Given the rise of web-based CMS systems, we may completely eliminate FTP this year. the number of FTP users has declined in recent years anyway as Moodle and blogs have taken off.

Onward with the web migration.

Moodle Presentation Notes

Here are notes for an informal 10-minute BAISnet presentation tomorrow at MCDS.

How we chose Moodle
– WebCT, Dreamweaver, forums, Moodle

Basic capabilities

Easy to teach and learn

– J. Min: organization, variety of file types
– Annie: scanned handwritten solutions
– Alex: topic format, individualized feedback
– Raleigh: wiki activity
– Daniela: Spanish language interface, wiki activity

Our modifications
– Graphic design
– Authentication

– Different things for different people
– High degree of satisfaction
– Potential yet untapped, plenty of growth to come

URLs I visited during today’s presentation
insideUHS (BAISnet members contact me to get inside)

Two Podcast Channels Launched

Coincidentally, I launched two separate UHS podcast channels this week. The first is a public channel located at that will carry the usual assortment of audio files that we publish on our web site: speakers on campus, musical performances, and student work that will fly with an external audience. So far, I have posted two items: the recent 30th anniversary presentation from founding head Dennis Collins and current head Mike Diamonti, and the 30th anniversary “Greatest All School Meeting — Ever!”, a two-hour behemoth of alumni stage performances. The latter will be especially worthwhile for our alumni community, most of whom were not able to attend the event.

To deliver podcasts to our external web site, I installed the Nucleus Podcast plug-in on our public blog installation on insideUHS, then created a PHP redirect from to This keeps all of the large audio files on our internal server but gives the outside world a friendly URL. The actual feed URL is something like Thank goodness for the use of the http protocol! Publishing podcasts is much easier than, say, setting up a streaming media server, because we can run it through an existing port (80) and use ubiquitous technologies such as PHP location headers to move requests from one server to another. I easily submitted the feed to iTunes, though I still publish instructions for subscribing to it independently (see my post referencing Jon Udell for reasons why).

The second channel is inside our password-protected intranet, where students and teachers are more free to name names, reproduce copyrighted content for educational purposes, and address issues only of concern to the people who come here everyday. This is consistent with my use of password-protection for forums, Moodle, galleries, and course web sites. Here, the technical side was a little more difficult. Though iTunes very nicely supports authentication for podcast subscriptions, it appears to handle only HTTP authentication, not web forms. We use the latter. However, we do have a legacy domain name that is not tied to our web authentication system. iTunes work with that, but only our active directory users may use that system, not permitting parents to use their individualized logins that we love so much. I assume that we also will not be able to list this private podcast in iTunes but rather publish subscription instructions internally. We will see how well that works. Early adopters: point iTunes to

I am starting to see the writing on the wall for my choice of Nucleus for our blog software. The Podcast plugin for Nucleus is just basic, but I heard about a WordPress podcast plugin that, “totally manages podcast publishing, enclosures, web players, iTunes integration. Handles files uploaded to the blog, as well as remote files (absolute urls). Presents mp3, m4a, mov, mp4, pdf, etc… files.” (source: D’Arcy Norman). Perhaps the time to migrate is approaching.

Blog Portability Using mySQL

The term “blog portability” usually implies RSS. The PHP behind most blog software makes it easy to produce a RSS feed from the same mySQL content that is used to generate HTML pages. RSS can be an incredibly convenient standard, since RSS readers for the desktop and web-based content management systems are readily available. Commonly accepted standards are also good for scalability. But what if your site is small, and RSS is not the most convenient standard?

I recently created a channel to live blog content into our EMU (electronic message unit) system, which is based on PERL scripts and server-side includes. This adds new blog content to the end of our announcements list on the insideUHS home page. To do this using RSS, I would have to find a PERL module that could read RSS feeds (more difficult since PHP took over the web scripting world) and configure it to pull blog content into this page. However, since the home page and the blogs are hosted on the web server, I found a more direct solution. Thanks to the straightforward design of the Nucleus database, it was actually easier to pull blog content directly using mySQL queries.

This solution is significantly more flexible and efficient than the typical RSS feed plug-in. First, there is one less script involved. A RSS plug-in would send a request to the blog PHP script, which would then query its own database and return the result. Instead, my PERL script directly queries the mySQL database. Second, I only query the information I need — blog name, item title, and item number in this case. A RSS feed would also pull the blog content and author. I can add other options, such as including some blogs but not others and limiting the query to new posts from within the last three days. I am not limited to the options in the RSS plug-in. Finally, I can pull content from both private and public blogs, since they are all on the same server. Authentication is required only if you want to read the blog post.

Here is the query:

nucleus_item.`iblog`=nucleus_blog.`bnumber` AND
nucleus_item.`itime`>='$sqldate' AND
nucleus_item.`iblog`='100' OR

Once I convert all of our programs to blogs, then any new content a program director posts will automatically end up in the announcements system. This is a key component in my quest for the widespread sharing of information in the school.

New Library Web Site

Our interim librarian Nicole was recently inspired by the blog-driven web site of the Ann Arbor District Library. She asked me whether we could convert ourLibrary web page into a blog, and I said “of course!” A couple of hours later, we had produced most of the new site. The software will allow her to easily post announcements about new items and links of interest, in addition to the usual task of maintaining links to research databases and subject area sources. For the latter, the blog software functions as a simple CMS by providing links directly to old blog items and removing the date so that they appear to be static pages.

The biggest apparent transformation is the look and feel. Historically, it was difficult to create a high-quality, original look and feel for the static library site. I have always found it challenging to produce good graphic design, so I appreciated finding the Laila skin. Since it already came in UHS web red, all the skin required was one good photo to be ready for production use.

I introduced one advanced wrinkle into this project. Until now, our entire library site was public to the world. In the interest of enabling comments on the new library blog, I moved the site into our private (authenticated) space. Students are automatically logged into the site and can leave comments under their school user names. However, we still wanted to keep the library front page public, in order to maintain visibility with our peer school libraries and to stay consistent with our other school program links on the insideUHS home page. To accomplish this, I wrote a small CGI that sends an authenticated HTTP request to our private site, rewrites some of the links, and returns this code to the browser. Since the request is authenticated but the actual user is not, the user still needs to log in to view any of the links.

UHS community members who would like to subscribe to the RSS feed must use news reader software that supports authentication.

This Blog Has Moved

You have reached Kassblog at its new host: Please update your bookmarks. I have moved the site in order to avoid a week’s downtime during our server transition at school. Plus since it appears that I may be blogging for a while, I should get a real URL.

I tweaked the old installation at insideUHS to make the move as smooth as possible. I replaced the main PHP script for the blog (kassblog.php) with the following redirection, so that any old link to the blog will continue to work as long as the old server is up!

(I know you PHP gurus out there know a much more elegant way to find out whether an array item exists!)

In order to get the latest Nucleus CMS software, I created a brand new installation on this server and then migrating all of the mySQL data from the old to the new. The only problem was in restoring the skin files. The new installation didn’t want to import my customized skin files, because it thought the skin was already imported (due to the mySQL data). I got around that by deleting the skin before uploading and importing it.