Feb 26

I happily received my invitation to the Instagram API developer's party the other day, and have since carved a few moments to give it a once-over.  Sadly, there is no shrink-wrapped PHP class or port - only Python and Ruby.  Ruby is a foreign language to me, and Python is not an altogether foreign language, but at least a dialect that I'm not completely at home with.  It's unfortunate that PHP wasn't considered as part of the initial API release, and seems more unfortunate in that one enterprising individual released a PHP Instagram API prior even to the Instagram team doing so themselves.  Unfortunately, it seems that the author has been blackballed by the Instagram team to some degree, his API rendered "rogue", and future of his efforts left uncertain.

I'm determined to wait and see how things shake out.  Soon enough, I predict that an official port of the API will be available in PHP.  I only hope that in doing so, consideration is made for making it fully portable with no secondary dependencies (PEAR comes to mind) outside of the core PHP - it should be supremely simple, like any good PHP app is.  For now, I'll poke around a bit at the Python package, and forgo and real work towards an S9Y module.

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Feb 21

A need has recently arisen which has sent me on a mission to explore the vast sea of directory listing scripts that are floating about.  I'd briefly considered writing my own from scratch, and possibly do so as an S9Y plugin, and I may still do so one day.  If done, I'm envisioning a pop-up panel in jQuery which, passed the appropriate directory as a variable, would give a tidy tabular listing of available files for download.  An option would include a sidebar panel which included a select list of available indexed directories, where when selected, the links to the files contained would be displayed in the sidebar panel.

But alas, there are many off-the-shelf options available, and I've far too many priorities at the moment to trouble myself with such an effort.  My search for the simplest, most functional directory listing script landed on Greg Johnson's "PHPDL" or "PHP Directory Lister" script.  Of all that I looked at, Greg's was the best marriage of function, simplicity, and lightness of weight.  Completely self-contained, index.php delivers not only the UI framework and backend PHP directory reader, but all of the supporting collateral as well.  This is to say that various icons and images used throughout the script are stored as binary encodings within, as are the javascript libraries, and so on.  Not many folks use this approach (I've done this only a time or two), which is unfortunate as it makes for cleanliness and supreme portability.

I did, naturally, feel compelled to make one or two (or three) minor changes.  These include:

  • Re-theme to compliment the i3theme of the site.
  • Add sorting via jQuery.TinySort.
  • Prevent indexing of .htaccess.

The re-theme was fairly straight forward, mainly adjusting colors, and the usual.  However, in keeping with the i3theme's rounded corners look, and the script's incorporation of all image collateral within the body of the script itself, I pulled the top and bottom (image) borders out of i3theme, base64 encoded them, and included them within the body of the script.

Adding table sorting via jQuery.TinySort was straight forward as well.  As Greg includes jQuery already within the script, it was only a matter of packing TinySort, then base64 encoding it for a reduction of 1300 characters, and from 127 lines to only one.

Preventing the indexing of .htaccess was a simple hack within the body of the script where it already evaluates exclusions such as the script itself and references to the parent directory.

The styling could use some further tidying up - I was mostly going for quick and dirty, and am quite sure that I've left some irrelevant CSS in place...perhaps a project for another rainy day.  In the meantime, I've left all of the original credits in place, and put the work I've done here.  Look for phpdl-i3themed.zip.

phpdl-i3themed

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Jan 31

I spent a few minutes this evening working out the problem of why my mobile blogging apps refuse to display my category information, and am happy to report that I've resolved the issue.

At some point, I'd written about this before, and back-burnered the issue for more pressing matters.  I figured it was due time to put the problem to rest, so did a bit of digging.  In the end, the solution proved a simple one, though a little perplexing to someone (me) who doesn't have a very firm grasp of the various XMLRPC API floating about.

First a little background:
In BlogWriter, there were always as many blank category list items as there were categories (so I knew it was getting somewhere), and in BlogPress, the app would just crash when trying to fetch the categories.  Meanwhile, DeepestSender for Firefox did everything it was supposed to do.

Narrowing the problem space:
I narrowed the problem down to the metaWeblog_getCategories function in serendipity_xmlrpc.inc.php (this can be found in the plugins/serendipity_event_xmlrpc directory).  Look at, or around, line 182.

The solution:
Changing 'description' to 'categoryName' does the trick for both BlogWriter and BlogPress - however it does break DeepestSender. No telling what other desktop authoring apps this change would break, but it fixes the mobile apps, and that's all I personally care about.

    foreach ((array) $cats as $cat ) {
        if ($cat['categoryid']) $xml_entries_vals[] = new XML_RPC_Value(
            array(
//              'description'   => new XML_RPC_Value($cat['category_name'], 'string'),
//  PigsLipstick: change 'description' to 'categoryName' to support mobile publishing
              'categoryName'   => new XML_RPC_Value($cat['category_name'], 'string'),
              'htmlUrl'       => new XML_RPC_Value(serendipity_categoryURL($cat, 'serendipityHTTPPath'), 'string'),
              'rssUrl'        => new XML_RPC_Value(serendipity_feedCategoryURL($cat, 'serendipityHTTPPath'), 'string')
            ),
            'struct'
        );
    }

The results:
BlogWriter for iPhone is now treating me quite well.  I can author, assign categories, and publish with no problem.  Sadly, the richer BlogPress app still falls short by failing to publish...categories function now (without crashing the app), but a new article will only get as far as draft mode.

//  PigsLipstick: change 'description' to 'categoryName' to support mobile publishing

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Nov 23

I've put a small update into the TinyBrowser FTP Uploader - this change addresses problems with spaces in file names by replacing them with underscores.  This is standard behavior of the traditional HTTP/Flash file upload process in TinyBrowser and was an unfortunate omission in my initial release of the FTP Uploader.

The updated version can be found here.

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Nov 22

I'm posting here the results of a little project I've busied myself with recently.  This is the product of so much frustration that I've dealt with while using TinyBrowser as both a plugin from Tiny MCE, and as a stand-alone plugin within S9Y. 

Like so many others, a troll of the web reveals a certain theme around the unreliability of Flash-based uploaders in Mozilla (Firefox) is all too evident.  While reliable when not crossing domains, and used from any non-Mozilla browser, consistently when using my browser of choice (Firefox), TinyBrowser's Flash uploader gave nothing but grief as it threw irrelevant and undeserved permissions errors.  The exact text of this message reads "File upload failed - please check your permissions for <some directory> and also your php.ini settings."  Now, it would seem from as many posts in complaint of this problem, the number of claims that this problem can be easily fixed are significant.  However, what is not evident, is precisely what this claimed fix entails.  I'd like to be proven otherwise, but am of the belief that the "fix" is only to disable TinyBrowser session control and security - now this is no fix at all as we all know that the unscrupulous can crawl directories to launch TinyBrowser in stand-alone if session control is disabled (and no other alternate measures have been taken).

So, after careful consideration, I decided the best possible approach was a move away from HTTP upload and Flash uploader front-ends altogether, and a fallback to tried-and-true FTP.  Simple, fast, resilient, and secure, FTP remains my favorite transfer medium, and it lends itself well as a nicely-integrated add-on to TinyBrowser.

At a high level, this add-on implements with minimal change to the existing upload.php file within the TinyBrowser install directory.  Altogether, it is the removal of one existing line, and the addition of four new lines in the same spot (optionally, a line at the top, and bottom of the same file may be necessary depending on the environment).  All new functionality is self-contained in one new file (upload_ftp.php).  Included within upload_ftp.php are the UI, the file transfer logic, and the encryption logic used to protect an optional cookie...even the animation indicating upload-in-progress is stored within the file itself.  The only additional configuration setting is the encryption key within the file itself.

The UI offers file selection via the native file system browse functionality - reliable and secure.  Other fields include FTP login name, password, server name, and path.  In this case, "path" should denote the path needed in order to reach the web site's root directory from wherever FTP logs in given the login name and password used.  An option is given to save credentials (name, password, server name, and path) - credentials are encrypted using PHP mcrypt and the Rijndael 256 cipher.

A link to the TinyBrowser FTP Upload Add-On can be found here.

A screenshot of the UI can be found here:

TinyBrowser FTP Upload Add-On

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Oct 9

On a whim, I commenced with a short hunt for TinyMCE themes/skins - just to see if there was something new and exciting laying about, or something that I had not spotted prior.  To my delight, I found the Cirkuit Skin skin for TinyMCE.  It compliments the updated theme of the S9Y admin interface nicely, and makes use of my favorite Silk Icon set by FamFamFam.  I've included a couple of screen caps below which illustrate the default TinyMCE skin, the standard alternate (o2k7), and cirkuit.net's Cirkuit Skin.

TinyMCE Default Skin TinyMCE o2k7 Skin TinyMCE Cirkuit Skin

Briefly, how do we set the TinyMCE skin in S9Y (same principle applies across any implementation of TinyMCE)?  In our serendipity_event_tinymce.php file where we invoke the editor and pass in all configurables, we simply set the init parameter "skin : cirkuit".  A little extract from my init options:

        theme
            : "advanced",
        skin
            : "cirkuit",
        height
            : "500",

Pretty easy, pretty buttons, pretty S9Y admin UI...

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Sep 28

I'm testing the updated Twitter plugin for S9Y which has been rebuilt to play nicely with Twitter's new OAuth enforcement.  Where web-apps like S9Y were able to push tweets to post via basic auth.  In August, the 31st to be exact, Twitter found it prudent to tighten their overarching security model, effectively removing the responsibility and inherent risk of storing credentials within the app, by way of letting authentication occur centrally and extending trust to the third party app through a key exchange.  My first reaction - shouldn't Twitter be focusing first on continuity (i.e.: killing off the Fail Whale) before investing elsewhere, such as on authentication - even so, it's hard to discredit the merits of promoting security first and foremost.

I've implemented this latest plugin leveraging injected template variables to achieve a tighter look and feel.  I'm taking advantage of the "Smartify TweetThis Functionality" and "Show Short URL for Each Article" options in the plugin config, which in turn gives access to the "entries.url_tweetthis" and "entires.url_shorturl" in entries.tpl as such:

<p class="submeta">
    {$CONST.POSTED_BY} <a href="{$entry.link_author}">{$entry.author}</a>
    {if $entry.is_entry_owner and not $is_preview}&bull; <a href="{$entry.link_edit}">{$CONST.EDIT_ENTRY}</a>{/if}
    {if $smarty.get.view == 'wide'}&bull; <a href="javascript:window.history.back();">Go slim</a>{else}&bull; <a href="{$entry.link}&view=wide">Go  w.i.d.e</a>{/if}
    {if $entry.url_tweetthis}&bull; <a href="{$entry.url_tweetthis}" target="_new">Tweet Me</a>{/if}
    {if $entry.url_shorturl}&bull; <a href="#" onClick="prompt('Copy this short URL to link to this article directly:','{$entry.url_shorturl}')">Short URL</a>{/if}
</p>

For a final visual effect illustrated here - this example shows the discrete "Tweet Me" link and "Short URL" link with invokes simple popup providing the URL:

Templatized S9Y Twitter Plugin & Short URL Popup

A thanks goes out to Garvin and any others who were involved with this project - it all sounds simple enough on the surface, but looks rather complex under the covers.

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Aug 29

Anyone for breadcrumbs in the i3theme for S9Y?  I've missed from time to time the inclusion of a breadcrumb trail (that list of pages visited as one traverses as site and drills down into topics) as I've navigated my own site.  It's not a big pain point, but one which seemed easily remedied and worth a quick look.

I started to look for an S9Y theme with breadcrumbs already incorporated, hoping to leverage work already done.  In fact, a quick search led me to Carl Galloway's site and an article he wrote containing a breadcrumb framework in convenient Smarty template format.  So, credit for my work goes to Carl for providing the basis.

Most notably, what my revision does differently is that it gives the full path to the article even when navigated to directly.  We could argue that the true intent of the breadcrumb trail is to illustrate the exact path from start to finish, but my preference is to illustrate the relative path, which is how I chose to implement it.  In other words, as one navigates from Home to Category to Article, the breadcrumb builds a clickable patch as such (three layers deep).  Likewise, if the user navigates from Home directly to Article, my implementation gives the intermediary Category to illustrate the relative path to the article...seems to make more sense to me from a usability standpoint.

Here is the code block contained within index.tpl plugged into the "nav" div - I've removed insets to make it more compact:

<div id="nav">
    <ul>
{foreach from=$navlinks item="navlink" name=navbar}
       <li{if $currpage==$navlink.href} class="current_page_item"{/if}><a href="{$navlink.href}" title="{$navlink.title}">{$navlink.title}</a></li>
{/foreach}
    </ul>

   <!-- START BREADCRUMB -->
   <div style="padding:0 6px 0 0;text-align:right">
       <a href="{$serendipityBaseURL}" title="{$blogTitle}">{$CONST.HOMEPAGE}</a>
       {if $head_title && !$entry.title | $head_title != $entry.title}
           {if $entry.title}
               &raquo; <a href="{$category.category_link}" title="{$category_info.category_description}">{$category_info.category_name}</a>
           {/if}
       {elseif $head_title && $entry.title}
           {if $category_info.category_name}
               &raquo; <a href="{$category.category_link}" title="{$category_info.category_description}">{$category_info.category_name}</a>
           {/if}
           {if $entry.title == $head_title}
               &raquo; <a href="{$entry_category.category_link}" title="{$entry_category.category_name}">{$entry_category.category_name}</a> &raquo; <a href="{$entry.entry_link}" title="{$entry.title}">{$entry.title|truncate:30:" ...":true}</a>
           {/if}
       {elseif $head_subtitle}
           &raquo; {$head_subtitle}
       {/if}
       {if $staticpage_pagetitle && !$entry.title}
           &raquo; {$staticpage_headline}
       {/if}
   </div>
   <!-- END BREADCRUMB -->

</div><!-- /#nav -->

And a screenshot to illustrate - you see the breadcrumb trail in the nav header area of the main content panel (right-justified):

Breadcrumbs in i3theme

As of this writing, I've not yet implemented this - I'm still trying to decide if I want the additional clutter or not...

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Aug 17

A continuation from the previous blog dev post, I'm working toward a threaded comments model that I'm trying in real-time now.  Screen shots of the current appearance below as I'm sure it will change in due time.  I'm not posting a build, as yet, due to reservations around the fundamental approach.  The query which allows fetching the last-n comments per the last-n blog entries, aggregating by entry, and displaying in descending order by the last entry/comment grouping per the last comment made, and so on, is terribly complex.  The fear is that this complex query won't play well against databases that S9Y supports but don't feel like testing.

So, based on input from the community, I may back up and exercise a completely different strategy toward threading to both simplify the query, as well as to ease the UI development to give a more standardized threading view.

Here is the query for the sake of preservation and illustration (and for those who would like to give it a try (note there is one bit missing, a variable called "$viewtype" - this was done so that I could isolate all current changes to the query alone):

$q = '     SELECT    c1.id               AS comment_id,
                     c1.entry_id         AS comment_eid,
                     c1.timestamp        AS stamp,
                     c1.author           AS user,
                     c1.email            AS comment_email,
                     c1.type             AS comment_type,
                     c1.title            AS comment_title,
                     c1.body             AS comment,
                     c1.url              AS comment_url,
                     e1.id               AS entry_id,
                     e1.timestamp        AS entrystamp,
                     e1.title            AS subject
             FROM    ' . $serendipity['dbPrefix'] . 'comments AS c1
       INNER JOIN    ' . $serendipity['dbPrefix'] . 'entries AS e1 ON e1.id = c1.entry_id
       INNER JOIN    (SELECT    c2.entry_id, MAX(c2.id) as maxid
                        FROM    ' . $serendipity['dbPrefix'] . 'comments AS c2
                    GROUP BY    c2.entry_id
                    ORDER BY    c2.id DESC
                       LIMIT    5) AS maxs ON maxs.entry_id = e1.id
            WHERE    (SELECT    COUNT(c2.id)
                        FROM    ' . $serendipity['dbPrefix'] . 'comments AS c2
                       WHERE    c2.entry_id = e1.id
                         AND    c2.id >= c1.id) <= 3
              AND    NOT (c1.type = \'TRACKBACK\' AND c1.author = \'' . serendipity_db_escape_string($serendipity['blogTitle']) . '\' AND c1.title != \'\')
              AND    e1.isdraft = \'false\'
              AND    c1.status = \'approved\'
         ORDER BY    maxs.maxid DESC, e1.id DESC, c1.id DESC';

And the screen shots illustrating basic aggregation (last comment in last-N blog entries), vs threading (last-N comments in last-N blog entries):

Aggregated CommentsThreaded Comments

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Aug 8

How to add the selective font color palette to the TinyMCE toolbar in S9Y? 

In the S9Y TinyMCE plugin config, add the TinyMCE plugin "forecolor" into the buttonbar of your choice.


Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Aug 8

I've decided that I will take a two phase approach to updating the S9Y Comments plugin, starting first with an option to aggregate comments by post.  Phase two will endeavor to thread comments.

Aggregation: the simpler of the two options, aggregation will eliminate linear nature of the default Comments plugin by providing only the last comment posted for each blog post containing comments, up to the configurable limit.

Threading: more complex, primarily from a presentation point of view, threaded comments will provide the last comment posted, plus a certain number of prior comments inset under the last comment posted.  Again the total number of comment "blocks" will be configurable, as will the sub-comments within each block.

I've completed a proof of concept for aggregation and implemented on the site effective immediately, and have made it available here.  This introduces the new Comments configuration option "Format" which can be set to Linear (default behavior), or Aggregate (the new aggregation behavior).

There may be some SQL tuning in a follow-on release, but am happy with the fundamental results so far.

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Aug 4

I've implemented the S9Y Comments plugin.  I feel that at nearly 300 posts now, and where much of the activity occuring on older posts, that active posts based on comment activity are going unrecognized.  Therefore, conditions seem to necessitate a comments block in the sidebar.

That said, I'm not completely satisfied with the Comments plugin - I'm finding it to be very linear.  In other words, all comments (up to a configurable limit) appear in reverse chronological order such that any recent post with multiple comments dominates the list.  This will require some thought - it's been ages since I've done any appreciable S9Y development, and I think it's due time Cool

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Apr 28

In this article, on integrating the AdvImage plugin for TinyMCE with S9Y, I received an inquiry on setting the "Alternative image" checkbox state to "Checked" by default.  I remember looking into this, perhaps spending a little time struggling with the how's and why's around defaulting the state of "Alternative image", and either determining that it wasn't important enough to spend time on, or sidelining it for other more pressing concerns.

When Kenan commented on it, I decided it was due time to have another crack at the problem.  The area of concentration is the object ID "onmousemovecheck" checkbox (labeled "Alternative image") on the Advanced tab "insert/edit image" panel as part of the AdvImage plugin for TinyMCE.  The problem is how to get the checkbox to default its state to Checked, and to make the associated behaviors fall into place (i.e.: the "for mouse over", "for mouse out", "for mouse click" fields go into an enabled state).

In summary, the addition of two lines in advimage's image.js file are all that it is necessary.  There may be a slightly more elegant, perhaps more crafty way of going about this to support parameterization, but the following is functional and not terribly hard to implement...

In tiny_mce/plugins/advimage/js/image.js insert the two new lines below (approx line 95):

        else
            this.setSwapImage(false);

        // Default Advanced tab > Alternative Image option to Checked // PigsLipstick enh
        f.onmousemovecheck.checked = true;
        this.setSwapImage(true);

        this.changeAppearance();
        this.showPreviewImage(nl.src.value, 1);
    },

That is all Smile

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Apr 10

Been thinking again, as need necessitates, that a File Vault could be built under S9Y using TinyBrowser as the framework.  This would be remarkably easy to achieve outside of TinyBrowser (using the S9Y media library UI and backend functionality) - in fact, most of the heavy lifting has already been done in Version 1 of PigsLipstick.  Building a media/file upload and encryption module was one of the greatest accomplishments of the old Cafuego SBS-based site.

So, for the effort I've invested, the fact that rolling back/returning functionality to the standard S9Y Media Library would be challenging, and as I'm committed to TinyBrowser as a now integral part of S9Y and prefer it that way, I've studied a bit the feasibility of adding a file encryption feature into TinyBrowser.

The first apparent complication is that TinyBrowser is database independent.  There are a couple of methodologies around encrypted file storage that make this a primary, or only a secondary concern. 

Addressing the former, the encryption algorithm is of course chosen by the developer for all the proper and obvious reasons.  It is salted by way of a static admin-chosen variable.  So far, no database needed - all of this information can be harmlessly stored in files.  Now, for each file uploaded, the user assigns a password of their choice - the file is encrypted and the password stored with relevant reference to the file in a database table.  Given the proper credentials, the user authenticates with the site and may then retrieve the file clear of having to resupply the (likely forgotten) password used for encryption.

Addressing the latter, all the same holds true right up to the point following encryption at upload time.  Now, instead of the supplied password finding its way into a database, the responsibility falls back to the user to remember the password and supply it for each file requested, whenever it is requested.  This becomes nightmarish from a usability perspective, and for the obvious risks around forgetting the password (thus locking the file for eternity), but presents inherent advantages in overall security by moving password storage off-site altogether (and probably onto a Post-It stuck to the bottom of the user's keyboard Tongue out).

Complication #2 - the multi-file upload facility within TinyBrowser leverages Flex.  Despite the many requests I've stumbled across via Google, nobody seems to know where the source for this compiled Flex file lives.  How does this impact the project?  To do it right, we should endeavor to encrypt at, or as close to upload-time as possible.  In PigsLipstick Rev1, using a traditional Javascript/PHP-based file upload, this meant browsing for the file, supplying the password, executing the upload.  Under the covers, the file lands in a temp directory outside of the site where the magic PHP file encryption occurs, the original file removed, and the now-encrypted version moved into the target in-site directory.  Looking at some options around jQuery or YUI-based AJAX file uploading, it's apparent that most of the richer ones still use a Flex component, but are more open in framework than what has been integrated into TinyBrowser.  Still, this extends the project even more dramatically.  Next option - built encryption into a TinyBrowser "edit" option for use post-upload.  In terms of extending TinyBrowser, this actually appears to be relatively easy, especially if building it sans database.

Where does this leave us?  Well, for some dabbling to first vet the concept, then evaluating the effort, and finally considering the extent to which TinyBrowser would need to be hacked into to support encryption, and without yet even considering implications around decryption, I'm just not sure that there is value in the effort in context of my needs.  I'm happy to have more theoretical discussion if anybody ever takes the notion (and happens upon this article).  I'd even contribute what I've worked through thus far, but for now, I think I will look for a file-vault-in-a-box solution that serves the need and requires little more than installation and configuration.  Stay tuned, I've got my eye on one already...

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

Apr 1

I try not to get hung up on the site stats - it's not like my posts constitute public service announcements, but it's nice to keep pulse on what's driving visitation, from where, browsers in use, and overall traffic.

Wrapping up the first quarter of 2010, the site continues an upward trend in both unique visitors and page views.  Hits are trending downward, but bandwidth consumed is increasing month over month.

Search terms related to the Acer Revo R1600 project and jqgrid topics continue to be drivers to the site (ah, how I miss dabbling in jQuery and Tony Tomov's super-cool jqGrid)

There is little doubt that content and regular updates drives traffic - this is obvious as I slack on publishing, then catch up with back-posts.  This never fails to create dips and spikes in the traffic patterns.

A couple of minor points of interest - the Google search term "PigsLipstick.com" now finds references to the site via Twitter (see my previous post - it's worth the effort to secure a Twitter ID synonymous with your domain name for just this traffic-building reason), the S9Y forum, WikiAnswers (where I am now a registered contrtributor), Sourceforge (where I'm a contributor to the S9Y project), and the latest - a nice link at the Memengo site referencing my review of their PIM app for the iPhone.

Posted by Adam KrauseGo w.i.d.eTweet MeShort URL

(Page 1 of 4, totaling 50 entries)


Strict Standards: Declaration of serendipity_event_s9ymarkup::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_s9ymarkup/serendipity_event_s9ymarkup.php on line 146

Strict Standards: Declaration of serendipity_event_s9ymarkup::uninstall() should be compatible with serendipity_plugin::uninstall(&$propbag) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_s9ymarkup/serendipity_event_s9ymarkup.php on line 146

Strict Standards: Declaration of serendipity_event_emoticate::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_emoticate/serendipity_event_emoticate.php on line 204

Strict Standards: Declaration of serendipity_event_emoticate::uninstall() should be compatible with serendipity_plugin::uninstall(&$propbag) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_emoticate/serendipity_event_emoticate.php on line 204

Strict Standards: Declaration of serendipity_event_nl2br::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_nl2br/serendipity_event_nl2br.php on line 395

Strict Standards: Declaration of serendipity_event_nl2br::uninstall() should be compatible with serendipity_plugin::uninstall(&$propbag) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_nl2br/serendipity_event_nl2br.php on line 395

Strict Standards: Declaration of serendipity_event_browsercompatibility::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_browsercompatibility/serendipity_event_browsercompatibility.php on line 80

Strict Standards: Declaration of serendipity_event_spartacus::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_spartacus/serendipity_event_spartacus.php on line 1183

Strict Standards: Declaration of serendipity_event_imageselectorplus::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_imageselectorplus/serendipity_event_imageselectorplus.php on line 1105

Strict Standards: Declaration of serendipity_event_imageselectorplus::uninstall() should be compatible with serendipity_plugin::uninstall(&$propbag) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_imageselectorplus/serendipity_event_imageselectorplus.php on line 1105

Strict Standards: Declaration of serendipity_event_sidebarlogin::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_plugin_sidebarlogin/serendipity_event_sidebarlogin.php on line 148

Strict Standards: Declaration of serendipity_event_popfetcher::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_popfetcher/serendipity_event_popfetcher.php on line 1426

Strict Standards: Declaration of serendipity_event_lightbox::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_lightbox/serendipity_event_lightbox.php on line 281

Strict Standards: Declaration of serendipity_event_lightbox::uninstall() should be compatible with serendipity_plugin::uninstall(&$propbag) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_lightbox/serendipity_event_lightbox.php on line 281

Strict Standards: Declaration of serendipity_event_tinymce::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_tinymce/serendipity_event_tinymce.php on line 291

Strict Standards: Declaration of serendipity_event_tinybrowser::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_tinybrowser/serendipity_event_tinybrowser.php on line 150

Strict Standards: Declaration of serendipity_event_prettify::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_prettify/serendipity_event_prettify.php on line 245

Strict Standards: Declaration of serendipity_event_xmlrpc::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_xmlrpc/serendipity_event_xmlrpc.php on line 160

Strict Standards: Declaration of serendipity_event_podcast::event_hook() should be compatible with serendipity_event::event_hook($event, &$bag, &$eventData, $addData = NULL) in /home1/pigslips/public_html/s9y/plugins/serendipity_event_podcast/serendipity_event_podcast.php on line 939

Strict Standards: Non-static method TwitterPluginFileAccess::get_permaplugin_path() should not be called statically, assuming $this from incompatible context in /home1/pigslips/public_html/s9y/plugins/serendipity_plugin_twitter/serendipity_event_twitter.php on line 1554

Strict Standards: Non-static method TwitterPluginDbAccess::load_short_urls() should not be called statically, assuming $this from incompatible context in /home1/pigslips/public_html/s9y/plugins/serendipity_plugin_twitter/serendipity_event_twitter.php on line 1518