Monthly Archives: June 2009

15 Innovative Uses for Twitter

Those of us who are daily Twitter users already grok the power of the application and it’s potential. But there are still a lot of Twitter critics out there, as well as those people who just don’t understand how to use it.

I recently saw this comment on a blog: “I’ve been tweeting but… from what I’ve seen in the last couple of weeks, it’s either a ‘look at me’ or a ‘look at this’ arena.”

Sure Twitter is a great communication channel and as such, you do find a lot of self-promotion and name dropping. But there is so much more to Twitter. The comment got me thinking, would the critics feel the same if they could see more innovative ways to use it?

So I decided to put together a list of some of the more unique and inventive uses for Twitter. Some already exist while others are my own ideas. Here goes:

1) Community Help Desk – I’ve already used Twitter several times to investigate an issue I’ve been having with my computer, or a problem one of my clients has come across. Just yesterday I was able to pinpoint the source of a domain redirect issue because my followers in other countries could reach the site even though I was being redirected.

2) Write a Collaborative Book – you and a bunch of your favorite Tweeps could write a novel, one sentence (tweet) at a time. The results could range from hilarious to Shakespearean. I thought of this while reading about the popularity of Japanese novels composed via mobile text messages, but it turns out that some attempts have been made at this already e.g. 140 Novel and Good Captain. You could do a similar thing with song lyrics.

3) Live Webinars/Tutorials – you could create a new Twitter account with protected updates and ask invitation-only participants to follow you. Then you could hold a *closed* webinar at a pre-arranged time using Twitter for delivery instead of expensive webinar solutions. Twitter allows you to live chat, post links, photos, videos, audio files and text so there is no need for any plug-ins. You could even use a Twitter buffer like Twuffer to space out the content of the webinar via tweets over a specific timeframe.

4) Free Market Research – Who needs to pay expensive market research companies to learn stuff about your latest product? Just send a link, a free sample or a short survey to your followers and watch the feedback flow in.

5) Online Reputation Management – Twitter is ideal for tracking what people are saying about you, your company or your product. You can use Twitter Search to enter keywords or hash tags. Or you can use purpose-built widgets such as TweetBeep which work just like Google Alerts and send you regular emails containing any discussions involving your chosen Twitter accounts or hash tags. These work well for competitor tracking too.

6) Laugh a Day / Therapy – I’m consistently amazed how many long-term Twitter users fail to use the favorites option to bookmark tweets that they like. Whenever I read a tweet that makes me laugh out loud, I favorite it immediately. Then, whenever I am feeling a bit flat, stressed or sense a bad mood coming on, I turn to my favorites list knowing I will be giggling in no time. You can also rely on your followers to sense when you’re down and cheer you up.

7) Competitions – Companies like Zappos and Hand Bag Heaven have been holding competitions on Twitter for a while now. You basically elicit a response from your followers in exchange for the chance to win something. You could ask a question about one of your products or ask followers to find something on your site to win a gift certificate. But with a bit of ingenuity, you can be even more inventive.

DVDQuotes posts questions starting with WMITF, (which stands for Which Movie Is This From?) and gives away random DVDs to the Twitter user with the first correct tweet. Actor and Comedian Stephen Fry declared December 1 to be Oscar Wilde Day and asked his 30,000 plus followers to post Wildesque tweets using the hash tag #oscarwildeday for a chance to win downloads of his audio book. The competition took on a viral quality and earned the comedian at least 2,000 new followers within 48 hours.

8) Virtual Alarm Clock – Did you know you can use Twitter to set appointment reminders for yourself or others? You can use tools such as the Retweet Timer and Twittercal to tweet events from your Google Calendar as @replies to your Twitter profile at pre-set dates and times.

9) Idea Sharing / Community Mind Mapping – So this amazing business idea comes to you in the shower and you are busting to make it happen. But you want to be sure that your stroke of brilliance is fabulous and not folly. This is where your Twitter followers come in. Whether you tweet publicly or DM only your most trusted followers to keep it under wraps, you’ll get unbiased and practically instantaneous feedback on your big plans. Would you use it? Could it work? How much would you pay for it? What features should it have? Tapping into the combined brain power of your Twitter community is a great way to flesh out a business plan.

10) Competitor Tracking – You can use Twitter to monitor the activities of your enemi… er competitors without alerting them. Simply create an anonymous Twitter account and start following them. If they bad-mouth your company, or tweet about a product that may threaten your market share, you’ll know immediately.

11) Bug Testing – Along the same lines as 4), you can use your Twitter followers as live BETA testers when you roll out a new product or software version. Your followers will often report bugs faster than paid customers because they *know* you and want you to succeed.

12) Become Your Favorite Character – Ever idolize a particular movie star or TV character? Why not create an account for them and tweet in character? A few tweeps have done this already, with hilarious results e.g. Laura Ingalls from Little House on the Prairie and wheelchair-bound Andy from Little Britain. Just make sure you don’t step on the toes of the official sites representing the character in question.

13) Sport / Treasure Hunt Aid – With it’s 140 character limit, Twitter is the perfect medium to deliver clues for online and offline scavenger hunts and popular sports such as geocaching .

14) Live Presentation Aid – Presenting at a conference or other event with Internet access from your laptop? You can tweet on the big screen to a) make a point b) elicit a response from Tweeps in the audience c) conduct live research d) gain instant feedback on a topic or question. I’ve used Twitter this way in the past and not only is it entertaining for the audience, but it’s also a great way to overcome stage fright.

15) Build a Twitter Application – Despite not being monetized yet, Twitter’s phenomenal growth has spurred the development of hundreds of applications that make money from Twitter either via advertising or donations. Why not build your own application around Twitter and make your fortune?


Twelve Simple Ways To Write Search-Friendly HTML Code

The common mistakes developers make when coding HTML. These boneheaded mistakes can cause search engines to choke when it comes to indexing your websites. And its easy to avoid making these mistakes. Here’s how:

1. Don’t repeat yourself. Use server side includes for headers, footers, menus, and standard items such as links to CSS documents and external JavaScript files.
2. Balance tags in server side includes. If an include file starts with

it should end with

. This way each file can be viewed in Dreamweaver design view, and includes files do not depend on each other.
3. Place JavaScript in external files and reference them as needed.
4. Each page must have a unique and . Don’t put these in server side includes.
5. The title should be Name of Company – Name of Page or Name of Company – Name of Category – Name of Page unless you are told otherwise.
6. The description should be the first one or two meaningful sentences of content unless you are told otherwise.
7. Please make all links and references to images, CSS and JavaScript root relative by starting them with a slash, “/”. If you use Dreamweaver, set the “Links relative” option to “Site root” in the Site Definition wizard. Root relative links don’t break when files are moved from one directory to another.
8. Too many files in one directory makes things hard to find. Use subdirectories.
9. Run your code through a validator and keep it clean. Removing trivial errors makes real errors easier to spot.
10. Use CSS with HTML elements like div, span, p, h1 tags and so on, to format things. Only use layout tables when they produce better results or cleaner code than CSS.
11. Use heading tags, unordered lists and numbered lists to organize content rather than spacer graphics and nested tables..
12. Consistently use the simplest URLs. Link to “/” instead of “/index.php” or “/news/” instead of “/news/index.php”.

These recommendations may help sites work better, make pages look good on different browsers and mobile devices, cause pages to load faster, save money, and boost search traffic.

20 open source shopping carts

Use any of these 20 open source shopping carts to maximize your sales potential. Some of these aren’t open source, but they are all free. Create an online store and increase your revenue.

1. WP e-Commerce at Instinct Entertainment
WP e-Commerce is a very powerful e-commerce cart for WordPress. It uses your WordPress database to keep track of customers. You can do pretty much anything you can with other carts, while integrating with WordPress.

2. CubeCart
This shopping cart is very popular. It’s entirely free for version 3, with the exception that you leave their copyright notice in your footer. CubeCart has a large amount of payment gateways (Google Checkout, Paypal) and a very active community. Their support forums are lively and many people contribute plugins to the cart. Version 4 is pay-only, but has SEO out of the box.

3. Magento
Magento is currently in beta (it’s only up to version 0.6!) but is already shaping up to be one of the best e-commerce carts out there. Magento features clean urls and SEO from the start. Everything is designed in a clean and simple way. The code it outputs is semantic, which is very rare for e-commerce carts, even commercial ones.

4. osCommerce Online Merchant
osCommerce is a very popular online shopping cart. osCommerce supports multiple currencies, allows customers to print invoices from the order screen, and has an easy database backup system. Transactions are also carried out in SSL, making them more secure.

5. osCMax
osCMax is a branch of osCommerce. It gives you unlimited products and categories, multiple payment gateways, multiple shipping gateways and separate customer groups. Because osCMax is so similar to osCommerce, you can use many of the plugins that were made for osCommerce inside osCMax.

6. OpenCart
OpenCart feels lightweight but is full of great features. The backend is very simple to use. On really great feature is that customers can write their own reviews of the products listed. The latest version has also moved towards xhtml/css for the frontend.

7. Zen Cart
Zen Cart has been around for a while and recently moved to xhtml for templates. Zen Cart also supports multiple payment and shipping options, quantity discounts and coupons. The support forums are very active and most people on them are friendly and helpful. The newest version has added support for PayPal Express Checkout.

8. cpCommerce
cpCommerce is an easy to customize shopping cart. It’s template based so you never have to edit more than 5 files to change its look. You can view your store’s history, specify manufacturers and hold sales.

9. Digistore Free Ecommerce
Do you like a lot of options with your ecommerce carts? Good, because Digistore allows you to run your store in SSL, have express checkout, let guests check out without registering and more. Digistore supports and PayPal for checkout.

10. VirtueMart
VirtueMart is a free ecommerce web design plugin for both Joomla and Mambo. It can be used to display a catalog, or can be used as a full fledged shopping cart. You can assign products to multiple categories, sell downloadable goods and notify customers when an out of stock item is back in stock.

11. Boss Cart
Boss Cart is a fairly new shopping cart. It has support for PayPal gateways, it’s template driven, it has search engine friendly pages and is easy to set up. You can even embed flash movies in product pages. Work on version 2.0 has recently started too.

12. PHP Shop
PHP Shop is an ecommerce cart built on PHP. It uses CSS-based themes so it is very easy to customize. The product descriptions are edited with a WYSIWYG editor. PHP Shop supports SSL and can process credit cards live, depending on the payment gateway.

13. PayPal Shopping Cart
Did you know that PayPal offers a shopping cart that can be integrated with your current site? There is no cost for setting this up and it allows you to process credit cards and bank account payments immediately.

14. BakeSale – Simply Shopping Cart
BakeSale is quite a unique shopping cart. It is a “no-frills-get-only-what-you-need-and-nothing-more” cart. There are no ratings for products and no customer reviews. This also means that there is not bloat. You use the cart for one purpose only, to sell your products to a person who wants to buy them.

15. Mal’s e-commerce
This is a full featured ecommerce shopping cart completely free of charge. The only thing not included is credit card processing. Credit cards must be processed manually or you can buy a third-party payment gateway. It does support PayPal however.

16. Ubercart
Ubercart is a full featured ecommerce cart add-on for Drupal. It features single page checkout, anonymous checkout and integrated payment systems for multiple payment gateways. Ubercart is PayPal certified.

17. Fat Free Cart
Fat Free Cart is the simplest shopping cart I have ever seen. All you do is copy and paste some code and viola! You have a store on your website. Checking out is handled by either Paypal or Google Checkout. You do not have to sign up for this code, you simply copy and paste it.

18. AgoraCart
AgoraCart is a very popular online shopping cart. It features a css manager so you can edit the look of your cart online, unlimited product options, up to 4 different tax zones at the same time, lots of shipping options and tons of payment gateways. AgoraCart gives you many options for your store.

19. Cart97
Cart97 has a lot of great features. It’s easy to set up and very, very easy to run. Customers can submit reviews, when viewing item details it suggests other items for sale, it supports wishlists and even has sale options. The item detail pages work similar to Amazon so customers feel comfortable shopping. The only downside is that it isn’t the easiest cart to customize.

20. storesprite
storesprite’s motto is “free certainly does not mean basic”. Their cart has many features including automatic tax calculation, automatic delivery cost calculations, customer ratings and reviews and featured products. That backend panel is designed to be easy to use, even for someone who has never worked with ecommerce before.

MySQL Crash Recovery

MySQL is known for its stability but as any other application it has bugs so it may crash sometime. Also operation system may be flawed, hardware has problems or simply power can go down which all mean similar things – MySQL Shutdown is unexpected and there could be various inconsistences. And this is not only problem as we’ll see.

MySQL has angel process mysqld_safe which will restart MySQL Server in most cases. It is great, unless you have run into some bug which causes it to crash again – such crashes qucikly following one another are kind of worse because they explore many less tested code paths in MySQL and so problem potential is larger.

So lets look at the problem which happen during the crash which might need to take care of or which may seriously affect MySQL Performance.

MyISAM Corruption – If you’re writing to MyISAM tables there is very large chance of them becoming corrupted during the crash. Note corruption may be hidden and do not expose itself instantly – you may notice wrong query results days after crash. Sometimes corrupted tables may be reason for further crashes or hangs, and corruption may spread itself further in the table. You probably do not want any of these so it is very good idea to run MySQL with myisam_recover option which will make sure all improperly closed MyISAM tables are checked first time it is accessed. This option is however rather painful to use with web applications – users may issue different queries which may trigger check/repair running for many tables at onces, which typically make system extremely slow and also can use up all allowed connections or run out of memory ( myisam_sort_buffer_size is normally set pretty lage). If this becomes the problem I use tiny script which moves out all MyISAM tables out of MySQL database directory, checks them with MyISAMchk and moves them back to running server. This looks scary but it works great – until table is checked and ready application gets error rather than stalling forever which allows application to become partially functional as soon as possible. This hack is needed only in some cases – in most cases using Innodb for tables which you need to be recovered fast is better solution.

Innodb Recovery – Unless you have some hardware problems (99%) or found new Innodb bug (1%) Innodb recovery should be automatic and bring your database to consistent state. Depending on innodb_flush_lot_at_trx_commit setting you may lose few last committed transactions but it is it. It is Performance of this process which may cause the problems. As I already wrote innodb_log_file_size and innodb_buffer_pool_size affect recovery time significantly as well as your workload. I should also mention if you have innodb_file_per_table=1 your recovery speed will depend on number of Innodb tables you have, as well as many other operations, so beware.

Binary log corruption – Binary log may become corrupted and out of sync with database content. This will sometimes break replication but if you’re just planning on using binary log for point in time recovery it can go unnoticed. sync_binlog Is helping by syncing binary log, but at performance penalty. If using Innodb you also might with to use innodb-safe-binlog option in MySQL 4.1 so your Innodb log and binary log are synchronized. In MySQL 5.0 XA is taking care of this synchronization.

.frm Corruption – Few people know MySQL is not really ACID even with Innodb tables, at least not for DDL statements. There is a chance of failing for example during CREATE statement with table created in Innodb dictionary but .frm not created or not completely written. Partially written .frm files or .frm being unsync with internal Innodb dictionary may cause MySQL to fail with wierd error messages. In MySQL 4.1 sync_frm option was added which reduces this problem as time window when it can happen is much less. Still if failure happens just during writting .frm file nasty things may happen, not to mention such potentially multiple operation DDL statements as RENAME TABLE – these are most vulnerable. corruption – If slave happens to crash you can also have relay logs corruption and being corrupted. Not to mention MyISAM tables can contain partially completed statements as well as some of updates totally lost. The safe approach it to reclone the slaves if they crash or you can take the risks and try to continue. Sometimes you might be able to manually find appropriate position even if file is out of sync but I would not be basing my failure handling scenarios.

Cold Start – If you restart MySQL server its caches (key_buffer, innodb_buffer_pool, query_cache,table_cache) are cleaned, so may be OS caches. This may reduce performance dramatically. So if you’re bringing server back after crash you might want to populate caches. For MyISAM key_cache this can be done by using LOAD INDEX INTO CACHE statement, for other storage engines it can be done by issuing large index scan queries. Full table scan queries allow to preload table data ether in storage engine caches or in OS cache. You can save these into .sql file and use –init-file to make sure it is run on startup. The other approach is to prime server with real servers (ie clone queries from other slave) before putting traffic to it.
In case application is not highly available so there is only one server you might with to start serving only some users initially (returning error to others) and gradually increase the load as server warms up. This may sound strange but makes a lot of sense as not only waiting for pages which never load is more frustrating for users than getting honest “try again later” message, but also – warmup takes longer time on extreme load.

Innodb statistics – Unlike MyISAM Innodb does not store index cardinality in tables, instead it computes them on first table access after startup. This may take significant time if you have very large number of tables (Some users have hundreds of thousands of tables per database host). This one is pretty much part of cold start problems but I wanted to point out it separately. To warmup this data you might run select 1 from _table_ limit 1 for each table or any other statement – it is table open which is important.
There are other problems which you may experience related to MySQL Crash Recovery – Restoring data from backup, corrupted Innodb tablespace recovery etc but I should write about them some other time.

Reference by :

Understanding MySQL Query Cache for PHP Developers

Problem Statement:

Many PHP developers using MySQL have unclear understanding of the MySQL query cache. So we decided to write a series of introductory articles to get everyone on the same page. This article is the first installment of the series and here we will introduce the basics of query cache in MySQL. Note that unlike a typical book chapter, this article will be of low-fat flavor — less theory and more actionables — of an introduction to query caching for MySQL.
What is a MySQL query cache?

It turns out that MySQL has a built-in query cache that can cache a specific type of queries — SELECT statements — to speed up delivery of the result sets. The cache can increase performance for many instances but can also hurt performance if not used wisely.
What can be cached in the MySQL query cache?

Only SELECT statements can be cached. This does not include prepared SELECT statements. Query caching only works for SELECT statements that are fully qualified and returns same result every time. This means you cannot use non deterministic functions that return data depending on situation. For example:

// Following SELECT query can be cached
$stmt = “SELECT * FROM user WHERE active = 1”;

// Following SELECT query cannot be cached
$stmt = “SELECT * FROM user where signup_date >= NOW()”;

// Following SELECT query cannot be cached
$stmt = “SELECT count(*) FROM user”;

Here are the requirements a query must meet to take advantage of the query cache:

* Only exact queries are serviced from the cache — must match the stored query in exact detail.
* Queries with placeholders — such as the ones for prepared statements — are not cached in query cache
* Queries with user defined functions or non-deterministic functions cannot be cached
* Any table changes (such as issuing of an ALTER statement) will remove the queries from the cache for that table

Introduction to query cache parameters

The more you understand the query caching parameters, the better you are going to be at tuning the query cache to your advantage. First find out what are the global query caching parameters that you can fiddle with using the following query at the mysql command-line prompt.

mysql> show global variables like ‘%query_cache%’;

A sample output is shown below:

| Variable_name | Value |
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 536870912 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
6 rows in set (0.00 sec)

The purpose of these parameters are described briefly as:

* have_query_cache – size of query cache in bytes
* query_cache_limit – the maximum size of result set (default: 1048576 bytes or 1 MB). If your query returns result set that is greater than the limit set here, it will NOT BE CACHED
* query_cache_min_res_unit – the smallest block size allocated by query cache. Default is 4KB
* query_cache_size – the total memory available to query cache
* query_cache_type – when set to ON or 1, query caching is on for all applicable queries, when set to OFF (0) query caching is turned off and when set to DEMAND or 2, caching is on for queries with SQL_CACHE directive in the query
* query_cache_wlock_invalidate-causes the query cache to invalidate any query in the cache if a write lock is executed against the table(s) it uses

Whats your query cache status right now?

To find out whats going on with your query cache, run the following command from the MySQL command-line prompt:

mysql> show status like ‘%qc%’;

Here is a sample result:

| Variable_name | Value |
| Qcache_free_blocks | 978 |
| Qcache_free_memory | 527371984 |
| Qcache_hits | 645545 |
| Qcache_inserts | 130796 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 417579 |
| Qcache_queries_in_cache | 4973 |
| Qcache_total_blocks | 11167 |
8 rows in set (0.00 sec)

Here are some brief explanations of these status metrics:

* Qcache_free_blocks – number of memory blocks marked as free, which indicates memory fragmentation
* Qcache_free_memory – total amount of memory free for query cache
* Qcache_hits – number of times query result was found in the query cache
* Qcache_inserts – number of times queries were written to the query cache
* Qcache_not_cached – number of queries removed from cache due to low cache memory
* Qcache_queries_in_cache – number of queries that could not be cached
* Qcache_total_block – total number of blocsk in query cache

Calculating query cache hits vs misses

Here is the formula for calculating hit ratio for query cache:

$totalSelectQueryCount = $comSelect + $qcacheHits
$percentHits = ($qcacheHits * 100)/ $totalSelectQueryCount

What the above formula does is adds up all the SELECT queries in the system using two MySQL global variables: com_select and qcache_hits.

To set $comSelect, run show global status like ‘%com_select%’ query. For example:

mysql> show global status like ‘%com_select%’;
| Variable_name | Value |
| Com_select | 1739663 |

To set $qcacheHits, run show status like ‘%qcache_hit%’. For example:

mysql> show status like ‘%qcache_hit%’;
| Variable_name | Value |
| Qcache_hits | 20786961 |

With the above sample number, the percent hit is 92.28% which is great.
Managing query cache

To manipulate your query cache, you can use the following MySQL statements from the MySQL command-line:

To remove all the queries from your query cache, run:


To defragment the query cache memory, run:


10 Reasons to Use Drupal

If you are building search-engine-friendly Web sites and want them to be scalable, you should be using a content management system rather than building sites with plain HTML pages or Dreamweaver templates.

A content management system:

* generally stores your content in a database
* keeps the design of the site separate from the content
* makes it so that to update something on every page of your CMS Web site you generally only have to update it in one place, not on every individual page of the Web site.

This makes content management systems highly scalable.

Also, good content management systems allow non-technical users add and edit the content without needing to know any HTML or Web design knowledge.

Sample Drupal Sites

Some people like other content management systems like WordPress, Joomla, and Plone. I think Drupal is the best for the task of building search engine friendly content-based Web sites.

Drupal is very powerful and can be used for building large, complex sites. Some example Drupal sites are:

* The United Nations
* Warner Brothers Records
* The Discovery Channel
* Forbes
* The Grateful Dead
* Yahoo
* The New York Observer
* The Onion
* Aaron Wall’s

More example Drupal sites can be seen on Dries Buytaert’s blog.

10 Reasons to Use Drupal

Here are 10 reasons why you should seriously be considering Drupal for your SEO-based Web development projects.

1. Advanced URL Control — Unlike WordPress, Drupal gives you precise control over URL structure. Each item of content in Drupal (called a node) can be given a custom URL (called a URL alias). In WordPress you are generally limited to one type of permalink URL for all posts. You can override the “post slug”, but it’s much less precise than Drupal’s URL aliases. You can also automate custom URL structures for each different content type with the Pathauto Module. The Global Redirect Module will automatically 301 redirect the internal Drupal URL to the custom URL alias. Unlike many other content management systems, Drupal’s content pages have nice clean URLs.
2. Custom Content Types and Views — You can use the Content Construction Kit (CCK) and Views Modules to create new content types and create advanced custom views for them without writing any code. A few examples of “content types” are “blog posts”, “news stories”, “forum posts”, “tutorials”, “classified ads”, “podcasts”. You can create as many custom content types as you would like and display them in many different ways. Most content management systems would require writing code to accomplish these tasks, but there is no programming knowledge required to do them in Drupal. Here is a quick & basic intro to Views called How To Build Flickr in Drupal.
3. Revision Control — You can configure Drupal to save a new version of your pages every time they are editing. That means that you can go back to view or revert old revisions if you want.
4. Taxonomy — Drupal has a powerful taxonomy (category) system that allows you to organize and tag content. Each Drupal “vocabulary” (set of categories) can be limited to certain content types. For example, you could have blog contents that allowed free tagging (similar to WordPress categories), while your news section might have a different vocabulary (set of categories) that could only be selected from an existing list of categories. You can also have hierarchical categories, with single or multiple parent categories. Drupal’s advanced taxonomy features, combined with CCK and Views, allows you to easily target all of those long-tail keywords that you researched in Wordtracker.
5. User Management — Drupal was designed for community-based Web sites and has strong user role and access control functionality. You can create as many custom user roles with custom access levels as you need. For example you could create the following roles, each with different levels of access to your features: “anonymous visitor”, “authenticated user”, “moderator”, “editor”, “webmaster”, “admin”. You can keep the advanced user management features (like multiple blogs) turned off if you don’t want them, enabling them later if your site grows to a point where you would like to add more community features.
6. Page Titles and Meta Tags — Drupal’s Page Title Module gives you custom control of your HTML elements, while the Meta Tags Module gives you control over your pages’ individual meta description tags. This is difficult in some content management systems, but it’s easy with Drupal.
7. Excellent Documentation — Documentation includes the official handbooks, the massive API Reference, numerous tutorials, blogs, videos, and podcasts, and the excellent new book Pro Drupal Development. There is even a Drupal Dojo community where you can learn how to become a Drupal ninja.
8. PHP Template — Drupal uses the PHP Template theme engine by default. Theming in Drupal is easier than theming in WordPress and doesn’t necessarily require any PHP knowledge. Drupal’s Theme Developer Guide is a great resource. I also recommend reading Chapter 8 in Pro Drupal Development.
9. Drupal Cookbooks — If you want a feature that is not built into Drupal by default, chances are that someone has already written a code snippet for it and posted it in the code snippets section of
10. Large and Friendly Community — With so many major sites using Drupal, it’s not going away soon. For an idea of the size of the developer community, take a look at the long list of community-contributed modules. The Drupal forum is highly active and are a great place to get your Drupal questions answered. You can also find Drupal support on IRC chat on channels #drupal-support and #drupal-dojo. To meet other Drupal users in your area, visit Drupal Groups.

There are other open-source alternatives to Drupal, but here are a few reasons why I think that Drupal is better:

* Joomla – It’s not as search engine friendly out of the box as Drupal.
* Plone – It’’s powerful, but Plone is written in Python and has certain server requirements. It is not as easy to extend as Drupal, and it’s harder to find people who know Python than who know PHP. Plone runs on the powerful, but complex, Zope 2.
* WordPress – WordPress is excellent, but if you need something more heavy-duty or are building a site that you might want to extend in the future you should be considering Drupal.

Top 10 – Flex Tools and Resources

When developing Flex and/or AIR applications there are a handful of tools that really make the difference between a good project and a great project. They are all very valuable and provide stability and clarity for the RIA development process; or at least they have for me. From Unit Testing to SVN utilities to frameworks and libraries I’ve found the following ten items to be very useful and helpful. I’d even go so far as to say these are critical for quality Flex RIA development; but as Les says: “It’s just a matter of opinion.” ;)

Cairngorm is the lightweight micro-architecture for Rich Internet Applications built in Flex or AIR. A collaboration of recognized design patterns, Cairngorm exemplifies and encourages best-practices for RIA development advocated by Adobe Consulting, encourages best-practice leverage of the underlying Flex framework, while making it easier for medium to large teams of software engineers deliver medium to large scale, mission-critical Rich Internet Applications.


Flex Unit

FlexUnit is a unit testing framework for Flex and ActionScript 3.0 applications and libraries. It mimics the functionality of JUnit, a Java unit testing framework, and comes with a graphical test runner.



Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within the Eclipse IDE. The software is released under the Eclipse Public License (EPL) 1.0 open source license.

Eclipse update site URL:


Eclipse is a multi-language software development platform comprising an IDE and a plug-in system to extend it. It is written primarily in Java and is used to develop applications in this language and, by means of the various plug-ins, in other languages as well – C, C++, COBOL, Python, Perl, PHP and more.



ASDoc is a command-line tool that you can use to create API language reference documentation as HTML pages from the classes in your Adobe® Flex® application. The Adobe Flex team uses the ASDoc tool to generate the Adobe Flex Language Reference.

Flex Ant Tasks

The Adobe® Flex® Ant tasks provide a convenient way to build your Flex projects using an industry-standard build management tool. If you are already using Ant projects to build Flex applications, you can use the Flex Ant tasks to replace your exec or java commands that invoke the mxmlc and compc compilers. If you are not yet using Ant to build your Flex applications, you can take advantage of these custom tasks to quickly and easily set up complex build processes for your Flex applications.



Degrafa is a declarative graphics framework open source licensed under MIT.



The corelib project is an ActionScript 3 Library that contains a number of classes and utilities for working with ActionScript 3. These include classes for MD5 and SHA 1 hashing, Image encoders, and JSON serialization as well as general String, Number and Date APIs.


Flex SDK coding conventions and best practices

Coding standards for writing open-source Flex framework components in ActionScript 3. Adhering to these standards makes the source code look consistent, well-organized, and professional.

Flex Language Reference

The Flex 3.3 Language Reference provides syntax and usage information for every element in the ActionScript™ language. It documents all elements in Adobe® Flash® Player and Adobe® AIR™ that are officially supported by Adobe.