Results tagged “plugins”

The most up-to-date documentation for Config Assistant can always be found in the plugin, or in source control.

Using Config Assistant for Theme Options

This plugin adds support for a new element in any plugin's config.yaml file called options, which is placed as a descendant to a defined template set. When a user of your plugin applies the corresponding template set then a "Theme Options" menu item will automatically appear in their "Design" menu. They can click that menu item to be taken directly to a page on which they can edit all of their theme's settings.

The static_version root-level element will trigger Config Assistant to copy files to the mt-static/support/plugins/[plugin key]/ folder, and the skip\_static root-level element will let you specify files not to copy.

id: MyPluginID
name: My Plugin
version: 1.0
static_version: 1
template_sets:
    my_awesome_theme:
        base_path: 'templates'
        label: 'My Awesome Theme'
        options:
            fieldsets:
                homepage:
                    label: 'Homepage Options'
                    hint: 'These options only affect the home page.'
                    order: 1
                feed:
                    label: 'Feed Options'
                    order: 2
            feedburner_id:
                type: text
                label: "Feedburner ID"
                hint: "This is the name of your Feedburner feed."
                tag: 'MyPluginFeedburnerID'
                fieldset: feed
            use_feedburner:
                type: checkbox
                label: "Use Feedburner?"
                tag: 'IfFeedburner?'
                fieldset: feed
            posts_for_frontfoor:
                type: text
                label: "Entries on Frontdoor"
                hint: 'The number of entries to show on the front door.'
                tag: 'FrontdoorEntryCount'
                fieldset: homepage
                condition: > 
                  sub { return 1; }
                required: 1
skip_static:
    - index.html
    - readme.txt
    - .psd
    - .zip

Using Config Assistant for Plugin Settings

To use Config Assistant as the rendering and enablement platform for plugin settings, use the same options struct you would for theme options, but use it as a root level element. The static element is also valid here. For example:

id: MyPluginID
name: My Plugin
version: 1.0
schema_version: 1
static_version: 1
options:
  fieldsets:
    homepage:
      label: 'Homepage Options'
    feed:
      label: 'Feed Options'
  feedburner_id:
    type: text
    label: "Feedburner ID"
    hint: "This is the name of your Feedburner feed."
    tag: 'MyPluginFeedburnerID'
    fieldset: feed
skip_static:
    - index.html
    - readme.txt
    - .psd
    - .zip

Using this method for plugin options completely obviates the need for developers to specify the following elements in their plugin's config.yaml files:

  • settings
  • blog_config_template
  • system_config_template

Fieldsets

Fields can be grouped by fieldset, and fieldsets are "tabbed" on the Theme Options screen. This provides an easy way to organize all of your fields and present them to the user in a clear fashion.

options:
    fieldsets:
        homepage:
            label: 'Homepage Options'
            hint: 'These options only affect the home page.'
            order: 1
        feed:
            label: 'Feed Options'
            order: 2

In this example two fieldsets have been defined: homepage and feed, and this will generate two tabs of options on the Theme Options screen. Note that the fieldset keys (in this case homepage and feed) must be unique within your theme or plugin.

Fieldset Properties

  • label - is the description displayed on the tab, and is also displayed at the top of the page.
  • hint - is a space for you to provide more detail about the contents of this fieldset. It is displayed just above all of the fields in this fieldset
  • order - Use integers to sort the order of your fieldsets on the tabbed interface.

Fields

Fields are easily defined with properties.

options:
    feedburner_id:
        type: text
        label: "Feedburner ID"
        hint: "This is the name of your Feedburner feed."
        tag: 'MyPluginFeedburnerID'
        fieldset: feed
    use_feedburner:
        type: checkbox
        label: "Use Feedburner?"
        tag: 'IfFeedburner?'
        fieldset: feed

In this example two options, or fields, have been defined: feedburner_id and use_feedburner. Note that the option keys (in this case feedburner_id and use_feedburner) must be unique within your theme or plugin.

Field Properties

  • type - the type of the field. Supported values are: text, textarea, select, checkbox, blogs
  • label - the label to display to the left of the input element
  • show_label - display the label? (default: yes). This is ideal for checkboxes.
  • hint - the hint text to display below the input element
  • tag - the template tag that will access the value held by the corresponding input element
  • condition - a code reference that will determine if an option is rendered to the screen or not. The handler should return true to show the option, or false to hide it.
  • default - a static value or a code reference which will determine the proper default value for the option
  • fieldset - specify which fieldset a field belongs to.
  • order - the sort order for the field within its fieldset
  • republish - a list of template identifiers (delimited by a comma) that reference templates that should be rebuilt when a theme option changes
  • scope - (for plugin settings only, all theme options are required to be blog specific) determines whether the config option will be rendered at the blog level or system level.
  • required - can be set to 1 to indicate a field as required, necessitating a value.

Supported Field Types

Below is a list of acceptable values for the type parameter for any defined field:

  • text - Produces a simple single line text box.

  • textarea - Produces a multi-line text box. You can specify the rows sibling element to control the size/height of the text box.

  • select - Produces a pull-down menu of arbitrary values. Those values are defined by specifying a sibling element called values which should contain a comma delimited list of values to present in the pull down menu.

  • radio - Produces a set of radio buttons of arbitrary values. Those values are defined by specifying a sibling element called values which should contain a comma delimited list of values to present as radio buttons.

  • checkbox - Produces a single checkbox, ideal for boolean values, or a set of checkboxes. When using this type to display multiple checkboxes, use the values field option to provide a list of checkbox labels/values. Use the delimiter field option to specify how your list of checkbox options are separated. See "Working with Checkboxes."

  • blogs - Produces a pull down menu listing every blog in the system. Warning: this is not advisable for large installations as it can dramatically impact performance (negatively).

  • radio-image - Produces a javascript enabled list of radio buttons where each "button" is an image. Note that this version of the radio type supports a special syntax for the values attribute. See example below.

  • tagged-entries - Produces a pull down menu of entries tagged a certain way. This type supports the following additional attributes: lastn and tag-filter.

  • entry - Produces the ability to select a single entry via a small pop-up dialog. In the dialog, the user will be permitted to search the system via keyword for the entry they are looking for. This field type supports the field property of all_blogs, a boolean value which determines whether the user will be constricted to searching entries in the current blog, or all blogs on the system.

  • page - Operates identically to the entry type except that it pulls up a list of pages in the selected blog (as opposed to entries).

  • category - Produces the ability to select a single category via a drop-down listing.

  • folder - Produces the ability to select a single folder via a drop-down listing.

  • colorpicker - Produces a color wheel pop-up for selecting a color or hex value.

  • link-group - Produces an ordered list of links manually entered by the user. Options of this type will have defined for them an additional template tag to make it easier to loop over the links entered by the user in your templates. See "Link Group Template Tags" below.

  • file - Allows a user to upload a file, which in turn gets converted into an asset. An additional field property is supported for file types: destination which can be used to customize the path/url of the uploaded file. See "Example File" below. Files uploaded are uploaded into a path relative to the mt-static/support directory. Also, for each option of type file that defined, an additional template tag is created for you which gives you access to the asset created for you when the file is uploaded. See "Asset Template Tags" below.

  • separator - Sometimes you will want to divide your options into smaller sections, and the separator facilitates that. This is a special type of field because there is no editable form to interact with and is informational only. Only the label, hint, order, and fieldset keys are valid with this field type.

Link Group Tags

For each option of type link-group that is defined, two template tags are defined. The first is the one specified by the user using the tag parameter associated with the option in the config.yaml. This template tag will be useless to most users as it will return a JSON encoded data structure containing all the links entered by the user.

The second template tag is the useful one. It is called <TAGNAME>Links. This template tag is a container or block tag that loops over each of the links entered by the user. Inside each iteration of the loop the following template variables are defined for you:

  • __first__ True only if the current link is the first one in the list.
  • __last__ - True only if the current link is the last one in the list.
  • link_label - The label associated with the current link.
  • link_url - The URL associated with the current link.

For example, look at this config.yaml:

my_links:
    type: link-group
    label: 'My Favorite Links'
    tag: 'MyFavorites'

This will create two template tags:

  1. <$mt:MyFavorites$>
  2. <mt:MyFavoritesLinks></mt:MyFavoritesLinks>

You can use them like so:

<p>My favorite links are: 
  <mt:MyFavoritesLinks>
    <mt:if name="__first__"><ul></mt:if>
    <li><a href="<$mt:var name="link_url"$>"><$mt:var name="link_label"$></a></li>
    <mt:if name="__last__"></ul></mt:if>
  <mt:Else>
    I have no favorite links.
  </mt:MyFavoritesLinks>
</p>

Asset Template Tags

For each option of type file that is defined, two template tags are defined. The first is the one specified by the user using the tag parameter associated with the option in the config.yaml. This template tag will return the Asset ID of the asset created for you.

The second template tag is <TAGNAME>Asset. This template tag is a container or block tag that adds the uploaded asset to the current context allowing you to use all of the asset related template tags in conjunction with the uploaded file. For example, look at this config.yaml:

my_keyfile:
    type: file
    label: 'My Private Key'
    hint: 'A private key used for signing PayPal buttons.'
    tag: 'PrivatePayPalKey'
    destination: my_theme/%{10}e

This will create two template tags:

  1. <$mt:PrivatePayPalKey$>
  2. <mt:PrivatePayPalKeyAsset></mt:PrivatePayPalKeyAsset>

You can use them like so:

<p>The asset ID of my key file is: <$mt:PrivatePayPalKey$></p>
<p>The URL to my key file is: 
  <mt:PrivatePayPalKeyAsset>
    <$mt:AssetURL$>
  </mt:PrivatePayPalKeyAsset>
</p>

Example File

The file type allows theme admins to upload files via their Theme Options screen. The file, or files, uploaded get imported into the system's asset manager. The path where the uploaded file will be stored can be customized via the destination field option.

Allowable file format tokens:

  • %e - Will generate a random string of characters. The default length of the string is 8, but can be customized using the following syntax, %{n}e where "n" is an integer representing the length of the string.

Example:

my_keyfile:
    type: file
    label: 'My Private Key'
    hint: 'A private key used for signing PayPal buttons.'
    tag: 'PrivatePayPalKey'
    destination: my_theme/%{10}e

Example Radio Image

The radio-image type supports a special syntax for the values attribute. The list of radio button is a comma-delimited list of image/value pairs (delimited by a colon). Got that? The images you reference are all relative to Movable Type's mt-static directory. Confused? I think a sample will make it perfectly clear:

homepage_layout:
    type: radio-image
    label: 'Homepage Layout'
    hint: 'The layout for the homepage of your blog.'
    tag: 'HomepageLayout'
    values: >
      "plugins/Foo/layout-1.png":"Layout 1","plugins/Foo/layout-2.png":"Layout 2"

Working with Checkboxes

The option type of checkbox has two modes:

  • a boolean mode (a single checkbox either on or off)
  • a multi-select mode (multiple choices and options)

A single checkbox is ideal when needing to collect boolean values from users. For example, here is a theme option to enable/disable advertising on a web site:

enable_ads:
  type: checkbox
  label: 'Enable Advertising?'
  hint: 'Check this box if you want advertising to be displayed on your web site'
  tag: 'IfAdsEnabled?'

Your template tag should then be:

<mt:IfAdsEnabled>
   <!-- insert ad javascript -->
</mt:IfAdsEnabled>

Sometimes however you need to use checkboxes to allow the user to select multiple options that all relate to one another. Here is an example of how to use this field to allow users to specify which areas of a site should have ads enabled:

enable_ads:
  type: checkbox
  label: 'Enable Advertising?'
  hint: 'Check this box if you want advertising to be displayed on your web site'
  tag: 'AdsEnabled'
  delimiter: ';'
  values: 'Homepage;System: Profile, Reg, Auth;Entries;Pages'

You can then check to see if the theme option contains a specific value like so:

<mt:AdsEnabledContains value="System: Profile, Reg, Auth">
   <!-- insert ad javascript -->
<mt:else>
   <!-- do nothing? -->
</mt:AdsEnabledContains>

Or you can loop over all the selected values that have been checked:

<ul>
<mt:AdsEnabledLoop>
  <li>You checked <$mt:var name="value"$>.</li>
</mt:AdsEnabledLoop>
</ul>

Defining Custom Field Types

To define your own form field type, you first need to register your type and type handler in your plugin's config.yaml file, like so:

config_types:
  my_custom_type:
    handler: $MyPlugin::MyPlugin::custom_type_hdlr

Then in lib/MyPlugin.pm you would implement your handler. Here is an example handler that outputs the HTML for a HTML pulldown or select menu:

sub custom_type_hdlr {
  my $app = shift;
  my ($field_id, $field, $value) = @_;
  my $out;
  my @values = split(",",$field->{values});
  $out .= "      <ul>\n";
  foreach (@values) {
      $out .= "<li><input type=\"radio\" name=\"$field_id\" value=\"$_\"".
     ($value eq $_ ? " checked=\"checked\"" : "") ." class=\"rb\" />".$_."</li>\n";
  }
  $out .= "      </ul>\n";
  return $out;
}

With these two tasks complete, you can now use your new config type in your template set:

template_sets:
  my_theme:
    label: 'My Theme'
    options:
      layout:
        type: my_custom_type
        values: foo,bar,baz
        label: 'My Setting'
        default: 'bar'

Defining Template Tags

Each plugin configuration field can define a template tag by which a designer or developer can access its value. If a tag name terminates in a question mark then the system will interpret the tag as a conditional block element. Here are two example fields:

feedburner_id:
    type: text
    label: "Feedburner ID"
    hint: "This is the name of your Feedburner feed."
    tag: 'FeedburnerID'
use_feedburner:
    type: checkbox
    label: "Use Feedburner?"
    tag: 'IfFeedburner?'

And here are corresponding template tags that make use of these configuration options:

<mt:IfFeedburner>
  My feedburner id is <$mt:FeedburnerID$>.
<mt:Else>
  Feedburner is disabled!
</mt:IfFeedburner>

Deploying Static Content

Preparing the Static Content

If you've installed many plugins, you know that you must often copy content to [MT Home]/plugins/ and [MT Home]/mt-static/plugins/. For new users this can be a confusing task, and for experienced users it's one more annoying step that has to be done. But no more! Config Assistant can be used to help your plugin or theme copy static content to its permanent home in the mt-static/ folder!

Within your plugin, use the static_version root-level key to cause Config Assistant to work with your static content. This key should be an integer, and should be incremented when you've changed your static content and want it to be re-copied.

If you want to exclude some of your static content from the copy process, you can specify this with the skip_static root-level key, as in the examples.

skip_static:
    - index.html
    - readme.txt
    - .psd
    - .zip

skip_static builds an array of items to be excluded, which is signified with a leading dash and space. Files can be a partial match, so specifying an extension (such as .psd) will cause all files with .psd to not be copied. skip_static is not a required key.

On the filesystem side, you will want to create your folder and file structure inside of a static folder in your plugin envelope. Any files inside of this static folder (except those items matching skip_static) will be copied during installation.

Installing the Static Content

When installing your new plugin or theme, the static_version will trigger Movable Type or Melody to run an upgrade. During the upgrade, Config Assistant will copy static content to the mt-static/support/plugins/ folder, and will create a folder for its contents. (For example, after installing Config Assistant, its static files can be found in mt-static/support/plugins/ConfigAssistant/.)

Note that the mt-static/support/ folder must have adequate permissions to be writable by the web server; Movable Type and Melody will warn you if it does not. Also note that this path is different from where you often install static content, in mt-static/plugins/.

Developers may have reason to reinstall the static content; this can be done by running ./tools/static-copy.

Plugin-Specific Static Template Tags

Two template tags are created for your plugin or theme, to help you type less and keep code clean: [Plugin ID]StaticFilePath and [Plugin ID]StaticWebPath. For example, Config Assistant makes available ConfigAssistantStaticFilePath and ConfigAssistantStaticWebPath.

These tags will output the file path and the URL to a plugin's static content, based on the StaticFilePath and StaticWebPath configuration directives. These tags are really just shortcuts. You could use either of the following to publish a link to the image photo.jpg in your theme, for example:

<mt:StaticWebPath>support/plugins/MyPlugin/images/photo.jpg
<mt:MyPluginStaticWebPath>images/photo.jpg

both of which would output

http://example.com/mt/mt-static/support/plugins/MyPlugin/images/photo.jpg

Callbacks

Config Assistant supports a number of callbacks to give developers the ability to respond to specific change events for options at a theme and plugin level. All of these callbacks are in the options_change callback family.

On Single Option Change

Config Assistant defines a callback which can be triggered when a specific theme option changes value or when any theme option changes value. To register a callback for a specific theme option, you would use the following syntax:

callbacks:
  options_change.option.<option_id>: $MyPlugin::MyPlugin::handler

To register a callback to be triggered when any theme option changes, you would use this syntax:

callbacks:
  options_change.option.*: $MyPlugin::MyPlugin::handler

When the callback is invoked, it will be invoked with the following input parameters:

  • $app - A reference to the MT::App instance currently in-context.
  • $option_hash - A reference to a hash containing the name/value pairs representing this modified theme option in the registry.
  • $old_value - The value of the option prior to being modified.
  • $new_value - The value of the option after being modified.

Example

sub my_handler {
  my ($app, $option, $old, $new) = @_;
  MT->log({ message => "Changing " . $option->label . " from $old to $new." });
}

Note: The callback is invoked after the new value has been inserted into the config hash, but prior to the hash being saved. This gives developers the opportunity to change the value of the config value one last time before being committed to the database.

On Plugin Option Change

Config Assistat has the ability to trigger a callback when any option within a plugin changes. To register a callback of this nature you would use the following syntax:

callbacks:
  options_change.plugin.<plugin_id>: $MyPlugin::MyPlugin::handler

When the callback is invoked, it will be invoked with the following input parameters:

  • $app - A reference to the MT::App instance currently in-context.
  • $plugin - A reference to the plugin object that was changed

Sample config.yaml

id: MyPluginID
name: My Plugin
version: 1.0
schema_version: 1
static_version: 1
blog_config_template: '<mt:PluginConfigForm id="MyPluginID">'
plugin_config:
    MyPluginID:
        fieldset_1:
            label: "This is a label for my fieldset"
            hint: "This is some text to display below my fieldset label"
            feedburner_id:
                type: text
                label: "Feedburner ID"
                hint: "This is the name of your Feedburner feed."
                tag: 'MyPluginFeedburnerID'
skip_static:
    - index.html
    - readme.txt
    - .psd
    - .zip

License vs. Copyright

In a follow up post to my attempt at explaining the GPL, it has become clear that there is one more very important thing that can still trip users up in trying to understand the GPL; and that is the difference between the software's license, and its copyright. These two concepts are often conflated, because in some respects they are related, but they have very different meanings, and convey very different rights to the people that hold them.

Copyrights and licenses are similar in that they both convey, or give specific rights to the people that hold them. Copyrights can only to be held by the people who create something, or to quote Wikipedia:

Copyright is the set of exclusive rights granted to the author or creator of an original work, including the right to copy, distribute and adapt the work.

A license on the other hand, encapsulates the rights and privileges that a copyright holder grants to someone else vis a vis something they have created. In the world of software the license defines the terms and conditions of someone else's usage of that software, and their rights with regards to their ability to copy and redistribute that software.

Let's look at some simple examples:

  • Let's say I create a piece of software. If I chose to make that software available to others, than I should construct a license that defines for the people I give the software to what it is they can and cannot do with that software. While silly, granted, I could for example tell all the people I give the software to that they cannot use the software on Tuesdays and Thursdays. This is completely arbitrary obviously, but as the copyright holder of the software, that is my right.

  • Let's say I create another piece of software, but instead of writing my own license, I turn to the Internet to help furnish a license for me. Why would I do this? Probably because I don't have the expertise to necessarily think of all the loop holes one of my customers might exploit to give away my software to others, or to potentially harm my business by suing me. So I find the template of a pretty standard software license, fill in the blanks, and use that. Done and done.

Alternatively, I could search the Internet and stumble across another license I am free to use with my software. This license is called the "GPL." It conveys a very different set of rights and privileges to the folks who download my software, but hey, the terms of the license suit me, so let's use that.

The Importance of Copyright in Open Source Software

Copyrights in open source software can add a new dimension of confusion, because in open source software where lots of different, unrelated people are collaborating to build something, it is quite possible that a single piece of open source software will have multiple copyright holders. Why is this significant?

Well, let's suppose that piece of software I wrote up above, you know the one that I licensed under the GPL? Well let's suppose it over the years two folks contributed heavily to the software: Jane and Susan. For the pieces they have written and contributed back to the software, they own the copyright. So now, the software that I created originally, is now in effect, jointly owned by me, Jane and Susan.

Then one day, out of the blue, I get a call from someone and they say: "Listen, I love your software and want to use it for my business. I am willing to pay you $1,000,000 for you to support my usage of the software, but I my company does not like GPL. Can you grant me a different license than the GPL?"

Holy moly that is a lot of money. Of course I want to say, "yes, yes, yes!" But I cannot change the terms under which I distribute the software unless I get the permission of every copyright holder. Jane and Susan may not mind changing the terms under which their contributions are redistributed, but they might also want to share in that $1,000,000. Heck, I would too if I were them. And that is just something I would have to work out with my fellow copyright holders if I wanted to see any of that $1,000,000.

Now in this example, relicensing the software is a very tractable possibility because the number of copyright holders is so finite. But for a piece of software like WordPress, this would be a virtually impossible proposition, because in order to change the license of WordPress, one would have to obtain the consent of virtually every single contributor WordPress has known. And if one person says, "no," then you are S.O.L.

This is why software organizations (like the Free Software Foundation) and companies (like Six Apart) who manage open source software require every contributor to assign the copyright of their creation back to them. That way there remains a single copyright holder thereby making future licensing decisions very easy to make and execute.

Copyright vs. Ownership

One final note. While writing this I found myself using the term "ownership" as a direct synonym to copyright. But I stopped myself because I realized that doing so might further confuse people as the term "ownership" will often imply a different set of rights. Consider this:

When I go to Best Buy and purchase a copy of Avatar on DVD, what do I actually own as a result? What I own is a physical disc and the right (or license) to watch its contents for my personal entertainment. All other uses are strictly prohibited.

In a certain number of years however, the copyright for Avatar will expire, and my rights vis-a-vis the DVD's contents will greatly expand. Once copyrighted material passes into the public domain, one is immediately free to copy, mix, re-mix, perform, and do what ever they want with it.

The DVD itself, the physical medium on which the movie is transmitted, would still be mine, exclusively; and the movie itself would still be owned by Twentieth Century Fox, but they would no longer exclusively possess the right to dictate to me (and others) how, when and under what circumstances that movie could be copied, performed and distributed. In this way ownership is perpetual, and copyright is not.

Summary

Hopefully, for the people who have stumbled across this blog post, this has helped you better understand some of the nuances between copyright and and software licenses. Please keep in mind though, that while I consider myself to be reasonably informed on these subjects, I am not a lawyer.

This blog post is owned by Byrne Reese and licensed under the Create Commons.

A friend of mine recently expressed their confusion over the GPL and how it all relates to the recent bruhaha happening in WordPress land. A quick search on Google will reveal a number of people attempting to answer the same question. Here is my own attempt to answer this question, paying special attention to how this may relate to WordPress themes and plugins.


In an effort to further everyone's understanding of the GPL, let me see if I can shed some light on what the GPL is and how it works.

  1. The GPL governs ones rights to redistribute software using the GPL as a license.

  2. The GPL gives me the right to take GPL code and redistribute it as is (provided that I also respect any related trademarks). For example, I can't take Firefox and redistribute it under the name "Firefox" since the name is a trademark owned by Mozilla and only they have the right to convey its name on software.

  3. Believe it or not, the GPL also allows people to sell copies of GPL software. Most people don't understand this for one simple reason, "why buy the cow when I can get the milk for free." Selling GPL software just doesn't make sense in that regard. But it has been done very successfully. People used to sell Linux on CD - but the value of doing so was clear: at the time to download Linux could take days, so for many shelling out $29.95 for the 5 of so CDs was a huge convenience.

  4. The GPL also says that you can take GPL software, and modify it and redistribute it as well. For example, Microsoft could take the OpenOffice suite, make tons of changes (under auspices of making it better) and then turn right around and sell it. --- There is a catch though, any change you make to GPL software AND also redistribute you must also make available under the same license. In other words, Microsoft would need to make any changes they made to Open Office freely available to others.

    Note: the key here is "redistribution." Because the GPL governs distribution only, it means that I could, as an individual, take OpenOffice, make changes of my own that are TOTALLY AWESOME (naturally) and, provided that I never give a copy of that software to a friend or anyone else, I would never have to share my modifications.

    Another Note: the above note is important because this is why it is reasonable and acceptable for someone to download a copy of WordPress, modify it, pay a consultant to modify it, add features to it, redesign it, etc, etc, etc. and never be compelled to share the mods they have made, or be compelled to open source anything else in their organization.

  5. The GPL also says I can take a portion of code from a GPL program and include it in my own. For example, say I want to write a blogging platform in Perl. I have written most of the code myself, but I deem Movable Type's commenting system to be perfect. So I cut and paste large portions of it into my software. Under the GPL, this is equivalent to forming a derived work, and my new blogging platform is compelled to be GPL as well.

Now let's look at what makes the WordPress theme debate special:

  • The GPL defines something called a "derivative work." When I take Firefox, edit the source, recompile and redistribute it, that forms an obvious derivative work. All derivative works are bound by the terms of the GPL.

  • The GPL also defines a derivative work as a piece of software that runs in the same shared memory space as a GPL program. In layman's terms this means that if a piece of software, say a theme or plugin (even it is distributed separately from the another piece of GPL software), is designed to run in conjunction with GPL software, then the two of them, by virtue of sharing the same memory/process when they run form a derivative work, and thus, the theme/plugin is bound by the GPL.

Ok, why the debate?

Well, their is some ambiguity over what forms a derivative work. I believe this stems from the fact that most people don't understand technically the concept of "shared memory space." But I believe this FAQ answer from the FSF makes clear the intent of the licensor:

If a program released under the GPL uses plug-ins, what are the requirements for the licenses of a plug-in?

If the program dynamically links plug-ins, and they make function calls to each other and share data structures, we believe they form a single program, which must be treated as an extension of both the main program and the plug-ins. This means the plug-ins must be released under the GPL or a GPL-compatible free software license, and that the terms of the GPL must be followed when those plug-ins are distributed. (emphasis mine)

So, although the Free Software foundation states their belief that this forms a derivative work, their own language admits that it does not conclusively do so.

But Byrne, I still don't understand all this techno-mumbo-jumbo. Just tell me, why is there a debate?

Let's clarify one more thing that I have seen many people get confused about. The GPL is NOT law. It is just a contract between two parties. If those two parties have a dispute over the terms, or their interpretation of the contract, then it is up to a judge to resolve the dispute and assess damages.

What makes the GPL special with regards to contracts is that is a standardized one. Meaning tons of people have accepted and/or conveyed the license to others. So if a judge rendered a judgement that helped to resolve the ambiguity of what constitutes a derivative work, then just like that, we would have legal precedence to reinforce anyone else's claims contingent upon this definition.

Finally, let's suppose Matt does sue Chris Pearson, what could he actually get from Chris?

I do not personally think Matt can claim that he has suffered any damages (e.g. lost revenue) from Chris' distribution of a proprietary theme, so I don't think a law suit would result in any money changing hands. But Matt can ask a judge to compel him to comply with the license and force him, by way of a court order, to distribute his themes according to the terms of the GPL. That's it.


And that is my take on the GPL, especially with regards to themes. I have my opinion as to whether Chris should open source his themes, but at the end of the day it doesn't matter what I think because in my mind this amounts to nothing more than a contract dispute between Chris and Matt. So, have at it guys. Wait, let me get some popcorn.

Ok, now have at it.

To my Movable Type fans and followers, I apologize for not posting here more frequently about Movable Type. You will find that I have moved a lot of my Movable Type blogging to two places:

My most recent post however is one that I feel warrants being cross posted, because it is news I am particular excited about. From the blog post on Melody:

A couple of weeks ago I posted my thoughts on creating a new packaging format for Melody plugins and its advantages:

The biggest advantage to [this new packaging format] is to allow us to use github to automate plugin and theme installation and upgrades because now one could easily do this: (snip)

What I am snipping out of the above quote are some geeky command lines which illustrate how to checkout a project from git. Such command line snippets now seem anachronistic given that the community has taken a major step in implementing this vision through a new plugin which, after a little TLC, will find its way right into Melody.

What is most exciting I think is the path and roadmap this plugin squarely puts us on. From the plugin's README:

This plugin is part of a larger effort to completely overhaul how plugins are discovered, installed and managed in Movable Type and Melody. The roadmap for this plugin is for it to interface directly with a centralized plugin directory managed by the community. In this capacity, the need to enter a git url at all will be completely obviated. Instead, users will search for the plugin they want from within Melody, and then click "install." The directory will know the git URL so users don't have to.

I have a love/hate relationship with Amazon right now as they recently made changes to their Amazon Product Advertising API that has broken Media Manager. Now I have numerous users tapping their feet anxiously waiting for an update, during a time in which I really should be working. I have only myself to blame though as Amazon gave me more than enough warning of this change, emailed me numerous times warning me about it, and honestly did all that a services provider should do to inform me of this impending change and its consequences. But naturally I procrastinated, and now I must reap what I sow.

On the flip side, this change has forced me to crack open one of my oldest plugins, one built with a great deal of duct tape and chicken wire, and retool it to be slightly more modern. Most users of course won't appreciate or notice a change, but I myself am relieved to finally replace all of my home-grown web services code, with a more stable and tested equivalent. This hopefully will make it easier for me to add features in the future and not cringe quite as much whenever a user reports a bug.

So while I privately curse Amazon under my breath, Media Manager and Movable Type users can thank Amazon for forcing me to finally devote some time to this plugin.

And that's the good news: Media Manager is getting a much needed overhaul: it is being updated to work with Amazon's new API restoring its operability; and I am making this work available for download today. The bad news is that this work is not 100% complete, so I must beg the for the community's continued patience and understanding in that this overhaul will take a little more time to complete. In the meantime, those willing to experiment with something that is partially complete, you can download and follow my progress with Media Manager over at github, and you can report bugs via the web and email over at Lighthouse.

Still Making Things

As my life has been slowly re-attaining equilibrium after having a second child, I have still somehow managed to find time to make things. Thank god, because making things keeps me sane when life wants to dog pile my schedule, and my personal, professional and family life. Of course I have never really stopped making things, I have only struggled to find the time to tell people about the things I have made.

So today I break the silence and begin to catch you up with some of the many things I have made recently. The first thing I want to tell you about is a new tool I am especially proud of: Image Cropper.

Image Cropper is a plugin, sponsored by Talking Points Memo (an Endevver client) and donated to the Melody and Movable Type open source community, that helps bloggers compose and craft the images used on a web site to promote their content and stories. Of course Movable Type and Melody both possess the ability to do this today natively, but the difference between an amateur and a professional blog like Talking Points Memo, is the time and care they put into the polish they put into every single blog post. TPM for example employs producers to create these images and thumbnails manually because Movable Type's default behavior is ultimately insufficient. To see what I mean, let's look at a quick example.

Suppose we are composing a story about a visit between Barack Obama and Nicolas Sarkozy and we have the following photograph to accompany the story:

Obama and Sarkozy

One thing you may notice about the photo is that the primary subjects of the photo are not centered in the photograph. This poses a problem because the thumbnail Movable Type will create for you automatically will crop out one or more of the primary subjects from the photo. Furthermore, at such a small size, the thumbnail created makes it difficult to determine who the primary subjects even are. This is why Talking Points Memo relied on a manual process to create these thumbnails so that they could produce the best possible result for their readers. Enter Image Cropper.

With Image Cropper we can override the default thumbnail and specify our own to produce an undeniably better result -- all from within Movable Type.

Image Cropper Results

Furthermore, Image Cropper allows you to fine tune the file size and image quality of the image generated as well as annotate the image with text so that you can attach a photo credit or by-line.

To show you how easy it is to create results like this, here is a quick demonstration of the plugin in action:

To learn more about the plugin and to download it, visit the plugin's homepage over at Endevver. And if you need my help with a project, send us a note.

Hats off the WordPress community and Matt Mullenweg's insistence to promote open source design. Thanks to his philosophy and the courage of designers from the WordPress community, I am able to bring the Hybrid News Theme to Movable Type.

The Hybrid News Theme is the first newspaper theme for the Movable Type platform and enabled users to easily create a newspaper style web site:

Hybrid News Theme for Movable Type

If you are looking for the Hybrid News theme for WordPress, please visit their website.

Live Demo

View the live demo.

Download the Beta

This theme requires Movable Type Pro at is relies on custom fields for many of its advanced features.

Bug Reports

This is beta software and is constantly being improved. Please submit bug reports at the following web site:

Installation

This plugin requires Movable Type Pro. It does not yet work with Movable Type Open Source. It is certainly my intent to support MTOS and Melody, just not at this time.

This plugin is installed just like any other Movable Type Plugin.

You will also need to install the following plugins:

Features

  • SEO enhanced:
    • Alternate HTML tags</li> <li>Google Web Sitemaps</li> <li>Google News Sitemaps</li> <li>Associate content with official Google News categories</li> </ul></li> <li>Front door slideshow of new and interesting content.</li> <li>Easily feature content on the front door.</li> <li>Easily designate content to your Hybrid News blog.</li> <li>Display summaries from each of your site's categories on the front door.</li> <li>Pull-down menus for easy site navigation.</li> <li>Customizable page navigation.</li> <li>Category, Comment and Entry feeds.</li> <li>Photo Gallery Support</li> <li>Create custom cropped images for placement on the front door, within the slideshow and else. </li> <li>Much, much more. </li> </ul> <h2>About the Designer</h2> <p>See the <a href="http://themehybrid.com/about">Hybrid Theme Community About page</a>.</p> <h2>License</h2> <p>This theme is licensed under the GPLv2.</p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/projects/movable-type/hybrid-news/#comments">57 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Wednesday, June 3, 2009 at 9:13 AM</p> <p>Filed in <a href="http://www.majordojo.com/projects/movable-type/hybrid-news/" rel="tag">Hybrid News</a> </p> </div> </div></div> </div> <div id="entry-14270" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/2009/06/increasing-your-sites-page-views-with-photo-galleries.php" rel="bookmark">Increasing your site's page views with photo galleries</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-06-02T01:11:42-08:00"><span class='day'> 2</span> Jun 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>In my on-going blitz of plugins and enhancements for Movable Type I am adding one more to the list: upgrades and enhancements to the <a href="http://www.majordojo.com/projects/movable-type/photo-gallery/">Photo Gallery plugin</a>, which you can already see on <a href="http://www.majordojo.com/photos/">my personal photo galleries</a>.</p> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center; width: 525px;"><a rel="lightbox" href="http://www.majordojo.com/assets_c/2009/06/Picture 5-thumb-640xauto-3143.jpg" title="Grid Layout"><img alt="Grid Layout" src="http://www.majordojo.com/assets_c/2009/06/Picture 5-thumb-525x298-3143.jpg" width="525" height="298" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a><br /><p class="caption">A screenshot of the new grid layout for the Movable Type Photo Gallery plugin.</p></div></span></p> <p>These features come compliments of one my favorite clients, <a href="http://www.urbanmoms.ca/">Urban Moms</a>, who sponsored the development of this latest addition to the open source plugin. They are using my Photo Gallery plugin across a number of their blogs, including the <a href="http://www.urbanmoms.ca/family_travel/">Urban Traveler</a>, the <a href="http://www.urbanmoms.ca/urban_closet/">Urban Closet</a>, and the <a href="http://www.urbanmoms.ca/urban_crafter/">Urban Crafter</a>. They came to me because they know that nothing helps increase page views to a site more than photos and images, and wow were they right. <em>Within days of deploying their new albums, their traffic increased by over 10%.</em> Now that's results. Of course it doesn't hurt to have great bloggers and photographers working for you either.</p> </div> <div class="asset-more-link"> <a href="http://www.majordojo.com/2009/06/increasing-your-sites-page-views-with-photo-galleries.php#more" rel="bookmark nofollow">Continue reading</a> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/2009/06/increasing-your-sites-page-views-with-photo-galleries.php#comments">4 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Tuesday, June 2, 2009 at 1:11 AM</p> <p>Filed in <a href="http://www.majordojo.com/design/" rel="tag">Design</a>, <a href="http://www.majordojo.com/blogging/movable-type/" rel="tag">Movable Type</a> and tagged <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=design&limit=20" rel="tag">design</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=features&limit=20" rel="tag">features</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=layouts&limit=20" rel="tag">layouts</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=mid-century&limit=20" rel="tag">mid-century</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=movable%20type&limit=20" rel="tag">movable type</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=photo%20gallery&limit=20" rel="tag">photo gallery</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=photos&limit=20" rel="tag">photos</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=plugins&limit=20" rel="tag">plugins</a> </p> </div> </div></div> </div> <div id="entry-14269" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/projects/movable-type/link-checker/" rel="bookmark">Link Checker for Movable Type</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-06-01T13:11:04-08:00"><span class='day'> 1</span> Jun 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p style="font-family: Georgia; font-size: 18pt;text-align:center;">A blog is only as good as its links.<br /><span style="display:block;font-size: 12pt; font-style:italic;">–Ancient Proverb</span></p> <p>This plugin assists authors, editors and administrators in making sure that all of the links on their blog are still valid and therefore useful to their readers. It works by surfacing a additional list action called "Validate Links" in your Manage Entries table listing. Just select the entries you want to scan and evaluate, hit "Go" and this plugin will produce a simple report about all of the URLs found in the post. </p> <p>The plugin will scan for <em>all</em> URLs including:</p> <ul> <li>valid references to embedded images</li> <li>outbound links </li> <li>frame references</li> </ul> <h2>Prerequisites</h2> <p>You will need to download and install the following Perl Module for this plugin to function:</p> <ul> <li><a href="http://search.cpan.org/~bdfoy/HTML-SimpleLinkExtor-1.23/lib/SimpleLinkExtor.pm">HTML::SimpleLinkExtor</a></li> </ul> <h2>Download</h2> <ul> <li><a href="/projects/downloads/LinkChecker-0.93.zip">Download 0.93</a></li> </ul> <h2>Installation</h2> <p>This plugin is installed <a href="http://www.majordojo.com/2008/12/the-ultimate-guide-to-installing-movable-type-plugins.php">just like any other Movable Type Plugin</a>.</p> <h2>Screenshots</h2> <p><strong>Selecting Entries to Check</strong></p> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center; width: 377px;"><a rel="lightbox" href="" title="Selecting Entries to Validate"><img alt="Selecting Entries to Validate" src="http://www.majordojo.com/2009/06/01/Picture%202.png" width="377" height="260" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></div></span></p> <p><strong>Link Check Report</strong></p> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center; width: 450px;"><a rel="lightbox" href="" title="Link Check Report"><img alt="Link Check Report" src="http://www.majordojo.com/2009/06/01/Picture%201.png" width="450" height="234" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></div></span></p> <h2>License</h2> <p>This plugin is licensed under the GPLv2.</p> <h2>TODO</h2> <ul> <li>Process comments for links</li> <li>Night emails to check past posts for invalid links.</li> <li>Do not surface list action item is prereq is not installed, or provide a good error message.</li> </ul> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/projects/movable-type/link-checker/#comments">4 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Monday, June 1, 2009 at 1:11 PM</p> <p>Filed in <a href="http://www.majordojo.com/projects/movable-type/link-checker/" rel="tag">Link Checker</a> </p> </div> </div></div> </div> <div id="entry-14210" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/2009/05/an-upgrade-to-the-jquery-thickbox-plugin.php" rel="bookmark">An upgrade to the jQuery Thickbox Plugin</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-05-04T10:19:55-08:00"><span class='day'> 4</span> May 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>I have been doing a lot of work in jQuery as of late and stumbled across the popular jQuery plugin called "<a href="http://jquery.com/demo/thickbox/">Thickbox</a>" which works similarly to <a href="http://leandrovieira.com/projects/jquery/lightbox/">Lightbox</a>, but is more fully featured. </p> <blockquote> <p>ThickBox is a webpage UI dialog widget written in JavaScript on top of the jQuery library. Its function is to show a single image, multiple images, inline content, iframed content, or content served through AJAX in a hybrid modal.</p> </blockquote> <p>There were a couple of problems with the plugin though when I started using it. For one, the plugin has not been updated in a long time and was not compatible with the latest version of jQuery: 1.3.1. It also used a rather non-standard way of configuration and was completely non-extensible. In fact, it required users to edit CSS and Javascript files in order to point the library at the right images to use. That's no good at all because it makes it possible for a simple upgrade to break a site, granted in a minor way, but still.</p> <p>No doubt the original author of the plugin has a million other things on his plate, so I thought I would chip in, upgrade the plugin, and contribute them back to the author and community, and if necessary take over maintenance of the plugin.</p> <h2>Download</h2> <ul> <li><a href="/projects/downloads/jquery-thickbox-1.3-byrne.zip">Thickbox 1.3-byrne</a></li> <li><a href="https://github.com/byrnereese/jquery-thickbox-byrne/">Source</a></li> </ul> <h2>Documentation</h2> <h3>Installation Instructions</h3> <ol> <li><p>Upload the thickbox files to your web server.</p></li> <li><p>In your web page using thickbox, import the javascript like so:</p> <pre><code><script type="text/javascript" src="jquery.thickbox-byrne.js"></script> </code></pre></li> <li><p>In your web page, import the CSS like so:</p> <pre><code><link rel="stylesheet" href="thickbox.css" type="text/css" /> </code></pre></li> <li><p>Read the rest of this documentation and initialize thickbox according to your needs.</p></li> </ol> <h3>Options/Settings</h3> <p>The following options can be used when initializing Thickbox.</p> <ul> <li><p><code>macFFBgHack</code> - default: '../images/macFFBgHack.png'. A path to the image "macFFBgHack.png" on your web server.</p></li> <li><p><code>loadingImage</code> - default: '../images/thickbox-loading.gif'. A path to the image "thickbox-loading.gif" on your web server.</p></li> <li><p><code>modal</code> - boolean (true|false), default: false. Determines whether or not the dialog that appears is modal or not. </p></li> <li><p><code>iframe</code> - boolean (true|false), default: false. Determines whether or not the dialog will be iframed content. </p></li> <li><p><code>inlineId</code> - string, default: ''. Sets the DOM id that contains the content that will be displayed in the thickbox.</p></li> <li><p><code>width</code> - default: 600. Sets the size (width obviously) of the thickbox.</p></li> <li><p><code>height</code> - default: 400. Sets the size (height obviously) of the thickbox.</p></li> </ul> <h3>Usage</h3> <pre><code> $('a.thickbox').thickbox({ macFFBgHack: 'images/macFFBgHack.png', loadingImage: 'images/thickbox-loading.gif' }); </code></pre> <h3>Demo</h3> <p><style> @import url(http://www.majordojo.com/projects/downloads/jquery-thickbox-1.3-byrne/thickbox.css); </style></p> <script type="text/javascript" src="http://www.majordojo.com/projects/downloads/jquery-thickbox-1.3-byrne/jquery.thickbox-byrne.js"></script> <script type="text/javascript"> $(document).ready( function() { $('a.thickbox').thickbox({ width: 250, height: 125, inlineId: 'foo', macFFBgHack: '/projects/downloads/jquery-thickbox-1.3-byrne/macFFBgHack.png', loadingImage: '/projects/downloads/jquery-thickbox-1.3-byrne/thickbox-loading.gif' }); }); </script> <div id="foo">It worked!</div> <p><a href="#foo" class="thickbox" title="Testing 1 2 3">Click me</a></p> <h3>Changes between 1.3 and 1.3-byrne</h3> <p>The version described here is '1.3-byrne' which is a fork of the original Thickbox plugin versioned 1.3. Here is a list of the changes I have made in my fork:</p> <ul> <li>thickboxes can be instantiated on any element ID now. It is no longer hard-coded to <code>$("a.thickbox")</code>.</li> <li>thickboxes are now configured using a more standard settings/options array.</li> <li>The plugin itself now utilizes more a more up-to-date coding standard for jQuery plugins.</li> <li>The plugin is now compatible with jQuery 1.3 and greater.</li> </ul> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/2009/05/an-upgrade-to-the-jquery-thickbox-plugin.php#comments">20 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Monday, May 4, 2009 at 10:19 AM</p> <p>Filed in <a href="http://www.majordojo.com/technology/open-source/" rel="tag">Open Source</a> and tagged <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=fork&limit=20" rel="tag">fork</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=javascript&limit=20" rel="tag">javascript</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=jquery&limit=20" rel="tag">jquery</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=lightbox&limit=20" rel="tag">lightbox</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=thickbox&limit=20" rel="tag">thickbox</a> </p> </div> </div></div> </div> <div id="entry-14185" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/projects/movable-type/custom-css/" rel="bookmark">Custom CSS Plugin for Movable Type</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-04-13T16:07:10-08:00"><span class='day'>13</span> Apr 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>Have you ever wanted a simpler way to update your site's stylesheet? One that did not require you to click through 5 screens just to add a simple rule? Have you ever needed a way to let a client or user customize the CSS of their blog without giving them full access to the template editing interface for fear that they might hurt themselves or their blog?</p> <p><em>Enter the Custom CSS plugin for Movable Type.</em></p> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center; width: 525px;"><a rel="lightbox" href="http://www.majordojo.com/2009/04/13/Picture%201.png" title="Custom CSS Plugin"><img alt="Custom CSS Plugin" src="http://www.majordojo.com/assets_c/2009/04/Picture 1-thumb-525x248-3063.png" width="525" height="248" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></div></span></p> <p>This plugin was born out of the simple desire to:</p> <ul> <li><p>Provide users with the ability to customize the CSS of a blog, without requiring to give them complete access to edit <em>all</em> the templates of a blog.</p></li> <li><p>Provide a better interface for editing CSS by devoting a larger portion of the screen's real estate to the editor window, unlike what is found on Movable Type's native "Edit Template" screen.</p></li> <li><p>Insulate a theme from a user inadvertently disrupting a site's design by permanently editing or modifying the theme's core CSS definition.</p></li> </ul> <p>The plugin therefore adds a menu item called "Customize Stylesheet" to the Design menu of Movable Type for those blogs which have opted to utilize the Custom CSS feature provided by this plugin.</p> <p>Clicking that menu item will take users to a screen devoted to editing a site's stylesheet.</p> <h2>Prerequisites</h2> <p>Prior to installation, the following requirements must be satisfied:</p> <ul> <li>User has MovableType 4.2 or later installed <ul> <li>it could work on 4.0, but it has not been tested, nor is it supported.</li> </ul></li> <li><a href="http://www.majordojo.com/projects/movable-type/config-assistant/">Config Assistant</a> has been installed.</li> </ul> <h2>Download</h2> <ul> <li><a href="/projects/downloads/CustomCSS-0.95.zip">Download 0.95</a></li> </ul> <h2>Installation</h2> <p>This plugin is installed <a href="http://www.majordojo.com/2008/12/the-ultimate-guide-to-installing-movable-type-plugins.php">just like any other Movable Type Plugin</a>.</p> <p>You will also need to install the <a href="http://www.majordojo.com/projects/movable-type/config-assistant/">Config Assistant plugin</a>.</p> <h2>Usage</h2> <p>By default the "Customize Stylesheet" menu option is not visible unless one of the two conditions have been met:</p> <ul> <li>You have enabled "Custom CSS" in your Custom CSS plugin settings for the current blog.</li> <li>The current blog utilizes a template set for which custom css has been enabled.</li> </ul> <h3>Enabling the Custom CSS Menu Item</h3> <p>If you are using a theme that does not explicitly support this plugin, but would still like to utilize its functionality, follow these steps:</p> <ol> <li>From your blog's dashboard, click "Plugins" from the "Tools" menu.</li> <li>Find "Custom CSS" in the list of plugins and click its name.</li> <li>Click "Settings."</li> <li>Click the check box labeled, "Enable Custom CSS" and hit Save. </li> </ol> <p>Once the page has reloaded you will see the "Customize Stylesheet" option in the Design menu for that blog.</p> <h3>Embedding Custom CSS in your Stylesheet</h3> <p>This plugin makes available a single template tag: </p> <pre><code><$mt:CustomCSS$> </code></pre> <p>This tag will return whatever raw text has been entered into the large "Edit Custom CSS" text area. It does <em>not</em> process template tags.</p> <p><strong>Example</strong></p> <p>In an index template in the <code><head></code> element:</p> <pre><code><style type="text/css"> <$mt:CustomCSS$> </style> </code></pre> <h2>Designer Guide</h2> <p>This plugin allows designers to designate templates within their template sets which utilize or depend upon user-provided CSS. Templates flagged with the <code>custom_css</code> option will be republished automatically whenever a user makes changes to their custom css.</p> <p>To flag an index template as one that depends upon custom css, consult the example below:</p> <pre><code>template_sets: mytheme: label: 'My Template Set' templates: index: main_index: label: 'Main Index' outfile: index.html rebuild_me: 1 styles: label: Stylesheet outfile: styles.css rebuild_me: 1 custom_css: 1 </code></pre> <p>The operative element being the last line above: </p> <pre><code>custom_css: 1 </code></pre> <p>The assumption of course being that the template identified by this flag contains the <code><$mt:CustomCSS$></code> tag. Again, adding this flag instructs the Custom CSS plugin to rebuild that template whenever a user makes a change to their custom CSS.</p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/projects/movable-type/custom-css/#comments">6 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Monday, April 13, 2009 at 4:07 PM</p> <p>Filed in <a href="http://www.majordojo.com/projects/movable-type/custom-css/" rel="tag">Custom CSS</a> </p> </div> </div></div> </div> <div id="entry-14179" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/projects/movable-type/photo-gallery/usage.php" rel="bookmark">Using Photo Gallery</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-04-02T14:39:22-08:00"><span class='day'> 2</span> Apr 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <h2>Getting Started</h2> <p>To begin you will need to download and install the plugin. Once the plugin has been installed, the next step is for you to apply the theme/template-set to your blog. That is done in one of two ways:</p> <ul> <li><p>Click "Create Blog" from the blog selector pull down menu, and on the resulting screen select "Mid-Century Photo Gallery Template Set". <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center"><a rel="lightbox" href="http://www.majordojo.com/2009/04/02/Picture%201.png" title="Picture 1.png"><img alt="Picture 1.png" src="http://www.majordojo.com/assets_c/2009/04/Picture 1-thumb-200x113-3053.png" width="200" height="113" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></div></span></p></li> <li><p>Click "Refresh Templates" from the sidebar of the Design > Templates screen. <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center"><a rel="lightbox" href="http://www.majordojo.com/2009/04/02/Picture%202.png" title="Picture 2.png"><img alt="Picture 2.png" src="http://www.majordojo.com/assets_c/2009/04/Picture 2-thumb-200x81-3051.png" width="200" height="81" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></div></span></p></li> </ul> <h2>Uploading Photos</h2> <p>Once you have successfully applied the template set to your blog, the options presented in Movable Type's main menu-based navigation will change. You should now notice a new menu option under the create menu called "Upload Photo." Click it.</p> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center"><a rel="lightbox" href="http://www.majordojo.com/2009/04/02/Picture%203.jpg" title="Picture 3.jpg"><img alt="Picture 3.jpg" src="http://www.majordojo.com/assets_c/2009/04/Picture 3-thumb-300x198-3055.jpg" width="300" height="198" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></div></span></p> <p>Doing so will spawn a dialog in which you are prompted to select a file from your local file system, and choose an album.</p> <p>If you need to create a new album, select "New Album" from the pull down menu. When you are ready click Upload Photo.</p> <p>You will then be given the chance to add a title for the photo and add a caption. Edit the metadata of the photo and click Finish or Upload Another. </p> <h2>Changing the Layout of your Front Door</h2> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center; width: 525px;"><a rel="lightbox" href="http://www.majordojo.com/assets_c/2009/06/Picture 3-thumb-640xauto-3141.png" title="Photo Gallery Settings"><img alt="Photo Gallery Settings" src="http://www.majordojo.com/assets_c/2009/06/Picture 3-thumb-525x148-3141.png" width="525" height="148" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a><br /><p class="caption">A screenshot of Photo Gallery plugin settings accessible from the Tools > Plugins menu.</p></div></span></p> <p>One can easily switch between the following layouts for their front door by navigating to Tools > Plugins > Photo Gallery > Settings:</p> <ul> <li>Grid - display a block of thumbnails</li> <li>Blog - display a list of reverse chronologically sorted blog entries with medium sized thumbnails.</li> </ul> <p><strong>In Photo Gallery 2.4 and greater, these options are accessed via the "Theme Options" menu item found under the Design menu.</strong></p> <h2>Featuring a Photo on the Front Door</h2> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: right; width: 225px;"><a rel="lightbox" href="http://www.majordojo.com/2009/06/02/Picture%202.png" title="Featured Image"><img alt="Featured Image" src="http://www.majordojo.com/assets_c/2009/06/Picture 2-thumb-225x192-3139.png" width="225" height="192" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></a><br /><p class="caption">Screenshot of what a featured image on the front door looks like.</p></div></span></p> <p>To feature a photo on the front door simply add the tag <code>@featured</code> to the photo in question. This can be done one of two ways:</p> <ol> <li>From the Manage Photos screen, select the photo you want to feature and from the pull down menu labeled "More actions" select "Add Tags..." and enter <code>@featured</code> into the pop-up that appears.</li> <li>From the Manage Photos screen, click on the title of the image you want to feature and enter in the <code>@featured</code> tag into the tags text box.</li> </ol> <p>You can disabled featured photos all together by navigating to Tools > Plugins > Photo Gallery > Settings and clicking the "Use Featured Photo" checkbox.</p> <h2>Changing the number of photos that appear on the front door</h2> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: right; width: 250px;"><a rel="lightbox" href="http://www.majordojo.com/2009/06/02/Picture%201.png" title="Change number of Photos"><img alt="Change number of Photos" src="http://www.majordojo.com/assets_c/2009/06/Picture 1-thumb-250x109-3137.png" width="250" height="109" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></a></div></span></p> <p>To change the number of photos that appear on the front door, regardless of whether you are using the Blog or Grid layout, go to Preferences > Entry. Then in the box labeled "Entry Listing Default" enter in the number you prefer. </p> <p><em>For best results, enter in a number evenly divisible by four, e.g. 4,8,12, 16, 20, etc.</em></p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/projects/movable-type/photo-gallery/usage.php#comments">5 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Thursday, April 2, 2009 at 2:39 PM</p> <p>Filed in <a href="http://www.majordojo.com/projects/movable-type/photo-gallery/" rel="tag">Photo Gallery</a> </p> </div> </div></div> </div> <div id="entry-10733" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/2009/02/using-jquery-lightbox-for-your-images-in-movable-type.php" rel="bookmark">Using jQuery Lightbox for Your Images in Movable Type</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-02-03T15:50:48-08:00"><span class='day'> 3</span> Feb 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>In yet another example of just how flexible Movable Type can be, I have assembled this simple tutorial which can help you make more compelling and interesting pop-ups for the images you insert into your blog posts. This simple recipe calls for the following ingredients:</p> <ul> <li><a href="http://www.movabletype.org/">Movable Type 4.x</a></li> <li><a href="http://plugins.movabletype.org/assetylene/">The Assetylene Plugin</a> installed - a plugin that let's you customize the HTML used when inserting an asset into a post</li> <li><a href="http://jquery.com/">jQuery</a> installed</li> <li><a href="http://leandrovieira.com/projects/jquery/lightbox/">The jQuery Lightbox Plugin</a> installed</li> </ul> <p><strong>Instructions:</strong></p> <ol> <li><p>Install jQuery and the Lightbox jQuery Plugin into the HTML head of your blog. When you are finished, you should have HTML very similar to the following in between the <code><head></code> and <code></head></code> tags of every page of your web site. </p> <pre><code><script type="text/javascript" src="/js/jquery.min.js"></script> <script type="text/javascript" src="/js/jquery.lightbox-0.5.min.js"></script> <link rel="stylesheet" href="/css/jquery.lightbox-0.5.css" type="text/css" /> </code></pre></li> <li><p>Insert the following Javascript code into the HTML head of your web site as well. This is the magic that will convert any inserted asset into a lightbox image:</p> <pre><code><script type="text/javascript"> $(document).ready(function() { $('a[@rel*=lightbox]').lightBox(); }); </script> </code></pre></li> <li><p>Create a template module called "Asset Insertion" per the instructions that come with Assetylene. Insert the following contents into that module:</p> <pre><code><mt:Asset id="$asset_id"> <mt:if tag="AssetType" eq="image"> <MTSetVarBlock name="width" trim="1"><MTAssetProperty property="image_width"></MTSetVarBlock> <mt:if name="width" gt="640"> <mt:setvarblock name="href"><mt:AssetThumbnailURL width="640"></mt:setvarblock> </mt:if> <mt:unless name="href"><mt:setvarblock name="href"><mt:var name="a_href"></mt:setvarblock></mt:unless> <mt:var name="form_tag"><div style="text-align: <mt:var name="align">"><a rel="lightbox" href="<mt:var name="href">" title="<mt:var name="label" escape="html">"><mt:var name="img_tag"></a></div><mt:if name="enclose"></form></mt:if> <mt:else> <mt:var name="upload_html"> </mt:if> </mt:Asset> </code></pre></li> </ol> <p><em>One of the things that nice about the sample code above is that it ensure that the image you link to is of a reasonable size, regardless of how large the original image is. In the event for example that you upload a 3MB 4000x6000 pixel image, the photo that will appear in the lightbox will be <strong>at most</strong> 640 pixels wide.</em></p> <p>And that's it. Demo time.</p> <h2>Demo</h2> <p><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><div style="text-align: center"><a rel="lightbox" href="http://www.majordojo.com/assets_c/2009/02/P2180046-thumb-640xauto-2151.jpg" title="Harper and his BFF"><img alt="Harper and his BFF" src="http://www.majordojo.com/assets_c/2009/02/P2180046-thumb-300x225-2151.jpg" width="300" height="225" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></div></span></p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/2009/02/using-jquery-lightbox-for-your-images-in-movable-type.php#comments">22 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Tuesday, February 3, 2009 at 3:50 PM</p> <p>Filed in <a href="http://www.majordojo.com/blogging/movable-type/" rel="tag">Movable Type</a>, <a href="http://www.majordojo.com/personal-projects/" rel="tag">Personal Projects</a> and tagged <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=assetylene&limit=20" rel="tag">assetylene</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=jquery&limit=20" rel="tag">jquery</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=lightbox&limit=20" rel="tag">lightbox</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=movable%20type&limit=20" rel="tag">movable type</a> </p> </div> </div></div> </div> <div id="entry-10726" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/services/movable-type/plugins.php" rel="bookmark">Custom Development</a></h2> <div class="asset-meta hidden"> <div class="entry-meta-date"><abbr class="published" title="2009-02-03T00:49:50-08:00"><span class='day'> 3</span> Feb 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <h2>Unrivaled Experience</h2> <p>I have been an active contributor to the Movable Type community for years, and have launched some of its most successful plugins. But more importantly, I have played an instrumental role in shaping the platform itself to make it more extensible and accessible to developers. As a result, I have an intimate working knowledge of the product and its APIs. Here are just a few of the plugins I have developed:</p> <ul> <li><a href="/projects/movable-type/media-manager/">Media Manager</a></li> <li><a href="/projects/movable-type/forum-utilities/">Forum Utilities</a></li> <li><a href="/projects/movable-type/contact-forms/">Contact Forms</a></li> <li><a href="/projects/movable-type/clean-sweep/">404 Manager</a></li> </ul> <h2>Hire a <em>Product Manager</em></h2> <p>I am not just a Movable Type Developer for hire - I am an experienced Product Manager that knows what makes a good user experience, how to determine what features make the most sense for your target audience, and how to best help you meet your needs, your schedule and your budget.</p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Tuesday, February 3, 2009 at 12:49 AM</p> <p>Filed in <a href="http://www.majordojo.com/services/movable-type/" rel="tag">Movable Type</a> </p> </div> </div></div> </div> <div id="entry-10725" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/services/movable-type/training.php" rel="bookmark">Training</a></h2> <div class="asset-meta hidden"> <div class="entry-meta-date"><abbr class="published" title="2009-02-03T00:47:53-08:00"><span class='day'> 3</span> Feb 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>I am the architect and author of virtually all of Movable Type's documentation online, and I continue to provide services to Six Apart in order to expand their efficacy. In addition, I have provided training services to some of Six Apart's largest customers and can instruct individuals and teams on a variety of topics. Training services can be provided on-site or off according to each client's needs and schedule.</p> <h2>Courses</h2> <p><strong>User Training</strong> - This 1 day course will provide authors, editors and administrators with the basics of using and administering their Movable Type CMS. 
Subjects include: site administration, content creation, pages, user administration and permissioning, the basics of site modification and customization, an overview of 3rd party plugins, and a comprehensive review of the entire application and what it can and cannot do. </p> <p><strong>Designer Training</strong> - This 1 or 2 day course provides designers with the tools and knowledge they need to become adept at designing and customizing web sites powered by Movable Type. Students finishing this course will have a strong foundation of knowledge in Movable Type's templating language, template module caching, template sets and theme creation, commonly used third party plugins, and site/publishing optimization.</p> <p><strong>Developer Training</strong> - This 1 or 2 day course teaches any developer how to build plugins to extend the core Movable Type application. Subjects include the Movable Type Registry, working with Movable Type objects, building custom data types, callbacks and events, working with jQuery and Movable Type's Javascript, creating new screens in the Movable Type application, and much, much more.</p> <p><strong>Operations Training</strong> - This 1 day course teaches system administrators on how to host and operate Movable Type. Students leaving the course will have strong understanding of how to optimize Movable Type, the Movable Type Publish Queue, and how to build out Movable Type clusters and network architectures that scale. </p> <p><strong>Movable Type and Perl for PHP Developers</strong> - this 1 day course is designed for PHP developers wishing to learn the basics of Perl, but most importantly how to apply their knowledge of PHP to developing web sites in Movable Type.</p> <p><strong>Learning Perl</strong> - this 5 day course can take virtually any person with a very basic understanding of scripting/programming and teach them the basics of the Perl programming language. This course is ideal for companies wishing to teach engineering, QA and operations teams the basics of the language and to prepare them for other courses designed to teach them the basic of developing custom applications and plugins for Movable Type.</p> <p><strong>Custom Package</strong> - Clients are also free to build a custom curriculum based upon their specific needs.</p> <p>Full course outlines available upon request.</p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Tuesday, February 3, 2009 at 12:47 AM</p> <p>Filed in <a href="http://www.majordojo.com/services/movable-type/" rel="tag">Movable Type</a> </p> </div> </div></div> </div> <div id="entry-10701" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/2009/01/jquery-dialog-theme-for-movable-type.php" rel="bookmark">jQuery Dialog Theme for Movable Type</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-01-15T10:45:43-08:00"><span class='day'>15</span> Jan 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>Since <a href="http://www.majordojo.com/2008/12/looking-to-the-future.php">leaving Six Apart</a> I have been having fun working on a number of projects I just never could find the time for while working there. Of course, I am even more privileged to be working with <a href="http://ithemes.com/">iThemes</a> who have been subsidizing much of the work I am doing and who also share a philosophy of giving back to the Movable Type Community in the form of numerous open source plugins.</p> <p>The most recent plugin I am working on utilizes <a href="http://jquery.com/">jQuery</a> a great deal, a javascript framework I have been using more and more frequently because of its intuitiveness, terseness and huge breadth of samples to draw from. But simply dropping it into the Movable Type application leaves many of the UI components its spawns feel bolted on as opposed to a seamlessly integrated component. </p> <p>So I took a little time to develop a simple <a href="http://docs.jquery.com/UI/Dialog/Theming">jQuery Dialog Theme</a> that makes the dialogs jQuery spawns feel more like the traditional Movable Type dialog. The result is a dialog that looks and feels no different than what users are accustomed to, but that is faster, snappier and more feature rich, allowing users to resize and move the dialog around on the screen. Take a look:</p> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.majordojo.com/2009/01/15/Picture%202.png"><img alt="jQuery Dialog Theme" src="http://www.majordojo.com/assets_c/2009/01/Picture 2-thumb-525x336-2115.png" width="525" height="336" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span></p> <p>To use the skin you need to include the skin's css (downloadable below) on your page. Then when you spawn the dialog you need to set the dialog's class to "mt" like so:</p> <pre><code>$(document).ready(function() { $("#replyDialog").dialog({ modal: true, width: 660, height: 495, dialogClass: "mt", autoOpen: false, overlay: { opacity: 0.5, background: "black" } }); }); </code></pre> <p>Download the skin from the link below, and everyone thank <a href="http://ithemes.com/">iThemes</a> for their continued support of Movable Type and their gracious contributions to the Movable Type Open Source community!</p> <ul> <li><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://www.majordojo.com/2009/01/15/mt.dialog.css">mt.dialog.css</a></span></li> </ul> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/2009/01/jquery-dialog-theme-for-movable-type.php#comments">3 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Thursday, January 15, 2009 at 10:45 AM</p> <p>Filed in <a href="http://www.majordojo.com/blogging/movable-type/" rel="tag">Movable Type</a>, <a href="http://www.majordojo.com/technology/open-source/" rel="tag">Open Source</a> and tagged <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=design&limit=20" rel="tag">design</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=ithemes&limit=20" rel="tag">ithemes</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=javascript&limit=20" rel="tag">javascript</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=jquery&limit=20" rel="tag">jquery</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=movable%20type&limit=20" rel="tag">movable type</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=mtos&limit=20" rel="tag">mtos</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=themes&limit=20" rel="tag">themes</a> </p> </div> </div></div> </div> <div id="entry-10697" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/projects/movable-type/custom-header/" rel="bookmark">Custom Header Plugin for Movable Type</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2009-01-03T10:39:55-08:00"><span class='day'> 3</span> Jan 2009</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>The Custom Header Plugin for Movable Type <strong>makes it easy for users to upload and customize the header for their blog</strong>. It uses javascript and Ajax to make the customization process as seamless, intuitive and painless as possible. No knowledge of HTML or CSS is required, but the theme you are using must explicitly support this plugin. Here are a list of features the plugin has:</p> <ul> <li>Upload and crop a photo or image to use as a header</li> <li>Automatically restricts your cropped image to the proper aspect ratio for your header (according to your theme's design)</li> <li>If you make a slight mistake, easily re-crop the image to fine tune your header exactly the way you want it.</li> <li>Your cropped header and the original file you uploaded is managed for you within Movable Type's asset management framework.</li> </ul> <h2>Download</h2> <ul> <li><a href="/projects/downloads/CustomHeader-1.0.zip">Download 1.0</a></li> </ul> <h2>Installation</h2> <p>This plugin is installed <a href="http://www.majordojo.com/2008/12/the-ultimate-guide-to-installing-movable-type-plugins.php">just like any other Movable Type Plugin</a>.</p> <h2>Screenshots</h2> <p><span class="mt-enclosure mt-enclosure-image"><a href="http://www.majordojo.com/2009/01/03/Picture%203.png"><img alt="Custom Header Screenshot" src="http://www.majordojo.com/assets_c/2009/01/Picture 3-thumb-245x130-2101.png" width="245" height="130" style="float: left; margin: 0 20px 20px 0;" /></a></span></p> <p><span class="mt-enclosure mt-enclosure-image"><a href="http://www.majordojo.com/2009/01/03/Picture%204.png"><img alt="Custom Header Screenshot (cropping)" src="http://www.majordojo.com/assets_c/2009/01/Picture 4-thumb-245x168-2103.png" width="245" height="168" style="float: right; margin: 0 0 20px 0px;" /></a></span></p> <p><br style="clear: both"></p> <h2>Usage</h2> <h3>Users</h3> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Custom Header Menu" src="http://www.majordojo.com/2009/01/03/Picture%205.png" width="288" height="183" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></span>To use the Custom Header plugin you must first apply a template set to your blog that supports the plugin. You will know if you plugin supports the Custom Header plugin because a "Custom Header" menu option will appear under your Design menu.</p> <p>To customize your header, select "Custom Header" from the Design menu. Then select a photo to upload and click the "Upload" button. A dialog will automatically appear allowing you to crop the photo you upload. When the area has been selected that you want to use for your header, click the "Crop" button. </p> <p>That's it. Your header is ready to be used. Republish your blog and your header will appear.</p> <p><strong>Template Sets Known to Support Custom Header</strong></p> <ul> <li><a href="http://ithemes.com/movable-type/">iThemes Essence</a></li> </ul> <h3>Designers and Theme Developers</h3> <p>To add support for this plugin to your theme or template set, you will need to edit your template set's definition within its <code>config.yaml</code> file. The definition is simple and defines the max width and height for the header that your users will be allowed to upload. The definition looks like this:</p> <pre><code>custom_header: max_width: 780 max_height: 125 </code></pre> <p>This definition should be placed within your template set's <code>config.yaml</code> like so:</p> <pre><code>template_sets: awesome: base_path: templates label: 'My Awesome Blog Theme' custom_header: max_width: 780 max_height: 125 templates: archive: category_entry_listing: snip... </code></pre> <p>Once this is in place and a users installs this template set, then a "Custom Header" menu option will automatically appear under the Design menu.</p> <h2>Template Tags</h2> <p><strong><code><mt:CustomHeaderAsset></code></strong></p> <p>This template tag puts the current blog's header asset into context. That means that because the Custom Header plugin utilizes Movable Type's asset management framework you can utilize all of MT's asset related template tags in order to display all manner of information about your header. For example, this tag will display an HTML image tag for your header:</p> <pre><code><mt:CustomHeaderAsset> <img src="<mt:AssetURL>" width="<mt:AssetProperty property="image_width">" height="<mt:AssetProperty property="image_height">> </mt:CustomHeaderAsset> </code></pre> <p>If there is no custom header associated with the current blog then this tag will return an empty string.</p> <p><strong><code><mt:CustomHeaderMaxWidth></code></strong></p> <p>This template tag returns the maximum width allowed for the custom header defined by the current template set.</p> <p><strong><code><mt:CustomHeaderMaxHeight></code></strong></p> <p>This template tag returns the maximum height allowed for the custom header defined by the current template set.</p> <p><strong><code><mt:AssetParent></code></strong></p> <p>This template tag puts the parent asset, or the asset from which the current asset was derived, into context. This is useful for example if you want to display not only the header image, but the original image from which the header image was cropped. For example, the following template code will display a thumbnail of the original image for the current header image:</p> <pre><code><mt:CustomHeaderImage> <mt:AssetParent> <mt:AssetThumbnail width="200"> </mt:AssetParent> </mt:CustomHeaderImage> </code></pre> <h2>Known Issues</h2> <ul> <li>This plugin currently only works for Themes and Template Sets that explicitly support the <code>custom_header</code> directive in their configuration files.</li> <li>Your blog must be republished after uploading a new header.</li> </ul> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/projects/movable-type/custom-header/#comments">22 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Saturday, January 3, 2009 at 10:39 AM</p> <p>Filed in <a href="http://www.majordojo.com/projects/movable-type/custom-header/" rel="tag">Custom Header</a> and tagged <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=custom%20header&limit=20" rel="tag">custom header</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=design&limit=20" rel="tag">design</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=helper&limit=20" rel="tag">helper</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=movable%20type&limit=20" rel="tag">movable type</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=open%20source&limit=20" rel="tag">open source</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=plugins&limit=20" rel="tag">plugins</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=tools&limit=20" rel="tag">tools</a> </p> </div> </div></div> </div> <div id="entry-10693" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/projects/movable-type/page-layout/" rel="bookmark">Page Layout Plugin for Movable Type</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2008-12-19T00:31:50-08:00"><span class='day'>19</span> Dec 2008</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>The Page Layout plugin for Movable Type allows authors to select from more than one template (or "layout") for a given page or entry. For example, a web site may wish to suppress advertising on certain pages. This plugin would allow for the designer of that web site to create to different page archive templates - one with advertising and one without. The author or editor of the site can then choose which template should be used when rendering that page.</p> <h2>Download</h2> <ul> <li><a href="/projects/downloads/PageLayout-0.91.zip">Download 0.91</a></li> </ul> <h2>Installation</h2> <p>This plugin is installed <a href="http://www.majordojo.com/2008/12/the-ultimate-guide-to-installing-movable-type-plugins.php">just like any other Movable Type Plugin</a>.</p> <h2>Usage</h2> <p>When a blog contains only one entry or only one page archive template then this plugin is effectively invisible. However, once you add a second page or entry template, your edit screen is given a new field which you can modify the value of. This field is a simple pull down menu containing all of the templates available to use when publishing that entry or page.</p> <h2>Screenshots</h2> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.majordojo.com/2008/12/19/Picture%202.jpg"><img alt="Page Layout Plugin Screenshot" src="http://www.majordojo.com/assets_c/2008/12/Picture 2-thumb-525x350-2089.jpg" width="525" height="350" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span></p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/projects/movable-type/page-layout/#comments">15 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Friday, December 19, 2008 at 12:31 AM</p> <p>Filed in <a href="http://www.majordojo.com/projects/movable-type/page-layout/" rel="tag">Page Layout</a> </p> </div> </div></div> </div> <div id="entry-10681" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/2008/12/the-ultimate-guide-to-installing-movable-type-plugins.php" rel="bookmark">The Ultimate Guide to Installing Movable Type Plugins</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2008-12-08T20:23:52-08:00"><span class='day'> 8</span> Dec 2008</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>Without a doubt the most common support request I receive from users of <a href="/projects/">my many Movable Type plugins</a> is around installation. If you are having difficulty or getting frustrated the first and most important thing to realize is that it is <em>not your fault</em>. Not in the slightest. The problem lies in having poor documentation which exists because plugin authors, like me, take plugin installation for granted. As a result our instructions, while well intentioned, are sometimes not sufficient for all users.</p> <p>So permit me to try to explain how to install a Movable Type plugin once and for all and in a way that I hope will be useful and understandable by the largest possible number of people.</p> <h2>Before You Begin</h2> <p>First off, these instructions assume that you are installing a plugin that adheres to <a href="http://www.movabletype.org/documentation/developer/the-basic-structure-of-a-plugin.html">the documented best practices for plugin packaging</a>. To determine if the plugin you are installing adheres to this standard you will need to unzip the plugin on your local computer, which should create a new folder containing all of the files needed to run the plugin. Look inside this folder, if it contains another folder called <code>plugins</code> then you are in luck. If not, then this guide will be of little use to you. I would encourage you to contact the plugin author and ask them to please repackage their plugin according to the documented standard, or point them to me so I can help them.</p> <h3>Your $MT_HOME and $MT_STATIC Directories</h3> <p>You are clearly on the right track. Now, another thing you need to know is that these instructions make frequent reference to your "$MT_HOME" and "$MT_STATIC" directories. The location of these directories will be different for virtually everyone; what is important is knowing where these directories are for <em>you</em>. </p> <p>The <code>$MT_HOME</code> directory is a cgi-bin directory where you have the Movable Type application installed. Let's look at this common example: suppose you have installed Movable Type into the following directory:</p> <pre><code>/var/www/cgi-bin/mt </code></pre> <p>We know that this is the right directory because if you view its contents you will find within it a file called <code>mt.cgi</code> like so:</p> <pre><code>/var/www/cgi-bin/mt/mt.cgi </code></pre> <p><em>This</em> is your <code>$MT_HOME</code> directory. </p> <p>Now, your <code>$MT_STATIC</code> directory is where you will find Movable Type's static files. Like with Movable Type itself, you may<sup>1</sup> need to place the plugin's static files outside of your <code>$MT_HOME</code> directory into a "web accessible" directory. You will know this is the case for you if you access Movable Type from a URL like:</p> <pre><code>http://foo.com/cgi-bin/mt/mt.cgi </code></pre> <p>And your images are served from a URL like:</p> <pre><code>http://foo.com/mt-static/images/movable-type-logo.gif </code></pre> <p>Alternatively, your system may be configured such that static files can be served directly from your cgi-bin directory like so:</p> <pre><code>http://foo.com/cgi-bin/mt/mt-static/images/movable-type-logo.gif </code></pre> <p>Knowing how your system is configured to serve static files is essential to a successful plugin installation. To find your <code>$MT_STATIC</code> directory, find on your system a file called <code>mt.js</code>. Let's suppose that your system tells you that mt.js can be found in:</p> <pre><code>/var/www/htdocs/mt-static/mt.js </code></pre> <p>Then your <code>$MT_STATIC</code> directory is:</p> <pre><code>/var/www/htdocs/mt-static/ </code></pre> <p>If your system finds more than one copy of <code>mt.js</code> you will need to do some sleuthing to figure out which one of these directories is in use by Movable Type. <em>Hint: consult your <code>mt-config.cgi</code> file; in it might be a configuration parameter that will indicate the proper path to the directory in question.</em></p> <p>Now, let's proceed with your installation.</p> <h2>Installing via the Command Line (Unix)</h2> <p>If you are at all familiar with using the command line, then this is without a doubt, the quickest and most straightforward solution to plugin installation:</p> <pre><code>prompt> unzip SomePlugin-1.3.zip prompt> cp -a SomePlugin-1.3/* $MT_HOME/ </code></pre> <p>This will copy <em>all</em> of your files into the appropriate directories, including the plugin's cgi scripts, and Perl library files and sometimes even its PHP files needed to support dynamic publishing<sup>2</sup>.</p> <p>And optionally, if the plugin has an <code>mt-static</code> folder and your system requires you to install static files into a different directory than your <code>$MT_HOME</code>:</p> <pre><code>prompt> cp -a SomePlugin-1.3/mt-static/* $MT_STATIC/ </code></pre> <h2>Installing via the Command Line (Mac OS X)</h2> <p>Installing a plugin on a Mac is almost identical to installing on in Unix. The only difference really is the <code>cp</code> command used since <code>cp -a</code> is not supported. So the command sequence becomes:</p> <pre><code>prompt> unzip SomePlugin-1.3.zip prompt> cp -pR SomePlugin-1.3/* $MT_HOME/ </code></pre> <p>This will copy <em>all</em> of your files into the appropriate directories, including the plugin's cgi scripts, and Perl library files and sometimes even its PHP files needed to support dynamic publishing<sup>2</sup>.</p> <p>And optionally, if the plugin has an <code>mt-static</code> folder and your system requires you to install static files into a different directory than your <code>$MT_HOME</code>:</p> <pre><code>prompt> cp -pR SomePlugin-1.3/mt-static/* $MT_STATIC/ </code></pre> <h2>Installing via FTP</h2> <p>If you are installing the plugin via FTP, then the instructions are similar as to the above, but you will be installing the plugin by dragging and dropping files around. Whee! Of course, your <em>exact</em> instructions may vary depending upon the FTP software you use, but the general gist is the same no matter what. Let's take a look:</p> <ol> <li><p>Unzip the plugin's zip file to your desktop.</p></li> <li><p>Start your FTP client and connect to your web server. </p></li> <li><p>In your FTP client navigate to your <code>$MT_HOME</code> directory.</p></li> <li><p>Select all of the files found in the folder created when you unzipped the plugin's archive and drag and drop them directly into your <code>$MT_HOME</code> directory in your FTP client. Wait for all of the files to be copies.</p></li> <li><p>In your FTP client navigate to your <code>$MT_STATIC</code> directory.</p></li> <li><p>Select all of the files found in the <code>mt-static</code> folder found in the folder created when you unzipped the plugin's archive and drag and drop them directly into your <code>$MT_STATIC</code> directory in your FTP client. Wait for all of the files to be copies.</p></li> </ol> <p>And you are finished. Granted, textual instructions like that can sometimes not be very intuitive, so check out the screencast below which demonstrates the instructions above more precisely:</p> <p><object width="501" height="313"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2472644&server=vimeo.com&show_title=0&show_byline=0&show_portrait=0&color=00ADEF&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2472644&server=vimeo.com&show_title=0&show_byline=0&show_portrait=0&color=00ADEF&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="501" height="313"></embed></object><br /><a href="http://vimeo.com/2472644">Movable Type Plugin Installation Demo</a> from <a href="http://vimeo.com/byrne">Byrne Reese</a> on <a href="http://vimeo.com">Vimeo</a>.</p> <p>And that's it. Hopefully this will answer the questions most people have about installing Movable Type plugins. If you have trouble installing one, drop me a note and I will try to help.</p> <p><span style="font-size: 0.9em"><sup>1</sup> - You may or may not need to perform this extra step, which depends exclusively upon how your web server has been setup. As for me, I prefer to configure my web server such that I can <a href="https://www.linuxquestions.org/questions/linux-server-73/is-it-possible-to-serve-.htm-files-from-cgi-bin-directory-685990/">serve images and javascript file (static files) from my cgi-bin directory</a>.</span></p> <p><span style="font-size: 0.9em"><sup>2</sup> - Some plugins come with a set of PHP files that are used by Movable Type's dynamic publishing system. These files should get installed into your `MT_HOME/php` directory, and *not* into your mt-static directory. But if you follow the instructions in this document, you shouldn't have to worry about this.</span></p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Monday, December 8, 2008 at 8:23 PM</p> <p>Filed in <a href="http://www.majordojo.com/blogging/movable-type/" rel="tag">Movable Type</a> and tagged <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=command%20line&limit=20" rel="tag">command line</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=howto&limit=20" rel="tag">howto</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=movable%20type&limit=20" rel="tag">movable type</a>, <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=plugins&limit=20" rel="tag">plugins</a> </p> </div> </div></div> </div> <div id="entry-10658" class="entry-asset asset hentry"> <div class="asset-header"> <h2 class="asset-name entry-title"><a href="http://www.majordojo.com/projects/movable-type/enhanced-member-listing/" rel="bookmark">Enhanced Member Listing</a></h2> <div class="asset-meta "> <div class="entry-meta-date"><abbr class="published" title="2008-11-10T10:15:09-08:00"><span class='day'>10</span> Nov 2008</abbr></div> </div> </div> <div class="asset-content entry-content pkg"> <div class="asset-body pkg"> <p>This plugin is a <em>prototype</em> that provides a new layout and design to a blog's Member Users area of the Movable Type CMS/blogging/publishing platform.</p> <ul> <li><a href="http://www.movabletype.org/2008/11/hacking_the_ui_to_make_movable_type_better.html">Read news post</a></li> <li><a href="http://plugins.movabletype.org/enhanced-user-management/index.html">Visit plugin homepage</a></li> <li><a href="http://www.movabletype.org/downloads/plugins/">Download from movabletype.org</a></li> </ul> <h2>Screenshot</h2> <p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.majordojo.com/2008/11/10/Picture%201.png"><img alt="Enhanced Member Management Screenshot" src="http://www.majordojo.com/assets_c/2008/11/Picture 1-thumb-525x236.png" width="525" height="236" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span></p> </div> </div> <div class="asset-footer"><div class="asset-footer-inner"> <div class="entry-commentcount"><a href="http://www.majordojo.com/projects/movable-type/enhanced-member-listing/#comments">0 <span>Comments</span></a></div> <div class="asset-footer-meta"> <p>Posted by <a href="http://www.majordojo.com/cgi-bin/mt/mt-cp.cgi?__mode=view&id=1&blog_id=3" class="fn url">Byrne</a> on Monday, November 10, 2008 at 10:15 AM</p> <p>Filed in <a href="http://www.majordojo.com/projects/movable-type/enhanced-member-listing/" rel="tag">Enhanced Member Listing</a> </p> </div> </div></div> </div> </div><div class="autopagerize_insert_before"></div> <div class="content-nav"> 1 <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?search=plugins&__mode=tag&IncludeBlogs=3&limit=20&offset=20">2</a> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?search=plugins&__mode=tag&IncludeBlogs=3&limit=20&offset=40">3</a> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?search=plugins&__mode=tag&IncludeBlogs=3&limit=20&offset=60">4</a>  <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?search=plugins&__mode=tag&IncludeBlogs=3&limit=20&offset=20" rel="next" onclick="return swapContent();">Next ></a> </div> </div> <script type="text/javascript"> <!-- var div = document.getElementById('search-results'); var results = { '1': { 'content': div.innerHTML, 'next_url': 'http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?search=plugins&__mode=tag&IncludeBlogs=3&limit=20&offset=20' } }; var timer = window.setTimeout("getResults(" + 1 + ")", 1*1000); //--> </script> </div> </div> <div id="beta"> <div id="beta-inner"> <div class="widget-gallery widget"> <div class="inner"> <h3 class="widget-header">Reading and Watching</h3> <div class="gallery-item-nav"> <a href="javascript:galleryPrev();" id="showcase-prev" class="inactive">Prev</a> <a href="javascript:galleryNext();" id="showcase-next" class="inactive">Next</a> </div> <div class="widget-content"><div class="widget-content-inner"> <div id="gallery-item-1" class="gallery-item" style="display: block;"> <a class="asset-image" href="http://www.amazon.com/Glee-Vol-One-Road-Sectionals/dp/B002AMVEF6%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB002AMVEF6"><img src="http://images.amazon.com/images/P/B002AMVEF6.01._SCLZZZZZZZ_SX120_.jpg" class="asset-img-thumb" alt="Glee, Vol. One: Road to Sectionals" title="Glee, Vol. One: Road to Sectionals" /></a> <h3><a href="http://www.amazon.com/Glee-Vol-One-Road-Sectionals/dp/B002AMVEF6%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB002AMVEF6">Glee, Vol. One: Road to Sectionals</a></h3> <div class="asset-description">Best new show on television. Period.</div> </div> <div id="gallery-item-2" class="gallery-item" > <a class="asset-image" href="http://www.amazon.com/Kings-Season-One-Ian-McShane/dp/B0024FAD88%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0024FAD88"><img src="http://images.amazon.com/images/P/B0024FAD88.01._SCLZZZZZZZ_SX120_.jpg" class="asset-img-thumb" alt="Kings - Season One" title="Kings - Season One" /></a> <h3><a href="http://www.amazon.com/Kings-Season-One-Ian-McShane/dp/B0024FAD88%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0024FAD88">Kings - Season One</a></h3> <div class="asset-description">What in the first 3-4 episodes made me think this could be the next great TV show, the last 6 episodes made me sad for how quickly it turned sour.</div> </div> <div id="gallery-item-3" class="gallery-item" > <a class="asset-image" href="http://www.amazon.com/Weeds-Season-4-Hunter-Parrish/dp/B001AQBGM4%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB001AQBGM4"><img src="http://images.amazon.com/images/P/B001AQBGM4.01._SCLZZZZZZZ_SX120_.jpg" class="asset-img-thumb" alt="Weeds - Season 4" title="Weeds - Season 4" /></a> <h3><a href="http://www.amazon.com/Weeds-Season-4-Hunter-Parrish/dp/B001AQBGM4%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB001AQBGM4">Weeds - Season 4</a></h3> <div class="asset-description">After another season in the 'burbs I was losing interest. Weeds was just getting too dried out and stale. But Season Four really turned the season around for me.</div> </div> <div id="gallery-item-4" class="gallery-item" > <a class="asset-image" href="http://www.amazon.com/Caprica-Eric-Stoltz/dp/B001RTCP1U%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB001RTCP1U"><img src="http://images.amazon.com/images/P/B001RTCP1U.01._SCLZZZZZZZ_SX120_.jpg" class="asset-img-thumb" alt="Caprica" title="Caprica" /></a> <h3><a href="http://www.amazon.com/Caprica-Eric-Stoltz/dp/B001RTCP1U%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB001RTCP1U">Caprica</a></h3> <div class="asset-description">There are things I like, things I don't. The production is excellent though - which is why I will tune in this Fal.</div> </div> <div id="gallery-item-5" class="gallery-item" > <a class="asset-image" href="http://www.amazon.com/Religulous-Bill-Maher/dp/B001MFNB5I%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB001MFNB5I"><img src="http://images.amazon.com/images/P/B001MFNB5I.01._SCLZZZZZZZ_SX120_.jpg" class="asset-img-thumb" alt="Religulous" title="Religulous" /></a> <h3><a href="http://www.amazon.com/Religulous-Bill-Maher/dp/B001MFNB5I%3FSubscriptionId%3D1FNQS2WS91241WGETX82%26tag%3Dmajordojo-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB001MFNB5I">Religulous</a></h3> <div class="asset-description">Yet another documentarian, like Mike Moore, whose ideas I 100% agree with, but whose delivery hurts the message. Everyone should watch this film.</div> </div> </div></div> </div> </div> <script type="text/javascript" charset="utf-8"> // set starting point and ending point -- will show max of 10 images var currentItem = 1; var lastItem = $('.widget-gallery .gallery-item').size(); </script><script type="text/javascript"><!-- google_ad_client = "pub-3972496675721577"; /* 300x250, created 10/4/08 */ google_ad_slot = "3689093583"; google_ad_width = 300; google_ad_height = 250; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br /><br /> <div id="beta-columns-left"> <div class="widget-archive widget-archive-category widget"> <h3 class="widget-header">Categories</h3> <div class="widget-content"> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/aint-it-cool/">Ain't it Cool (65)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/announcements/">Announcements (53)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/blogging/">Blogging (108)</a> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/blogging/movable-type/">Movable Type (100)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/blogging/podcasting/">Podcasting (11)</a> </li> </ul> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/books/">Books (7)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/current-events/">Current Events (65)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/design/">Design (40)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/family/">Family (30)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/food/">Food (1)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/geeky-goodness/">Geeky Goodness (33)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/hodge-podge/" title="Just a bucket for random topics... if a topic keeps reoccuring, I will give it a category, if not, then it will go here.">Hodge Podge (48)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/its-funny-laugh/">It's Funny, Laugh (41)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/links/">Links (31)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/personal-projects/">Personal Projects (54)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/product-management/">Product Management (3)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/science-fiction/">Science Fiction (20)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/technology/">Technology (46)</a> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/technology/open-source/">Open Source (55)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/technology/programming/">Programming (29)</a> </li> </ul> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/television/">Television (23)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/travelogue/">Travelogue (19)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/vegetarian-bbq/">Vegetarian BBQ (3)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/web-services/">Web Services (14)</a> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/web-services/atom/">Atom (12)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/web-services/soapmime/">SOAP-MIME (2)</a> </li> </ul> </li> </ul> </div> </div> <div class="widget-archive-monthly widget-archive widget"> <h3 class="widget-header">Monthly <a href="http://www.majordojo.com/archives.php">Archives</a></h3> <div class="widget-content"> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/09/">September 2010 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/08/">August 2010 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/07/">July 2010 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/06/">June 2010 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/05/">May 2010 (13)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/04/">April 2010 (9)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/03/">March 2010 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/02/">February 2010 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2010/01/">January 2010 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/12/">December 2009 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/11/">November 2009 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/10/">October 2009 (6)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/09/">September 2009 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/08/">August 2009 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/06/">June 2009 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/05/">May 2009 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/04/">April 2009 (9)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/03/">March 2009 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/02/">February 2009 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2009/01/">January 2009 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/12/">December 2008 (6)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/11/">November 2008 (9)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/10/">October 2008 (12)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/09/">September 2008 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/08/">August 2008 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/07/">July 2008 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/06/">June 2008 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/05/">May 2008 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/04/">April 2008 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/03/">March 2008 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/02/">February 2008 (13)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2008/01/">January 2008 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/12/">December 2007 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/11/">November 2007 (29)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/10/">October 2007 (27)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/09/">September 2007 (14)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/08/">August 2007 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/06/">June 2007 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/05/">May 2007 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/04/">April 2007 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/03/">March 2007 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/02/">February 2007 (14)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2007/01/">January 2007 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/12/">December 2006 (13)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/11/">November 2006 (24)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/10/">October 2006 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/08/">August 2006 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/07/">July 2006 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/06/">June 2006 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/05/">May 2006 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/04/">April 2006 (13)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/03/">March 2006 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/02/">February 2006 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2006/01/">January 2006 (13)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/12/">December 2005 (32)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/11/">November 2005 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/10/">October 2005 (10)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/09/">September 2005 (6)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/07/">July 2005 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/06/">June 2005 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/05/">May 2005 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/04/">April 2005 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/03/">March 2005 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/02/">February 2005 (1)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2005/01/">January 2005 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/12/">December 2004 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/11/">November 2004 (10)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/10/">October 2004 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/09/">September 2004 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/08/">August 2004 (6)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/07/">July 2004 (10)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/06/">June 2004 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/05/">May 2004 (8)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/04/">April 2004 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/03/">March 2004 (3)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/02/">February 2004 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2004/01/">January 2004 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/12/">December 2003 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/11/">November 2003 (5)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/10/">October 2003 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/09/">September 2003 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/08/">August 2003 (10)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/07/">July 2003 (7)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/06/">June 2003 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/05/">May 2003 (2)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2003/04/">April 2003 (4)</a></li> <li class="widget-list-item"><a href="http://www.majordojo.com/2000/01/">January 2000 (3)</a></li> </ul> </div> </div> </div><!-- end #beta-columns-left --> <div id="beta-columns-right"> </div><!-- end #beta-columns-right --> </div><!-- end #beta-inner --> </div><!-- end #beta --> </div> </div> <div id="footer"> <div id="footer-inner"> <div id="footer-content"> <div class="widget-archive widget-archive-category widget"> <h3 class="widget-header">Categories</h3> <div class="widget-content"> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/aint-it-cool/">Ain't it Cool (65)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/announcements/">Announcements (53)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/blogging/">Blogging (108)</a> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/blogging/movable-type/">Movable Type (100)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/blogging/podcasting/">Podcasting (11)</a> </li> </ul> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/books/">Books (7)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/current-events/">Current Events (65)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/design/">Design (40)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/family/">Family (30)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/food/">Food (1)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/geeky-goodness/">Geeky Goodness (33)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/hodge-podge/" title="Just a bucket for random topics... if a topic keeps reoccuring, I will give it a category, if not, then it will go here.">Hodge Podge (48)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/its-funny-laugh/">It's Funny, Laugh (41)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/links/">Links (31)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/personal-projects/">Personal Projects (54)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/product-management/">Product Management (3)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/science-fiction/">Science Fiction (20)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/technology/">Technology (46)</a> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/technology/open-source/">Open Source (55)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/technology/programming/">Programming (29)</a> </li> </ul> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/television/">Television (23)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/travelogue/">Travelogue (19)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/vegetarian-bbq/">Vegetarian BBQ (3)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/web-services/">Web Services (14)</a> <ul class="widget-list"> <li class="widget-list-item"><a href="http://www.majordojo.com/web-services/atom/">Atom (12)</a> </li> <li class="widget-list-item"><a href="http://www.majordojo.com/web-services/soapmime/">SOAP-MIME (2)</a> </li> </ul> </li> </ul> </div> </div> <div class="widget-tag-cloud widget"> <h3 class="widget-header">Tags</h3> <div class="widget-content"> <ul class="widget-list"> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=amazon&limit=20">amazon</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=arin&limit=20">arin</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=authentication&limit=20">authentication</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=awesome&limit=20">awesome</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=barak%20obama&limit=20">barak obama</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=battlestar%20galactica&limit=20">battlestar galactica</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=blogging&limit=20">blogging</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=books&limit=20">books</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=bsg&limit=20">bsg</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=byrne&limit=20">byrne</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=community&limit=20">community</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=cool&limit=20">cool</a> </li> <li class="rank-3 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=design&limit=20">design</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=doug%20bowman&limit=20">doug bowman</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=election%202008&limit=20">election 2008</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=family&limit=20">family</a> </li> <li class="rank-4 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=funny&limit=20">funny</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=google&limit=20">google</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=hackathon&limit=20">hackathon</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=hacks&limit=20">hacks</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=harper&limit=20">harper</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=javascript&limit=20">javascript</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=jquery&limit=20">jquery</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=livejournal&limit=20">livejournal</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=media%20manager&limit=20">media manager</a> </li> <li class="rank-1 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=movable%20type&limit=20">movable type</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=mtos&limit=20">mtos</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=music&limit=20">music</a> </li> <li class="rank-5 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=obama&limit=20">obama</a> </li> <li class="rank-3 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=open%20source&limit=20">open source</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=openid&limit=20">openid</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=performance&limit=20">performance</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=perl&limit=20">perl</a> </li> <li class="rank-5 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=personal%20project&limit=20">personal project</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=photo%20gallery&limit=20">photo gallery</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=photography&limit=20">photography</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=php&limit=20">php</a> </li> <li class="rank-3 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=plugins&limit=20">plugins</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=podcast&limit=20">podcast</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=politics&limit=20">politics</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=programming&limit=20">programming</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=protocols&limit=20">protocols</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=six%20apart&limit=20">six apart</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=star%20wars&limit=20">star wars</a> </li> <li class="rank-5 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=television&limit=20">television</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=themes&limit=20">themes</a> </li> <li class="rank-7 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=travel&limit=20">travel</a> </li> <li class="rank-3 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=video&limit=20">video</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=wordpress&limit=20">wordpress</a> </li> <li class="rank-6 widget-list-item"> <a href="http://www.majordojo.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=3&tag=youtube&limit=20">youtube</a> </li> </ul> </div> </div> <div class="widget-about widget"> <h3 class="widget-header">About Me</h3> <div class="widget-content"> Welcome to majordojo, powered by Mid-Century 2.0, a theme developed exclusively for Movable Type and Melody. </div> </div> <div class="widget-pages widget-archive widget"> <div class="widget-content"> <ul class="widget-list pkg"> <li class="widget-list-item first"><a href="http://www.majordojo.com/about.php">About</a></li> <li class="widget-list-item last"><a href="http://www.majordojo.com/projects/">Projects</a></li> </ul> </div> </div> <div class="widget-powered widget"> <div class="widget-content"> Powered by <a href="http://www.movabletype.com/" rel="generator">Movable Type Pro</a> </div> </div> <div class="widget-creative-commons widget"> <div class="widget-content"> <p><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/us/88x31.png" /></a><br />This <span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" rel="dc:type">work</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/">Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License</a>.</p> </div> </div> </div> </div> </div> <script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> var pageTracker = _gat._getTracker("UA-2619105-1"); pageTracker._initData(); pageTracker._trackPageview(<?php if ($_SERVER['SCRIPT_NAME'] == "/404.php") { echo "'/404.php?page=' + document.location.pathname+document.location.search"; }?>); </script> </div> </div> <div id="overlay"></div> <div id="dialog"><div id="dialog-inner"> <div id="dialog-content"></div> <a href="javascript:dialogClose();" id="dialog-close">Close</a> </div></div> </body> </html>