Skip to content

Categories:

Weekly Planner WordPress Plugin

Screenshot of the admin interface of the weeky planner.

Weekly Planner is a highly customizable plug-in that makes it easy to keep track of weekly events and display them on your website. Weekly Planner features a colorful, easy-to-read display for your readers, along with very easy-to-use admin interface that makes it easy to add and remove appointmentswhile providing maximum flexibility, allowing you to change virtually every color without any need to modify the CSS itself.

Originally developed for a client who gave private music lessons and wanted an easy way to keep her current schedule updated, this plug-in is useful for anyone who wants to keep a schedule of weekly appointments, such as classes or tutoring sessions.

To try it out, simply download the ZIP, extract to your wp-content/plugins directory, activate the plug-in, and then insert into a blog post using (left brace) PLANNER (right brace), as I’m doing right here:

Current Appointment Schedule
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
 
11:00
12:00
1:00
2:00
3:00
4:00

Posted in programming.


Favorite Five Chopin Pieces/Performances

In no particular order:

Valentina Igoshina – Op 28/15

Rubenstein – Op 9/2

Horowitz – Op 25/12

Igoshina – Op 10/3

Blechacz – Polonaise Op 53 “Heroic”

Posted in music.

Tagged with , , .


GOES Tour, Part 2

In the previous installment of this tour, we looked at the web-based mail client developed for the Government OI Exchange. Now, we’ll take a look at what happens when you click on a link to view a message, and what sending messages is like.

Click to view the main message window.

Much like the main display, all of the data for this message is pulled from the SQL Server database and dynamically generated. The part labeled “Message Body” is actually XML data that is, again, dynamically parsed; of course, the actual text is just filler. Most of the action, though, happens at the bottom of the page.

Click to view the bottom of the message window.

Here, the two main features of the message viewing extension show up. One is the “send a link” feature, which is quite a revolutionary step in regards to OI exchange. Here, you can search the Department of Defense’s LDAP Directory for users to which you can send an e-mail. The Wiki will send them a short e-mail with a link to the message you are viewing and any additional comments you put.

Clicking the name of the Attachment next to the attachment will, again, pull the attachment from the database; however, there is code that checks to see if the file is a JPG, GIF, or PNG, and if so, seamlessly loads it via AJAX into the table cell. Otherwise, it will present the user with a standard download prompt.

AJAX Attachment

That’s pretty much it for viewing messages; so how about sending them? For this, there’s the Message Creation Center, or “MCC.”

Click to view the Message Creation Center.

The MCC has what you would expect from a message composer; it allows you pick to whom you are sending stuff, and from whom they will receive it. The search engine that you see (with the two highlighted) entries is, again, AJAX-based, so it will search another LDAP directory and display the results in the same cell, without every leaving the main page. Scrolling down, we can take a look at the body composer, which conveniently provides fields for users to fill out, which will be parsed correctly when the message is submitted.

Submitting a message in the MCC

Here, we can see the AJAX-generated preview of our message, as well as the AJAX-generated confirmation that our message has successfully been sent and added to the SQL database.

So that’s pretty much it for this exciting tour of GOES. Hopefully at some point in the future I’ll be able to port everything over to not necessarily require all of the PKI certification and such, so that it’s publicly viewable.

Posted in programming.

Tagged with , , .


Government OI Exchange System Wiki Tour

So one of my duties for the past couple months, and one of the most extensive programming projects I’ve done, has been using HTML, CSS, Javascript, PHP, SQL layered on top of the MediaWiki content management system for a project known as “Government OI Exchange System,” or “GOES,” which lends itself to various terrible puns. The overall concept of the project was to develop a prototype system that would make government “official information,” or “OI,” messages more human-friendly to read and interact with. MediaWiki, the content management system that powers Wikipedia, was chosen because we wanted people to be able to discuss OI dispatches, as well as collaborate on them. Unfortunately, due to the nature of the system, I can’t make a publicly available version very easily, so I did the next best thing and did a virtual tour. We’ll start with the core of the GOES Wiki, a message viewing system that, for lack of creativity, is called NMail.

Click to see the main NMail display page.

The first thing to notice about the display is my name (REID.MICHAEL.JAMES) in the upper left corner. When users log into the GOES Wiki, they must present a PKI certificate in order to proceed. (In practice, this certificate is actually a physical ID card with a magnetic strip that is read by a specialized USB device.) NMail then uses the PKI certificate in order to personalize the data that is displayed in the main panel. All of the data in the main panel is pulled from a Microsoft SQL Server database that contains over 150,000 messages; despite the database being on a modestly powered home computer, due to well-placed indexes and good query writing–excuse the blatant horn-tooting–the page loads in less than a second. For example, the page in the image was generated by this query:

DECLARE @perPage INT DECLARE @pageNumber INT DECLARE @idNumber INT SET @perPage = 20 SET @pageNumber = 1 SELECT @idNumber = OrgUser_ID FROM dbo.Users WHERE OrgUsers_WebName = ‘REID.MICHAEL.JAMES.1234567890′ SELECT * FROM ( SELECT msg_TIME_RECEIVED, msg_PREC, msg_Subj, MSG_ID_MSGS, msg_DTG, msg_From, msg_Body, msg_SecLbl, f_Read, f_Favorite, f_Status, ROW_NUMBER() OVER (ORDER BY msg_TIME_RECEIVED DESC) AS rowNum FROM ( SELECT dbo.Msgs.msg_TIME_RECEIVED AS msg_TIME_RECEIVED, dbo.Msgs.msg_PREC AS msg_PREC, dbo.Msgs.msg_Subj AS msg_Subj, dbo.Msgs.MSG_ID AS MSG_ID_MSGS, dbo.Msgs.msg_DTG AS msg_DTG, dbo.Msgs.msg_From AS msg_From, CAST (dbo.Msgs.msg_Body AS TEXT) AS msg_Body, dbo.UserToMsgRefs.f_Read AS f_Read, dbo.UserToMsgRefs.f_Favorite AS f_Favorite, dbo.UserToMsgRefs.f_Status AS f_Status, dbo.UserToMsgRefs.f_Deleted AS f_Deleted, dbo.SecLbls.SeclLbl AS msg_SecLbl, ROW_NUMBER() OVER ( PARTITION BY dbo.Msgs.MSG_ID ORDER BY dbo.Msgs.MSG_ID) AS seq FROM dbo.Orgs LEFT JOIN dbo.MsgToOrgRefs ON dbo.Orgs.ORG_ID = dbo.MsgToOrgRefs.ORG_ID LEFT JOIN dbo.Msgs ON dbo.MsgToOrgRefs.MSG_ID = dbo.Msgs.MSG_ID LEFT JOIN dbo.UserToMsgRefs ON (dbo.Msgs.MSG_ID = dbo.UserToMsgRefs.MSG_ID AND dbo.UserToMsgRefs.OrgUser_ID = @idNumber) LEFT JOIN dbo.SecLbls ON (dbo.Msgs.msg_SecLbl = dbo.SecLbls.SecLbl_ID) LEFT JOIN dbo.MsgToGMFRefs ON (dbo.Msgs.MSG_ID = dbo.MsgToGMFRefs.MSG_ID) WHERE ((dbo.Orgs.ORG_ID = 9898 OR dbo.Orgs.ORG_ID = 9899 OR dbo.Orgs.ORG_ID = 11000 OR dbo.Orgs.ORG_ID = 14015 OR dbo.Orgs.ORG_ID = 14066 OR dbo.Orgs.ORG_ID = 14490 OR dbo.Orgs.ORG_ID = 14661)) AND dbo.Msgs.MSG_ID IS NOT NULL AND (dbo.UserToMsgRefs.f_Deleted = 0 OR dbo.UserToMsgRefs.f_Deleted IS NULL)) AS T WHERE (seq = 1) ) AS dtOuter WHERE (rowNum BETWEEN (((@pageNumber – 1) * @perPage) + 1) AND (@perPage * @PageNumber))

It makes slightly more sense with proper formatting… slightly.

As you might be able to tell from the query, which messages a user can view is based upon to which organizations they belong, information that is held in the database. In addition, a user has individual ‘relationships’ with a message–a message being read or unread, or messages being favorited, for instance–which are also stored in the database. (The large number of options and unwieldiness of queries like the above are why the next task on the project is to create a SOAP service for potential end-users of the system, so they won’t have to interact with the database directly.)

As far as the user interface GOES (see what I mean about bad puns?), the main cool feature is that everything is loaded using AJAX. AJAX is the “loading in place” mechanic that sites like Facebook, Twitter, and Gmail use to feel more organic to the end-user. So, comparing the display in the first image with this display of new messages only, the only thing that was reloaded was the message listing in white.

Similar to being able to show only new messages, users can do things like change the sorting category, filter their messages by organizations and search for messages about zebras, and change the page (a fairly important task for a mail client).

So what happens when one actually clicks on a message? We’ll find out in the next installment of this exciting series!

Posted in programming.


Obligatory First Blog Post

Here’s an obligatory, pointless first blog post to talk about how I have a blog. How exciting.

Posted in meta.

Tagged with .