
There are certainly have challenges involved in sending millions of pages to hundreds of thousands of regular users. Mainland China blocked us, sometimes there are net hiccups, servers crash, etc. But at least we don’t need to deal with having to close up shop because the ship carrying all of our inventory ran aground off of Alaska’s coast.

PBwiki has now unveiled the new Point-And-Click editor, and it’s coming along nicely. Although there are still a few formatting snags, I have yet to see a web-based rich-text editor not go through a few growing pains (I’m still mad enough at Wordpress’s editor for eating up my code last time that I wrote this entire post in HTML).
But rich-text has its place, and the new editor has many innovative things going for it, like the ease with which you can insert media and files. But of all these innovations, probably the most powerful is the plugin system, which allows you to extend your wiki in all kinds of fun ways. Read the rest of this entry »
I interviewed Chih-Chao Lam, who runs clipclip.pbwiki.com, to understand how his team uses the wiki — and how they got it to look so beautiful.
Your wiki is gorgeous. How’d you do that?
We wanted it to be community-focused, and we wanted to mesh it with our own web site (http://clipclip.org), so we wanted to make it look consistent. It took our designer maybe a day’s effort.
How do you think has PBwiki helped you succeed?
Because we’re so distributed and we work in such an ad hoc fashion, it’s a great collaboration tool. It’s a great communication tool. It’s a great way to get everyone on the same page.

To be a featured case study on PBwiki, email ramit@pbwiki.com
-Ramit Sethi, PBwiki co-founder

Addition: 9:44pm, January 9, 2007
I address some of the changes to the wikilets below (click here).
Wikilets, or PBwiki pages embedded in other webpages (PBwiki or otherwise), have been around for a while, and although the feature has yet to go past the “alphaâ€? phase, it’s become a pretty ingrained part of PBwiki editing. It’s often useful for including wiki pages in non-wiki sites, or to have content from one page in another without reproducing it manually. Read the rest of this entry »

(This is it folks, the inaugural edition of my PBwiki Tip of the Week. Most people know me better as “vietmusic” of the PBwiki Forums, where I offer advice on WikiStyle syntax, CSS, Javascript, and how to pick up hot dates. After today, expect regular updates every Monday!)
Wikis are about collaboration, which doesn’t work so well when your work is scattered and messy. The following tips are designed to fix that problem, tightening up the process from multiple angles. Without further ado…

Here’s a special 2-page PDF that answers basic questions about PBwiki, specifically for educators. Some questions answered:
This might be perfect if your IT administrator or principal has been wondering exactly what a wiki is. Ask them to read these quick 2 pages!
Read the PDF here: Q&A about PBwiki
-Ramit
The PBwiki Library is an ever-growing collection of resources about PBwiki that we’re launching today. If you’ve been looking for a PDF to give to your co-workers outlining exactly how PBwiki works, you’ll find it here. We’ll also include wiki case studies, videos, and more. If there’s something that would make your life easier, please let us know!
-Ramit
I should have picked up on this earlier, but PHP does some crazy stuff with objects. Because they’re not objects. Take the following:
function _init_storage($options) {
if(!$se = $options['storage_engine']) {
trigger_error("Error instantiating MetaStash - no storage_engine" );
}
$this->engine = $se;
}
That looks fine, we’ve got some options defined at our constructor and it’s time to connect to a storage engine and blit out (or in) the permanent version of the data. But what if we want to change the storage engine object we were passed — this happens for PBwiki because there’s a notion of the expected place for some data and then the notion of ‘but right now it’s over here’ — as we transition from one storage infrastructure to another we’re going to have several reasonable places to look and the meta information here can indicate the canonical location for the data. So MetaStash calls a change_docroot() on the storage engine to make sure subsequent calls to it will source the right data. Turns out passing in the object as a parameter and assuming it’s treated like a pointer or handle is incorrect. Ugh. Passing an object happens by value - PHP makes a deep copy of the object, so any changes made during that call apply only to the copy.
The corrected code follows:
function _init_storage($options) {
if(!$se =& $options['storage_engine']) {
trigger_error("Error instantiating MetaStash - no storage_engine" );
}
$this->engine =& $se;
}
What galls me is there’s not much warning about this in the docs and apparently no way to detect/trap this behavior at runtime. Ideally I want a development-only check which watches for this but so far no dice.
-Nathan (grumpy)
What makes PBwiki tick?
For stability:
- Debian Sarge Linux - rock solid with very good package management
- grsecurity - paranoid security, the small overhead is worth the peace of mind
- MySQL - just works
- Apache - a known quantity
For speed:
- PHP - it’s fast and dead simple
- memcached - very fast, very stable
- eAccelerator - we have a lot of code to compile, and this extension speeds up time-to-first-byte by 250ms
For coolness:
- FCKeditor - the basis for our new rich text editor
- syslog - we funnel all of the system parametrics from all of our machines plus all apache and all application-level logging into syslog, one file per machine per day, all told it’s about 750Mb of data per day
Our next generation architecture (soon) will add:
- mogilefs - distributed file storage system that uses commodity hardware to automatically spread spare copies of files around a number of servers
- squid - caching reverse proxy
- pound - super-fast traffic director
And now you know.
-Nathan