Skip to content

Does any other blogging platform approach WordPress?

This person’s answer is ‘No!’. Looks like someone in the blog platform world has declared that the WordPress community has learned the lessons the Struts community learned a few years ago: If you document an open source system, provide plenty of examples and a supportive community, you can distance yourself from your competitors. Make it easy for the developers (QT) to choose you!

He states:

…the blogging market is c.l.o.s.e.d. – as in no more room, and most importantly, no more competition… [emphasis his]

(Regarding the strength of Struts, as of today, Dice has 1965 jobs matching ‘struts’, versus 176 for ‘rails’, 1481 for ‘spring’ and 493 for ‘JSF’. Now, it’s been a while since I commented on web frameworks, but it’s a pleasant surprise to see Spring approach Struts. Yes, yes, my methodology for documenting the ‘distance’ of Struts from its competitors is somewhat suspect. I don’t have access to book trends data, and what I can find doesn’t break things down to the framework level. Thanks for caring.)

However, Spring looks to be on the rise; even the most popular packages and/or platforms can fall from popularity. Especially in technology, where “new” is often a feature. Hence, I disagree with the statement that WordPress has locked down the blogging application market. My point is not argued from a knowledge of WordPress, but rather a knowledge of technology and tech trends.

Via sogrady.

[tags]wordpress[/tags]

Article on web searching techniques

Searching the web is a crucial skill nowadays. I have tech friends who don’t buy technology books anymore because the quality of content for developers is so high. I still buy the occasional book documenting technology, but I also spend a lot of time searching the web for answers to tech questions. (Still using Google, though I’ve tried Yahoo! and IceRocket). One of the reaons I write this blog is to document answers I’ve found; another is to try to provide answers for others.

In that vein, here’s a great post on advanced Internet searching techniques. These tips seem especially useful when searching for terms that might be obnubilated (there’s my 5 dollar word for the day!) by ecommerce sites.

[tags]oblique search techniques[/tags]

XHR Data Caching and the Dojo Offline Toolkit

I’ve found caching JSON to be very useful when writing GWT components. Basically, the XMLHttpRequest will go to the browser cache first, and if the data is (relatively) static, you can direct the browser to cache it. More about caching in this post. If the browser hasn’t seen that url before, it will get it from the server. Using some kind of rewrite tool to make sure the data page looks like a normal HTML page tends to be good form.

But the Dojo Offline Toolkit promises to take things to a whole new level. It’ll be interesting if he succeeds. I took a look at his milestone list, and there are a number of ‘Figure Out’ steps, as you’d expect with something this ambitious and new. Well worth looking at if you write web applications of any kind.

[tags]data caching,dojo,offline web applications[/tags]

Adding a tabview to an existing application with the YUI library

I recently built a small web application and the client requested, after a significant portion was built, that it be placed in different tabs. I immediately thought of the Yahoo! User Interface Library, which is a set of independent components “for building interactive web applications.”

I just wanted the TabView component, which is easy to just drop in and has pretty good documentation. This component is new in the 0.12 version of the YUI library.

However, FireFox 1.5 had an issue with the pages once the component was added. The different tabs would show up, but the bodies were all visible at the same time. IE6 did not have that issue, bizarrely enough. I asked some questions on the mailing list and received some helpful answers–the main things I needed to do were add the component instantiation function to the onload method of the window, and make my HTML valid. I used the W3C validator for the latter.

This post is pretty short, and I guess that’s the point–adding tabs to an existing application was pretty easy using the Yahoo! libraries.

Using the YUI library was simple and the support and documentation were good. I don’t like to think of how long it would have taken me to write a tab interface supported on so many browsers. If you need to retrofit some UI magic onto an existing application, or you just want discrete components for your web application (as opposed to the all in one approach of GWT), YUI is well worth a look.

[tags]YUI,web applications[/tags]

Social networking paper on First Monday

There’s a fantastic paper up on First Monday, an online journal I’ve written about before, “Friends, friendsters, and top 8: Writing community into being on social network sites”. It’s an interesting look at how social networking sites affect and are affected by their users. I’ve touch on this before in “Will you be my Friendster”.

Some interesting quotes from the paper:

Investigating Friendship in LiveJournal, Kate Raynes-Goldie and Fono (2005) found that there was tremendous inconsistency in why people Friended others. They primarily found that Friendship stood for: content, offline facilitator, online community, trust, courtesy, declaration, or nothing.

Or nothing! I wonder if this applies to business networking sites such as Linked In?

Talking about the early users:

Much to the chagrin of the developers, the early adopters of Friendster framed the social norms, not the system’s designers. Taking advantage of the technological affordances, early adopters used the site to meet their needs. In turn, because of the networked structure of Friendster, they passed on their norms to their friends. Their Profiles signaled what type of people belonged and their communication practices conveyed what types of behavior one could expect.

See Social Software and the Politics of Groups for more on how groups bend social software as they wish.

And from the conclusion:

Part of what makes the negotiation of Friendship on social network sites tricky is that it’s deeply connected to participant’s offline social life. Their choice of Friends online is not a set of arbitrary personal decisions; each choice has the potential to complicate relationships with friends, colleagues, schoolmates, and lovers. Social network sites are not digital spaces disconnected from other social venues — it is a modeling of one aspect of participants’ social worlds and that model is evaluated in other social contexts. In thinking about Friendship practices on social network sites, it is crucial to evaluate them on their own terms, recognizing the role of technology and social navigation rather than simply viewing them as an extension of offline friendship.

The paper is long but well worth a read.

[tags]social networks, friendster,myspace[/tags]

Browser Caching

It depends on how your website/web application is used, but browser caching can give you fantastic performance increases for very little effort. Especially with a database driven site that is primarily read-only (many ecommerce sites), proper browser caching can decrease the number of pages you serve per user, which in turn increases the number of users supportable by a given set of hardware.

I found this caching tutorial to be very helpful in understanding just how to cache pages, as well as RFC 2616, which states in section 13.2.4 that the Cache-control: max-age header takes precedence over the Expires header (for the browsers who speak HTTP 1.1). This examination of the support of various browsers is also excellent reading. There’s also a cool tool called the Cacheability Engine which examines caching behavior of web pages, if you don’t want to look at the headers yourself (using Fiddler or LiveHTTPHeaders). I encountered occasional errors with the engine, but it was pretty neat to use.

[tags]browser caching[/tags]

GWT Internet Explorer quirks

I am building another GWT component and ran across two IE quirks that I would like to share.

1. Multiple modules on one page: I could not find a way to have two GWT modules on the same page–that is, having two gwt:module meta tags on one page. (Having two on one page works fine in FireFox, as long as gwt.js is only included once.) Instead, I followed the advice in this post, and created a hybrid module that inherited from both modules I wanted to display. In the two modules I was inheriting from, I simply check to see if a span is available to put the module’s UI in. (Don’t forget that inheritance is defined differently for GWT than for a typical programming language.)

2. Cookie size limits: Cookies set by GWT have limit in size in IE. Again, I didn’t see the same behavior with FF1.5, but IE 6.00.29 has a limit of 802 characters in the value portion of a cookie. (The name I was using was 5 characters long.) Longer values can be set, and are sent to the server, but I could not find a way to read cookies with a length longer than 802. I didn’t drop down into JSNI because I looked at the Cookies source code and couldn’t see what I’d do different.

Update Dec 5 2006: I was trying to nail this down to submit a bug report to Google, but saw some really weird behavior with IE’s cookies. It seemed to handle a cookie longer than 802, then it seemed to not handle such a cookie, and now it is handling a cookie with value length of 1202. See this page for an example. The first two cookies have a length of 802, the second two have a length of 1202. Weird!

[tags]cookies,GWT, Google Web Toolkit, Internet Explorer, multiple modules[/tags]

Uploading a file in php using an iframe

I recently wrote a PHP file upload application. Yawn, right? There’s a manual entry on this task, which tells you just how often folks need to do it.

Well, I threw in a few new tricks–they were new to me at least. Basically, instead of posting to a page in the typical way, I post to a 1px by 1px invisible iframe, which then generates some javacript:

<form action="/upload.php" enctype="multipart/form-data"
method="post" target="target_upload">
<iframe id="target_upload" name="target_upload"
style="border: 0pt none ; width: 1px; height: 1px">

———–

<script type="text/javascript">
if (parent && parent.uploadFinished) {
parent.uploadFinished(<?php echo $result;?>);
} </script>

The next question is how to communicate from the iframe, which is handling the processing, to the parent window, which is where the user interface is. The upload process parses the file and puts it in a database. If there are any errors, the parsing code ouptuts “0”, otherwise, it returns “1”. This value is passed to a javascript function which is written to the iframe. It looks something like the above, where the uploadFinished function basicly shows divs containing an appropriate message.

How is this superior from a regular page post? Not by very much. It’s not truly asynchronous–you still see the browser wheel spin. The only browser actions you can take while an upload is proceeding are those that open in a new window. That’s not much, but it’s more than a normal post allows you to do. In addition, this is relatively easy to do and you don’t have to deal with creating a new ‘successful upload page’.

[tags]PHP, file upload[/tags]