I forget if I ever mentioned this on here or not -- I regularly (though not frequently) call Free Talk Live to express some of my opinions on various issues. I like to record these calls for posterity mostly so that I can, like with this blog, see where I have grown and evolved over the years.
Today I called in about Intellectual Property.
Check out my Free Talk Live log
I need to step up the frequency of both blog posts and calls to talk shows. Both are great fun and make me feel like I've accomplished something.
Google Calendar is highly useful. I use it to keep track of all my appointments and due dates and I get helpful reminders when dates approach via email and SMS. Not only that, but it allows me to collaborate with other people's calendars as well, and they don't even have to use Google Calendar because Google supports the industry standard iCalendar format. Things are great.
Unfortunately, iCalendar format is pretty new, and not everyone is using it.
Because Google Calendar is so useful, it is annoying when you find a calendar that is not in iCal format. Two of note that I want to follow are
Both of these calendars are running Simple Machines Forum, version 1.x which does not support iCalendar format (presumably they will in 2.0).
So I wrote an exporter: Download SMF iCal exporter
The exporter scrapes the calendar page on an SMF enabled site and dumps out an iCal compatible file.
Usage: smf_ical_converter.py -u http://yourforum.com/index.php -o cal.ics Download a SMF 1.x forum calendar and dump in iCal format Options: --version show program's version number and exit -h, --help show this help message and exit -u URL, --url=URL URL of forum (up to and including /index.php) -n Name, --name=Name Name of the Forum / Calendar (name goes in .ics file) -i EXPR, --ignore-re=EXPR Ignore any event containing this regular expression (specify as many -i as you want) -o File, --output=File iCal filename to write -v, --verbose Be verbose about process --months-backward=NUM Number of months to go backward --months-forward=NUM Number of months to go forward
I have this tool running in a cron job to keep up to date with the two above mentioned calendars. You can import these URLs directly into your Google Calendar:
- NHUnderground.com iCal calendar (Includes just events, I use "-i 'Birthdays:'" for this one)
- FreeKeene.com iCal calendar
Update 09/16/08: I uploaded version 2 of this application. It has a better README and it now supports user specific date ranges.
I use ERC for all my IRC chatting. I finally got fed up with not noticing someones message because I didn't have emacs focused. So I spent my evening concocting a more noticeable messaging system through Pymacs and libnotify.
Half way though implementing this, wouldn't you know it, I found ErcPageMe which does exactly what I wanted. I figured I was learning quite a bit and I continued writing my own version. I expanded on their code and (at least for me) made some improvements. So kudos go to whoever wrote ErcPageMe :)
The following code will pop up a message on your gnome desktop alerting you whenever you receive a personal message or when someone mentions your nickname in a channel. It also avoids notification for the same user in the same channel if they triggered a message within the last 30 seconds.
Here is my lisp and embedded python/pymacs code:
(defun notify-desktop (title message &optional duration &optional icon) "Pop up a message on the desktop with an optional duration (forever otherwise)" (pymacs-exec "import pynotify") (pymacs-exec "pynotify.init('Emacs')") (if icon (pymacs-exec (format "msg = pynotify.Notification('%s','%s','%s')" title message icon)) (pymacs-exec (format "msg = pynotify.Notification('%s','%s')" title message)) ) (if duration (pymacs-exec (format "msg.set_timeout(%s)" duration)) ) (pymacs-exec "msg.show()") ) ;; Notify me when someone wants to talk to me. ;; Heavily based off of ErcPageMe on emacswiki.org, with some improvements. ;; I wanted to learn and I used my own notification system with pymacs ;; Delay is on a per user, per channel basis now. (defvar erc-page-nick-alist nil "Alist of 'nickname|target' and last time they triggered a notification" ) (defun erc-notify-allowed (nick target &optional delay) "Return true if a certain nick has waited long enough to notify" (unless delay (setq delay 30)) (let ((cur-time (time-to-seconds (current-time))) (cur-assoc (assoc (format "%s|%s" nick target) erc-page-nick-alist)) (last-time)) (if cur-assoc (progn (setq last-time (cdr cur-assoc)) (setcdr cur-assoc cur-time) (> (abs (- cur-time last-time)) delay)) (push (cons (format "%s|%s" nick target) cur-time) erc-page-nick-alist) t) ) ) (defun erc-notify-PRIVMSG (proc parsed) (let ((nick (car (erc-parse-user (erc-response.sender parsed)))) (target (car (erc-response.command-args parsed))) (msg (erc-response.contents parsed))) ;;Handle true private/direct messages (non channel) (when (and (not (erc-is-message-ctcp-and-not-action-p msg)) (erc-current-nick-p target) (erc-notify-allowed nick target) ) ;Do actual notification (ding) (notify-desktop (format "%s - %s" nick (format-time-string "%b %d %I:%M %p")) msg 0 "gnome-emacs") ) ;;Handle channel messages when my nick is mentioned (when (and (not (erc-is-message-ctcp-and-not-action-p msg)) (string-match (erc-current-nick) msg) (erc-notify-allowed nick target) ) ;Do actual notification (ding) (notify-desktop (format "%s - %s" target (format-time-string "%b %d %I:%M %p")) (format "%s: %s" nick msg) 0 "gnome-emacs") ) ) ) (add-hook 'erc-server-PRIVMSG-functions 'erc-notify-PRIVMSG)