PHP Script to Add Time Zones to iCalendar/vCal Feeds
1This is really just a quick hack: all it does is insert the correct timezone description in the header of an iCalendar feed. But if the server that is generating the iCalendar feed doesn’t do it, someone has to. The script generates a URL that can then be subscribed to by your Calendar reader of choice. (I’m running this on my server and using it daily to good effect, but decline to share bandwidth with the world for this one):
$filename = "calendar";
if (isset($_GET["url"]))
{
$url = $_GET["url"];
if (!isset($_GET["show_url"]))
{
preg_match("|.+\/([^?]+)\??|", $url, $matches);
if (isset ($matches[1]))
{
$filename = $matches[1];
}
$calendar = file_get_contents ($url);
if ($calendar)
{
//$output = preg_replace_callback ("/(DATE-TIME:)(\d{4,4})(\d{2,2})(\d{2,2})T(\d{2,2})(\d{2,2})(\d{2,2})[^Z]/", "adjustTimeZone", $calendar);
$timezone = "X-WR-TIMEZONE:America/Los_Angeles\n" .
"CALSCALE:GREGORIAN\n" .
"BEGIN:VTIMEZONE\n" .
"TZID:America/Los_Angeles\n" .
"BEGIN:DAYLIGHT\n" .
"TZOFFSETFROM:-0800\n" .
"RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\n" .
"DTSTART:20070311T020000\n" .
"TZNAME:PDT\n" .
"TZOFFSETTO:-0700\n" .
"END:DAYLIGHT\n" .
"BEGIN:STANDARD\n" .
"TZOFFSETFROM:-0700\n" .
"RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\n" .
"DTSTART:20071104T020000\n" .
"TZNAME:PST\n" .
"TZOFFSETTO:-0800\n" .
"END:STANDARD\n" .
"END:VTIMEZONE\n";
$loc = strpos($calendar, "BEGIN:VEVENT");
$output = substr($calendar, 0, $loc) . $timezone . substr($calendar, $loc, strlen($calendar));
header("Content-Type: text/calendar");
header("Content-Disposition: inline; filename=$filename-pacific-timezone.ics");
echo $output;
exit;
}
}
} |
<h1>vCalendar Time Zone timezone</h1> <p>This is quick script to "de-float" calendars in the vCalendar format which do not specify time zones for their events. This script will automatically add the Pacific time zone information to the calendar at the URL entered below. Copy-and-paste the resulting URL below into your calendar reader of choice. <a href="http://battis.net/link/timezonescript">The source of this script is freely available.</a></p> <form action="<?= $_SERVER["PHP_SELF"] ?>" method="get"> <input type="hidden" name="show_url" value="" /> <p>Calendar URL <input name="url" type="text" value="<?= $url ?/>" /></p> < ?php $newUrl = "http://" . $_SERVER["SERVER_NAME"] . $_SERVER["PHP_SELF"] . "?url=" . urlencode($url); echo "<p><a href=\"$newUrl\">$newUrl</a>"; ?> <p><input type="submit" value="Generate"/></p> </form> |
Generating an iCalendar feed for a FirstClass Calendar
1One, largely undocumented, trick that I have discovered is that, if one places a calendar where it is accessible from the web, say:
that one can then cause FirstClass to generate an iCalendar feed for that calendar by appending the following GET parameters to the URL:
http://www.mchschool.org/~sbattis/1to1workshops1011?plugin=ical&leaves
Clicking this link will either download an iCalendar file or offer to subscribe you to this calendar, depending on your browser settings — right-clicking will allow you to copy-and-paste this link into your Calendar reader’s subscription settings. In fact, with some tinkering, it turns out that the calendar can be in a secured directory and the username and password can be sent through as part of the URL (in a format that I thought I had seen the last of with the decline of Gopher servers):
http://sbattis:supersekretpassword@www.mschschool.org/~sbattis/1to1workshops1011?plugin=ical&leaves
(Nota bene: the above username and password are fake and won’t work — thereby rendering the link inoperable. But you get the idea.)
Building a Google Earth Tour in a Spreadsheet
1For the last couple of months, one of my high school classes at Jewish Day School has been working on building an interactive tool about the Six Day War for a middle school curriculum unit. They have put a lot of work into researching their data and laying it out in Google Earth, and now we’re putting together a tour of the data for the middle school students, that will also teach them a little about how to use Google Earth. It’s been enormously fun.
But. But, we now have to do some programming or some very careful recording in Google Earth to create this tour (a là Al Gore’s Climate Change tours). And my students are far more interested in the design end of things than in the coding end of things. They’re great at what they do, but niggling coding details give them head aches.
So I built a Google Docs spreadsheet, into which they can plug various pertinent information and out of which comes valid KML instructions that will define the tour. I’m a little proud of this — I don’t think that there’s anything else quite like it out there. There are three kinds of information that need to be entered:
- SoundCue — any audio that should be played in the background. You can either enter the whole URL to the MP3 file that should be played, or just the file name (and make sure that you enter the path in which all the files can be found on the KML Generator tab). You also need to tell us both when the cue should be played and how long it should last.
- AnimatedUpdate — anything that should be happening in Google Earth in terms of showing photo overlays or placemarks or polygons or what-have-you. Enter what should happen, and when (and, if relevant, for how long).
- FlyTo — any time we change where (or when) we’re looking at Google Earth. Enter when and how long the transition should take, and the date (and time) that we’re meant to be looking at.
The AnimatedUpdate and the FlyTo also expect the user to enter KML code — which can be copy-and-pasted from Google Earth KML exports for each transition. Happily, if something needs to happen more than once, entering the KML for the first instance will automatically populate future instances. In addition, the pauses necessary to synch up all of the action are calculated by the spreadsheet.
Update March 25, 2011: The spreadsheet above is our live work (since I kept updating the spreadsheet after this post).
The end result is both a visual timeline of the tour (helpful for debugging any weird errors) and also KML code that can be copy-and-pasted out of Google Docs and into a KML file. (Caveat emptor: depending on what you’re pasting the KML into — I like Xmplify — you may see that there is a leading and trailing quote that need to be manually deleted.)
Right now the spreadsheet can handle tours up to four minutes and 10 seconds in length (250 seconds, for those of you keeping score at home). This is because I was originally copying the KML out of the KML Orderer worksheet, and Google Docs supports pasting of up to 1000 rows in total. You’ll see that the current KML worksheet is a single cell, getting around this limitation, but I didn’t bother to extend any of the other worksheets. Just make sure you fill down all the formulas if you extend any of the sheets!
Here’s a link to a scratch copy of the spreadsheet. Feel free to copy and use it for your own purposes — let me know how you used it!
Rendering an RSS feed as HTML
0So… the RSS embed plugin for our school wiki server has been broken since before school started, with no sign of a fix in sight (other things are taking higher priority). Of course, since I have zero desire to post each new training video to our school video as I make them, this is a bit of a stumbling block. But…
I slapped together a script that makes use of the Magpie RSS framework to render some (most?) RSS feeds as a simple HTML page, which I can then embed as an IFRAME in our school wiki. Et voilá, no more having to paste in individual links! You can give it a whirl yourself: paste an RSS feed into this form:
Obviously, if you have need of this on a regular basis, I would be happy to share the code — don’t just run it off my poor little web server!
WordPress µ Testing Setup
0A few days ago (well, maybe a couple weeks ago), I was chatting with one of my colleagues about how I go about testing out new plugins and themes for WordPress µ before loading them on our school blog server. It seems like documenting my process might be generally helpful, so…
To start with, I decided (after ten years of mucking out Apache config files and PHP extensions and custom MySQL installs — thank you so, so much Marc Liyange for your timely and helpful installers!), that I was a grown-up and could spend $60 on a tool that makes my life easier: I run MAMP Pro on my MacBook. This means that I have a generic Apache/PHP/MySQL stack that supports commonly-used PHP extensions, Apache configurations, etc. I have redirected the document root of my install to my regular user’s Sites directory in OS X (~/Sites) so that I have ready access to the backend files of for my test installs. The net result: WordPress’ famous “Five Minute Install” is now true of almost any LAMP-based web application — I had a five-minute install of Drupal, Moodle, Joomla… you name it.
I’ve also settled into using Coda ($99) to edit HTML/PHP source code, since I particularly like the built-in terminal and publishing management features.
With WordPress µ installed (which, I guess, is now calling itself WPMU or WordPress MU or even WordPress 3 in betas), I now do the following:
- I install create a new blog for each new theme or plugin that I want to test out. I follow a pretty intuitive naming scheme: the URL for the blog is the URL for the plugin or theme, and the name of the blog is the name of the plugin or theme (so WordPress Hashcash is at …/wp-hashcash and named WordPress Hashcash).
- As I create each new blog, I create a new user to be that blog’s administrator. I almost never use this login, but it means that I have one user who is matched to each blog. In doing this, I make heavy use of Gmail’s + modifiers, so new user emails look like mygmailaddress+talyn+wpmu+blogurl@gmail.com — this lets me catch and filter relevant emails easily on the other end. (I developed this system when I was testing plugins that sent email notifications). For the curious, Talyn is the name of my laptop (so I know which server is sending me email) and WPMU is the keyword to distinguish these emails from, say, Drupal notifications.
- I also have six generic users that I add to most (not all — I add them as needed) blogs, each with their own standard privileges:
- Anna “Annie” Administrator
- Edward “Eddie” Editor
- Allison “Allie” Author
- Christine “Chrissy” Contributor
- Samuel “Sammy” Subscriber
- Nathan “Nate” No Privileges
I actually included nicknames so that I could control for how different themes displayed usernames (since I’m thinking about FERPA and how it may apply to our students on our school blogserver).
- I have one blog on which I never activate themes or plugins, which I lyrically call “Is this blog in the blast radius?” This is based on my experience installing Digress.it on WordPress µ at the start of the year (it hosed every blog on the server, rather than just the one where it was activated). I check this before I deem any test complete.
- One tricky thing that I did was that I set up MAMP to run Apache and MySQL as my local user account on my MacBook, and I have set permissions on my Sites directory so that my local user has all privileges, as does the www group, and other users have read/execute privileges (
chown -R seth ~/Sites; chgrp -R www ~/Sites; chmod -R 775 ~/Sites). This means that I usually don’t run into problems with web apps that want to move or create files. This is also, of course, totally insecure. Que sera, sera. - I have an extra blog set up on my WordPress µ install that runs Feed WordPress, and it republishes the feeds for all of the other blogs on the server tagged Note. This means that I can post something tagged Note to any blog that I’m working on and then have all my notes together in one place. Adding the subscriptions to the Feed WordPress blog is a manual step, but not prohibitively difficult. And it really does mean that I have one place for all of my notes on how things went (or didn’t went) in my WordPress µ testing. I have the feeds categorized as Plugins, Themes, Configuration and Hacks, since those are generally what I’m testing (and mostly Plugins, at that).
- One hitch in my system is that I have opted to keep my system entirely up-to-date (I’m running WordPress µ 2.9.2 with the most recent versions of all my plugins), while our school blog server is still at 2.8.4a. Generally speaking, this hasn’t been much of a problem, but when I’m particularly concerned, I will sometimes check things out on a lingering 2.8.4a install before loading it.
Creating RSS Feeds in FirstClass
0Since this is available nowhere else on the internet, I’m posting it here for safekeeping. I believe that this applies to at least FirstClass 10, perhaps also FirstClass 9 (but that’s just a W.A.G.). This is from FirstClass tech support:
An RSS feed can be generated for any FirstClass container object (folder, conference, etc.) which is visible to the Web by adding a template override parameter to the URL. In other words, if the URL to the news conference on your Web site was http://www.mysite.com/News , then the URL to the RSS feed for that conference would be http://www.mysite.com/News?Templates=RSS&items . If you have an RSS feed reader you can simply enter that URL, give it a name, and you’ll have a feed. Usually, sites that offer an RSS feed will put a little icon on their main Web page to show that they have one. If your main page is a FirstClass document all you need to do is:
- Paste in your preferred RSS image
- Highlight the image in the editor and right-click your mouse, choose “Make Link”
- Enter the RSS feed URL, in our example http://www.mysite.com/News?Templates=RSS&items or ?plugin=RSS&Items
Buyer beware: I have not seen this work yet in my own tinkering. But I am hopeful that somehow I’m doing something wrong.
Free-style Online Learning
0One of my responsibilities at Jewish Day School is to write a weekly “tech tips” column for the online faculty news. This is one such tip.
Even as the end-of-year to-do lists are approaching critical overload, I find that one of the joys of the spring is the contemplation of what I will be working on next year. Not so much in a “next year I’ll do this all differently” kind of snit, but with more of a “year in review” focus: spring and graduation makes me sentimental and reminiscent.
With that in mind, in the past week I have come across two interesting resources both for teaching in general and for thinking about our work as “knowledge workers” in the 21st century (to infinity and beyond!). First, Merlin Mann discusses how we do (or do not) allocate our time and attention to getting our projects done. Thoughtful, provocative and entertaining stuff. Second, Williams College’s Project for Effective Teaching has gone online with a truly exciting, provocative array of professorial reflections and questions around specific aspects of classrooms and teaching and learning. Enjoy!
How, you might ask, do videos like these fall into my hands? I follow-up on the sources of interesting articles that I see. And then on the sources of those sources: I like to find where the ideas are swimming around raw and unfettered. I do this by following a boat-load of interesting “edu-bloggers”, by following (and engaging with) other teachers on Twitter, and by doing a lot of skimming.
PowerPoint makes us D-U-M-Dumb
0One of my responsibilities at Jewish Day School is to write a weekly “tech tips” column for the online faculty news. This is one such tip.
As we head down the homestretch of May and June, more and more students (and teachers) are experiencing siyyum for their coursework, either as final papers or presentations or projects. Projects and papers are delightfully straight-forward and easy to facilitate and grade… at least, when compared to presentations, which have the added benefit of being a potential exercise in goodwill and patience to sit through.
The first hurdle our students have to get over is the technology itself — bringing together all the disparate elements of their presentation into one place and time. A few years ago, I wrote up a cheat sheet of tips that help to avoid the most common student pitfalls. I have not run into technical problems with student PowerPoints since I started giving them this handout (I kid you not).
In general, a good presentation has to nail not just the content and technology, but also visuals and public speaking. And this is the hardest thing to do right. For adults, even. Experts have started to decry PowerPoint as not just problematic, but actively destructive when it comes to communicating information and especially nuance clearly.
Gen. Stanley A. McChrystal, the leader of American and NATO forces in Afghanistan, was shown a PowerPoint slide in Kabul last summer that was meant to portray the complexity of American military strategy, but looked more like a bowl of spaghetti.
“When we understand that slide, we’ll have won the war,” General McChrystal dryly remarked, one of his advisers recalled, as the room erupted in laughter.
Shifting the focus from a PowerPoint document to the holistic presentation will further the student’s ability to communicate complex ideas — a key skill in today’s (or any day’s) world. Some further reading that is both informative and motivational on that front:
- Merlin Mann talks about “How [he] made his presentations a little better” (know this: he was pretty good to begin with)
- Business Week breaks down how to “Deliver a presentation like Steve Jobs” (the inimitable CEO of Apple)
- Edward Tufte (the master of information presentation — and notorious PowerPoint-hater) examines how to get the absolute most out of PowerPoint (or not)
